使用LangChain+DeepSeek动态生成推箱子游戏关卡

01

如何获取 DeepSeek API 密钥?

1. 访问 DeepSeek 官方网站

  • 打开DeepSeek 的官方网:https://www.deepseek.com。

  • 查找与 API 相关的页面或开发者文档。

图片

2. 注册或登录账户

  • 如果你还没有 DeepSeek 账户,需要先注册一个新账户。
  • 如果已经有账户,直接登录。

3. 进入开发者或 API 管理页面

  • 登录后,进入开发者中心或 API 管理页面。

  • 通常可以在用户面板或设置中找到相关选项。

  • 新注册用户赠送10元免费额度。

图片

4. 创建 API 密钥

  • 在 API 管理页面中,找到“创建 API 密钥”或“生成密钥”的选项。
  • 按照提示生成一个新的 API 密钥。
  • 生成的密钥通常是一串长字符(例如:sk-xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx)。

图片

5. 保存 API 密钥

  • 生成密钥后,务必将其保存到安全的地方,因为密钥只会显示一次。
  • 如果丢失,可能需要重新生成。

6. 使用 API 密钥

  • 将生成的 API 密钥替换到代码中的 api_key=“” 部分。
  • 测试密钥是否有效,下面是一个简单示例。

图片

02

如何使用LangChain框架调用DeepSeek的API?

LangChain是一个强大的框架,用于构建基于语言模型的应用程序,尤其适用于处理自然语言推理任务。它能够通过模型推理来生成内容或执行任务,而不是仅依赖于预定义的规则或固定内容。

安装库

pip install langchain langchain_openai openai 

官方示例

这段代码的功能是测试langchain库与 DeepSeek 模型的交互。

在这里插入图片描述

扩展案例

这段代码的作用是使用 Python 语言通过langchain库与 DeepSeek API 进行交互,实现一个基于用户信息提供个性化推荐的功能。

from langchain_openai.chat_models.base import BaseChatOpenAI
from langchain_core.messages import HumanMessage, SystemMessage

# 从环境变量中获取 API 密钥
api_key = '<your api key>'

# 配置 DeepSeek API
base_url = "https://api.deepseek.com"

# 初始化 ChatOpenAI 客户端
chat_model = BaseChatOpenAI(
    model="deepseek-chat",  # 指定模型    
    openai_api_key=api_key,    
    openai_api_base=base_url,    
    temperature=0.7,  # 控制生成文本的随机性    
    max_tokens=150,  # 限制生成的最大 token 数
)

# 定义用户信息和系统提示
user_info = {
    "name": "Alice",    
    "age": 30,    
    "interests": ["reading", "traveling", "technology"],
}

system_prompt = (
    "You are a helpful assistant. "    
    "You will receive user information and provide personalized recommendations."
)

# 构建消息
messages = [
    SystemMessage(content=system_prompt),   
   HumanMessage(content=f"User information: {user_info}. Can you recommend something based on my interests?"),
]

# 调用 DeepSeek API 进行推理
response = chat_model.invoke(messages)  # 使用 .invoke() 方法调用模型

# 输出结果
print(response.content)

03

如何通过LangChain+deepseek动态生成关卡?

创建AIGC_level.py文件,配置推理模型

首先调用BaseChatOpenAI()方法生成推理模型,传入的参数中要替换为自己的DeepSeek API密钥。然后设置系统提示词,即按何种规则生成关卡数据。接着构建用户输入,将玩家的移动步数作为参数保存。最后构建系统消息,为进一步调用模型做好准备,此后只需将系统消息传入模型的invoke()方法便能触发DeepSeek API 的推理过程,并获取模型的响应结果。

在这里插入图片描述

你是一个推箱子游戏关卡设计师。

根据玩家在当前关卡的表现(步数),生成一个新的推箱子游戏关卡。

关卡数据应以二维列表表示,列表中的元素及含义如下:

请根据以下规则,以10步为单位精细调整关卡难度:

\1. 步数少于10步

- 增加箱子数量至5 - 6个。

- 设计复杂的墙壁布局,增加玩家移动的阻碍和路线的多样性,例如设置多个狭窄通道、环形结构或死胡同。

