如何在时限到期前获取控制台Boggle游戏的多用户输入?
解决控制台Boggle游戏的限时输入问题
你的核心问题在于input()是阻塞式调用——即使时限到了,主线程仍会卡在等待用户输入的状态,无法立刻退出循环。线程方案没生效也是因为这个原因。下面提供一个跨平台的解决方案,实现带超时的输入功能,到时自动终止输入循环。
实现思路
写一个自定义的timed_input函数,根据操作系统分别处理:
- Unix类系统(Linux/macOS):用
select模块监听标准输入,设置超时时间,超时则返回None - Windows系统:用
msvcrt模块检测键盘输入,同时计时,超时则返回None
之后在游戏循环中,每次调用这个带超时的输入函数,若返回None(超时)则退出循环,否则将输入的单词存入列表。
完整代码
import time import sys def timed_input(prompt, timeout): """带超时的输入函数,超时返回None""" print(prompt, end='', flush=True) start_time = time.time() input_data = [] if sys.platform.startswith('win'): import msvcrt while time.time() - start_time < timeout: if msvcrt.kbhit(): char = msvcrt.getche().decode('utf-8') if char == '\r': # 回车结束输入 print() return ''.join(input_data) elif char == '\x08': # 退格键处理 if input_data: input_data.pop() # 清除控制台的退格字符 sys.stdout.write('\b \b') sys.stdout.flush() else: input_data.append(char) time.sleep(0.01) # 减少CPU占用 else: import select while time.time() - start_time < timeout: ready, _, _ = select.select([sys.stdin], [], [], 0.01) if ready: line = sys.stdin.readline().rstrip('\n') return line # 超时后清除提示符的换行(可选) print() return None # 游戏主逻辑 words = [] time_limit = 5 start_time = time.time() print(f"你有{time_limit}秒时间输入单词,回车提交,超时自动结束!") while time.time() - start_time < time_limit: word = timed_input("Enter word: ", time_limit - (time.time() - start_time)) if word is None: break # 超时退出 if word.strip(): # 忽略空输入 words.append(word.strip()) print("\n时间到!你输入的单词列表:") print(words)
代码说明
timed_input函数:- 针对Windows和Unix系统做了兼容处理,保证跨平台可用
- 支持退格键修正输入,提升用户体验
- 每次调用时传入剩余的超时时间,确保总时长严格符合设定
- 游戏循环:
- 每次输入前计算剩余时间,传给
timed_input - 超时后立刻退出循环,无需等待用户输入
- 自动忽略空输入,避免无效内容存入列表
- 每次输入前计算剩余时间,传给
为什么之前的线程方案无效?
你的线程方案中,主线程卡在input()的阻塞调用里,即使on_play被设为False,主线程也无法立刻感知——只有当用户完成输入后,才会回到循环判断on_play的状态。而上面的方案让输入操作本身具备超时感知,从根源解决了阻塞问题。
内容的提问来源于stack exchange,提问作者Jobo Fernandez
相关产品推荐
相关产品推荐

