Сегодня я думал об идее для маленькой игры и наткнулся на то, как ее реализовать. Идея состоит в том, что игрок может сделать серию ходов, которые вызывают небольшой эффект, но если сделать это в определенной последовательности, это вызовет больший эффект. Пока все хорошо, это я умею делать. Очевидно, я должен был сделать это более сложным (потому что мы любим делать это более сложным), поэтому я подумал, что может быть более одного возможного пути для последовательности, которые оба будут вызывать большие эффекты, хотя и разные. Кроме того, часть некоторых последовательностей может быть началом других последовательностей, или даже целые последовательности могут содержаться в других больших последовательностях. Сейчас я точно не знаю, как лучше всего это реализовать. У меня были некоторые идеи.
1) Я мог бы реализовать круговой n-связанный список. Но так как список ходов никогда не заканчивается, я боюсь, что это может вызвать переполнение стека ™. Идея состоит в том, что каждый узел будет иметь n дочерних элементов, и после получения команды он может привести вас к одному из его дочерних элементов или, если ни одна дочерняя группа не будет доступна для такой команды, привести вас к началу. По прибытии на любого ребенка, пара функций будет выполнена, вызывая маленький и большой эффект. Это может, однако, привести к множеству дублированных узлов в дереве, чтобы справиться со всеми возможными последовательностями, заканчивающимися на этом конкретном движении с различными эффектами, что может быть затруднительно, но я не уверен. Я никогда не пробовал что-то такое сложное в коде, только теоретически. Этот алгоритм существует и имеет имя? Это хорошая идея?
2) Я мог бы реализовать конечный автомат. Тогда вместо того, чтобы бродить по связанному списку, у меня был бы гигантский вложенный переключатель, который вызывал бы функции и соответственно обновлял состояние машины. Кажется, проще в реализации, но ... ну ... не кажется забавным ... и не элегантным. Гигантские переключатели всегда кажутся мне безобразными, но будет ли это работать лучше?
3) Предложения? Я хороший, но я далеко неопытный. Хорошая вещь поля кодирования в том, что как бы странно ни была ваша проблема, кто-то решил ее в прошлом, но вы должны знать, где искать. У кого-то может быть идея получше, чем у меня, и я действительно хотел услышать предложения.