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

Python井字棋(Tic Tac Toe)游戏胜利判定异常求助

Python井字棋胜利判定问题修复

你的井字棋代码存在核心逻辑错误:胜利判定逻辑混乱导致误判/漏判,同时变量作用域问题使得胜利后无法终止游戏。以下是完整修复方案及说明:

修复后完整代码

import random

# 初始化带分隔符的棋盘
Tablero = [[" ", "|", " ", "|", " "], 
           ["^", "^", "^", "^", "^"], 
           [" ", "|", " ", "|", " "],
           ["^", "^", "^", "^", "^"], 
           [" ", "|", " ", "|", " "]]
Finish = False
# 映射用户输入的1-3行列到棋盘实际棋子索引(0、2、4)
Relacion_Indices = {1:0, 2:2, 3:4}


def DibujarTablero():
    for fila in Tablero:
        print("".join(fila))


def TurnoJugador():
    global Finish
    try:
        columna = int(input("Elige la columna (1-3): "))
        fila = int(input("Elige la fila (1-3): "))
        # 转换为棋盘实际索引
        columna_real = Relacion_Indices.get(columna)
        fila_real = Relacion_Indices.get(fila)
        
        if columna_real is None or fila_real is None:
            print("输入无效,请选择1-3之间的行列")
            TurnoJugador()
            return
        
        if Tablero[fila_real][columna_real] != " ":
            print("该位置已被占用,请重新选择")
            TurnoJugador()
            return
        
        # 玩家落子
        Tablero[fila_real][columna_real] = "X"
        DibujarTablero()
        # 检查胜利
        if CheckWin(fila_real, columna_real):
            print("你赢了!")
            Finish = True
    except ValueError:
        print("请输入有效的数字")
        TurnoJugador()


def TurnoAI():
    global Finish
    print("Turno de la IA")
    while True:
        # AI随机选择空位
        fila = random.randint(1, 3)
        columna = random.randint(1, 3)
        fila_real = Relacion_Indices[fila]
        columna_real = Relacion_Indices[columna]
        
        if Tablero[fila_real][columna_real] == " ":
            Tablero[fila_real][columna_real] = "O"
            DibujarTablero()
            # 检查胜利
            if CheckWin(fila_real, columna_real):
                print("AI赢了!")
                Finish = True
            break


def CheckWin(fila, columna):
    char = Tablero[fila][columna]
    if char == " ":
        return False
    
    # 检查当前行(该行三个棋子位置:0、2、4列)
    if Tablero[fila][0] == char and Tablero[fila][2] == char and Tablero[fila][4] == char:
        return True
    
    # 检查当前列(该列三个棋子位置:0、2、4行)
    if Tablero[0][columna] == char and Tablero[2][columna] == char and Tablero[4][columna] == char:
        return True
    
    # 检查主对角线(左上→右下,仅当落子在对角线上时触发)
    if fila == columna:
        if Tablero[0][0] == char and Tablero[2][2] == char and Tablero[4][4] == char:
            return True
    
    # 检查副对角线(右上→左下,仅当落子在对角线上时触发)
    if fila + columna == 4:
        if Tablero[0][4] == char and Tablero[2][2] == char and Tablero[4][0] == char:
            return True
    
    return False


DibujarTablero()
while not Finish:
    if not Finish:
        TurnoJugador()
    if not Finish:
        TurnoAI()

关键修改说明

  • 索引逻辑优化:将原复杂的索引计算替换为直接映射表Relacion_Indices,把用户输入的1-3行列直接转换为棋盘上棋子的实际索引(0、2、4),避免计算错误。
  • 胜利判定重构:重新实现CheckWin函数,分四个明确维度检查胜利条件:当前行、当前列、主对角线、副对角线,逻辑清晰,彻底解决误判/漏判问题。
  • 变量作用域修复:在玩家和AI回合函数中添加global Finish声明,确保胜利后能正确修改全局变量,终止游戏循环。
  • 输入验证增强:添加非数字输入处理、行列范围检查,提升游戏的健壮性和用户体验。
  • 流程逻辑优化:每次落子后立即检查胜利,若已分出胜负则跳过对方回合,符合正常游戏规则。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.07 00:01:07