【问题标题】:MinMax algorithm not working as expectedMinMax 算法未按预期工作
【发布时间】:2015-12-14 15:09:29
【问题描述】:

我正在构建一个井字游戏(Free Code Camp 上的一个项目),并且已经实现了一个 minmax 算法来决定计算机玩家接下来应该选择哪个方格。

在我测试过的所有情况下,它都按预期工作,但以下情况除外:

var userIs = 'o'
var computerIs = 'x'

function countInArray(array, what) {
    var count = 0;
    for (var i = 0; i < array.length; i++) {
        if (array[i] === what) {
            count++;
        }
    }
    return count;
}

function nextMove(board, player) {
  var nextPlayer;
  if (computerIs !== player) {
    nextPlayer = userIs; 
  } else {
    nextPlayer = computerIs; 
  }
  if (isGameOver(board)) {
    if (player === userIs) {
      return {
        "willWin": -1,
        "nextMove": -1
      };
    } else {
      return {
        "willWin": 1,
        "nextMove": -1
      };
    }
  }

  var listOfResults = [];

  if (countInArray(board, '-') === 0) {
    return {
        "willWin": 0,
        "nextMove": -1,
      };
  }

  var _list = [];//keeping track of avalible moves
  for (var i=0; i < board.length; i++) {
    if (board[i] === '-') {
      _list.push(i);
    }
  }
  for (var j = 0; j < _list.length; j++) {
    board[_list[j]] = player;
    var nextTry = nextMove(board, nextPlayer);
    listOfResults.push(nextTry.willWin);  
    board[_list[j]] = '-';
  }
  if (player === computerIs) {
     var maxele = Math.max.apply(Math, listOfResults);
     return {
      "willWin": maxele,
      "nextMove": _list[listOfResults.indexOf(maxele)] 
     };
  } else {
    var minele = Math.min.apply(Math, listOfResults);
    return {
      "willWin": minele,
      "nextMove": _list[listOfResults.indexOf(minele)] 
    };
  }
}

function isGameOver(board) {
  //horizontal wins
  var gameOver = false;
  var rowOffset = [0,3,6];
  rowOffset.forEach(function(row){
     if (board[row] === board[row + 1]  && board[row + 1]  === board[row + 2] && board[row] !== "-") {
      gameOver = true;
     }
  });
  //vertical wins
  var colOffset = [0,1,2];
  colOffset.forEach(function(col){
    if (board[col] === board[col + 3] && board[col + 3] === board[col + 6] && board[col] !== "-" ){
      gameOver = true;
    }
  });

  ///diag wins
  if (board[0] === board[4] && board[4] === board[8]  && board[8] !== "-" ) {
    gameOver = true;
  }
  if (board[2] === board[4] && board[4] === board[6] && board[6] !== "-" ) {
    gameOver = true;
  }
 return gameOver;
}

nextMove(["x", "x", "o", "o", "x", "-", "-", "-", "o"], computerIs)

它返回的位置:{willWin: 1, nextMove: 5} 当我期望 {willWin: 1, nextMove: 7}

我正在编写 Python 中的示例实现:https://gist.github.com/SudhagarS/3942029,它返回预期结果。

你能看出什么会导致这种行为吗?

【问题讨论】:

  • 虽然实际结果与你的预期不同,但真的是吗?意外输出前listOfResults 的内容是什么?
  • @Codor 错了,我暗示的是次优解决方案。如果他们选择7,计算机将能够获胜,但如果他们选择5,则只能平局。
  • 看起来结果列表包括所有1's,这也是出乎意料的,因为并非所有选择都会导致胜利。现在正在调查。

标签: javascript algorithm minmax


【解决方案1】:

我添加了一些日志记录,发现我没有正确地在玩家之间切换。

切换:

 if (computerIs !== player) {
    nextPlayer = userIs; 
  } else {
    nextPlayer = computerIs; 
  }

到:

if (computerIs === player) {
    nextPlayer = userIs; 
  } else {
    nextPlayer = computerIs; 
  }

并在比赛结束时为获胜者返回分数(-111-1)似乎已经成功了。

【讨论】:

    猜你喜欢
    • 2016-08-13
    • 2016-01-02
    • 2022-11-04
    • 2023-03-20
    • 2023-03-16
    • 1970-01-01
    • 1970-01-01
    • 2015-05-11
    • 2019-06-20
    相关资源
    最近更新 更多