const minimax = (newBoard,currentPlayer)=>{
let availSpots = emptyIndexes(newBoard)
newBoard = Array.from(newBoard)
if(CheckForWin(newBoard) && currentPlayer === players[0]){
return {score:-10}
}
else if(CheckForWin(newBoard) && currentPlayer ===players[1]{
return {score:10}
}
else if (availSpots.length === 0){
return {score:0}
}
let Moves = []
for(let k = 0;k<availSpots.length;k++){
let move = {}
move.index = availSpots[k]
newBoard[availSpots[k]] = currentPlayer
if(currentPlayer === players[1] ){
let result = minimax(newBoard,players[0]).score
move.score = result
}
else{
let result = minimax(newBoard,players[1]).score
move.score = result
}
newBoard[availSpots[k]] = move.index
Moves.push(move)
console.log(Moves)
}
let BestMove;
if(currentPlayer === players[1]){
let bestscore1 = -Infinity
for(let j = 0;j < Moves.length;j++){
if(Moves[j].score > bestscore1){
bestscore1 = Moves[j].score
BestMove = j
}
}
}
else if(currentPlayer === players[0]){
let bestscore = Infinity
for(let i = 0;i < Moves.length;i++){
if(Moves[i].score < bestscore){
bestscore = Moves[i].score
BestMove = i
}
}
}
return Moves[BestMove]
}
function emptyIndexes(array){
let indexArray = []
for(i = 0;i<array.length;i++){
if(array[i] == ''){
indexArray.push(i)
}
}
return indexArray
}
我认为问题可能在于我对emptyIndexes的调用。 返回 IndexArray 始终返回 0。 Moves 数组不会将分数返回到原始 8 个开放索引。 如何让分数返回到原始的极小极大调用函数。我尝试过调试,但找不到哪里出错了。任何事情都有帮助。
试试这个
const minimax = (board, currentPlayer) => {
let availSpots = emptyIndexes(board);
if (CheckForWin(board) && currentPlayer === players[0]) {
return { score: -10 };
} else if (CheckForWin(board) && currentPlayer === players[1]) {
return { score: 10 };
} else if (availSpots.length === 0) {
return { score: 0 };
}
let moves = [];
for (let i = 0; i < availSpots.length; i++) {
let move = {};
move.index = availSpots[i];
// Create a copy of the board
let newBoard = [...board];
newBoard[availSpots[i]] = currentPlayer;
if (currentPlayer === players[1]) {
let result = minimax(newBoard, players[0]).score;
move.score = result;
} else {
let result = minimax(newBoard, players[1]).score;
move.score = result;
}
moves.push(move);
}
let bestMove;
if (currentPlayer === players[1]) {
let bestScore = -Infinity;
for (let j = 0; j < moves.length; j++) {
if (moves[j].score > bestScore) {
bestScore = moves[j].score;
bestMove = j;
}
}
} else if (currentPlayer === players[0]) {
let bestScore = Infinity;
for (let i = 0; i < moves.length; i++) {
if (moves[i].score < bestScore) {
bestScore = moves[i].score;
bestMove = i;
}
}
}
return moves[bestMove];
};