window.TicTacToet.compMove = function (row, col) {
var player = window.TicTacToet.PlayerTurn;
var board = window.TicTacToet.Board;
for (i = 0; i < window.TicTacToet.Board.length; i++) {
for (j = 0; j < window.TicTacToet.Board[i].length; j++) {
if (window.TicTacToet.Board[i][j] == null) {
getWin(row, col, player, board);
} else {
console.log("position occupied");
}
}
}
}
function getWin($r, $c, $player, $board) {
checkTop($r, $c, $player, $board);
}
function checkTop($x, $y, $player, b) {
console.log("ENTER");
var success = false;
for (i = 0; i < 3; i++) {
$x--;
if ($x < 0) {
return success;
}
if (b[$y][$x] != $player) {
return success;
}
}
success = true;
return success;
}
函数check-Top执行无限次。参数row和col是表的坐标。播放器将返回true或false,并且板是具有9个元素的数组。 window.TicTacToet.Board.length和window.TicTacToet.Board [i] .length都有值9,即9 x 9. console.log(&#34; ENTER&#34;)应该执行91次但是它正在执行无限次。这可能是什么原因。因为这一切所有其他功能都不能正常工作,游戏本身不会播放。请帮帮忙。这是用于9 x 9可点击的棋盘游戏。
答案 0 :(得分:6)
我猜您可能希望var
关键字用于变量i
,
因为您在两个i
循环中使用相同的变量名for
。因此,在第二个for
循环中,您无意中覆盖了第一个i
循环的for
。为避免这种情况,您可以使用var
关键字声明变量,该关键字定义变量范围。
更改
for(i=0;i<window.TicTacToet.Board.length;i++)
要
for(var i=0;i<window.TicTacToet.Board.length;i++)
并改变
for (i=0;i<3;i++)
要
for (var i=0;i<3;i++)
没有var
关键字。
i = 100;
function foo(){
i = 0; // overwriting i to 0
}
foo();
alert(i); // shows 0
使用var
关键字。
var i = 100;
function foo(){
var i = 0; // This defines a new variable 'i' in the scope of function foo(){}.
}
foo();
alert(i); // shows 100
使用var
关键字(在嵌套函数中)
var i = 100;
function foo(){
var i = 200; // A new variable 'i' in the scope of function foo(){}.
function bar(){
var i = 0;// A new variable 'i' in the scope of function bar(){}.
}
bar();
alert(i); // shows 200
}
foo();
alert(i); //shows 100
在大多数具有块级变量作用域的语言中,变量可以在用大括号({和})包围的块中访问。但是JavaSciprt不会在块的末尾终止作用域,而是在函数结束时终止它们。
我确定有很多关于它的文章和文件。我用Google搜索并发现了一篇引人入胜的介绍性文章。 http://javascriptissexy.com/javascript-variable-scope-and-hoisting-explained/
希望这有帮助。