Python井字棋游戏问题求助:获胜后无法退出循环
Python井字棋游戏问题修复
问题分析
原代码存在以下核心问题导致获胜后无法终止游戏:
check_for_winner函数内的GG = True仅修改局部变量,外部GG变量不会更新,游戏循环条件始终为False,无法退出。- 游戏循环存在语法错误(
while G\nG == False:)。 - 每次行动后未立即检查胜负状态并终止循环。
修复后的完整代码
import random try: print("Welcome to Tic Tac Toe \n======================") Running = 1 while Running == 1: possible_numbers = [1,2,3,4,5,6,7,8,9] game_board = [["1","2","3"],["4","5","6"],["7","8","9"]] def print_game_board(): print("+---+---+---+") print(f"| {game_board[0][0]} | {game_board[0][1]} | {game_board[0][2]} |") print("+---+---+---+") print(f"| {game_board[1][0]} | {game_board[1][1]} | {game_board[1][2]} |") print("+---+---+---+") print(f"| {game_board[2][0]} | {game_board[2][1]} | {game_board[2][2]} |") print("+---+---+---+") def check_for_winner(): # 检查行 for row in game_board: if row[0] == row[1] == row[2] and row[0] in ["X", "O"]: print(f"{row[0]} has won the game") return True # 检查列 for col in range(3): if game_board[0][col] == game_board[1][col] == game_board[2][col] and game_board[0][col] in ["X", "O"]: print(f"{game_board[0][col]} has won the game") return True # 检查对角线 if game_board[0][0] == game_board[1][1] == game_board[2][2] and game_board[0][0] in ["X", "O"]: print(f"{game_board[0][0]} has won the game") return True if game_board[0][2] == game_board[1][1] == game_board[2][0] and game_board[0][2] in ["X", "O"]: print(f"{game_board[0][2]} has won the game") return True # 检查平局 if all(cell in ["X", "O"] for row in game_board for cell in row): print("It's a tie!") return True return False print_game_board() print("You are going to play as X") turn = 0 game_over = False while not game_over: if (turn % 2) == 0: user_input = int(input("What number do you wanna put your X? 1-9 ")) # 检查输入是否合法 if user_input not in possible_numbers: print("Invalid move, try again!") continue possible_numbers.remove(user_input) # 更新棋盘 idx = user_input - 1 game_board[idx//3][idx%3] = "X" turn += 1 print_game_board() game_over = check_for_winner() if game_over: break else: print("Now it's computer turn") comp_choice = random.choice(possible_numbers) possible_numbers.remove(comp_choice) # 更新棋盘 idx = comp_choice - 1 game_board[idx//3][idx%3] = "O" print("Computer has played its turn") print_game_board() game_over = check_for_winner() turn += 1 if game_over: break wanna_play = input("do you wanna play another round? yes/no ").lower() if wanna_play == "yes": Running = 1 else: print("Thanks for playing") quit() except (ValueError, TypeError): print("Invalid input, exiting game.") quit()
关键修改说明
- 胜负判定函数重构:让
check_for_winner返回布尔值,直接告知游戏是否结束,同时优化胜负判断逻辑、新增平局判定,减少重复代码。 - 修复循环语法错误:将错误的循环条件改为
while not game_over:,使用更清晰的变量名。 - 变量作用域修复:通过函数返回值更新游戏结束状态,避免局部变量覆盖外部变量的问题。
- 优化棋盘更新逻辑:用数学计算替代大量
elif判断,简化代码(idx = num -1; game_board[idx//3][idx%3] = symbol)。 - 输入合法性检查:新增用户输入校验,防止输入已被占用的位置。
内容的提问来源于stack exchange,提问作者Amin Askari
相关产品推荐
相关产品推荐

