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

Python井字棋选中已占用格子时如何保持当前玩家回合

井字棋已占格子选中后丢回合问题修复

问题根源

你当前代码的核心问题出在输入处理逻辑:

  • 读取用户输入的代码写在了循环外面,无效输入后不会重新获取新的输入值
  • 不管输入有效还是无效,所有分支都加了break,会直接跳出输入函数回到主循环
  • 主循环每次执行完player_input不管落子有没有成功,都会直接执行切换玩家的逻辑,自然就会跳过当前玩家的回合
  • 额外问题:没有处理非数字输入的场景,用户输入字母时程序会直接崩溃;switch_player里的global answer是多余声明,完全没用。

修改方案

直接重写player_input函数,把输入读取放到循环内部,只有落子成功才跳出循环,同时补充输入合法性校验和异常捕获:

def player_input(board):
    while True:
        # 每次循环都重新读取输入
        try:
            answer = int(input("Enter a value 1-9 to place your marker. It's currently {} turn: ".format(current_player)))
            # 先校验输入范围
            if 1 <= answer <= 9:
                # 再校验格子是否为空
                if board[answer-1] == "-":
                    board[answer-1] = current_player
                    # 只有落子成功才跳出输入循环
                    break
                else:
                    print("Sorry, that spot seems to be taken. Please pick another")
            else:
                print("Invalid input! Please enter a number between 1 and 9")
        except ValueError:
            # 捕获输入非数字的异常,避免程序崩溃
            print("Invalid input! Please enter a valid number")

同时删掉switch_player函数里没用的global answer行,修改后的切换玩家函数如下:

def switch_player():
    global current_player
    if current_player == "X":
        current_player  = 'O'
    else:
        current_player = "X"

逻辑说明

修改后player_input会一直停在循环里要求当前玩家输入,直到输入合法、成功落子才会返回主游戏循环,后续的胜负判断、平局判断、切换玩家逻辑才会执行。如果输入是已占用格子、超出1-9范围、非数字内容,只会打印对应提示后重新要求当前玩家输入,不会走到切换玩家的步骤,也就不会出现丢回合的问题。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.29 02:15:39