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

Python井字棋游戏棋盘无法重置问题求助

解决井字棋棋盘无法重置及相关问题

核心问题:棋盘重置无效的原因

你的resetGame函数中,Board=[["_","_","_"], ...]是创建了一个局部变量,和全局的Board不是同一个对象,所以全局棋盘不会被修改。高效的重置方式不需要重新创建列表,直接修改原列表的元素即可,或者使用global声明来修改全局变量。

其他需要修复的问题

  • 全局变量(如PlayerSym、AIsymbol、score、AIscore、Win)在函数内修改时,需要用global声明,否则只会创建局部变量,无法影响全局值。
  • GameWinner函数的调用时机错误,应该在玩家和AI落子后再检查胜负,而不是每次循环都先调用。
  • Symbols函数的逻辑有误,初始判断Win==False会导致每次都强制玩家为X,应该调整逻辑。
  • 缺少AI落子的逻辑(原代码里只有玩家落子)。

修复后的代码

import random

# 全局变量初始化
score = 0
AIscore = 0
PlayerSym = "X"
AIsymbol = "O"
Win = False
ListTF = [True, False]
Board = [["_", "_", "_"], 
         ["_", "_", "_"],
         ["_", "_", "_"]]

def resetGame():
    # 直接修改全局Board的元素,高效重置
    for row in range(3):
        for col in range(3):
            Board[row][col] = "_"
    print("棋盘已重置 ///////////////////////////////////////////")

def initiateGame():
    print("欢迎来到井字棋游戏")
    print("先获得3分的一方获胜")
    print("选择行和列来放置你的符号:")

def Symbols():
    global PlayerSym, AIsymbol, Win
    TF = random.choice(ListTF)
    # 首次游戏玩家先出X,之后随机决定
    if not Win:
        PlayerSym = "X"
        AIsymbol = "O"
        print("你是 'X',先行")
    else:
        if TF:
            PlayerSym = "X"
            AIsymbol = "O"
            print("你是 'X',先行")
        else:
            PlayerSym = "O"
            AIsymbol = "X"
            print("你是 'O',后行")

def checkWinner():
    global score, AIscore, Win
    # 检查行
    for row in range(3):
        if Board[row][0] == Board[row][1] == Board[row][2] != "_":
            if Board[row][0] == PlayerSym:
                Win = True
                print("恭喜!你获得1分")
                score += 1
            else:
                Win = False
                print("AI获得1分")
                AIscore += 1
            print(f"当前比分:玩家 {score} - AI {AIscore}")
            resetGame()
            return True
    # 检查列
    for col in range(3):
        if Board[0][col] == Board[1][col] == Board[2][col] != "_":
            if Board[0][col] == PlayerSym:
                Win = True
                print("恭喜!你获得1分")
                score += 1
            else:
                Win = False
                print("AI获得1分")
                AIscore += 1
            print(f"当前比分:玩家 {score} - AI {AIscore}")
            resetGame()
            return True
    # 检查对角线
    if Board[0][0] == Board[1][1] == Board[2][2] != "_":
        if Board[0][0] == PlayerSym:
            Win = True
            print("恭喜!你获得1分")
            score += 1
        else:
            Win = False
            print("AI获得1分")
            AIscore += 1
        print(f"当前比分:玩家 {score} - AI {AIscore}")
        resetGame()
        return True
    if Board[0][2] == Board[1][1] == Board[2][0] != "_":
        if Board[0][2] == PlayerSym:
            Win = True
            print("恭喜!你获得1分")
            score += 1
        else:
            Win = False
            print("AI获得1分")
            AIscore += 1
        print(f"当前比分:玩家 {score} - AI {AIscore}")
        resetGame()
        return True
    # 检查平局
    if all(cell != "_" for row in Board for cell in row):
        print("平局!")
        resetGame()
        return True
    return False

def playerMove():
    print("\n当前棋盘:")
    for row in Board:
        print(" ".join(row))
    while True:
        try:
            row = int(input("选择行(0-2):"))
            col = int(input("选择列(0-2):"))
            if 0 <= row <= 2 and 0 <= col <= 2:
                if Board[row][col] == "_":
                    Board[row][col] = PlayerSym
                    break
                else:
                    print("该位置已有棋子,请重新选择")
            else:
                print("输入超出范围,请输入0-2之间的数字")
        except ValueError:
            print("请输入有效的整数")

def aiMove():
    print("\nAI正在落子...")
    while True:
        row = random.randint(0, 2)
        col = random.randint(0, 2)
        if Board[row][col] == "_":
            Board[row][col] = AIsymbol
            break

def main():
    global Win
    Symbols()
    while True:
        if PlayerSym == "X":
            playerMove()
            if checkWinner():
                break
            aiMove()
            if checkWinner():
                break
        else:
            aiMove()
            if checkWinner():
                break
            playerMove()
            if checkWinner():
                break
        # 检查是否有人达到3分
        if score >= 3:
            print("你赢得了整场游戏!")
            break
        elif AIscore >= 3:
            print("AI赢得了整场游戏!")
            break

initiateGame()
while True:
    main()

关键修复点说明

  1. 棋盘重置优化:resetGame函数通过遍历修改原列表的元素,避免重新创建列表,更高效且直接修改全局棋盘。
  2. 全局变量声明:在需要修改全局变量的函数中添加global关键字,确保函数内的修改能影响全局值。
  3. 胜负检查逻辑:重构checkWinner函数,合并重复代码,增加平局检查,并在每次落子后调用。
  4. 游戏流程调整:修复main函数的逻辑,按照“玩家/AI落子→检查胜负→交替进行”的流程执行,直到有人获胜或平局。
  5. 添加AI落子:补充随机AI落子的逻辑,让游戏可以正常进行。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.06.30 03:53:19