有 Java 编程相关的问题?

你可以在下面搜索框中键入要查询的问题!

java Minimax Connect 4 AI故障

我正在制作连接4人工智能,除非游戏继续,直到所有42个空间都被填满
分数保持不变,每4分一行得1分

public int[] Max_Value(GameBoard playBoard, int depth){
    GameBoard temp = new GameBoard(playBoard.playBoard);
    int h = 0, tempH = 999, tempCol=0;
    int myDepth = depth - 1;
    int[] tempH2 = new int[2];
    boolean noChildren = true;
    if(myDepth != -1){
        for(int i = 0; i < 7; i++){
            if(temp.isValidPlay(i)){
                count++;
                temp.playPiece(i);
                noChildren = false;
                tempH2 = Min_Value(temp, myDepth);
                if(tempH2[1] < tempH){
                    tempH=tempH2[1];
                    tempCol = i;
                }
                temp.removePiece(i);
            }
        }
    }   
    int[] x = new int[2];
    if(noChildren){
        h = temp.getHeuristic();
    }
    else{
        h = tempH;
        x[0]=tempCol;
    }
    x[1]=h;
    return x; 
}

public int[] Min_Value(GameBoard playBoard, int depth){
    GameBoard temp = new GameBoard(playBoard.playBoard);
    int h = 0, tempH = -999, tempCol=0;
    int myDepth = depth - 1;
    int[] tempH2 = new int[2];
    boolean noChildren = true;
    if(myDepth != -1){
        for(int i = 0; i < 7; i++){
            if(temp.isValidPlay(i)){
                count++;
                temp.playPiece(i);
                noChildren = false;
                tempH2 = Max_Value(temp, myDepth);
                if(tempH2[1] > tempH){
                    tempH=tempH2[1];
                    tempCol = i;
                }
                temp.removePiece(i);
            }
        }
    }   
    int[] x = new int[2];
    if(noChildren){
        h = temp.getHeuristic();
    }
    else{
        h = tempH;
        x[0]=tempCol;
    }
    x[1]=h;
    return x; 
}

我觉得我只是跌跌撞撞地完成了所有的事情,感觉就像是糟糕的代码。然而,我以前从未尝试过类似的事情,希望您能提供任何意见。我不知道我哪里出了问题。我的求值函数对于任何给定的状态,一行中的每4个只给出1分。main函数调用minu Value函数以10为深度开始

我试图返回列以及启发式的值。我希望我已经提供了足够的信息。谢谢你的洞察力


共 (2) 个答案

  1. # 1 楼答案

    尽管问题中没有说明,但我认为你的搜索并没有带来好的进展,对吧

    不用看while代码,我已经可以说你的程序只会在游戏的最后10步(最后10个空位或10次强制获胜)中运行。否则,程序将返回其计算的最后一步或第一步。这是因为你的评估功能,你只处理一场胜利(分别是4场胜利),而不是2场胜利、陷阱、3场胜利等等。如果它不能强制获胜,它会认为所有的动作都是平等的

    这是一个问题,因为从一个空场开始,只有先发球员才能获胜,而且只有最后一个棋子放在棋盘上。(在你的版本4中,连续强制)

    由于你的搜索深度(10)小于游戏的最大移动量(42),你的程序将始终执行第一步

    如果你的算法的其余部分得到了正确的实现,你可以通过简单地改进你的评估函数来解决这个问题,这样它就可以区分“好”和“坏”的游戏位置

  2. # 2 楼答案

    好吧,在实现了未显示的方法(如评估、playmove、移除等)之后,我能够调试这个。假设这些函数在您的版本中以某种正确的方式实现,错误在于,如果深度为-1,您实际上从未调用求值函数:

    你有这个:

    [...]if(myDepth != -1)
    {/*restofthecode*/}[...]
    

    但你需要的是这样的东西:

    [...]if(myDepth == -1)
    {
    return temp.getHeuristic();
    }
    /*restofthecode*/
    [...]
    

    这样一来,每当你达到深度-1(你的极大极小树中的一片叶子),电路板就会被评估并返回值(这正是你在极大极小中所需要的)

    在这两个部分(最小值和最大值)进行修改,一切都会正常。如果还有其他问题,请随时询问