我一直在试图实现一个minMax算法(稍后将尝试alphabeta修剪)为一个简单的游戏....我见过很多伪代码和教程,但我无法得到它工作...帮助我的MinMax实现
一点点帮助将不胜感激:)
下面是相关的类...(为清楚起见移除实现)
class Board { //Stores board state, Immutable
Board playMove(Move m); //generates new Board after playing "Move m"
List<Move> nextMoves(Move m); // generates all possible moves, previous move is required to decide the validity of the next moves
boolean isTerminal(); //board at terminal state?
}
class Move { //stores positions played and score gained from that move
}
,这里是我的最小 - 最大的实现...有人可以指出我做错了什么吗?谢谢。
private Move bestMove = null; // field variable
private int maxMove(Board board, Move prevMove, int myScore, int oppnScore) {
out("maxMove " + board);
if(board.isTerminal()) {
return myScore - oppnScore;
}
int mx = Integer.MIN_VALUE;
for(Move nxtMove: board.nextMoves(prevMove)) {
int k = minMove(board.playMove(nxtMove),
nxtMove,
myScore + nxtMove.score,
oppnScore);
if(k > mx) {
mx = k;
bestMove = nxtMove;
}
}
return mx;
}
private int minMove(Board board, Move prevMove, int myScore, int oppnScore) {
if(board.isTerminal()) {
return myScore - oppnScore;
}
out("minMove " + board);
int mn = Integer.MAX_VALUE;
for(Move nxtMove: board.nextMoves(prevMove)) {
int k = maxMove(board.playMove(nxtMove),
nxtMove,
myScore,
oppnScore + nxtMove.score);
if(k < mn) {
mn = k;
bestMove = nxtMove;
}
}
return mn;
}
编辑:游戏简要说明如下,你有一定数量的硬币的不同教派面前的硬币。你和另一位玩家轮流从消费者一侧(左侧或右侧)取出一枚硬币。硬币的面额表示你为这一举动得分。某些硬币有特殊的含义,比如说Picking X意味着你会跳过一个转弯,或者Y意味着你会再转一圈。你的目标是比对手得分更多。
也许告诉我们一些关于游戏规则的信息会有所帮助。 – MAK 2011-03-15 08:51:37
@MAK,done ..... – st0le 2011-03-15 08:59:35
游戏的目标是什么?尽可能多地得分?比对手得分更多? – MAK 2011-03-15 09:06:34