我正在尝试创建一个简单的内存匹配游戏,我无法从我的cardValues数组为每个表格单元分配一个数字。我的giveCellValue函数应该生成一个随机数,然后从数组中选择该数字并将其提供给其中一个表格单元格,但是我对这个单元格略有不满,并且无法完成此任务。
var countCells;
var cardValues = [];
var checker = true;
var createTable = function (col, row) {
$('table').empty();
for (i = 1; i <= col; i++) {
$('table').append($('<tr>'));
}
for (j = 1; j <= row; j++) {
$('tr').append($('<td>'));
}
countCells = row * col;
};
createTable(3, 6);
for (i = 1; i <= countCells / 2; i++) {
cardValues.push(i);
if (i === countCells / 2 && checker) {
checker = false;
i = 0;
}
}
var giveCellValue = function () {
var random = Math.ceil(Math.random() * cardValues.length) - 1;
for (i = 0; i <= cardValues.length; i++) {
$('td').append(cardValues[random]);
cardValues.splice(random, 1);
}
};
giveCellValue();
console.log(cardValues);
答案 0 :(得分:1)
使用
var countCells;
var cardValues = [];
var checker = true;
var createTable = function (col, row) {
$('table').empty();
for (var i = 0; i < col; i++) {
$('table').append($('<tr>'));
}
for (var j = 0; j < row; j++) {
$('tr').append($('<td>'));
}
countCells = row * col;
};
createTable(3, 6);
for (i = 0; i < countCells; i++) {
cardValues.push(i % 9 + 1);
}
var giveCellValue = function () {
var len = cardValues.length, tds = $('td');
for (var i = 0; i < len; i++) {
var random = Math.floor(Math.random() * cardValues.length);
tds.eq(i).append(cardValues.splice(random, 1));
}
};
giveCellValue();
console.log(cardValues);
演示:Fiddle
答案 1 :(得分:0)
不考虑上述评论中已经提到的问题......
如果我理解正确,你想将cardValues中的每个数字分配给一个随机表格单元格吗?
似乎问题在于这一行:
var random = Math.ceil(Math.random() * cardValues.length) - 1;
这样做会产生一个随机数一次。如果您稍后访问变量random
,则不会再次调用整行代码,而只是获得第一次计算的相同值。例如。如果以上代码运行,则将“7”作为随机数吐出并将其存储在random
中,然后每次将其存储到for循环中,random
的值总是是'7'而不是每次重新生成 - 有意义吗?
尝试将随机数置于 for for循环中 - 这样会多次运行,每次都会生成一个新的随机数:
var giveCellValue = function () {
var random;
for (i = 0; i <= cardValues.length; i++) {
random = Math.ceil(Math.random() * cardValues.length) - 1;
$('td').append(cardValues[random]);
cardValues.splice(random, 1);
}
};
实际上,我将上面的第4行更改为random = Math.floor(Math.random() * cardValues.length);
,这应该具有相同的效果。