Dagaz: Пинки здравому смыслу (часть 2)

в 8:50, , рубрики: game development, настольные игры, шахматы, шашки

imageПравила, особенно такие сложные, как рокировка или "взятие на проходе", не появляются на пустом месте. Никто не придумывает их просто так, чтобы позлить разработчика (во всяком случае, я надеюсь на это). В таких «устоявшихся» играх как Шахматы или Шашки, каждое из правил выстрадано десятилетиями. Тысячами игр, в десятках стран, по всему миру. Это бесценный материал для анализа. Неудачные решения отмирают, успешные — расцветают в сотнях различных вариантов (среди которых также есть как удачные, так и не очень). Сегодня, мы поговорим о двух особенно удачных находках... 

9. Превращения и сброс

Во многих играх есть фигуры, которые движутся «только вперёд». Это очень хорошее дизайнерское решение, не позволяющее фигурам «топтаться на месте», а также обостряющее борьбу сторон (поскольку это самое «вперёд», обычно, расположено на территории противника). Но что делать с фигурами дошедшими до конца своего пути? Одним из возможных решений является перерождение фигуры, с обретением ей новых свойств. Часто, появление в игре таких превращённых фигур переводит её на принципиально новый уровень. Хорошим примером является превращение в «дамку» обычной «шашки» в такой игре как "Русские шашки".

Итальянский вариант
Своё виденье игры предложили итальянцы. Их дамка почти ничем не отличается от английской, но не может быть «съедена» обычной фигурой. Сила её статуса в неприкосновенности. Одолеть её может лишь равная фигура. Конечно, привилегированное положение дамки не мешает ей «разбираться» с обычными фигурами. Этот вариант игры, по всей видимости, унаследовал правило «неприкосновенности» дамок от более древней итальянской игры Damone, в которой иерархические отношения были еще более сложными (помимо обычных дамок, в игре присутствовал «Император»). Как всегда, правила игры могут очень многое рассказать о её создателях.

В отличии от английского варианта, в котором дамки получают лишь возможность хода (в том числе со взятием) назад, появление «летающей» дамки в «Русских шашках» буквально взрывает игру. Благодаря своей манёвренности, она превращается в настоящее «оружие судного дня», с устрашающей эффективностью «вырубая» толпы обычных шашек. Противник, не имеющий дамок в своём арсенале, обречён на поражение. Плохим моментом, является то, что даже при наличии дамок на своей стороне, поймать одиночную дамку противника можно далеко не всегда. Обилие возможных «ничейных» результатов, конечно, не идёт на пользу игре. Предоставляя фигуре супервозможности, важно не перестараться.

Кстати говоря

Имеется очень интересный способ борьбы с «ничейной смертью» русских шашек. Дело в том, что дальнобойная дамка становится неуязвимой лишь на главной диагонали доски. Если дамке удалось «встать на большак» одолеть её не смогут даже три дамки противника (в противном случае, им поможет "треугольник Петрова"). Если главная диагональ даёт дамке такую силу, почему бы не лишить доску главной диагонали? Простое добавление к доске ещё двух вертикалей решает проблему.

Другой подход можно почерпнуть в "Тайских шашках". В этом варианте игры, дамка сохраняет свою дальнобойность, но обязана останавливаться на следующем свободном поле, после «битой» фигуры. Такую дамку могут одолеть всего лишь две дамки противника (независимо от её расположения на доске).

В играх шахматного семейства, главный кандидат на превращение — безусловно пешка. Не во всех шахматных играх пешка превращается в другую фигуру. В Сянцы, например, «перейдя через реку» и оказавшись на территории противника, она лишь получает возможность хода по горизонтали, в том числе, со взятием (в корейской Чанги, пешка изначально имеет такую возможность). Ещё более причудливым образом изменяются правила хода пешки в Алтай Шатра:

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

