Javascript 中的 Tic Tac Toe 与 minimax 不会将分数返回到原始调用,有任何线索如何解决此问题吗?

问题描述 投票:0回答:1
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 个开放索引。 如何让分数返回到原始的极小极大调用函数。我尝试过调试,但找不到哪里出错了。任何事情都有帮助。

javascript tic-tac-toe minimax
1个回答
0
投票

试试这个

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.