minimax 算法在两人回合制游戏中不起作用

问题描述

我正在尝试使用极小极大算法来寻找游戏的最佳动作。 游戏是2名玩家轮流从一堆[0,1,2,8]中挑选一个数字

获胜条件:如果玩家包含三个数字并且它们的总和为14,则玩家获胜。

初始游戏状态由如下参数给出:

4 1 2 3 4

一个数字表示总长度,后面的数字是玩家每回合拿走的数字。在这个例子中,玩家 A 有 [1,3],玩家 B 有 [2,4]

我的问题是算法无法给出正确答案: 就像当输入为 4 4 1 7 8 时,我的程序无法给出正确的移动:下一步需要 0 而不是 3

import sys
import math

totalMoves = int(sys.argv[1])

pile = [0,3,4,5,6,7,8]
# who are u
you = []
opponent = []
# cards in hand
playerA = []
playerB = []

# get all the cards into hand
for i in range(totalMoves):

    # save card into playerB
    if i % 2 != 0:
        playerB.append(int(sys.argv[i+2]))

    # save card into playerA
    if i % 2 == 0:
        playerA.append(int(sys.argv[i+2]))

    # remove sent card in list
    pile.remove(int(sys.argv[i+2]))


# identify which player you are
if totalMoves % 2 == 0:
    you = playerA
    opponent = playerB
else:
    you = playerB
    opponent = playerA


def find3Numbers(player):  # calcluate the card in hand is equal to 14
    arr_size = len(player)
    if (len(player) >= 3):
        for i in range(0,arr_size-2):
            for j in range(i + 1,arr_size-1):
                for k in range(j + 1,arr_size):
                    if (player[i] + player[j] + player[k] == 14):
                        return True
    else:
        return False


def isNumberLeft(board):
    if (len(board) == 0):
        return False
    else:
        return True


def evaluate(player,oppo):
    if (find3Numbers(player) == True):
        return 10
    elif (find3Numbers(oppo) == True):
        return -10
    else:
        return 0


def minimax(board,player,oppo,depth,isMax):
    score = evaluate(player,oppo)
    if (score == 10):
        return score
    if (score == -10):
        return score
    if (isNumberLeft(board) == False):
        return 0
    if (isMax):
        best = -math.inf
        for card in board:
            player.append(card)
            board.remove(card)
            best = max(best,minimax(board,depth+1,not isMax))
            board.append(card)
            player.remove(card)
        return best
    else:
        best = +math.inf
        for card in board:
            oppo.append(card)
            board.remove(card)
            best = min(best,not isMax))
            board.append(card)
            oppo.remove(card)
        return best


def bestMove():
    bestscore = -math. inf
    bestNum = -math.inf
    for card in pile:
        you.append(card)
        pile.remove(card)
        score = minimax(pile,you,opponent,False)

        pile.append(card)
        you.remove(card)
        if (bestscore < score):
            bestNum = card
            bestscore = score

    return bestNum


you.append(bestMove())

解决方法

暂无找到可以解决该程序问题的有效方法,小编努力寻找整理中!

如果你已经找到好的解决方法,欢迎将解决方案带上本链接一起发送给小编。

小编邮箱:dio#foxmail.com (将#修改为@)