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:
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.
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:
"..." 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!' ]
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:
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:
handlesMouseDown: e "engedélyezem, hogy fölülírhassam a mouseDown függvényt" ^true
mouseDown metódus:
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 .
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.
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.
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.
Készitette : Ilyés Enikő