- 目标点分散在关卡各处,且部分目标点需经过复杂的操作才能到达。

\2. 步数在10 - 19步之间

- 箱子数量设置为4 - 5个。

- 墙壁布局有一定复杂度,存在一些分支路径,但整体路线不会过于复杂。

- 目标点分布有一定分散性,但仍可通过相对直接的操作到达部分目标点。

\3. 步数在20 - 29步之间

- 箱子数量为3 - 4个。

- 墙壁布局相对简单,减少不必要的阻碍,玩家可活动空间较大。

- 目标点分布较为集中,便于玩家规划路线。

\4. 步数在30 - 39步之间

- 箱子数量为2 - 3个。

- 墙壁布局简单,以直线或简单折线为主,基本不设置复杂的通道。

- 目标点集中在关卡的某一区域,降低玩家的操作难度。

\5. 步数多于40步

- 箱子数量为1 - 2个。

- 尽量减少墙壁数量,仅设置必要的边界,使玩家可自由移动。

- 目标点明显且易于到达,玩家无需复杂操作即可完成关卡。

### 要求:

- 合理使用墙壁、箱子和目标点,使得关卡可以被解开。

- 箱子的数量应和目标点的数量相等。

- 每次生成的关卡必须具有明显的差异,不能与之前生成的关卡重复。

- 关卡尺寸为9行11列,玩家可活动区域尽量集中在关卡中部。

### 示例输出:
在这里插入图片描述

### 注意事项:仅输出二维列表,确保关卡可解并具挑战性。

“”"

# 运行推理模型,参数为玩家当前关卡的步数

def run_model(player_steps):
    # 构建用户输入    
    user_input = f"玩家本关卡的步数:{player_steps}"   
     
    # 构建消息    
    messages = [     
        SystemMessage(content=system_prompt),        
        HumanMessage(content=user_input),    
    ]    
    
    # 调用 LangChain 生成关卡数据    
    try:    
        response = chat_model.invoke(messages)        
        if not response.content:      
            print("模型返回为空,检查提示词和请求设置。")        
        else:       
            # 处理响应,过滤掉空行            
            non_empty_lines = [line for line in response.content.splitlines() if line.strip()]            
            mapdata = eval('\n'.join(non_empty_lines))            
            print("生成的关卡数据:")            
            print(mapdata)
return mapdata
    except Exception as e:    
        print("请求失败:", e)

在游戏代码调用推理模型

使用pgzero库开发了一个推箱子游戏,将当前关卡中移动步数记录在变量steps中,过关时会调用loadmap()方法,该方法中将steps作为输入参数传给模型,模型会根据系统提示词生成关卡数据作为输出,游戏程序则根据模型生成的关卡数据加载关卡图像。

import pgzrun

