我如何才能找出我的minimax Tictatoe AI不工作的原因?

2024-03-28 13:10:24 发布

您现在位置:Python中文网/ 问答频道 /正文

我正在尝试制作一个minimax tic-tac-toe游戏,因为我是Python的新手,我正在尝试弄清楚一个简单的AI mini-max游戏是如何工作的。出于某种原因,AI仍然按照该点出现在董事会列表中的顺序进行

如果右上角的位置是“b”列表中的第一个,它会首先选择它。它看起来像是在计算分数,但我不认为它出于某种原因在利用分数。我不希望它按照棋盘上空格的顺序排列。我想不出一种方法来替换放置“O”的代码

import random
import math

three = [0, 0, 0]
game = True
turnai = False
result = ""
b = [" ", " ", " ", " ", " ", " ", " ", " ", " "]
x = "X"
o = "O"
#Spots on the board Ex: ur = upper right, mm = middle middle, lm = lower middle
ur = b[2]
um = b[1]
ul = b[0]
ml = b[3]
mm = b[4]
mr = b[5]
ll = b[6]
lm = b[7]
lr = b[8]
cw = " "

AI = ""
player = ""

#Board setup
def board(ul, um, ur, ml, mm, mr, ll, lm, lr):
    print("|" + " " + ul + " " + "|" + " " + um + " " + "|" + " " + ur + " " + "|")
    print("|" + " " + ml + " " + "|" + " " + mm + " " + "|" + " " + mr + " " + "|")
    print("|" + " " + ll + " " + "|" + " " + lm + " " + "|" + " " + lr + " " + "|")


board(ul, um, ur, ml, mm, mr, ll, lm, lr)
print("This is the game of tic-tac-toe")
print("You will be playing against an AI")
print("Type where you want to place your letter Ex: ur = upper right, mm = middle middle, and ll = lower right")

first = "P"
player = "X"
AI = "O"

#Checks if someone has won
def checkwinner():
    ur = b[2]
    um = b[1]
    ul = b[0]
    ml = b[3]
    mm = b[4]
    mr = b[5]
    ll = b[6]
    lm = b[7]
    lr = b[8]
    row1 = [ul, ml, ll]
    row2 = [um, mm, lm]
    row3 = [ur, mr, lr]
    column1 = [ul, um, ur]
    column2 = [ml, mm, mr]
    column3 = [ll, lm, lr]
    diagonal1 = [ul, mm, lr]
    diagonal2 = [ur, mm, ll]
    if row1 == ["X", "X", "X"] or row2 == ["X", "X", "X"] or row3 == ["X", "X", "X"] or column1 == ["X", "X",
                                                                                                    "X"] or column2 == [
        "X", "X", "X"] or column3 == ["X", "X", "X"] or diagonal1 == ["X", "X", "X"] or diagonal2 == ["X", "X",
                                                                                                      "X"]:
        if player == x:
            print("You win! (X)")
            return "X"
        if player != x:
            print("You lose!")
            return "O"
    if row1 == ["O", "O", "O"] or row2 == ["O", "O", "O"] or row3 == ["O", "O", "O"] or column1 == ["O", "O",
                                                                                                    "O"] or column2 == [
        "O", "O", "O"] or column3 == ["O", "O", "O"] or diagonal1 == ["O", "O", "O"] or diagonal2 == ["O", "O",
                                                                                                      "O"]:
        if player == o:
            print("You win! (O)")
            return "X"
        if player != o:
            print("You lose")
            return "O"
    if b[0] != " " and b[1] != " " and b[2] != " " and b[3] != " " and b[4] != " " and b[5] != " " and b[
        6] != " " and b[7] != " " and b[8] != " ":
        print("TIE!")
        winner = True
        return "0"
    return "null"
