Salvo · Пища для размышлений
За простыми щелчками по клеткам скрывается детерминированный движок, который моделирует спрятанные флоты, рассуждения с учётом вероятностей и классический поединок маскировки и поиска. 3
Написано и отредактировано на английском языке. Эта русская версия создана машинным переводом; там, где важна точность, авторитетным остаётся английский оригинал. Читать оригинал на английском →
В основе игры лежит пара полей: одно представляет вашу скрытую позицию, другое — скрытую позицию соперника. На каждом поле стоит флот кораблей, расставленных на расчерченной сетке, но их положение скрыто от другой стороны. Вы стреляете по сетке противника, ИИ — по вашей, и каждый выстрел либо попадает в корабль, либо уходит в пустую воду. Такая архитектура с двумя полями задаёт фундаментальную информационную асимметрию поединка скрытых флотов: каждая сторона полностью знает своё поле, но о расстановке соперника может лишь догадываться по картине собственных выстрелов. 3
Именно симметрия этой схемы придаёт игре её характер. Ни одна сторона не видит кораблей другой напрямую. Вместо этого обеим приходится строить мысленную модель скрытой сетки по скупым сигналам попаданий и промахов. Каждый выстрел становится данными, каждое попадание сужает круг возможностей, а каждый промах исключает часть территории из рассмотрения. Игровой координатор движка управляет обоими полями: следит, чтобы выстрелы записывались, попадания засчитывались правильно, а партия заканчивалась лишь тогда, когда потоплен весь флот одной из сторон. 3
Перед началом игры движок расставляет корабли ИИ случайным образом. Эта случайность не произвольна: она задаётся начальным значением (seed), а значит, одно и то же значение всегда даёт одну и ту же расстановку. Такой детерминизм — сознательное проектное решение, благодаря которому игру можно воспроизводить и тестировать. Запустив игру с тем же seed, вы получите ту же расстановку кораблей, ту же последовательность решений ИИ и — если сделаете те же ходы — тот же исход. Это свойство ценно для отладки и для понимания того, как ИИ ведёт себя в разных условиях. 3
Когда флот расставлен, правила игры фиксированы и детерминированы. Там, где ИИ всё-таки выбирает случайно — разрешая ничью между одинаково хорошими клетками или решая, провести ли разведку сонаром, — он берёт значения из того же генератора с начальным значением, так что ничего не остаётся на волю внешнего случая. Каждое решение ИИ вытекает из вероятностной модели, которую он поддерживает, а каждый ваш выстрел записывается и анализируется. Помимо ваших собственных решений, единственный источник разнообразия — seed, определяющий начальную расстановку флота. Значит, в конечном счёте игра — это головоломка: сумеете ли вы, опираясь на правила и отклик на выстрелы, вычислить скрытую расстановку раньше, чем ИИ вычислит вашу? 3
Когда вы стреляете, движок отмечает выстрел на целевом поле и проверяет, попадание это или промах. Этим занимается один шаг движка: он обновляет состояние поля и определяет результат. Попадание помечает клетку как занятую кораблём, промах — как пустую воду. Затем движок проверяет, потоплен ли корабль, которому принадлежит эта клетка, перебирая все его клетки. Если поражены все клетки корабля, он потоплен, и об этом сообщается обеим сторонам. 3
Условие победы простое, но весомое. Сторона побеждает, когда потоплены все корабли соперника. Движок проверяет это, смотря, поражён ли полностью каждый корабль на поле противника. Как только условие выполнено, игра сразу заканчивается. Поскольку победа достаётся по принципу «всё или ничего», важен каждый выстрел. А то, что каждая сторона выдаёт сопернику, задано правилами: о каждом потоплении объявляется вместе с названием ушедшего на дно корабля, так что другая сторона точно знает, какие корпуса ещё на плаву, а раненый корабль, ускользнувший благодаря перестановке, доступной раз за партию, оставляет след: попадания в его прежние клетки снова превращаются в обычные промахи. 3
Соперник в этой игре — не просто стрелок наугад. Это ИИ с вероятностным наведением, который оценивает, насколько вероятно, что в каждой скрытой клетке стоит корабль. ИИ поддерживает вероятностную модель сетки противника и обновляет её по мере выстрелов и полученных откликов. Клетки, где корабля быть не может из-за ограничений на размещение оставшихся кораблей, помечаются как маловероятные, а клетки, которые обязательно должны быть заняты, чтобы оставшиеся корабли поместились, — как вероятные. Затем ИИ стреляет в клетку с наибольшей вероятностью, превращая слепое угадывание в осмысленный поиск. 3
Эта вероятностная модель опирается на математику правдоподобия, где события описываются числами от нуля до единицы 2. Вероятность, равная нулю, означает, что событие произойти не может, а вероятность, равная единице, — что оно обязательно произойдёт. ИИ использует эти числовые описания, чтобы направлять выстрелы, отдавая предпочтение клеткам, где шанс найти корабль выше всего. Именно этот подход отличает ИИ от чисто случайного стрелка и придаёт ему характерную охотничью манеру.
Поведение ИИ можно описать двумя фазами: поиск и добивание. В фазе поиска ИИ ищет корабли, стреляя в клетки, где ещё не обнаруженные корабли вероятнее всего стоят. Это широкий поиск, цель которого — первый контакт с кораблями противника. Как только засчитано попадание, ИИ переходит в фазу добивания и сосредотачивается на соседних клетках, чтобы потопить этот корабль. Такой двухфазный подход повторяет то, как играют люди: сначала найти корабли, потом их потопить. 3
Переход между поиском и добиванием зависит от того, был ли последний выстрел попаданием или промахом. Если последний выстрел прошёл мимо, ИИ возвращается в режим поиска и ищет клетки с наибольшей вероятностью. Если он попал, ИИ переходит в режим добивания и стреляет по клеткам, соседним с попаданием. Это простое правило вместе с вероятностной моделью образует связную стратегию, уравновешивающую исследование и использование. ИИ исследует сетку, чтобы найти корабли, и использует знание о попадании, чтобы эффективно потопить корабль. 3
У ИИ три уровня сложности, которые настраивают его поведение. Они влияют на то, как ИИ взвешивает вероятности и принимает решения. На низких уровнях ИИ может чаще ошибаться или менее напористо добивать цели. На высоких он последовательнее в вероятностных расчётах и беспощаднее в добивании. Такое разнообразие позволяет игрокам подобрать подходящий уровень сложности — от непринуждённой игры до серьёзного соперничества.
Конкретная реализация этих уровней находится в ИИ-компоненте движка. Уровни сложности меняют то, как ИИ интерпретирует вероятностную модель и как соотносит исследование с использованием. Благодаря этому ИИ может быть доступен новичкам и труден для опытных игроков, не меняя базовой механики игры. 3
Поверх классических правил есть особый ход — импульс гидролокатора. Он позволяет стороне открыть участок сетки противника размером 3×3 ценой выстрела в этом ходу. Импульс показывает для каждой клетки области 3×3, стоит ли в ней корабль или это пустая вода. Такие сведения могут оказаться бесценными для поиска кораблей, но платить за них приходится потерей выстрела в этом ходу. 3
Решение применить гидролокатор — стратегическое. Когда информация стоит своей цены? Если вам никак не удаётся найти корабли, импульс может дать нужный прорыв. Если вы близки к тому, чтобы потопить корабль, потеря выстрела может обойтись слишком дорого. Гидролокатор добавляет в игру элемент управления ресурсами, заставляя игроков соизмерять ценность информации с ценностью действия. 3
Ещё одно отступление от классических правил — перестановка, доступная один раз за игру. Каждая сторона может однажды за партию переместить один из своих кораблей. Этот защитный манёвр не стоит хода: вы можете переставить корабль и всё равно выстрелить в свой ход. Перестановка позволяет увести корабль из-под удара или перевести его на более защищённую позицию. 3
Перестановка доступна лишь один раз, и потому драгоценна. Когда ею воспользоваться? Если корабль вот-вот потопят, перестановка может его спасти. Если вы уверены в своей нынешней позиции, она, возможно, будет потрачена впустую. Решение о перестановке — стратегическое, оно требует тщательно взвесить текущее положение в партии и вероятные действия соперника. 3
В основе всех этих механик лежит классическое правило: один выстрел за ход. Каждая сторона делает ровно один выстрел, и стороны ходят по очереди. Это правило задаёт ритм игры и гарантирует обеим сторонам равные возможности действовать. Именно правило одного выстрела за ход делает игру поединком умов, а не гонкой на скорость. 3
Это классическое правило укореняет игру в традиции «Морского боя» (Battleship) — стратегической игры на угадывание для двух игроков на расчерченных сетках, где флот каждого игрока скрыт от соперника 1. Правило одного выстрела за ход делает игру проверкой дедукции и вероятностного мышления, а не реакции. Правило простое, но именно оно придаёт игре её характер и её сложность.
Движок чист и детерминирован: им управляет собственный генератор псевдослучайных чисел с начальным значением (seed). Это значит, что каждый аспект игры определяется значением seed, заданным в начале. При одном и том же seed игра всегда порождает одну и ту же последовательность событий — от начальной расстановки флота до последнего выстрела. Это свойство делает игру тестируемой: один и тот же сценарий можно воспроизвести и изучить. 3
Детерминизм с начальным значением помогает и понимать игру. Если вы хотите разобраться, как ИИ ведёт себя в определённой ситуации, можно запустить игру с конкретным seed и посмотреть на результат. Если хотите проверить определённую стратегию, можно сыграть несколько раз с одним и тем же seed и увидеть, как она работает. Такая воспроизводимость ценна и для игроков, и для разработчиков.