3

Minimax algorithm現在、 forを実装しようとしていTic Tac Toeます。現在のバージョンでは、コンピューターが失敗する場合がいくつかありますが、その理由はよくわかりません。たとえば、私が (人間のプレイヤーとして) 左上隅の x で開始すると、コンピューターは左下隅の ao で反応します (もちろん、これは彼が負けることと同じです)。プログラム全体はMVC-Design.

質問: Minimax アルゴリズムを正しく修正しましたか? または (そうでない場合) 「悪い」動きの原因は何ですか?

コードは次のとおりです: (正しいことをテストしたいくつかのメソッドのコードは省略しました)

 package tictactoe;

    import java.util.*;

    public class AIMinimax {

        Game game;
        Cell[][] cell = new Cell[3][3];
        int[] bestMove;
        public AIMinimax(Game game) {
              this.game=game;
              for(int i=0;i<3;i++)
              {
                  for(int j=0;j<3;j++)
                  {
                      cell[i][j]=game.getCell(i,j);
                  }
              }
           }

        //Calculates the best move.
        private int minimax(Cell player)
        {
            //Computer tries to maximize the bestscore, Player tries to minimize the bestscore.

            int bestScore = 0;
            if(player==Cell.CIRCLE) bestScore=-1; 
            if(player==Cell.CROSS) bestScore=+1;


            int currentScore;
            List<int[]> moves = identifyMoves();
            if(moves.isEmpty() || hasWon(Cell.CROSS) || hasWon(Cell.CIRCLE))
            {
                //System.out.println(hasWon(Cell.CROSS));
                //System.out.println(hasWon(Cell.CIRCLE));
                //System.out.println(moves.isEmpty());
                currentScore=evaluate();
                bestScore=currentScore;
            }
            else
            {
                for (int[] move : moves) {
                    if (player==Cell.CIRCLE)
                    {
                        cell[move[0]][move[1]]=Cell.CIRCLE;
                        currentScore=minimax(Cell.CROSS);
                        if(currentScore>bestScore)
                {
                    bestScore=currentScore;
                    bestMove = move;
                }
            }
            else if(player==Cell.CROSS)
            {
                cell[move[0]][move[1]]=Cell.CROSS;
                currentScore=minimax(Cell.CIRCLE);


                if(currentScore<bestScore  )
                {

                    bestScore=currentScore;
                    bestMove=move;
                }
            }   

            cell[move[0]][move[1]]=Cell.EMPTY;
            if((player==Cell.CIRCLE&&bestScore==1)||(player==Cell.CROSS&&bestScore==-1))
            {
                return bestScore;
            }
        }
        }
                System.out.println(bestScore);
        return bestScore;
        }



    //Compute all possible next moves.
    //@return List of int[2] arrays where int[0] indicates the column and int [1] indicates the row.
    private List<int[]> identifyMoves(){}


    //Evaluates the current board. 
    // -1 if the player wins, +1 if the computer wins, 0 for a draw
    //No other values needed as the depth of the minimax algorithm is maximal.


    private int evaluate() {
        int result=0;
        if(hasWon(Cell.CIRCLE)) result=1;
        if(hasWon(Cell.CROSS)) result=-1;

        return result;
    }
    //return true if the player has won and false if the other player won or there is
    // a draw.


    public boolean hasWon(Cell player){}

    //Returns the next move for the computer as a int[2] where int[0] indicates the column and 
    //int[1] indicates the row.
    public int[] nextMove(Cell player)
    {
        int minimaxResult= minimax(player);

        return bestMove

    }


}

    package tictactoe;


    public enum Cell {

        EMPTY,
        CROSS,
        CIRCLE;

    }

ゲーム クラスは、Cell[][] 配列内のフィールドを表し (AIMinimax と同じ方法)、AIMinimax のインスタンスを作成し、これに対して nextMove を呼び出して、コンピューターが行う次の Move を生成します。デフォルトでは、Human Player が常に開始されます。

前もって感謝します!

4

0 に答える 0