#chess #gametech

2023-12-15 – 2024-01-28

Простые вещи (Нотация SP)

Постановка задачи

Вывести систему правил, в рамках которых возможно полностью описать Шахматы и подобные игры типа “фигуры ходят по клеткам”. Из частей этих правил предполагается создавать новые фигуры и игры путём комбинирования. Нотация используется для облегчения конструирования и объяснения правил, представляя собой логико-подобные конструкции.

За основу взята нотация Парлетта. Часть нововведений перенесена обратно. Нотации не полностью синхронизированы, но зная SP, можно понять запись Парлетта. Парлетт подходит для описания небольших шахматных модов. Нотация SP более подробная, используется больше символов, поэтому подходит для сложных продуктов.

Запись ходов в похожем формате:

Возможности

Обобщённо, фигуры могут что-то делать с другими, включая себя саму: передвигать, снимать с доски, накладывать или снимать свойства. У действий есть условия применения и цели.

Фигура меняет положение на доске некоторым способом. По-умолчанию может устанавливаться на пустое место либо на клетку, занятую соперником (произойдёт Снятие). Остальное уже описывается через условия и свойства. Движение может затрагивать другие фигуры через типы хода Обмен и Притягивание.

В играх описываемого типа обычно превосходство над соперником достигается путём снятия его фигур с доски. Снятие может происходить:

Снятие через установку можно рассматривать как частный случай движения с разрешением занятой соперником клетки в качестве цели.

Тип действия

Действие определяет значение дальнейших символов за ним.

Можно притягивать не цель, а саму фигуру к цели. Это выражается через движение с окончанием в зоне влияния фигуры с тегом th: m+n&th0.

Пример превращения в Ферзя по достижению восьмой линии: L8aQ. Для обозначения последней, сколько бы ни было линии, можно взять Ln, тогда “превращение на действительно последней линии” в старшие фигуры будет Lna(RNBQ).

У одного хода может быть несколько типов действия для сокращения записи. Пишутся в любом порядке. Путаницы ma с am не возникнет, т.к. один тип хода не может содержать движение и превращение. Движение с превращением в конце будет записано как m>1&L8aQ. Большинство ходов фигур из классических шахмат имеют типы действий mc - движение со взятием замещением.

Тип хода по-умолчанию можно внести в глобальные свойства игры и не приписывать к каждому ходу. Если в игре все ходы доступны одновременно для движения и взятия замещением, то можно это прописать, а записи вида m>1,с>1 (или mc>1) сразу сокращать до >1. И прописывать только исключения из глобальных свойств. Например, если это игра наподобие Хнефтафл, то ход типа cg доступен всегда для всех фигур.

Распространение

Все действия имеют какие-то цели или направления применения. Могут быть описаны в виде:

У вектора есть несколько обозначений, в зависимости от направления:

Для избежания путаницы, если у хода комбинированный тип распространения, значки выставляются в таком порядке. Тогда x> (по диагоналям вперёд) не смешается с >x (вперёд и по диагоналям).

Движения “только направо” и “только налево” не заданы, можно использовать >> и << при необходимости.

Расстояние

Группировка движений

Предполагается, что при повторе ходов используется выбранное направление: если использован повторяющийся ход конём 3(~2.1), и начат ход вверх-влево, то второй и третий ходы тоже должны быть сделаны вверх-влево. Аналогично, ход n(2-2) обозначает движение пунктиром через одну клетку в одном направлении.

Для ходов с возможностью изменения направлений применяется ., тогда ~2/1.~2/1.~2/1 как раз даст коня, который может менять направление каждый ход. Совместим: 2(~2/1).~2/1 - ход конём два раза в одном направлении, и на третий можно направление изменить.

Сложный ход без смены направления обозначается удвоением символа склейки. Под сменой направления подразумевается отклонение на 90 градусов и более. Ход +1..xn означает перемещение по прямой на одну клетку, потом по диагонали, но если сделан ход вперёд, то нельзя ходить по задним диагоналям. x1..+n - перемещение по диагонали на одну клетку, потом по прямой, но если был ход по диагонали вверх-вправо, то по прямой можно ходить только вверх или вправо. Для ходов со смещением сверяется вектор движения: ~2/1..xn - если сделан ход на две клетки вперёд и одну влево, то вектор движения вверх-влево и для перемещения недоступны диагонали вниз и вправо, т.е. остаётся только продолжить ход по верхней левой диагонали.

Для распространения типа “координаты” за начало отсчёта берётся сама фигура. Если один ход состоит из нескольких частей, то за отсчёт берётся конец прошлой части. Ход “на самого себя” обозначается 0. Ход c0 означает самоуничтожение, используется для одноразовых фигур.

Например, ракета: движется по прямым на любое расстояние со взятием, потом взятие всех фигур в радиусе 1: c>n&car1. Это означает, что делается движение со взятием по прямой вперёд, замещая фигуру в конце; от этой точки отсчитывается радиус 1 и убираются все фигуры на этих клетках. & означает обязательность второй части хода - нельзя ограничиться первым взятием и “не взрываться”. Логично, что ракета при этом сама уничтожается, поэтому полный ход будет выглядеть c>n&car1&c0.

У похожих фигур могут быть очень разные способы записи. Например, обычный конь описывается как ~2/1, а скользящий таким же уголком уже как +2&+1. Способ движения у первого - координаты, у второго - составной ход из двух векторов.

Условия

Обычно движение фигуры безусловно, т.е. одинаково при любых относительных сочетаниях, но даже ход классической Пешки вида cx>,im>2,m>1 использует условия “без взятия”, “только со взятием”, “только первым ходом”. Все условия могут идти с отрицанием !. Условия, которые могут быть перепутаны при совместной записи, группируются скобками.

Доступность хода

Здесь r означает тип условия “Регион”.

Тонкий момент обозначения хода, который не начинается в секторе соперника, а должен закончиться в секторе соперника. Можно выразить его так: m>2&rE0 - ходит со взятием на две клетки вперёд, потом обязан пропустить ход находясь в секторе соперника. Если ход не оканчивается на требуемой территории, то вторую часть хода выполнить невозможно и ход недействительный.

Условие первого хода сложно для отслеживания. Обычно используется для фигур, которые уже не могут вернуться на стартовую линию и на самом деле означает “ход со стартовой линии”. Если у фигуры есть возможность возврата на стартовую линию, то его можно повторить. Для достаточно уникальных фигур можно считать за i нахождение на стартовой клетке, даже если есть возможность для возврата на неё. Обычно в этом нет проблемы и зацикливание “начальных” ходов сложно и бессмысленно, что исключает их само по себе. Эту особенность стоит заложить в дизайн и баланс правил конструируемой игры.

Тип фигуры

Фигуры имеют встроенные относительные теги:

Наличие тега может быть условием доступности хода и требованием типа цели. Например, взятие по прямым на две клетки, применимое только к белым можно обозначить как c+2tw. Взятие по прямым на две клетки для белой фигуры: twc+2.

Влияние

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

Сначала пишутся условия, потом p, дальше список раздаваемых свойств, направление, расстояние.

Тогда чтоб воспроизвести старую механику “пешка может получить возможность взятия вперёд на одну клетку, если рядом стоит Сержант”, нужно:

  1. Прописать Сержанту влияние на союзную Пешку: ptf=1taP - добавляет тег tf влево-вправо на одну клетку своим Пешкам.
  2. Пешке прописать ход tfc>1 - если есть тег tf, то доступно взятие вперёд на одну клетку.

Сержант подходит сбоку к Пешке, раздаёт ей тег tf, а Пешка, имея тег tf получает новый ход.

По-умолчанию все фигуры распространяют встроенное влияние своего типа на все соседние клетки. Например, у Ферзя будет встроенное влияние pQ. Чтоб сделать фигуру ходящую по прямым только когда у неё нет соседей, нужно выписать исключение влияний всех возможных фигур: !p(PNBRQK)+n.

Свойства

Модификаторы, которые могут применяться к самой фигуре или раздаваться через влияние, в т.ч. во время хода соперника. По-умолчанию свойства без влияний применяются к себе. Записываются отдельно от ходов через пробел.

Для описания исключения свойства используется знак !, т.е. pnm>1 обездвиживает фигуру перед собой, а p!nm>1 исключения обездвиживание.

Можно вводить любые свойства фигуры для применения их в качестве условий, например задать фигурам теги t1, t2, t3, прописав в условия взятия свойства t3 > t2 > t1 > t3, получится Камень-Ножницы-Бумага.

Используя эту нотацию, можно выразить рокировку через tri|=ntr для Короля, задав Королю и Ладье тег tr. Тогда первым ходом эти фигуры могут обменяться местами, т.к. в условии и хода и цели обмена стоит наличие тега tr, которое есть у обоих. Достаточно наличие хода обмена только у одной фигуры.

Некоторые логичные свойства не выписаны т.к. могут быть получены комбинациями имеющихся свойств и влияний. Сложные правила всё равно придётся задавать словесным алгоритмом - на всё значков не хватит.

Попробуем описать фигуру Щита: нельзя взять выстрелом, защищает от выстрела союзников в двух клетках за собой, ходит только вперёд - m>1 dr(pdr<2ta). Защита от выстрела обеспечивается раздачей свойства dr на две клетки назад.

Чтобы сделать фигуру, снимающую защищённые от снятия, можно добавить влияние, отнимающее защитное свойство: mc*8 p!dr*8te - отнимает свойство dr у противников во все стороны и атакует эти же цели. Но такая метка делает фигуру разрешённой для снятия всеми, а не только наложившим метку. Понятие “наложенной уязвимостью может воспользоваться только эта же фигура” нарушает логику тегов и слишком частный случай для расширения нотации. Лучше описать словесно в правилах.

Заключение

В рамках этих правил возможно описать такие игры как Шахматы, Сёги и другие виды шахмат, Шашки, Хнефтафл, Thud! и многое другое. Тонкие правила разновидностей придётся дописывать словами, но на 95-100% правила любого шахматоида могут быть составлены из этих вариантов. Применяя сложные условия, редкие свойства и кастомные теги можно конструировать игры только отдалённо похожие на шахматы.

Важные нововедения нотации SP:

В своих продуктах используется ещё старый Парлетт, задача полностью актуализировать нотацию во всех статьях не стояла. Документ не стабильный и будет ещё множество правок. Будет использован в новых разработках после условной версии 1.0.