Создайте лабиринт в Java, не как сетка (то есть матрица NxN), а как граф - PullRequest
1 голос
/ 19 января 2012

Мне нужно сгенерировать программу, которая состоит из построения лабиринта, где в игре участвуют игроки до 60-70. Дело в том, что я не хочу использовать сетку, потому что я думаю, что это будет тратить слишком много памяти, и сложность этого представления (= сетки) не будет такой простой. Поэтому, подумав, я решил использовать график, где:

  • каждый Room лабиринта будет представлять вершину в графе
  • каждый Connector в лабиринте будет представлять ребро на графике

Разъем может быть: 1. внешняя дверь 2. внешняя комната 3. внешняя стена

Мой вопрос: как я могу построить график из (x, y) координат (во время выполнения я хочу построить лабиринт, пока пользователь вставляет координаты)? Я никогда раньше не работал с графом в Java (или любом другом языке), поэтому мне не очень понятно, как это сделать.

Не могли бы вы объяснить?

EDIT: В игре есть сокровища, и каждый игрок должен получить хотя бы одно сокровище. * Каждый игрок имеет свой собственный шаг в игре (вероятно, что-то вроде очереди приоритетов, которая помогает решить, какой игрок следующий), и каждый игрок, делая свой ход, может двигаться на один шаг в лабиринте.

Ответы [ 2 ]

1 голос
/ 19 января 2012

Вы можете использовать список вершин с Edge Table для определения лабиринта.По сути, ваш список комнат будет вершинами на графике.

List<Room> rooms;  // vertex each room will have an x,y location
boolean[][] edges;     // the columns and row are indexes into rooms

Таким образом, список ребер будет представлять собой матрицу ребер = новая логическая [комнаты.Если комната 1 имеет прихожую, соединяющуюся с комнатой 2, то ребра [1] [2] = true (вы также можете отметить ребра [2] [1] = true).Таким образом, у вас есть комната 1, подключенная к 2, и 2, подключенная к 1.

Для ваших типов соединителей вы можете использовать Enum вместо логического значения.Enum.EXTERNAL_WALL, DOOR, NO_CONNECTION и т. Д.

1 голос
/ 19 января 2012

Итак, вы можете создать класс для узлов, базовый класс для соединителей, который может быть разделен на подклассы для конкретных типов соединителей (или иметь флаг типа), а затем добавить отношения между соединителями и узлами во время выполнения.

Ваше описание немного расплывчато, поэтому этого должно быть достаточно. По сути, в графиках нет ничего особенного (если только вам не нужны действительно большие графики и алгоритмы поиска для них и т. Д., Но сейчас это будет излишним).

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...