如何在程序生成的地牢中查找房间中的门数量?

时间:2019-01-14 17:12:39

标签: java procedural-generation

首先,我将详细说明当前项目是什么。我正在开发一款将玩家放置在基于房间的地牢中的游戏。房间是通过门进入/退出的。

这是我为发言权创建者提供的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:。这就是问题所在。在创建地图后创建房间会对其进行修复。我只是简单地做到了,所以房间创建者与地图创建者是分开的,然后我根据地图创建了房间。

1 个答案:

答案 0 :(得分:0)

问题是创建房间时我正在实例化房间,而房间的一部分实例化是在寻找门的数量和位置。问题在于,我正在要求算法查找尚未创建的房间。

为解决此问题,我使用了我之前创建的地图,即2DArray,房间标记为1s,其他所有标记为0。在完全创建地图之后,我遍历了地图,并放入在包含Room对象的单独2DArray中以1标记的坐标中的Room。

门现在可以准确地通向新房间了。