Životi i uvjeti

Igra mirne ruke s micro:bitom: varijabla životi, uvjet if / else, žica kao prekidač na pinu, start i cilj dodirom logotipa i štoperica.

igra mirne ruke
U mnogim igrama imaš nekoliko života. Kad te nešto pogodi, izgubiš jedan. Kad izgubiš zadnji, igra je gotova.

Ali kako igra zna da je gotova? Ona stalno postavlja jedno jednostavno pitanje: imam li još života? Ako je odgovor da, igra se nastavlja. Ako je odgovor ne, pokazuje kraj igre.

Takvo pitanje zovemo uvjet.

Danas ćemo:

  • napraviti varijablu zivoti koja pamti koliko života imamo;
  • naučiti blok if / else (ako / inače) kojim program donosi odluke;
  • napraviti igru mirne ruke: žica i petlja bit će prekidač spojen na pin micro:bita;
  • igru pokretati i završavati dodirom logotipa;
  • izmjeriti koliko je igra trajala i prikazati vrijeme na ekranu bez pomicanja brojki.

Radimo kao i dosad:

predvidi ⇒ pokreni ⇒ promijeni jednu stvar ⇒ ponovno testiraj ⇒ objasni rezultat

Materijal

  • micro:bit V2, USB kabel i battery pack
  • 2 × krokodil štipaljke
  • Kruta gola bakrena žica, oko 40 cm – staza (pripremi je voditelj)
  • Kraći komad iste žice, oko 10 cm – petlja
  • Kartonska kutija – postolje za stazu
  • Izolirna traka

Vježba 1: Tri života

Tehnika: varijabla pamti broj života

Varijablu već poznaješ iz brojača bodova. Sada će varijabla brojati unatrag: počinjemo s tri života, a svaki „pogodak” oduzima jedan. Za početak će pogodak biti protresanje micro:bita.

U MakeCodeu varijablu zovemo zivoti, bez kvačica, jer imena u programu pišemo bez slova č, ć, š, ž i đ.

Planiraj prije nego što programiraš:
KADA PROGRAM POČNE
postavi zivoti na 3
prikaži zivoti
KADA PROTRESEM MICRO:BIT
smanji zivoti za 1
prikaži zivoti
...

Smanjiti za 1 znači dodati −1. U MakeCodeu to radi blok change zivoti by -1.

Predvidi

  • Što će micro:bit prikazati na početku?
  • Što će prikazati nakon prvog protresanja? A nakon trećeg?
  • Što misliš, što će se dogoditi kad ga protreseš i četvrti put?

Isprobaj

Pokreni program u simulatoru i četiri puta klikni na SHAKE. Zatim ga prenesi na micro:bit i nježno ga protresi.

Zaključak: Nakon trećeg protresanja micro:bit pokaže 0, a zatim −1, −2 i tako dalje. Program broji, ali ne zna da je igra gotova. Treba mu pravilo: kad više nema života, igra je gotova.

Vježba 2: Uvjet: ako… inače

Tehnika: program donosi odluku

Uvjet je pitanje na koje je odgovor da ili ne. I ti stalno odlučuješ prema uvjetima:

  • Ako pada kiša, uzmi kišobran. Inače uzmi kapu.
  • Ako je semafor za pješake zelen, prijeđi cestu. Inače čekaj.

U MakeCodeu to radi blok if / else iz kategorije Logic. U njega stavimo pitanje, na primjer je li zivoti jednako 0?. Za takvo pitanje koristimo blok za usporedbu iz iste kategorije:

  • = – jednako
  • > – veće od
  • < – manje od

Ako je odgovor da, micro:bit izvrši blokove u dijelu if. Ako je odgovor ne, izvrši blokove u dijelu else. Nikad ne izvrši oba dijela.

Planiraj prije nego što programiraš:
KADA PROTRESEM MICRO:BIT
smanji zivoti za 1
AKO je zivoti = 0
prikaži lubanju
INAČE
prikaži zivoti

