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

