LINK href="stylusvkhr.css" rel=STYLESHEET>


TÁBLAJÁTÉKOS:

Zillions progi-suli

Eddig tucatnyi "progit" sikerült összehoznom úgy,
hogy mindig kerestem egy meglévő mintát,
aminek igyekeztem megérteni a működését, majd átpiszkáltam a saját terveim szerint.
A különböző mozgások és nyerőhelyzetek leírásához lehet hasznos a lentebbről letölthető munka-progi...

5. A bábumozgatások leírása

Sokakat zavar a Zillivel való első ismerkedéskor az, hogyha (ez az alap-beállítás) a szabályok (az adott állásban) csak egyetlen lépését engedélyezik egy bábunak, akkor (rákattintásra) azt azonnal végrehajtja. Nem jelenik meg előtte a választást felkínáló zöld pötty az érkezési mezőn. (Különösen akkor bosszantó, ha egy újabb játékkal ismerkedünk és a zöld pöttyökből próbáljuk kitalálni azt, hogy mi lehet a lépés-szabály.)
Ez az automatizmus kikapcsolható a "View" legördülő "options" menüjének "Smart Moves" letiltásával. Az olyan játékoknál viszont, amelyekben a lépés egy bábu letételét, majd ugyanazon bábu elmozdítását jelenti, feltétlen javasolt ennek funkciónak a visszakapcsolása. (Ha pl. a tologatós amőbánál nem kapcsoljuk be ezt a funkciót, akkor lépésenként kétszer kell kattintani: előbb a golyó letételéhez, majd a letett golyó eltolásához.)

A Zilli alapvetően "nagyon sokat tud" a táblás játékokról. Sokszor vált ki belőlem a Zilli "programmozása" olyan érzést, mint amikor egy táblajáték-bemutatón a haladóknak mutatok meg valamilyen új táblást. Nem kell az alapokkal bíbelődni. Tudják, hogy egy olyan játékról van szó, amelyben egy táblán bábukat mozgatunk, ezeknek a mozgatásoknak vannak szabályai, van egymásra következés sorrendje, van valamilyen elérendő cél, mi több: sok hasonló játékot ismernek már. Tudják, hogy: mi az a "lépéskényszer", mit jelent az "ütéskényszer" , többnyire "döntetlent" jelent a "lépésismétlés" és két "passz" után általában vége van a játéknak... Ha nem jelzek változást, akkor tudják, hogy a lépésre következők a "saját bábuikat" mozgatják, a lépéseket felváltva "egyenként, egymást követően" teszik meg, stb.

Mindez mellett a Zilli roppant célratörő. Egyáltalán nem csodálkozik rá egy-egy míves táblára, vagy egy-egy szokatlan lépéskombinációra..., az egészből csak a játék célja "érdekli". Minden befejezett lépéshez hozzárendel egy-egy értékelő számot, mely annál nagyobb pozitív érték, minél közelebbnek (biztosabbnak) "látja" a megadott cél elérését. És még csak nem is "gondolkozik". Ha "ő következik lépésre", akkor egyszerűen minden lehetséges lépést kipróbál és a hozzájuk rendelt értékelőszámok alapján választ közülük...
Egy-egy lépés tehát annyiban "érdekli", hogy mi lesz az utána következő állás.


A Zilli (kézenfekvő értelmezésben) két alapvető módot ismer a bábuk táblán elfoglalt helyzetének megváltoztatására:
Az újabbak lerakásait ("drops") és a már táblán lévők elmozdítását ("moves") .
(Miután "egy mezőn - egy bábu" rendre van felkészülve, az ütést ("captured") mindkét helyzetváltoztatási mód automatikusan is eredményezheti, ha az érkezési mező nem üres.)
A két alapvető lépés inputjában is különbözik.
Lerakáskor: a Zilli a tábla összes mezőjét átvizsgálja, hogy a megadott szabály melyikre engedélyezi új bábu letételét. Ha engedélyezett mezőre kattintunk és csak egy féle bábunk van, akkor azt azonnal leteszi. (Ha több féle lerakható bábu közül is választhatunk, akkor a letétel előtt egy párbeszéd-ablakot nyit.)

Mozgatáskor (nem megváltoztatható alaphelyzet): a Zilli csak a lépésre következő játékos bábuit vizsgálja meg, hogy hova léphetnek. A mozgatásra kiválasztott bábura való kattintáskor felmutatja a választási lehetőségeket. Ha a bábu mozgásképtelen, azt külön kinyíló ablakban jelzi. Ha egyetlen lépési lehetősége van, akkor azt (a "Smart Moves" opció engedélyezett állapotában) azonnal meg is lépi.

Minden megtett(*) lépés után azonnal megvizsgálja nem csak a játék céljában megadott feltételek teljesülését, de figyel a lépésismétlésekre is, illetve azonnal jelzi azt is, ha az adott állásban következő lépésképtelen.
(*) Az összetett lépéseknél ("add-partial") ezek a vizsgálatok természetesen elmaradnak.


Fentiek, mind olyan alapértelmezések, amelyekhez igazodniuk kell az adott játékra megírt zrf utasításainak.
Kezdetben, ennek inkább a hátrányait fogjuk tapasztalni. Megfeledkezve valamiről, ami eltér egy alapértelmezéstől, nem feltétlen fogunk hiba/hiány-jelzést kapni és mégsem azt csinálja a Zilli amit akartunk. A másik, talán még gyakoribb, hibát a zárójelezés pontatlanságai fogják jelenteni.

Mindkettő elkerüléséhez hasznos lehet a bábumozgások és a nyerőhelyzetek
próbálgatásaihoz ajánlott munka5-könyvtárban kísérletezgetni.
(Hálóról nem indul, de letölthető munka5.zip)


A Babu_0.zrf csak a munkatáblát leíró utasításokat tartalmazza és két játékos felváltva teheti le egy-egy bábuját ennek a táblának az üres mezőire. A drops-tartalmának átírásával más más lerakási szabályokat próbálhatunk ki.

A Babu_3.zrf-ben, játékcél nélkül, játékosonként két-két különböző bábut rakhatunk a tábla mellé előkészített készletből, majd ezekkel különböző mozgásokat tervezhetünk a táblán.

A 9x9-es tábla valójában 13x9-es méretű, de ennek csak a középső 9x9-es része lesz a játékmező. A bal- és a jobb- oldali oszlopok mezőire a játékosok induló bábukészlete van felrakva a parti kezdetén. Ezek: a "kintP1" és a "kintP2" nevű zónák. A kinti zónák és a játszórész között egy-egy oszlop mezői törölve lettek.
Két különböző típusú mozgás van definiálva:
"atrakas" és "lepes" , amelyek közül elsődleges az átrakás [move-priorities atrakas lepes]. (Akkor szabad csak lépés-típusú mozgást tenni, ha átrakás-típusú nem lehetséges.) Az átrakások úgy működnek, hogy a kinti zónák bármelyik mezőjén álló bábu a 9x9-es játszórész bármelyik mezőjére áttehető...
A "babu_1" és a "babu_2" átrakás típusú lépéslehetősége megegyezik, de a lépés-típusú mozgásuk eltér a másikétól.
A babu_2 a rácsirányban léphet a szomszédos üres mezőre.
A babu_1 akkor is léphet, ha a mellette lévő mező nem üres, mert lépése során a választott rácsirányban a közvetlen mellette állókat egy pozícióval eltolva csinál helyet a mozgásának (, kivéve azokat az eseteket: amikor a mellett álló összefüggő bábusor kiér a 9x9-es játszórész széléig, azaz a sor végén nincs üres mező [while not-empty?]).

A progiban a két féle bábu lépés-típusú mozgásainak megváltoztatása csupán a pirossal írt sorok átpiszkálásával elérhető... A Zillire eddig elkészített kétszemélyes játékok mozgásleírásai többségükben átfogalmazhatók a munkaproginkba... Ha a lépéslehetőségek kiválasztásához bonyolultabb vizsgálatok is szükségesek (pl. a mozgatott sorban többségben kell lennie a lépőnek), akkor azok további "define"-k megszerkesztését és azoknak az átírt piros sorokba való behívását igénylik... (Ilyeneket lenne érdekes majd bemutatni a progisuliban, egy-egy konkrét példa megoldásaként.)

;
; próba-progi_3 lépésekhez, nyerőállásokhoz, stb-hez
; ha gyorsítani kívánjuk a lerakást, akkor írjuk át a "board-setup" -ot
; Különböző mozgatások kipróbálásához a pirossal írt sorokat kell csak átírni!
;**********************************************************************

(define eltol ( (if (and (not-in-zone? kintP1) (not-in-zone? kintP2))

$1 (go from)(while not-empty? cascade from $1 to) add )))
(define lep ( (if (and (not-in-zone? kintP1) (not-in-zone? kintP2))
$1 (if empty? add) )))

(define at_a1 ((if (or (in-zone? kintP1) (in-zone? kintP2))a1 (if empty? add)))
)
(define at_a2 ((if (or (in-zone? kintP1) (in-zone? kintP2))a2 (if empty? add)))
)
(define at_a3 ((if (or (in-zone? kintP1) (in-zone? kintP2))a3 (if empty? add)))
)
(define at_a4 ((if (or (in-zone? kintP1) (in-zone? kintP2))a4 (if empty? add)))
)
(define at_a5 ((if (or (in-zone? kintP1) (in-zone? kintP2))a5 (if empty? add)))
)
(define at_a6 ((if (or (in-zone? kintP1) (in-zone? kintP2))a6 (if empty? add)))
)
(define at_a7 ((if (or (in-zone? kintP1) (in-zone? kintP2))a7 (if empty? add)))
)
(define at_a8 ((if (or (in-zone? kintP1) (in-zone? kintP2))a8 (if empty? add)))
)
(define at_a9 ((if (or (in-zone? kintP1) (in-zone? kintP2))a9 (if empty? add)))
)

(define r_a1 ( (if (or (in-zone? kintP1) (in-zone? kintP2))
a1 (while on-board? $1 (if empty? add))))
)
(define r_a2 ( (if (or (in-zone? kintP1) (in-zone? kintP2))
a2 (while on-board? $1 (if empty? add))))
)
(define r_a3 ( (if (or (in-zone? kintP1) (in-zone? kintP2))
a3 (while on-board? $1 (if empty? add))))
)
(define r_a4 ( (if (or (in-zone? kintP1) (in-zone? kintP2))
a4 (while on-board? $1 (if empty? add))))
)
(define r_a5 ( (if (or (in-zone? kintP1) (in-zone? kintP2))
a5 (while on-board? $1 (if empty? add))))
)
(define r_a6 ( (if (or (in-zone? kintP1) (in-zone? kintP2))
a6 (while on-board? $1 (if empty? add))))
)
(define r_a7 ( (if (or (in-zone? kintP1) (in-zone? kintP2))
a7 (while on-board? $1 (if empty? add))))
)
(define r_a8 ( (if (or (in-zone? kintP1) (in-zone? kintP2))
a8 (while on-board? $1 (if empty? add))))
)
(define r_a9 ( (if (or (in-zone? kintP1) (in-zone? kintP2))
a9 (while on-board? $1 (if empty? add))))
)

(game (players P1 P2)
(turn-order P2 P1)
(move-priorities atrakas lepes)
(board (image "images\Suli\Suli9x9.bmp" ) (grid (start-rectangle 4 11 39 46)
(dimensions ("k/l/a/b/c/d/e/f/g/h/i/m/n" (40 0))
("9/8/7/6/5/4/3/2/1" (0 40))
)
(directions (n 0 -1)(s 0 1)(w -1 0)(e 1 0) (nw -1 -1)(ne 1 -1)(sw -1 1)(se 1 1) )
)
(zone (name kintP1) (players P1) (positions k1 k2 k3 k4 k5 k6 k7 k8 k9))
(zone (name kintP2) (players P2) (positions n1 n2 n3 n4 n5 n6 n7 n8 n9))
(kill-positions l1 l2 l3 l4 l5 l6 l7 l8 l9 m1 m2 m3 m4 m5 m6 m7 m8 m9)
)
(piece (name babu_1)
(image P1 "images\Suli\babu_1P1.bmp" P2 "images\Suli\babu_1P2.bmp")
(moves (move-type atrakas)
(at_a1)(at_a2)(at_a3)(at_a4)(at_a5)(at_a6)(at_a7)(at_a8)(at_a9)
(r_a1 e)(r_a2 e)(r_a3 e)(r_a4 e)(r_a5 e)(r_a6 e)(r_a7 e)(r_a8 e)(r_a9 e)
(move-type lepes)
(eltol e )(eltol w )(eltol s )(eltol n ) ) )
(piece (name babu_2)
(image P1 "images\Suli\babu_2P1.bmp" P2 "images\Suli\babu_2P2.bmp")
(moves (move-type atrakas)
(at_a1)(at_a2)(at_a3)(at_a4)(at_a5)(at_a6)(at_a7)(at_a8)(at_a9)
(r_a1 e)(r_a2 e)(r_a3 e)(r_a4 e)(r_a5 e)(r_a6 e)(r_a7 e)(r_a8 e)(r_a9 e)
(move-type lepes)
(lep e )(lep w )(lep s )(lep n ) ) )
(board-setup (P1 (babu_1 k1 k2 k3 k4 k5 k6 k7) (babu_2 k8 k9))
(P2 (babu_1 n1 n2 n3 n4 n5 n6 n7) (babu_2 n8 n9))
)
)

(folyt.)