Я прохожу курс разработки игр для бакалавров компьютерной науки, и наш проект состоит в том, чтобы сделать игру XNA. Мы делаем игру в стиле jrpg и придумали классную идею для боя: каждый ход вы ставите в очередь 3 навыка, в зависимости от навыков и выбранного порядка могут применяться различные бонусные эффекты. Мы сделали базовый навык с двумя навыками: атака и огонь.
Вы начинаете с первого навыка, затем стрелки показывают выбранные второй и третий навыки. Ячейки на втором и третьем уровнях показывают эффект, добавленный в этот момент.
Основы: Атака+Атака = Более высокий шанс критического удара для второй атаки. Fire+Attack = Добавляет немного урона от огня к первоначальному урону от атаки. Fire+Fire = применяет статус горения
Сложнее всего, когда вы наносите 3 удара подряд, так как они совершают своего рода специальную атаку. Атака наносит 1/4 шанса критического удара, Огонь наносит двойной урон Огненной атакой (называется Огненный шар).
Реализация этого в операторах if может быть болезненной с большим количеством навыков. Количество операторов if равно сумме n^n от 1 до n, поэтому, если бы мы хотели 6 навыков, нам нужно было бы написать 6+36+216=258 операторов if! Многие из которых также были бы лишними! Это было бы подвержено ошибкам, поскольку нам пришлось бы кропотливо создавать каждый оператор if, чтобы они находились в правильном положении, когда мы кодируем наши блок-схемы.
Вот почему мы подумали, что у нас должны быть некоторые обобщенные комбинации со статическим эффектом, возможно, увеличение счетчика, если он может быть кумулятивным, а затем, когда у нас есть 3 подряд, вызовите функцию, которая имеет специальную атаку этого навыка.
Первое, что пришло на ум, это конечный автомат. Я думаю, он сможет обрабатывать все случаи, кроме особых. Может быть, выталкивающие автоматы? Основная проблема заключается в том, что я понятия не имею, как реализовать их в коде. Класс, в котором я их изучал, был теоретическим.
Существуют ли какие-либо другие более эффективные или простые в написании/кодировании методы?
{norm-bonus, fire-bonus}; {n,f} + fire => {0,f*1.1} + {burn:f}; {n,f} + normal => {n+0.01,f*0.5} + {atk:n*f}
(читай: если применяется огонь, увеличьте модификатор огня на 10% и сделайте немного ожога. Если обычная атака применяется, увеличивает шанс критического удара на 1%, уменьшает эффект огня на 50% и наносит некоторый урон, равный шансу критического удара, умноженному на эффект огня) - person John Dvorak   schedule 15.11.2012