Predvidi

  • Što će se prikazati nakon prvog, drugog i trećeg protresanja?
  • Što će se prikazati nakon četvrtog protresanja? Pažljivo: koliko je tada zivoti? Je li to jednako 0?

Isprobaj

Složi program i protresi micro:bit četiri puta.

Nakon trećeg protresanja vidimo lubanju. Ali nakon četvrtog se pojavi −1! Životi su pali na −1, a −1 nije jednako 0, pa je micro:bit izvršio dio else.

Popravi

Dodajmo još jedan uvjet: život oduzimamo samo ako ga još imamo.

Popravljeni plan:
KADA PROTRESEM MICRO:BIT
AKO je zivoti > 0
smanji zivoti za 1
AKO je zivoti = 0
prikaži lubanju
INAČE
prikaži zivoti
KADA PRITISNEM A+B
postavi zivoti na 3
prikaži zivoti
...

Prvi uvjet nema dio else: ako nemamo života, ne radimo ništa. Tipke A+B vraćaju igru na početak, kao reset u brojaču bodova.

Promijeni jednu stvar

Neka igra počne s 5 života. Koliko puta sada moraš protresti micro:bit da vidiš lubanju? Na koliko mjesta u programu moraš promijeniti broj 3?

Dodatni izazov

Kad ostane samo jedan život, neka micro:bit umjesto broja pokaže iznenađeno lice. Pomoć: klikni na + na dnu bloka if / else i dobit ćeš još jedno pitanje, else if (inače, ako).

Vježba 3: Izrada igre mirne ruke

Tehnika: žica i petlja su prekidač

U igri mirne ruke petlja kreće s dna vijugave žice. Ti je vodiš prema gore i skidaš s gornjeg kraja žice, a da žicu ne dodirneš. Svaki dodir oduzima život.

Prisjeti se Breadboard laboratorija: kad pritisneš tipkalo, njegovi se metalni dijelovi dodirnu i strujni krug se zatvori. Žica i petlja rade isto. Kad se dodirnu, zatvore krug između pina P1 i GND-a, a micro:bit to primijeti.

Izrada staze

  1. Savij dugu žicu u valove. Ne pravi preoštre zavoje, jer petlja mora proći kroz njih. Donjih oko 8 cm žice ostavi ravno.
  2. Okreni kutiju otvorom prema stolu. Ravni donji kraj žice probodi kroz vrh kutije, tako da nekoliko centimetara gole žice uđe u kutiju, a žica stoji uspravno. Kutija je postolje, a gornji kraj žice ostaje slobodan u zraku.
  3. Odmah iznad kutije omotaj oko 3 cm izolirne trake. To je start: tu petlja miruje prije igre.
  4. Vrh žice omotaj trakom da nikoga ne ubode. Neka traka bude tanka, jer petlja mora proći preko nje.
  5. Savij kratku žicu oko olovke u zatvoren kružić, a ostatak žice neka bude ručka. Ručku omotaj izolirnom trakom.
  6. Navuci petlju odozgo na žicu i spusti je do starta, na traku.

Spajanje

Micro:bit s battery packom leži na stolu pokraj kutije, blizu starta, tako da logo možeš dotaknuti drugom rukom.

  • Staza (goli kraj žice unutar kutije) ⇒ krokodil štipaljka ⇒ P1
  • Petlja (kraj ručke) ⇒ krokodil štipaljka ⇒ GND
spajanje igre mirne ruke

Štipaljku za stazu pričvrsti na žicu unutar kutije, a njezin kabel izvuci ispod ruba kutije do micro:bita. Tako ti štipaljka ne smeta u igri. Provjeri da se dvije krokodil štipaljke ne dodiruju. Kad igraš, drži petlju samo za ručku s trakom.

Napravi novi projekt!

