Кілька гарних манкал

             Хоча етикетка була не того кольору і містила чимало орфографічних помилок, більша її частина перебувала на місці, включаючи зроблену крихітним шрифтом напис «Може містити горіхи».
                                                         сер Террі Пратчетт 

Го або Ур? Можна довго сперечатися, яка з ігор давнє, але переможе в цьому протистоянні, швидше за все, Манкала. Археологи вважають за краще мати справу з матеріальними свідоцтвами, але як тільки мова заходить про настільних іграх, все швидко йде в область припущень. Було знайдено чимало дощок, але набагато менше інформації про те, як на них грати. Древні не обтяжували себе детальним описом правил.

З Манкалой ситуація прямо протилежна. Це не одна гра, а досить численне сімейство. В одній тільки Західній Африці, рахунок йде на десятки (якщо не сотні) різновидів. Дошка (як матеріальний артефакт) для таких ігор не обов'язкова. Достатньо взяти жменю камінців і викопати кілька ямок в піску. Не дивно, що археологи випробовують труднощі з визначенням віку цих ігор. Їм просто нічого шукати! Але для уважного дослідника «настільних ігор», манкалы не менш цікаві, ніж птахи сімейства пересмешниковых для Чарлза Дарвіна.

На сьогоднішній день, у каталозі Zillions of Games міститься більше двох тисяч додатків. Не можна сказати, щоб серед них зовсім не було манкал. У всякому разі, двурядные і четырехрядные варіанти ігор представлені досить грунтовно. Ось такий набір ігор надається лише одним з додатків:


Це дійсно гідний список, але, як я вже писав вище, кількість манкал обчислюється сотнями, а тут представлені, скажімо так, найбільш звичні з них. Існують куди більш дивні і чудові різновиди цієї гри. І зараз я хочу ними зайнятися! Але для початку, варто скласти невеликий словничок термінів, для того, щоб люди, не знайомі з предметом, мали хоч якісь шанси в ньому розібратися.

