为什么这个作为 Minimax 语句一部分的循环会失败并添加“if”条件?

Why does this loop, which is part of a Minimax statement, fail with the `if` condition added?

我正在使用 Minimax 开发 Connect Four 游戏: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}
}```

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

当您的代码到达两个 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