Python3编写的井字棋代码无法正确检测获胜者是什么原因?
井字棋代码问题修复
核心错误说明
- 获胜判定逻辑语法错误:你写的
board[0] and board[1] and board[2] == board[0]不符合Python语义,实际只会判断board[2]是否等于board[0],无法校验三个位置值是否完全相等,正确判断写法为board[0] == board[1] == board[2] != "-" - 获胜判定函数返回值错误:columns()、diagonals()中大量分支返回了不相关的棋盘位置值,比如匹配第二列获胜时错误返回
board[3],匹配对角线获胜时错误返回board[3],导致获胜玩家识别完全错误 - 游戏流程逻辑错误:handle_turn函数内的turn为局部变量,修改后不会同步全局轮次值,导致轮次逻辑完全混乱;落子去重逻辑错误,先将位置存入已占列表再判断重复,重复时还误修改了棋盘已有棋子;获胜检测时机滞后,落子后未立即触发检测,导致获胜后多轮才判定
- 平局判定逻辑缺失:未判断棋盘满子的平局场景,满子后不会正常结束游戏
修复后可运行代码
winner = None already_taken = [] board = [ "-", "-", "-", "-", "-", "-", "-", "-", "-" ] current_player = "X" def display_board(): print(board[0] + "|" + board[1] + "|" + board[2]) print(board[3] + "|" + board[4] + "|" + board[5]) print(board[6] + "|" + board[7] + "|" + board[8]) def handle_turn(): global current_player while True: position = int(input(f"Choose a position from 1-9 to add an \"{current_player}\": ")) - 1 if position in already_taken or position <0 or position >8: print("Position invalid or already taken.") continue already_taken.append(position) board[position] = current_player display_board() # 切换玩家 current_player = "O" if current_player == "X" else "X" break def check_rows(): global winner if board[0] == board[1] == board[2] != "-": winner = board[0] return True if board[3] == board[4] == board[5] != "-": winner = board[3] return True if board[6] == board[7] == board[8] != "-": winner = board[6] return True return False def check_columns(): global winner if board[0] == board[3] == board[6] != "-": winner = board[0] return True if board[1] == board[4] == board[7] != "-": winner = board[1] return True if board[2] == board[5] == board[8] != "-": winner = board[2] return True return False def check_diagonals(): global winner if board[0] == board[4] == board[8] != "-": winner = board[0] return True if board[2] == board[4] == board[6] != "-": winner = board[2] return True return False def check_if_win(): return check_rows() or check_columns() or check_diagonals() def check_if_tie(): return len(already_taken) == 9 def check_if_game_over(): return check_if_win() or check_if_tie() # 主游戏流程 display_board() running = True while running: handle_turn() if check_if_game_over(): running = False if winner: print(f"Player {winner} has won!") else: print("Whoops! Looks like you both tie.")
内容的提问来源于stack exchange,提问作者Omry Tzabbar
相关产品推荐
相关产品推荐

