Memória játék leírása

Az alábbi leírás a Smalltalk-ban írt memória játékról szól. A játék úgy náz ki, hogy 4*4 játékmezőn kell megkeresni a párokat. A kártyákon páronként különböző színek vannak. Randomizálva kerülnek fel a felületre.Felfordítás után pedig 1 másodperc múlva visszafordulnak. A memória játék két osztályból áll továbbiakban ennek a két osztálynak a feladatköreiről és metódusairól lesz szó.

Pár kép a programról:

start kep during kep

GameTable osztály

A GameCard osztály a ShellView osztályból származik. Megjelenití a 16db GameCard objektumot 4x4-es mátrixban és az 'Ujrakezdes' és 'Kilepes' gombokat. A nem részletezett metódusok setter és getter funkciót látnak el. Az alábbi leírásokból ki lehet következtetni őket.

Fontosabb metódusok:

onFullyCreated : Ez egy View ősős osztálytól örökölt metódus, amely a GUI-ban megjelenő objektumokért felelős. A metódusban beállítjuk a felfordított kártya számát 0-ra. Felpakoljuk a kilépés és az újrakezdés gombokat úgy, hogy commandokat rendelünk hozzájuk. Majd küldünk egy üzenetet magunnak az inittel (init metódus) és generateGameCardOnTable-lel.

onFullyCreated | exitButton restartButton| turnedCard:=0. super onFullyCreated. exitButton:=self addSubView: (PushButton new ). exitButton position: 330@410. exitButton text: 'Kilepes' . exitButton command: #exit. restartButton:=self addSubView: (PushButton new ). restartButton isDefault: true. restartButton enable. restartButton position: 30@410. restartButton text: 'Ujrakezdes' . restartButton command: #onRestartButton. self init. self generateGameCardOnTable.

generateGameCardOnTable: Két egymásba ágyazott for ciklussal rakjuk fel a GameCard objektumokat a GUI-ra. Elöször kiszedjük a cardCollection példány változóból (ezt már korábban inicializáltuk az inti metódusban) a kártyákat úgy, hogy a Random osztály egy objektuma segítségével generálunk egy indexet. Így minden játékban máshova kerülnek a színek. Majd a megfelelő koordinátákat meghatározva kirajzoljuk őket a főablakba, és beleteszük a listába amelyben a főablakban megjelenő kártyák vannal. Ez az az újrakezdésnél lesz fontos, mivel akkor ezeket az elemeket le kell szedni a főablakról, hogy újakat tudjunk a helyükre tenni.

0 to: max do: [ :row | 0 to: max do: [ :col | miniCard :=cardCollection removeAtIndex: ((rand next * (cardCollection size - 1) + 1) asInteger) . card:= self addSubView: miniCard. posx:=30+(row*cardSize ). posy:=10+(col*cardSize ). card rectangle: (posx@posy extent: 90@90). cardsOnTheTable add: card. ] ]

init: Beállítjuka firstTurn példány változó értékét hamisra, ez azt jelenti hogy nincs felfordítva egy kártya sem. Majd felveszük a 8 lehetséges színt ami megjelenhet kártya színként, ezek a színek html színnel vannak megadva. Majd feltöltjük a cardCollection példány váltózó listánkat, amelyekből véletlen index szám generálásával majd kiszedjük a kártyákat és felpakoljuk a főablakba.

init firstTurn:=false. cardCollection:=OrderedCollection new. cardColors := #('#2B7659' '#76522B' '#FFF805' '#FF9305' '#241503' '#FE0633' '#8CC2BD' '#15CB5E'). 1 to: (cardColors size) do: [ :i | cardCollection add: (GameCard new: self cardID: (cardColors at: i)). cardCollection add: (GameCard new: self cardID: (cardColors at: i)). ].

onRestartButton: Az 'Ujrakezdes' gomb megnyomásakor küldünk üzenetet. Ennek hatására a főablakon lévő kártyákat, amiket egy listában tároltunk (cardsOnTheTable) végig iterálunk és küldünk a kártyáknak egy close üzenetet ami hatására eltünnek a főablakból. Ezután újra inicializáljuk a 16db kártyát és újból felrakjuk a főablakba.

