如何将 minimax 添加到游戏 tictacto

问题描述 投票:0回答:0

我对 python 有点陌生,正在学习如何在视觉编码工作室制作游戏,目前正在开发游戏 tictacto 我知道我可以和电脑对战但是很容易被打败所以我想制作一个程序来对抗电脑而无需我尝试。

我正在尝试添加我在网上找到的这个 minimax 算法来对抗游戏中的计算机算法,但我似乎做不到

我试图更改 minimax 函数的名称和值,但我无法通过 get_state one

import random

def drawBoard(board):
\# This function prints out the board that it was passed.

    # "board" is a list of strings representing the board (ignore index 0).
    print(board[7] + '|' + board[8] + '|' + board[9])
    print('-+-+-')
    print(board[4] + '|' + board[5] + '|' + board[6])
    print('-+-+-')
    print(board[1] + '|' + board[2] + '|' + board[3])

def inputPlayerLetter():
\# Lets the player type which letter they want to be.
\# Returns a list with the player's letter as the first item and the computer's letter as the second.
letter = ''
while not (letter == 'X' or letter == 'O'):
print('Do you want to be X or O?')
letter = input().upper()

    # The first element in the list is the player's letter; the second is the computer's letter.
    if letter == 'X':
        return ['X', 'O']
    else:
        return ['O', 'X']

def whoGoesFirst():
\# Randomly choose which player goes first.
if random.randint(0, 1) == 0:
return 'computer'
else:
return 'player'

def makeMove(board, letter, move):
board\[move\] = letter

def isWinner(bo, le):
\# Given a board and a player's letter, this function returns True if that player has won.
\# We use "bo" instead of "board" and "le" instead of "letter" so we don't have to type as much.
return ((bo\[7\] == le and bo\[8\] == le and bo\[9\] == le) or # Across the top
(bo\[4\] == le and bo\[5\] == le and bo\[6\] == le) or # Across the middle
(bo\[1\] == le and bo\[2\] == le and bo\[3\] == le) or # Across the bottom
(bo\[7\] == le and bo\[4\] == le and bo\[1\] == le) or # Down the left side
(bo\[8\] == le and bo\[5\] == le and bo\[2\] == le) or # Down the middle
(bo\[9\] == le and bo\[6\] == le and bo\[3\] == le) or # Down the right side
(bo\[7\] == le and bo\[5\] == le and bo\[3\] == le) or # Diagonal
(bo\[9\] == le and bo\[5\] == le and bo\[1\] == le)) # Diagonal

def getBoardCopy(board):
\# Make a copy of the board list and return it.
boardCopy = \[\]
for i in board:
boardCopy.append(i)
return boardCopy

def isSpaceFree(board, move):
\# Return True if the passed move is free on the passed board.
return board\[move\] == ' '

def chooseRandomMoveFromList(board, movesList):
\# Returns a valid move from the passed list on the passed board.
\# Returns None if there is no valid move.
possibleMoves = \[\]
for i in movesList:
if isSpaceFree(board, i):
possibleMoves.append(i)

    if len(possibleMoves) != 0:
        return random.choice(possibleMoves)
    else:
        return None

def getComputerMove(board, computerLetter):
\# Given a board and the computer's letter, determine where to move
\# and return that move.
if computerLetter == 'X':
playerLetter = 'O'
else:
playerLetter = 'X'

    # Here is the algorithm for our Tic-Tac-Toe AI:
    # First, check if we can win in the next move.
    for i in range(1, 10):
        boardCopy = getBoardCopy(board)
        if isSpaceFree(boardCopy, i):
            makeMove(boardCopy, computerLetter, i)
            if isWinner(boardCopy, computerLetter):
                return i
    
    # Check if the player could win on their next move and block them.
    for i in range(1, 10):
        boardCopy = getBoardCopy(board)
        if isSpaceFree(boardCopy, i):
            makeMove(boardCopy, playerLetter, i)
            if isWinner(boardCopy, playerLetter):
                return i
    
    # Try to take one of the corners, if they are free.
    move = chooseRandomMoveFromList(board, [1, 3, 7, 9])
    if move != None:
        return move
    
    # Try to take the center, if it is free.
    if isSpaceFree(board, 5):
        return 5
    
    # Move on one of the sides.
    return chooseRandomMoveFromList(board, [2, 4, 6, 8])

def isBoardFull(board):
\# Return True if every space on the board has been taken. Otherwise,
\# return False.
for i in range(1, 10):
if isSpaceFree(board, i):
return False
return True

\#-------add this minimax into the original code ------

def playermoveMinimax():
bestScore = -math.inf
bestMove = None
for move in ticTacBoard.get_possible_moves():
ticTacBoard.make_move(move)
score = minimax(False, aiPlayer, ticTacBoard)
ticTacBoard.undo()
if (score \> bestScore):
bestScore = score
bestMove = move
ticTacBoard.make_move(bestMove)

def minimax(isMaxTurn, maximizerMark, board):
state = board.get_state()
if (state is State.DRAW):
return 0
elif (state is State.OVER):
return 1 if board.get_winner() is maximizerMark else -1

    scores = []
    for move in board.get_possible_moves():
        board.make_move(move)
        scores.append(minimax(not isMaxTurn, maximizerMark, board))
        board.undo()
    
    return max(scores) if isMaxTurn else min(scores)

\#-------------

print('Welcome to Tic-Tac-Toe!')
def main():
while True:
\# Reset the board.
theBoard = \[' '\] \* 10
playerLetter, computerLetter = inputPlayerLetter()
turn = whoGoesFirst()
print('The ' + turn + ' will go first.')
gameIsPlaying = True

        while gameIsPlaying:
            if turn == 'player':
                # Player's turn
                drawBoard(theBoard)
                #move = getPlayerMove(theBoard) 
                move = playermoveMinimax(theBoard,playerLetter)
                makeMove(theBoard, playerLetter, move)
    
                if isWinner(theBoard, playerLetter):
                    drawBoard(theBoard)
                    print('Hooray! You have won the game!')
                    gameIsPlaying = False
                else:
                    if isBoardFull(theBoard):
                        drawBoard(theBoard)
                        print('The game is a tie!')
                        break
                    else:
                        turn = 'computer'
    
            else:
                # Computer's turn
                move = getComputerMove(theBoard, computerLetter)
                makeMove(theBoard, computerLetter, move)
    
                if isWinner(theBoard, computerLetter):
                    drawBoard(theBoard)
                    print('The computer has beaten you! You lose.')
                    gameIsPlaying = False
                else:
                    if isBoardFull(theBoard):
                        drawBoard(theBoard)
                        print('The game is a tie!')
                        break
                    else:
                        turn = 'player'
        print(' Do you want to play again (yes or no)')
        if not input().lower().startswith('y'):
            break

if __name__ == '__main__':
main()`
python python-3.x tic-tac-toe
© www.soinside.com 2019 - 2024. All rights reserved.