Tic Tac Toe 的 minimax 函数运行不正确(javascript)

问题描述 投票:0回答:0

在尝试将 minimax 实现为 tic tac toe 的 AI 数小时后,我只是不知道该做什么了。人工智能不会做出明智的选择,它似乎只是选择了它能做的第一步。这是我第一次尝试实现类似的东西。我用极客来写关于极小极大算法的极客文章,还有一些 youtube 视频作为这方面的基础。

'O' 是最大值或 AI,而 'X' 是最小值或玩家。 findBestMove 采用棋盘数组,并返回最佳着法作为索引值,以在数组中使用并插入在网络上创建的可视棋盘中。

function findBestMove(board) {

  let bestMove = {};
  let bestVal = -Infinity;

  for (let i = 0; i < 3; i++) {
    for (let j = 0; j < 3; j++) {

      if (board[i][j] === '') {

        board[i][j] = 'O';
        let moveVal = minimax(board, 0, false);
        board[i][j] = '';

        if (moveVal > bestVal) {
          bestVal = moveVal;
          bestMove = { i, j };
        }

      }
    }
  }

  return bestMove;
}

function minimax(board, depth, maxPlayer) {

  let score = GameBoard.checkResult();

  if (!!score) {

    if (score < 0) {
      return score + depth;
    } else {
      return score - depth;
    }

  }
  if (!isMovesLeft(board)) {
    return 0;
  }

  if (maxPlayer) {

    let maxEval = -Infinity;
    for (let i = 0; i < 3; i++) {
      for (let j = 0; j < 3; j++) {
        
        if (board[i][j] === '') {

          board[i][j] = 'O';
          let eval = minimax(board, depth + 1, false);
          board[i][j] = '';
          maxEval = Math.max(maxEval, eval);
          console.log(maxEval + ' ' + eval);

        }
      }
    }

    return maxEval;

  } else {

    let minEval = Infinity;
    for (let i = 0; i < 3; i++) {
      for (let j = 0; j < 3; j++) {

        if (board[i][j] === '') {

          board[i][j] = 'X';
          let eval = minimax(board, depth + 1, true);
          board[i][j] = '';
          minEval = Math.min(minEval, eval);

        }
      }
    }

    return minEval;

  }
}

function isMovesLeft(board) {
  for (let i = 0; i < 3; i++) {
    for (let j = 0; j < 3; j++) {
      if (board[i][j] === '') {
        return true;
      }
    }
  }
  return false;
}
javascript artificial-intelligence tic-tac-toe minimax game-theory
© www.soinside.com 2019 - 2024. All rights reserved.