0

単純なゲームのために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ターン取得することを意味します。あなたの目的は、対戦相手よりも多くのポイントを獲得することです。

4

2 に答える 2

0

ゲームのルールがよくわからないと思いますが、端末の状態がよくないようです。

プレイヤー間のスコアの差を返しています。これは、1 人のプレーヤーがこの値を最大化したい (対戦相手との最大の差) ことを意味し、もう 1 人のプレーヤーはこれを最小限に抑えたい (対戦相手として可能な限り近いスコアを取得しようとする) ことを意味します。これは、実際のゲームが目標とするものとはまったく異なります。

あなたが望むのは、最高得点のプレイヤーが勝つことだと思います。したがって、myScore>oppScore をチェックして、それに応じて 1,0 と -1 を返すことができます。これは、最初のプレイヤーがリターンを最大化しようとする (つまり、1 にしようとする - 彼が勝つ) ことを意味し、対戦相手はリターンを最小化しようとします (つまり、-1 の場合に勝ちます)。勝利に失敗した場合、彼らはむしろ 0 (引き分け) を目指します。

また、なぜprevMove次の動きを生成する必要があるのですか? boardゲームの現在の状態に関するすべての情報 (つまり、残っているコイン) を持っていませんか?

于 2011-03-15T09:15:49.430 に答える
0

間違いが 1 つだけありました。与えられたボードの状態に対してどのターンを選択したかを覚えていないため、何度も計算し、アルゴリズムが遅くなります。または速度はあなたの問題ではありませんか?

于 2011-03-15T08:56:05.517 に答える