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

Python开发算术游戏:如何模拟回车实现答对自动切题

可行性说明

这个需求完全可以实现。
你原有代码必须按回车才能提交的核心原因是:Python标准的input()函数采用行缓冲机制,只有检测到回车键按下时,才会把整行输入的内容返回给程序,天然不支持逐字符即时校验的交互逻辑。

实现逻辑

要实现你要的无回车自动判题,只需要把行输入逻辑替换为单按键即时捕获逻辑即可,全程只需要处理数字键、退格键两类输入:

  • 程序启动后逐次捕获用户按下的单个按键,不需要等待回车触发
  • 按下数字键:将对应数字追加到当前答案缓冲区,同步在题目后显示该数字
  • 按下退格键:删除答案缓冲区最后一位内容,同步擦除屏幕上显示的最后一个输入字符
  • 每次输入/删除操作完成后,立刻将当前缓冲区的内容和正确答案做比对:如果内容完全匹配,直接累加分数,自动加载下一道题目
修改后可直接运行的完整代码

下面的版本兼容Windows、macOS、Linux全平台,仅使用Python标准库,不需要额外安装第三方依赖:

import random
import time
import sys

# 跨平台单按键读取实现
try:
    # Windows平台
    import msvcrt
    def get_key():
        key = msvcrt.getch()
        # 识别退格键
        if key == b'\x08':
            return 'backspace'
        # 识别数字键
        try:
            char = key.decode('utf-8')
            if char.isdigit():
                return char
        except:
            pass
        return None
except ImportError:
    # macOS/Linux平台
    import tty, termios
    def get_key():
        fd = sys.stdin.fileno()
        old_settings = termios.tcgetattr(fd)
        try:
            tty.setraw(fd)
            key = sys.stdin.read(1)
        finally:
            termios.tcsetattr(fd, termios.TCSADRAIN, old_settings)
        # 识别退格键(对应ASCII 127)
        if key == '\x7f':
            return 'backspace'
        if key.isdigit():
            return key
        return None

def play(seconds):
    start_time = time.time()
    score = 0
    while True:
        # 优先判断是否超时
        current_time = time.time()
        elapsed_time = current_time - start_time
        if elapsed_time > seconds:
            print("\n时间到!你的最终得分是 %d 分。" % score)
            break

        # 生成随机算术题
        a = random.randint(2, 100) 
        b = random.randint(2, 100)
        d = random.randint(2, 12)
        asmd = random.choice([1, 2, 3, 4])
        if asmd == 1:
            solve = a + b 
            question = "%d + %d = " % (a, b)
        elif asmd == 2:
            if a > b:
                solve = a - b
                question = "%d - %d = " % (a, b)
            else:
                solve = b - a
                question = "%d - %d = " % (b, a)
        elif asmd == 3:
            solve = a * d
            question = "%d * %d = " % (a, d)
        else:
            solve = a
            c = a * d
            question = "%d / %d = " % (c, d)
        
        # 输出题目不换行
        print(question, end='', flush=True)
        current_answer = ""
        # 循环读取按键直到答案正确
        while True:
            # 读按键前再次判断超时,避免到点后卡输入
            if time.time() - start_time > seconds:
                break
            key = get_key()
            if key is None:
                continue
            if key == 'backspace':
                if len(current_answer) > 0:
                    current_answer = current_answer[:-1]
                    # 擦除屏幕上最后一个已显示的输入字符
                    print('\b \b', end='', flush=True)
            else:
                current_answer += key
                print(key, end='', flush=True)
                # 实时比对答案,长度匹配且数值相等就判定答对
                if len(current_answer) == len(str(solve)) and int(current_answer) == solve:
                    score += 1
                    print()
                    break

if __name__ == "__main__":
    play(60)
运行注意事项
  • 请直接在系统原生终端(Windows命令提示符/PowerShell、macOS终端、Linux终端)中运行代码,部分Python IDE的内置运行控制台不支持原生单按键捕获,可能出现按键识别异常
  • 运行过程中完全不需要按回车键,输入答案和正确答案完全一致时会自动跳转下一题,输入错误直接按退格键删除错误内容重新输入即可

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.09.03 10:15:56