Ходы пешки, в этой игре, определяются не статусом фигуры, а лишь её расположением на доске, но в отличии от Сянцы, в Шатра пешка может переместиться назад, поскольку взятия назад возможны (и для пешки обязательны). В этом случае, пешка может потерять часть из своих возможных ходов. Дойдя до последней горизонтали (расположенной в «крепости» противника), пешка всё таки может превратиться, но лишь в фигуру «срубленную» ранее. Пока комплектность фигур сохранена, игрок может держать пешку в «крепости» (возможно «срубая» ей фигуры противника) либо выставить её на любое из свободных полей на половине противника, откуда она может повторить остаток своего пути.

Правило «превращения» пешки существует в шахматах давно. В Чатуранге (в её парном варианте) и в Шатрандже, пешка, дойдя до последней горизонтали, превращалась в ферзя (слабую фигуру, ходившую на одно поле по диагонали). В тайском варианте (Макрук), пешка также превращается в слабого ферзя, но на 6 горизонтали (дойдя до «лагеря» противника). Кроме того, в этой игре, пешки изначально расположены на 3 горизонтали. Разумеется, при такой расстановке необходимость начального «прыжка» пешки, а также «взятия на проходе», отсутствует.

Весьма оригинален бирманский Ситтуйин. Задолго до "Шахмат Фишера" в нём применялась свободная расстановка фигур. Пешки расположены очень своеобразно и не менее оригинально их «превращение». Пешка, стоящая на одной из главных диагоналей (на стороне противника), в любой момент игры, может быть превращена в слабого ферзя, но лишь при условии, что ферзь был потерян. Подобное «отсроченное» превращение считается ходом и игрок не в праве двигать другие фигуры.

Dagaz: Пинки здравому смыслу (часть 2) - 2

Ещё более причудливо превращение пешки в малазийских шахматах (Майн Чатор). Достигнув последней горизонтали в любом месте, кроме угловых полей, пешка должна двигаться назад, до одной из главных диагоналей. Там она может превратиться в ту фигуру, перед которой стояла в начальной расстановке (королевская пешка превращается в ферзя). Сходным образом происходит превращение в современном варианте «четверной» Чатуранджи, но здесь действуют дополнительные ограничения:

  • Пешка превращается, дойдя до последней горизонтали
  • Каждая пешка может превратиться только в ту фигуру, по линии которой она достигла края доски с учётом их расстановки в начале партии, и только в случае, когда хотя бы одна из пешек уже снята с доски
  • Если у игрока на доске все четыре пешки, превращения вообще не происходит
  • Если у игрока одна или две пешки, он может превратить пешку в коня или слона
  • Если у игрока остались пешка, ладья и король – и больше ничего, пешка может стать любой фигурой, независимо от поля превращения
  • Если пешка не может превратиться, она остаётся на этом поле, пока не появится возможность превращения

Своё дальнейшее развитие эта идея получает в "Шахматах Тамерлана". Помимо пешек-фигур, в этой игре, есть пешка, превращающаяся в короля (к чему приводит в шахматной игре наличие нескольких королей я расскажу в одной из следующих частей), а также «Пешка пешек», чей жизненный путь представляет собой настоящий эпос.

Дойдя по поля превращения в первый раз, она может оставаться на месте неограниченно долго (противник не имеет права её рубить). Затем, её можно выставить на доску в любое место, где она будет угрожать двум фигурам, либо фигуре, которая не может сделать ход. Сделать это можно даже в том случае, если нужное поле занято своей фигурой (досадная помеха просто убирается с доски). Дойдя до поля превращения повторно, «Пешка пешек» перемещается на стартовую позицию королевской пешки, откуда она может вновь повторить свой путь. Проведя многострадальную пешку через всю доску в третий раз, игрок может получить в своё распоряжение третьего короля.

Японцы, как всегда, развили идею «превращения» и довели её до логического завершения. В Сёги, любая фигура, кроме короля и «Золотого генерала» может быть превращена в лагере противника (три последних горизонтали, также как при игре в Макрук). Для фигур, не способных далее продолжать своё движение (пешка, конь, пика), превращение является обязательным. Остальные фигуры, могут быть превращены любым ходом, на территории «лагеря» противника. Все фигуры, кроме «драконов», превращаются в «Золото» (аналог «Золотого генерала»). Драконы (аналоги шахматных ладьи и слона) превращаются в свои усиленные версии. Я расскажу о Сёги подробнее ниже, в конце этой части.

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

Разумеется, изобретатели современных вариантов шахмат не могли пройти мимо такой замечательной возможности как превращение фигур. Первое, что приходит в голову — превращение фигуры «по требованию». Фигура, сделав «ход на месте», превращается в другую, по желанию игрока. Too Much Chess — прекрасный образчик подобной игры. Все фигуры в ней (кроме короля и ферзя) двойные. Нижняя фигура определяет перемещения, верхняя — ударные ходы. Щёлкнув по фигуре, можно поменять её верхнюю и нижнюю часть местами:

Больше всего, в этой игре, мне нравится пешка. Её альтер-эго — «Берлинская пешка» может ходить на одну клетку по диагонали вперёд и «есть» ходом на одну клетку вперёд. С начальной позиции, «Берлинская пешка» может прыгать по диагонали на две клетки. Жаль, что правило «взятия на проходе» на неё не действует. Было бы забавно.

Другой пример успешного использования превращения фигур — семейство Fusion Chess. В играх этого семейства, фигура приобретает свойства «битой» фигуры (своей или чужой, в зависимости от типа игры). Так, побив слона, ладья превращается в аналог ферзя, а король, соединившись со слоном или ладьёй, превращается в чрезвычайно мобильного монарха. В Fusion Chess, где слияние происходит со своими фигурами, комбинированные фигуры могут впоследствии разделяться, по желанию игрока:

Интересным развитием идеи являются игры с «направленными» фигурами, такие как Rotary. Каждая фигура может ходить и бить по указанным на ней направлениям и может «поворачиваться» по желанию игрока. Пешки, дойдя до последней горизонтали, превращаются в одну из фигур (кроме короля), на выбор:

В похожей игре Stations, эксплуатируется «космическая» тематика. «Корабли» в ней могут не только летать в ту сторону, куда смотрят «турели», но также и защищаются по этим направлениям (в конце хода, фигуру можно повернуть на произвольный угол). Побить «дредноут», защищённый по 5 направлениям из 6 возможных, практически невозможно. «Станцию», свободно перемещающуюся по полю, можно бить с любого направления.

К сожалению, играть в такие игры с ZoG не очень удобно. Выбор из множества вариантов ходов, связанных с поворотом фигур на различные углы, выводится игроку во всплывающем окне, с использованием ZSG-нотации. Понять, какой из списка ходов соответствует желаемому углу поворота совсем непросто.

Превращения могут происходить и независимо от желания игрока. Например по завершении хода на вертикаль соответствующей фигуры. Фигура может превращаться в съеденную фигуру или изменять свой цвет, возможных вариантов множество. Фигуры могут просто превращаться друг в друга циклически, при каждом ходе, так, как это происходит в Kyoto Shogi (извиняюсь за иероглифы, более понятные варианты оформления в реализации игры отсутствуют):

Кстати

Вариант шахмат, в котором фигура, выполняющая бой, изменяет свой цвет на цвет съеденной фигуры и имеющий звучное название Andernach, после продолжительных мучений, мне всё же удалось реализовать в ZoG. Нельзя сказать, что он очень играбельный. Любой бой на доске приводит к потере собственной фигуры и возможному усилению фигуры противника (бить сильными фигурами, понятно, проще чем слабыми). Не всё, что выглядит интересным в композиции, пригодно для полноценной игры двух игроков.

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

