From: Dylan Lloyd Date: Thu, 11 Jun 2015 07:08:15 +0000 (-0700) Subject: fixed broken endconditions X-Git-Url: https://disinclined.org/git/?a=commitdiff_plain;h=44e93e214ddfa443a7f1a11bc97bf576039e24e5;p=minimax.git fixed broken endconditions --- diff --git a/ai.js b/ai.js index 747af9b..fd4f4d6 100644 --- a/ai.js +++ b/ai.js @@ -104,7 +104,6 @@ $(document).ready(function(){ }); function generate(state, player) { - console.log('generating futures for ' + player); var possibilities = []; for (var i = 0; i < state.length; i++) { for (var ii = 0; ii < state[i].length; ii++) { @@ -126,69 +125,93 @@ $(document).ready(function(){ } function endCondition(state) { + console.log('checking for end condition'); var horizontalPlayer, horizontalTally = 0; var verticalPlayer, verticalTally = 0; var diagonalPlayer, diagonalTally = 0; var antiDiagonalPlayer, antiDiagonalTally = 0; var fullCells = 0; var size = state.length; + var eog = false; for (var i = 0; i < size; i++) { + horizontalPlayer = state[i][0]; + horizontalTally = 0; for (var ii = 0; ii < size; ii++) { - if (i == 0) - verticalPlayer = state[ii][i]; - if (ii == 0) - horizontalPlayer = state[ii][i]; - if (i == 0 && ii == 0) - antiDiagonalPlayer = state[ii][i]; - if (i == 0 && ii == size) - diagonalPlayer = state[ii][i]; - if (state[ii][i] == horizontalPlayer) + if (state[i][ii] == horizontalPlayer) horizontalTally++; - if (state[i][ii] == verticalPlayer) - verticalTally++; - if (state[i][ii]) + if (state[i][ii] !== 0) fullCells++; } - if (state[i][i] == diagonalPlayer) - diagonalTally++; - if (state[i][(size-1)-i] == antiDiagonalPlayer) - antiDiagonalTally++; - if (horizontalTally != size) - horizontalTally = 0; - if (verticalTally != size) - verticalTally = 0; + if (horizontalTally >= size) { + eog = horizontalPlayer; + break; + } } - if (horizontalTally >= size) - return horizontalPlayer; - if (verticalTally >= size) - return verticalPlayer; - if (diagonalTally == size) - return diagonalPlayer; - if (antiDiagonalTally == size) - return antiDiagonalPlayer; - if (fullCells == size*size) - return 'tie'; - return false; + for (var i = 0; i < size; i++) { + verticalPlayer = state[0][i]; + verticalTally = 0; + for (var ii = 0; ii < size; ii++) { + if (state[ii][i] == verticalPlayer) + verticalTally++; + } + if (verticalTally >= size) { + eog = verticalPlayer; + break; + } + } + for (var i = 0; i < size; i++) { + if (i == 0) + diagonalPlayer = state[0][0]; + for (var ii = 0; ii < size; ii++) { + if (i == ii && state[i][ii] == diagonalPlayer) + diagonalTally++; + } + if (diagonalTally == size) { + eog = diagonalPlayer; + break; + } + } + for (var i = 0; i < size; i++) { + for (var ii = 0; ii < size; ii++) { + if (i == 0 && ii == size-1) + antiDiagonalPlayer = state[0][size-1]; + if (i == (size-1)-ii + && state[i][ii] == antiDiagonalPlayer) + antiDiagonalTally++; + } + if (antiDiagonalTally == size) { + eog = antiDiagonalPlayer; + break; + } + } + if (!eog && fullCells == size*size) + eog = 'tie'; + + console.log('endCondition: ' + eog); + return eog ? eog : false; } function score(state, player) { var result = endCondition(state); - if (result !== false) + if (result && result !== 'tie') return result == player ? 1 : -1; + if (result == 'tie') { + console.log(state + ' is a tie'); + return 0; + } return false; } function minimax(state, player) { console.log('minimax: ' + state + ' for ' + player); var win = score(state, player); - console.log('got score: ' + win); + //console.log('got score: ' + win); if (win !== false) { + console.log('found end condition ' + win + ' for ' + player); return win; } var scores = []; - //var moves = []; - //var nextPlayer = player == 'x' ? 'o' : 'x'; - //var futures = generate(state, nextPlayer); + //console.log('generating futures for ' + player); var futures = generate(state, player); for (var i in futures) { var future = futures[i]; @@ -201,7 +224,7 @@ $(document).ready(function(){ }); } if (player == 'x') { - console.log('evaluating final choices for x'); + //console.log('evaluating final choices for x'); console.log(scores); var bestScore = 1; var bestMove; @@ -216,15 +239,15 @@ $(document).ready(function(){ 'score' : bestScore }; } else if (player == 'o') { - console.log('evaluating final choices for o'); + //console.log('evaluating final choices for o'); console.log(scores); var bestScore = -1; var bestMove; for (var i in scores) { if (scores[i].score >= bestScore) { - console.log('assigning: ' + scores[i].move - + ' to bestMove with score ' + scores[i].score); - console.log(scores[i]); +// console.log('assigning: ' + scores[i].move +// + ' to bestMove with score ' + scores[i].score); +// console.log(scores[i]); bestScore = scores[i].score; bestMove = scores[i].move; }