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

Navrhujeme projekt

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.

Analyzujeme projekt

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á

Programujeme

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?

  1. pri začatí novej hry,
  2. 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,
  3. 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:

  1. otvorme dialóg Zmeň tlačidla nováHra a za volanie príkazu hraciaPlocha doplňme volanie príkazu generujPríklad
  2. 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:

  3. viem kontrola
     ak Popis=:súčet [nechPopis "||]
     generujPríklad
    koniec
  4. 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

Vyskúšajme všetky tlačidlá.

Čo nám ešte chýba?

Príkaz kontrola by mal vedieť zistiť, či

  1. 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

či pri tomto ťahu–kliknutí na tlačidlo nevzniklo náhodou bingo, t.j. či v niektorom riadku, stĺpci alebo uhlopriečke nemajú všetky tlačidlá–Bingo prázdny Popis, vtedy ukážeme nápis BINGO, ktorý môžeme mať pripravený tiež v texte

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ť

Na to, aby sme vedeli, ktoré texty ukázať pri popisovaných situáciách položme najprv na stránku ďalšie tri texty. Všetkým upravme font, veľkosť a farbu tak ako sa nám to páči:

  • 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:

  1. viem kontrola

  2.  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ý.

Úlohy

  1. Doplňte do projektu vynulovanie hodnoty v text3 pri štarte hry – chyby budeme počítať iba v rámci jednej hry.
  2. Pri stlačení tlačidla pass na chvíľu zobrazte k príkazu v text1 aj výsledok.
  3. 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.
  4. 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.
  5. 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.
  6. 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.
  7. 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áč.
  8. Počítajte, koľkokrát vyhral bingo hráč a koľkokrát počítač.