Зачем использовать древовидную структуру данных для представления данных в текстовой приключенческой игре? - PullRequest
7 голосов
/ 11 марта 2012

В качестве задания для моего модуля C ++ я должен создать текстовую приключенческую игру.Проблема, с которой я сталкиваюсь, является концептуальной;все говорят, что я должен использовать древовидную структуру данных для представления своей игры.Чего я не понимаю, так это почему .

Допустим, у меня есть дом из 4 комнат.Мы можем представить это как массив 2х2.В каждой комнате у меня есть два объекта.Я хочу отобразить эти данные таким образом, чтобы я мог легко перемещать своего персонажа от 0x0 до 0x1 в любую сторону (прямо - 1 шаг или косвенно - 3 шага), одновременно неся при себе один объект.

Почемулучше ли использовать дерево для хранения всех данных и как мой персонаж будет перемещаться из одного узла в другой?Или персонаж тоже узел?Разве мой персонаж не должен быть объектом со списком в качестве инвентаря?

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

Предложение было для карт.Но тогда я не понимаю, как мой персонаж будет «ориентироваться» на карте.

Ответы [ 3 ]

10 голосов
/ 11 марта 2012

Если ваш «дом» является сеткой, и вы можете перейти от любой ячейки сетки к любой другой ячейке сетки, массив в порядке. Я предполагаю, что ваши сверстники намекают на то, что вы можете не захотеть перемещаться из любой комнаты в любую соседнюю комнату (а также НЕ иметь возможности перемещаться, скажем, от 0,0 до 42,13).

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

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

псевдокод

class Room
{
    string Name;
    string Description
    List<Room> ConnectedRooms;
}

Тогда при представлении персонажа

class Character
{
    string Name;
    Room CurrentRoom;
}

Чтобы увидеть, куда данный персонаж может перейти:

List<Room> availableRooms = myCharacter.CurrentRoom.ConnectedRooms;
9 голосов
/ 11 марта 2012

То, что вы ищете, это не дерево, а график.

Причина, по которой это предпочтительнее, состоит в том, что массив "мест" не обязательно представляет то, что вы хотите. Между всеми смежными комнатами не обязательно есть дверь, поэтому вы не сможете перейти непосредственно из одной в другую. В то же время, в типичном текстовом приключенческом типе игры у вас могут быть коридоры (или что-то в этом роде), которые ведут вас более или менее прямо из одной комнаты в другую, которая не совсем (или даже близко) не соседствует. Кроме того, у вас могут быть односторонние переходы, которые доставят вас из одного места в другое, но вы не можете развернуться и вернуться назад. Все это легко представить с помощью ориентированного графа, но трудно представить с помощью массива.

0 голосов
/ 11 марта 2012

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

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

Подумайте о конечных автоматах и ​​автоматах.

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