Ne nastavljaj u programu semafora iz prošle lekcije. Tamo je pin P1 slao struju žutoj LED-ici. Kad bi takav pin dodirnuo GND, napravio bi kratki spoj.

U igri mirne ruke pin P1 samo sluša je li spojen s GND-om. Zato je dodir žice i petlje siguran, isto kao pritisak tipkala.

Pin koji šalje i pin koji sluša

U semaforu je pin bio izlaz: micro:bit je preko njega slao 1 ili 0 i tako palio i gasio LED-icu.

Danas je pin ulaz: micro:bit ništa ne pali, nego provjerava je li pin spojen s GND-om. Tipke A i B iznutra rade na isti način.

Vježba 4: Igra mirne ruke sa startom i ciljem

Tehnika: jedan dodir, dvije odluke

Sada spajamo sve: živote iz vježbe 2 i prekidač iz vježbe 3. Igru ćemo pokretati i završavati dodirom logotipa.

Logo je zlatni znak iznad ekrana micro:bita V2. Osjeti dodir prsta, kao tipka. Blok on logo touched iz kategorije Input reagira čim ga dotakneš.

Kako se igra:

  1. Petlja miruje na startu, na traci na dnu žice.
  2. Drugom rukom dotakni logo: igra počinje.
  3. Vodi petlju prema gore, a da ne dotakneš žicu.
  4. Kad petlju skineš s gornjeg kraja žice, ponovno dotakni logo: igra je gotova.

Igra zato mora pamtiti traje li ili ne. To pamti varijabla igraTraje. Ona ne pamti broj, nego samo da ili ne: u MakeCodeu true (istina, da) ili false (laž, ne), iz kategorije Logic.

Planiraj prije nego što programiraš:
KADA PROGRAM POČNE
postavi igraTraje na false
prikaži metu
KADA DOTAKNEM LOGO
AKO igraTraje
postavi igraTraje na false
prikaži sretno lice
INAČE
postavi zivoti na 3
postavi igraTraje na true
prikaži zivoti
STALNO PONAVLJAJ
AKO igraTraje
AKO je pin P1 pritisnut
smanji zivoti za 1
pusti kratki niski ton
prikaži zivoti
AKO je zivoti = 0
postavi igraTraje na false
prikaži lubanju
pričekaj 1 sekundu

Isti dodir logotipa radi dvije različite stvari. Kad igra ne traje, pokreće je. Kad igra traje, završava je. O tome odlučuje uvjet AKO igraTraje.

U bloku forever uvjeti su jedan unutar drugoga:

  • prvi pita traje li igra?;
  • drugi pita je li petlja dotaknula žicu?;
  • treći pita je li to bio zadnji život?.

Drugo pitanje postavljamo samo dok igra traje, a treće samo nakon dodira.

Blok pin P1 is pressed također se nalazi u kategoriji Input. Odgovor je da dok god se petlja i žica dodiruju. Blok forever to pitanje postavlja opet i opet, mnogo puta u sekundi.

Zašto ne koristimo blok on pin P1 pressed?

Postoji i događaj on pin P1 pressed, ali on reagira tek kad kratak dodir završi, kad odmakneš petlju. A ako petlja dulje stoji na žici, uopće ne reagira! Igra mora reagirati odmah, zato pitamo pin P1 is pressed unutar bloka forever.

Za ton koristimo blok play tone s opcijom in background, kao u semaforu.

Predvidi

  • Što će micro:bit pokazati prije nego što dotakneš logo?
  • Što će se dogoditi ako dotakneš žicu prije nego što dotakneš logo?
  • Program nakon svakog dodira žice čeka jednu sekundu. Što misliš, što bi se dogodilo bez te pauze?

Isprobaj

Najprije odigraj igru s pauzom.

Ako dodir žice ne oduzme život, provjeri:

  • jesi li pokrenuo/la igru dodirom logotipa;
  • je li staza spojena na P1, a petlja na GND;
  • drži li krokodil štipaljka golu žicu, a ne traku;
  • dodiruju li se štipaljke međusobno.

