Pygame开发多关卡游戏如何实现退出后从上次所在关卡续玩
Pygame 关卡进度自动保存/加载实现方案
核心逻辑非常直白:把用户当前所在关卡数存在本地独立文件里,退出时写入、启动时读取,不需要额外依赖第三方库,用Python自带模块就能实现。
具体实现步骤
- 选存储格式:优先用
json格式存进度,比纯文本更不容易出解析错误,Python自带json模块不需要额外安装,适配初学者开发需求。进度文件可以放在游戏脚本同目录下,比如命名为save.json。 - 保存进度触发时机:
- 玩家每成功通关、进入下一关时,立刻把最新关卡数写入存档文件
- 监听到游戏退出事件(比如点窗口右上角关闭按钮、点游戏内退出按钮)时,把当前所在关卡写入存档,避免中途退出丢进度
- 启动时加载逻辑:游戏初始化阶段先尝试读取存档文件,做两层校验:
- 存档文件是否存在,不存在就默认从第1关启动
- 读出来的关卡数是否合法(必须是1~12之间的整数,防止存档被乱改导致程序报错),不合法就重置为第1关
参考实现代码
import pygame import json import os # 游戏基础配置 TOTAL_LEVELS = 12 SAVE_PATH = "save.json" WIDTH, HEIGHT = 800, 600 def save_current_level(level_num): """保存当前关卡到本地存档""" # 写入前先校验关卡合法性,避免存错值 if 1 <= level_num <= TOTAL_LEVELS: with open(SAVE_PATH, "w", encoding="utf-8") as f: json.dump({"last_level": level_num}, f) def load_last_level(): """启动时加载上次退出时的关卡""" # 存档不存在直接返回第1关 if not os.path.exists(SAVE_PATH): return 1 try: with open(SAVE_PATH, "r", encoding="utf-8") as f: save_data = json.load(f) last_level = save_data.get("last_level", 1) # 校验读出来的关卡是否在合法范围 return last_level if 1 <= last_level <= TOTAL_LEVELS else 1 except: # 存档文件损坏、格式不对的时候默认返回第1关,避免程序崩溃 return 1 # 游戏初始化 pygame.init() screen = pygame.display.set_mode((WIDTH, HEIGHT)) clock = pygame.time.Clock() # 启动时直接加载上次的关卡 current_level = load_last_level() running = True while running: for event in pygame.event.get(): if event.type == pygame.QUIT: # 点窗口关闭时先存当前关卡再退出 save_current_level(current_level) running = False # 示例逻辑:按N键模拟通关进入下一关,可替换为自己的关卡切换判断 if event.type == pygame.KEYDOWN: if event.key == pygame.K_n and current_level < TOTAL_LEVELS: current_level += 1 # 进入下一关立刻存进度 save_current_level(current_level) screen.fill((255,255,255)) # 此处填充自己的关卡渲染、游戏核心逻辑代码 pygame.display.flip() clock.tick(60) pygame.quit()
注意点
- 不要把进度存在代码硬编码的变量里,程序关闭后内存数据会全部清空,必须写到本地磁盘文件里才能在下次启动时读取
- 读存档的时候一定要加异常捕获和合法性校验,避免用户手动改坏存档、或者异常退出导致存档文件损坏,直接造成游戏启动崩溃
- 如果后续要扩展存储更多内容(比如玩家血量、持有道具数量),直接往json结构里加对应的键值对即可,不需要修改整体读写逻辑
内容的提问来源于stack exchange,提问作者Haider Shah
相关产品推荐
相关产品推荐

