Уже гораздо позже, когда я стал профессиональным программистом, у меня появилась идея, разработать универсальное приложение, для контроля правил ходов в разнообразных шахматноподобных играх на квадратных и прямоугольных досках. Разумеется, у меня и в мыслях не было, что я смогу создать универсальный AI. Даже сама задача реализации универсальной шахматной доски, с настраиваемым контролем всевозможных правил и возможностью игры по сети выглядела неподъемной. Я коллекционировал правила шахматных игр, пытался обобщить их, но, с учетом того, что я занимался этим краткими урывками, между основной работой, процесс пробуксовывал и шел очень медленно. Так продолжалось до тех пор, пока в прошлую пятницу, я не обнаружил проект под названием Zillions of Games.
Осознав, на что именно я наткнулся, я подумал, что попал в сказку. Даже в бесплатной demo-версии предлагалось сыграть в 48 совершенно различных игр, реализованных на одном и том-же движке. Помимо шахмат и шашек, были представлены разновидности крестиков-ноликов, Го (использовавшей подключаемую dll в качестве engine), разнообразных головоломок. Имелись игры, о которых я никогда не слышал. Собственно Шахматы были представлены джентльменским набором из традиционных, китайских, корейских, тайских и японских шахмат. Последние, в demo-версии, были представлены только мини-вариантом, что само по себе являлось хорошим поводом, для приобретения полной версии игры.
Но главным был не набор представленных игр, и даже не то, что, после приобретения платной версии, появлялась возможность загрузки более 2000 дополнительных игр и головоломок, а то, что для разработки новой игры, было достаточно описать ее правила на языке напоминавшем Lisp. Руководство к языку, а также тысячи примеров его использования, прилагались. Тут я понял, что нашел то о чем долго мечтал и что этого развлечения мне хватит её надолго.
В общем, я решил попристальней изучить возможности языка описания правил Zillions of Games (ZRF), а в процессе изучения, написать на нем что-нибудь интересное и полезное. Разумеется, я планирую двигаться от простого к сложному, но, чтобы не терять перспективу, я попробую описать «Игру мечты», к которой хочу прийти в конечном итоге.
Итак:
Общие сведения
- Игрa начинается на пустой квадратной доске большого размера (например 17×17 клеток)
- Противники совершают ходы по очереди
- Ходом считается перемещение фигуры, изменение состояния фигуры или взятие фигуры противника
- Перед началом хода, Игрок может разместить на поле фигуры или преграды
- Возможность установки объекта (фигуры, преграды или модификатора) на поле определяется текущим состоянием счетчика энергии игрока
- Энергия вырабатывается каждый ход, специальными фигурами (Генераторами), устанавливаемыми игроками на поле
- Игрa начинается с одинаковым количеством энергии обоих игроков (достаточным для установки одного генератора)
- Генераторы могут быть установлены на любое свободное поле на половине доски обращенной к Игроку (в случае нечетного количества горизонталей, средняя горизонталь считается нейтральной)
- Фигуры и преграды могут быть установлены на любое свободное поле, не находящееся под боем фигур Противника, в области боя фигур Игрока
- Модификаторы могут применяться к фигурам Игрока, для изменения их состояния
- Единовременно, на фигуру может применяться не более одного модификатора (применение очередного модификатора отменяет действие предыдущего с потерей затраченной на его применение энергии)
- Для поддержки тяжелых фигур, каждый ход расходуется энергия (в случае, если энергии для поддержки фигур не хватает, часть тяжелых фигур может быть автоматически удалена перед началом очередного хода)
- Если взятие фигуры Противника (за исключением Лазутчика) сопровождается перемещением фигуры Игрока на ранее занимаемое ей поле, Игрок получает бонус в виде половинного количества энергии, затраченного на первоначальное размещение взятой фигуры, без учета наложенных модификаторов (округление до целого выполняется в меньшую сторону)
- Игрa продолжается до полного уничтожения фигур одной из сторон, до признания поражения одной из сторон или до обоюдного признания ничьей
Фигуры
Генератoр
- Для установки Генератора, требуется 20 единиц энергии
- Каждый Генератoр, расположенный Игроком на поле вырабатывает 5 единиц энергии за ход (энергия выработанная несколькими генераторами суммируется)
- После установки, Генератoр не может быть перемещен и не может бить фигуры Противника, однако, для него определена область боя, необходимая для установки фигур Игрока вблизи Генератора
- Область боя, определяемая вокруг Генератора, представляет собой периметр квадрата 5×5 клеток с Генератором, расположенным в центре
Часовой
- Для установки Часового, требуется 1 единица энергии
- После установки, Часовой не может быть перемещен
- Часовой бьет в любом направлении на одно поле, при условии, что на предыдущем ходу на этом поле Противником было выполнено взятие другого Часового Игрока (в совокупности, эти правила должны поощрять расположение часовых непрерывными стенами вокруг защищаемых ими Генераторов)
Солдат
- Для установки Солдата, требуется 4 единицы энергии
- Солдат перемещается и бьет в любом направлении на одну клетку
- Может быть переключен в состояние закопан/раскопан без затрат энергии, за 1 ход
- Все фигуры могут беспрепятственно проходить через Солдата в закопанном состоянии
- В закопанном состоянии, Солдат не бьётся Танком
- В закопанном состоянии, Солдат не может перемещаться
- Если, в закопанном состоянии, Солдат бьет фигуру Противника, бой выполняется без перемещения
Офицер
- Для установки Офицера, требуется 8 единиц энергии
- Офицер перемещается и бьет по прямой в любом направлении на 1 или 2 клетки
Кавалерист
- Для установки Кавалериста, требуется 10 единиц энергии
- Кавалерист бьет и может перемещаться «ходом коня»
- Кавалерист может перемещаться двойным «ходом коня», продолжая движение в прежнем направлении
- Кавалерист «перепрыгивает» любые фигуры или преграды
Пушка
- Для установки Пушки, требуется 15 единиц энергии
- Для поддержки Пушки, требуется 1 единица энергии за ход
- Пушка перемещается на любое количество клеток по вертикали или горизонтали
- Пушка бьет фигуру Противника (или любую преграду) на любое количество клеток по вертикали или горизонтали, при условии, что по линии боя, между пушкой и полем боя стоит расположена одна фигура Игрока или Противника, кроме Вертолета или Солдата в закопанном состоянии (фигура Пушка напоминает одноименную фигуру в китайских и корейских шахматах)
- Бой фигуры или преграды выполняется без перемещения Пушки
Вeртолет
- Для установки Вертолета, требуется 20 единиц энергии
- Для поддержки Вертолета, требуется 1 единица энергии за ход
- Вертолет перемещается и бьет Вертолеты Противника по диагонали на любое количество клеток, проходя сквозь любые фигуры и преграды
- Вертолет не может бить «наземные» фигуры, но определяет вокруг себя «область боя», в форме квадрата 3×3 клетки, пригодную для «высадки» других фигур
- Все фигуры могут проходить сквозь клетку занятую Вертолетом
- Вертолет игнорирует любые преграды, может останавливаться на поле с Миной (без потери вертолета или мины)
- Если Вeртолет бьется на поле с Миной, Мина также уничтожается
- Вертолет может быть сбит Пушкой (по обычным правилам ее боя) или Вертолетом Противника
Тaнк
- Для установки Танка, требуется 30 единиц энергии
- Для поддержки Танка, требуется 1 единица энергии за ход
- Тaнк перемещается на любое количество клеток по вертикали или горизонтали
- Тaнк бьет фигуру Противника или преграду (кроме Мины) на расстояние 1, 2 или 3 клетки по вертикали или горизонтали
- Тaнк не бьется Часовыми (что позволяет ему прорывать их линию обороны)
- Тaнк не бьется Солдатами в раскопанном состоянии
Лазутчик
- Для установки Лазутчика, требуется 100 единиц энергии
- Лазутчик перемещается и бьет в любом направлении на 1 или 2 клетки, а также «ходом коня»
- Может перепрыгивать любые фигуры или преграды
- Может уничтожать Ловушки и Мины
- Видим Противнику только если находится под боем (в том числе, в области боя Часового)
- При взятии, захватывается Противником и может быть выставлен им под своим цветом без затрат энергии
Модификаторы
Стимулятор
- Для применения, требуется 5 единиц энергии
- Добавляет к движению 1 поле с продолжением направления (Лазутчик под стимулятором может перемещаться двойным «ходом коня»)
- Не может быть применен на Тaнк или Вeртолет
Рикошет
- Для применения, требуется 15 единиц энергии
- Позволяет выполнить однократное отражение от границы доски
- Не может быть применен на Тaнк
Кругосветка
- Для применения, требуется 25 единиц энергии
- Позволяет выполнить однократный переход границы доски так, как если бы она была тороидальной
Преграды
Ловушка
- Для установки, требуется 5 единиц энергии
- Останавливает движение фигуры любого цвета на своей клетке до следующего хода
Стена
- Для установки, требуется 10 единиц энергии
- Фигуры (солдаты и офицеры) не могут пройти сквозь стену
- Не может быть уничтожена никакой фигурой кроме Танка или Пушки любой стороны
Мина
- Для установки, требуется 20 единиц энергии
- Уничтожает фигуру любой стороны (Солдат, Офицеров и Танки) при прохождении через поле
- Уничтожает фигуру любой стороны (Солдат, Офицеров, Танки и Кавалеристов) при остановке на поле
- Уничтожается после срабатывания
- Может быть уничтожена Пушкой или Лазутчиком
- Видима противнику только при условии, что находится в области боя одной из его фигур
Как легко заметить, часть этих правил может оказаться весьма сложной в реализации. Вполне возможно, что реализовать задуманное в полном объеме мне не удастся, но часто, сам процесс движения гораздо важнее возможного результата. Свое продвижение в освоении Zillions of Games я постараюсь иллюстрировать статьями на Хабре. Пока-же, я предлагаю обсудить представленные правила.
ссылка на оригинал статьи http://habrahabr.ru/post/210468/
Добавить комментарий