Словничок
  • посів — У більшості народів, практикуючих їх, манкалы символізують звичну сільськогосподарську діяльність. Метафора «посіву» об'єднує всі ці ігри. Виконуючи хід, гравець забирає каміння з однією з своїх лунок і починає розкладати їх по одному, по всім наступним лунках, в одному з напрямків, дозволених правилами. Існують різні прислів'я та приказки, що зв'язують тактику гри з сільськогосподарськими поняттями, аналогічні російському варіанту «що посієш, те й пожнеш».
  • одноразовий посів — В великій кількості варіантів гри, «посів» виконується «одноразово». Після того як гравець розкладає останній з узятих каменів (не важливо, в порожню або заповнену лунку), хід переходить до іншого гравця. Існують різні варіанти «посіву», що ускладнюють розрахунок у грі. Наприклад, посів може починатися не з наступного лунки, а з поточної (тобто, один камінь просто залишається в лунці) або стартова лунка може пропускатися при посіві, якщо взяте число каменів достатньо для того, щоб зробити один або кілька кіл, обійшовши всі лунки.
  • циклічний посів — Більш складна різновид ходу. Хід починається також як і «одноразовий посів», але, якщо гравець викладає останній камінь у заповнену лунку, він негайно забирає з неї всі камені (включаючи доданий останнім) і продовжує посів з наступною лунки. Хід закінчується коли останній камінь падає в порожню лунку.
  • нескінченний посів — Як легко здогадатися, виконуючи «циклічний посів», гравець цілком може «зациклитися». Гравець не зможе завершити хід, оскільки останній камінь ніколи не буде потрапляти в порожню лунку. Така ситуація називається «нескінченним посівом» і реакція на неї регламентується правилами конкретної гри. Зазвичай, при виникненні «нескінченного посіву», партія вважається не зіграної або переграється.
  • захоплення — Мета майже будь манкалы (є кілька винятків) — захоплення максимальної кількості каменів. Правила, що дозволяють перекладати камені з дошки в свій «амбар», істотно різняться, в залежності від варіанту гри. У двурядных манкалах, правила захоплення часто пов'язані з кількістю каменів у фінальній лунці (наприклад, в "Тогыз Кумалак", захоплення виконується, якщо після додавання останнього каменю посіву число каменів в лунці стало парних). В чотирирядному манкалах, оскільки посів йде лише по своїй території, захоплення «позиційний» (Chuba, якщо останній камінь впав на порожню лунку внутрішнього ряду, захоплюються всі камені з протистоїть лунки у внутрішньому ряду противника, а також камені з наступною за нею лунки зовнішнього ряду, якщо вони там є).
  • серійний захоплення — Часто, захоплення здійснюється відразу з декількох лунок. Так наприклад, в Вари, гравець захоплює камені, якщо в останньої лунки посіву виявилося 2 або 3 каменю. Якщо в попередніх (за напрямом посіву) лунках противника також виявилося по 2 або 3 каменю, вони захоплюються теж!
  • повний захоплення — В більшості манкал, гравець не зможе виконати хід, залишившись без каменів. Часто, в таких випадках, гра завершується. Всі камені, що залишилися на території противника, перекладаються в його комору, після чого підраховуються. Це цілком нормальне завершення гри, але, щоб гра була більш цікавою, вводяться правила, метою яких є збільшення тривалості гри. Наприклад, правилами може бути заборонено виконання ходів, що призводять до захоплення всіх каменів на території противника, так званого «повного захоплення».
  • правило «голоду» — Інша сторона тієї ж монети. Якщо супротивник залишився без каменів на своїй стороні, гравець зобов'язаний «підгодувати» його, підкинувши на чужу територію хоча б один камінь. Якщо такий хід неможливий — гра закінчується. Це один з прикладів дуже рідкісною для манкал різновиди форсованих ходів, аналогічних обов'язковому взяттю Шашках або відходу з під шаха в Шахах.
  • нульовою посів — У багатьох випадках, перший гравець має перевагу. Щоб вирішити цю проблему (а також зламати всілякі дебютні «домашні заготовки»), в деяких манкалах, при виконанні першого ходу захоплення не виконується. Мета цього «нульового» прогону — рандомізація позиції на дошці. Часто для економії часу, гравці виконують «нульовий посів» одночасно. У цих випадках він служить і для визначення черговості ходу. Гравець, який завершив посів першим, робить перший хід.
  • комі — Цей термін прийшов з Го і є ще одним способом компенсації переваги першого гравця. Другий гравець, ще до початку гри, отримує деякий обумовлену кількість очок (як правило дробове, щоб виключити можливість нічиїх). В Го і деяких сучасних манкалах такий підхід активно використовується.
  • сэнтэ і готэ — Ще два поняття з Го. Сэнтэ — це хід, на який противник змушений відповісти, а готэ — навпаки, вимушений хід. Деякі сучасні манкалы оперують цими термінами, хоча і розуміють їх дещо по своєму.
  • правило «пінг-понгу»Алемунгула можлива ситуація, при якій гравці будуть мати можливість, хід за ходом, перекидати один одному один і той же камінь. Правило «пінг-понгу» забороняє подібне повторення позиції. За аналогією з попередніми термінами, його слід було б назвати "Правилом До", але, по всій видимості, жителі Ефіопії були слабо знайомі з японської грою.

Tchuka Ruma

Почати я вирішила з простого. Чука Руму не є традиційною грою (в тому сенсі, що років їй не 5000, а всього 120), але за правилами вельми схожа з Даконом, широко поширеним на території Індонезії. За винятком того що Чука Руму розрахована на гру одного людини. Так, це єдина відома мені манкала-пасьянс. Ось як вона виглядає:


Потрібно перенести всі камені в «комору» (крайню праву лунку), дотримуючись таких правил:

  • На початку гри, можна взяти камені з будь лунки (крім «комори») і виконати циклічний посів, розкладаючи камені зліва-направо і переходячи від «комори» до крайньої лівої лунки.
  • Якщо останній камінь падає в «комору», гравець отримує право повторити хід, знову вибравши будь-яку не порожню лунку, крім «комори» (саме це правило ріднить «Чука Руму» з манкалами сімейства «Чонгкак» і «Дакон»).
  • Якщо циклічний посів завершено в будь-який інший лунці — гравець програє (пасьянс зійшовся).
Ця чудова «гімнастика для розуму» вперше (у 1895 році) була описана французьким математиком Анрі-Огюстом Деланнуа в листуванні з його колегою Едуардом Лукасом. Будь-яке подібність з «Даконом» не випадково, так як, по всій видимості, саме цю гру Анрі-Огюст використовував в якості прототипу.

«найпростіший» посівВ принципі, ніхто не заважає використовувати для розробки манкал «штатний» ZRF. Купки каміння представляються окремими фігурами (за кількістю каменів) і вся завдання «посіву» полягає в правильному зміну типу декількох фігур, за один хід (ZSG-нотація стає абсолютно непридатною для читання, але читати її ніхто і не збирається). Це було б майже те ж просто як рокировкаякщо б не один фатальний недолік ZRF. В ньому геть відсутня яка-небудь арифметика!

Код на ньому дійсно кошмарен
(define AB if (piece? $1) (change-type $2) else)

(define OC (set-position-flag occ true))

(define ABC
((AB $1 $2) ((AB $3 $4) ((AB $5 $6) ((AB $7 $8)
((AB $9 $10) ((AB $11 $12) ((AB $13 $14) ((AB $15 $16)
((AB $17 $18) ((AB $19 $20) ((AB $21 $22) ((AB $23 $24)
((AB $25 $26) ((AB $27 $28) ((AB $29 $30) ((AB $31 $32)
((AB $33 $34) ((AB $35 $36) ((AB $37 $38) ((AB $39 $40) 
((AB $41 $42) ((AB $43 $44) ((AB $45 $46) ((AB $47 $48)
((AB $49 $50) ((AB $51 $52) ((AB $53 $54) ((AB $55 $56)
((AB $57 $58) ((AB $59 $60) ((AB $61 $62) ((AB $63 $64)
((AB $65 $66) ((AB $67 $68) ((AB $69 $70) ((AB $71 $72)
(set-flag emu true)))))))))))))))))))))))))))))))))))))
)

(define sow-in-store cascade (while not-empty? e) to (OC) (go from))

(define sow-in-store2 
cascade (while not-empty? e) 
cascade e to (while (not-in-zone? store) (opposite e))
)

(define sow-in-store3 
cascade (while not-empty? e) 
cascade e cascade e to (while (not-in-zone? store) (opposite e))
)
...


Це частина реалізації Калаха і продертися через все її макроси дійсно не просто. Я вирішив не мучити свій мозок і задіяти Axiom. Використовуваний їй, як скриптової мови, ForthScript звичайно надає процесу програмування деяку пікантність. Але в ньому можна складати числа!

Почнемо з визначення фігур
DEFER MARK
...
{pieces
{piece} m
{piece} p1 1 {value}
{piece} p2 2 {value}
...
pieces}
...
'm IS MARK


Фігура m — фіктивна. Від неї буде виконуватися «відлік» при побудові всіх інших фігур. Псевдонім MARK дозволить на неї посилатися з вищерозміщеного коду. Числове значення — кількість каменів у «купці» і, за сумісництвом, вага «фігури», використовуваний AI Axiom (для «Чука Руми» це питання особливо актуальне, але в іграх двох гравців буде мати першорядну важливість).

Додамо рухомі фігури
get-value ( -- value )
empty? IF ( Якщо поле пусте )
0 ( Повертаємо 0 )
ELSE ( інакше )
piece piece-value ( Дістаємо значення value з опису фігури )
ENDIF
;

: move-q ( -- )
get-value stone-count ! ( Зберігаємо кількість каменів в змінну )
next verify ( Переміщаємося в наступну лунку )
move from here ( Переносимо фігуру з її початкового положення в поточне )
build-trace ( Розраховуємо зміни всіх фігур )
from to ( Повертаємося у вихідну точку )
use-trace ( Застосовуємо всі розраховані зміни ... )
add-move ( і завершуємо генерацію ходу )
;

{moves q-moves
{move} move-q
moves}

{pieces
...
{piece} q1 {moves} q-moves 1 {value}
{piece} q2 {moves} q-moves 2 {value}
{piece} q3 {moves} q-moves 3 {value}
...
pieces}


Тут є дві «темні конячки» — build-trace та use-trace, далі ми розглянемо їх базову реалізацію. Частина, що залишилася move-q пов'язана з «переміщенням» фігури. Справа в тому, що будь-який хід у ZoG повинен бути пов'язаний з одним з двох можливих дій: переміщенням фігури з однієї позиції дошки на іншу (move) або додаванням нової фігури на дошку (drop). Відповідно, одне з цих керуючих слів повинно бути задіяно і в описі ходу. Всі інші (побічні) дії повинні виконуватися після цього (основного) дії.

Розрахуємо «трасу»
COLS [] trace[]
VARIABLE trace-count
VARIABLE stone-count

: build-trace ( -- )
0 trace-count ! ( На всякий випадок, "очищаємо" масив )
0 BEGIN ( і починаємо цикл )
DUP COLS >= IF ( Якщо виявилося, що ми обійшли навколо дошки )
DROP 0 ( Зацикливаем масив, його довжина не повинна перевищувати кількості лунок )
ENDIF
DUP trace-count @ < IF ( Якщо ми вже обчислювали кількість каменів в цій лунці )
DUP trace[] @ ( Дістаємо раніше обчислене значення )
ELSE ( інакше )
trace-count ++ ( Збільшуємо розмір масиву )
from here <> IF ( і якщо це не вихідна лунка )
get-value ( Дістаємо з неї кількість каміння )
ELSE
0 ( Вихідна лунка спочатку порожня, ми "вийняли" з неї каміння )
ENDIF
ENDIF
1+ OVER trace[] ! ( Додаємо один камінь )
stone-count -- ( Зменшуємо кількість каміння )
stone-count @ 0= IF ( І якщо камені скінчилися ... )
TRUE ( Завершуємо цикл )
ELSE ( інакше )
1+ next verify ( Рухаємося по дошці далі )
FALSE ( і НЕ завершуємо цикл )
ENDIF
UNTIL ( Цикл завершується, якщо на верхівці стека TRUE )
... ( Тут зручне місце для всякої "магію" )
DROP
;


Всі зміни розраховані, залишилося їх застосувати!

І змінимо всі фігури, що потрапили під роздачу
: use-trace ( -- )
0 BEGIN ( Перебираємо всі елементи масиву )
next verify ( Рухаючись в напрямку посіву )
DUP trace[] @ ( Виймаємо з масиву кількість каміння )
MARK + create-piece-type ( І створюємо фігуру соответвующего типу, додаючи його до MARK )
1+ DUP trace-count @ >= ( Якщо кінець масиву - завершуємо цикл )
UNTIL DROP ( Не забуваємо стежити за стеком ! )
;


Ну ось, ми навчилися брати камені з лунки і розкладати їх по одному, у напрямку посіву. В тому чи іншому вигляді, цей код буде використаний у всіх сьогоднішніх манкалах. Зрозуміло, реальний код трохи складніше. Наприклад, доводиться «підсвічувати» ті групи каменів, ходити якими дозволено (інакше сходити ними не вдасться) і знімати підсвічування з інших груп. При попаданні в «комору», необхідно позначати всі групи, що залишилися на дошці. І зрозуміло, необхідно написати код, що визначає умови завершення гри. Купа дрібниць, без яких нічого працювати не буде!

Ось що вийшло в результаті:



Треба сказати, що AI Axiom клацає такі задачки «як горішки». Початковий розклад (по два камені в чотирьох лунках) ZoG вирішила на мінімальних налаштуваннях «тривалості ходу». Для більш складних розкладів, налаштування довелося «підкрутити», оскільки, в іншому випадку, програма потрапляла в глухий кут. В процесі тестування, був знайдений ще один «вирішується» розклад, для любителів «поламати голову».

Ohojitxi

цю досить оригінальну манкалу грають в республіці Кот-Д'івуар. Зовні вона виглядає як звичайна двурядная манкала, з шістьма лунками на кожній стороні, але оскільки при грі дошка розташовується «вертикально», її більш доречно відносити не до двурядным, а до «шестирядним» манкалам. Посів одноразовий, проти годинникової стрілки і тільки на своїй території — в трьох рядах, звернених до гравця.

На цьому несподіванки не закінчуються! Мета гри — захоплення каменів супротивника, а позбавлення від своїх власних. Захоплені камені передаються противнику (поміщаються в одну з його лунок). Хто перший позбудеться усіх своїх каменів — той і переміг. Захоплення серійний, якщо останній камінь падає в лунку з трьома каменями (доповнюючи їх до чотирьох) — камені захоплюються. Разом з ними захоплюються каміння з усіх попередніх (проти напрямку посіву) лунок, містять чотири каменю. Якщо б спочатку всі 24 каменю перебували в одній лунці, гру можна було б завершити за один хід!



