我正在制作连接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的深度启动。
我试图返回列以及启发式的值。我希望我提供了足够的信息。感谢您的任何见解。
答案 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中所需要的)。
在两个部分(最小和最大)进行此修改,并且所有内容都是正确的。如果还有其他问题,请随时提出。