Javascript Tic-tac-toe中的Minimax算法

Javascript Tic-tac-toe中的Minimax算法,javascript,discord.js,bots,artificial-intelligence,Javascript,Discord.js,Bots,Artificial Intelligence,我正试图用一个基于编码序列的discord机器人重新创建Tic-tac-toe游戏。主要的区别是我希望玩家开始,而且对于3x3网格,我使用了一系列表情符号 let tictactoe = [':white_square_button:', ':white_square_button:', ':white_square_button:', ':white_square_button:', ':white_square_button:', ':white_square_button:',

我正试图用一个基于编码序列的discord机器人重新创建Tic-tac-toe游戏。主要的区别是我希望玩家开始,而且对于3x3网格,我使用了一系列表情符号

let tictactoe = 
[':white_square_button:',
':white_square_button:', 
':white_square_button:', 
':white_square_button:', 
':white_square_button:', 
':white_square_button:', 
':white_square_button:', 
':white_square_button:', 
':white_square_button:'];
然后这样写出来:(是的,最初我用的是ScratchForDiscord)

在我第一次移动之后,机器人根本没有响应。但是,如果我重写minimax函数,使其始终返回10(这意味着它将转到第一个可用的单元格),它就可以正常工作。所以问题应该出在minimax函数(或checkWinner)上,但我无法发现错误

(部分)守则:

function bestMove(tictactoe) {
  let bestScore = -Infinity;
  let z;
  for (let i = 0; i <= 8; i++) {
    if (tictactoe[i] == ':white_square_button:') {
      tictactoe[i] = ':x:';
      score = minimax(tictactoe, 0, false);
      tictactoe[i] = ':white_square_button:';
      if (score > bestScore) {
        bestScore = score;
        z = i;
      }
    }
  }
  tictactoe[z] = ':x:';
  return tictactoe;
}

function minimax(tictactoe, depth, isMaximizing) {
  let result = checkWinner();
  if (result !== null) {
    if (result == ':x:') {
      return 10;
    }
    else if (result == ':radio_button:') {
      return -10;
    }
    else if (result == 'tie') {
      return 0;
    }
  }
  if (isMaximizing == true) {
    let bestScore = -Infinity;
    for (let i = 0; i <= 8; i++) {
      if (tictactoe[i] == ':white_square_button:') {
        tictactoe[i] = ':x:';
        let score = minimax(tictactoe, depth + 1, false);
        tictactoe[i] = ':white_square_button:';
        bestScore = max(score, bestScore);
      }
    }
    return bestScore;
  } 
  else if (isMaximizing == false) {
    let bestScore = Infinity;
    for (let i = 0; i <= 8; i++) {
      if (tictactoe[i] == ':white_square_button:') {
        tictactoe[i] = ':radio_button:';
        let score = minimax(tictactoe, depth + 1, true);
        tictactoe[i] = ':white_square_button:';
        bestScore = min(score, bestScore);
      }
    }
    return bestScore;
  }
}

function equals3(a, b, c) {
  return a == b && b == c && a != ':white_square_button:';
}

function checkWinner() {
  let winner = null;
  for (let i = 0; i <= 6; i += 3) {
    if (equals3(tictactoe[i], tictactoe[i+1], tictactoe[i+2])) {
      winner = tictactoe[i];
    }
  }
  for (let i = 0; i <= 2; i++) {
    if (equals3(tictactoe[i], tictactoe[i+3], tictactoe[i+6])) {
      winner = tictactoe[i];
    }
  }
  if (equals3(tictactoe[0], tictactoe[4], tictactoe[8])) {
    winner = tictactoe[0];
  }
  if (equals3(tictactoe[2], tictactoe[4], tictactoe[6])) {
    winner = tictactoe[2];
  }
  let openSpots = 0;
  for (let i = 0; i <= 8; i++) {
      if (tictactoe[i] == ':white_square_button:') {
        openSpots++;
      }
  }
  if (winner == null && openSpots == 0) {
    return 'tie';
  }
  else {
    return winner;
  }
}
功能最佳移动(tictactoe){
让bestScore=-无穷大;
让z;
for(设i=0;i最佳分数){
最佳分数=分数;
z=i;
}
}
}
tictactoe[z]=':x:';
返回蒂克塔克托;
}
函数minimax(tictactoe,深度,isMaximizing){
让结果=checkWinner();
如果(结果!==null){
如果(结果==':x:'){
返回10;
}
else if(结果=':单选按钮:'){
返回-10;
}
否则,如果(结果='tie'){
返回0;
}
}
如果(isMaximizing==true){
让bestScore=-无穷大;
for(设i=0;i
function bestMove(tictactoe) {
  let bestScore = -Infinity;
  let z;
  for (let i = 0; i <= 8; i++) {
    if (tictactoe[i] == ':white_square_button:') {
      tictactoe[i] = ':x:';
      score = minimax(tictactoe, 0, false);
      tictactoe[i] = ':white_square_button:';
      if (score > bestScore) {
        bestScore = score;
        z = i;
      }
    }
  }
  tictactoe[z] = ':x:';
  return tictactoe;
}

function minimax(tictactoe, depth, isMaximizing) {
  let result = checkWinner();
  if (result !== null) {
    if (result == ':x:') {
      return 10;
    }
    else if (result == ':radio_button:') {
      return -10;
    }
    else if (result == 'tie') {
      return 0;
    }
  }
  if (isMaximizing == true) {
    let bestScore = -Infinity;
    for (let i = 0; i <= 8; i++) {
      if (tictactoe[i] == ':white_square_button:') {
        tictactoe[i] = ':x:';
        let score = minimax(tictactoe, depth + 1, false);
        tictactoe[i] = ':white_square_button:';
        bestScore = max(score, bestScore);
      }
    }
    return bestScore;
  } 
  else if (isMaximizing == false) {
    let bestScore = Infinity;
    for (let i = 0; i <= 8; i++) {
      if (tictactoe[i] == ':white_square_button:') {
        tictactoe[i] = ':radio_button:';
        let score = minimax(tictactoe, depth + 1, true);
        tictactoe[i] = ':white_square_button:';
        bestScore = min(score, bestScore);
      }
    }
    return bestScore;
  }
}

function equals3(a, b, c) {
  return a == b && b == c && a != ':white_square_button:';
}

function checkWinner() {
  let winner = null;
  for (let i = 0; i <= 6; i += 3) {
    if (equals3(tictactoe[i], tictactoe[i+1], tictactoe[i+2])) {
      winner = tictactoe[i];
    }
  }
  for (let i = 0; i <= 2; i++) {
    if (equals3(tictactoe[i], tictactoe[i+3], tictactoe[i+6])) {
      winner = tictactoe[i];
    }
  }
  if (equals3(tictactoe[0], tictactoe[4], tictactoe[8])) {
    winner = tictactoe[0];
  }
  if (equals3(tictactoe[2], tictactoe[4], tictactoe[6])) {
    winner = tictactoe[2];
  }
  let openSpots = 0;
  for (let i = 0; i <= 8; i++) {
      if (tictactoe[i] == ':white_square_button:') {
        openSpots++;
      }
  }
  if (winner == null && openSpots == 0) {
    return 'tie';
  }
  else {
    return winner;
  }
}