Minimax Tic Tac Toe Javascript游戏不会智能地玩

时间:2016-01-31 21:05:38

标签: javascript tic-tac-toe minimax

下午好,

有人可以帮我弄清楚为什么我的Tic Tac Toe javascript游戏不会智能地玩...意味着它不应该让我赢。我已经花了好几个小时,仍然无法弄明白。这是我项目的链接: http://codepen.io/tbraden30/pen/WrorjE非常感谢你!

"use-strict"
$(document).ready(function() {
  var gameBoard = [' ', ' ', ' ', ' ', ' ', ' ', ' ', ' ', ' '],
    humanPlayer = 'X',
    EMPTY = ' ',
    computerPlayer = 'O',
    currentPlayer = 'computer',
    choice;

  function buildBoard(board) {
    $('td').each(function(index) {
      $(this).text(board[index]);
    });
  }

  function makeMove(board, symbol, move) {
    board[move] = symbol;
  }

  function checkWin(board, player) {
    return ((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[0] == player && board[4] == player && board[8] == player) || (board[2] == player && board[4] == player && board[6] == player) || (board[2] == player && board[5] == player && board[8] == player));
  }

  function boardSpaceOpen(board, move) {
    return board[move] == EMPTY;
  }

  function boardIsFull(board) {
    for (var i = 0; i < board.length; i++) {
      if (boardSpaceOpen(board, i)) {
        return false;
      }
    }
    return true;
  }

  function resetBoard() {
    gameBoard = [' ', ' ', ' ', ' ', ' ', ' ', ' ', ' ', ' '];
    buildBoard(gameBoard);
    currentPlayer = 'computer';
    computerPlay();
  }



  function computerPlay() {
    var moves = getOpenSpaces(gameBoard);
    var move = moves[0];
    var score = -10000;
    for (var i = 0; i < moves.length; i++) {
      var newBoard = gameBoard.slice();
      newBoard[moves[i]] = computerPlayer;

      if (checkWin(computerPlayer, newBoard)) {
        move = moves[i];
        break;
      }
      var newScore = minimax(humanPlayer, newBoard);
      if (newScore > score) {
        score = newScore;
        choice = moves[i];
      }
    }
    makeMove(gameBoard, computerPlayer, move);
    buildBoard(gameBoard);

    if (checkWin(gameBoard, computerPlayer)) {
      alert('computer Wins!!');
      resetBoard();
    } else if (boardIsFull(gameBoard)) {
      alert('DRAW!!');
      resetBoard();
    } else {
      currentPlayer = 'human';
    }
  }

  function getOpenSpaces(board) {
    var emptySpaces = [];
    for (var i = 0; i < board.length; i++) {
      if (boardSpaceOpen(board, i)) {
        emptySpaces.push(i);
      }
    }
    return emptySpaces;
  }

  function getOpponentOf(player) {
    return currentPlayer == 'computer' ? 'human' : 'computer';
  }

  function minimax(board, player) {
    if (checkWin(board, humanPlayer)) {
      return -100
    }
    if (checkWin(board, computerPlayer)) {
      return 100
    }
    if (boardIsFull(board)) {
      return 0;
    }

    var availableMoves = getOpenSpaces(board);
    var scores = availableMoves.map(function(move){
      var newBoard = board.slice();
      newBoard[move] = player; 
      return minimax(getOpponentOf(currentPlayer), newBoard);
    });

    if(currentPlayer == 'computer'){
      return Math.max.apply(null,scores);
    }
    else{
      return Math.min.apply(null,scores)
    }
  }



  $('#reset').on('click', function() {
    resetBoard();
  });

  $('.piece').on('click', function() {
   humanPlayer = this.id;
   computerPlayer = humanPlayer == 'X' ? 'O' : 'X';
   computerPlay();
  });

  $('td').on('click', function() {
    if (currentPlayer == 'human') {
      var move = this.id;
      if (boardSpaceOpen(gameBoard, move)) {
        makeMove(gameBoard, humanPlayer, move);
        buildBoard(gameBoard);

        if (checkWin(gameBoard, humanPlayer)) {
          alert('You Won!!');
          resetBoard();
        } else if (boardIsFull(gameBoard)) {
          alert('DRAW!!');
          resetBoard();
        } else {
          currentPlayer = 'computer';
          computerPlay();
        }
      }
    }
  });

});

0 个答案:

没有答案
相关问题