Ú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 start | induláskor – Ez a blokk egyszer fut le induláskor |
| for x from 0 to 4 | ciklus 0-4-ig – Ez a blokk 5x fut le egymás után |
| drops | cseppek – 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 |
| function | függvény |
| call print_drops | „cseppek kirajzolása” függvény meghívása |
| plot / unplot | led 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_drops | eső hullatása |
| copy_row | sor másolása |
| pick random | vé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.
Fordítás
| update_player_pos | játékos pozíció frissítése |
| x_step | x 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 |
| round | kerekítés |
| clear screen | ké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_accel | szűrt gyorsulás kiolvasása |
| factor | szorzó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!