我正在做连接4AI,除非游戏继续,直到所有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点。主函数调用Min_Value函数,以10的深度开始工作。
我试图返回该列以及启发式的值。我希望我已经提供了足够的信息。谢谢你的见解。
发布于 2015-07-22 19:25:25
好的,在实现了未显示的方法之后(如评估、播放、删除等)我能调试这个。假设这些函数是以某种正确的方式在您的版本中实现的,错误是如果深度为-1,则您从未真正调用评估函数:
你有这个:
[...]if(myDepth != -1)
{/*restofthecode*/}[...]但你需要的是这样的东西:
[...]if(myDepth == -1)
{
return temp.getHeuristic();
}
/*restofthecode*/
[...]这样,每当您到达深度-1 (在您的极大极小树中的一片叶子),将评估板和返回值(这是您在极小极大地需要)。
做这两个部分(最小和最大)的修改,一切都会正常。如果有其他问题,可以随便问。
发布于 2015-07-21 10:00:00
尽管问题中没有提到这一点,但我认为你并没有从你的搜索中得到好的进展,对吗?
不看你的时间代码,我已经可以说,你的程序只能在游戏的最后10个动作(最后10个空域或在10中被迫获胜)工作。否则,您的程序将返回其评估的最后一步或第一步。这是因为您的评估函数,您只处理一个win (分别是4行),而不是2行,陷阱,3行,等等)。如果它不能迫使一场胜利,它会认为所有的动作都是平等的。
这是一个问题,因为从一个空场开始,一场胜利只能由先发球员强制进行,并且只有最后一局才会被放在板子上。(在您的第4版中是强制的)。
由于你的搜索深度(10)比最大的游戏移动(42)小,你的程序将始终执行它的第一步。
如果算法的其余部分被正确实现,您可以通过简单地改进您的评估函数来修复这个问题,这样它就可以在“好”和“坏”游戏位置之间有所区别。
https://stackoverflow.com/questions/31528913
复制相似问题