终端井字棋游戏中实现不干扰输入行的倒计时显示方案
终端井字棋游戏中实现不干扰输入行的倒计时显示方案
我懂你这事儿有多闹心——终端里倒计时和输入行挤在一起,刚输到一半,倒计时刷新就把输入内容冲得乱七八糟,完全没法好好玩对吧?其实咱们可以利用ANSI终端控制序列来解决这个问题,把倒计时固定在屏幕的某个专属位置(比如顶部),让它自己刷新,绝不干扰输入行的操作。
核心思路:用ANSI转义码控制光标位置
现代终端(Linux/macOS终端、Windows Terminal、PowerShell)都支持ANSI转义序列,咱们可以用它来精准定位光标、清除指定行内容,让倒计时在固定区域更新,和输入行彻底分家。
常用的几个转义码:
\033[2J:清空整个屏幕\033[n;mH:把光标移动到第n行第m列(行和列都是从1开始计数)\033[K:清除当前光标所在行从光标位置到行尾的内容
具体修改方案
咱们直接针对你的代码做调整,主要修改倒计时函数和游戏初始化的屏幕布局:
1. 改进倒计时函数
把原来的倒计时函数改成固定位置刷新,比如把倒计时放在屏幕最顶部:
def countdown_timer(self, duration): """Countdown timer that stops the game when time runs out.""" while duration > 0 and self.timer_active: # 移动光标到第1行第1列,清除当前行内容 print("\033[1;1H\033[K", end="") # 打印倒计时,光标会停在这行末尾 print(f"Time remaining: {duration} seconds", end="") time.sleep(1) duration -= 1 if duration == 0 and self.timer_active: self.timer_active = False # 换行打印时间到的消息,避免覆盖输入内容 print("\nTime's up! Game over.")
2. 调整游戏计时模式的初始化
在game_timed_loop开头先清屏,把棋盘、输入提示放在倒计时下方,确保布局清晰:
def game_timed_loop(self, game_style, difficulty): # 清屏并把光标移到左上角 print("\033[2J\033[1;1H") # 先打印初始倒计时 print(f"Time remaining: 20 seconds", end="") # 启动倒计时线程 timer_thread = threading.Thread(target=self.countdown_timer, args=(20,)) timer_thread.daemon = True # 设置守护线程,主程序结束时自动终止 timer_thread.start() # 打印初始棋盘(会在倒计时下方显示) self.game.display_grid() # 剩下的游戏循环代码保持不变...
3. 优化输入提示的显示
为了让输入区域和倒计时彻底分开,你可以在get_play函数里的输入提示前加个换行,确保输入行在棋盘下方,和顶部的倒计时完全不重叠:
def get_play(self, player): while True: try: # 加个换行,把输入提示放在单独一行 play = input(f"\n{player}'s turn: ") if play.isdigit() and 1 <= int(play) <= 9: return play else: raise ValueError("Type a number between 1 to 9") except ValueError as e: # 错误信息也打印在输入行下方,不影响倒计时 print(f"❌ {e}")
为什么这样管用?
每次倒计时更新时,我们先把光标移到屏幕顶部的固定位置,清除该行原有内容,再打印新的倒计时数值——这个操作只会修改顶部的那一行,完全碰不到下面的棋盘和输入区域。用户输入的时候,光标始终在输入行,输入的内容不会被倒计时的刷新操作覆盖。
额外注意事项
- 如果你的终端是Windows旧版CMD,可能不支持ANSI转义码,这时候可以先运行
pip install colorama,然后在代码开头加:
来启用ANSI支持。from colorama import init init(autoreset=True) - 设置
timer_thread.daemon = True可以确保主游戏结束时,倒计时线程也会自动终止,避免残留线程。
这样修改后,你的倒计时就会乖乖待在屏幕顶部自己刷新,再也不会干扰玩家输入啦!
备注:内容来源于stack exchange,提问作者enzo
相关产品推荐
相关产品推荐

