Úszd meg szárazon!

Úszd meg szárazon!

Készítünk egy játékot ahol a cél a hulló esőcseppek kikerülése.
A karakterünk az 5×5-ös pálya alsó sorában tud mozogni és fentről hullanak az esőcseppek.

Eső

Először készítsük el az esőt.
Az esőcseppeket egy 5×5 táblázattal fogjuk tárolni és minden lépésben 1-1 mezőt fognak hullani.
Ahol a táblázatban egy 1-est tárolunk ott van esőcsepp, ahol 0-t ott nincs.

Ennek a táblázatnak a mezői megfelelnek majd a micro:bit ledjeinek, így fogjuk megjeleníteni a pályát.

Először elkészítjük a táblázatot, és egy függvényt amivel ki tudjuk rajzolni az esőcseppeket.
Ha először a megjelenítő függvényt készítjük el, később azonnal látjuk a változásokat ahogy haladunk a programmal.

Fordítás
on startinduláskor – Ez a blokk egyszer fut le induláskor
for x from 0 to 4ciklus 0-4-ig – Ez a blokk 5x fut le egymás után
dropscseppek – Az esőcseppeket tartalmazó táblázat
empty arrayüres tömb/lista
set value at x toérték beírása x-nél valamire
functionfüggvény
call print_drops„cseppek kirajzolása” függvény meghívása
plot / unplotled be/kikapcsolása

Szépen sorra vesszük a táblázat minden sorát és oszlopát, és ahol 1-es értéket találunk ott felkapcsoljuk a ledet, különben lekapcsoljuk.
Itt láthatjuk hogy hogyan lehet egy táblázatot használni a programunkban.
Egy 5 elemű listát használunk, aminek minden eleme egy-egy 5 elemű lista.
Tehát tárolunk 5 oszlopot, és minden oszlop tárol 5 számot.
Ezért ahhoz hogy kiolvassunk vagy beírjunk egy számot, az X koordináta alapján lekérünk egy oszlopot, és ebből az Y koordináta alapján lekérjük a megfelelő számot.

Először állítsuk be a felső sor egyik mezőjét esőcseppnek, és írjuk meg a függvényt amivel le tud hullani.
Ahhoz hogy az esőcseppek lehulljanak minden sorba bemásoljuk a felette lévő számot.
De nagyon fontos a sorrend!
Ha úgy kezdenénk, hogy az első sorból átmásoljuk a második sorba a számokat, akkor a 2. sor számait felülírnánk és nem tudnánk hogy mit kell a 3. sorba másolni!
Ezért fordított sorrendet kell használni, és az utolsó sorral kell kezdeni.

Segítségül készítünk egy függvényt ami le tud másolni egy egész sort egyszerre.
Ezt a függvényt használjuk hogy hátulról előre lemásoljunk minden sort.
Ezután a legfelső sorban véletlenszerűen választunk egy mezőt amiben megjelenik egy fentről lehullott esőcsepp.
Előtte persze törölnünk kell az ott maradt esőcseppet a legfelső sorból, különben hamar megtelne az egész pálya vízzel.

Fordítás
fall_dropseső hullatása
copy_rowsor másolása
pick randomvéletlenszerű választás

Ha mindez sikerült már láthatjuk is a véletlenszerűen hulló esőcseppeket.


Játékos

A karakterünkkel a játékban jobbra és balra fogunk tudni mozogni az alsó sorban.
Irányíthatnánk ezt az A és B gombokkal is, de egy másik lehetőség hogy a gyorsulásmérőt használjuk.
Így minél jobban döntjük jobbra vagy balra a micro:bit-et annál inkább oldalra mozdul a karakterünk.

A játékos megjelenítéséhez egész egyszerűen a pozíciójának megfelelő ledet bekapcsoljuk az alsó sorban.
De hogyan is kapjuk meg hol van a játékos?

A micro:bit gyorsulásérzékelője érzékelni tudja a gyorsulást, így a gravitációt is 3 irányban.
Ezeket X, Y és Z irányoknak nevezzük.
A Z irány mutat felfelé amikor a micro:bit kijelzővel felfelé fekszik az asztalon.
Az X irány mutat a B gomb felé és az Y pedig az érintőgomb felé.
Ezek közül minket a jobbra-balra döntés érdekel, ezért a gyorsulásmérő X értékére vagyunk kíváncsiak.
Ez a gyorsulásmérő 0-t mutat mikor vízszintesen tartjuk a micro:bit-et, 1024-et mikor teljesen jobbra döntjük és – 1024-et amikor teljesen balra.

