PlayPendium
Bulwark · Пища для размышлений

Как думает военачальник

Играйте в одиночку — и три замка из четырёх обороняет машина. Каждый компьютерный военачальник крутит один и тот же короткий цикл: найти мяч, которого стоит бояться, угадать, где он пересечёт твою стену, скользнуть ему навстречу, — а вся разница между тюфяком и угрозой сводится к четырём числам.

Лёгкий · дрожь прицела 0,18 доли рельса погрешности
против
Сложный · дрожь прицела 0,015 почти безупречное наведение

Написано и отредактировано на английском языке. Эта русская версия создана машинным переводом; там, где важна точность, авторитетным остаётся английский оригинал. Читать оригинал на английском →

01 · Выбор того, чего бояться

Не всякий мяч — угроза

Первое дело военачальника, сто двадцать раз в секунду, — сортировка. Когда по арене гуляет до двух мячей, ИИ должен решить, какой из них достоин его щита. Он оценивает каждый активный, никем не удерживаемый мяч по расстоянию до собственного короля, а затем вычитает постоянную скидку в 250 единиц у всякого мяча, который и вправду летит к углу: с мячом, уходящим прочь, обращаются так, будто он на 250 единиц дальше, чем на самом деле. 1 Наименьшая оценка получает внимание щита.

В итоге получается защитник, который не паникует из-за мяча, безобидно пролетающего мимо, но мгновенно цепляется за тот, что и ближе, и летит на него. Это грубая модель того, что человек делает не думая: следи за тем, что летит в тебя, не обращай внимания на то, что улетает. Всё суждение — одно скалярное произведение скорости мяча и направления на короля: положительное значит «нацелен на меня», и этого довольно.

02 · Догадка о том, где он окажется

Упреждение мяча на рельсе

Выбрав угрозу, военачальник должен решить, где именно быть на своём диагональном рельсе. Он не просчитывает весь путь отскоков — никакой трассировки отражений, никаких прогнозов от стен. Он берёт положение мяча, подталкивает его на короткий шаг вперёд вдоль текущей скорости (упреждение в 0,12 секунды) и проецирует эту будущую точку прямо на рельс, получая целевую долю между 0 и 1. 1

Это намеренно неглубокое предсказание, и именно поэтому ИИ можно обыграть. Поскольку он упреждает лишь на восьмую долю секунды и никогда не предвидит рикошета, мяч, который придёт через отскок от стены, его обманывает: он связывает себя тем, куда мяч смотрит сейчас. Человек, отбивающий броски от краёв арены, пользуется ровно этим слепым пятном. Машина реагирует на настоящее с волосок предвидения; она не планирует.

Компьютер не вычисляет будущее мяча. Он подаётся на восьмую долю секунды вперёд, наводит щит туда, где мяч оказался бы, если бы ничто не вмешалось, и позволяет всему, что вмешивается, стать вашей возможностью.

03 · Три уровня, четыре ручки

Сложность — это таблица, а не переписывание

Все три сложности используют одно и то же тело кода. Между лёгкой, средней и сложной меняется лишь строка из четырёх настроечных чисел. 1 Дрожь добавляет к цели щита случайную погрешность, так что прицел лёгкого военачальника гуляет почти на пятую часть его рельса, а у сложного он почти точен. Дистанция реакции задаёт, насколько близко должен подойти мяч, прежде чем военачальник вообще станет его отслеживать: лёгкий не замечает ничего дальше 420 единиц от своего короля — чуть меньше половины ширины поля; сложный отслеживает мяч через всю арену. Шанс перехвата — вероятность того, что он поймает мяч, подошедший к его щиту достаточно близко, чтобы быть пойманным. А прицел по соперникам — единственный переключатель, решающий, играет ли военачальник в нападении вообще.

Таблица настроек ИИ — вся разница между уровнями
РучкаЛёгкийСреднийСложный
Дрожь прицела (доли рельса)0.180.070.015
Дистанция реакции (единицы)4207002,000
Шанс перехвата0%25%55%
Целится в соперников?нетнетда

Все четыре значения берутся из одной маленькой настроечной таблицы внутри игрового движка Bulwark — по строке на уровень. Дистанция реакции на сложном записана как удвоенная ширина арены, а арена — квадрат со стороной 1 000 единиц, так что 2 000 единиц означают «отслеживает всегда». 1

04 · Когда машина нападает

Единственный переключатель, делающий сложного военачальника опасным

Лёгкий или средний военачальник никогда не ловит мяч с намерением ударить. Лёгкий не ловит его вовсе, а средний — лишь изредка, не имея никакого плана на то, что делать с мячом, когда тот у него окажется. Щёлкните переключателем прицела по соперникам — тем, что есть только у сложного уровня, — и ИИ перестаёт быть чисто реактивным. Удерживая мяч, он оглядывает поле, выбирает самого израненного соперника (того, у кого осталось меньше всего кирпичей) и целится туда. 1

Делает он это безо всякого поиска пути. Он перебирает одиннадцать возможных положений вдоль собственного рельса и для каждого воспроизводит расчёт выпуска, заложенный в движке, чтобы увидеть, в каком направлении полетел бы такой бросок, а затем оставляет то положение, чей исходящий вектор смотрит точнее всего на выбранную жертву. 1 Это перебор горстки вариантов, а не хитроумие, но перебор терпеливый: выбрав точку, военачальник удерживает мяч, пока щит и вправду туда не доедет, и отпускает лишь тогда, когда тот прибыл или когда удерживал так долго, что дальнейшее ожидание обойдётся дороже, чем стоит сам бросок. Умысел безошибочно стратегический — ровно то, что сделал бы человек, охотящийся за лёгкой добычей. Выбор цели по принципу «меньше всего кирпичей» наводит трёх независимых защитников на того, кто и так уже проигрывает.

05 · Тот же военачальник, каждый раз

Случайность, которую можно проиграть заново

Всё «случайное», что делает военачальник, — дрожь прицела, подбрасывание монетки насчёт перехвата — берётся из генератора с зерном, компактной процедуры, известной как mulberry32, которая превращает одно начальное число в длинный воспроизводимый поток псевдослучайных значений. 2 Дайте ей то же зерно — и она навсегда выдаст ту же последовательность. Живой матч берёт зерно из часов, так что никакие две партии не начинаются одинаково; но верните то же зерно — и матч пройдёт заново в точности так же: те же углы запуска, та же дрожь, те же перехваты.

Этот детерминизм — не косметическая подробность. Именно он делает игру проверяемой: её набор тестов играет целые матчи компьютера против компьютера от фиксированного зерна и ожидает всякий раз один и тот же результат. И именно он позволяет упаковать всю симуляцию — вместе с курсором генератора — в JSON и собрать заново, так что в сети ведущий может передавать своё состояние потоком, а каждый из остальных игроков восстанавливает у себя точно такое же поле. Военачальники кажутся живыми, потому что их ошибки выглядят человеческими; а под этим их «инстинкты» — короткая арифметическая рекуррента, которую кто угодно может отмотать к началу. Машине, стерегущей замок, как выясняется, нужно лишь несколько чисел и поток воспроизводимой удачи. 2

Sources & notes
  1. Bulwark game engine: the warlord AI. Threat scoring (distance from a ball to the king, minus a 250-unit bonus for inbound balls), the 0.12-second lead used to project the intercept point, the tuning table that holds jitter, react distance, catch chance and the aim-at-rivals switch for each tier, the “most wounded rival” target selection, and the eleven-sample search over release positions. Read from the game's own source.
  2. Bulwark game engine: the deterministic random generator, an implementation of mulberry32, the compact public-domain algorithm by Tommy Ettinger that maps a 32-bit seed to a repeatable stream. Its own comment notes that it seeds ball launches and AI jitter so that games are reproducible and testable, and it can save and restore its cursor so the state round-trips through JSON. Read from the game's own source.
    Algorithm origin: Tommy Ettinger, “Mulberry32 PRNG” (public domain).
Was this worth reading?
Play Bulwark
PlayPendium · About · Contact · Privacy · Terms · Cookies · Accessibility · Copyright · Browse all games · Classic arcade games · © 2026