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