Одним из решений является создание собственного «языка программирования».Вы сохраняете эффект карт в виде строки.Затем вы можете написать некоторый код, который анализирует и интерпретирует строку и изменяет состояние игры в соответствии со строкой.Вот некоторые примеры:
dealer draws 3 if hand < 5
dealer rerollDice 1
opponent loses 3
dealer ignoresRule 3 1
Они означают:
dealer can draw 3 cards if he has less than 5 cards
dealer re-rolls the first dice
opponent loses 3 of his cards randomly
dealer can ignore rule number 3 (whatever that maybe) for one turn
Я придумал здесь довольно простую систему.Первое слово - это то, на кого влияет эффект, второе слово - команда, и все, что после этого, но перед словом if
- параметры команды.
Очевидно, это всего лишь пример.Вы, вероятно, хотите разработать язык так, чтобы он мог использоваться для управления всеми аспектами игры.Хорошее место для начала - взглянуть на свой Player
класс (у вас, наверное, один такой?).Какие методы есть у вашего Player
класса?Это, вероятно, хорошее место для начала.
Создайте классы для «команд», таких как draws
и rerollDice
, и они, вероятно, должны реализовать общий интерфейс, такой как Command
:
interface Command {
void execute(String[] args, GameState state) {
// mutate game state here
}
}
Ваш «язык» также может разрешать несколько заявлений, которые выполняются процедурно.Поэтому вместо создания новой команды с именем drawsAndLoses
:
dealer drawsAndLoses 3 1
// dealer can draw 3 cards but then loses one card randomly
вы можете просто сделать то же самое с двумя «операторами»:
dealer draws 3
dealer loses 1