Я пытаюсь разместить комнаты на экране ASCII, а затем использую алгоритм Прима, чтобы " заполнить "пространство между комнатами лабиринтом, но без фактического проникновения в комнаты". Я возился несколько часов и не могу придумать, как помешать моему алгоритму проникнуть в мои комнаты.
Может кто-нибудь помочь мне? Я очень потерян. Я практикую технику генерации карт, и это мой 5-й по счету. Нет, я не хочу делать это по-другому, я просто хочу сделать это по-другому - но правильно.
Ниже приведены фото моего текущего вывода с комнатами, мой текущий вывод без комнат и ссылка на соответствующий исходный код (также известный как раздел алгоритма 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){}
}