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

如何用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("倒计时结束!")

修复说明:

  1. 文件初始化逻辑:先检查文件是否存在,避免覆盖之前的保存进度;若保存的时间已过期,自动重置为120秒。
  2. 变量作用域处理:pause函数返回新的结束时间,主循环直接更新全局的end变量,确保计时状态同步。
  3. 正确读写逻辑:保存的是当前的结束时间戳,恢复时通过计算剩余时间生成新的结束时间,保证计时准确。
  4. 计时逻辑修正:通过end - time()实时计算剩余时间,不再盲目减1,适配input()的等待时长。

内容的提问来源于stack exchange,提问作者Pi kid

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.06.29 07:07:41