在javascript中测试一些东西我正在构建一个小型的扫雷。
以下代码是二维数组P.field
的初始化。之后,一些随机字段被x
填满,表示该字段中有一个地雷。
P.field = new Array(num);
for (var i = 0; i < P.field.length; i++)
P.field[i] = new Array(num);
$.each(P.field, function(index, key) {
$.each(key, function(i, k) {
P.field[index][i] = '-';
});
});
var arr = [];
while (arr.length < 10) {
var found = false;
var randomnumber = Math.ceil(Math.random()*(num*num-1));
for (var i = 0; i < arr.length; i++)
if (arr[i] == randomnumber) { found = true; break; }
if (!found) arr[arr.length] = randomnumber;
}
for (var i = 0; i < arr.length; i++) {
P.field[ Math.floor(arr[i]/num) ][ Math.floor(arr[i]-Math.floor(arr[i]/num)*num)-1 ] = 'x';
}
但是,在我计算周围字段中的地雷的算法中,我得到了控制台错误TypeError: P.field[(r+1)] is undefined
。每个字段(除了最后一行的字段)都会返回此错误,这是我无法理解的。
P.field[rows][columns]
每个维度的长度为10([10] [10])。当我尝试将P.field[9][0]
的值设为P.field[9][9]
时,没有任何错误。但是,当我添加任何较小的行时,此异常就会启动(P.field[0 + 1][0]
,P.field[3 + 1][6]
,以及所有这些... ...
我希望有人可以告诉我原因。
修改
更多代码:
onReady: function() {
$('#sweeper table').on('click', 'td', function(e) {
var row = $(this).parent().attr('class'); // Class represents the index of the array
var column = $(this).attr('class'); // Class represents the index of the array
P.openField(row, column, $(this));
});
},
openField: function(r, c, e) {
if ( P.field[r][c] == 'x' ) {
e.addClass('mine');
} else {
e.html( P.surroundingMineCount(r, c) );
e.addClass('opened');
}
},
surroundingMineCount: function(r, c) {
var count = 0;
if ( P.field[r][c-1] == 'x' ) count++;
if ( P.field[r-1][c-1] == 'x' ) count++;
if ( P.field[r][c+1] == 'x' ) count++;
if ( P.field[r-1][c] == 'x' ) count++;
if ( P.field[r-1][c+1] == 'x' ) count++;
if ( P.field[r+1][c] == 'x' ) count++;
if ( P.field[r+1][c-1] == 'x' ) count++;
return count;
},
现在我没有验证,如果r + 1或r-1实际上是该数组的有效索引(我有一个,但删除它进行测试)。然而,这实际上不是错误,因为我甚至在表格中间出现错误。
答案 0 :(得分:1)
查看您提供的代码与您抛出的错误,我对您怀疑的原因持怀疑态度,因为使用的代码确实生成了正确的数组。
我怀疑这可能是一个稍微简单的问题,您提供的示例生成代码使用:
P.field = new Array(num);
以P为首都,而您抛出的错误将其用作小写:
TypeError: p.field[(r+1)] is undefined
你确定你在测试时没有意外地使用过不正确的情况吗?