递归函数在minimax算法代码中保持无限循环

时间:2017-10-13 01:10:18

标签: javascript algorithm tic-tac-toe minimax

我试图用Javascript编写minimax算法来进行井字游戏项目。这是一个人与电脑游戏。我想找到计算机的最佳移动但我在Chrome控制台上一直收到以下错误:未捕获RangeError:超出最大调用堆栈大小。

我试图以不同的方式解决问题,但我很难调试。

如果有人能提供帮助,我们将不胜感激,谢谢。

以下是我的示例代码:

let board_index = ["X", 1, 2, 3, "O", 5, 6, "X", 8]; // original board with the somes indexies played
let ai = "X";
let hu = "O";

// filter the available boxes in the board
function emptySpot(board) {
  return board.filter(st => st != "O" && st != "X");
}

// winning combinations using the board indexies
function evaluate(board, player) {
   if (
     (board[0] == player && board[1] == player && board[2] == player) ||
     (board[3] == player && board[4] == player && board[5] == player) ||
     (board[6] == player && board[7] == player && board[8] == player) ||
     (board[0] == player && board[3] == player && board[6] == player) ||
     (board[1] == player && board[4] == player && board[7] == player) ||
     (board[2] == player && board[5] == player && board[8] == player) ||
     (board[0] == player && board[4] == player && board[8] == player) ||
     (board[2] == player && board[4] == player && board[6] == player)
     ) 
   {

     if(player == ai) { 
       return 10;
     }
     else 
       if(player == hu) { 
         return -10;
       }
     return 0;
   }
}


// minimax algorithm
function minimax(board, depth, isMax) {
    // available spots in board
    let avail = emptySpot(board);
    // evaluate score on board
    let score = evaluate(board);

    // check and return a value for terminal states such as win, lose, and tie
    if(score == 10 || score == -10) {
      return score;
    }
    else if(avail == []) {
      return 0;
    }

    if(isMax) {
      let bestScore = -1000;
      for(let i = 0; i < avail.length; i++) {
        let index = avail[i];
        // make move
        avail[i] = ai;
        // call minimax recursively and choose the maximum value
        bestScore = minimax(board, depth+1, !isMax);
        // undo the move
        avail[i] = index;

      }
      return bestScore;
    }
    else {
      let bestScore = 1000;
      for(let i = 0; i < avail.length; i++) {
        let index = avail[i];
        // make move
        avail[i] = hu;
         // call minimax recursively and choose the minimum value
        bestScore = minimax(board, depth+1, !isMax);
        // undo the move
        avail[i] = index;
      }
      return bestScore;
    }

}

// finding the best possible move and return it
function findBestMove(board) {
  let bestVal = -1000;
  let bestMove = -1;
  let avail = emptySpot(board);

  for(let i = 0; i < avail.length; i++) {
    // save index
    let index = avail[i];
    // compute the evalutation for this move
    let moveVal =  minimax(board, 0, false);
    // undo move
    avail[i] = index;

    if(moveVal > bestVal){
      bestVal = moveVal;
      bestMove = avail[i];
    }

  }

  console.log(bestVal);
  console.log(bestMove);

}


let bestSpot = findBestMove(board_index);

0 个答案:

没有答案