将数组中的元素随机存储到表中



我正在尝试创建一个简单的内存匹配游戏,但在为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);

使用

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

抛开上面评论中已经提到的问题不谈。。。

如果我理解正确,你想把cardValues中的每个数字都分配给一个随机的表格单元格吗?

问题似乎出在这条线上:

var random = Math.ceil(Math.random() * cardValues.length) - 1;

这样做的目的是生成一个随机数一次。如果以后访问变量random,则不会再次调用整行代码,只会得到与第一次计算的值相同的值。例如,如果运行上面的代码,将"7"作为其随机数,并将其存储在random中,则每次执行for循环时,random的值将始终为"7",而不是每次都重新生成,这有意义吗?

尝试将随机数发生器放入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);,这应该会有同样的效果。

最新更新