我正在用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
无关;它是在CCD_ 9块之后的无条件CCD_。
当代码到达两个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