Я кодирую для NDS в C ++. Я планирую написать игру, в которой события происходят последовательно и меняются в зависимости от выбора игрока, например, дерево решений. Пример:
=== Местоположение ===
=== Последовательность ===
В каждой комнате нажатия клавиш будут постоянно проверяться. Так что это основной и вообще плохой способ кодирования последовательности, о которой я изначально думал:
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
}
}
Некоторые из многих недостатков этого метода:
Итак, вопрос: Какова лучшая альтернатива, которая бы исправила эти недостатки?
Да, я мог написать все в операторе switch и иметь переменную вне функции playGame, которая отслеживала бы местоположение в операторе switch, но структура не кажется читаемой или логичной.
Хм, пахнет как конечный автомат. Ваши штаты называются локациями. Двери — это переходы в другие состояния.
Существует много способов реализации конечных автоматов: switch
& case
, if
Лестница, или справочные таблицы (или map
с).
Для разработки первого или двух состояний я использую switch
или же if
заявления. Однако после второго состояния я обычно преобразую в таблицу поиска.
Таблица поиска позволяет вам добавлять больше состояний без изменения логики состояний или того, что я называю механизмом поиска.
Таблица поиска будет выглядеть примерно так:
+--------+--------------+--------------+-----+
|Present | state for | state for | ... |
| state | transition 1 | transition 2 | ... |
+--------+--------------+--------------+-----+
Одна реализация представляет собой постоянный массив структур. Найдите идентификатор текущего состояния, затем извлеките следующее значение состояния в зависимости от идентификатора перехода. Просто.
Для большего удовольствия вы можете заменить указатели или ссылки на функции для полей (состояний для перехода) (полей). Это позволяет выполнять функции в зависимости от перехода.
Расширяя это, вы можете иметь контейнер таблиц состояний, например, одну таблицу состояний для каждого «игрового уровня».
Попробуйте изменить свою перспективу от ориентированной на исполнение к управляемой данными. Вы можете управлять большей частью игрового стола и иметь небольшой «движок». Хммм, похоже, это можно расширить на использование раскадровок и …
Редактировать 1: Карты & Базы данных
Если вы решили использовать что-то вроде std::map
вам нужно будет разбить таблицу поиска на {key, value}
пар. Один ключ выглядит как настоящее состояние. Значение выглядит как переходные поля. Но ждать, …
Переходы выглядят как контейнер отношений или ассоциаций. Идентификатор перехода связано с идентификатором состояния или функцией состояния. Запах похож на другой стол или карту.
Все эти данные часто называют база данных. Вы могли бы использовать database
содержать ваши состояния. Вау, он будет обрабатывать хранилище и типы данных для вас.
Но я отвлекся. Один шаг за раз…