如何解决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 举报,一经查实,本站将立刻删除。