2014-09-12 1 views
1

Я кодирую NDS в C++. Я планирую писать игру, в которой события происходят последовательно и изменяются в зависимости от выбора игрока, например дерева решений. Пример:Как программировать игру с последовательностью событий

=== Местоположение ===

  • Прихожие: 2 двери игрок может пройти через
  • ванной: Имеет секретный вход в подвал
  • Подвал: ведет обратно в коридор
  • Спальня: Приводит к ванной

=== Последовательность ===

enter image description here

В каждой комнате будут постоянно проверяться нажатия клавиш. Так что это основной и вообще плохой способ кодировать последовательность, которая изначально я думал о:

void drawText() 
{ 
    //writes the specified text to the screen depending on the room 
} 
void playGame() 
{ //This function gets called to play through the whole game 
    drawText(); 
    while(1) 
    { 
     updateKeys(); 
     if (newPress()) //New key is pressed 
     { 
      if (getButtonInt()==BATHROOM_INT) 
       bathroom(); //it will launch the basement function as a subroutine 
      else //Bedroom 
       bedroom(); //it will launch the bathroom function as a subroutine 
      drawText(); 
     } 
     //When returning from room function, the 
    } 
} 

Некоторые из многих недостатков этого метода являются:

  • Near невозможно реализовать мультиплеер, так как все будет необходимо постоянно обновлять
  • Невозможно обновить другие функции (например, ракурс/время Tracker)
  • Добавление опции перехода между комнатами вызовет рекурсию и, возможно, переполнение памяти

Итак, вопрос: Какая лучшая альтернатива, которая устраняет эти недостатки?

Да, я мог бы написать все в инструкции switch и иметь переменную вне функции playGame отслеживать местоположение в инструкции switch, но структура не кажется читаемой или логической.

+0

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

+0

Исследование «государственного» шаблона проектирования или конечного автомата. Ваша диаграмма выглядит как рисунок конечного автомата с переходами. –

+0

Исследование «учебник по реляционной базе данных» и «нормальные формы базы данных». Это может помочь вам позже. –

ответ

4

Хммм, пахнет государственной машиной. Ваши состояния называются местоположениями. Двери переходят в другие государства.

Есть много способов реализации автоматов: switchcase &, if лестницы или таблица поиска (или map ы).

Для разработки первого одного или двух состояний я использую switch или if заявления. Однако после второго состояния я обычно конвертирую в таблицу поиска.

Таблица поиска позволяет добавлять больше состояний без изменения логики состояния или того, что я называю механизмом поиска.

Эта таблица будет выглядеть примерно так:

+--------+--------------+--------------+-----+ 
|Present | state for | state for | ... | 
| state | transition 1 | transition 2 | ... | 
+--------+--------------+--------------+-----+ 

Одна реализации является постоянным массивом структур. Найдите текущий идентификатор состояния, затем вытащите следующее значение состояния в зависимости от идентификатора перехода. Просто.

Для получения дополнительной информации вы можете заменить указатели или ссылки на функции для полей «состояния для перехода» (поля). Это позволяет выполнять функции в зависимости от перехода.

Расширяя это, вы можете иметь контейнер таблиц состояний, например, одну таблицу состояний для каждого «игрового уровня».

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

Edit 1: Карты & Базы данных
Если вы хотите использовать что-то вроде std::map, вам нужно разбить таблицу подстановки в {key, value} пары. Один ключ выглядит как настоящее состояние. Значение выглядит как переходные поля. Но подождите, ...

Переходы выглядят как контейнер отношений или ассоциаций. Идентификатор перехода связан с с идентификатором состояния или функцией состояния. Запах похож на другой стол или карту.

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

Но, я отвлекся. Один шаг за раз ...

+0

Определенно конечный автомат. Не забудьте «действие для перехода в состояние 1» и т. Д. –

Смежные вопросы