Python实现Tic Tac Toe井字棋胜负判定玩家显示颠倒求助
井字棋胜负提示错位修复方案
问题根因
两个问题共同导致了胜负提示错位:
- 执行顺序错误:当前代码在玩家落子完成后立刻切换了玩家身份,下一轮循环开头才做胜负校验,此时传入校验函数的玩家已经是对手的身份,自然会打印错误的获胜者
- 校验函数逻辑缺陷:
is_win函数仅判断棋盘存在三连的非空棋子,根本没有校验这个三连棋子是不是你传入的player,不管传入什么玩家,只要有三连就会打印这个玩家获胜,进一步放大了顺序问题的影响
修复代码
1. 修正is_win函数
修改后的校验逻辑会先确认三连棋子就是传入的玩家,再判定获胜:
def is_win(board,player): row1 = board[0] row2 = board[1] row3 = board[2] # 所有判断增加和player的比对,确认获胜的就是当前传入的玩家 if row1[0] == row1[1] == row1[2] == player: print(player + " Has won!") return True elif row2[0] == row2[1] == row2[2] == player: print(player + " Has won!") return True elif row3[0] == row3[1] == row3[2] == player: print(player + " Has won!") return True elif row1[0] == row2[0] == row3[0] == player: print(player + " Has won!") return True elif row1[1] == row2[1] == row3[1] == player: print(player + " Has won!") return True elif row1[2] == row2[2] == row3[2] == player: print(player + " Has won!") return True elif row1[0] == row2[1] == row3[2] == player: print(player + " Has won!") return True elif row1[2] == row2[1] == row3[0] == player: print(player + " Has won!") return True else: return False
2. 调整game函数执行顺序
落子完成后先校验当前玩家是否获胜,确认未获胜再切换玩家:
def game(): player = 'X' print_board(board) while True: # 先判断是否平局 if is_full(board): print("draw") break # 获取输入落子 row, col = get_user_input() set_cell(board, row, col, player) # 落子后立刻校验当前玩家是否获胜 if is_win(board, player): break # 未获胜再切换玩家 player = switch_turn(player)
额外优化建议
原代码中的board = initial_board属于浅引用,后续重置棋盘时建议直接调用board = empty_board()避免全局变量引用异常。
内容的提问来源于stack exchange,提问作者user14832934
相关产品推荐
相关产品推荐

