En tant que projet de pratique, j'ai fait un jeu Tic-Tac-Toe sur JSFiddle (parce qu'il n'y en a pas déjà assez, non?) Et j'ai progressé dans l'ajout d'une IA imbattable. Pour l'essentiel, cela fonctionne, mais il existe certaines combinaisons (par exemple, en définissant X dans les champs 5, 9, 3 ou dans les champs 3, 7, 9) qui conduisent l'ordinateur à ne pas calculer correctement le déplacement optimal.Minimax en Javascript ne fonctionne pas correctement
Le projet sur jsFiddle: https://jsfiddle.net/jd8x0vjz/
et la fonction correspondante à partir de la ligne 63:
function evaluateMove(move, player, depth) {
var gameStatus = evaluateGameStatus(move); //get status of current board
if (gameStatus < 2 && player)
return -1; //if human won, return -1
if (gameStatus < 2 && !player)
return 1; //if human lost, return 1
var returnValue = 0 //value to be returned later
for (var z = 0; z < 3; z++) { //loop for row
for (var s = 0; s < 3; s++) { //loop for column
if (move[z][s]) //if current slot has an x or o,
continue; //skip it
var nextMove = cloneGameStatus(move); //create temporary array with base of current grid
nextMove[z][s] = !player ? "x" : "o"; //assign first free field the appropriate symbol
var value = evaluateMove(nextMove, !player, depth+1); //recursion but with switched player, to add the correct icon afterwards
if ((value > returnValue) && player)
returnValue = value;
if ((value < returnValue) && !player)
returnValue = value;
}
}
return returnValue; //return value of current simulation
}
Je pense que les deux dernières si-clauses sont à l'origine de ces problèmes, puisque l'ordinateur ne calcule le bon valeurs (comme observable dans le débogueur), mais ils sont parfois remplacés, mais je ne suis pas sûr que ce soit vraiment la racine du problème. Toute aide ou conseil serait apprécié!
EDIT: Problème résolu! Recherchez ma réponse ci-dessous au cas où ce n'est pas le premier.