onRestartButton cardsOnTheTable do: [ :card | card close. ]. self init. self generateGameCardOnTable

isAllowedTurnCard: Ezzel a metódussal határozzuk meg, hogy az adott pillanatban lehetséges-e felfordítani kártyát, ha lehetséges akkor felfordítjuk és az turnedCard példány változót növeljük eggyel, ha nem akkor hamissal térünk vissza.

isAllowedTurnCard turnedCard < 2 ifTrue: [ turnedCard:=turnedCard+1. ^true. ] ifFalse:[ ^false. ]

GameCard osztály

A GameCard osztály a View osztályból származik. Reprezentálja a kártyákat. Az objektumnak van id-ja ami valójában a szín amit elrejt.Inizializáláskor megkapja ezt az idüt és a szülőjét ami egy gameTable típusú objektum. A nem részletezett metódusok setter és getter funkciót látnak el. Az alábbi leírásokból ki lehet következtetni őket.

Fontosabb metódusok:

onLeftButtonPressed: aMouseEvent Amikor a metódus üzenetet kap, mert rá káttintottak a kártyára, akkor elöször megvizsgálja hogy a kártya még játékban van-e (akkor van játékba ha még nincs meg a párja), tehát az isAppear hamis értéket ad vissza. Azt is meg kell vizsgálni, hogy lehetséges-e felfordítani kártyát,akkor nem fordíthatunk fel ha már 2 fel van fordítva de még nem fordítultak vissza. A második feltételes elágazásban azt vizsgáljuk meg hogy melyik kártyát fordítottuk fel, ha az elsőt akkor küldünk egy üzenetet a GameTable objektumnak (parent) erről, aztán elküldjük magunkat is és megmutatjuk a színűnket. Abban az esetben ha a második kártyát fordítottuk fel, akkor visszaállítjuk a szülőben a flaget megmutatjuk a színűnket és ha nem vagyunk párban az legutóbb felfordított kártyával (showWithPair) akkor 1 másodperc múlva visszafordítjuk magunkat és a legutóbb felfordított kártyát (turnBackWithPairCard) ezt egy fork-os blokkal kellett megvalósítani hogy az 1 mp várásnál a főprogram szálját ne blokkoljuk. Ha párban vagyunk, akkor felfordítva maradunk és a appear állapotunk igazra állítodik.

onLeftButtonPressed: aMouseEvent (self isAppear == false) & (parent isAllowedTurnCard) ifTrue: [ parent isSecondTurn ifTrue: [ parent turnCard: false. self showCardColor. (self showWithPair: (parent getlastSelectedCard)) ifFalse:[ [ self turnBackWithPairCard ]fork. ]. ] ifFalse: [ parent turnCard: true. parent lastSelectedCard: self. self showCardColor. ] ]

showWithPair: aCard A metódus összehasonlítja a a paraméterül kapott kártya és az aktuális kártya színét úgy, hogy közben azt is nézi hogy két különböző objektumról van szó. Abbna az esetben ha párok a kátyák akkor mindkettő objektum shown metódusának elküldi az igaz paraméter, amely hatására az appear állapot igazzá vállik. Aztán a szülőben csökkenti a felfordított kártyák számát kétszer. Majd visszatér láthatósági paraméterrel, ami nem állítodott át ha nem volt a két kártya párban, így ennek hatására a kártyák visszafordulhatnak.

showWithPair: lastSelected (lastSelected getId == self getId) & (lastSelected ~~ self) ifTrue: [ lastSelected shown:true. self shown:true. parent decreaseTurnedCard. parent decreaseTurnedCard. ]. ^ lastSelected isAppear & self isAppear

turnBackWithPairCard : Az aktuális kártya színét és a legutóbb felfordított kártya színét beállítja kékre. Majd csökkenti a felfordított kártyák számát kettővel.

turnBackWithPairCard | blueColor | (Delay forMilliseconds: 1000 ) wait. blueColor := Color blue . self backcolor: blueColor. (parent getlastSelectedCard) backcolor: blueColor. parent decreaseTurnedCard. parent decreaseTurnedCard.

Készitette : Fawal Margit