繁体   English   中英

MiniMax递归算法(Python)

[英]MiniMax Recursive Algorithm (Python)

我很新,所以如果在此处发布时出错,我深表歉意。我进行了搜索,但没有提出很多对我有帮助的建议。 我正在为Tic Tac Toe的变体编写miniMax算法。 这种变化允许玩家将X或O放置在棋盘上的任何位置。 我在递归方面遇到麻烦,希望可以得到一些指导。

class TicTacToeBoard:

def __init__(self, initGameBoard):
    #initGameBoard is a string
    self.board = initGameBoard

def getEmptySpaces(self):
    return self.board.count("-")

def markX(self, index):
    self.board = self.board[:index] + "x" + self.board[index+1:]

def markO(self, index):
    self.board = self.board[:index] + "o" + self.board[index+1:]

def endGame(self):
    #determines if someone has won 
    endGameStates = [[0,1,2],[3,4,5],[6,7,8],[0,3,6],[1,4,7],[2,5,8],[0,4,8],[2,4,6]]
    for x in range(len(endGameStates)):
        trySlice = self.board[endGameStates[x][0]] + self.board[endGameStates[x][1]] + \
                   self.board[endGameStates[x][2]]
        if trySlice[0] == trySlice[1] == trySlice[2] and "-" not in trySlice:
            return True
    return False

def draw(self):
    #determines if there has been a draw 
    if "-" not in self.board:
        endGameStates = [[0,1,2],[3,4,5],[6,7,8],[0,3,6],[1,4,7],[2,5,8],[0,4,8],[2,4,6]]
        for x in range(len(endGameStates)):
            trySlice = self.board[endGameStates[x][0]] + self.board[endGameStates[x][1]] + \
                       self.board[endGameStates[x][2]]
            if trySlice[0] == trySlice[1] == trySlice[2] and "-" not in trySlice:
                return False
        return True
    else:
        return False

def __str__(self):
    boardStr = ""
    for char in self.board:
        boardStr += char
    return boardStr

以上是我的董事会课程。 我只是在使用字符串,没有做任何花哨的事情。 我还使用了一个非常简单的Node类,它仅存储数据(尽管我想我也可以只使用字符串...)

from tic_tac_toe_board import TicTacToeBoard      
from node import Node

nodeQueue = []

def fitnessFunction(gameBoard):
    #only runs if end game or if all full
    if gameBoard.draw():
        return 0
    else:
        emptySpaces = gameBoard.getEmptySpaces()
        if emptySpaces %2 == 0:
            #max won
            return (emptySpaces + 1) *1
        else:
            #max lost
            return (emptySpaces + 1) *-1

def miniMax(gameBoard):
    if gameBoard.endGame() or if "-" not in gameBoard:
        #end game checks for winner, second clause checks for full/draw
        return fitnessFunction(gameBoard)
    else:
        emptyIndexes = [] #keeps track of which indexes are empty
        count = 0
        for char in gameBoard:
            if char == "-":
                emptyIndexes.append(count)
            count +=1             
        if len(emptyIndexes) %2 != 0:
            #max's turn
            for index in emptyIndexes:
                childNode = Node(gameBoard.markX(index))
                nodeQueue.append(childNode)
                childNode = Node(gameBoard.markO(index))
                nodeQueue.append(childNode)
        return miniMax() 

FitnessFunction根据剩余的空格数返回分数。 我的递归miniMax方法遇到问题。 我需要做的是检查基本情况(无论是球员获胜还是平局),如果这些基本情况不正确,我将根据剩余空白数确定其移动方向。 我想我已经走了那么远,但是我不知道下一步该怎么做(递归部分)。 我还需要能够获得最小或最大孩子数,具体取决于轮到谁。 我想我对递归感到迷茫。 我是CS的新手,对它的接触不多。 任何提示将不胜感激! :)

如果您正在寻找mini-max算法,则不需要在其上应用示例。 大多数游戏都需要mini-max算法。

因此,如果您想要一个,请决定它的行为方式。 然后为该行为的至少一个示例编写一个测试。

发布测试。 (不是游戏,而只是对游戏产生的数据的测试。)

如果您的算法不起作用,则您的游戏程序将不起作用。

提示:最小-最大算法仅取决于对游戏路径的评估,而不取决于所玩的游戏。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM