Карта повреждений

Карта повреждений

> Программирование

Благодаря оценке движений и управлению комбинациями атак карта повреждений очень важна в LeekWars. Основная цель состоит в том, чтобы иметь возможность оценить, в зависимости от противника, уровень опасности каждого ящика, чтобы иметь возможность отступить к ящику с меньшей опасностью в конце хода. Самый простой способ — создать ассоциативный массив: dangerMap=[ cell1:danger1 , cell2:danger2 , ... ], возможно, ограниченный вашими доступными ячейками. Для этого возможно несколько алгоритмов

"Наивный" алгоритм

Обычно это первое, что приходит в голову при создании алгоритма оценки опасности. Идея заключается в следующем:

/*

-за каждого соперника -за каждую доступную ячейку соперника -за оружие каждого противника -если он может стрелять в мою камеру из своей камеры добавить "оценку опасности" в мою камеру */

Выбор оценки — неотъемлемая часть вашего алгоритма: вы можете поставить в ней «+1», либо подсчитать потенциально наносимый урон,… Способов уточнить эту оценку столько же, сколько игроков 😉

Большая проблема этого алгоритма в том, что он очень жадный в операциях! Поэтому, как правило, необходимо оптимизировать его очень быстро.

Следы оптимизации

Первое, что нужно сделать, это предотвратить «сбой» вашего лука-порея... Поэтому вам нужно где-то в коде выполнить тест на getOperations() и выйти из цикла, если количество операций становится слишком близким к предел: у вас будет только частичная оценка опасности, но ваш лук-порей все равно сможет двигаться минимум 😉

Что касается самой оптимизации, то одним из первых принципов, которым следует руководствоваться при вашем подходе, является, прежде всего, избежание повторения одних и тех же операций несколько раз в циклах: в этом случае лучше подготовить все в таблицах, а затем запомнить. Так, например, в самом внутреннем цикле, который вычисляет «оценку опасности», если вы вставите в него вызов getStrength(Enemy), вы вызовете эту функцию тысячи раз. Идея состоит в том, чтобы рассчитать силу врага только один раз и сохранить ее в переменной перед выполнением внутренних циклов. Вы уже начнете зарабатывать несколько сотен тысяч сделок! Поэтому ищите элементы «внутренних» циклов, которые не зависят от переменной цикла, а только от «внешнего» цикла: затем вы можете проследить эти элементы до их цикла.

Если ваш алгоритм остается дорогим, еще один довольно эстетичный способ оптимизации — понизить разрешение этой оценки. Вы можете, например, тестировать не все доступные клетки (свои и/или соперника), а, например, только те, которые требуют четного количества очков движения. Затем «достаточно» заполнить пробелы, полученные интерполяцией значений на соседних квадратах (среднее значение соседей, максимум соседей, максимум среднего значения между двумя линиями и т. д.). Этот подход менее точен, но на примере даже ПМ потребляет примерно в 4 раза меньше, чем первый алгоритм.

Чтобы продолжить оптимизацию, вам придется подумать о предварительном вычислении вещей, обычно в первом раунде, хранении в больших (или многих) массивах определенных вещей, которые вам нужно пересчитать и которые никогда не меняются, или даже обновлении обновления определенных значений каждый ход (в нашем примере сила вражеского лука-порея).

Алгоритм "раз и навсегда"

Этот алгоритм предварительно вычисляет карту опасности один раз в начале боя. Недорогой, он гораздо менее точен, но позволяет быстро получить список областей боевой карты, которые в целом опасны. Он заключается в оценке в начале хода для каждой клетки боевой карты всех ячеек, позволяющих стрелять в нее из того оружия, которое есть у врага(ов): квадрат, в который можно попасть только из 5 другие квадраты будут иметь счет намного ниже, чем квадрат, достижимый 200 другими квадратами! Может быть разумно попытаться отступить в районы с «низкой опасностью» и заставить противника оставаться в районах с «высокой опасностью».