Zatim izbaci blok pause i samo jednom kratko dotakni žicu.

Zaključak: Bez pauze jedan dodir odnese sva tri života. Petlja dodiruje žicu djelić sekunde, ali forever u tom djeliću sekunde postavi pitanje mnogo puta i svaki put oduzme život. Pauza od jedne sekunde znači: jedan dodir je jedan život. Mnoge video-igre rade isto: nakon pogotka si kratko neranjiv.

Vrati pauzu u program.

Promijeni jednu stvar

  • Promijeni pauzu s 1000 ms na 300 ms. Je li igra sada teža ili lakša? Zašto?
  • Promijeni broj života. Kolika je igra najzabavnija: s jednim, tri ili pet života?

Pošteno igranje

Logo na kraju dotakni tek kad si petlju stvarno skinuo/la sa žice. Micro:bit ne zna gdje je petlja, to znaš samo ti.

Vježba 5: Koliko je trajalo?

Tehnika: štoperica i vrijeme bez pomicanja brojki

Micro:bit ima vlastiti sat. Blok running time (ms) iz kategorije Input kaže koliko je milisekundi prošlo otkad je program počeo. Od toga ćemo napraviti štopericu:

  • Na startu zapamtimo koliko pokazuje sat: pocetak = running time.
  • Na cilju izračunamo koliko je prošlo: vrijeme = running time − pocetak.

Na primjer, ako je igra počela kad je sat pokazivao 5000 ms, a završila kad je pokazivao 17000 ms, igra je trajala 17000 − 5000 = 12000 ms, a to je 12 sekundi. Milisekunde pretvaramo u sekunde tako da ih podijelimo s 1000 i zaokružimo (blok round iz kategorije Math).

Kako prikazati 12 bez pomicanja?

Blok show number jednu brojku prikaže mirno, ali broj od dvije brojke, poput 12, prolazi preko ekrana. Ako trepneš, propustio/la si ga.

Ekran micro:bita ima 25 točkica: 5 redova po 5. Zato ćemo vrijeme prikazati točkicama: jedna točkica je jedna sekunda. Točkice se pale kao kad pišeš u bilježnicu: slijeva nadesno, a kad se red napuni, prelazimo u sljedeći red.

  • Jedan pun red je 5 sekundi.
  • 12 sekundi su dva puna reda i još dvije točkice.
  • Pun ekran znači 25 sekundi ili više.

Točkice brojiš u petice: pet, deset, petnaest… To ide brže nego čekati da broj prođe ekranom.

Planiraj prije nego što programiraš:
KADA DOTAKNEM LOGO
AKO igraTraje
postavi igraTraje na false
postavi vrijeme na running time − pocetak
pozovi prikaziVrijeme (vrijeme / 1000, zaokruženo)
INAČE
postavi zivoti na 3
postavi pocetak na running time
postavi igraTraje na true
prikaži zivoti
KADA PRITISNEM B
prikaži broj sekundi
FUNKCIJA prikaziVrijeme (sekunde)
obriši ekran
postavi x na 0
postavi y na 0
ponovi sekunde puta
upali točkicu x, y
povećaj x za 1
AKO je x = 5
postavi x na 0
povećaj y za 1

Funkciju prikaziVrijeme dobivaš gotovu u projektu. Evo kako radi:

  • x je stupac (od 0 lijevo do 4 desno), a y je red (od 0 gore do 4 dolje).
  • Blok plot x y iz kategorije Led upali točkicu u stupcu x i redu y.
  • Nakon svake točkice x se poveća za 1, pa je sljedeća točkica desno od nje.
  • Kad x dođe do 5, red je pun: x se vraća na 0, a y se poveća za 1, pa nastavljamo u sljedećem redu.

Tipka B prikaže točan broj sekundi, s pomicanjem. Njome provjeriš jesi li dobro prebrojio/la točkice.

Predvidi

  • Koliko točkica će se upaliti ako igra traje 7 sekundi? U kojim redovima?
  • Kako će izgledati ekran nakon 20 sekundi?
  • A nakon 40 sekundi?

Isprobaj

Odigraj igru, prebroji točkice i zatim pritisni B. Je li broj jednak tvom brojanju?

Promijeni jednu stvar

Ako ti igra traje dulje od 25 sekundi, ekran se napuni. Neka jedna točkica bude 2 sekunde: umjesto s 1000 podijeli s 2000. Koliko sekundi sada znači pun ekran?

Dodatni zadaci

Za one koji su sve završili. Rješavaj ih redom.

1. Težina

Prije starta tipka A mijenja broj života: 5 ⇒ 3 ⇒ 1 ⇒ 5…, od najlakše prema najtežoj Micro:bit pokaže odabrani broj (jednu brojku, pa se ne pomiče).

  • Napravi varijablu pocetniZivoti i na početku je postavi na 5, najlakšu težinu.
  • Kad dotakneš logo za start, zivoti postavi na pocetniZivoti, a ne na 3.
  • Tipka A smije mijenjati težinu samo dok igra ne traje. Inače bi netko usred igre mogao dodati sebi živote! Pomoć: blok not iz kategorije Logic okreće odgovor, pa not igraTraje znači igra ne traje.

2. Slike za živote

Umjesto broja neka micro:bit za svaki broj života pokaže drugu sliku. Za 5 života trebaš 5 slika, na primjer:

  • 5 – veliko srce
  • 4 – malo srce
  • 3 – sretno lice
  • 2 – iznenađeno lice
  • 1 – tužno lice

Možeš nacrtati i vlastite slike blokom show leds. Napravi funkciju prikaziZivote s blokom if / else if i pozovi je svugdje gdje si prije prikazivao/la broj života.

3. Vremensko ograničenje

Igru treba završiti na vrijeme, a rok ovisi o težini: više života znači lakšu igru i više vremena. Na primjer, rok je 10 sekundi za svaki početni život:

  • 5 života – 50 sekundi
  • 3 života – 30 sekundi
  • 1 život – 10 sekundi

Na startu izračunaj rok = pocetniZivoti × 10. U bloku forever, dok igra traje, provjeri je li prošlo više od roka: running time − pocetak > rok × 1000. Ako jest, igra je gotova i micro:bit pokaže uspavano lice: bio/la si prespor/a.

Pomoć: vrijeme provjeri prije dodira žice, ovako: AKO je isteklo vrijeme … INAČE AKO je pin P1 pritisnut …. Broj 10 prilagodi svojoj stazi, da igra ne bude ni prelagana ni preteška.

Rješenje sva tri zadatka:

Završni izazov: Tko ima najmirniju ruku?

Odigraj igru tri puta i svaki put zapiši koliko ti je života ostalo i koliko je sekundi igra trajala.

IgraPreostali životiVrijeme (s)
1.
2.
3.

Je li ti bolje išlo kad si žurio/la ili kad si išao/la polako?

Zatim nekome objasni svoj program:

  • Zašto isti dodir logotipa jednom pokreće, a drugi put završava igru?
  • Koje pitanje postavlja svaki od uvjeta u bloku forever?
  • Zašto nakon dodira žice čekamo jednu sekundu?
  • Kako micro:bit izračuna koliko je igra trajala?

Ako to možeš objasniti, razumiješ uvjete, a ne samo blokove.

Gdje ćemo ovo još koristiti?

Životi, uvjeti i prekidač na pinu vratit će se kad dobijemo robote. I robot će imati živote, a prekidač na pinu javit će mu kad ga nešto dotakne.

