2013-06-24 103 views
0

我正在尝试创建一个简单的内存匹配游戏,并且我无法从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

小心,'i'和'j'是全球性的麻烦! – elclanrs

+0

@elclanrs我想如果你只是在他们是本地功能内定义他们? – user2449973

+0

是的,但它们没有定义,你缺少'var'关键字,所以它们变成了隐式的全局变量。由于这个问题,我看到了意外的错误,因为所有的循环共享相同的变量。 – elclanrs

回答

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

0

撇开

如果我的理解对不对,你希望那已经在上述意见中提到的问题...将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);这也应该有相同的效果。

+0

谢谢,但是这个以及其他许多问题都在上面的答案中解决了。 – user2449973