Minimax Connect 4 AI麻烦

时间:2015-07-21 01:30:16

标签: java artificial-intelligence minimax

我正在制作连接4 AI,除了游戏一直持续到所有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函数调用Min_Value函数以10的深度启动。

我试图返回列以及启发式的值。我希望我提供了足够的信息。感谢您的任何见解。

2 个答案:

答案 0 :(得分:1)

即使在问题中没有说明,我认为你的搜索没有得到好的结果,对吗?

如果不查看你的代码,我已经可以说你的程序只能在游戏的最后10个动作中运行(最后10个空白区域或10个强制胜利)。否则,您的程序将返回它评估的最后一次或第一次移动。这是因为你的评价函数,你只处理一个胜利(分别连续4个),但不是连续2个,陷阱,连续3个等等。如果不能取得胜利,它会认为所有动作都是平等的。

这是一个问题,因为从一个空场开始,胜利只能由首发球员强制进行,并且只有第二个最后一块被放置在棋盘上。 (在您的第4版中强制执行)。

由于你的searchdepth(10)小于最大游戏动作(42),你的程序将始终发挥其第一步。

如果您的算法的其余部分已正确实施,您可以通过简单地改进您的评估功能来解决这个问题,以便它可以在&#34; good&#34;之间有所不同。并且&#34;坏&#34;比赛位置。

答案 1 :(得分:1)

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

你有这个:

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

但你需要的是这样的:

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

这样,无论何时达到深度-1(最小极大树中的叶子),都会评估电路板并返回值(这正是你在minimax中所需要的)。

在两个部分(最小和最大)进行此修改,并且所有内容都是正确的。如果还有其他问题,请随时提出。