Što smo naučili?

  • Varijabla zivoti pamti koliko života imamo. Na početku je postavimo na 3, a svaki pogodak je smanji za 1.
  • Uvjet je pitanje na koje je odgovor da ili ne.
  • Blok if / else izvrši jedan dio programa ako je odgovor da, a drugi ako je odgovor ne. Nikad ne izvrši oba.
  • Za usporedbu brojeva koristimo =, > i <.
  • Uvjet zivoti = 0 nije ispunjen kad životi padnu na −1. Zato život oduzimamo samo ako je zivoti > 0.
  • Uvjet može biti unutar drugog uvjeta.
  • Žica i petlja rade kao prekidač: kad se dodirnu, zatvore krug između pina P1 i GND-a.
  • Pin može biti izlaz (šalje struju, kao u semaforu) ili ulaz (sluša, kao danas).
  • pin P1 is pressed unutar bloka forever odmah primijeti dodir.
  • Pauza nakon pogotka znači da jedan dodir oduzme samo jedan život.
  • Logo micro:bita V2 osjeti dodir. Isti dodir može pokrenuti ili završiti igru, a o tome odlučuje uvjet.
  • Varijabla može pamtiti i samo da ili ne: true ili false.
  • running time kaže koliko je milisekundi prošlo od početka programa. Trajanje igre je kraj − početak.
  • Ekran ima 25 točkica, pa vrijeme možemo prikazati točkicama: jedna točkica je jedna sekunda, a pun red pet sekundi.

Pitanja za kraj

1. Što je uvjet?
Uvjet je pitanje na koje je odgovor da ili ne, na primjer: je li zivoti jednako 0? Program prema odgovoru odlučuje što će napraviti.
2. Što radi blok if / else?
Ako je odgovor na pitanje da, izvrši blokove u dijelu if. Ako je odgovor ne, izvrši blokove u dijelu else. Nikad ne izvrši oba dijela.
3. Zašto je u vježbi 1 micro:bit pokazao −1?
Program je svaki put oduzeo jedan život i nije imao pravilo koje kaže kada je igra gotova. Nakon 0 oduzeo je još jedan i dobio −1.
4. Ako je zivoti = −1, je li uvjet zivoti = 0 ispunjen?
Nije. −1 nije jednako 0, pa micro:bit izvrši dio else. Zato život oduzimamo samo ako je zivoti veće od 0.
5. Kako micro:bit zna da je petlja dotaknula žicu?
Staza je spojena na P1, a petlja na GND. Kad se dodirnu, zatvore krug između P1 i GND-a, a blok pin P1 is pressed tada daje odgovor da.
6. Zašto za igru mirne ruke radimo novi projekt, a ne nastavljamo u programu semafora?
U programu semafora pin P1 šalje struju LED-ici. Kad bi takav pin dodirnuo GND, napravio bi kratki spoj. U novom programu P1 samo sluša.
7. Što bi se dogodilo bez pauze nakon dodira?
Jedan dodir odnio bi sve živote odjednom, jer forever u djeliću sekunde postavi pitanje mnogo puta i svaki put oduzme život.
8. Zašto se krokodil štipaljke ne smiju dodirivati?
Ako se dodirnu, P1 i GND su stalno spojeni. Micro:bit tada misli da petlja stalno dodiruje žicu i oduzima život za životom.
9. Što radi dodir logotipa u našoj igri?
Ako igra ne traje, dodir je pokreće: postavi tri života i zapamti vrijeme starta. Ako igra traje, dodir je završava i prikaže koliko je trajala.
10. Kako micro:bit izmjeri koliko je igra trajala?
Na startu zapamti koliko pokazuje running time. Na cilju od novog running time oduzme zapamćeni početak. Razlika je trajanje igre u milisekundama.
11. Zašto vrijeme prikazujemo točkicama, a ne brojem?
Broj od dvije brojke prolazi preko ekrana i lako ga propustimo. Točkice stoje mirno, pa ih možemo prebrojiti kad god želimo.
12. Koliko sekundi pokazuju dva puna reda i još tri točkice?
13 sekundi: svaki pun red je 5 sekundi, dakle 5 + 5 + 3 = 13.