You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

Pygame开发多关卡游戏如何实现退出后从上次所在关卡续玩

Pygame 关卡进度自动保存/加载实现方案

核心逻辑非常直白:把用户当前所在关卡数存在本地独立文件里,退出时写入、启动时读取,不需要额外依赖第三方库,用Python自带模块就能实现。


具体实现步骤

  • 选存储格式:优先用json格式存进度,比纯文本更不容易出解析错误,Python自带json模块不需要额外安装,适配初学者开发需求。进度文件可以放在游戏脚本同目录下,比如命名为save.json。
  • 保存进度触发时机:
    1. 玩家每成功通关、进入下一关时,立刻把最新关卡数写入存档文件
    2. 监听到游戏退出事件(比如点窗口右上角关闭按钮、点游戏内退出按钮)时,把当前所在关卡写入存档,避免中途退出丢进度
  • 启动时加载逻辑:游戏初始化阶段先尝试读取存档文件,做两层校验:
    1. 存档文件是否存在,不存在就默认从第1关启动
    2. 读出来的关卡数是否合法(必须是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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.09.01 12:21:33