如何用Python编写游戏暂停功能且不丢失计时进度?
问题分析与修复方案
你的代码存在几个关键问题导致计时无法正确恢复:
- 每次启动重置保存进度:程序开头直接用
w模式写入120到文件,会覆盖之前保存的内容,导致无法从上次暂停状态恢复。应先检查文件是否存在,不存在时再初始化。 - 变量作用域错误:
pause函数内的prevend是局部变量,修改后不会影响全局的prevend和主循环的end变量。 - 写入文件后的错误赋值:
prv.write(str(end))返回的是写入的字符数,不是内容,所以prevend=int(prv.write(str(end)))会把字符数赋值给prevend,完全不符合预期。 - 主循环计时逻辑错误:
end=end-1强制减少结束时间,但input()会等待用户输入,导致实际流逝时间和代码中减的1秒不匹配,应通过计算剩余时间更新。 - 恢复时未正确更新结束时间:暂停后恢复,需要重新计算新的
end值为当前时间加剩余时间,但你的代码未修改全局的end变量。
修复后的代码:
from time import time import os prevend_file = 'prevend.txt' # 初始化或读取保存的进度 if os.path.exists(prevend_file): with open(prevend_file, mode='r', encoding='utf-8') as prv: saved_end = float(prv.read()) # 若保存的结束时间已过期,重置为120秒 end = time() + 120 if saved_end < time() else saved_end else: # 文件不存在时初始化120秒倒计时 end = time() + 120 with open(prevend_file, mode='w', encoding='utf-8') as prv: prv.write(str(end)) def pause(current_end): # 保存当前结束时间到文件 with open(prevend_file, mode='w', encoding='utf-8') as prv: prv.write(str(current_end)) print("游戏已暂停") while True: play = input("输入'start'继续游戏: ") if play.lower() == 'start': # 返回新的结束时间:当前时间 + 剩余时间 remaining = current_end - time() return time() + remaining while end > time(): # 显示剩余时间(可选) remaining = int(end - time()) print(f"剩余时间: {remaining}秒", end='\r') new = input('\n输入"pause"暂停游戏: ').lower() if new == 'pause': end = pause(end) print("倒计时结束!")
修复说明:
- 文件初始化逻辑:先检查文件是否存在,避免覆盖之前的保存进度;若保存的时间已过期,自动重置为120秒。
- 变量作用域处理:
pause函数返回新的结束时间,主循环直接更新全局的end变量,确保计时状态同步。 - 正确读写逻辑:保存的是当前的结束时间戳,恢复时通过计算剩余时间生成新的结束时间,保证计时准确。
- 计时逻辑修正:通过
end - time()实时计算剩余时间,不再盲目减1,适配input()的等待时长。
内容的提问来源于stack exchange,提问作者Pi kid
相关产品推荐
相关产品推荐