Nem szeretnénk hogy teljesen el kelljen dönteni a micro:bit-et ahhoz hogy a pálya széléig mozgassuk a játékost, ezért kiválasztunk egy döntési értéket, amit már 1 lépésnek számítunk.
Ezzel a lépéssel elosztjuk a kiolvasott X gyorsulást, így megkapjuk hogy hány lépést tettünk jobbra vagy balra a pálya közepétől számítva.
Lekorlátozzuk a lépéseket -2 és 2 közé, hiszen nem szeretnénk ha le tudna mozogni a karakterünk a pályáról.
Ezt -2-től 2-it tartományt átalakítjuk úgy, hogy a 0 a kijelző közepének feleljen meg, tehát hozzáadunk 2-t.
Ezzel már meg is van a játékosunk pozíciója és tudunk mozogni.

Példa 1

Például ha az érzékelő -124-et mutat és 100 értékenként veszünk egy lépést, akkor -124/100, -1.24 lépést kerekítünk -1 lépésre. Ehhez hozzáadunk 2-t, így megkapjuk hogy az 1-es pozícióban van a játékos.

Példa 2

Ha az érzékelő 600-at mutat és 100 értékenként veszünk egy lépést, akkor 600/100, 6 lépést kellene tennie a játékosunknak. Ezt korlátozzuk -2 és 2 közé, így 2-t kapunk.
Ehhez adunk 2-t, így a 4-es pozícióban van a játékos.

Fordítás
update_player_posjátékos pozíció frissítése
x_stepx lépés – hány egység felel meg 1 oldalra lépésnek
acceleration (mg)gyorsulás, 1/1000 gravitációs gyorsulás
roundkerekítés
clear screenképernyő törlése

Van viszont egy kis probléma.
A gyorsulásmérő nem csak a gravitációt, hanem mindenfajta gyorsulást érzékel.
Ha egy kicsit is remeg a kezünk, a játékosunk jobbra-balra rohangászik a pályán.
Hogy ezt elkerüljük szűrni kell a gyorsulásmérő jelét.

Ez hasonlít arra amit buszon ülve érez az ember.
Menet közben is végig kapaszkodni kell, mert zötyög, imbolyog a busz, de egész más érzés az amikor gyorsít vagy fékez a busz.
Ennek a szűrésnek az a célja, hogy a zötyögéseket ki tudjuk szűrni, és csak a fékezéseket és gyorsításokat érzékelje a gyorsulásmérőnk.

Ezt úgy csinálhatjuk, hogy minden lépésben elmentjük, hogy eddig mit mértünk, mennyi a gyorsulás.
Minden mérésnél csak 5%-ban vesszük figyelembe amit éppen megmértünk jelet és 95%-ban arra hagyatkozunk amit eddig elmentettünk.
Ez a módszer egy olyan mozgó átlagot hoz létre amivel ki tudjuk szűrni a kis hirtelen remegéseket, és csak a tartós változásokat vesszük figyelembe.

Fordítás
get_smooth_accelszűrt gyorsulás kiolvasása
factorszorzótényező

Így sokkal jobban irányítható a karakterünk.
Ezzel kész is a játékos.

Játékmenet

Már csak egy dolgunk van, ellenőrizni kell hogy mikor esik egy esőcsepp a játékosra.

Ezt úgy tudjuk megtenni, ha megnézzük a játékos mezőjén van-e esőcsepp miután lefelé mozgattuk őket.
Ha a játékost eltalálta egy csepp eső, hibahangot ad a játék.
Ilyenkor vége a játéknak.

Az egyszerűség kedvéért ilyenkor csak töröljük a pályán lévő esőcseppeket és újraindítjuk ezzel a játékot.

Így néz ki a teljes játék. https://makecode.microbit.org/_dh5UyFAdmRAM
Sok lehetőségünk van még, elkezdhetjük számolni hány lépést bírtunk végig hiba nélkül, próbálgathatjuk a szűrést, a játék sebességét és az esőcseppek számát variálni.

Na és kicsit más szemmel nézve, tökéletes lett a játék? Esetleg lehet valahogy csalni benne?
Ha egy átlós sorban érkezik 5 esőcsepp akkor nincs menekvés, biztosan vizes lesz a karakterünk.
Vagy mégsem?

Sok sikert!

Scroll to Top