Как я могу понять, почему мой mini-max ti c -ta c -ee AI не работает? - PullRequest
0 голосов
/ 17 февраля 2020

Я пытаюсь сделать игру с минимаксом ti c -ta c -Tee, потому что я новичок в Python и пытаюсь понять, как работает простая игра AI-mini-max. ИИ по какой-то причине все еще идет в том порядке, в котором пятно появляется в списке для доски.

Пример: если верхнее правое пятно было первым в списке "b", оно выбирает его первым. Похоже, что он рассчитывает баллы, но я не думаю, что он использует их по какой-то причине. Я хочу, чтобы это не go в порядке того, что места на доске. Я не могу найти способ заменить код, который помещает "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

1 Ответ

0 голосов
/ 17 февраля 2020
  • Как правило общего стиля, старайтесь, чтобы длина строк не превышала 100 символов.
  • Не следует использовать str в качестве имени переменной, поскольку оно является встроенным.
  • Вы можете использовать enumerate, чтобы получить индекс и значение из списка во время итерации.
  • scores должен быть определен в minimax, потому что это единственное место, где он используется.
  • ИИ занимает первое доступное место из-за этого раздела кода:

    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 в игре l oop, потому что вы явно кодируете ходы ai и пользователя.
  • Вам не нужно проверять, если boolean == True просто сказать while game:
  • Вам не нужно break, если ваш управляющий бул установлен на false.
  • Если пользователь вводит неверный ввод, он теряет свой ход.
  • у вас есть sw = checkwinner(), тогда вы изучите значение cw

Я мог бы исправить это для вас, но я думаю, что дал вам достаточно для работы здесь, и я буду скажу вам, что ваша концепция является здравой (я sh), поэтому, если вы просто будете придерживаться ее немного дальше, вы получите некоторые удовлетворительные результаты ...

Главный логический недостаток в том, что вы никогда не посчитаете, как много побед от данного выбора оставляет ... Ваша минимаксная функция просто возвращает 1 каждый раз.

...