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

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

379
ПОДЕЛИТЬСЯ

По обеим сторонам нашего плоского бытия
нескончаемо глубоко и далековато
простирается сама жизнь.
 
         Чарлз Ховард Хинтон «Эпизод из жизни Флатландии»  
 

— Нужно было ходить пешкой на е-один-дельта-аш…
— Тогда летит 4-ый жеребец.
Пешки выходят в место слонов… — Пусть.
— Какое место слонов? Где ты взял место слонов?! Ты же девятый ход ошибочно записал!

Они покоряют космос и играют в четырёхмерные шахматы. Создатели "Звёздного пути" также не обошли тему настольных игр стороной, но, в их случае, Спок играет в шахматы в 3-х измерениях: Люди «Полдня» практически такие же как мы, но умнее и лучше нас. Почти все наверное помнят этот отрывок из незабвенного "Полдня" Аркадия и Бориса Стругацких.

Выход за обычные нам пределы двумерной шахматной доски символизирует интеллектуальную мощь людей грядущего и, по плану создателей, делает игру наиболее увлекательной. Так ли это? Что, на самом деле, могут отдать настольным играм третье и следующие за ним измерения?

6. Третье измерение
3-х-, 4-, 5- и даже 6-мерные доски не являются в Zillions of Games какой-то экзотикой. Тут есть четырёхмерные крестики-нолики, Reversi и даже что-то отдалённо напоминающее Go. Фанаты StarTrek-а также не оставлены без внимания (трёхмерная Klin Zha мне в особенности нравится). Дело не ограничивается только шахматами. Имеются варианты с гексагональными досками.

Неувязка не в реализации таковых игр, а в том, чтоб осознать, что происходит на доске: ZoG поддерживает доски вплоть до 5 измерений (Axiom поддерживает только двумерные grid-ы), но никто не мешает задать доску с случайной топологией, определив все её позиции и связи меж ними вручную.

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

Фишки по прежнему требуется расположить «в одну линию» (4 в ряд), но достигнуть этого еще труднее: Раз бы речь шла только о досках с размерностью хорошей от 2-ух, на этом статью можно было бы и окончить, но есть иной метод использования в играх третьего измерения! Кроме 2-ух игроков, в игру вмешивается «третья сила» — сила гравитации. Всем известные "Крестики-нолики" — не очень интеллектуальная игра, но как она поменяется раз поставить доску вертикально?

Фишки уже нельзя расположить в любом месте доски, они должны опираться на остальные фишки, добавленные ранее. Вот тут имеется великолепная выборка, состоящая из 92 таковых «башенных» игр. "Капитанская жёнушка" — всё ещё играет на двумерной доске, но никто не мешает применить тот же принцип и к иным играм, таковым как шашки либо шахматы. Игра обретает новое измерение.

Кроме обыденных шахматных ходов, игроку разрешается брать верхнюю фишку из хоть какой собственной стопки и переносить её (ходом короля) на другую свою стопку (стоящую рядом). В "Абстрактных шахматах", все фигуры представляют собой стопки, состоящие из схожих фишек (не считая царской фигуры, представляющей собой необыкновенную фишку). Одиночная фишка двигается как пешка, стопка из 2-ух фишек — как шахматный жеребец, из 3-х — как слон и т.д. Характеристики фигур меняются в зависимости от текущего количества фишек в стопке.

"Северные шашки", упомянутые мной в предшествующей статье могут рассматриваться как вариант "Высотных шашек", обрисованных ещё в 1961 году. Еще наиболее почтенную историю имеют "Столбовые шашки". Не стоит мыслить, что этот принцип употребляется только в синтетических играх, придуманных не так давно.

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

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

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

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

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

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

