Python3文本式井字棋游戏胜负平局检测功能异常求助
问题原因
board_lines_win_check仅在程序初始化时赋值一次,存储的是棋盘初始的数字字符,后续修改board字典的落子状态时,该变量不会同步更新,永远无法检测到获胜条件。win_tie_check函数遍历board_lines_win_check时,取到的是字典的键("row1"、"row2"这类字符串),而非键对应的行/列列表,判断line[0] == "X"本质是判断字符串首字符是否为X,逻辑完全不成立。- 原有平局检测逻辑存在错误,会提前返回空值导致平局判断失效。
修正后的完整代码
board = { 1: "1", 2: "2", 3: "3", 4: "4", 5: "5", 6: "6", 7: "7", 8: "8", 9: "9" } taken_spaces = [] players = ("X", "O") current_player = players[0] def print_board(): print(f''' {board[1]} | {board[2]} | {board[3]} ----|---|---- {board[4]} | {board[5]} | {board[6]} ----|---|---- {board[7]} | {board[8]} | {board[9]}''') def player_input(): print_board() print('') print(f"Player {current_player}'s turn!") while True: try: while True: player_move = int(input(f'Please enter the number of the place you want to set your mark: ')) if (player_move >= 1) and (player_move <= 9) and player_move not in taken_spaces: break else: print('Please enter a number between 1 and 9 that has not yet been taken!') break except ValueError: print('Please enter a valid number') taken_spaces.append(player_move) return player_move def move(): player_move = player_input() board[player_move] = current_player return board def win_tie_check(): # 每次检测动态生成最新的棋盘线数据 board_lines_win_check = { "row1": [board[1], board[2], board[3]], "row2": [board[4], board[5], board[6]], "row3": [board[7], board[8], board[9]], "col1": [board[1], board[4], board[7]], "col2": [board[2], board[5], board[8]], "col3": [board[3], board[6], board[9]], "diagonal_lr": [board[1], board[5], board[9]], "diagonal_rl": [board[3], board[5], board[7]] } # 检测获胜条件 for line in board_lines_win_check.values(): if line[0] == line[1] == line[2] == "X": return 1 elif line[0] == line[1] == line[2] == "O": return -1 # 检测平局 for val in board.values(): if val not in ("X", "O"): return "" return 0 for i in range(9): move() if current_player == players[0]: current_player = players[1] else: current_player = players[0] check_res = win_tie_check() if check_res == 1: print('Player X wins! Congratulations!') break elif check_res == -1: print('Player O wins! Congratulations') break elif check_res == 0: print("It's a tie! Good game!") break print_board()
核心改动说明
- 删除了全局的
board_lines_win_check定义,改在win_tie_check函数内部每次动态生成,保证拿到的是最新的落子状态 - 修正遍历逻辑为遍历字典的
.values(),获取行/列/对角线的实际列表数据进行判断 - 简化平局检测逻辑,无获胜条件时直接检查所有棋盘格子是否都被占满,是则返回平局,否则返回空值表示游戏继续
- 优化主循环中
win_tie_check的调用逻辑,仅调用一次存为变量,避免重复计算
内容的提问来源于stack exchange,提问作者299792458
相关产品推荐
相关产品推荐

