下午好,
有人可以帮我弄清楚为什么我的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();
}
}
}
});
});