Поле ''Урской игры''(define board-defs
(image "images/Ur/ur.bmp")
(grid
(start-rectangle -483 27 -422 99)
(dimensions
("i/j/k/l/m/n/o/z/a/b/c/d/e/f/g/h/y/x" (67 0)) ; files
("4/3/2/1/0" (0 68)) ; ranks
)
)
(dummy offboard)
(links afree (z2 a4) (a4 b4) (b4 c4) (c4 d4) (d4 e4) (e4 f4) (f4 g4) (g4 offboard) )
(links bfree (z2 a0) (a0 b0) (b0 c0) (c0 d0) (d0 e0) (e0 f0) (f0 g0) (g0 offboard) )
(links anext (a0 d1) (b0 d1) (c0 d1) (d0 d1) (e0 d1) (f0 d1) (g0 d1)
(d1 c1) (c1 b1) (b1 a1) (a1 a2) (a2 b2) (b2 c2) (c2 d2)
(d2 e2) (e2 f2) (f2 g2) (g2 g1) (g1 h1) (h1 h2) (h2 h3)
(h3 g3) (g3 g2)
)
(links cnext (h2 h3) (h3 g3) (g3 g2) (g2 f2) (f2 e2) (e2 d2) (d2 c2)
(c2 b2) (b2 a2) (a2 z2)
)
(links bnext (a4 d3) (b4 d3) (c4 d3) (d4 d3) (e4 d3) (f4 d3) (g4 d3)
(d3 c3) (c3 b3) (b3 a3) (a3 a2) (a2 b2) (b2 c2) (c2 d2)
(d2 e2) (e2 f2) (f2 g2) (g2 g3) (g3 h3) (h3 h2) (h2 h1)
(h1 g1) (g1 g2)
)
(links dnext (h2 h1) (h1 g1) (g1 g2) (g2 f2) (f2 e2) (e2 d2) (d2 c2)
(c2 b2) (b2 a2) (a2 z2)
)
(links next (x1 x2) (x2 x3) (x3 offboard) )
(links up (b1 i1) (i1 i2) (i2 i3) (i3 offboard)
(d1 j1) (j1 j2) (j2 j3) (j3 offboard)
(b3 k1) (k1 k2) (k2 k3) (k3 offboard)
(d3 l1) (l1 l2) (l2 l3) (l3 offboard)
(g2 m1) (m1 m2) (m2 m3) (m3 offboard)
(c2 n1) (n1 n2) (n2 n3) (n3 offboard)
(f2 o1) (o1 o2) (o2 o3) (o3 offboard)
)
(symmetry Up (anext bnext) (cnext dnext) (afree bfree))
(symmetry ?Up (anext bnext) (cnext dnext) (afree bfree))
(zone
(name dices)
(players ?Dice)
(positions x1 x2 x3)
)
(zone
(name dices-lock)
(players ?Dice)
(positions x0)
)
(zone
(name promotion)
(players Down)
(positions h1)
)
(zone
(name promotion)
(players ?Up Up)
(positions h3)
)
(zone
(name rosette)
(players ?Up Up Down)
(positions a1 a3 d2 g1 g3)
)
(zone
(name end)
(players ?Up Up Down)
(positions z2)
)
)

Это решение вряд ли можно считать безупречным. Этот подход совершенно работает для игр семейства "Манкала", но раз порядок в наборе фишек важен и в «стопке» могут содержаться разные фигуры — начинается комбинаторика. Игрокам приходится запоминать все фишки, заблокированные в «карманах», ведь на поле они никак не показываются! Раз поле доски может содержать только одну фигуру — пусть фигурами будут сами «стопки», а не составляющие их фишки! Не считая того, человеку не знакомому с игрой, может быть трудно разобраться с тем, что происходит на доске — фишки исчезают и возникают без какой или тривиальной системы. В неких вариантах, удобнее применять иной подход.

bwwbw) (r w) (add $1bwwb) else
(if (piece? wbbbw) (r w) (add $1wbbb) else
(if (piece? wbwbw) (r w) (add $1wbwb) else
(if (piece? wbbb) (add $1wbbb) else
(if (piece? bwbb) (add $1bwbb) else
(if (piece? bwwbb) (add $1bwwb) else
(if (piece? wbbwb) (add $1wbbw) else
(if (piece? wwbww) (r w) (add $1wwbw) else
(if (piece? wwbwb) (add $1wwbw) else
(if (piece? ww) (add $1ww) else
(if (piece? w) (add $1w) else
(if (piece? bbwbw) (r w) (add $1bbwb) else
(if (piece? bwbwb) (add $1bwbw) else
(if (piece? wwwbb) (add $1wwwb) else
(if (piece? wbww) (add $1wbww) else
(if (piece? wbb) (add $1wbb) else
(if (piece? wwwww) (r w) (add $1wwww) else
(if (piece? bbwww) (r w) (add $1bbww) else
(if (piece? bbbwb) (add $1bbbw) else
(if (piece? bbbbw) (r w) (add $1bbbb) else
(if (piece? bbbbb) (add $1bbbb)

)))))))))))))))) ))))))))))))))))
))))))))))))))))
))))))))
))))
))
) bwwwb) (add $1bwww) else
(if (piece? bbbb) (add $1bbbb) else

(if (piece? wwwwb) (add $1wwww) else
(if (piece? wb) (add $1wb) else
(if (piece? bbwbb) (add $1bbwb) else
(if (piece? wwbb) (add $1wwbb) else
(if (piece? bwb) (add $1bwb) else
(if (piece? bwwb) (add $1bwwb) else
(if (piece? wwbbb) (add $1wwbb) else
(if (piece? www) (add $1www) else
(if (piece? bbb) (add $1bbb) else

(if (piece? b) (add $1b) else

(if (piece? wwbw) (add $1wwbw) else
(if (piece? bwbbw) (r w) (add $1bwbb) else
(if (piece? wwwb) (add $1wwwb) else
(if (piece? bbbww) (r w) (add $1bbbw) else
(if (piece? wbbww) (r w) (add $1wbbw) else
(if (piece? bb) (add $1bb) else

(if (piece? wwbbw) (r w) (add $1wwbb) else
(if (piece? Комбинаторика, как и было сказано(define merge-w
(if (piece? bbw) (add $1bbw) else
(if (piece? bwbww) (r w) (add $1bwbw) else
(if (piece? bbbw) (add $1bbbw) else
(if (piece? wbwbb) (add $1wbwb) else
(if (piece? bwbw) (add $1bwbw) else
(if (piece? wwb) (add $1wwb) else
(if (piece? wbwb) (add $1wbwb) else
(if (piece? wwww) (add $1wwww) else
(if (piece? wbwww) (r w) (add $1wbww) else
(if (piece? bw) (add $1bw) else
(if (piece? bbwwb) (add $1bbww) else
(if (piece? bbwb) (add $1bbwb) else
(if (piece? bwwww) (r w) (add $1bwww) else
(if (piece? wbbw) (add $1wbbw) else
(if (piece? wbwwb) (add $1wbww) else
(if (piece? wwwbw) (r w) (add $1wwwb) else
(if (piece? bbww) (add $1bbww) else
(if (piece? bww) (add $1bww) else
(if (piece? bwww) (add $1bwww) else
(if (piece? wbw) (add $1wbw) else
(if (piece? wbbbb) (add $1wbbb) else
(if (piece? bwbbb) (add $1bwbb) else
(if (piece?

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

1-ая версия не работала из за реализации этого макроса: КстатиВ процессе этого «праздника кодирования» выяснилось, что макросам ZoG очень далековато до функций высшего порядка.

(define add-piece
(if empty? add
else
(merge-$1 $2)
)
)
Подстановка параметра $1 отрабатывала замечательно, но отыскивать макрос по приобретенному имени (к примеру merge-w) ZoG решительно отрешалась, хотя в начальном коде он, очевидно, был! Пришлось чуток больше поработать руками.

Желающие могут сами подсчитать количество вероятных вариантов и сопоставить это число с 62 фигурами, использованными для реализации «Фокуса». В «Фокусе» размер «стопки» ограничен пятью фишками. В «Столбовых шашках» фигуры не покидают доску никогда! Всё что не попадает в это «прокрустово ложе» или переносится в резерв игрока, или на сто процентов удаляется с доски (в зависимости от принадлежности фишек игроку, выполняющему ход). В процессе игры, все 24 фишки могут быть выстроены в одну «башню». Очевидно, этот подход не работает в наиболее сложных вариантах. При этом, часть фигур может быть дамками! В «Столбовых шашках» нужно создавать реальную трёхмерную доску:

Описание доски в ''Столбовых шашках''(define Bdef
(image "imagesBashnebd8x8x2.bmp")
(grid
(start-rectangle 5 45 53 93)
(dimensions
("a/b/c/d/e/f/g/h" (49 0)) ; files
("8/7/6/5/4/3/2/1" (0 49)) ; ranks
)

(directions
(ne 1 -1) (nw -1 -1) (se 1 1) (sw -1 1)
)
)

(grid
(start-rectangle 407 89 455 93)
(dimensions
("A/B/C/D/E/F/G/H" (49 0)) ; files
("8/7/6/5/4/3/2/1" (0 49)) ; ranks
("-1/-2/-3/-4/-5/-6/-7/-8/-9/-10/-11/-12/-13/-14/-15/-16" (0 -3)) ; ranks
)
(directions
(u 0 0 1)(u5 0 0 5)
(r 1 0 0) ;scan
)
)
)

Левый — представляет собой обыденную двумерную доску, на которой игроки перемещают фигуры, но все ходы, выполненные на данной доске, дублируются в правом grid-е, содержащем детализированное описание фигур. Можно созидать, что Karl Scherer был очень оптимистичен в отношении очень вероятной высоты «башен». Доска, в его реализации, состоит из 2-ух grid-ов.

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

К огорчению, я не могу огласить, что решил эту делему. Как найти обладателя набора? Какие части набора могут делать ход как «единое целое» и по каким правилам? Из всего произнесенного выше обязано быть понятно, что разработка способов действенного и лаконичного описания «башенных» игр является суровым вызовом для разраба всепригодного игрового «движка». Я не вижу разумных решений на этом пути. Упорядочен ли набор фигур размещенных на поле? Было бы интригующе разрешить располагать на поле доски наиболее одной фигуры, но это решение сходу же поднимает ряд острых вопросцев.

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

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

В заключение статьи, приведу цитату из восхитительного блога Григория (gest-а), посвящённую ещё одной многомерной игре:
Можно убивать противника в прошедшем, перерезая его темпоральную линию. В ситуации, когда противник может перерезать темпоральную линию твоей фигуры и сиим воскресить фигуру, ранее убитую тобой, можно применять другую свою фигуру, чтоб уничтожить уже убитую вражескую фигуру ещё ранее.Люди выдумали много игр, над которыми можно поломать голову… habrahabr.ru … У каждого игрока по четыре фигуры. За каждой фигурой остаётся след, отмечающий её перемещения. Можно убивать вражескую фигуру в прошедшем и сиим воскресать свою фигуру, в той точке, где противник её бы убил, раз бы не был сам убит до этого.