我一直在試圖實現一個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