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

终端井字棋游戏中实现不干扰输入行的倒计时显示方案

终端井字棋游戏中实现不干扰输入行的倒计时显示方案

我懂你这事儿有多闹心——终端里倒计时和输入行挤在一起,刚输到一半,倒计时刷新就把输入内容冲得乱七八糟,完全没法好好玩对吧?其实咱们可以利用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,然后在代码开头加:
    from colorama import init
    init(autoreset=True)
    
    来启用ANSI支持。
  • 设置timer_thread.daemon = True可以确保主游戏结束时,倒计时线程也会自动终止,避免残留线程。

这样修改后,你的倒计时就会乖乖待在屏幕顶部自己刷新,再也不会干扰玩家输入啦!

备注:内容来源于stack exchange,提问作者enzo

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.04.14 18:04:41