用minmax算法的Java tictactoe问题

我想为tictactoe实现MinMax算法。 我有两个方法min()和max()和一个评估方法,但它不起作用。 例如,当我打电话

max(9);
Field[bestCol][bestRow]='O';
min(8);
Field[bestCol][bestRow]='X';     

在主要功能的结果是

OX-                                  
---
---

但是对于玩家'X'来说,最好的举动是把'X'放在中间。

这里是我的代码没有评估方法:

static char[][] Field = { { '-', '-', '-' },
                          { '-', '-', '-' },
                          { '-', '-', '-' } };

static char Player = 'O';
static char Computer = 'X';

static int Depth =9; // searchdepth
static int bestRow=0, bestCol=0; // best Move

public static int max(int depth) {
    if (depth == 0) {
        return evaluateMove();
    }

    int maxValue = Integer.MIN_VALUE;
    for (int i = 0; i < 3; i++) {
        for (int j = 0; j < 3; j++) {
            if (Field[i][j] == '-') {
                Field[i][j] = Computer;

                int value = min(depth - 1);
                Field[i][j] ='-';

                if (value > maxValue) {
                    maxValue = value;
                    if (depth == Depth) {
                        bestCol=i;
                        bestRow=j;
                    }
                }
            }
        }
    }
    return maxValue;
}

public static int min(int depth) {
    int minValue = Integer.MAX_VALUE;

    if (depth == 0) {
        return evaluateMove();
    }
    for (int i = 0; i < 3; i++) {
        for (int j = 0; j < 3; j++) {
            if (Field[i][j] == '-') {
                Field[i][j] = Player;
                int value = max(depth - 1);
                Field[i][j] = '-';

                if (value < minValue) {
                    minValue = value;
                    bestCol=i;
                    bestRow=j;
                }
            }
        }
    }
    return minValue;
}

最好的祝福

编辑:

感谢您的回答。 第一点我忘记把'*'改为' - '这是我的评估方法:

public static int evaluateMove() {
    for(int i=0; i<3; i++) {
        int countX=0; int countY=0;
        for(int j=0; j<3; j++) {
            if(Feld[i][j]==Computer) countX++;
            if(Feld[i][j]==Player) countY++;
        }
        if(countX==3) return 10;
        if(countY==3) return -10;
    }

    for(int j=0; j<3; j++) { // Spalten
        int countX=0; int countY=0;
        for(int i=0; i<3; i++) {
            if(Feld[i][j]==Computer) countX++;
            if(Feld[i][j]==Player) countY++;
            if(countX==3) return 10;
            if(countY==3) return -10;
        }
    }
    return 0; // Unentschieden
}

有些事情让我感到震惊:

  • 你正在用' - '初始化比赛场地的空方块,但在最小/最大值函数中,你假设'*'是一个空方块
  • 在min函数中,与max函数相反,您在每个级别设置最佳移动而不是顶级,所以更深层次将覆盖顶级的最佳结果(所以我认为您还应该检查深度==深度)
  • 我不知道你在做什么,但是在每次移动后也应该减少“深度”,因为这定义了最高级别(因此应该指定最佳移动的级别),根据你的问题,减少每次通话期间的“深度”说法
  • 我想你知道只有在游戏结束时才会得到最佳效果(这是每次移动后递减深度和深度的另一个参数)
  • 您没有在您的evaluateMove函数中检查对角线
  • 在evaluateMove的第二个双循环中,检查最内层循环中countX,countY的条件(工作原理,但与第一个double循环不同的是,它不同于第一个double循环=>不太适合查找错误)
  • 编辑:最后(鼓卷...):

  • 在第一步中,您最大化增益(对于计算机移动('X')),但实际执行球员移动('O')。 第二步反之亦然。 然而,你必须在第一步移动中获得最小的收益(这意味着玩家获胜),并在第二步中获得最大化。
  • 也就是说,你实际上做了什么:

        public static void ComputeAndExecuteBestMove()
        {
            // since Player begins, we minimize the gain value for the first move
            if ((MaxDepth-Depth) % 2 == 0) 
            {
                max(Depth);
                Field[bestCol,bestRow] = Player;
            }
            else 
            {
                min(Depth);
                Field[bestCol,bestRow] = Computer;
            }
    
            // next move
            Depth--;
        }
    

    但你应该做什么:

        public static void ComputeAndExecuteBestMove()
        {
            // since Player begins, we minimize the gain value for the first move
            if ((MaxDepth-Depth) % 2 == 0) 
            {
                min(Depth);
                Field[bestCol,bestRow] = Player;
            }
            else 
            {
                max(Depth);
                Field[bestCol,bestRow] = Computer;
            }
    
            // next move
            Depth--;
        }
    
    链接地址: http://www.djcxy.com/p/56389.html

    上一篇: Java tictactoe problems with minmax algorithm

    下一篇: Java Connect 4 MinMax Algorithm