Я пишу компьютерную версию игры Dominion . Это пошаговая карточная игра, в которой карты действий, карты сокровищ и карты победных очков накапливаются в личной колоде игрока. У меня довольно хорошо развита структура классов, и я начинаю разрабатывать игровую логику. Я использую Python, и я могу добавить простой графический интерфейс с Pygame позже.
Последовательность ходов игроков регулируется очень простым конечным автоматом. Повороты проходят по часовой стрелке, и игрок не может выйти из игры, пока она не закончится. Игра одного хода также является конечным автоматом; в общем, игроки проходят через «фазу действия», «фазу покупки» и «фазу очистки» (в таком порядке). На основании ответа на вопрос Как реализовать пошаговый игровой движок? конечный автомат - стандартная техника для этой ситуации.
Моя проблема в том, что во время фазы действия игрока она может использовать карту действия, которая имеет побочные эффекты, либо на себя, либо на одного или нескольких других игроков. Например, одна карта действия позволяет игроку сделать второй ход сразу после завершения текущего хода. Другая карта действия заставляет всех других игроков сбросить две карты из своих рук. Еще одна карта действий ничего не делает для текущего хода, но позволяет игроку взять дополнительные карты в свой следующий ход. Чтобы сделать вещи еще более сложными, в игру часто добавляются новые дополнения, которые добавляют новые карты. Мне кажется, что жесткое кодирование результатов каждой карты действий в конечный автомат игры было бы и уродливым, и непригодным для использования. Ответ на пошаговый стратегический цикл не идет в уровень детализации, который обращается к проектам, чтобы решить эту проблему.
Какую модель программирования я должен использовать, чтобы охватить тот факт, что общий шаблон смены может быть изменен с помощью действий, выполняемых в ходе очереди? Должен ли объект игры отслеживать эффекты каждой карты действий? Или, если карты должны реализовывать свои собственные эффекты (например, посредством реализации интерфейса), какая настройка требуется, чтобы дать им достаточно энергии? Я придумал несколько решений этой проблемы, но мне интересно, есть ли стандартный способ ее решения. В частности, я хотел бы знать, какой объект / класс / что-либо отвечает за отслеживание действий, которые каждый игрок должен выполнять в результате разыгрываемой карты действий, а также как это связано с временными изменениями в нормальной последовательности действий. конечный автомат.