Цвет волшебства

a9eebc42c84e43b2bff7c3136d8d573f.PNG      Ближе к границе Краепада горели семь второстепенных цветов, искрясь и танцуя в пене умирающих морей. Но они были бледной тенью в сравнении с более широкой полосой, которая парила позади, наотрез отказываясь делить с ними один и тот же спектр.

      Это Цвет-Король, по отношению к которому все менее важные цвета есть не более чем неполные и застиранные оттенки. Это октарин, цвет магии. 

      сэр Терри Праттчетт

 

В этой игре никто никого не ест. Цель проста — перейти на другую сторону доски любой из фигур. Для этого могло бы хватить всего одного хода… Если бы не мешали другие фигуры.
Хотя игра Kamisado разработана нашим современником, она полностью соответствует духу китайской традиции. Дело не только в восточной символике. На досках китайских настольных игр (таких как "Сян-ци", "Доу-шу-ци" или "Лу-чжань-ци") можно найти дворцы и крепости, реки и озёра, холмы и ловчие ямы. И все эти «детали рельефа» имеют к игровому процессу самое непосредственное отношение! Нам мало что известно о "Лю-бо" — родоначальнице жанра настольных игр, но и там разметка доски, очевидно, имела первостепенное значение.

На мой взгляд, в этом суть традиционных китайских игр. Предельное ограничение «свободы» фигур, строгое следование «ритуалу», превращает игровой процесс в настоящую головоломку. Генерал в Сян-ци не может бегать по всей доске, спасаясь от мата, подобно королю в европейских шахматах. Он обязан оставаться внутри дворца! Также несвободен и «Конь». Хотя внешне его ходы напоминают перемещения аналогичных фигур из других шахматных игр, он не может «перепрыгивать» препятствия. Сян-ци — единственная традиционная игра, в которой ход коня может быть заблокирован!

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

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

9b3e3978a7984b6f860eb6b28b79e8b5.png


Всё просто — «жёлтый дракон» чёрных заканчивает свой ход на пурпурном поле, после чего ходит «пурпурный дракон» белых. Это главное правило игры Kamisado и, в большинстве случаев, игроки им и ограничиваются. Игра продолжается до тех пор, пока одна из фигур не достигнет последней линии доски. Партия, по таким правилам, продолжается в течение 10-15 ходов, при условии того, что игроки не заблокируют друг друга. Естественным способом, продлить удовольствие, является игра до нескольких очков. Различают следующие варианты:

  • Single Round: до 1 очка
  • Standard Match: до 3 очков
  • Long Match: до 7 очков
  • Marathon Match: до 15 очков


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

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

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

Решив реализовать Kamisado на платформе "Zillions of Games", я немедленно столкнулся с техническими сложностями. Главной проблемой была разбивка игры на раунды. Сам процесс расстановки фигур, после завершения очередного раунда, довольно трудоёмок, в плане реализации на ZRF, но дело было не в этом. В конце концов, расстановка всех фигур одним ходом — задача муторная, но вполне решаемая. Сделать две кнопки, управляющие направлением расстановки, также не очень сложно. Главная трудность — в самом завершении раунда!

cc80e5a5d6894c1694f6a4a782735110.png


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

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

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


В этом и заключалась проблема. Пропуск хода, на ZRF, реализуется легко. Более того, при отсутствии возможности хода, пропуск хода может быть выполнен автоматически, без выполнения игроком каких либо ручных действий. Но если «пас» сказали все участвующие в игре игроки, игра автоматически завершается ничьей и её никак нельзя продолжить! Я встал перед выбором: либо, выполнив большой объём работ, отказаться от автоматического пропуска хода (ухудшив, тем самым, usability приложения), либо… придумать что-то другое.

Так появился новый вариант игры «Kamisado non Stop». Я отказался от расстановки фигур между раундами, ограничившись немедленным возвратом превращённой фигуры на любое свободное поле первой линии (очевидно, такое поле найдётся всегда). Цвет выбранного поля определяет фигуру, которой будет ходить противник (что даёт дополнительное тактическое преимущество, после превращения фигуры). Игра по прежнему ведётся на очки (в моём варианте — до 7 очков), но, в моей реализации, превращение фигуры любого типа приносит лишь одно очко (просто, чтобы сделать игру более продолжительной).

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

  • Dragon — обычная фигура Kamisado. Превращается в Sumo
  • Sumo — в полном соответствии с правилами Kamisado, может двигаться не более чем на 5 полей, либо толкать одну вражескую фигуру типа Dragon, расположенную непосредственно впереди, на одно поле. Превращается в Double
  • Double — перемещается не более чем на 3 поля и может толкать две фигуры (своих или противника), рангом ниже Double, расположенные спереди, друг за другом, на одно поле. Превращается в Triple
  • Triple — может перемещаться лишь на 1 поле и толкать в любом из трёх направлений одну фигуру (свою или противника) рангом — Double и ниже


Вот как всё это выглядит:

И, таки да, в моей игре есть пасхалка
Внимательный читатель может задаться вопросом: во что превращается фигура Triple? Поскольку фигуры этого типа крайне тихоходны, а желающих добраться до последней линии, на момент их появления, и без того достаточно, вероятность такого превращения стремится к нулю. Тем не менее, такое превращение возможно, а его результатом становится фигура Ultimate. По первоначальной задумке, эта фигура умела перемещаться на 0 полей и, в результате, не могла превратиться во что либо другое.

В порядке компенсации за полную потерю мобильности, она обретала возможность «телепортироваться» на любое свободное поле, а в качестве «ультимативной» способности — блокировку любых вражеских фигур, оказавшихся по соседству. При удачном расположении, все 8 вражеских фигур могли быть заблокированы всего одной фигурой класса Ultimate. Тестовые прогоны показали, что такое решение слишком брутально. Противник буквально не имел возможности подвинуть хотя бы одну из своих фигур со стартовых позиций, пока безумный Ultimate прыгал по доске.

В финальной версии, Ultimate перемещается как привычный нам шахматный конь. Он по прежнему имеет блокировать до 8 фигур противника, но обязан двигаться, при своей очереди хода, снимая, тем самым, блокировку, хотя бы с части фигур.


На мой взгляд, результат получился неплохим. Иногда AI совершает довольно странные ходы, но это, в общем-то понятно. ZRF более всего пригоден для игр, напоминающих шахматы. В случае Kamisado, AI ZoG может опираться лишь на условия завершения игры. Любого рода шахматные эвристики и оценочные функции, для этой игры, не очень пригодны, а возможность их переопределения отсутствует. Если AI успевает выполнить полный перебор, до выполнения условия завершения — программа работает идеально, но как только завершение партии уходит за «горизонт перебора» — начинаются странности, связанные с применением неподходящей оценочной функции. Я думаю, эту проблему можно решить, полностью переписав игру на Axiom и определив более адекватную оценочную функцию (и возможно какие-то эвристики), но это задачка не на один день.

© Geektimes