【发布时间】:2015-01-05 07:49:54
【问题描述】:
我想生成一个从矩阵顶部到底部的随机路径。
要求:
- 路径可以绕行,但必须从第 1 行连接到最后一行。
- 最终,我希望每个路径片段的颜色是随机的,但现在它可以是统一的(我在下面仅使用红色进行了测试)
- 从上到下连接的路径是随机生成的
- 路径碎片显然必须连接,并且不应该分叉(也就是给玩家 2 个选择去的选项,如图所示)
- 路径只能从上往下走(不能往回走),但可以左右蜿蜒
我的考虑:
- 我不能简单地检查上面的行的列是否是路径的一部分,因为它会在找到第一个真值时不断生成路径片段。
- 我对手动生成路径不感兴趣,因为这需要一个新的矩阵来指定我想要路径去的 1 和 0。然后对于每个“随机”路径选项,我必须构建一个新矩阵。更重要的是,在矩阵中手动生成路径会使矩阵大小的缩放变得更加乏味......例如,如果我将 6x6 矩阵更改为 100x100。
所以,是的,最简单的方法就是制作并迭代它:
var matrixPaths = [
[0,1,0,0,0,0],
[0,1,1,1,0,0],
[0,0,0,1,0,0],
[0,0,0,1,1,1],
[0,0,0,0,0,1],
[0,0,0,0,0,1]
];
左边是空网格,右边是它应该生成的内容
我的想法是首先创建网格并在每个矩阵条目中添加跨度:
function createMyGrid() {
//create 6x6 matrix
for(var i=1; i<=6; i++) {
matrix[i] = [];
for(var j=1; j<=6; j++) {
var colorIndex = Math.floor(Math.random() * (color.length - 0) + 0);
var $span = $('<span />').attr('class', 'colorSquare').html("[" + i + "][" + j + "]");
$("#grid").append($span);
matrix[i][j] = $span;
}
}
}
然后,在第 1 行随机生成第一个路径片段。然后对于每个后续行,检查其上方的路径片段以连接...然后从该片段开始生成下一组:
function createPath() {
var randomColumn = Math.floor(Math.random() * (matrix[1].length - 0) + 0);
matrix[1][randomColumn].data('partOfPath', true);
matrix[1][randomColumn].addClass("red");
for (var row = 2; row <= 6; row++) {
for (var col = 1; col <= 6; col++) {
if (matrix[row-1][col].data('partOfPath')) { //if block above is partOfPath... add a set of items of random # of columns across
addRowPath(row, col);
}
}
}
}
function addRowPath (row, pathCol) { //need to start offset from that row/col position,
var randRowPathLength = Math.floor(Math.random() * (matrix[row].length - 0) + 0);
for (var col = pathCol; col <= randRowPathLength; col++) {
matrix[row][col].addClass("red");
}
}
到目前为止,它正在添加初始步骤,然后是下面的行,然后停止。
【问题讨论】:
-
在这里添加小提琴真的很有用,让人们更容易回答。
-
@IngoBürk Fiddle 添加了
-
你做了什么调试?一些console.logs 应该向您显示它是否正在停止以及当时的变量是什么。添加断点并单步执行代码应该可以解决问题。
-
@squint 好吧,我不知道从哪里开始。
-
什么意思?很明显,您的代码中有一些条件不符合您的期望,因此要么在各个点调用
console.log()以查看值是什么以及路径结束的原因,要么在代码中放置一个断点并单步执行逐行直到你弄清楚。这就是调试。
标签: javascript jquery css algorithm random