#Minimax Algorithm
def minimax(b, depth, isMaximizing):
            result = checkwinner()
            if result != "null":
                score = scores[result] + score
                return score

            if (isMaximizing):
                bestScore = -math.inf
                j = 0
                for str in b:
                    if str == " ":
                        b[j] = AI
                        score = minimax(b, depth + 1, False) + score
                        b[j] = " "
                        bestScore = max(score, bestScore)
                    j += 1
                return bestScore

            else:
                bestScore = math.inf
                k = 0
                for str in b:
                    if str == " ":
                        b[k] = player
                        score = minimax(b, depth + 1, True) + score
                        b[k] = " "
                        bestScore = min(score, bestScore)
                    k += 1
                return bestScore


#Game Start loop
if (first == "P"):
    while (game == True):
        i = 0
        scores = {
            'O': 1,
            'X': -1,
            '0': 0
        }
#AI turn
        bestScore = -math.inf
        turnai = False
        i = 0
        for str in b:
            if str == " ":
                b[i] = AI
                score = minimax(b, 0, True)
                b[i] = " "
                print(score)
                if score > bestScore and turnai == False:
                    bestScore = score
                    b[i] = AI
                    turnai = True
            i += 1
        turnai = False
        print("")
        # b = [ul, um, ur, ml, mm, mr, ll, lm, lr]
        ur = b[2]
        um = b[1]
        ul = b[0]
        ml = b[3]
        mm = b[4]
        mr = b[5]
        ll = b[6]
        lm = b[7]
        lr = b[8]
#Prints Board
        board(b[0], b[1], b[2], b[3], b[4], b[5], b[6], b[7], b[8])
        cw = checkwinner()
#Checks if game ended
        if cw == "X" or cw == "O" or cw == "0":
            game = False
            break
#Player turn
        print("Where do you want to place your letter?")
        turn = input(": ")
        if turn == "ur" and ur == " ":
            b[2] = player
            uru = True
        if turn == "um" and um == " ":
            b[1] = player
            umu = True
        if turn == "ul" and ul == " ":
            b[0] = player
            ulu = True
        if turn == "mr" and mr == " ":
            b[5] = player
            mru = True
        if turn == "mm" and mm == " ":
            b[4] = player
            mmu = True
        if turn == "ml" and ml == " ":
            b[3] = player
            mlu = True
        if turn == "lr" and lr == " ":
            b[8] = player
            lru = True
        if turn == "lm" and lm == " ":
            b[7] = player
            lmu = True
        if turn == "ll" and ll == " ":
            b[6] = player
            llu = True
#Prints Board
        board(b[0], b[1], b[2], b[3], b[4], b[5], b[6], b[7], b[8])
        sw = checkwinner()
#Checks if game needs to be ended
        if cw == "X" or cw == "O" or cw == "0":
            game = False
            break


Tags: orandtrueifulturnumlm
1条回答
网友
1楼 · 发布于 2024-03-28 13:10:24
  • 作为一个一般的风格规则,尽量保持你的线条长度<;100个字符
  • 您不应该使用str作为变量名,因为它是内置的
  • 您可以在迭代时使用enumerate从列表中获取索引和值
  • scores应该在minimax中定义,因为这是它唯一使用的地方
  • 由于这部分代码,AI获得了第一个可用位置:

    bestScore = -math.inf
    turnai = False
    i = 0
    for str in b:
        if str == " ":
            b[i] = AI
            score = minimax(b, 0, True)
            b[i] = " "
            print(score)
            if score > bestScore and turnai == False: # Allways true first loop
                bestScore = score
                b[i] = AI 
                turnai = True                         # ^ Never true in later loops
    

    讽刺的是,只有当turnai == false

  • 实际上,您不需要在游戏循环中使用turnai布尔值,因为您显式地对ai和用户回合进行编码
  • 您不需要检查boolean == True是否只说while game:
  • 如果控件bool设置为false,则不需要break
  • 如果用户输入无效的输入,他们将失去轮次
  • sw = checkwinner(),然后检查cw的值

我可以帮你解决这个问题,但我想我已经给了你足够的时间来处理这个问题,我会告诉你,你的概念是正确的,所以如果你再坚持一点,你会得到一些令人满意的结果

这里主要的逻辑缺陷是,你从来没有真正计算过一个给定的选择会留下多少胜利。。。你的minimax函数每次只返回1

相关问题 更多 >