単純なゲームのために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
}
そして、これが私のMin-Max実装です...誰かが私が間違っていることを指摘できますか?ありがとうございました。
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;
}
編集:ゲームの簡単な説明は次のとおりです、あなたはあなたの前に異なる金種のコインの特定の数を持っています。あなたと他のプレイヤーが交代で、どちらかの側(左または右)から1枚のコインを取り除きます。コインの額面は、その動きで獲得したポイントを示します。特定のコインには特別な意味があります。たとえば、Xを選択すると、1ターンスキップすることを意味し、Yを選択すると、もう1ターン取得することを意味します。あなたの目的は、対戦相手よりも多くのポイントを獲得することです。