I'm working on a Connect Four game with Minimax: https://codepen.io/acchang/pen/XWePpWB
I'm stuck on the first portion of the Minimax, which is to build a function that would prioritize moves that result in three tokens in a row.
I think I’m almost there, but I can’t figure out why the loop in function scorePositionHoriz() is shutting down on me after just evaluating the first position.
It works when I comment out the if condition and loops through the entire array parallelBoard. But when I uncomment the if, the javascript console shows me the loop shuts down after one attempt.
Below are the two critical functions. Can you say why the for loop is shutting down with the if condition and is there another way to do it?
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}
}```
It's nothing to do with the
if; it's the unconditionalreturn 0;statement after theelseblock.When your code reaches the first iteration of the two
forloops, it either executesreturn score;orreturn 0;. That exits the current function, and no further iterations of your loops will be performed.Reformatting your code should make it clearer: