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