我想用minimax算法实现PacMan游戏,但我不能理解算法的含义。我写了这段代码
public MOVE miniMax(Game game,Node[] nodes,int depth,Boolean pacMan){
int value;
MOVE thisMove;
int bestValue;
int score=0;
EnumMap<MOVE, MOVE[]> possibleMoves = nodes[game.getPacmanCurrentNodeIndex()].allPossibleMoves;
MOVE[] moves = possibleMoves.get(MOVE.NEUTRAL);
if(depth == 0)
score = evaluationFunction(game);
if(pacMan){
bestValue = -INF;
for(int i=0;i<moves.length;i++){
game.copy();
game.updatePacMan(moves[i]);
thisMove= miniMax(game,nodes,depth-1,Boolean.FALSE);
//bestValue = Math.max(bestValue, value);
}
return thisMove;
}else{
bestValue = INF;
for(int i=0;i<moves.length;i++){
game.copy();
game.updatePacMan(moves[i]);
thisMove= miniMax(game,nodes,depth-1,Boolean.TRUE);
//bestValue = Math.min(bestValue, value);
}
//return bestValue;
return thisMove;
}
}
public int evaluationFunction(Game game){
return 0;
}
我已经考虑了维基百科的伪代码编写了这段代码,但我遇到了一个问题 我不知道如何将评估函数计算为整数,然后决定返回一个移动,我应该只返回一个移动。并且评估函数是计算一次移动还是在节点的所有可能移动之间选择一个?
答案 0 :(得分:0)
首先,minimax适用于转向国际象棋等游戏。很容易以离散的增量分解连续游戏(例如pacman)并应用这个算法,但你会发现你试图达到两个对抗目标之间的平衡并且可能既不满足:
不过,这只是一个有趣的问题,只是为了看到结果。
评估函数是一种启发式函数,它试图估计当前电路板状态的强度,其中给定播放器的分数越大越好。这将是一个相当大的挑战,因为没有明显的方法来估计pacman中一个位置的强度,但这里有一些想法:
这当然是从pacman的角度出发的。对于鬼魂来说,这是另一种方式。微调这些特征的各自权重是成功实现极小极大的难点之一。
顺便说一句,直接进行alpha-beta修剪或否定(有点棘手),它会在性能方面造成一个不同的世界,而不会降低评估质量。