Фигуры могут изменять свои свойства, в зависимости от расположения и поведения других фигур. Это не совсем превращение, поскольку фигура лишь временно изменяет свой статус, но что то очень на него похожее. В качестве примера, приведу один очень удачный вариант Shogi. Фигура находящаяся «на голове» другой фигуры (общепринятый в Shogi термин, означающий расположение фигуры на одно поле выше), временно обретает свойства последней. Начальное расположение пешек вызвано тем, что было бы неразумно с первого хода придавать четырём пешкам качества «драконов»:

Очень интересной фигурой является «Хамелеон» из упоминавшийся мной ранее Ультимы, который бьёт фигуры таким образом, каким бьют они сами. Играть по таким правилам в шахматы тоже возможно. Например в «Inverse Capture Chess» Ральфа Бетца, каждая фигура бьётся тем ходом, которым ходит она сама. Атаковать короля издалека, в этой игре, просто невозможно. В Ультиме, с её разнообразными правилами взятия, этот принцип буквально расцветает, превращая хамелеона в экстремально сильную фигуру:

Dagaz: Пинки здравому смыслу (часть 2) - 3

Другая фигура-пересмешник используется в расширенном варианте Омега-шахмат. Шут не имеет своей начальной позиции и может быть установлен игроком (один раз за игру) на начальное поле любой фигуры, совершившей свой первый ход в партии. Ходы шута копируют ход последней сходившей фигуры противника. Кроме того, эта фигура обездвиживает все фигуры противника, расположенные на прилегающих к нему полях. Шут противника, в свою очередь, может «снять заморозку», подойдя к блокированной фигуре вплотную.

«Заморозка» фигуры также является одним из вариантов изменения её «поведения». Фигуры, обездвиживающие фигуры противника, при приближении к ним, подобные «Василиску» из трёхмерной Dragonchess реализуются довольно легко. Более сложная фигура используется в монгольской игре Хиашатар. В этой игре, помимо привычных шахматных фигур, используется фигура «Телохранитель» (Хиа), способная остановить «на скаку» любую дальнобойную фигуру, кроме коня:

Dagaz: Пинки здравому смыслу (часть 2) - 4

Входя в область его действия, любая фигура может перемещаться лишь на одну клетку за ход. Такое качество неплохо защищает и самого телохранителя. Ферзь не может съесть его одним ходом. Он должен приблизиться, встав под удар. Телохранитель превосходно выполняет свои защитные функции. Он не защищает от атак коня, но ставить мат конём в Шатар и Хиашатар запрещено. В "Сянцы семи царств" существовала другая защитная фигура (Дипломат), но она могла лишь перекрыть линию атаки. Телохранители в Хиашатар намного эффективнее.

Наверняка вы уже заметили, что в роликах, посвященных Сёги, «съеденные» фигуры не покидают игру, а перемещаются в резерв игрока. Впоследствии, игрок может выставлять эти фигуры на доску, для игры на «своей стороне». Такой ход, «из резерва», называется сбросом. Фигура «из резерва» может быть установлена почти на любое свободное поле доски (имеется ряд ограничивающих правил). Такая фигура (даже пешка) гораздо сильнее, чем если бы она стояла на своей начальной позиции. Кроме того, фигурам находящимся в резерве никто не угрожает. Игрокам становятся крайне выгодны равные размены, поскольку, в их результате, вместо фигур на доске, игроки получают те же фигуры, но уже в резерве.

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

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

Правила сброса — главный вклад Японии в шахматную игру, но таким образом в Сёги играли не всегда. В период Хэйян — время расцвета в Японии различного рода искусств, существовало большое количество различных вариантов этой игры. В Сёги играли на больших досках, огромным количеством разнообразных фигур. Привычная сегодня доска 9x9 называлась «малой» доской. В самом большом, из известных вариантов, Taikyoku Shogi использовалась 1296-польная доска (36x36) и набор из 402 фигур 209 различных типов. Большинство из этих фигур могло превращаться.

Dagaz: Пинки здравому смыслу (часть 2) - 5

Порядок в этом зверинце был наведён в XVI веке императором Го-Нара. Фактически, император утвердил тот набор правил (включая правило сброса), по которому в Сёги играют по сей день. Правило сброса вдохновило разработчиков на создание новых игр, таких как Chessgi, Fusion Chessgi и Crazyhouse, использующих более привычные нам наборы фигур. В свою очередь, традиционное Сёги также развивается, заимствуя новые фигуры, такие как пушки из китайских шахмат, используемые в Cannon Shogi.

Правило сброса может работать и без явно выделенного резерва. Например, в Genesis Chess игра начинается с пустой доски. Игрок, своим ходом, может добавить на поле новую фигуру, либо переместить одну из своих фигур, ранее установленных на доску. Съеденные фигуры в резерв не возвращаются. При добавлении фигур на доску, желательно иметь возможность для установки приоритетности ходов. Так, например, король должен быть выставлен на доску самым первым ходом, до размещения других фигур.

Интересный вариант этой игры используется в одной из миссий кампании Хаоса в игре Battle vs Chess. В этой миссии, одинокий чёрный король противостоит целому войску. Каждым ходом, чёрные могут добавлять новые фигуры на доску. При этом, фигуры должны добавляться в порядке старшинства: сначала все пешки, затем лёгкие фигуры, ладьи и лишь последним — ферзь. Реализация правила сброса в ZoG довольно сложна. В ZRF имеется возможность определения drop-ходов, добавляющих фигуры на доску. Назначив этим ходам необходимые приоритеты, можно реализовать Genesis Chess:

Фрагмент возможной реализации Genesis Chess

   (board-setup
      (White
         (Pawn off 8)
         (Knight off 2)
         (Bishop off 2)
         (Rook off 2)
         (Queen off 1)
         (King off 1)
      )
      (Black
         (Pawn off 8)
         (Knight off 2)
         (Bishop off 2)
         (Rook off 2)
         (Queen off 1)
         (King off 1)
      )
   )
   (move-priorities kingdroptype normaltype)
   (piece
      (name Pawn)
      (image White "imagesChessSHaagwpawn.bmp" "imagesChesswpawn.bmp"
             Black "imagesChessSHaagbpawn.bmp" "imagesChessbpawn.bmp")
      (moves
         (move-type normaltype)
         (Pawn-capture nw)
         (Pawn-capture ne)
         (Pawn-move)
         (En-Passant e)
         (En-Passant w)
      )
      (drops 
          (move-type normaltype)
          (add-to-empty)
      )
   )
   ; ...
   (piece
      (name King)
      (image White "imagesChessSHaagwking.bmp" "imagesChesswking.bmp"
             Black "imagesChessSHaagbking.bmp" "imagesChessbking.bmp")
      (attribute never-moved? true)
      (moves
         (move-type normaltype)
         (king-shift n)
         (king-shift e)
         (king-shift s)
         (king-shift w)
         (king-shift ne)
         (king-shift nw)
         (king-shift se)
         (king-shift sw)
         (O-O)
         (O-O-O)
      )
      (drops 
          (move-type kingdroptype)
          (add-to-empty)
      )
   )

Ключевое слово off, используемое в разделе board-setup означает, что фигуры ещё не размещены на поле (указывается количество фигур, доступных для использования игроком). Фраза drops определяет ходы сброса, а move-priorities гарантирует, что король будет добавлен на доску самым первым ходом, каждым из игроков.

К сожалению, в определяемый таким образом резерв, невозможно добавить фигуры (взятые у противника). Резерв в реализации Сёги должен определяться как полноценная часть доски, наподобие «крепости» в Алтай Шатра, только без возможности хода фигурой из него через «ворота». Реализация такой логики в ZoG крайне многословна. Требуется вручную управлять логикой расстановки фигур в резерве, искать фигуры заданного типа и т.п. Вот как выглядит поиск свободного места в резерве (для доски 5x5):

Фрагмент реализации Сёги

