Итерация по карте подземелья

Я работаю над RPG, поэтому, конечно, мне нужно несколько подземелий. У меня работает генерация подземелий с выводом DungeonTileType[][].

Теперь я хотел создать код, чтобы игрок мог войти в подземелье. Для этого я создал класс Dungeon, который будет содержать всю информацию, необходимую для работы игры.

Вот оно:

public class Dungeon {

    private final Player player;
    private final DungeonTileType[][] dungeonTiles;

    private MapPoint startPoint;
    private MapPoint endPoint;

    public Dungeon(Player player, DungeonTileType[][] dungeonTiles) {
        this.player = player;
        this.dungeonTiles = dungeonTiles;

        for (int x = 0; x < dungeonTiles.length; x++) {
            DungeonTileType[] row = dungeonTiles[x];
            for (int y = 0; y < row.length; y++) {
                DungeonTileType type = row[y];
                if (type == DungeonTileType.START) {
                    this.startPoint = new MapPoint(x, y);
                } else if (type == DungeonTileType.END) {
                    this.endPoint = new MapPoint(x, y);
                }
            }
        }

        this.player.setDungeonStartPosition(this.startPoint);
    }

    public DungeonTileType[][] getTiles() {
        return this.dungeonTiles;
    }

    public Player getPlayer() {
        return this.player;
    }

    public MapPoint getStartPoint() {
        return this.startPoint;
    }

    public MapPoint getEndPoint() {
        return this.endPoint;
    }
}

Я использую алгоритм создания лабиринта в качестве первого шага для создания подземелья, поэтому я могу использовать начальную точку лабиринта, чтобы правильно расположить игрока, когда он войдет в подземелье. Я также мог бы использовать конечную точку для создания лестницы на другой уровень в некоторой точке.

Что мне действительно не нравится, так это то, что я не могу использовать for : in в этой ситуации, потому что мне нужно иметь X и Y координаты данной плитки. Одним из решений было бы иметь класс DungeonTile, который отслеживает как тип, так и позицию, но мне нравится простота матрицы, особенно когда я иду к сериализации. Я также подумал о списке списков, потому что тогда я мог бы использовать indexOf(), но снова я теряю простоту матрицы в этой ситуации.

Я хотел бы получить некоторые идеи для альтернативных подходов.

8 голосов | спросил bazola 26 thEurope/Moscowp30Europe/Moscow09bEurope/MoscowSat, 26 Sep 2015 20:21:19 +0300 2015, 20:21:19

2 ответа


8
  

Я работаю над RPG, поэтому, конечно, мне нужно несколько подземелий. У меня работает генерация подземелий с выводом DungeonTileType[][].

Ну, вот твоя проблема. Чтобы упростить исключить поиск, вы должны вернуть что-то вроде этого:

class Dungeon {
    DungeonTileType[][] tiles;
    MapPoint start;
    MapPoint end;
}

Подумайте об этом, в настоящее время у вас есть некоторый код, который генерирует карту, которую вы затем просматриваете по всей карте , чтобы выяснить, куда вы поместили этот один выход и этот один начальный тайл .

Когда вы размещаете начальную и конечную плитки, вы должны сохранить положение, в котором вы их поместили.

Что касается общего двухмерного цикла, я написал ---- +: = 2 =: + ---- для циклического просмотра 2D-массивов , который вы можете использовать, если хотите.

ответил Simon Forsberg 26 thEurope/Moscowp30Europe/Moscow09bEurope/MoscowSat, 26 Sep 2015 23:15:03 +0300 2015, 23:15:03
4

Вы можете создать класс, который инкапсулирует необработанный массив.

class Tile {
    MapPoint getPosition();
    DungeonTileType getType();
}

class DungeonMap implements Iterable {
    private DungeonTileType[][] tiles;

    DungeonMap(DungeonTileType[][] tiles);
    Iterator<Tile> iterator();
}

Если вам нужно больше операций на карте, они также могут быть добавлены, например, changeTile(MapPoint)

Цикл в Dungeon теперь можно изменить на это:

for (Tile tile : dungeonMap) {
   if (tile.getType() == DungeonTileType.START) {
        this.startPoint = tile.getPosition();
    } else if (tile.getType() == DungeonTileType.END) {
        this.endPoint = tile.getPosition();
    }
}

Как используется метод getTiles? Это плохо нарушает инкапсуляцию. Вы должны попытаться изолировать код обработки тайлов в одном классе, чтобы никто не зависел от его текущей структуры данных.

Если подземелье большое, поиск определенной плитки будет медленным (\ $ O (n) \ $). Вы можете ускорить это, сначала отсортировав карту по типу и используя более сложный алгоритм поиска.

ответил jacwah 26 thEurope/Moscowp30Europe/Moscow09bEurope/MoscowSat, 26 Sep 2015 20:59:06 +0300 2015, 20:59:06

Похожие вопросы

Популярные теги

security × 330linux × 316macos × 2827 × 268performance × 244command-line × 241sql-server × 235joomla-3.x × 222java × 189c++ × 186windows × 180cisco × 168bash × 158c# × 142gmail × 139arduino-uno × 139javascript × 134ssh × 133seo × 132mysql × 132