我正在创建一个简单的tic-tac-toe游戏,我有一个名为winAlert的布尔值,如果它是真的,它应该提醒玩家他们已赢了。这在大多数情况下都能正常工作,但有一个实例却没有。如果游戏获胜并且所有单元格都已填满,则控制台会记录winAlert的值为false,但它仍会提醒玩家他们已经获胜,就好像它是真的一样。有人可以查看这段代码,看看为什么这样做会这样吗? http://jsfiddle.net/Z5c9P/3/ 这个功能是我认为问题所在,但我不确定。
var determineWin = function (pMoves) {
for (var i = 0; i < winConditions.length; i++) {
if (winConditions[i].length > pMoves.length) {
continue;
}
for (var j = 0; j < winConditions[i].length; j++) {
winAlert = false;
for (var k = 0; k < pMoves.length; k++) {
if (pMoves[k] === winConditions[i][j]) {
winAlert = true;
break;
}
}
if (!winAlert) break;
}
if (winAlert) {
alert(currentPlayer + " wins!");
break;
}
}
};
以下是调用此函数的代码:
$('td').one('click', function () {
turnCount += 1;
setCurrentPlayer();
$(this).text(currentPlayer);
cellTracker = $(this).attr('id');
storeMoves();
determineWin(xMoves);
determineWin(oMoves);
if(turnCount === 9 && winAlert === false) {
alert("Tie game!");
}
console.log(turnCount, xMoves, oMoves, winAlert);
});
答案 0 :(得分:2)
这种情况正在发生,因为您的代码执行以下操作:
storeMoves();
determineWin(xMoves);
determineWin(oMoves);
if(turnCount === 9 && winAlert === false) {
alert("Tie game!");
}
console.log(turnCount, xMoves, oMoves, winAlert);
因此,如果X赢得游戏,determineWin(xMoves)
会将变量设置为true,而determinWin(oMoves)
会将其设置为false,所有都在console.log()
之前
解决这个问题的一种方法是只检查当前玩家移动的胜利:
storeMoves();
determineWin(currentPlayer == 'X' ? xMoves : yMoves);
if(turnCount === 9 && winAlert === false) {
alert("Tie game!");
}
console.log(turnCount, xMoves, oMoves, winAlert);
答案 1 :(得分:0)
您已在每位玩家上致电determineWin
。因此,如果x获胜,determineWin(oMoves);
将使winAlert
为假。这是问题吗?
也许你应该创建一个新的determineWin
,它只调用一次来确定谁是赢家。
当他的单元格小于3时,此代码将跳过另一个用户(因此winAlert
仍为真),因此这个问题不需要填充所有单元格,但每个玩家只有3个以上的单元格。 / p>
if (winConditions[i].length > pMoves.length) {
continue;
}
答案 2 :(得分:0)
我改变了你的代码Fiddle
var determineWin = function (pMoves) {
for (var i = 0; i < winConditions.length; i++) {
if (winConditions[i].length > pMoves.length) {
continue;
}
winAlert = false;
matches = 0;
for (var j = 0; j < winConditions[i].length; j++) {
for (var k = 0; k < pMoves.length; k++) {
if (pMoves[k] === winConditions[i][j]) {
matches++;
}
}
}
if (matches == 3) return true;
}
return false;
};
然后
$('td').one('click', function () {
turnCount += 1;
setCurrentPlayer();
$(this).text(currentPlayer);
cellTracker = $(this).attr('id');
storeMoves();
if (determineWin(xMoves)){ // this is changed
alert("X Win")
return;
};
if (determineWin(oMoves)){
alert("O Win")
return;
};
if(turnCount === 9 && winAlert === false) {
alert("Tie game!");
}
console.log(turnCount, xMoves, oMoves, winAlert);
});
**已更新以澄清