如何修复 JavaScript 中的 Tic Tac Toe,并且 minimax 不将分数返回到原始调用?

问题描述 投票:0回答:1

我想问题可能出在我的呼吁

emptyIndexes
。 return
IndexArray
始终返回 0。
Moves
数组不会将分数返回到原始 8 个开放索引。

如何让分数返回到原来的极小极大调用函数? 我尝试过调试,但找不到哪里出错了。

根据我的理解,递归发生直到终止条件(10,-10,0),然后向后传递这些值直到满足初始调用,然后根据所有结果更新最佳分数并返回带有

BestMove
的对象。调用
BestMove
仅返回值 0。

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
    }
      
javascript tic-tac-toe minimax
1个回答
-1
投票

试试这个

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];
};
© www.soinside.com 2019 - 2024. All rights reserved.