jQuery - 如何在数组数组中随机化?

时间:2016-01-30 15:09:00

标签: javascript jquery arrays random

我正在建立一个4x4网格墙上的答案的游戏,答案最初将是四个一组,需要在每个游戏开始时随机化。然后,玩家必须将答案重新排列成组(如果没有意义,http://www.puzzgrid.com/grid/7279,显示我正在尝试实现的例子。)

我已经设置了一个包含答案数组的网格,如下所示:

var grid = [
  ['oak','cedar','fir','pine'],
  ['red','blue','green','yellow'],
  ['villa','spurs','city','united'],
  ['table','chair','door','stool']
];

使用Fisher-Yates shuffle如下我可以让网格随机化数组:

function shuffle(grid){

var i = grid.length;
var j;
var temp;

while(--i>0){
    j = Math.floor(Math.random()*(i+1));
    temp = grid[j];
    grid[j] = grid[i];
    grid[i] = temp;
}
return grid;
}

问题在于它只会改变整行,而不是每个数组中的项目,因此,例如,'chair'永远不会在'city'旁边。有没有人对如何做到这一点有任何建议?

3 个答案:

答案 0 :(得分:0)

尝试使用嵌套的while循环,Array.prototype.splice()

var grid = [
  ['oak', 'cedar', 'fir', 'pine'],
  ['red', 'blue', 'green', 'yellow'],
  ['villa', 'spurs', 'city', 'united'],
  ['table', 'chair', 'door', 'stool']
];

var copy = grid.slice().join(" ").replace(/,/g, " ").split(" ");
var res = [];
while (copy.length) {
  var arr = [];
  while (arr.length < 4) {
    var j = copy.splice(Math.floor(Math.random() * copy.length), 1)[0];
    arr.push(j)
  };
  res.push(arr)
}

document.querySelector("pre").textContent = JSON.stringify(res, null, 2);
<pre></pre>

答案 1 :(得分:0)

主席永远不会在城市旁边,因为你没有改变行内的元素,只是改变行。

您可以使用修改后的算法,该算法适用于整个矩阵。

var grid = [
  ['oak','cedar','fir','pine'],
  ['red','blue','green','yellow'],
  ['villa','spurs','city','united'],
  ['table','chair','door','stool']
];

var n = 4, m = 4, i = n*m, j, temp;

while(--i>0){
    j = Math.floor(Math.random()*(i+1));
    temp = grid[Math.floor(j/n)][j%m];
    grid[Math.floor(j/n)][j%m] = grid[Math.floor(i/n)][i%m];
    grid[Math.floor(i/m)][i%m] = temp;
}
console.log(grid);

https://jsfiddle.net/vwey4yb2/1/

答案 2 :(得分:0)

感谢大家的帮助,我们最后使用数组中的.concat对其进行了排序,如下所示:

xdebug