В последнее время я развлекаюсь, программируя простую текстовую приключенческую игру, и застрял в том, что кажется очень простым вопросом дизайна.
Чтобы дать краткий обзор: игра разбита на Room
объекты. У каждого Room
есть список Entity
объектов, которые находятся в этой комнате. У каждого Entity
есть состояние события, которое представляет собой простую строку-> логическая карта, и список действий, который является строкой-> карта функции.
Пользовательский ввод принимает форму [action] [entity]
. Room
Использует имя лица , чтобы вернуть соответствующий Entity
объект, который затем использует имя действия , чтобы найти правильную функцию и выполняет его.
Чтобы сгенерировать описание комнаты, каждый Room
объект отображает свою собственную строку описания, а затем добавляет строки описания каждого Entity
. Entity
Описание может меняться в зависимости от его состояния ( «Дверь открыта», «Дверь закрыта», «Дверь заперта», и т.д.).
Вот в чем проблема: с помощью этого метода количество описывающих функций и функций, которые мне нужно реализовать, быстро выходит из-под контроля. Одна моя стартовая комната имеет около 20 функций между 5 объектами.
Я могу объединить все действия в одну функцию и переключать их, если это все еще, но это по-прежнему две функции для каждой сущности. Я также могу создавать специальные Entity
подклассы для общих / общих объектов, таких как двери и ключи, но это только доходит до меня.
РЕДАКТИРОВАТЬ 1: По запросу, примеры псевдокода этих функций действия.
string outsideDungeonBushesSearch(currentRoom, thisEntity, player)
if thisEntity["is_searched"] then
return "There was nothing more in the bushes."
else
thisEntity["is_searched"] := true
currentRoom.setEntity("dungeonDoorKey")
return "You found a key in the bushes."
end if
string dungeonDoorKeyUse(currentRoom, thisEntity, player)
if getEntity("outsideDungeonDoor")["is_locked"] then
getEntity("outsideDungeonDoor")["is_locked"] := false
return "You unlocked the door."
else
return "The door is already unlocked."
end if
Функции описания действуют почти одинаково, проверяя состояние и возвращая соответствующую строку.
РЕДАКТИРОВАТЬ 2: пересмотрел формулировку моего вопроса. Предположим, что может существовать значительное количество внутриигровых объектов, которые не имеют общего поведения (реакции на конкретные состояния на конкретные действия) с другими объектами. Есть ли способ, которым я могу определить эти уникальные поведения более понятным и более понятным способом, чем написание пользовательской функции для каждого конкретного действия?