【问题标题】:Randomly storing elements from an array into a table将数组中的元素随机存储到表中
【发布时间】:2013-06-24 08:23:47
【问题描述】:

我正在尝试创建一个简单的记忆匹配游戏,但我无法从我的 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);

【问题讨论】:

  • 小心,ij 是全球性的,麻烦!
  • @elclanrs 我想如果你只在本地函数中定义它们?
  • 是的,但它们没有定义,你缺少 var 关键字,所以它们成为隐式全局变量。由于所有循环共享相同的变量,因此我看到了由于此问题而导致的意外错误。
  • 只是提到你的行循环是添加列和列循环添加行

标签: javascript jquery arrays iteration splice


【解决方案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

【讨论】:

    【解决方案2】:

    暂且不说上面cmets中已经提到的问题……

    如果我理解正确,您想将 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);,这应该具有相同的效果。

    【讨论】:

    • 谢谢,但是这个问题和许多其他问题都在上面的答案中得到了解决。
    猜你喜欢
    • 1970-01-01
    • 2017-10-25
    • 2015-02-10
    • 2016-09-03
    • 1970-01-01
    • 2019-08-20
    • 1970-01-01
    • 2023-03-29
    • 2010-10-23
    相关资源
    最近更新 更多