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

如何在Python中实现输入计数与计时同步?(限时游戏开发)

解决跑步主题限时输入游戏的计时与输入统计问题

嘿,我懂你想做这个模仿博尔特9.58秒世界纪录的限时spam游戏的需求!你的核心问题应该是普通的input()会阻塞程序,没法同时兼顾计时和实时统计输入内容对吧?我给你一个可行的方案,用线程分离计时和输入逻辑,完美解决这个问题。

先看完整的可运行代码:

import time
import threading
import sys

def countdown(max_time):
    """负责倒计时的独立线程"""
    global time_up
    time_up = False
    start_time = time.time()
    # 每秒检查10次时间,平衡精度和CPU占用
    while time.time() - start_time < max_time:
        time.sleep(0.1)
    time_up = True
    print("\n⏱️ 时间到!你冲线了!")

def main():
    print("🏃‍♂️ Spamming Race 🏃‍♂️")
    print("*********************")
    print("跑步和刷屏有很多共同点:")
    print("就像跑步要拼冲线速度,刷屏的目标是在限时内尽可能多地输入内容!")
    print(f"本次限时:9.58秒(致敬博尔特百米世界纪录!)\n")
    
    # 设置核心限时为9.58秒
    max_time = 9.58
    # 启动倒计时线程
    timer_thread = threading.Thread(target=countdown, args=(max_time,))
    timer_thread.start()
    
    # 实时接收输入并统计,直到时间结束
    user_input = ""
    while not time_up:
        try:
            # 读取单个字符,实现无阻塞实时输入
            char = sys.stdin.read(1)
            if char:
                user_input += char
        except KeyboardInterrupt:
            # 处理用户主动中断的情况
            print("\n你提前放弃了比赛!")
            time_up = True
    
    # 统计内容(可自定义统计规则)
    total_chars = len(user_input)
    target_count = user_input.count('1')  # 对应你原代码里统计'1'的需求
    print(f"\n🏆 冲线成绩:")
    print(f"总输入字符数:{total_chars}")
    print(f"其中'1'的输入数量:{target_count}")

if __name__ == "__main__":
    main()

关键逻辑说明:

  • 线程分离:用threading创建独立的倒计时线程,让计时和输入处理并行运行,彻底解决input()阻塞导致计时失效的问题。
  • 实时输入读取:用sys.stdin.read(1)替代input(),可以实时捕获用户输入的每一个字符,不用等回车,完全符合spam游戏的快速输入场景。
  • 时间结束标记:通过全局变量time_up同步线程状态,主线程实时检查这个标记,时间一到就停止接收输入并展示结果。
  • 自定义统计:你可以轻松修改统计规则,比如换成统计特定字符串、字母数量等,适配不同的游戏目标。

可选优化方向:

  • 在倒计时过程中实时显示剩余时间,增强用户紧迫感
  • 添加输入内容的实时展示栏
  • 设置输入目标(比如指定输入特定字符才能得分),提升游戏趣味性

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.05.27 09:26:14