Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/326.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
数值Tic-Tac-Toe错误的Java-Minimax算法_Java_Algorithm_Libgdx_Minimax - Fatal编程技术网

数值Tic-Tac-Toe错误的Java-Minimax算法

数值Tic-Tac-Toe错误的Java-Minimax算法,java,algorithm,libgdx,minimax,Java,Algorithm,Libgdx,Minimax,我有一个算法的问题,我试图实现作为大学作业。我正在制作数字版的tic-tac-toe。我的讲师给了我们班他版本的极小极大算法,用于标准的tic-tac-toe游戏,我们现在必须为数字tic-tac-toe实现它。他的标准实施如下: public class MinimaxPlayer extends BasePlayer { private Random randomGenerator; public MinimaxPlayer(Board board, int symbol) {

我有一个算法的问题,我试图实现作为大学作业。我正在制作数字版的tic-tac-toe。我的讲师给了我们班他版本的极小极大算法,用于标准的tic-tac-toe游戏,我们现在必须为数字tic-tac-toe实现它。他的标准实施如下:

public class MinimaxPlayer extends BasePlayer {

private Random randomGenerator;

public MinimaxPlayer(Board board, int symbol) {
    super(board, symbol);
    name = "MinimaxPlayer";

    skill = 5;  // skill is measure of search depth

    randomGenerator = new Random();
}

@Override
public int move () {
    return (int) minimax(mySymbol, opponentSymbol, 0);
}

private float minimax(int p_mySymbol, int p_opponentSymbol, int depth) {

    final float WIN_SCORE = 100;        
    final float DRAW_SCORE = 0;

    float score;
    float maxScore = -10000;
    int maxPos = -1;

    // for each board position
    for (int r=0; r<3; ++r) {
        for (int c=0; c<3; ++c) {

            // skip over used positions
            if (board.cells[r][c]!=board.EMPTY) continue;

            String indent = new String(new char[depth]).replace("\0", "  ");
            //Gdx.app.log(indent, "search ("+r+","+c+")");

            // place move 
            board.cells[r][c] = p_mySymbol;

            // evaluate board (recursively)
            if (board.hasWon(p_mySymbol, r, c)) {
                score = WIN_SCORE;
            } else if (board.isDraw()) {
                score = DRAW_SCORE;
            } else {
                if (depth<skill) {
                    score = -minimax(p_opponentSymbol, p_mySymbol, depth+1);
                } else {
                    score = 0;
                }
            }

            // update ranking

            if (Math.abs(score-maxScore)<1.0E-5 && randomGenerator.nextDouble()<0.1) {
                maxScore = score;
                maxPos = 3*r+c;

            } else if (score>maxScore) {    // clear 
                maxScore = score;
                maxPos = 3*r+c;
            } 

            //Gdx.app.log(indent, "Score "+score);

            // undo move 
            board.cells[r][c] = board.EMPTY;

        }
    }

    // on uppermost call return move not score
    return (depth==0? maxPos : maxScore);

};
公共类MinimaxPlayer扩展BasePlayer{
专用随机发生器;
公共MinimaxPlayer(棋盘,整数符号){
超级(板、符号);
name=“MinimaxPlayer”;
skill=5;//skill是搜索深度的度量
随机生成器=新随机();
}
@凌驾
公共整数移动(){
返回(int)极小极大值(mySymbol,opponentSymbol,0);
}
私有浮点极小极大值(int p_mySymbol,int p_opponentSymbol,int depth){
最终浮点数赢分数=100;
最终浮点数=0;
浮点数;
浮点最大分数=-10000;
int maxPos=-1;
//每个董事会职位

对于(int r=0;rWhere在if中定义为空(board.cells[r][c]!=board.EMPTY)continue;?@Floam EMPTY是在给MinimaxPlayer构造函数的board类中定义的。EMPTY只是一个值为0的最终int。这表示棋盘上有一个空格,因此如果该空格不为空,那么检查它就没有意义了,所以我们“继续”并跳过该空格。你能发布BasePlayer的内容吗?我很好奇如果它与:if(深度)有关,那么在if(board.cells[r][c]!=board.EMPTY)中定义空是什么continue;?@Floam EMPTY是在给MinimaxPlayer构造函数的board类中定义的。EMPTY只是一个值为0的最终int。这表示棋盘上有一个空格,因此如果该空格不为空,那么检查它就没有意义了,所以我们“继续”并跳过该空格。你能发布BasePlayer的内容吗?我很好奇如果它与:if(深度)有关,则为ing
public class MinimaxPlayer extends BasePlayer {

private Random randomGenerator;
//change constructor to take skill levels for depth search.
public MinimaxPlayer(Board board, Symbol symbol,int depth) {
    super(board, symbol);
    name = "MinimaxPlayer";

    // skill is measure of search depth
    skill = depth;

    randomGenerator = new Random();
}

@Override
public int move () {
    return  (int) minimax(board.currentPlayer.numbers, board.currentPlayer.opponent.numbers, 0);
}

private float minimax(List<Integer> myNumbers, List<Integer> opponentNumbers, int depth) {

    final float WIN_SCORE = 100;        
    final float DRAW_SCORE = 0;

    float score;
    float maxScore = -10000;
    int maxPos = -1;

    // for each board position
    for (int r=0; r<3; ++r) {
        for (int c=0; c<3; ++c) {
            for(Integer number : myNumbers){
                // skip over used positions
                if (board.cells[r][c]!=board.EMPTY) continue;

                // place move 
                board.cells[r][c] = number;
                System.out.println("Number placed :" + number);


                // evaluate board (recursively)
                if (board.hasWon(number, r, c)) {
                    score = WIN_SCORE;
                    System.out.println("This move has won with score: "+ score);
                } else if (board.isDraw()) {
                    score = DRAW_SCORE;
                    System.out.println("this move is a draw and score is: " + score);
                } else {
                    System.out.println("Depth is now: " + depth);
                    if (depth<skill) {
                        score = -minimax(opponentNumbers, myNumbers, depth+1);
                    } else {
                        score = 0;
                    }
                }

                System.out.println("Made it to update rankings");
                // update ranking
                if (Math.abs(score-maxScore)<1.0E-5 && randomGenerator.nextDouble()<0.1) {
                    currentNumber = number;
                    maxScore = score;
                    maxPos = 3*r+c;

                } else if (score>maxScore) {    // clear 
                    currentNumber = number;
                    maxScore = score;
                    maxPos = 3*r+c;
                } 

                //Gdx.app.log(indent, "Score "+score);
                System.out.println("Undone move");
                // undo move 
                board.cells[r][c] = board.EMPTY;
            }

        }
    }
    System.out.println("Depth:" + depth);
    System.out.println("MaxScore:" + maxScore);
    System.out.println("MaxPosition: "+ maxPos);
    // on uppermost call return move not score
    return (depth==0 ? maxPos : maxScore);

};