ColorRow játék leírása

Az alábbi leírás a ColorRow-nak nevezett játék Smalltalk-beli megvalósításáról szól. A játékos feladata, hogy kitalálja, hogy a játékpartner (ez esetben a számítógép) milyen színsorra "gondolt." A színsor 4 elemből áll, minden elem színe egy a hat szín közül: kék, zöld, zárga, naracssárga, barna, piros. A játékos találgatva összeállíthat színsorokat (bal oldali, szélesebb tábla), melyeket alávet a partner kiértékelésének (ez esetben a számítógépnek, az "Elküld" lenyomása által). A játékpartner a visszajelző táblában (jobb oldali, keskenyebb tábla) a megfelelő sorszámú helyen fekete jelzéssel tudatja, hogy a játékos jól tippelt, illetve fehér színű jelzést ad, ha a tippelt szín szerepel az általa kigondolt színsorban, viszont másik sorszámú. A visszajelzések alapján a játékos újra próbálkozhat, összesen nyolc alkalommal. Van lehetőség ugyanakkor, hogy a játékpartnertől új kombinációjú színsor kigondolását igényelje ("Új" gomb lenyomása).

Pár kép a megvalósításról:

start kep during kep

A program struktúrális felépítése

A program felépítése szemponjából egy ablak (SystemWindow) és gombok(BasicButton), melyek erre vannak elhelyezve. Az ablak adattagként tartalmazza a rajta megjelendő gombokat, és a gombok adattagként tartalmazzák az őket birtokló ablakot. A gombok mouseDown metódusa felül van írva, és mindegyikük egy, az őket tartalmazó ablak metódusát hívja meg, így valósul meg a játék logikája. Az ablak osztálya a GWindow nevű osztály. A gombok a a játék logikájában betöltött szerepük szerint vannak csoportosítva: a tippelhető színeket tartalmazó gombok PickColorButton típusúak, a találgatásra lehetőséget adó gombok MyColorButton típusúak, a visszajelzés táblát felépítő gombok MyReturnButton típusúak. Az „Elküld” gomb típusa: SendButton, az „Új”-é pedig NewGameButton. A továbbiakban ezek az osztályok kerülnek bemutatásra.

GWindow osztály

A GWindow osztály ősosztálya a SystemWindow osztály. Ebbe az osztályba koncentrálódik a játék logikája. Összefogó szerepéből kifolyólag ő tartalmazza az összes másik elemet, ezeket általában mátrixokba csoportosítva. Az adattagok a következők: gTable: a találgatásra alkalmas gombok mátrixa (baloldalon elhelyezve); rTable: a visszajelzések megjelenítésére alkalmas gombok mátrixa (jobboldalon elhelyezve); colors: a választható színek megjelenítésére alkalmas gombok mártixa (fent egy sorban elhelyezve); randomRow: a számítógép által kigenerált véletlen szín-kód sor (logikai háttérhez); selColor: az éppen megtippelt szín; actRow: az éppen találgatott színsor indexe; tM: az ablakon megjelenő szöveges magyarázat tartója. Az osztály tartalmazza az ezekhez az adattagokhoz tartozó beállító és lekérdező metódusokat.

init metódus:

Az init metódus inicializáló függvény. Az összes adattagnak helyet foglal és kezdeti értékeire állítja őket, illetve kiírja a játékot segítő magyarázatot. Az ablakban megjelenő gombok befűzése is itt történik. Itt kell odafigyelni arra, hogy a gombok valamiféle rendszerbe legyenek szedve, hiszen később a játék logikája szempontjából fontos a lenyomott gomb tulajdonságainak beazonosítása. A gombok különböző kategóriái más-mást kell előidézzenek, ha lenyomásra kerültek (pl. PickColor lenyomása előidézi a selCol aktualizálását), és a kategórián belül sem mindegy, hogy melyik volt lenyomva (előző példa folytatása: hányadik szín volt kiválasztva? - az indexe lesz annak a bizonyos színnek a számkódja.) A rendszerezést úgy oldjuk meg, hogy mátrixba szedjük az azonos kategóriájú gombokat, x és y értékeiket pedig a mátrixban való elhelyezkedésük x, y koordinátájával inizializáljuk. A példakód az init függvénynek egy részlete.

"..." gTable := Matrix new: 8. rTable := Matrix new: 8. 1 to: 8 do: [:y | "sor" 1 to: 4 do: [ :x | "oszlop" b := MyColorButton new. b initalizeX: x y: y m: gTable win: self val: 0. self addMorph: b. b calcPosition. gTable at: y at: x put: b. b := MyReturnButton new. b initalizeX: x y: y m: rTable win: self. self addMorph: b. b calcPosition. rTable at: y at: x put: b. ]. ]. "..."

evaluate metódus: A játék „mesterséges intellicenciáját” megvalósító metódus, vagyis amelyik által a számítógép visszajelez a játékos által megtippelt színsor kapcsán. Az actRow adattag ismeretében tudja, hogy a gTable melyik sorát kell kiértékelje. Ennek minden elemére a számítógép által generált színsorra tekintve vizsgál tartalmazást, vagy azonos indexen lévő elemek megegyezését. Itt van lekezelve az is, hogy ha a játékos teljesítette a feladatot. Ezt egy Boolean változóval kezeli le, az allOK nevűvel, mely igaz értékkel indít, és amennyiben a kiértékelt sor és a kitalálandó sor között eltérést észlel hamis értéket kap. Különben a kiértékelést követőn szövegesen jelzi a játékosnak a győzelmét. Ugyanakkor az is előfodulhat, hogy a játékos mind a 8 találgatási lehetőségét felhasználta. Ugyancsak az eval kezeli le ezt az esetet az actRow értékét minden kiértékelés után növelve és ellenőrizve. A teljes függvényt a következő kódpélda tartalmazza.

