问题描述
我正在尝试使用极小极大算法来寻找游戏的最佳动作。 游戏是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 (将#修改为@)