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

答题游戏中如何用Threading Timer实现倒计时及线程即时终止

实现答题游戏的倒计时与输入终止功能

要实现这个需求,核心是利用threading.Timer创建倒计时线程,配合threading.Event同步用户输入和超时事件,具体实现方案如下:

  • 每道题启动一个Timer,超时后标记超时状态并触发结束信号
  • 用户完成输入后立即取消Timer,避免超时逻辑执行
  • 用事件对象处理线程间同步,解决input()阻塞导致的逻辑停滞问题

以下是集成了完整功能的代码:

import threading

# 预先定义正确答案列表,根据实际题目调整
answers = ['A', 'C', 'B']
score = 0

def timeout_handler(event, timeout_flag):
    """超时回调:标记超时状态并触发结束信号"""
    timeout_flag[0] = True
    print("\n时间到!自动进入下一题")
    event.set()

with open("question.txt", "r") as question_file:
    questions = question_file.read().splitlines()

with open("choice.txt", "r") as choice_file:
    choices = choice_file.read().splitlines()

for i in range(len(questions)):
    print(f"\n第{i+1}题")
    print("题目:", questions[i])
    print(choices[i])
    
    # 初始化事件与超时标记(用列表实现回调内的状态修改)
    input_event = threading.Event()
    timeout_flag = [False]
    
    # 启动10秒倒计时计时器
    countdown_timer = threading.Timer(10, timeout_handler, args=(input_event, timeout_flag))
    countdown_timer.start()
    
    guess = None
    # 处理输入验证与超时逻辑
    while guess not in ['A', 'B', 'C', 'D']:
        # 单独开线程处理输入,避免主线程被input阻塞
        def get_user_input():
            nonlocal guess
            guess = input("请输入答案(A/B/C/D): ").upper()
            input_event.set()
        
        input_thread = threading.Thread(target=get_user_input)
        input_thread.start()
        # 等待输入完成或超时事件触发
        input_event.wait()
        
        # 超时则直接跳出输入循环
        if timeout_flag[0]:
            break
        
        # 输入格式验证
        if guess not in ['A', 'B', 'C', 'D']:
            print("输入无效,请输入A/B/C/D中的一个:")
    
    # 无论是否超时,都终止计时器
    countdown_timer.cancel()
    
    # 未超时情况下判断答案正误
    if not timeout_flag[0]:
        if guess == answers[i]:
            score += 1
            print("回答正确!")
        else:
            print(f"回答错误,正确答案是{answers[i]}")

print(f"\n游戏结束!你的得分是:{score}/{len(questions)}")

关键逻辑说明:

  • threading.Timer:为每道题创建指定时长的倒计时,超时后触发回调标记超时状态
  • threading.Event:作为线程间的信号开关,无论是用户输入完成还是超时,都会触发事件让主线程继续执行
  • 输入线程:由于input()是阻塞函数,单独开线程处理输入,避免主线程无法响应超时事件
  • 计时器取消:用户完成输入后立即调用countdown_timer.cancel()终止计时器,防止超时逻辑误触发

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.11 05:51:24