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

Python控制台删除末尾字符 实现错误答案清除不重复打印题目

实现方案

这个效果完全可以实现,不需要依赖第三方库,通过终端ANSI控制码就能完成光标移动、行内容清除的操作,适配Windows Terminal、macOS/Linux原生终端,老版本Windows CMD加2行代码开启VT100转义支持即可。

核心原理

用到两个基础ANSI转义序列:

  • \033[A:将光标向上移动1行
  • \033[K:清除从光标当前位置到本行末尾的所有内容

用户输入错误答案按下回车后,光标会自动跳到下一行开头,此时先上移光标回到算式所在行,再清除行尾的错误输入内容,光标就会自动停在=后面,直接等待用户重新输入即可,完全不需要重复打印算式。

适配说明

Windows系统默认的传统CMD窗口默认关闭ANSI转义支持,只需要在代码开头加几行调用系统API开启即可,不需要额外安装依赖。

修改后的完整代码

import random
import time
import os

# 开启Windows终端ANSI转义支持
if os.name == 'nt':
    import ctypes
    kernel32 = ctypes.windll.kernel32
    kernel32.SetConsoleMode(kernel32.GetStdHandle(-11), 7)

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("Time's up! Your score was %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])
        prompt = ""
        solve = 0
        if asmd == 1:
            solve = a + b 
            prompt = "%d + %d = " % (a, b)
        elif asmd == 2:
            if a > b:
                solve = a - b
                prompt = "%d - %d = " % (a, b)
            else:
                solve = b - a
                prompt = "%d - %d = " % (b, a)
        elif asmd == 3:
            solve = a * d
            prompt = "%d * %d = " % (a, d)
        else:
            solve = d
            c = a * d
            prompt = "%d / %d = " % (c, a)
        
        # 首次打印题目
        print(prompt, end='', flush=True)
        while True:
            answer = input()
            # 兼容非数字输入的异常情况
            try:
                ans_num = int(answer)
            except ValueError:
                # 输入非法,直接清空重输
                print('\033[A\033[K' + prompt, end='', flush=True)
                continue
            if ans_num == solve:
                break
            # 答案错误,清空错误内容保留原题,等待重输
            print('\033[A\033[K' + prompt, end='', flush=True)
            
        score += 1

play(10)

效果说明

运行代码后,不管输入错误答案还是非数字内容,控制台都会直接清空刚输入的错误内容,保留最开始打印的算式,光标直接停在等号后等待重新输入,和你预期的交互效果完全一致。代码同时修正了原版本超时判断位置靠后、非数字输入会报错崩溃的小问题。

内容的提问来源于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 07:15:53