Javascript 防止触角(JS游戏)

Javascript 防止触角(JS游戏),javascript,Javascript,如何防止此贴图生成器创建如下接触角: -X X- 或 下面是生成器的一个简化示例:我就是这么做的: 魔法在哪里发生?向下滚动至第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][

如何防止此贴图生成器创建如下接触角:

-X
X-

下面是生成器的一个简化示例:

我就是这么做的:

魔法在哪里发生?向下滚动至第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
(尽管这并没有带来很大的区别):

请参见此处的演示:


编辑:我无法抗拒。我必须创建一个自动地图生成器,这样我就不必一直单击run:

,因为您创建线路板的方式,在生成过程中执行此检查非常困难。我创建了一个简单的功能,检查板后。它使用洪水算法。这是小提琴(蓝色背景是原始地图,红色背景是检查后的地图)

基本上,我们创建第二个数组
grid2
。填充
网格后
我们递归运行
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;
}
功能泛洪v(x,y){
变量shiftArray=[[0,1],[0,-1],[1,0],-1,0];
grid2[y][x]=1;

因为(var k=0;k你的问题几乎可以自己回答

这是小提琴:

它只是简单地检查你不想要的组合并修补它们。它总是添加一个网格点,以避免断开地图的任何部分


这反过来可能会导致另一种情况,在这种情况下,问题可能会发生,但如果它改变了什么(即,如果它发现了问题),它只需再次检查。这可以优化,例如通过递归调整更改的内容,但通常只需要1或2次。那里有一个限制,不允许超过100次,以防出现无法修复的意外情况(但我想不出这种情况:)).

@Gareth有很多东西。这是一个小规模简化的问题示例。我尝试过在找到角点时添加和删除块,但没有完全正确。JSFIDLE中没有javascript!你尝试过吗?@RachelGallen都在HTML选项卡中。你用过你的滚动条吗?可能吧更好地查看和摆弄。@路人谢谢,已更新。在两个摆弄上,我都得到了
未捕获类型错误:无法读取未定义的fiddle.jshell.net/fDv9C/6/show/:88未捕获类型错误:无法调用null
@Petah的方法“get”-这很奇怪。对我来说效果很好。给我看一个错误控制台的屏幕截图,或者尝试使用一个不同的您使用的浏览器是哪一个?(chrome 24.0.1312.57)。似乎也没有错误。但它删除了“房间”问题是Firefox和Chrome总是将变量
top
视为页面的顶部
窗口,而不是我们定义的窗口。因此,我将名称从
top
更改为
up
,现在它可以工作了:@Petah-我修改了答案中的链接以指向工作的dem这就是你想要的吗?谢谢工作得很好,尽管它错误地识别了这个例子:我修改
检查
函数(fiddle链接也更新了),请现在测试它。仍然不太正确:但我认为我已经按照我所说的对它进行了排序,当我移除磁贴时,这可能会发生。如果您需要,我可以更改我的代码,它将添加磁贴,但您的解决方案似乎是正确的(但不是最佳的).谢谢,这是解决问题的第一个答案,虽然我已经整理好了。但是你得到了赏金。耶!我现在可以评论了!谢谢。
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;
}
if (!!grid[y][x] && !!grid[y+1][x+1] && !grid[y+1][x] && !grid[y][x+1]) {
    good=false;
    grid[y+1][x]=2;
}