Я разрабатываю сетевую пошаговую стратегическую игру для космического флота 3D-6DOF, которая в значительной степени зависит от настройки корабля. Позвольте мне немного объяснить игру, так как вам нужно немного узнать об этом, чтобы задать вопрос.
То, к чему я стремлюсь, - это возможность создавать свой собственный флот судов с нестандартными формами и прикрепленными модулями (пропеллеры, балки трактора ...), которые давали бы преимущества и недостатки для каждого корабля, поэтому у вас есть множество различных распределений флота. Например, длинный корабль с двумя гребными винтами в стороне позволил бы кораблю легко вращаться вокруг этой плоскости, большие корабли будут двигаться медленно, если вы не разместите много гребных винтов сзади (следовательно, тратя больше «строительных» точек и энергии при движении, и это будет только быстро двигаться в этом направлении.) Я планирую сбалансировать всю игру вокруг этой функции.
Игра будет вращаться вокруг двух фаз: приказов и фазы боя. На этапе заказов вы командуете различными кораблями. Когда все игроки заканчивают фазу заказов, начинается фаза боя, и заказы кораблей на некоторое время решаются в режиме реального времени, затем действие приостанавливается, и начинается новая фаза заказов.
Проблема возникает, когда я думаю о входе игрока. Чтобы перемещать корабль, вам нужно включать или выключать разные гребные винты, если вы хотите управлять, двигаться вперед, тормозить, вращаться на месте ... Эти гребные винты не должны работать на полную мощность, чтобы вы могли добиться большего движения комбинации с меньшим количеством пропеллеров.
Я думаю, что такой подход немного скучен. Игрок не хочет возиться с моторами или чем-то еще, вы просто хотите ПЕРЕМЕЩАТЬ и УБИТЬ. Я собираюсь дать игроку команду на эти корабли по назначению и повороту , а затем ИИ рассчитает правильную мощность пропеллера для достижения этого движения и вращения. Привод не обязательно должен быть одинаковым на протяжении всего расчета хода (после того, как были отданы приказы), поэтому было бы здорово, если бы корабли реагировали на движение, регулируя мощность винтов для своих нужд динамически, но это может быть слишком сложно для реализации, и это не нужно для работы игры.
В обоих случаях, как этот ИИ решит, какие винты активировать для достижения наилучшей (или, по крайней мере, не худшей) траектории?
Я подумал о некоторых подходах:
- Изучение ИИ: Типы кораблей узнают об их движении методом проб и ошибок, корректируют свое поведение с большим использованием и, наконец, становятся «умными». Я не хочу увлекаться ТАКИМ программированием ИИ, и думаю, что это может расстроить игрока (даже если вы можете позволить ему учиться без игры).
- Предварительно рассчитанное движение временного шага: После создания корабля ВСЕ возможные перемещения рассчитываются для каждой конфигурации винта и мощности для заданного времени дельты. Память интенсивная, некрасивая, плохая.
- Предварительно рассчитанные траектории: то же, что и выше, но не для каждого дельта-времени, а для всей траектории, которая затем будет установлена в максимально возможной степени. Требует фиксированной конфигурации пропеллера для всей фазы боя и все еще требует большого объема памяти, безобразного и плохого.
- Непрерывное грубое принуждение: ИИ непрерывно проверяет ВСЕ возможные конфигурации винта на протяжении всей фазы боя, рассчитывает несколько временных шагов и решает, какой из них является наилучшим, основываясь на этом. Против: то, что хорошо сейчас, может быть не так хорошо позже, и это слишком интенсивно использует процессор, уродливо и тоже плохо.
- Одиночное перебор: То же, что и выше, но только перебор в начале симуляции, поэтому ему требуется постоянная настройка пропеллера на протяжении всей фазы боя.
- Непрерывная проверка угла: это не метод полного движения, но, возможно, способ отбросить «глупые» конфигурации гребных винтов. Учитывая текущий вектор нормального винта и окончательный, вы можете приблизить мощность, необходимую для винта, на основе угла. Вы должны делать это непрерывно на протяжении всей фазы боя. Я понял это недавно, поэтому я не слишком много думал. Априори, у него есть недостаток «что хорошо сейчас, может быть, не так хорошо потом», и ему нет дела до других гребных винтов, которые могут действовать вместе, чтобы создать лучшую конфигурацию движения.
Я действительно застрял здесь. Есть идеи?