Загалом, гра досить забавна. На перший погляд, вона не сильно відрізняється від попереднього пасьянсу (оскільки посів завжди ведеться лише на своїй території), але якщо супротивник встигне зібрати четвірку» раніше вас, будьте впевнені, він постарається вибрати лунку таким чином, щоб максимально розбудувати всі ваші плани (і все доведеться починати спочатку). Єдине обмеження полягає в тому, що він не може щоразу вибирати одну і ту ж лунку.

Як важливо бути уважнимДошка Аксіоми — це один великий лінійний масив. Серйозно, ми можемо просто почати з нуля і перебрати всі позиції, додаючи до індексу одиничку. Оскільки, в реальному житті рідко зустрічаються одномірні дошки (рідко, але встречаются), Axiom дбає про нас, даючи засіб для визначення дощок «двовимірних»:

2 CONSTANT COLS
6 CONSTANT ROWS

{board
ROWS COLS {grid}
board}

Насправді, це все той же одновимірний масив, осередки якого пойменовані забавним чином (ще він дозволяє визначати «напряму», оперуючи приростами координат, а не парами позицій, але це нам не знадобиться):


У ZRF-описі, ми повинні розмітити дошку аналогічним чином, щоб ZoG розуміла, з чим має справу:

(board 
(image "Images/Ohojitxi/6x2.bmp")
(grid
(start-rectangle 6 4 73 89)
(dimensions
("a/b" (67 0)) ; files
("6/5/4/3/2/1" (0 85)) ; ranks
)
)
)

Ось з цього місця і починається веселість. Ми пишемо багато коду, кодуючи посіви і захвати, поступово забуваючи про смутному і відсталому ZRF. В якийсь момент, нам стає конче необхідно закодувати нове правило — «виконуючи захоплення, гравець не може щоразу вибирати одну і ту ж лунку супротивника». Очевидно, позначення лунок необхідно десь зберігати! А де ще, якщо не на дошці?

4 CONSTANT COLS

Сміливо розширюємо дошку вдвічі! Ні, це навіть працює. Деякий час. Відразу слідом за цим, ми отримуємо від програми загадкове послання:


Ясно, що хтось когось не розуміє, але щоб згадати про ZRF потрібно ще півгодини нервових пошуків! І вже після того як гра зроблена, налагоджена й навіть відправлено для публікації, спливає той факт, що варіантів дощок ми робили два.

Грати в Охочичи приємно при наявності великої кількості вільного часу. Партія рівних суперників може тривати дуже довго. Для того, щоб зібрати останні камені, доводиться витратити чимало ходів. Як правило, противник встигає раніше і все починається з початку. Серійний захоплення допомагає розірвати порочне коло, але його ще треба скласти. Коли программа грає сама з собою», середня тривалість партії становить близько 500 ходів (втім, мене вона обігрує так швидко, що я не встигаю збагнути, що сталося).

Afrika

Так-так, саме через цю літеру! Слово-то німецьке. Я маю на увазі, що придумав гру німець — Ralf Gering. І сталося це в 2004 році. Це скандальна манкала! По-перше, їй менше 120 років. Крім цього, вона зібрала 5 «рейтингів ненависті» на BoardGameGeek. Згодом з'ясувалося, що всі вони від «віртуалів» одного і того ж людини (підозрюю, що це було щось особисте) і з п'яти був залишений один, перший.

Якщо говорити серйозно, то ця гра дуже не схожа на всі інші манкалы. За «геймплею» вона набагато ближче до Шашок. Вся справа в механізмі захоплення. В «Африці» він обов'язковий! В інших манкалах теж є «форсовані» ходи (правило «голоду» — у більшості африканських манкал), але там вони не мають такого першорядного значення! Якщо є можливість захоплення — гравець повинен брати! І це те, що робить гру унікальною.


Правила прості. Посів одноразовий, завжди зі свого ряду, проти годинникової стрілки, без заходу в «комори». Захоплення здійснюється з не порожній лунки противника, розташованої навпроти порожній лунки гравця і може виконуватися лише з лунок, що містять мінімальну кількість каменів (якщо в одній лунці два камені, а в іншій три — брати можна тільки з тієї, де два). Захоплення вважається окремим ходом і має пріоритет по відношенню до «посіву». Такі правила закономірно призводять до тактики «віддай менше, щоб забрати більше»:


Діаграма чудово ілюструє концепцію. Ми віддаємо один камінь, щоб натомість забрати чотири (відразу скажу, що настільки очевидний хід згодом заводить у глухий кут, у задачки є найкраще рішення). Саме чудове в цьому те, що супротивник не може ігнорувати нашу жертву. Він зобов'язаний взяти камінь і, втрачаючи хід, не може захистити свої. Це в набагато більшою мірою «сэнтэ» чому зміст, вкладений у це поняття Го. Як і в Шашках, відмова від форсованих кроків зробить гру менш цікавою.

Як правило, в іграх з «обов'язковим взяттям», «зворотна гра» представляє певний інтерес (можливо для багатьох буде сюрпризом, але "Поддавки"в тактичному плані, набагато більш складна гра, ніж звичайні шашки). У листопаді 2010 року, Benedikt Rosenau запропонував «зворотний» варіант гри, на основі правил «Африки». Зрозуміло, я реализовал обидва варіанти гри.

Чиї камені?Охочичи посів вівся на своїй території, а в «Чука Румі» гравець взагалі був один. «Африка» — перша гра, в якій ми заходимо на територію противника. Негайно виникає проблема. Справа в тому, що в ZoG гравець може переміщати тільки свої фігури! Почасти, це обмеження пов'язане з питаннями продуктивності і воно може навіть здаватися розумним, до тих пір, поки ми не стикаємося з чимось на зразок цієї. В нашому випадку важливо, що ми повинні стежити не тільки за типом фігур (кількість каменів і відмітка), але і за їх належністю.

На щастя, це просто
get-player ( -- )
here COLS < IF ( Якщо поточна позиція у верхній половині дошки )
Second ( Фігура належить гравцеві Second )
ELSE ( інакше ... )
First ( Це First )
ENDIF
;


Це майже все, про що доводиться піклується, за винятком одного нюансу. Якщо після ходу гравця, на його території залишаються групи, розташовані навпроти порожніх лунок, ми повинні знайти найменшу з них і позначити її (а також, можливо, ще кілька груп, містять рівну кількість каменів) для того, щоб один з них зміг взяти супротивник (це буде його обов'язковий хід). Зрозуміло, взяти він їх зможе тільки за умови того, що позначені фігури будуть належати йому, отже цю ситуацію доведеться обробити особливим чином:

Помічаємо фігури
: use-trace ( -- )
0 BEGIN
next verify
get-player ( Визначаємо, на чиєму ми боці )
OVER trace[] @ ( і кількість каменів )
DUP min-target @ = IF ( Якщо воно збігається з метою захоплення )
OVER current-player = IF ( і розташовано на нашій стороні )
check-target ( Помічаємо групу каменів, що підлягає захопленню )
ENDIF
ENDIF 
DUP 0< IF ( Якщо група каменів позначена )
SWAP DROP next-player SWAP ( Їй повинен володіти противник )
ENDIF
MARK + create-player-piece-type ( Обчислюємо тип фігури і створюємо її з правильним власником )
1+ DUP trace-count @ >= ( Перебираємо елементи масиву, поки вони не закінчаться )
UNTIL DROP
...
;


Оскільки, з нашої точки зору, хід циклічного посіву являє собою послідовність одноразових посівів, аналогічним чином доведеться обчислювати власника «упаковок» фігури, що опинилася на території супротивника. У «Чука Руму» циклічний посів теж був, але ця проблема не актуальна, оскільки гравець був всього один.

Статистично, перший гравець має невелику перевагу, але я не став вводити комі (2.5 очка) для другого гравця. Першим ходить людина і невелика перевага в боротьбі з машиною не буде зайвим.

Gabata

Закінчивши «розминку», я приступив до двох найбільш цікавим для себе ігор. Обидві граються на унікальній трирядної дошці і поширені на східному узбережжі Сомалійського півострова. Власне, дошка і дає назву першої з них. Габата — дуже архаїчна ігрова система. Деякі дослідники вважають її родоначальницею всіх манкал. Форма дошки диктує незвичну схему посіву. Це простіше показати, чим пояснити:


Стрілки показують напрямок посіву. Посів циклічний і починати хід можна тільки зі своїх лунок (нижній ряд і три правих лунки в другому ряду). У принципі, більшість ігор, традиційно граються на дошці «Габаты», можна було б грати на звичайній, двурядной дошці, але в самій «Габате» трехрядность використовується при виконанні захоплення. Якщо останній камінь падає в порожню лунку, гравець захоплює всі камені супротивника, розташовані в тому ж стовпці дошки.

Тонкощі захопленняСемантика переміщення фігур в ZoG химерна. Спочатку є дві можливості: переміщення фігури з одного поля дошки на інше (move) і створення фігури заданого типу на вибраному полі (drop). Найголовніше, про що доводиться пам'ятати, це те, що на всьому протязі розрахунку ходу, позиція на дошці залишається в тому ж стані, в якому вона була на момент початку розрахунку. Це здається логічним, але на практиці псує чимало крові.


На діаграмі представлено кейс, з яким я зіткнувся досить пізно, коли гра, в основному, була вже готова. Другий гравець (той що зверху) повинен взяти один камінь (зі свого ж посіву) і продовжити захоплення. Так це повинно виглядати. А ось як це виглядало:


В якийсь момент, я помітив, що у гравця виявилося дві виділених групи каменів! Спробуємо розібратися, що сталося. Виконуючи посів, ми «перемістили» групу з 4 каміння на одну лунку вправо (там же вона і залишилася). Якби не виконувалося взяттів, ми повинні були б замінити вміст лунки одним каменем, але так як ми взяли цей камінь, то обнулили його в trace:

: use-trace ( -- )
0 BEGIN
next verify
DUP trace[] @
DUP 0 <> IF
...
ELSE ( Якщо посіяні камені необхідно видалити )
DROP ( Стежимо за стеком !!! )
empty? NOT IF capture ENDIF ( Видаляємо камені із лунки, якщо вона не порожня )
ENDIF
1+ DUP trace-count @ >=
UNTIL DROP
;

Ми видаляємо взяті камені з не порожніх лунок, але в нашому випадку, лунка була порожня! Ми не намагалися заповнити її каменем з посіву (оскільки він був узятий), але і не видалили камені з неї (оскільки при спробі видалення з порожньою лунки можуть виникнути проблеми). Чого ми не врахували, так це того, що лунка, порожня початку ходу, цілком може перестати бути такою по його завершенні. Лунка була заповнена «основним» дією по перенесенню каменів у сусідню лунку. Мораль цієї історії в тому, що не тільки початкове поле ходу слід обробляти особливим чином.

Легко бачити, що захвати, що виконуються в різних стовпцях, не рівноцінні. Можливі захоплення відразу з двох лунок, також як і ситуації, при яких захопити не вдасться взагалі нічого (наприклад, при завершенні ходу в одній з трьох початкових лунок противника). Гравець отримує право на виконання ще одного ходу, каменем здійснила захоплення (необмежену кількість разів) і це правило вносить в гру ще більше тактичне різноманітність. Габату часто називають «піратської манкалой» і з тим, що грають в неї на території Сомалі це пов'язано лише частково:



Коли один з гравців не може виконати черговий хід, його опонент захоплює всі залишилися на дошці камені. Гра триває кілька раундів (це характерно для всіх ігор на дошці «Габаты»). Починаючи черговий раунд, гравці розкладають камені, захоплені в попередньому раунді, за своїм лунках, по три, починаючи з лівого, в нижньому ряду. Якщо в останньої лунки виявляється менше трьох каменів, більш сильний гравець, доповнює її до трьох, з своїх каменів. Залишилися камені більш сильного гравця відразу йдуть у його «комора». Виграє той, хто збере камені.

Selus

Ця гра — моя кохана! Грається на тій же дошці, що і Габата (і також, з використанням циклічного посіву), але із зовсім іншим механізмом захоплення. У ній, гравці будують пастки («wegue»). Ходити з wegue не можна, але будь-який камінь, що потрапив до них, стає власністю їх створила гравця. Побудувати пастку просто — якщо останній камінь посіву потрапляє в лунку з трьома каменями (доповнюючи її до чотирьох), лунка стає wegue. Кількість wegue не обмежено!

Не можна назвати такий механізм захоплення унікальним. Є кілька споріднених Селусу ігор з аналогічним взяттям каменів. У казахській манкале "Тогыз Кумалак" гравець може побудувати «туздык» (але тільки один за гру), зібравши три каменю в лунці. Унікальність Селуса в тому, що камені, що потрапили в лунку, можна захоплювати (в тому числі, «відбираючи» їх у супротивника). Якщо останній камінь посіву падає у wegue, він захоплюється в «комору» гравця, забираючи з собою ще один камінь з пастки.



Якщо захоплення виконується зі своєї wegue, гравець отримує ще один хід, але є один виняток. Крайня ліва лунка, в нижньому ряду, називається «ayemi» («око»). Гравець не може захоплювати камені з ayemi на своїй стороні, а захопивши камінь з ayemi на стороні супротивника, завжди отримує право на додатковий хід (незалежно від того, ким була побудована wegue). Очевидно, що будувати wegue у своєму ayemi вкрай небажано!

З початкового розкладу, wegue могли б бути створені самими першими ходами. Щоб цього не відбувалося, wegue забороняється створювати першим ходом кожному з гравців. Потрапивши в лунку з трьома каменями (на першому ходу), гравець просто продовжує циклічний посів далі. У цій грі немає одночасного нульового посіву, як в Габате, але підсумковий результат нітрохи не гірше. Камені в лунках «перемішуються» просто чудово.

Також як Габата, Селус грається в кілька раундів, до повного відлучення каменів, але тут гравець може пропускати хід (тільки в тому випадку, якщо ходити йому нічим). Його супротивник, просто продовжує ходити за звичайними правилами. Лише коли обидва гравці не можуть виконати хід, гра закінчується. Гравці підраховують камені в своїх «пастки» і «коморах» і той, хто набрав більше, вважається переможцем.

Сюрприз від AxiomПропуск ходу — особливо болюча тема! Фактично, це такий спеціальний хід, який не змінює на дошці нічого і не пов'язаний з будь-якою фігурою. У Axiom можливість пропуску ходу описується явно:

{move-priorities
{move-priority} normal-type
{move-priority} pass-type
move-priorities}

{moves p-moves
{move} move-p {move-type} normal-type
{move} Pass {move-type} pass-type
moves}

{pieces
...
{piece} m
{piece} p1 {moves} p-moves 1 {value}
...
pieces}

Якщо ZRF налаштований правильно (опція "pass turn" = forced), хід пропускається автоматично (при відсутності можливості будь-якого іншого ходу). Але не все так просто. Припустимо, у гравця є wegue і, крім них, немає ніяких інших фігур на його боці. Це може здатися несподіваним, але замість Pass, ми отримуємо таке повідомлення:


Справа в тому, що Pass хід був пов'язаний з p-moves, а оскільки фігур з цим обробником у гравця немає, Axiom навіть не намагається їх «рухати»! Щоб все працювало правильно, обробник ходів необхідно змінити і пасток теж (не важливо, що він буде складатися тільки з Pass-ходу). Іншим способом, могло б стати створення фіктивного типу фігур з обробником drop ходів, аналогічно тому, як сама Axiom обманює ZoG:

; The following dummy piece is required in order to placate the Zillions engine.
; It appears as though Zillions must find at least one "moves" keyword somewhere
; in the zrf in order for it to be happy and thus allow "moves" to work correctly.
(piece 
(name Dummy)
(dummy) (moves (from))
)

Цей коментар можна відливати з бронзи.

З пастками в Селус вийшло невелике різночитання. Дмитро Скирюк стверджує, що при захопленні останнього каменю, пастка ліквідується, але задачка, зустрічається в ряді джерел, натякає, що це не так. Я зробив обидва варіанти (і завдання). Габату можна знайти в тому ж архіві.

До чого я це все?

Манкалы — це весело! А їх розробка за допомогою Axiom — так і зовсім перетворює життя в одне суцільне пригода.

Джерело: Хабрахабр

0 коментарів

Тільки зареєстровані та авторизовані користувачі можуть залишати коментарі.