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

Python井字棋AI功能异常求助:后续回合无法正常落子

井字棋AI逻辑问题排查与优化

问题描述

作为编程新手,开发的Python井字棋游戏中,除AI模块外其余功能正常。当前AI逻辑为:检测即将完成的连线并补全(如XX_补为XXO、O_O补为OOO),无匹配模式则随机选空位落子。但AI仅在前2-3步表现正常,后续要么不执行落子,要么覆盖玩家的X棋子。

问题代码

tictactoe_ai()函数

def tictactoe_ai(game_board):
    if game_board["top-L"] == game_board["top-M"] != " " or game_board["bot-R"] == game_board["mid-R"] != " " or game_board["bot-L"] == game_board["mid-M"] != " " and game_board["top-R"] == " ":
        game_board["top-R"] = "O"
    elif game_board["top-L"] == game_board["top-R"] != " " or game_board["bot-M"] == game_board["mid-M"] != " " and game_board["top-M"] == " ":
        game_board["top-M"] = "O"
    elif game_board["top-M"] == game_board["top-R"] != " " or game_board["bot-L"] == game_board["mid-L"] != " " or game_board["bot-R"] == game_board["mid-M"] != " " and game_board["top-L"] == " ":
        game_board["top-L"] = "O"
    elif game_board["top-L"] == game_board["bot-L"] != " " or game_board["mid-M"] == game_board["mid-R"] != " " and game_board["mid-L"] == " ":
        game_board["mid-L"] = "O"
    elif game_board["top-L"] == game_board["bot-R"] != " " or game_board["top-R"] == game_board["bot-L"] != " " or game_board["top-M"] == game_board["bot-M"] != " " or game_board["mid-L"] == game_board["mid-R"] != " " and game_board["mid-M"] == " ":
        game_board["mid-M"] = "O"
    elif game_board["top-R"] == game_board["bot-R"] != " " or game_board["mid-L"] == game_board["mid-M"] != " " and game_board["mid-R"] == " ":
        game_board["mid-R"] = "O"
    elif game_board["top-R"] == game_board["mid-R"] != " " or game_board["bot-M"] == game_board["bot-L"] != " " or game_board["top-L"] == game_board["mid-M"] != " " and game_board["bot-R"] == " ":
        game_board["bot-R"] = "O"
    elif game_board["top-M"] == game_board["mid-M"] != " " or game_board["bot-L"] == game_board["bot-R"] != " " and game_board["bot-M"] == " ":
        game_board["bot-M"] = "O"
    elif game_board["top-L"] == game_board["mid-L"] != " " or game_board["bot-M"] == game_board["bot-L"] != " " or game_board["top-R"] == game_board["mid-M"] != " " and game_board["bot-L"] == " ":
        game_board["bot-L"] = "O"
    else:
        while True:
            play = random.choice(board_choices)
            if game_board[play] != " ":
                continue
            game_board[play] = "O"
            break

AI回合控制代码

while o_turn:
    tictactoe_ai(board)
    time.sleep(1.5)
    print_board(board)

    if draw(board) and not game_over(board):
        print("It's a draw")
        break

    if game_over(board):
        print("O wins")
        break

    x_turn = True
    o_turn = False 

问题根源

  • 逻辑运算符优先级错误:Python中and优先级高于or,导致每个if/elif的条件被错误分组,触发不符合预期的落子判断。
  • 条件逻辑混乱:未明确区分“补全自身赢线”和“阻止玩家赢线”的逻辑,且未严格确保目标位置为空就落子,导致覆盖玩家棋子的情况。
  • 分支覆盖不全:部分赢线的检查逻辑缺失,AI无法识别所有需要补全或阻止的场景,导致后续无正确落子动作。

修复与优化方案

优化后的AI函数

import random

# 预定义所有8条赢线,提升代码可读性与可维护性
WIN_LINES = [
    ["top-L", "top-M", "top-R"],  # 顶行
    ["mid-L", "mid-M", "mid-R"],  # 中行
    ["bot-L", "bot-M", "bot-R"],  # 底行
    ["top-L", "mid-L", "bot-L"],  # 左列
    ["top-M", "mid-M", "bot-M"],  # 中列
    ["top-R", "mid-R", "bot-R"],  # 右列
    ["top-L", "mid-M", "bot-R"],  # 对角线1
    ["top-R", "mid-M", "bot-L"]   # 对角线2
]

def tictactoe_ai(game_board):
    # 第一步:优先检查AI是否能一步获胜
    for line in WIN_LINES:
        a, b, c = line
        if game_board[a] == game_board[b] == "O" and game_board[c] == " ":
            game_board[c] = "O"
            return
        if game_board[a] == game_board[c] == "O" and game_board[b] == " ":
            game_board[b] = "O"
            return
        if game_board[b] == game_board[c] == "O" and game_board[a] == " ":
            game_board[a] = "O"
            return
    
    # 第二步:阻止玩家一步获胜
    for line in WIN_LINES:
        a, b, c = line
        if game_board[a] == game_board[b] == "X" and game_board[c] == " ":
            game_board[c] = "O"
            return
        if game_board[a] == game_board[c] == "X" and game_board[b] == " ":
            game_board[b] = "O"
            return
        if game_board[b] == game_board[c] == "X" and game_board[a] == " ":
            game_board[a] = "O"
            return
    
    # 第三步:随机选择空位落子
    empty_spots = [spot for spot in game_board if game_board[spot] == " "]
    if empty_spots:
        game_board[random.choice(empty_spots)] = "O"

优化说明

  • 预定义赢线:将所有赢线存入列表,避免重复编写冗长条件,大幅提升代码可读性和可维护性。
  • 分层逻辑:遵循“先赢、再防、最后随机”的井字棋AI基础策略,逻辑清晰且符合游戏规则。
  • 严格空位检查:每次落子前都确认目标位置为空,彻底解决覆盖玩家棋子的问题。
  • 简化随机落子:先筛选所有空位再随机选择,替代原代码中循环重试的冗余操作。

回合控制代码微调

原代码逻辑基本正常,调整平局判断顺序,确保胜负判断优先于平局判断:

while o_turn:
    tictactoe_ai(board)
    time.sleep(1.5)
    print_board(board)

    if game_over(board):
        print("O wins")
        break
    
    if draw(board):
        print("It's a draw")
        break

    x_turn = True
    o_turn = False 

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.21 04:18:29