首先,我将详细说明当前项目是什么。我正在开发一款将玩家放置在基于房间的地牢中的游戏。房间是通过门进入/退出的。
这是我为发言权创建者提供的generator()方法。
turn(int,int,int)方法采用一个方向(随机创建的数字0-3),两个起始位置以及x和y坐标,并返回一个包含先前数字的数组,但取决于方向,一个通过增加/减少一个来修改。例如,如果方向为0,则表示向上,并且yCoordinate将减去1。在返回的数组中,第一个值为he 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:。这就是问题所在。在创建地图后创建房间会对其进行修复。我只是简单地做到了,所以房间创建者与地图创建者是分开的,然后我根据地图创建了房间。
答案 0 :(得分:0)
问题是创建房间时我正在实例化房间,而房间的一部分实例化是在寻找门的数量和位置。问题在于,我正在要求算法查找尚未创建的房间。
为解决此问题,我使用了我之前创建的地图,即2DArray,房间标记为1s,其他所有标记为0。在完全创建地图之后,我遍历了地图,并放入在包含Room对象的单独2DArray中以1标记的坐标中的Room。
门现在可以准确地通向新房间了。