import AIGC_levelTILESIZE = 48                            # 箱子尺寸WIDTH = TILESIZE * 11                    # 屏幕宽度HEIGHT = TILESIZE * 9                    # 屏幕高度# 方向字典,存储各方向对应的坐标偏移值dirs = {"east":(1, 0), "west":(-1, 0),        "north":(0, -1), "south":(0, 1), "none":(0, 0)}level = 1                                # 游戏关卡值finished = False                         # 游戏过关标记gameover = Falsesteps = 0map =[    ['-1', '-1', '-1', '-1', '-1', '-1', '-1', '-1', '-1', '-1', '-1'],    ['-1', '-1', '1', '1', '1', '1', '1', '1', '1', '-1', '-1'],    ['-1', '-1', '1', '0', '0', '4', '0', '0', '1', '-1', '-1'],    ['-1', '-1', '1', '0', '0', '2', '2', '0', '1', '-1', '-1'],    ['-1', '-1', '1', '4', '0', '3', '0', '4', '1', '-1', '-1'],    ['-1', '-1', '1', '0', '2', '0', '2', '0', '1', '-1', '-1'],    ['-1', '-1', '1', '0', '0', '4', '0', '0', '1', '-1', '-1'],    ['-1', '-1', '1', '1', '1', '1', '1', '1', '1', '-1', '-1'],    ['-1', '-1', '-1', '-1', '-1', '-1', '-1', '-1', '-1', '-1', '-1']]# 初始化地图,生成游戏角色def initlevel(mapdata):    global walls, floors, boxes, targets, player    walls = [] # 墙壁列表    floors= [] # 地板列表    boxes = [] # 箱子列表    targets = [] # 目标点列表    for row in range(len(mapdata)):        for col in range(len(mapdata[row])):            x = col * TILESIZE            y = row * TILESIZE            if mapdata[row][col] >= "0"and mapdata[row][col] != "1":                floors.append(Actor("pushbox_floor", topleft=(x, y)))            if mapdata[row][col] == "1":                walls.append(Actor("pushbox_wall", topleft=(x, y)))            elif mapdata[row][col] == "2":                box = Actor("pushbox_box", topleft=(x, y))                box.placed = False                boxes.append(box)            elif mapdata[row][col] == "4":                targets.append(Actor("pushbox_target", topleft=(x, y)))            elif mapdata[row][col] == "6":                targets.append(Actor("pushbox_target", topleft=(x, y)))                box = Actor("pushbox_box_hit", topleft=(x, y))                box.placed = True                boxes.append(box)            elif mapdata[row][col] == "3":                player = Actor("pushbox_right", topleft=(x, y))initlevel(map)# 载入关卡地图def loadmap():    global steps,gameover    mapdata = AIGC_level.run_model(steps)    ifnot mapdata:        gameover = True    else:        steps = 0        initlevel(mapdata)# 处理键盘按下事件def on_key_down(key):    if finished or gameover:        return    if key == keys.RIGHT:        player.direction = "east"        player.image = "pushbox_right"    elif key == keys.LEFT:        player.direction = "west"        player.image = "pushbox_left"    elif key == keys.DOWN:        player.direction = "south"        player.image = "pushbox_down"    elif key == keys.UP:        player.direction = "north"        player.image = "pushbox_up"    else:        player.direction = "none"    player_move()    player_collision()# 移动玩家角色def player_move():    player.oldx = player.x    player.oldy = player.y    dx, dy = dirs[player.direction]    player.x += dx * TILESIZE    player.y += dy * TILESIZE# 玩家角色的碰撞检测与处理def player_collision():    # 玩家与墙壁的碰撞    if player.collidelist(walls) != -1:        player.x = player.oldx        player.y = player.oldy        return    # 玩家与箱子的碰撞    index = player.collidelist(boxes)    if index == -1:        return    box = boxes[index]    if box_collision(box) == True:        box.x = box.oldx        box.y = box.oldy        player.x = player.oldx        player.y = player.oldy        return    sounds.fall.play()# 箱子角色的碰撞检测与处理def box_collision(box):global steps    box.oldx = box.x    box.oldy = box.y    dx, dy = dirs[player.direction]    box.x += dx * TILESIZE    box.y += dy * TILESIZE    # 箱子与墙壁的碰撞    if box.collidelist(walls) != -1:        returnTrue    # 箱子与其他箱子的碰撞    for bx in boxes:        if box == bx:            continue        if box.colliderect(bx):            returnTruecheck_target(box)steps += 1    returnFalse# 检测箱子是否放置在目标点上def check_target(box):    if box.collidelist(targets) != -1:        box.image = "pushbox_box_hit"        box.placed = True    else:        box.image = "pushbox_box"        box.placed = False# 判断是否过关def levelup():    for box in boxes:        ifnot box.placed:            returnFalse    returnTrue# 设置新的关卡def setlevel():    global finished, level    finished = False    level += 1    loadmap()# 更新游戏逻辑def update():    global finished     if finished or gameover:        return    if levelup():        finished = True        sounds.win.play()        clock.schedule(setlevel, 5)# 绘制游戏图像def draw():    screen.fill((200, 255, 255))    for floor in floors:        floor.draw()    for wall in walls:        wall.draw()    for target in targets:        target.draw()    for box in boxes:        box.draw()    player.draw()    screen.draw.text("Level " + str(level), topleft=(20, 20),                         fontsize=30, color="black")    screen.draw.text("Steps " + str(steps), topleft=(WIDTH-100, 20),                         fontsize=30, color="black")    if gameover:        screen.draw.text("Game Over", center=(WIDTH // 2, HEIGHT // 2),                         fontsize=80, color="red")    if finished:        screen.draw.text("Level Up", center=(WIDTH // 2, HEIGHT // 2),                         fontsize=80, color="blue")        screen.draw.text("Genrating……", center=(WIDTH // 2, HEIGHT // 2+50),                         fontsize=80, color="blue")

