使用Prim算法将房间放置在迷宫中

时间:2017-03-17 03:42:44

标签: java graph-theory maze minimum-spanning-tree roguelike

我正在尝试将房间放在ASCII屏幕上,然后使用Prim's algorithm“填充”迷宫房间之间的空间,但实际上没有进入房间。我一直在修补几个小时,我无法想办法阻止我的算法进入我的房间。

任何人都可以帮助我吗?我很丢失。我正在练习地图生成技术,这是我的第五个。不,我不想以另一种方式去做,我只是想这样做 - 但是对。

下面是我当前房间输出的照片,我当前没有房间的输出,以及相关源代码的链接(AKA Prim的算法部分)。如果你能真正帮助我,再次感谢你!

注意:所有相反的方法都是确定“父”单元格是哪个单元格,并根据该单元格确定方向。因此,如果父单元格的x值为7,而子单元格的x值为6,那​​么它就知道这是新的子项。

start = new Point(x,y, null);
map[start.x][start.y] = Tile.STAIRS_DOWN;

for(int nx = -1; nx <= 1; nx++){
    for(int ny = -1; ny <= 1; ny++){
        if((nx == 0 && ny == 0) || (nx != 0 && ny != 0)){
            continue;
        }
        try{
            if(map[start.x + nx][start.y + ny] == Tile.FLOOR){
                continue;
            }
            frontier.add(new Point(start.x+nx, start.y + ny, start));
        }
        catch(Exception e){
            continue;
        }
    }
}

Point last = null;
while(!frontier.isEmpty()){
    Point cu = frontier.remove(RandomGen.rand(0, frontier.size() - 1));
    Point op = cu.opposite();
    try{
        if((map[cu.x][cu.y] == Tile.WALL) && (map[op.x][op.y] == Tile.WALL)){
            for (int bx = -1; bx <= 1; bx++)
                for (int by = -1; by <= 1; by++) {
                    boolean failed = false;
                    if (bx == 0 && by == 0 || bx != 0 && by != 0)
                        continue;
                    try {
                        if(map[op.x + bx][op.y + by] == Tile.FLOOR){
                            break;
                        }
                        last = op;
                        if(!failed){
                        map[cu.x][cu.y] = Tile.FLOOR;
                        map[op.x][op.y] = Tile.FLOOR;
                        frontier.add(new Point(op.x + bx, op.y + by, op));
                        }
                    }
                    catch(Exception e){
                        continue;
                    }
                }
        }
    }
    catch(Exception e){}
}

Without Rooms

With Rooms

1 个答案:

答案 0 :(得分:0)

解决:我需要检查我的前方角落是否有空地。所以,如果我要去&#34;东&#34;然后我需要检查东北和东南的瓷砖,否则我可能会钻进房间。