答题游戏中如何用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
相关产品推荐
相关产品推荐

