答案 0 :(得分:1)
由于您创建电路板的方式,在生成期间进行此检查非常困难。我创建了简单的功能,检查后。它使用泛洪算法。这是小提琴http://jsfiddle.net/jzTEX/8/(蓝色背景是原始地图,红色背景是检查后的地图)
基本上我们创建第二个数组grid2
。填充grid
后,我们以递归floodV
函数
function floodV(x,y) {
var shiftArray = [[0,1],[0,-1],[1,0],[-1,0]];
grid2[y][x]=1;
for(var k=0;k<4;k++) {
var x1=x+shiftArray[k][0];
var y1=y+shiftArray[k][1];
if(grid[y1][x1] == 1 && grid2[y1][x1] == 0 && checkV(x1,y1)) {
grid2[y1][x1] = 1;
floodV(x1,y1);
}
}
}
使用检查功能
function checkV(x,y) {
var checkVarr = [[-1,-1], [-1,1], [1,1], [1,-1]];
for(var k=0;k<4;k++) {
if(grid[y+checkVarr[k][0]][x+checkVarr[k][1]] == 1 && grid[y+checkVarr[k][0]][x] == 0 && grid[y][x+checkVarr[k][1]] == 0 && grid2[y+checkVarr[k][0]][x+checkVarr[k][1]] == 1)
return false;
}
return true;
}
这并不完美,因为我们有时可以扔掉地图的大部分,但如果我们尝试开始添加新元素,我们必须再次检查整个地图(在有价值的情况下)。
答案 1 :(得分:1)
你的问题几乎回答了自己。
这是小提琴:http://jsfiddle.net/qBJVY/
if (!!grid[y][x] && !!grid[y+1][x+1] && !grid[y+1][x] && !grid[y][x+1]) {
good=false;
grid[y+1][x]=2;
}
它只是检查你不想要的组合并修补它们。它总是添加一个网格点,以便不断开地图的任何部分。
这反过来可能导致另一种可能发生问题的情况,但如果它发生任何变化(即,如果发现问题),它将再次检查。这可以进行优化,例如通过递归调整任何改变的内容,但通常只需要1或2次通过。有一个限制器,不允许超过100次通过,以防万一有一些不可预见的情况,它无法解决它(我想不出这种情况,但:) :)。
答案 2 :(得分:0)
这就是我所做的:http://jsfiddle.net/fDv9C/13/
魔法发生在哪里?向下滚动到第53到58行:
var bottom = y_next + 1;
var left = x_next - 1;
var right = x_next + 1;
var top = y_next - 1;
if (grid[top][left] || grid[top][right] ||
grid[bottom][left] || grid[bottom][right]) continue;
简而言之,您的触摸角点只能出现在计算的下一个位置。因此,如果存在下一个位置的四个角落邻居中的任何一个,则必须计算另一个下一个位置。
当这种情况发生时,你甚至可以减少计数器i
以获得尽可能多的路径(虽然它并没有真正产生很大的不同):
var bottom = y_next + 1;
var left = x_next - 1;
var right = x_next + 1;
var top = y_next - 1;
if (grid[top][left] || grid[top][right] ||
grid[bottom][left] || grid[bottom][right]) {
i--;
continue;
}
请参阅此处的演示:http://jsfiddle.net/fDv9C/12/
编辑:我无法抗拒。我不得不创建一个自动地图生成器,以便我不必一直点击运行:http://jsfiddle.net/fDv9C/14/