Void & Ender_Dragon
Я тут как раз билдом для вечеринки в D&D 5e вожусь, он на идеальном тайминге и скрытности держится – прям как комбо у плута. Как бы ты к оптимизации этого подошел с точки зрения программирования?
Сначала представь каждый ход как небольшую функцию, возвращающую новое состояние: позиция инициативы, уровень скрытности, бонус к атаке и все отложенные действия. Потом создай конечный автомат, который отслеживает порядок ходов партии, записывая, кто сейчас действует и какие ресурсы у него остались. Используй поиск в ширину или A*, чтобы перебрать все возможные последовательности, отбрасывая состояния, которые уступают по всем параметрам. Кэшируй результаты с использованием мемоизации, чтобы избежать повторных вычислений идентичных подсостояний. Ну и в конце обязательно профилируй симуляцию: если она тормозит, переходи от списков к плотным массивам или используй битовые маски для флагов, чтобы сэкономить миллисекунды на каждом шаге.
Отлично, как раз так я бы и написал оптимизатор для пошаговой системы. Минимум состояния, понятный автомат состояний, а дальше – BFS или A*, и кэширование, чтобы симуляция не взорвалась. Этот трюк с битовой маской в конце – идеальный компромисс между скоростью и читабельностью. Думал, как будешь обрабатывать случайные критические удары в графе состояний?
Относишься к критическому удару как к еще одной ветке в графе. На каждом шаге атаки разделяешь состояние на два: обычный удар и критический, с учетом вероятности крита. Развиваешь каждую ветку дальше, а при оценке узла — суммируешь результаты по вероятностному среднему (значение, умноженное на вероятность). Так граф остается управляемым, при этом учитываешь случайность. Если вероятность крита низкая, можно даже отсекать маловероятные ветки через несколько ходов.
Вот как надо моделировать удачу – ветвление и вес, а потом коллапс с ожиданием. Буду следить за ростом ветвей; если шанс критического удара останется ниже процента, смогу жёстко их подрезать через пару ходов. Это не позволит пространству поиска разрастаться, сохраняя при этом вероятность.
Звучит неплохо. Следи за порогами обрезки, чтобы получилась стройная модель, но при этом она по-прежнему ловила редкие, но важные критические события. Только не забудь сверить вероятности с исходной таблицей, чтобы избежать перекоса.
Понял, буду держать порог строгим и ещё раз перепроверю таблицы критических значений, чтобы вероятности сходились. Так, хоть и плотно, но редкие, но мощные удары всё равно будут проходить.
Записывай просто сколько веток, и если вдруг увидишь какие-то резкие скачки – прокрути назад и подправь алгоритм обрезки. Так модель и стабильной будет, и симуляцию не усложним.
Записывать количество веток – хороший способ убедиться, что всё в порядке. Если что-то взлетит, я активирую логику обрезки и подкорректирую её. Так модель остаётся компактной и точной, без лишнего шума.