17. Játékprogramok készítése Ebben a fejezetben játékprogramok készítésével foglalkozunk. Minden programnál először ismertetjük a játékszabályt, tehát tulajdonképpen a program feladatát, majd ismertetjük a program algoritmusát. 17.1. Számkirakó játékprogram Játékszabályok A játékot egy 4 x 4 mezőből álló táblán játszuk. A tábla mezői közül egy üres, a többin pedig 1 és 15 közé eső számok találhatók. A játék kezdetén a program kirajzolja a táblát, olyan módon, hogy a számok növekvő sorrendben követik egymást. Rövid várakozás után a program elkezdi összekeverni a számokat, és ezt egy billentyű leütéséig teszi. A játék ezután kezdődik, ugyanis a táblán ismét ki kell rakni az eredeti sorrendet, mégpedig úgy, hogy mindig az üres mezőt cseréljük ki a négy szomszédos mező valamelyikével. A csere végrehajtásához a kurzormozgató billentyűket használjuk. A játék végén kiíródik a lépések száma valamint a számok rendberakásával eltöltött idő. A játék az Esc billentyű leütésével bármikor megszakítható. A játék haszálata A játék kezdetén a program elkezdi összekeverni a számokat. Ez bármelyik billentyű leütésével megszakítható. A rendberakáshoz a kurzormozgató billentyűket használjuk, ezek leütésekor felcserélődik az üres mező és a kurzormozgató billentyű által kijelölt szomszédja. A játék az "Esc" billentyű leütésével a keverés után bármikor megszakítható. A program felépítése A programnak az alábbi főbb lépéseket kell végrehajtania: a./ A tábla felrajzolása. b./ A számok összekeverése. c./ Az üres mező felcserélése a kijelölt szomszéddal. d./ A tábla vizsgálata e./ A c./ és a d./ pontok szükség szerinti ismétlése A program az alábbi eljárásokat és függvényeket használja: A tábla felrajzolásához szükséges eljárások A keret eljárás A szöveges üzemmódú képernyőn a keret eljárás az adott bal felső sarokpontból a tábla keretét rajzolja meg, amely adott számú és méretű mezőből áll. Az eljárás bemenő paramétere a bal felső sarok koordinátái, egy mező mérete és a mezők száma. A kitolt eljárás A kitolt eljárás a tábla mezőit szinezi és tölti ki az 1-től 15-ig terjedő számokkal. Az eljárásnak nincsenek paraméterei. A számok összekeverése A csere eljárás A számok összekeverését a program úgy végzi, hogy ciklikusan ismételve véletlenszerűen kiválasztott szomszédjával cseréli fel az üres mezőt. Ehhez a részhez tartozik a csere eljárás, amely a megadott iránytól függően kicseréli az üres mezőt a megfelelő szomszédjával Az eljárás bemenő paramétere egy byte típusú változó, amelyik megmutatja, hogy melyik szomszédos mezővel legyen felcserélve az üres mező. Az üres mező kicserélése a szomszéddal Ez a rész is használja a csere eljárást, valamint az irány függvényt. A függvény visszatérési értéke a leütött billentyűtől függően egy 1 és 4 közé eső szám. A függvény tartalmaz egy halt utasítást is, amelyik az Esc billentyű leütése esetén megállítja a programot. Csak a kurzormozgató billentyűk és az Esc billentyű leütését figyeli a függvény. A tábla vizsgálata Ehhez a részhez csak a vege függvény tartozik. Ennek visszatérési értéke true, ha a táblán a számok sorrendben vannak, különben false. A játék befejezése A játék befejezésekor a kiértékelést az eredmeny függvény végzi el. A függvény bemenő paramétere a rendberakáshoz szükséges lépések száma valamint az idő. Ezeket az értékeket egy táblára írja ki és felajánlja egy új játék lehetőségét. A függvény visszatérési értéke új játék esetén true, a játék befejezése esetén false. A főprogram felépítése A program először az alkalmazott képernyőtől függően beállítja a szineket (Hercules képernyőn ugyanis más szinkiosztás kell mint a többin). Ezután felrajzolja, kitölti majd a Random beépített függvény segítségével össze-keveri a táblát. A következő lépésben beállítja a kezdőértékeket (lépésszám, kezdőidő). Ezután ciklikusan ismétli a következőket: A játékos által leütött billentyű szerinti két mezőt felcseréli, és megvizsgálja a tábla állapotát. Ha a táblán sorrendben vannak a számok, akkor befejezi a ciklust. A játék végén kiírja az eredményt és felajánlja az új játékot. A program főbb változói A program viszonylag kevés változót használ, lokális változói segédváltozók szerepét töltik be, a függvények és az eljárások paraméterei azok leírásánál szerepeltek. Főbb globális változói a következők: tabla record típusú tömb, amely tartalmazza a tábla i-dik sorának j-dik oszlopában levő mező szinét és számát. ures byte típusú kételemű tömb, amelyik az üres mező helyét mutatja meg. t0, jido a játék kezdésének időpontja és a játékkal a t0 időpont óta eltöltött idő. 17.2. Memória játék Játékszabályok A játékot két személy játszhatja, 56 kis kártyával, amely kártyák midegyikén egy szó szerepel, az 56 kártyán összesen 28 szó van, így minden egyes szó pontosan két kártyán található meg. A játék kezdetekor ezt az 56 kártyát kirakjuk, mégpedig úgy, hogy a rajta levő szavak nem látszanak. Ezután az első játékos megnéz két kártyát. Ha a rajtuk levő szavak megegyeznek, akkor az illető nyert egy pontot és ismét ő nézhet meg egy párt, ellenkező esetben viszont az ellenfél következik. A játék akkor ér véget, ha az egyik játékos eléri a 20 pontot. A játékprogram kialakítása olyan, hogy egy pár eltalálása után azokat a kártyákat, amelyeket még senki nem nézett meg, a számítógép ismét öszekeveri, így ha valaki eltalált egy párt, utána a pár helyén nem párt talál. A játék használata A kártyák megnézéséhez bal felső sarokban megjelenő villogó csillagot kell a kiválasztott kártya fölé vinni, és ott megnyomni az "Enter"-t. A villogó csillag ekkor folyamatosan világítani fog, és megjelenik a jobb alsó sarokban a másik csillag. Ezzel a csillaggal kijelölhetjük a másik kártyát, és a két kártyát egyszerre fogja a számítógép megmutatni. A villogó csillagot a kurzormozgató billentyűkkel lehet mozgatni. Ha a második csillagot az első fölé visszük és ott ütjük le az "Enter"-t akkor az első kártya kijelölését töröljük. A program felépítése A programnak az alábbi főbb lépéseket kell végrehajtania: a./ A kártyák felrajzolása b./ A kártyán levő szavak kitöltése c./ A kiválasztott kártyák megmutatása d./ Pár esetén a még nem látott kártyák összekeverése e./ A c./ és d./ lépések ismétlése, míg az egyik játékos a 100 pontot el nem éri. A program főbb eljárásai és függvényei a./ A kártyák felrajzolását a számkirakó programnál ismertetett keret eljárás végzi. b./ A kártyákon levő szavak kitöltésére szolgál a kitolt eljárás paraméter nélküli eljárás. Az itt alkalmazott algoritmus leírása eléggé nehézkes, de mint a program listájából látható, meglehetősen tömör, jól programozható módszert eredményez. A módszer lényege a következő: Egy tömbváltozóban megjegyezzük valamennyi kártya sorát és oszlopát. Ezt ezentúl a kártyák indexének fogjuk nevezni. A tömbváltozó mellett felveszünk még egy segédváltozót is, amelyik azt mutatja meg, hogy még hány kártyát nem töltöttünk ki. Ezt a változót mutatónak nevezzük. A tömb kiinduló értékei ennek alapján az (1,1), (1,2), (1,3), ... ,(7,7), (7,8) A zárójelben szereplő első szám a kártya oszlopát, a második a sorát jelöli. A mutató kezdeti értéke 7*8 azaz 56. Ezután véletlenszerűen kiválasztjuk a tömb valamelyik elemét, és az itt szereplő értékek szerinti kártyára ráírjuk az első szót. A következő lépésben, azért, hogy ezt a kártyát a továbbiakban már ne bántsuk, a tömbnek ezt az elemét kicseréljük az utolsóra, a mutató értékét pedig egyel csökkentjük. Ezek szerint pl. ha a harmadik elemet választottuk ki, akkor a csere után a tömb és a mutató értéke a következők szerint alakul: tömb: (1,1), (1,2), (7,8), (1,4), ... ,(7,7), (1,3) mutató: 55 A következő lépésben már csak a mutató által kijelölt számú indexből választunk, és a mutató által kijelölt indexű elemmel cserélünk. Ezt a módszert 56 esetben megismételve mindegyik kártyánkat ki tudjuk tölteni. c./ ehhez a részhez két lényeges eljárás tartozik, az egyik a kijelol, a másik a visz. Az első eljárás kimenő paramétere a két kijelölt koordinátapár. Az eljárás hatására egy villogó "*" karakter jelenik meg a képen, amelynek a helyzetét a kurzormozgató billentyűkkel lehet változtatni. A kártya kijelölésére az Enter billentyű szolgál ezután a kijelölt kártyát ez folyamatosan világító "*" mutatja. A mozgatásra és kijelölésre a számkirakó programban is alkalmazott irany függvény, az Enter billentyű figyelésével kiegészített változata szolgál. A kijelölő eljárás felépítése olyan, hogy lehetséges az először kijelölt kártya kijelölt állapotát törölni, azzal hogy a villogó "*"-ot ismét erre a kártyára visszük és újból megnyomjuk az Enter-t. A második a visz eljárás. Ennek bemenő paraméterei a kijelölt kártyák koordinátái, szerepe pedig, hogy egy-egy megfelelő méretű ablakban megjelenítse a kijelölt kártyán levő szavakat. d./ ehhez a ponthoz egy függvény és egy eljárás tartozik. A vizsgal függvény, amelynek bemenő paraméterei a kijelölt kártyák koordinátái, visszatérési értéke akkor igaz (true), ha a két kártya azonos volt, különben false. A függvény meghívja az ismertetett kever eljárást is. Ez az eljárás kitolt eljárásnál leírtakhoz hasonlóan összekeveri a kártyákon levő szövegeket. A lényeges különbség nem a keverés módjában van, hanem abban, hogy a kitolt eljárásnál a sorban egymás után beírt szavakat kellett véletlenszerűen összekevert koordinátájú helyekre beírni, itt pedig az adott helyen levő kártyákon levő szöveget kell összekeverni. e./ ehhez a részhez nem tartozik külön eljárás illetve függvény. A főprogram felépítése A program a számkirakó játékhoz hasonlóan először beállítja a színkiosztást. Ezután kitölti a kártyákat, majd felrajzolja azokat, majd ciklikusan megvizsgálja a kijelölt kártyákat, számolja az eredményt és újrarajzolja a kártyákat. (A teljes képernyő újrarajzolása lényegesen egyszerűbb, mint a kártyák kiemeléshez hasonló levétele.) A program főbb változói A program három lényeges változót használ, ezek a következők: szabad: a kártyák koordinátáit tartalmazó kétdimenziós byte típusú tömb szabnr: a még nem megnézett kártyák számát mutató integer típusú szám kartya: record típusú tömb. A record elemei a szov nevű string, amelyik tartalmazza a kártyán szereplő szöveget, valamint a mut nevű integer szám, amelyik megmutatja, hogy az adott kártyához a szabad nevű tömb melyik eleme tartozik. 17.3. Türelem tüske játékprogram Játékszabályok A játékot egy személy játszhatja egy összesen 45 mezőből álló táblán. A mezők 3 x 3-as csoportokban, kereszt alakban helyezkednek el. A táblán a játék kezdetekor 44 bábu (tüske) van, úgy, hogy a középső mező üresen marad. A játék során valamelyik bábuval átugorhatjuk a bábu négy szomszédjának valamelyikét, amennyiben az átugorni kívánt bábu másik oldalán üres mező van. Az így átugrott bábut a tábláról le kell venni. A játék célja az, hogy a táblán minél kevesebb bábu maradjon. A játék használata A játék kezdetekor a középső hely alatt egy kis nyíl látható. Ezt a nyilat a kurzormozgató billentyűkkel a kiválasztott bábu alá kell vinni majd az "Enter" leütésével a bábut kijelölni. Ezután ugyanígy ki kell jelölni azt a mezőt amelyikre a bábuval ugrani akarunk. Ha az ugrásra kijelölt bábura ismét rávisszük a nyilat, és ismét megnyomjuk az "Enter"-t akkor a bábu kijelölése törlődik. A játék az "Esc" billentyű leütésével bármikor megszakítható. A program felépítése A programnak az alábbi főbb lépéseket kell végrehajtania: a./ A tábla és a bábuk felrajzolása b./ A bábuk ugrásainak kezdő- és végpontjainak a kijelölése c./ A bábuk mozgatása illetve levétele d./ A játék befejezése A fenti pontok főbb eljárásai illetve függvényei: a./ Ennek a résznek három fontos eljárása van, a Tablainit a Kirajzol és a Pofa. A Tablainit paraméter nélküli eljárás adja meg a kezdőértéket a bábuk táblán való elhelyezkedését mutató tabla nevű, tömb típusú változónak. Ez a változó az egyszerűbb kezelhetőség érdekében egy 9 x 9 elemű tömb (array [1..9,1..9] of byte), amelynek a négy sarkában levő 4 db 3x3-as részt nem használjuk. A játék során ennek a tömbnek a mezői a következő értékeket vehetik fel: 0 - üres mező 1 - bábu alaphelyzetben 2 - ugrásra kijelölt bábu 3 - átugrott bábu(ezt az értéket a mező csak ideiglenesen veszi fel, kb 0.5 másodperc után ez az érték automatikusan 0 lesz 255 - a játékban nem szereplő mezők A Tablainit a táblát a kezdeti alakzatnak megfelelő módon 0, 1 illetve 255 értékekkel tölti fel. A Pofa nevű háromparaméteres eljárás a Graph unit eljárásainak segítségével - a program futásának kezdetekor beállított, képernyőtípustól függő méretben - felrajzolja a bábukat. Az eljárás első paramétere szabja meg a bábu képét, (ez a paraméter a program futása során a tabla nevű tömb megfelelő értéke lesz) az eljárás második és harmadik paramétere pedig a bábu pozícióját. A Kirajzol eljárás ugyancsak a Graph unit eljárásaival valamint a Pofa eljárás meghívásával kirajzolja a táblát. b./ A bábuk ugrásainak kezdő illetve végpontját kijelölő Kijelol eljárás majdnem teljesen megegyezik a Memory játékban ismertetett, ugyanilyen nevű eljárással, a különbség csupán annyi, hogy az itteni eljárás grafikus képernyőt használ, és így az Irany nevű függvényen kívül a Nyilki és Nyille eljárásokat is használja, a kijelölt mező megjelölésére, illetve ennek a jelölésnek a törlésére. Ez az eljárás figyeli még azt is, hogy csak olyan mezőt lehessen kijelölni elsőként ahol van bábu, másodiknak pedig ahol nincs. c./ A bábuk mozgatásának alapvető eljárása Mozgat. Ennek bemenő paramétere tömb típusú, és a kezdő illetve a végpont koordinátáit tartalmazza. Az eljárás átírja a tabla nevű tömbváltozó megfelelő elemeit, majd először a Töröl nevű háromparaméteres eljárás segítségével letörli a képernyőn a változtatni kívánt mezőket, majd a tabla nevű tömbváltozó megfelelő elemei alapján visszarajzolja azokat a Pofa nevű eljárás segítségével. d./ A játék befejezését a Vege nevű boolean típusú függvény jelzi. A függvénynek a visszatérési értékén kívül van egy kimenő paramétere, amelyik azt mutatja, hogy még hány bábu van a táblán. A Vege függvény visszatérési értéke true, ha már nincs a táblán átugorható bábu. A függvény ezt két - majdnem teljesen egyforma - ciklusban ellenőrzi le. Az ellenőrzés annak alapján történik, hogy ha a tabla nevű változó valamelyik eleme 1 és ugyanakkor a két szomszédos elem összege is 1, akkor az a bábu átugorható. A két említett ciklusból az egyik a vízszintes, a másik pedig a függőleges szomszédokat ellenőrzi. A függvény ezenkívül egy kettős ciklus segítségével megszámolja a táblán levő bábukat a kimenő paraméter számára. Ha a Vege függvény true értékkel tér vissza, akkor a Befejezes nevű egyparaméteres függvény kiírja a végeredményt, és felajánlja az új játékot. A függvény bemenő paramétere a bábuk száma, visszatérési értéke pedig true, ha ismét akarunk játszani. A főprogram felépítése A főprogram felépítése igen egyszerű. A program egy inicializációs résszel kezdődik. Ennek első tagja a GrInit amelyben a monitor típusától függően beállítjuk a grafikus képernyőt, valamint a GrOszt nevű változót, amelyik a rajzolás során a különböző rajzelemek méretének kiszámításához kell. Ezután a TablaInit nevű eljárással beállítjuk a tabla nevű változó kezdőértékeit. Ez az inicializációs rész vége, majd mindaddig, míg a vege függvény true értékkel nem tér vissza, ciklikusan ismételjük a Kijelöl és a Mozgat nevű eljárásokat. A Vege függvény true értéke esetén meghívjuk a Befejezes nevű függvényt, ennek true értéke esetén visszatérünk a Tablainit nevű eljáráshoz, false értéke esetén pedig kilépünk a programból. A program főbb változói tabla :array [1..9,1..9] of byte, a táblán levő bábuk állapotát tartalmazó tömb par :array 1..3,1..2] of byte, a kijelölt mezők koordinátáit tartalmazó tömb gd,gm :integer, a monitorra jellemző értékek. x0,y0,GrOszt :integer, a képernyőre való rajzoláshoz szükséges segéd- értékek. 17.4. Rex játékprogram Játékszabályok A játék szabályai némiképp eltérnek a valódi szabályoktól. Itt a játékot két személy játszhatja, hagyományos rexasztalon, öt golyóval. A rexasztal olyan asztal, amelyen meghatározott helyeken összesen nyolc lyuk van, amelyekhez egy-egy érték tartozik. A játékban szereplő öt golyó közül egy piros, a többi pedig fehér. A játék lényege, hogy egy adott helyre kitett golyót úgy lökjünk meg, hogy az az asztalon levő golyók valamelyikének nekiütközzön, és ezután valamelyik golyó valamelyik lyukba beleessen. Minden lyukba esett golyó annyi pontot ér, amennyi a lyukhoz tartozó érték, illetve ha a piros golyó esik a lyukba akkor a lyukhoz tartozó érték kétszeresét. A játék során mindaddig ugyanaz a játékos következik, ameddig az általa meglökött golyó hatására valamelyik golyó ütközés után lyukba esik. A sorozat alatt szerzett pontok összeadódnak. Ha a játékos által meglökött golyó nekiütközik ugyan egy másiknak, de egyik golyó sem esik lyukba, akkor a játékos sorozata érvényesen ért véget, a sorozat alatt szerzett pontokat az addigi pontjaihoz adhatja. Ha azonban a meglökött golyó nem ütközik neki egy golyónak sem, akkor a játékos sorozata érvénytelen, a sorozat alatt szerzett pontok elvesznek. Akár érvényesen, akár érvénytelenül ér véget a sorozat, a másik játékos következik. A játék lényeges szereplője az asztal közepén álló gomba. Ha ezt valamelyik játékos felborítja, akkor annak addig megszerzett pontjai elvesznek, továbbá az asztalról le kell venni az összes golyót, és a játékot a kiinduló helyzetből kell folytatni. A játék menete A játék kezdetén a számítógép két golyót tesz ki az asztal adott két pontjára, ebből a lejjebb lévőt löki meg a kezdő játékos. A játék során a számítógép mindaddig egy-egy újabb golyót rak ki az asztal adott pontjára, ameddig vagy az asztalon nem lesz az összes golyó, vagy el nem fogy az asztalról valamennyi. Az első esetben a számítógép kiválasztja az asztal alsó széléhez legközelebb lévő golyót, és ezt rakja a kiinduló pontba, a második esetben pedig a játék kezdetével megegyező módon jár el. A játékot az a játékos nyeri, aki hamarabb éri el az 1000 pontot. A játék használata: A golyót automatikusan rakja a számítógép az asztalra. A lökés irányát (amelyet a dákó iránya mutat) a vízszintes kurzormozgató billentyűkkel, a golyó kezdősebességét pedig (amelyet a dákó golyótól való távolsága jelez) a függőleges kurzormozgató billentyűkkel lehet beállítani. A beállítás után a golyót az "Enter" leütésével lökjük el. A játék az "Esc" billentyű leütésével bármikor megszakítható. 17.2. ábra Rex asztal A program felépítése A programnak az alábbi főbb lépéseket kell végrehajtania: a./ Az asztal felrajzolása b./ A golyók kirakása c./ A golyók meglökése és további mozgatása d./ Az ütközések és a golyók lyukba való beesésének figyelése, valamint az ütközések hatásának kiszámítása. e./ A lökések és a sorozatok érvényességének figyelése és a pontok számolása A program főbb eljárásai és függvényei a./ Az asztal grafikus képernyőn való felrajzolását végzi el az Asztalrajz nevű, paraméter nélküli eljárás. Az eljárás a képernyőn használható képpontok számától függően elhelyezi a képernyőn az asztalt, valamint a Lukrajz nevű eljáráson belüli eljárással kirajzolja a lyukakat. Ez utóbbi eljárás rendeli hozzá az egyes lyukakhoz a hozzájuk tartozó értékeket is. A Lukrajz nevű eljárás bemenő paraméterei rendre a lyuk sorszáma, vízszintes és függőleges koordinátája és a lyukhoz tartozó érték. (A program során a golyókkal és lyukakkal kapcsolatos koordináták végig relatív koordináták lesznek, amelyek a golyók és a lyukak középpontjának valamint az asztal bal felső sarkának képpontokban mért távolságát mutatják meg.) b./ A golyók kirakása során érdemes előre gondolni azok mozgatására is. Ez utóbbi miatt a golyók kirakásánál a következőket fogjuk végrehajtani: - helyet foglalunk a heap-ben azon pointeres változók számára, amelyekbe a golyók képének megfelelő képernyőterületet, illetve a golyók által eltakart képernyőterületet fogjuk kimenteni. - felrajzolunk egy fehér golyót a képernyő bal felső sarkába. - azt a képernyőterületet, amelyiken a golyó van, kimentjük a négy fehér golyó számára fenntartott pointeres változóba. - ugyanerre a helyre felrajzoljuk a piros golyót, és a képernyőterületet a piros golyó számára fenntartott pointeres változóba mentjük. - letöröljük a képernyő sarkát. Az eddigiek végrehajtására szolgál a Golyorajz nevű paraméter nélküli eljárás. A következő lépés a golyó megjelenítése az asztalon. Ezt a Kitesz nevű háromparaméteres eljárás hajtja végre. Az eljárás paraméterei rendre a golyó sorszáma, vízszintes és függőleges koordinátája. Az eljárás először beírja a golyóhoz rendelt változóba a két koordinátát,valamint true-ra állítja azt a golyóhoz rendelt boolean típusú változót, amelyik megmutatja, hogy a golyó látszik-e a képernyőn. Ezután a golyó által eltakart terület számára fenntartott pointeres változóba mentjük az asztalnak azt a részét, ahová a golyót rajzolni fogjuk, megjegyezve ezt a két koordinátát. Ezután az asztal képére rámásolja az i-dik golyó képét tartalmazó képernyőterületet. A játék során (azaz nem a játék kezdetekor) kirakott golyók esetén még néhány dolgot figyelnünk kell: - van-e az asztalon golyó, mert ha nincs akkor kettőt kell kitenni - van-e kitehető golyó, mert ha nincs akkor a legalsót le kell venni az asztalról - nincs-e ott golyó, ahova a számítógép tenni akar, mert akkor az új golyót arrébb kell rakni. Ezeket a feltételeket az Ujgolyo nevű egyparaméteres eljárás vizsgálja meg, melynek kimenő paramétere annak a golyónak a sorszáma, amelyet meg kell majd lökni. Az eljárás először megvizsgálja, hogy van-e az asztalon golyó (ekkor a vangolyo nevű boolean tipusú változó értéke true), illetve, hogyha van kitehető golyó, akkor ennek mennyi a sorszáma (ha nincs kitehető golyó, akkor a sorszám értéke 0). ezután, ha nincs kitehető golyó, akkor leveszi a legalul levő golyót, ha pedig nincs az asztalon golyó, akkor kitesz egyet a megfelelő helyre. Ezután, figyelve azt, hogy van-e elegendő hely, kitesz egy golyót. c./ A golyók meglökéséhez az egyparaméteres Lok, valamint az általa meghívott háromparaméteres Dako nevű eljárás tartozik. A Dako nevű eljárás bemenő paramétere a golyó sorszáma, kimenő paramétere pedig egy sebesség és egy irány. Az eljárás először megrajzolja a dákót. Ezt a következőképp hajtja végre: - a dákó golyótól való távolságától valamint állásától függően kijelöli azt a grafikus ablakot, amelybe a dákót rajzoljuk. - meghatározza az ablak elmentéséhez szükséges pointeres változó méretét, és lefoglalja azt a heap-ben - kimenti az említett grafikus ablakot - kirajzolja a dákót - leolvassa a klaviatúráról a leütött billentyűt - visszamenti a grafikus ablakot és felszabadítja a heap-ben lefoglalt terü- letet. - a leütött billentyűtől függően megváltoztatja a dákó helyzetét és előről kezdi az eljárást vagy kilép az eljárásból. A Lok nevű eljárás - amelynek paramétere a golyó sorszáma - meghívja a Dako nevű eljárást, majd az az által szolgáltatott értékeket beírja a golyóhoz tartozó record típusú változó megfelelő mezőibe (sebesség, irány). A golyók mozgatásához három eljárást használunk. A helyzet nevű paraméter nélküli eljárás számítja ki a golyók helyzetét dt idő múlva. A másik két eljárás szolgál a golyók képernyőn történő elmozdítására. Ez ugyanis úgy történik, hogy az asztalról levesszük az i-dik golyót, azaz az i-dik golyó által eltakart képernyőterületet visszamentjük a megjegyzett helyre. Erre a célra szolgál a Levesz nevű eljárás, amelynek paramétere a golyó sorszáma. Ugyanez az eljárás false-ra állítja azt a - golyóhoz tartozó, boolean típusú - változót amelyik megmutatja, hogy a golyó látszik-e a képernyőn. A golyók elmozdításához használt másik eljárás a már ismertetett Kitesz. d./ Két golyó összeütközését az utkozik1 nevű függvény figyeli. Ennek két bemenő paramétere a két golyó sorszáma, visszatérési értéke pedig true ha a két golyó középpontjának távolsága kisebb mint a golyók sugarának kétszerese. Ha két golyó összeütközik, akkor ki kell számítani az ütközés utáni sebességet. Ezt a sebesseg nevű kétparaméteres eljárás végzi el, melynek bemenő paraméterei a golyók sorszámai. A sebességek kiszámítása a következő összefüggések alapján történik: vj=vj+dv vi=vi-dv ahol dv=vi(sin({EMBED Equation |}_i)sin(á)+cos({EMBED Equation |}_i)cos(á))-vj(sin({EMBED Equation |}_j)sin(á)+cos({EMBED Equation |}_j)cos(á)) {EMBED Equation |} : a golyók sebességének iránya és a függőleges közötti szög á : a két golyó középpontján átmenő egyenes és a függőleges közötti szög. Azt hogy egy golyó egy lyukba beleesik-e a beesik nevű függvény figyeli. Ennek is két bemenő paramétere van, egy golyó sorszám és egy lyuk sorszám. A függvény megvizsgálja, hogy a golyó középpontja a lyuk fölé esik-e. Ha igen akkor kiszámítja a golyó gyorsulását, és megvizsgálja, hogy a golyó beleesik-e a lyukba (elképzelhető, hogy a golyó a lyuk szélén csak irányt változtat, de nem esik bele). e./ A lökések érvényességét és a pontok számolását közvetlenül a főprogram végzi. Külön eljárás a pontszámok kiirására van, ennek neve Felirat, bemenő paramétere két integer típusú szám, amelyik az aktuális játékos sorszámát, illetve a sorozatban elért pontszámot adja át, valamint a gomba fellökését figyelő paraméter nélküli gomba nevű boolean típusú függvény. A főprogram felépítése A program kezdetén található egy inicializációs rész, amelyik a változók kezdőértékeit állítja be, valamint inicializálja a grafikus képernyőt. A grafikus képernyő inicializálása előtt kéri be a program a BGI file-ok elérési útvonalát. Szintén az inicializációs részhez tartozónak lehet tekinteni az Asztalrajz a Golyorajz illetve az első Felirat nevű eljárásokat valamint az első két golyó kitételét. A tényleges program a Lok eljárással kezdődik. Innen szükséges az ütközések és a lyukba való beesések figyelése. A lökések érvényességét két boolean típusú változó segítségével figyeljük. A lökés után mindkét változó alapértelmezésben false lesz. Az erv1 változó értéke akkor lesz true, ha két golyó összeütközik, az erv2 pedig akkor, ha egy golyó beleesik valamelyik lyukba. Ezután hajtódik végre a gomba függvény, amelynek true visszatérése esetén valamennyi golyó értéke üres (lásd a változók leírásánál), az erv1 és erv2 értéke false a szumma értéke pedig -1 lesz, és nem hajtódik végre a következő lépés a golyók új helyzetének kiszámítása (helyzet eljárás) és a golyók képernyőn történő áthelyezése. Az előbbi lépések ismétlődnek mindaddig míg valamelyik golyó sebessége nagyobb nullánál. Ha minden golyó megállt, akkor a képernyő felfrissítése úgy történik, hogy újra meghívjuk az Asztalrajz eljárást és kirajzoljuk az összes golyót. Erre azért van szükség, mert a golyók összeütközésekor két golyó között átfedés lehet, ami a képernyőn nem odaillő pöttyöket eredményezhet. Ezután következik az erv1 és erv2 értéke alapján a játékos esetleges megváltoztatása, érvényes sorozat esetén a pontszámok felírása majd a következő lökés. A játék végén pedig következik az eredmény kiírása, és a grafikus képernyő lezárása. A program főbb változói golyo a golyók helyzetét, sebességét és gyorsulását és az utóbbi kettő irányát leíró record típusú tömb. lyuk a lyukak helyzetét és értékét leíró record típusú tömb ures az asztalon nem lévő golyók értékét mutató record (a golyók vízszintes és függőleges koordinátája -10, sebessége, gyorsulása, valamint az ezekhez tartozó szög értéke 0 pasztal az egyes golyók által eltakart területek elmentésére szolgáló pointer típusú tömb. pgolyo Az egyes golyók képének elmentésére szolgáló pointer típusú tömb. x0,y0, xmax,ymax az asztal koordinátáit képpontokban megadó értékek. r,rl a golyó illetve a lyuk sugarát képpontokban megadó értékek. asztx,aszty a golyók által takart területek visszamentési koordinátái. 17.5. Játékok keretprogramja A program célja A program lehetőséget biztosít arra, hogy a leírt játékprogramok illetve a játékprogramok szabályai egy menüből lehívhatók legyenek. A menüben a játékok kiválasztása a {EMBED Equation |} illetve az {EMBED Equation |} billentyűkkel vagypedig a játék nevének kezdőbetűjével történik, azt pedig, hogy a keretprogram a játékot indítsa el, vagypedig a játékszabályokat írja ki, a {EMBED Equation |} illetve a {EMBED Equation |} billentyűkkel lehet eldönteni. A választás után az Enter billentyű hatására végzi el a program a kiválasztott feladatot. A program főbb lépései a./ a menüablak kirajzolása b./ a menüpont kiválasztása c./ a választás alapján a játék lefuttatása vagy a szabályok kiírása. Az egyes pontokhoz tartozó főbb eljárások és függvények a./ A menüablak kirajzolását - figyelembevéve, hogy a teljes program során csak ez látható a monitoron - a főprogramban végezzük el. b./ ennek a résznek az alapja a jelöl nevű egyparaméteres boolean típusú függvény. Az eljárás paramétere kimenő paraméter, értéke azt mutatja meg, hogy melyik menüpontot, azaz melyik játékot választottuk ki. A kiválasztás-hoz a függvény figyeli a kurzormozgató billentyűket, továbbá az Esc billentyűt, amelynek hatására a program futása megszakad, valamint az Enter billentyűt, amelynek leütése esetén a függvény visszatérési értéke true lesz. c./ ehhez a részhez, az a./ ponthoz hasonló okok miatt, ismét nem tartozik eljárás, a játékok lefuttatása illetve a szabályol kiírása a főprogramból történik. A főprogram leírása Az előzőek alapján a főprogram leírása is meglehetősen rövid, a főprogram beállítja a színeket, megrajzolja a menüablakot, meghívja a választáshoz szükséges függvényt majd ennek alapján végrehajtja a kijelölt műveletet. A program főbb változói szov : az egyes menüpontok szövegét tartalmazó string típusú tömb jatek : boolean változó annak figyelésére, hogy a játékot akarjuk- e lejátszani vagy a szabályokat kiiratni st : string típusú változó, a meghivandó file (.exe vagy .hlp) nevét tartalmazza hlpfile : text típus, a szabályok szövegét tartalmazó file megnyitásához.