Matematické bingo
Čo budeme robiť
- hľadať súčty, ktoré nám vygeneruje počítač, čakať kedy dosiahneme bingo
Čo už musíme vedieť
- pracovať s tlačidlami, definovať na ne udalosti
Naučíme sa
- vytvárať štvorcovú hraciu plochu z tlačidiel, dávať na tlačidlá rôzne Popisy, kontrolovať splnenie zložitejšej podmienky
Celkom zaujímavou hrou pre jedného hráča alebo pre hráča a počítač je matematické Bingo: na hracej ploche 5x5 políčok sa nachádza 25 čísel z nejakého rozsahu napr. od 2 do 20 (pre väčšie deti môžeme voliť väčšie čísla). Počítač potom generuje príklady na sčítanie (pre žiakov vyšších tried môžeme použiť aj iné matematické operácie). Úlohou hráča je nájsť na hracej ploche výsledok pre tento príklad alebo stlačiť tlačidlo pass, ak sa na hracej ploche výsledok nenachádza. Ak hráč výsledok našiel správne, toto číslo z hracej plochy zmizne. Hra končí, keď sú v niektorom z riadkov, stĺpcov alebo uhlopriečok všetky čísla "zmiznuté". Ak hráč výsledok neurčí správne alebo si nevšimne, že toto číslo sa na hracej ploche ešte nachádza, pripočíta sa mu to do počtu chýb. |
Hracia plocha pre Bingo bude veľkosti 5x5 a sú to tlačidlá – mohli by to byť aj korytnačky, ale s tlačidlami bude riešenie jednoduchšie.
Na každom z nich bude v jeho Popise (položka v pravoklikovom menu Zmeň) zrejme zapísané číslo, ktoré počítač vygeneruje.
Ďalšie dve tlačidlá budú určené na začatie novej hry (tlačidlo Nová hra) a na to, aby hráč mohol "preskočiť" daný príklad, ak sa jeho výsledok nenechádza na hracej ploche (tlačidlo pass).
Na stránke sa ešte nachádza niekoľko textov:
- text1, do ktorého počítač vygeneruje príklad, napr. na sčítanie dvoch čísel od 1 do 10
- text2 s oznamom Počet chýb
- text3 na počítanie chýb, v ktorom je na začiatku hodnota 0
- text4 s červeným oznamom BINGO, keď hráč vyhrá
Na začiatok zrušme korytnačku k1, ktorá sa nachádza na stránke pri spustení Imagine – v jej pravoklikovom menu vyberme Zruš k1.
Hraciu plochu by sme mohli opäť vytvárať kopírovaním cez Schránku, ale po predošlých aktivitách určite každého napadne, že vytvoríme triedu.
Čo majú všetky tlačidlá–bingo spoločné?
- veľkosť, zvoľme napr. 40x40 bodov
- udalosť priZapnutí, ktorá zistí, či hráč uhádol správne číslo, teda to, ktoré je výsledkom vygenerovaného príkladu a potom zistí, či pri tomto ťahu hráča nevzniklo bingo – na to môžeme definovať príkaz kontrola
- procedúru kontrola, ktorá zistí, či je v niektorom riadku, stĺpci alebo uhlopriečke bingo, t.j. všetky tlačidlá v tomto útvare majú prázdny Popis
Čo majú naopak odlišné?
- pozíciu
- hodnotu v Popise
Vytvorme triedu Bingo, ktorá bude mať premennú veľkosť a udalosť priZapnutí, ktorá vyvolá príkaz kontrola. Definovanie samotného príkazu kontrola necháme do editora procedúr – mohli by sme ju definovať aj v riadku, ale v editore to bude prehľadnejšie.
? nováTrieda "Tlačidlo "Bingo [veľkosť [40 40] priZapnutí [kontrola]]
Pozrime sa do Pamäte, dvokliknime na triedu Bingo a v záložke procedúry zadefinujme aspoň veľmi jednoduchú procedúru kontrola, v ktorej vyprázdnime položku Popis tlačidla, na ktorom vznikla udalosť priZapnutí – zatiaľ bude táto procedúru takáto jednoduchá preto, že ešte možno nemáme celkom predstavu, čo by sme do nej zapísali.
viem kontrola
nechPopis "||
koniec
Na vytvorenie tlačidiel hracej plochy použijeme globálnu procedúru hraciaPlocha, ktorá vytvorí všetkých 25 tlačidiel–Bingo:
? ed "hraciaPlocha
viem hraciaPlocha
urobTu "x -140
urobTu "y 110
urobTu "náhodnéČíslo 2+náhodne 19
opakuj 5
[urobTu "r poč
opakuj 5
[urobTu "s poč urobTu "náhodnéČíslo 2+náhodne 19
nové "Bingo
[meno (slovo :r :s)
poz (zoznam :x :y)
popis (:náhodnéČíslo)] urob "x :x+40]
urob "x -140 urob "y :y-40]
koniec
Vytvorme hraciu plochu a vyskúšajme klikať na jednotlivé tlačidlá:
? hraciaPlocha
Vzniklo 25 tlačidiel po 5 v riadkoch, v každom z nich je nejaké číslo do 20, keď klikneme na tlačidlo, toto číslo z neho zmizne.
Vložme na stránku nové tlačidlo, zmeňme mu meno na nováHra, Popis na Nová hra a definujme zatiaľ udalosť priZapnutí na zavolanie procedúry hraciaPlocha, vyskúšajme toto tlačidlo.
Na stránku vložme ešte ďalšie tlačidlo, zmeňme mu meno na pass, Popis na pass.
Poznámka: Popis a meno tlačidiel volíme rovnaké, aby si ich ľahko zapamätali.
Na stránku vložme text, v ktorom sa bude objavovať príklad – všimnime si, že má meno text1, zmeňme mu font, veľkosť a farbu tak, ako sa nám to páči.
Kedy sa má objaviť nový príklad?
- pri začatí novej hry,
- pri správnom alebo nesprávnom určení výsledku tohto príkladu, t.j. pri udalosti priZapnutí niektorého tlačidla–Binga z hracej plochy,
- pri stlačení tlačidla pass
Keďže miest, odkiaľ potrebujeme vyvolať generovanie nového príkladu je niekoľko, vytvorme opäť globálny príkaz:
? ed "generujPríklad
viem generujPríklad
urobTu "sčítanec1 1+náhodne 10
urobTu "sčítanec2 1+náhodne 10
urob "súčet :sčítanec1+:sčítanec2
text1'nechHodnota (slovo :sčítanec1 "+ :sčítanec2 "=)
koniec
Poznámka: Všimnime si, že premenné sčítanec1 a sčítanec2 sú len lokálne, ale premenná súčet je globálna – budeme ju potrebovať pri kontrolovaní hodnoty na stlačenom tlačidle–Bingo.
Teraz doplňme volania tejto procedúry na všetky tri spomínané miesta:
- otvorme dialóg Zmeň tlačidla nováHra a za volanie príkazu hraciaPlocha doplňme volanie príkazu generujPríklad
- vojdime do Pamäte a zmeňme príkaz kontrola tak, aby sa Popis vyprázdnil iba vtedy, ak je hodnota v globálnej premennej súčet rovnaká ako hodnota na tomto tlačidle. Po skontrolovaní tejto hodnoty opäť vyvolajme príkaz na vygenerovanie nového príkladu:
- otvorme dialóg Zmeň tlačidla pass a do jeho udalosti priZapnutí tiež zapíšme volanie príkazu na vygenerovanie nového príkladu na sčítanie
viem kontrola
ak Popis=:súčet [nechPopis "||]
generujPríklad
koniec
Vyskúšajme všetky tlačidlá.
Čo nám ešte chýba?
Príkaz kontrola by mal vedieť zistiť, či
- po hráčovom ťahu vznikla chyba, t.j. hráč klikol na tlačidlo, na ktorom nebol správny výsledok, vtedy treba zvýšiť počet hráčových chýb, ktoré môžeme mať uložené napr. v texte alebo
Mohli by sme kontrolovať celú hraciu plochu, ale keďže sme si dobre pomenovali tlačidlá (podobne ako sme zvyknutí v matematike označovať matice), môžeme skontrolovať len riadok a stĺpec, v ktorom naozaj mohlo nastať bingo podľa toho, na ktoré tlačidlo hráč naposledy klikol. Úlohu kontroly riadku, stĺpca a uhlopriečok si pre jednoduchosť rozdeľme na 3 časti:
riadok, v ktorom mohlo zvniknúť bingo určuje prvý prvok z mena tlačidla, na ktoré hráč klikol, t.j. treba skontrolovať celý riadok napr. tak, že prejdeme všetky tlačidlá v tomto riadku a zistíme, či majú prázdny Popis
stĺpec, v ktorom mohlo vzniknúť bingo určuje druhý prvok z mena tlačidla, na ktoré hráč klikol, t.j. treba skontrolovať celý stĺpec napr. tak, že prejdeme všetky tlačidlá v tomto stĺpci a zistíme, či majú prázdny Popis
uhlopriečky sú len 2, takže ich môžeme kontrolovať vždy alebo zistiť, či tlačidlo leží na niektorej z nich a iba vtedy ju skontrolovať
- oznam Počet chýb
- k nemu blízko text3 s zatiaľ s hodnotou 0, do ktorého budeme spočítavať hráčove chyby
- text4 s oznamom BINGO, ktorý na začiatku hry skryjeme a ukážeme iba keď vznikne bingo
v pravoklikovom menu vyberme Zmeň prejdime do záložky Vzhľad a ukryme text4 odškrtnutím položky Vidno. V pravoklikovom menu tlačidla novaHra do udalosti priZapnutí doplňme ukrytie tohto textu za doterajšie volania: hraciaPlocha generujPríklad text4'skryMa
Doprogramujme príkaz kontrola triedy Bingo:
- viem kontrola
ak2 Popis=:súčet [nechPopis "||][text3'nechHodnota text3'hodnota+1]
; je 5 prázdnych Popisov v riadku?
urobTu "r prvý mojeMeno
urobTu "jeBingo "áno
opakuj 5 [ak pre slovo :r poč [Popis]<>"|| [urob "jeBingo "nie]]
ak :jeBingo [text4'ukážMa ukonči]
; je 5 prázdnych Popisov v stĺpci?
urobTu "s posledný mojeMeno
urobTu "jeBingo "áno
opakuj 5 [ak pre slovo poč :s [Popis]<>"|| [urob "jeBingo "nie]]
ak :jeBingo [text4'ukážMa ukonči]
; leží tlačidlo na hlavnej uhlopriečke?
ak (prvý mojeMeno)=(posledný mojeMeno)
[urobTu "jeBingo "áno
opakuj 5 [ak pre slovo poč poč [Popis]<>"|| [urob "jeBingo "nie]]
ak :jeBingo [text4'ukážMa ukonči]]
; leží tlačidlo na vedľajšej uhlopriečke?
ak (prvý mojeMeno)+(posledný mojeMeno)=6
[urobTu "jeBingo "áno
opakuj 5 [ak pre slovo poč 6-poč [Popis]<>"|| [urob "jeBingo "nie]]
ak :jeBingo [text4'ukážMa ukonči]]
generujPríklad
koniec
Príkaz je dosť dlhý – je to zrejme najdlhší príkaz, ktorý sme v našom tutoriály zapísali – myslíme si však, že po predchádzajúcom rozbore je jasný.
- Doplňte do projektu vynulovanie hodnoty v text3 pri štarte hry – chyby budeme počítať iba v rámci jednej hry.
- Pri stlačení tlačidla pass na chvíľu zobrazte k príkazu v text1 aj výsledok.
- Keď hráč urobil chybu, do text1 zobrazte k príkladu aj výsledok. Zároveň namiesto tlačidla pass zobrazte tlačidlo s nápisom rozumiem. Po jeho stlačení, keď si hráč uvedomí, aký bol správný výsledok, sa tu opäť objaví tlačidlo pass a vygeneruje sa nový príklad.
- Pokiaľ je zobrazené tlačidlo rozumiem nech nefunguje stláčanie tlačidiel triedy "Bingo. využite príkaz pre všetkyOd "Bingo [nechReaguje "nie] . Samozrejme po stlačení tlačidla rozumiem nezabunite vrátiť reagovanie týchto tlačidiel.
- Ak hráč stlačil tlačidlo pass a pritom sa na hracej ploche nachádzal výsledok tohto príkladu, nech je na to upozornený nejakým zvukom – uvedomte si, že musíte prejsť všetky tlačidlá a zistiť, či sa na niektorom z nich nenachádza rovnaká hodnota ako v premennej súčet.
- Keď má tlačidlo už prázdny Popis, nech nereaguje na ďalšie stláčanie, t.j. nebude sa to počítať ako hráčova chyba.
- Do hry doplňte hru počítača – hráč a počítač sa striedajú: počítaču sa tiež vygeneruje príklad. Ak sa výsledok nachádza na hracej ploche, program automaticky nájde toto tlačidlo a vyprázdni mu Popis. Potom sa vygeneruje príklad pre hráča, ktorý hrá rovnako ako predtým. Ak sa bingo podarí získať počítaču, t.j. ak ťahal a nájdením výsledku vzniklo 5 práznych políčok v riadku, stĺpci alebo v uhlopriečke, oznámi sa to nápisom BINGO pre POČÍTAČ. Upravte a zobrazte tento nápis ak bingo získa hráč.
- Počítajte, koľkokrát vyhral bingo hráč a koľkokrát počítač.