В предисловии я немного подробнее расскажу о текущем проекте. Я работаю над игрой, которая помещает игрока в подземелье. Комнаты входят / выходят через двери.
Вот метод generator (), который я использовал для создателя своего пола.
Метод turn (int, int, int) принимает направление (случайно созданное число 0–3) и два начальных местоположения, а также координаты x и y и возвращает массив, содержащий предыдущие числа, но в зависимости от направление, один был изменен путем увеличения / уменьшения единицы. Например, если направление было 0, это означало бы вверх, а координата y была бы вычтена из 1. В возвращенном массиве первое значение - это X, второе - Y.
int roomTag = 1; //tags the room as created
int currentX = startLocation; //the column that navigates the map
int currentY = startLocation;
map[currentY][currentX] = roomTag;
int rooms = 0;
while(rooms < maxRooms) {
int direction = randomRange(0, 4);
currentX = turn(direction, currentX, currentY)[0];
currentY = turn(direction, currentX, currentY)[1];
if(currentX > 0 && currentY > 0 && currentX < maxSize && currentY < maxSize) {
if(map[currentY][currentX] != roomTag) {
map[currentY][currentX] = roomTag;
roomList[currentY][currentX] = new NormalRoom(this, currentX, currentY, rooms);
rooms++;
}
} else {
currentX = startLocation;
currentY = startLocation;
}
}
roomList[startLocation][startLocation] = new StartRoom(this, startLocation, startLocation, 0);
На данный момент процедурная генерация работает отлично. Каждый раз он генерирует подземелье по-разному, и все комнаты связаны горизонтально или вертикально как минимум с одной другой комнатой.
Комнаты просто содержат информацию о дверях, местонахождении и врагах, если применимо. В комнатах есть способ поиска, какие двери создавать. Вот метод, который вызывается при создании экземпляра комнаты. Он вызывается сначала, чтобы получить количество дверей, которые должны быть созданы, затем устанавливает логическое значение, созданное в значение true, а затем снова запускает метод для создания / добавления дверей в массив.
int doorIndex = doorCount - 1;
int[][] tempMap = floor.getMap();
if(yLocation > 0) {
for(int i = 0; i < tempMap.length; i++) {
for(int j = 0; j < tempMap.length; j++) {
if(i == tempMap.length/2 && j == tempMap.length/2) System.out.print("() ");
else if(tempMap[j][i] == 1) System.out.print("[] ");
else System.out.print(" ");
}
System.out.println(" ");
}
if(tempMap[yLocation - 1][xLocation] == 1) {
System.out.println("UP DOOR IN: (" + yLocation + ", " + xLocation + ")");
if(created) {
door[doorIndex] = new Door(0);
doorIndex--;
} else {
doorCount++;
}
}
}
if(yLocation < floor.getMap().length - 1) {
if(tempMap[yLocation + 1][xLocation] == 1) {
System.out.println("DOWN DOOR IN: (" + yLocation + ", " + xLocation + ")");
if(created) {
door[doorIndex] = new Door(2);
doorIndex--;
} else {
doorCount++;
}
}
}
if(xLocation < floor.getMap().length - 1) {
if(tempMap[yLocation][xLocation + 1] == 1) {
System.out.println("RIGHT DOOR IN: (" + yLocation + ", " + xLocation + ")");
if(created) {
door[doorIndex] = new Door(1);
doorIndex--;
} else {
doorCount++;
}
}
}
if(xLocation > 0) {
if(tempMap[yLocation][xLocation - 1] == 1) {
System.out.println("LEFT DOOR IN: (" + yLocation + ", " + xLocation + ")");
if(created) {
door[doorIndex] = new Door(3);
} else {
doorCount++;
}
}
}
if(created) {
for(int i = 0; i < door.length; i++) {
door[i].instantiate();
}
}
Проблема, похоже, в том, что она никогда не создает левые двери и редко создает двери. Кажется, я не могу понять, почему он это делает. Я застрял на этом какое-то время и, похоже, не могу найти причину, потому что не могу найти в этом никакой последовательности.
Я склонялся к публикации меньшего количества кода, но если потребуется больше, дайте мне знать.
Заранее спасибо.
Редактировать: Возможно, я нашел решение. Учитывая тот факт, что метод вызывается во время создания экземпляров комнат, он не может найти другие комнаты, так как они еще не существуют. Комнаты могут создавать двери только для комнат, которые были созданы до него. Если бы они были созданы после, на карте их пока не было бы в списке существующих.
Я постараюсь исправить проблему с учетом этого.
РЕДАКТИРОВАТЬ 2: Это была проблема. Создание комнат после создания карты исправлено. Я просто сделал так, чтобы создатель комнаты был отделен от создателя карты, затем я создал комнаты на основе карты.