首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >Minimax连接4AI故障

Minimax连接4AI故障
EN

Stack Overflow用户
提问于 2015-07-21 01:30:15
回答 2查看 937关注 0票数 0

我正在做连接4AI,除非游戏继续,直到所有42个空间被填补。

每连续4分就能得到1分。

代码语言:javascript
复制
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点。主函数调用Min_Value函数,以10的深度开始工作。

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

EN

回答 2

Stack Overflow用户

回答已采纳

发布于 2015-07-22 19:25:25

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

你有这个:

代码语言:javascript
复制
[...]if(myDepth != -1)
{/*restofthecode*/}[...]

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

代码语言:javascript
复制
[...]if(myDepth == -1)
{
return temp.getHeuristic();
}
/*restofthecode*/
[...]

这样,每当您到达深度-1 (在您的极大极小树中的一片叶子),将评估板和返回值(这是您在极小极大地需要)。

做这两个部分(最小和最大)的修改,一切都会正常。如果有其他问题,可以随便问。

票数 1
EN

Stack Overflow用户

发布于 2015-07-21 10:00:00

尽管问题中没有提到这一点,但我认为你并没有从你的搜索中得到好的进展,对吗?

不看你的时间代码,我已经可以说,你的程序只能在游戏的最后10个动作(最后10个空域或在10中被迫获胜)工作。否则,您的程序将返回其评估的最后一步或第一步。这是因为您的评估函数,您只处理一个win (分别是4行),而不是2行,陷阱,3行,等等)。如果它不能迫使一场胜利,它会认为所有的动作都是平等的。

这是一个问题,因为从一个空场开始,一场胜利只能由先发球员强制进行,并且只有最后一局才会被放在板子上。(在您的第4版中是强制的)。

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

如果算法的其余部分被正确实现,您可以通过简单地改进您的评估函数来修复这个问题,这样它就可以在“好”和“坏”游戏位置之间有所区别。

票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/31528913

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档