evaluate "a megtippelt színsor kiértékelése" |myButton myColor colorToPick rButton allOk| allOk := true. "allOK - feltételezem, hogy minden tipp talált" "a megtippelt színsor minden elemét egyenként kiértékelem" 1 to: 4 do: [:i| myButton := gTable at: actRow at: i. myColor := myButton val. colorToPick := randomRow at: i. "ha az éppen kiértékelt szín eleme a véletlen színsornak" (randomRow hasLiteralThorough: myColor) ifTrue: [ rButton := rTable at: actRow at: i. rButton color: Color white. " ]. "ha az éppen kiértékelt szín megegyezik véletlen színsorban azonos indexüvel" (myColor = colorToPick) ifTrue: [ rButton := rTable at: actRow at: i. rButton color: Color black. ] "ha egy tipp nem talált, akkor hamira állítom az allOK-t" ifFalse: [allOk := false]. ]. actRow := actRow +1. (actRow>8) ifTrue: [ tM textColor: Color red. tM newContents: 'Sajnálom, elfogytak a lehetöségeid!' (allOk) ifTrue: [ actRow := 100. tM textColor: Color red. tM newContents: 'Gratulálok! :) Kitaláltad!' ]

MyColorButton osztály

A MyColorButton osztály ősosztálya a BasicButton osztály. A MyColorButton osztály a következő adattagokkal egészítit ki ezt az osztályt: X- hányadik oszlopban van az elem a találgatós táblában; Y- hányadik sorban van az elem a találgatós táblában; m -melyik mátrix tartalmazza az elemet; win - melyik Window tartalmazza az elemet; val - milyen értéke van az elemnek. Mint ahogyan azt már jeleztük, ezek lesznek azok a gombok melyek a találgatásra alkalmas táblát képezik. Ennél fogva, amellett, hogy ismerik saját koordinátájukat, ismerniük kell a saját éréküket is, mely látvány szempontjából egy szín lenne, a megvalósítás szempontjából a színhez rendelt számkód lesz. Hasonlóképpen az osztály adattagjainak elérésére biztosítva vannak a megfelelő függvények. Az initializeX:y:m:win:val függvény elvégzi az inicializálást, kezdeti értékként a val 0 értéket kap.

calcPosition metódus:

beállítja, hogy hol jelenjen meg az adott gomb. Az őt tartalmazó ablakhoz viszonyítva, illetve a logikai x,y koorinátái segítségével áll elő a képlet. A teljes függvény a példakódban látható.

calcPosition "Megjelenítés poziciójának kiszámítása és alkalmazása" self left: ((win left) + ((x-1)*50)+10). self top: ((win top) + (win labelHeight) + ((y-1)*30)+70). ^self

handlesMouseDown metódus:

ennek a metódusnak a true értéket való visszaadásával engedélyezzük, hogy felülírhassuk a mouseDown metódust.

handlesMouseDown: e "engedélyezem, hogy fölülírhassam a mouseDown függvényt" ^true

mouseDown metódus:

ez a metódus foglalja össze mindazt, aminek meg kell történnie akkor,ha lenyomják az illető gombot. Ebben az esetben a korábban kiválasztott színt kapja a gomb, és az ő val értéke az ennek megfelelő szám-kódot.

PickColorButton osztály

A MyColorButtonhoz nagyon hasonlóan felépített és működő osztály, a színpaletta megjelenítéséhez alkalmas gombok osztálya. A tulajdonképpeni különbség a mouseDown metódusban van, mely sepcifikálja, hogy a színpaletta gombjainak lenyomásakor a tartalmazó ablak (win) selCol értékét kell frissíteni, mely mindig az éppen kiválasztott szín számkódját tartalmazza.

mouseDown metódus:

mouseDown: evt "mouseDown függvény felülírása" win selCol: val. "a tartalmazó ablak selCol adattagját állítom be ezen gomb értékére" ^self .

ReturnButton osztály

A MyColorButtonhoz nagyon hasonlóan felépített és működő osztály, mégis sokkal egyszerűbb, hiszen nem kell kezeljük a gombok lenyomását, illetve ezeknek nincs is számontartott logikai értékük. Csak a visszajelzés megjelenítése okából hoztuk őket létre.

SendButton osztály

BasicButton ősosztályból van származtatva, egyetlen példányát használjuk. Inicializáló függvényében megkapja, hogy melyik ablakhoz tartozik, és ennek koordinátáit ismerve máris beállítja saját pozícióját. Ugyancsak a mouseDown függvény felülírása szükséges, melyben meghívja az őt tartalmazó ablak eval függvényét. Az elküldés cím alatt tehát a kiértékelés történik meg.

NewGameButton osztály

SendButton osztály szerű a felépítése, ettől csak a mouseDown függvényben különbözik, mely tulajdonképpen az őt tartalmazó ablak init függvényét hívja meg, és ezzel idézi elő az új játékot.

A program a Squeak 4.2. fejlesztői környezetben került megvalósításra.

Készitette : Ilyés Enikő