我正在建立一个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'旁边。有没有人对如何做到这一点有任何建议?
答案 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);
答案 2 :(得分:0)
感谢大家的帮助,我们最后使用数组中的.concat对其进行了排序,如下所示:
xdebug