Как исправить мой минимакс Python TicTacToe AI - PullRequest
0 голосов
/ 23 октября 2019

Я пытаюсь создать минимаксный Python AI для моей игры TicTacToe, но кажется, что AI просто выбирает место, наиболее удаленное от игрового поля. В чем проблема?

Это то, чем я занимаюсь в школе, Python 3. Я несколько раз просматривал код и исправлял немало ошибок. Я добавил кое-что, что говорит мне, что, по его мнению, имеет счет ход, который он делает, но он всегда возвращает 1, даже если он только что сделал ход, который наверняка проиграет.

    def detectWin(origBoard, human):
        if human:
            if (origBoard[0] == origBoard[1] == origBoard[2]) or (origBoard[3] == origBoard[4] == origBoard[5]) or (origBoard[6] == origBoard[7] == origBoard[8]) or(origBoard[0] == origBoard[3] == origBoard[6]) or (origBoard[1] == origBoard[4] == origBoard[7]) or (origBoard[2] == origBoard[5] == origBoard[8]) or (origBoard[0] == origBoard[4] == origBoard[8]) or (origBoard[2] == origBoard[4] == origBoard[6]):
                return 1
            else:
                fullNum = 0
                for square in board:
                    if square == 1 or square == 0:
                        fullNum += 1
                if fullNum == 9:
                    return 0
        else:
            if (origBoard[0] == origBoard[1] == origBoard[2] == 0) or (origBoard[3] == origBoard[4] == origBoard[5] == 0) or (origBoard[6] == origBoard[7] == origBoard[8] == 0) or(origBoard[0] == origBoard[3] == origBoard[6] == 0) or (origBoard[1] == origBoard[4] == origBoard[7] == 0) or (origBoard[2] == origBoard[5] == origBoard[8] == 0) or (origBoard[0] == origBoard[4] == origBoard[8] == 0) or (origBoard[2] == origBoard[4] == origBoard[6] == 0):
                return 2
            elif (origBoard[0] == origBoard[1] == origBoard[2] == 1) or (origBoard[3] == origBoard[4] == origBoard[5] == 1) or (origBoard[6] == origBoard[7] == origBoard[8] == 1) or(origBoard[0] == origBoard[3] == origBoard[6] == 1) or (origBoard[1] == origBoard[4] == origBoard[7] == 1) or (origBoard[2] == origBoard[5] == origBoard[8] == 1) or (origBoard[0] == origBoard[4] == origBoard[8] == 1) or (origBoard[2] == origBoard[4] == origBoard[6] == 1):
                return 1
        return

    def availableIndexes(boardArray):
        answer = []
        for j in range(len(boardArray)):
            if boardArray[j] != 1 and boardArray[j] != 0:
                answer.append(j)
        return(answer)
    class Move:
        def __init__(self, index, score):
            self.index = index
            self.score = score
    def minimax(origBoard, player):

        availSpots = availableIndexes(origBoard)
        if detectWin(origBoard, False) == 1:
            return Move(None,10)
        elif detectWin(origBoard, False) == 2:
            return Move(None,-10)
        elif len(availSpots) == 0:
            return Move(None,0)
        if player == 1:
            otherPlayer = 0
        else:
            otherPlayer = 1

        newBoard = origBoard[:]
        moves = []

        for spot in availSpots:
            newBoard[spot] = player
            move = Move(spot, minimax(newBoard, otherPlayer).score)
            moves.append(move)
            newBoard = origBoard[:]

        for move in moves:
            if player == 0:
                bestScore = 11
                if move.score < bestScore:
                    bestMove = move
                    bestScore = move.score
            else:
                bestScore = -11
                if move.score > bestScore:
                    bestMove = move
                    bestScore = move.score

        return bestMove

ИИ играет как Х. В моей игре Х равен 1, а О равен 0. Я хочу, чтобы он мог давать тактические ходы, но в данный момент он просто воспроизводит ход, имеющийсамый высокий индекс и по-прежнему доступен. Любые мысли о том, как я мог решить мою проблему?

...