防止碰到角落(JS游戏)

时间:2013-02-01 11:17:57

标签: javascript

如何阻止此地图生成器创建这样的触摸角:

-X
X-

或者

X-
-X

以下是生成器的简化示例:http://jsfiddle.net/fDv9C/2/

3 个答案:

答案 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/