在学习大模型的过程中,我尝试用 Pygame
打造了一个简单的可对话的中文 RPG 游戏。通过集成 DeepSeek 的大模型接口,每个 NPC 都能“开口说话”,而且是根据你设计的 prompt 自动生成回复内容。
本篇文章将分享这个项目的完整思路与核心代码,欢迎读者交流反馈!
✨ 项目亮点
-
• ✅ 中文交互:对话框内支持中文文本分页显示;
-
• ✅ AI 驱动:每个 NPC 背后接入大模型接口(DeepSeek);
-
• ✅ Prompt 可控:每个 NPC 都可以设置独特 prompt,打造剧情或知识问答玩法;
-
• ✅ Pygame 实现:轻量、简单,适合入门项目。
🧩 项目结构一览
deepseek_rpg/
├── main.py # 游戏主循环
├── ai_api.py # 接入 DeepSeek 接口
├── dialog_box.py # 对话框 UI 逻辑
├── player.py # 玩家控制
├── npc.py # NPC 角色定义
├── assets/
│ ├── player.png
│ └── npc.png
🕹️ 游戏主逻辑:Game 类
管理事件监听、玩家移动、NPC 检测、对话展示等功能:
class Game:
def__init__(self):
pygame.init()
self.screen = pygame.display.set_mode((SCREEN_WIDTH, SCREEN_HEIGHT))
self.player = Player(100, 100)
self.npcs = pygame.sprite.Group(NPC(300, 300))
self.dialog_box = DialogBox()
self.show_dialog = False
self.current_npc = None
self.running = True
defprocess_events(self):
keys = pygame.key.get_pressed()
self.player.update(keys)
for event in pygame.event.get():
if event.type == pygame.QUIT:
self.running = False
elif event.type == pygame.KEYDOWN:
if event.key == pygame.K_SPACE andself.current_npc:
ifself.show_dialog:
self.dialog_box.next_page()
ifnotself.dialog_box.has_more_pages():
self.show_dialog = False
else:
prompt = self.current_npc.prompt
answer = get_deepseek_response(prompt)
self.dialog_box.add_text(answer)
self.show_dialog = True
💬 对话系统:DialogBox(支持分页)
将长文本分页显示在屏幕底部,避免文字溢出:
class DialogBox:
def__init__(self):
self.font = pygame.font.SysFont("Arial", 20)
self.rect = pygame.Rect(50, 400, 700, 180)
self.text_lines = []
self.page = 0
defadd_text(self, new_text):
self.text_lines = [new_text[i:i+40] for i inrange(0, len(new_text), 40)]
self.page = 0
defnext_page(self):
self.page += 1
defhas_more_pages(self):
returnself.page < len(self.text_lines)
defdraw(self, screen):
pygame.draw.rect(screen, (255, 255, 255), self.rect)
pygame.draw.rect(screen, (0, 0, 0), self.rect, 2)
ifself.page < len(self.text_lines):
text_surface = self.font.render(self.text_lines[self.page], True, (0, 0, 0))
screen.blit(text_surface, (self.rect.x + 10, self.rect.y + 10))
🤖 接入大模型:DeepSeek AI 接口封装
通过 REST API 与 DeepSeek 进行交互,并返回 AI 回复:
import requests
DEEPSEEK_API_URL = "https://api.deepseek.com/v1/chat/completions"
api_key = "your_deepseek_api_key"
defget_deepseek_response(prompt):
headers = {
"Content-Type": "application/json",
"Authorization": f"Bearer {api_key}"
}
data = {
"model": "deepseek-chat",
"messages": [{"role": "user", "content": prompt}],
"temperature": 0.7
}
try:
response = requests.post(DEEPSEEK_API_URL, headers=headers, json=data)
response.raise_for_status()
return response.json()["choices"][0]["message"]["content"]
except Exception as e:
print(f"Error: {e}")
return "(AI 接口调用失败)"
👥 角色定义:玩家 & NPC
玩家可以移动,NPC 静止但可以设置不同 Prompt:
class NPC(pygame.sprite.Sprite):
def__init__(self, x, y, prompt="你是谁?"):
super().__init__()
self.image = pygame.image.load("npc.png")
self.rect = self.image.get_rect(topleft=(x, y))
self.prompt = prompt
classPlayer(pygame.sprite.Sprite):
def__init__(self, x, y):
super().__init__()
self.image = pygame.image.load("player.png")
self.rect = self.image.get_rect(topleft=(x, y))
self.speed = 5
defupdate(self, keys):
if keys[pygame.K_LEFT]: self.rect.x -= self.speed
if keys[pygame.K_RIGHT]: self.rect.x += self.speed
if keys[pygame.K_UP]: self.rect.y -= self.speed
if keys[pygame.K_DOWN]: self.rect.y += self.speed
🚀 快速运行
pip install pygame requests
python main.py
记得将你的 DeepSeek API Key
填入 ai_api.py
中。
🎬 效果演示
deepseek接入游戏npc
👉 玩家靠近 NPC,按下 空格键 开始对话;
👉 模型将根据预设 Prompt 实时生成中文回复。
🔧 后续你可以继续拓展:
• 设置剧情逻辑
• 接入不同模型(如 Moonshot、GPT-4)
• 加入任务系统或成就系统
📬 最后
如果你对 AI + 游戏结合感兴趣,欢迎大家关注微信公众号【AI安全这点事】获取完整代码,点赞、分享、评论交流~
项目源码整理后我也会开源,欢迎关注更新!