A szöveg csak Firefox böngészőben jelenik meg helyesen. Használja a fenti PDF file-ra mutató link-et a letöltésre. A program a következő játékot valósítja meg. Autók rohannak a képernyőn alulról felfelé, több sorban, párhuzamosan, azonos sebességgel. A mi autónkat egy csillag (szorzójel) képviseli. Ezt a csillagot mozgatjuk a képernyő 7. sorában vízszintesen jobbra (az gombbal) vagy balra (az gombbal). Ha a képernyő bal oldaláról átérünk a csillaggal a jobb oldalra anélkül, hogy a felfelé áramló autókba ütköznénk, akkor nyertünk. A gép közben számolja az eltelt időt. Ha karambolozunk, akkor a gép ezt írja ki, továbbá azt, hogy milyen messze jutottunk el a képernyő bal szélétől. Megjegyzés. Mivel az autók gyorsan rohannak felfelé, az adott magasságban mozgó csillag azt a benyomást kelti, mintha az autósorral szemben haladna. A játék sebességéről. A program egyszerűbb változatában egy autót egy (vagy három) nulla jel képvisel. Ha minden pillanatban külön nyomtatnánk az autókat oda, ahol lenniük kell, az élvezhetetlenül lassúvá tenné a játékot. Ehelyett a legalsó sorba nyomtatjuk az autókat, amitől az előzőleg kinyomtatott autók automatikusan egy sorral feljebb csúsznak. Ez a soremelés adja az autók felfelé áramlását, ez az egyik oka, hogy programunk kielégítően gyors. Még mindig nagyon lassú lenne azonban, ha a legalsó sorba a hat-nyolc autót külön-külön nyomtatnánk. Ezért egy olyan string-sorozatot képezünk, amely betűközökből és az autóknak megfelelő alakzatokból áll, azt nyomtatjuk , ,, -re a képernyő aljára, majd újra kezdjük -nál. A gyorsítást tehát az adja, hogy például az kinyomtatása egyetlen lépés, de autó megjelenítése (feltéve, hogy egy autót éppen egy -val ábrázolunk). A csillag árnyéka. A programban a csillag a felülről számított 7. sorban mozog jobbra-balra. Egy-egy autósor kinyomtatásakor a csillag is feljebb csúszik, majd egy újabb csillagot nyomtatunk ki a 7. sorba. Így azután általában több csillagot is látunk a képernyőn, de csak egyik ,,érvényes''. Ez ellen lehetne védekezni az ,,árnyékcsillagok'' kiirtásával. Alább találsz erre is egy feladatot. Egy feladatsorral kezdjük: ha ezeket a feladatokat megoldottad, már könnyű lesz megírnod, vagy legalább is megértened az Őrült Autós programot. Az alábbiakban hosszú stringeket készítünk. Ilyenkor gyakran nem elég az az hely, amit a gép a string-műveletekre automatikusan biztosít. Ezt OS hibaüzenet jelzi. Biztosíthatjuk magunkat ez ellen, ha a program elejére elhelyezünk egy CLEAR vagy CLEAR utasítást. A gép CLEAR hatására byte-ot (helyet) köt le string-készítésre (string-műveletekre). (A DIM-eket tegyük a CLEAR után! ) A játékot két változatban fogjuk megépíteni. Az első változatban három egymás alatti jelöl egy autót, a másik változatban megtanulunk bonyolultabb ,,grafikus'' alakzatokat nyomtatni, és ilyenekből állítjuk elő az autókat. Az első változatban az autókat ,,egyesével'' írjuk be egy sémába: az -ket magunk készítjük el. A második változatban megadjuk a gépnek, hogy milyen sűrűn akarjuk az autókat. Ebből az -ket a gép állítja elő. Az első változatban nem foglalkozunk az adminisztrációval, mindent a legegyszerűbb formában intézünk el. A második változat már majdnem kidolgozott változat: jól működik és legfeljebb apróságokat érdemes javítani rajta. Mindkét program azonos felépítésű: egybevezető résszel kezdődik, majd egy ciklus következik, amelyben a) kinyomtatunk egy új autósort, b) mozgatjuk az őrült autóját, c) ellenőrizzük, nem karamboloztunk-e.
A befejező rész jelzi, hogy nyertünk-e vagy karamboloztunk (és a jobb változatban kijelzi a teljesítményünket is).
Feladatok 1 . Készíts egy ciklust, amelyik az alábbi -t nyomtatja ki ciklikusan , , , , -re, majd elölről , , , , -re:
(Az mindegy, hogy hogyan töltöd ki a helyeket nullákkal és betűközökkel, de végül ezek sűrűsége és szabálytalansága fogja meghatározni a játék nehézségét.) 2. Módosítsd az előző feladat programját úgy, hogy a gép mindegyik -t háromszor nyomtassa ki egymás után. Lásd el a programot egy INPUT kezdéssel és egy -es lassító ciklussal; lesz az autók áramlásának sebessége. 3. Készíts egy programot, amelyik a fentiek mellett egy csillagot (szorzó-jelet) mozgat a 7. sorban jobbra-balra (INKEY-ral, és hatására). 4. Írj egy programot, amelyik bekér egész számot és között és PRINT @, hatására -eket tesz a megfelelő helyekre. Ezután INKEY-ral mozgathatsz egy csillagot a képernyőn négy irányba és ha olyan helyre érsz, ahol áll, akkor a gép kiírja: ,,Karamboloztál!'' 5. Próbáld ki a következő programot , , -ra:
Azt tapasztaljuk, hogy egy betű helyére különböző geometriai alakzatokat is nyomtathatunk. Érdekesebb alakú autókat (UFO-kat) gyárthatunk, ha a következő programsort használjuk:
Mi a CHR()+CHR() alakú autókat fogjuk használni. 6. A fenti feladatok alapján írd meg az Őrült Autós program egyszerűbb változatát az alábbi segítséget is figyelembe véve: (i) A programot kezdd a
sorral. Az ezután következő sorok definiálják -t , , , -re az 1. feladatban leírt módon. (Amikor már működik a program, akkor változtathatsz a -k sűrűségén, hogy a játékot élvezetessé tedd.) (ii) Mindegyik -t háromszor nyomtasd ki, mielőtt a következőre áttérnél. (iii) A csillagot a | | segítségével nyomtasd ki. Itt a második PRINT miatt fog a következő PRINT a legalsó sorba nyomtatni. (Egy másik megoldás: PRINT , ). (iv) Akkor nyersz, ha az INKEY által szabályozott értéke eléri -öt. (v) Amikor a KARAMBOL-t ellenőrzöd, akkor nem arra vagy kíváncsi, hogy -adik helyén van-e vagy sem, hiszen a kocsi magasságában ilyenkor éppen van, vagy valami ilyesmi: egy korábbi . Gondold át, hogyan tudod -t úgy megkapni, hogy az feltétel éppen akkor teljesüljön, ha a csillagod egy -t talál el. (Attól függően, hogy hogyan valósítod meg a programot, néha csak minden második lépésben nyomtat ki -t, minden második sort üresen hagy, vagy esetleg mindegyik sorba nyomtat. Mindenesetre három autósorral lejjebb , hat sorral lejjebb van, ) 7. Írd meg az Őrült Autós játék fejlettebb változatát is, az alábbiak alapján: A bemenő adatok: kocsiáradat sebessége , kocsik sűrűsége , , a véletlen szám generátor ,,magja'' . (i) Vedd alapul az egyszerűbb változatban elmondottakat. (ii) Készíts egy véletlenszám-generátort, amely (, ) közötti számot ad ki. , . , -at. Egy INPUT-tal bevitt -re a gép ellenőrizze, teljesül-e. Ha igen, akkor (definíció szerint) legyen , egyébként ! (iii) Készíts 10 darab vektort, melyek mindegyikében legyen darab szélességű hely, ahová autókat tehetünk és bármely két ilyen hely között két kihagyás:
Ahová -et raktunk, oda tegyél -et vagy hagyj ott két üres helyet attól függően, hogy vagy . Így az autók sűrűsége hozzávetőlegesen lesz: esetén körül fog járni. (iv) Ezekkel az autókkal készítsd el az autók felfelé áramló seregét. Az őrült autós autója most "##" legyen, tehát szintén kettő szélességű. Így jobban is látszik. (v) Számold az eltelt időt. A végén nyomtasd ki. (vi) A programot kezdd egy megfelelő bevezető résszel, melyben ismerteted, hogyan kell használni a játékot. (vii) Ha karamboloztál vagy ha nyertél, másodperc után a gép kezdjen új játékot az eredeti pályán. (Ha új pályára vágysz vagy új játéksebességre, BREAK + RUN-nal indíts újra.) Megjegyzés. A fentiekben végére szabad helyet raktunk, hogy hosszúságú legyen. Lehetne még hosszabb is, de ha rövidebbre választjuk, hibajelzést kapunk karambol-ellenőrzéseink során. (Miért?) Rátérünk a programra. Rögtön a fejlettebb változatot adjuk meg, a . feladat megoldását.
Magyarázat A program sorában levő CLEAR biztosítja a helyet a gép memóriájában az ,,AUTÓK KÉSZÍTÉSE'' egységben történő string-műveletekhez. Ha kihagynánk, OS hibaüzenet jelezné, hogy e string-műveletékre szánt hely nem elegendő. A ‐ sorok közlik a játékra vonatkozó információkat. ‐-ban egy -es véletlen mátrixot ( hosszúságú vektort) készítünk a -ban bekért négyzetgyökével (amit szintén -val jelölünk) és a -be bekért számmal. Minél nagyobb , annál sűrűbbek lesznek -ek -ben és annál több autót fogunk generálni az ,,AUTÓK KÉSZÍTÉSE'' elnevezésű egységben. A játék élvezhető már -mal is, nehézzé kezd válni -nél és lényegében megnyerhetetlen -nél. A sorok kinyomtatják a kapott -eket -es elrendezésben (mátrixban). Ott lesznek az autók, ahol most -eket látunk. Ha ezt az ellenőrzést feleslegesnek tartod, tedd REM-be. Az adatok bevitele automatikus értékadással történik: valahányszor az INPUT megkérdez egy adatot , és közül, válaszolhatunk a szabályoknak megfelelően, de az is elég, ha lenyomjuk NL-t: előzőleg ugyanis már választott a program értéket ezen adatok számára, így azonnali NL esetén megtartja ezeket: majd , , . Az AUTÓK KÉSZÍTÉSE egységnél vigyázzunk a megfelelő számú betűközre! A felfelé futó autók mindig két karakter szélességűek, és a , , , , oszlopokban kezdődhetnek. Ez azt jelenti, hogy két autóoszlop között mindig lesz két egységnyi pihenőhely a mi két karakter szélességű autónknak is. Ez megkönnyíti a játékot. A sor aktiválása (REM elhagyása) esetén a sorok fele beljebb kezdődik, megszűnik a pihenő-sáv, megnehezedik a játék.
A sorokban éppen már elkészült része. Mindenütt írhattunk volna -t is helyett. Próbáld ki, mi történik, ha végére nem teszel (elég) üres helyet (-es sor). számolja, mennyit haladunk jobbra, pedig a futási időt. hatására a gép kinyomtat egy üres sort a képernyő aljára, ezután kinyomtatja a soron következő autókat ugyanide, de persze előbb megemel mindent egy sorral. Ez tulajdonképpen az egész autóáramlás alapja. Ha csak PRINT @, -t használnánk helyett, az autók áramlata kétszer ilyen sűrűvé válna. (Ilyenkor a karambol ellenőrzés megváltozik!) A sor intézi el, hogy , után megint következzen kinyomtatásra. folyamatosan mutatja az eltelt időt a bal felső sarokban. Ha úgy találod, hogy idegesítően gyorsan fut, helyett INT()-et nyomtasd ki. A ‐ ciklus várja, hogy lenyomjunk egy gombot: -t vagy -et, majd egy idő után ,,lejár'': kinyomtatja a képernyő felső harmadába a mi ,,autónkat'', "##"-ot. Ha viszont lenyomjuk -t vagy -et, a gép nem várja meg a -ciklus lejártát. Így a játék akkor is felgyorsul, ha lassúra állítjuk be, de gyorsan nyomogatjuk -t és -et. Ez izgalmasabbá teszi a játékot. A KARAMBOL? egységben ellenőrizzük, hogy nem került-e ugyanoda a "##" és egy autója. Ha nem, akkor visszaküld -ra: kinyomtat egy új autósort és várja, hogy lépünk-e. Ha viszont karamboloztunk, jelzi ezt, -t is kinyomtatva. Így megtudjuk, hogy milyen messzire sikerült elkerülnünk a balszéltől. Ha "##"-gal elérkeztünk az pozícióra, akkor NYERTÜNK, amit a program sora jelez ki. Mindkét esetben az sornál kötünk ki, ahol egy HAMIS INPUT állítja le a gépet. Leolvashatjuk az eltelt időt, és eldönthetjük, hogy NL-lel folytatjuk-e a játékot a megelőző pályán és sebességgel, vagy BREAK + RUN-nal új játékba kezdünk. Feladatok 1. Tüntesd el a játékból az árnyék-csillagokat! 2. Módosítsd a játékot úgy, hogy ne függjön az autók áramlási sebessége attól, hogy milyen gyorsan nyomogatjuk -t és -et! 3. Módosítsd az autók generálását úgy, hogy különböző alakú autók is megjelenjenek a pályán! Részlet a szerző ,,Számítástechnika'' c. tankönyvéből.Ez a következő üres magú ciklust jelenti: FOR I=1 TO /I: NEXT I. |