(define first-empty
   to-prison
   (while not-empty? next-prison)
)
; ...
(links to-prison
			(5i pb0) (4i pb0) (3i pb0) (2i pb0) (1i pb0)
			(5ii pb0) (4ii pb0) (3ii pb0) (2ii pb0) (1ii pb0)
			(5iii pb0) (4iii pb0) (3iii pb0) (2iii pb0) (1iii pb0)
			(5iv pb0) (4iv pb0) (3iv pb0) (2iv pb0) (1iv pb0)
			(5v pb0) (4v pb0) (3v pb0) (2v pb0) (1v pb0)
)
(links next-prison
			(pb0 pb9) (pb9 pb8) (pb8 pb7) (pb7 pb6) (pb6 pb5) (pb5 pb4) (pb4 pb3) (pb3 pb2) (pb2 pb1)
			(pw1 pw2) (pw2 pw3) (pw3 pw4) (pw4 pw5) (pw5 pw6) (pw6 pw7) (pw7 pw8) (pw8 pw9) (pw9 pw0)
)

Превращения фигур могут потребовать использования нескольких различных механизмов, предоставляемых ZoG. В том случае, если изменяются лишь аспекты поведения фигуры, а не её внешний вид, могут быть использованы атрибуты (подобно тому как в реализации Шахмат используется атрибут для определения неподвижности короля и ладьи до выполнения блокировки). Если ходы фигуры зависят лишь от её расположения на доске (как ходы пешки до превращения в «Алтай Шатра»), достаточно выполнять проверку нахождения фигуры в некоторой зоне.

Если внешний вид фигуры должен изменяться — выбора нет, должен быть изменён тип фигуры или её владелец. Изменение типа фигуры, перемещаемой в рамках выполнения хода, осуществляется расширенной командой add, завершающей в ZoG формирование хода. Её аргумент представляет собой тип фигуры, в которую должна превратиться фигура, выполняющая ход. Если список содержит более одного элемента, формируется несколько однотипных ходов и ZoG выводит меню выбора хода из списка. Превращаемая фигура может никуда не ходить (как в Too Mach Chess). Вот как выглядит фрагмент реализации этой игры, связанный с превращением фигур:

Фрагмент реализации Too Mach Chess

(define Pawn-add
   (if (in-zone? promotion-zone)
   		(add Knight-on-Bishop Knight-on-Rook
   			 Bishop-on-Knight Bishop-on-Rook
   			 Rook-on-Knight Rook-on-Bishop
   			 Queen) 
   	else add))

(define Pawn-move
   (  $1  (verify empty?)
      (Pawn-add)
      (verify (in-zone? third-rank))
      $1  (verify empty?)
      add   ))
      
(define Pawn-capture
   (  $1   (verify enemy?)  (Pawn-add)   ))
   
(define flip-pawn
(to
(if (in-zone? promotion-zone)
   		(add Knight-on-Bishop Knight-on-Rook Bishop-on-Knight Bishop-on-Rook
   			 Rook-on-Knight Rook-on-Bishop ) else (add Berolina-Pawn))))
   			 
(define flip-berolina
(to
(if (in-zone? promotion-zone)
   		(add Knight-on-Bishop Knight-on-Rook Bishop-on-Knight Bishop-on-Rook
   			 Rook-on-Knight Rook-on-Bishop ) else (add Pawn))))
; ...
   (piece
      (name Pawn)
      (image White "imagesTooMuchChessset1WP.bmp" "imagesTooMuchChessset2WP.bmp" 
             Black "imagesTooMuchChessset1BP.bmp" "imagesTooMuchChessset2BP.bmp")
      (moves
         (Pawn-capture nw)         
         (Pawn-capture ne)
         (Pawn-move n)
         (Pawn-En-Passant e)         
         (Pawn-En-Passant w)
         (flip-pawn)      
      )   
   ) 

