Python控制台井字棋Win判定bug:两子连线即判定玩家获胜问题
问题修复方案
核心错误原因
你的井字棋提前判定获胜的根本原因是Win函数中的多条件相等判断写法不符合Python语法逻辑。
你写的if Board[0] and Board[1] and Board[2] == "X" 等价于 if (bool(Board[0]) == True) and (bool(Board[1]) == True) and (Board[2] == "X")。初始棋盘的数字1-9在布尔判断中都为真,所以只要某条获胜线的最后一个格子被填为X/Y,不管前面两个是未修改的数字还是已填充的标记,都会触发获胜判定,自然会出现仅下两步就判赢的问题。
修复代码
直接修改原判断逻辑版
def Win(): # 判定玩家1(X)获胜 if (Board[0] == "X" and Board[1] == "X" and Board[2] == "X") or \ (Board[3] == "X" and Board[4] == "X" and Board[5] == "X") or \ (Board[6] == "X" and Board[7] == "X" and Board[8] == "X") or \ (Board[0] == "X" and Board[3] == "X" and Board[6] == "X") or \ (Board[1] == "X" and Board[4] == "X" and Board[7] == "X") or \ (Board[2] == "X" and Board[5] == "X" and Board[8] == "X") or \ (Board[0] == "X" and Board[4] == "X" and Board[8] == "X") or \ (Board[2] == "X" and Board[4] == "X" and Board[6] == "X"): print("Player 1 Won") return False # 判定玩家2(Y)获胜 elif (Board[0] == "Y" and Board[1] == "Y" and Board[2] == "Y") or \ (Board[3] == "Y" and Board[4] == "Y" and Board[5] == "Y") or \ (Board[6] == "Y" and Board[7] == "Y" and Board[8] == "Y") or \ (Board[0] == "Y" and Board[3] == "Y" and Board[6] == "Y") or \ (Board[1] == "Y" and Board[4] == "Y" and Board[7] == "Y") or \ (Board[2] == "Y" and Board[5] == "Y" and Board[8] == "Y") or \ (Board[0] == "Y" and Board[4] == "Y" and Board[8] == "Y") or \ (Board[2] == "Y" and Board[4] == "Y" and Board[6] == "Y"): print("Player 2 Won") return False else: return True
简化优化版(推荐)
预先定义所有获胜线的索引组合,循环判断减少代码冗余,避免手写判断的语法错误:
def Win(): # 所有获胜线的索引:横、竖、斜 win_lines = [ [0,1,2], [3,4,5], [6,7,8], [0,3,6], [1,4,7], [2,5,8], [0,4,8], [2,4,6] ] for line in win_lines: a, b, c = line if Board[a] == Board[b] == Board[c] == "X": print("Player 1 Won") return False if Board[a] == Board[b] == Board[c] == "Y": print("Player 2 Won") return False return True
内容的提问来源于stack exchange,提问作者Sarthak Hingankar
相关产品推荐
相关产品推荐

