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
相关产品推荐
相关产品推荐

