You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

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()

关键修改说明

  1. 胜负判定函数重构:让check_for_winner返回布尔值,直接告知游戏是否结束,同时优化胜负判断逻辑、新增平局判定,减少重复代码。
  2. 修复循环语法错误:将错误的循环条件改为while not game_over:,使用更清晰的变量名。
  3. 变量作用域修复:通过函数返回值更新游戏结束状态,避免局部变量覆盖外部变量的问题。
  4. 优化棋盘更新逻辑:用数学计算替代大量elif判断,简化代码(idx = num -1; game_board[idx//3][idx%3] = symbol)。
  5. 输入合法性检查:新增用户输入校验,防止输入已被占用的位置。

内容的提问来源于stack exchange,提问作者Amin Askari

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.13 23:18:10