Java 陷入无限循环的极小极大算法

Java 陷入无限循环的极小极大算法,java,minimax,alpha-beta-pruning,Java,Minimax,Alpha Beta Pruning,所以我在这个问题上绞尽脑汁已经有一段时间了。我正在尝试实现minimax算法来玩一个名为mancala的游戏。据我所知,我的代码应该可以工作,但由于某种原因,当函数递归调用自身时,它会继续计算为0,即使我知道它已达到游戏结束状态并返回一些值。我还知道它的计算结果是0,因为maxval的初始值是0。如果有人能帮我解决这个问题,我会非常感激的 下面是实现的minimax算法。请忽略深度参数和初始状态,在12之前包含数字3且不包括6的电路板调用,maxTurntrue(最大值优先)、move-1、al

所以我在这个问题上绞尽脑汁已经有一段时间了。我正在尝试实现minimax算法来玩一个名为mancala的游戏。据我所知,我的代码应该可以工作,但由于某种原因,当函数递归调用自身时,它会继续计算为0,即使我知道它已达到游戏结束状态并返回一些值。我还知道它的计算结果是0,因为maxval的初始值是0。如果有人能帮我解决这个问题,我会非常感激的

下面是实现的minimax算法。请忽略深度参数和初始状态,在12之前包含数字3且不包括6的电路板调用,
maxTurn
true(最大值优先)、
move-1
alpha-1
beta 37
(可能的最高分数为36)

private int[]miniMax(int[]board,布尔maxTurn,int move,int alpha,int beta,int depth){
int[]newState=newint[board.length];
如果(终局(棋盘)=真){
int[]endReturn=新的int[2];
对于(inti=0;i<6;i++){board[6]+=board[i];}
endReturn[0]=board[6];System.out.println(“结束状态值:+board[6]);
endReturn[1]=移动;
返回端返回;
}
如果(maxTurn==true){
int[]maxEval=新的int[2];
maxEval[0]=-1;
对于(int i=0;i<6;i++){
newState=Arrays.copyOf(board,board.length);
布尔增益=假;
如果(板[i]==0)继续;
int j=新闻状态[i];
newState[i]=0;
int k=i+1;
而(j>0){
如果(k==13)k=0;
新闻状态[k]++;
j--;
k++;
}
如果(k==6)goAgain=true;
如果(k<6&&newState[12-k]>0&&newState[k]==1){
newState[6]=newState[6]+newState[12-k]+1;
newState[12-k]=0;
newState[k]=0;
}
int[]eval=新的int[2];
eval=极大极小值(新状态、目标增益、i、α、β、深度--);
System.out.println(“评估值:+eval[0]);
如果(eval[0]>alpha){
α=评估值[0];
}
System.out.println(“alpha值:“+alpha”);
if(beta-maxEval[0]){
maxEval[0]=eval[0];System.out.println(“给定移动:+i”);
maxEval[1]=i;
}
}//System.out.println(“maxEval给定值:+maxEval[1]);
返回最大值;
}
否则{
int[]minEval=新的int[2];
对于(int i=7;i<13;i++){
newState=Arrays.copyOf(board,board.length);
布尔max=true;
如果(板[i]==0)继续;
int j=newState[i];//System.out.println(“这是j:+j);
newState[i]=0;
int k=i;
而(j>0){
k++;
如果(k==6)k=7;
如果(k==14)k=0;
j--;
新闻状态[k]++;
}
如果(k==13)max=false;
如果(k>6&&k 0&&newState[k]==1){
newState[13]=newState[13]+newState[12-k]+1;
newState[12-k]=0;
新闻状态[k]-;
}
int[]eval=新的int[2];
eval=miniMax(newState,max,i,alpha,beta,depth--);
if(minEval[0]>eval[0]){
minEval[0]=评估[0];
minEval[1]=i;
}
如果(评估[0]如果(测试版),除非有必要,否则请不要编辑帖子。之前的编辑更正了您的格式。这个程序以无限循环结束的输入是什么?您能提供一个最小的、可复制的示例吗?(包括输入数据)我真的没有得到输出(这应该是一个数字,指示move max应该做什么。我确实通过使用print语句发现,当我将eval=to minimax设置为0时,该调用的输出为0。我指定了第一次调用minimax时设置的参数
private int[] miniMax(int[] board, boolean maxTurn, int move, int alpha, int beta, int depth){
   int[] newState = new int[board.length];

   if(endGame(board) == true){
      int[] endReturn = new int[2];
      for(int i = 0; i < 6; i++){ board[6] += board[i];}
      endReturn[0] = board[6];  System.out.println("end state value: " + board[6]);
      endReturn[1] = move;
      return endReturn;
   }
   if(maxTurn == true){
      int[] maxEval = new int[2];
      maxEval[0] = -1;
      for(int i = 0; i < 6; i++){
         newState = Arrays.copyOf(board, board.length);
         boolean goAgain = false;
         if(board[i] == 0) continue;
         int j = newState[i];
         newState[i] = 0;
         int k = i + 1;
         while(j > 0){
            if(k == 13)k = 0;
            newState[k]++;
            j--;
            k++;
         }
         if(k == 6) goAgain = true;

         if(k < 6 && newState[12 - k] > 0 && newState[k] == 1){
            newState[6] = newState[6] + newState[12 - k] + 1;
            newState[12 - k] = 0;
            newState[k] = 0;
         }

         int[] eval = new int[2];
         eval = miniMax(newState, goAgain, i, alpha, beta, depth--);

         System.out.println("eval value: " + eval[0]);
         if(eval[0] > alpha){
            alpha = eval[0];
         }
         System.out.println("alpha value: " + alpha);
         if(beta <= alpha) break;

         if(eval[0] > maxEval[0]){
            maxEval[0] = eval[0];   System.out.println("move given: " + i);
            maxEval[1] = i;
         }

      }   //System.out.println("maxEval given moveValue: " + maxEval[1]);
      return maxEval;

   }
   else{
      int[] minEval = new int[2];
      for(int i = 7; i < 13; i++){
         newState = Arrays.copyOf(board, board.length);
         boolean max = true;
         if(board[i] == 0) continue;
         int  j = newState[i];//  System.out.println("this is j: " + j);
         newState[i] = 0;
         int k = i;
         while(j > 0){
            k++;
            if(k == 6)k = 7;
            if(k == 14)k = 0;
            j--;
            newState[k]++;
         }
         if(k == 13) max = false;

         if(k > 6 && k<13 && newState[12 - k] > 0 && newState[k] == 1){
            newState[13] = newState[13] + newState[12 - k] + 1;
            newState[12 - k] = 0;
            newState[k]--;
         }
         int[] eval = new int[2];
         eval = miniMax(newState, max, i, alpha, beta, depth--);
         if(minEval[0] > eval[0]){
            minEval[0] = eval[0];
            minEval[1] = i;
         }
         if(eval[0] < beta){
            beta = eval[0]; System.out.println("beta: " + beta);
         }
         if(beta <= alpha) break;

      }//System.out.println("maxEval given moveValue: " + maxEval[1]);
      return minEval;
   }
}