为什么这个属于 Minimax 语句一部分的循环在添加 if 条件后会失败?

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

我正在使用 Minimax 开发四子棋游戏:https://codepen.io/acchang/pen/XWePpWB

我陷入了 Minimax 的第一部分,即构建一个函数,该函数将优先考虑导致连续三个标记的移动。

我想我已经快到了,但我不明白为什么

function scorePositionHoriz()
中的循环在评估第一个位置后就关闭了。

当我注释掉

if
条件并循环遍历整个数组
parallelBoard
时,它就起作用了。但是当我取消注释
if
时,JavaScript 控制台会显示循环在一次尝试后关闭。

以下是两个关键功能。你能说出为什么

for
循环会在
if
条件下关闭吗?还有其他方法吗?

function scorePositionHoriz (board, player) {
    for (let r=0; r<6; r++) {
        for (let c=0; c<4; c++) {
            (console.log("checking: " + (board[r][c]),(board[r][c+1]),(board[r][c+2])))
            // if ((board[r][c] == player) && (board[r][c+1] == player) && (board[r][c+2] == player)) {
            //     score = score + 10
            //     console.log("scored is" + score)
            //     return score
            // }
            // else (console.log("no matches: " + (board[r][c]),(board[r][c+1]),(board[r][c+2])))
            // return 0

            // also tried:
            // if ((Number.isInteger(board[r][c]) == Number.isInteger(board[r][c+1])) &&
            // (Number.isInteger(board[r][c+1]) == Number.isInteger(board[r][c+2]))) {
            //     console.log("equal true")}
            //  else (console.log("no matches: " + (board[r][c]),(board[r][c+1]),(board[r][c+2])))
            // return 0

            // something about "if" throwing things off
        }
    }
};

function pickBestMove() {
    let bestScore = -1
    let bestColumn 
    let parallelAvailable = findAvailableSpots(parallelBoard)

     for (s=0; s<parallelAvailable.length; s++) {
            let i;
            let j = parseInt(parallelAvailable[s] - 1)
            console.log ("from avail spot " + j)
            for (i = 5; i > -1; i--) 
                if (Number.isInteger(parallelBoard[i][j])) {
                parallelBoard[i].splice((j), 1, whosPlaying())
                break
            }
        let positionScore = scorePositionHoriz (parallelBoard, whosPlaying())
        console.log("test board with marker in " + gameboard[i][j])
        parallelBoard[i].splice((j), 1, gameboard[i][j])

        if (positionScore > bestScore) {
         bestScore = positionScore
        console.log("Best Score is " + bestScore)
        bestColumn = s
        }
        else {console.log("not better")}
        console.log("tested avail spot: " + s)
        }
        console.log("BestColumn decided: " + bestColumn)
        if (bestColumn == 0){
            let altSpot = (availableSpots[Math.floor(Math.random() * availableSpots.length)] - 1)
            console.log("random choice:" + altSpot)
            return altSpot
        }
    else {return bestColumn}
}```
javascript arrays loops for-loop
1个回答
3
投票

if
无关;这是
return 0;
块之后的无条件
else
语句。

当您的代码到达两个

for
循环的第一次迭代时,它会执行
return score;
return 0;
。这将退出当前函数,并且不会执行进一步的循环迭代。

重新格式化你的代码应该会更清晰:

if ((board[r][c] == player) && (board[r][c+1] == player) && (board[r][c+2] == player)) {
    score = score + 10
    console.log("scored is" + score)
    return score; // Function exits here; loops are terminated
}
else {
    (console.log("no matches: " + (board[r][c]),(board[r][c+1]),(board[r][c+2])));
}

return 0; // Function exits here; loops are terminated
© www.soinside.com 2019 - 2024. All rights reserved.