Для изменения владельца фигуры, можно использовать команды change-owner и flip. Командой change-type можно изменить тип фигуры не выполнявшей ход (в качестве побочного эффекта хода). К сожалению, целевой владелец фигуры в командах не указывается, в результате чего, изменение владельца фигуры будет корректно работать только в играх двух противостоящих игроков. На мой взгляд, это крайне досадная недоработка дизайна ZRF. Вот как используется команда flip, в реализации Benedict Chess:

Фрагмент реализации Benedict Chess

(define step-flip (if (enemy? $1) (flip $1)))

(define step-flip-all
	(step-flip n)
	(step-flip e)
	(step-flip s)
	(step-flip w)
	(step-flip ne)
	(step-flip nw)
	(step-flip se)
	(step-flip sw)
)

(define king-step 
	($1 (verify empty?) 
	(set-attribute never-moved? false) 
	(step-flip-all) 
	add)
)

Из анализа этого кода понятно (и это легко проверяется), что Benedict Chess не отслеживает «вскрытые» угрозы. Изменения касаются лишь фигур, попавших под удар фигуры, совершившей ход. Если ход одной фигуры открывает атаку другой, это игнорируется. Оставим в стороне вопрос об играбельности подобного варианта и рассмотрим лишь возможность его реализации. Чтобы отслеживать «вскрытые» атаки, нам потребовалось бы выполнять перебор всех дружественных фигур (что в ZoG само по себе не тривиальная задача), а затем всех их атак, изменяя владельца фигур противника, попавших под удар. При этом, список дружественных фигур будет пополняться и потребуется отслеживать вновь добавляемые фигуры, чтобы не выполнять проверок для них. В общем, это довольно сложная задача. Что касается аналога Benedict Chess для более чем 2 игроков, он, увы, не реализуем средствами ZRF.

Есть ещё одна проблема, связанная с изменением владения, с которой я столкнулся при реализации Andernach. Команда change-owner позволяет «переключить» владельца любой фигуры на доске, но с той фигурой, которая выполняет ход, возникает проблема. С одной стороны, мы должны завершить ход своей фигурой, но, по нашему замыслу, эта фигура должна изменить владение до завершения хода! change-owner здесь не поможет. К счастью, есть ещё одна команда (create), позволяющая создать на доске фигуру с требуемым типом и владельцем (в реализации Цирце эта команда тоже оказалась не лишней).

Фрагмент реализации Andernach Chess

(define a-rook-slide-wc (
  $1
  (while empty? (set-attribute never-moved? false) $1)
  (verify enemy?)
  (set-attribute never-moved? false)
  (create $2 $3)
  add
))

   (piece
      (name WhiteRook)
      (image White "imagesChessSHaagwrook.bmp" "imagesChesswrook.bmp")
      (attribute never-moved? true)
      (moves
         (move-type with-capture)
         (a-rook-slide-wc n Black BlackRook)
         (a-rook-slide-wc e Black BlackRook)
         (a-rook-slide-wc s Black BlackRook)
         (a-rook-slide-wc w Black BlackRook)
         (move-type without-capture)
         (a-rook-slide n)
         (a-rook-slide e)
         (a-rook-slide s)
         (a-rook-slide w)
      )
   )

Реализация получилась крайне многословной, но работающей. Меня спасла одна неочевидная особенность ZRF. В том случае, если на целевом поле, командой create, создаётся новая фигура, она более приоритетна, чем фигура совершающая ход. Фигура, выполнившая ход, удаляется автоматически, поскольку две фигуры не могут одновременно занимать одно поле. Превращения и сброс фигур не те задачи с которыми ZoG или Axiom не могли бы справиться, но, в некоторых случаях, над реализацией приходится сильно поломать голову и много поработать руками. У ZRF имеются и более серьёзные проблемы, но о них я расскажу в следующих частях.

Автор: GlukKazan

Источник

* - обязательные к заполнению поля


https://ajax.googleapis.com/ajax/libs/jquery/3.4.1/jquery.min.js