-2

我正在使用 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}
}```
4

1 回答 1

2

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
于 2022-01-14T17:31:21.327 回答