pgzrun.go()

说明 /

  • 初始关卡是指定的,后续的关卡会根据当前关卡的表现(移动步数)动态生成。
  • 当前DeepSeek网络不太稳定,有时不会成功,可以多试几次或隔一段时间再试。
  • 生成的关卡有时不合理,系统提示词还有进一步优化空间。

本文中的推箱子游戏的具体开发步骤在《趣学Python游戏编程》图书中有详细介绍,

本案例源代码下载链接:https://pan.baidu.com/s/13FxoxR-tD3p6GHw0VnnBhQ?pwd=24rq

如何零基础入门 / 学习AI大模型?

大模型时代,火爆出圈的LLM大模型让程序员们开始重新评估自己的本领。 “AI会取代那些行业?”“谁的饭碗又将不保了?”等问题热议不断。

不如成为「掌握AI工具的技术人」,毕竟AI时代,谁先尝试,谁就能占得先机!

想正式转到一些新兴的 AI 行业,不仅需要系统的学习AI大模型。同时也要跟已有的技能结合,辅助编程提效,或上手实操应用,增加自己的职场竞争力。

但是LLM相关的内容很多,现在网上的老课程老教材关于LLM又太少。所以现在小白入门就只能靠自学,学习成本和门槛很高

那么我作为一名热心肠的互联网老兵,我意识到有很多经验和知识值得分享给大家,希望可以帮助到更多学习大模型的人!至于能学习到多少就看你的学习毅力和能力了 。我已将重要的AI大模型资料包括AI大模型入门学习思维导图、精品AI大模型学习书籍手册、视频教程、实战学习等录播视频免费分享出来。

这份完整版的大模型 AI 学习资料已经上传优快云,朋友们如果需要可以微信扫描下方优快云官方认证二维码免费领取【保证100%免费

👉 福利来袭优快云大礼包:《2025最全AI大模型学习资源包》免费分享,安全可点 👈

全套AGI大模型学习大纲+路线

AI大模型时代的学习之旅:从基础到前沿,掌握人工智能的核心技能!

read-normal-img

640套AI大模型报告合集

这套包含640份报告的合集,涵盖了AI大模型的理论研究、技术实现、行业应用等多个方面。无论您是科研人员、工程师,还是对AI大模型感兴趣的爱好者,这套报告合集都将为您提供宝贵的信息和启示。

在这里插入图片描述
在这里插入图片描述

在这里插入图片描述
在这里插入图片描述

👉学会后的收获:👈
基于大模型全栈工程实现(前端、后端、产品经理、设计、数据分析等),通过这门课可获得不同能力;

能够利用大模型解决相关实际项目需求: 大数据时代,越来越多的企业和机构需要处理海量数据,利用大模型技术可以更好地处理这些数据,提高数据分析和决策的准确性。因此,掌握大模型应用开发技能,可以让程序员更好地应对实际项目需求;

• 基于大模型和企业数据AI应用开发,实现大模型理论、掌握GPU算力、硬件、LangChain开发框架和项目实战技能, 学会Fine-tuning垂直训练大模型(数据准备、数据蒸馏、大模型部署)一站式掌握;

能够完成时下热门大模型垂直领域模型训练能力,提高程序员的编码能力: 大模型应用开发需要掌握机器学习算法、深度学习框架等技术,这些技术的掌握可以提高程序员的编码能力和分析能力,让程序员更加熟练地编写高质量的代码。

👉 福利来袭优快云大礼包:《2025最全AI大模型学习资源包》免费分享,安全可点 👈

img

这份完整版的大模型 AI 学习资料已经上传优快云,朋友们如果需要可以微信扫描下方优快云官方认证二维码免费领取【保证100%免费

作为普通人,入局大模型时代需要持续学习和实践,不断提高自己的技能和认知水平,同时也需要有责任感和伦理意识,为人工智能的健康发展贡献力量。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值