Riešenie
3. úlohy školského kola 2. ročníka súťaže COLOGOBEŽKA
3. Ježko zbiera jablká
Najprv si v Obrázkovom editore nakreslíme
obrázok jablka – premenná "jablko
a ježka – zmeníme základný obrázok korytnačke 0 na obrázok ježka s dvoma
fázami (jedna otočená pravo, druhá vľavo). V Painte nakreslíme obrázok
stromu do veľkosti kresliacej plochy 640x402 bodov (v hlavnom menu voľba
Image –> Atributes).
Korytnačku
0 presunieme pod pravý okraj stromu, dáme jej pero hore a zmeníme jej natočenie
na 270 stupňov.
Teraz vytvoríme 10 jabĺk – korytnačky
1, 2, ..., 10. Buď pomocou pravého klikania do Plochy (na strome), výberom
natočenia, pera hore a obrázka z premennej "jablko.Šikovnejší
môžu všetky korytnačky vytvoriť pomocou základného príkazu urob.kor
na jednom mieste. Zápis tohto príkazu môže byť napr.
? opakuj 10 [urob.kor poc [0 0 180 ph skry :jablko]]
Pozn.: korytnačky je pre počiatočné
ladnie možno lepšie vytvoriť vidieteľné
Potom je potrebné korytnačky poprenášať
na nejaké miesta na strome a ich a vytvoriť ich znovu pomocou pravého kliku
do Plochy a Pomôcky Urob korytnačku na tomto mieste.
Deti, ktoré poznajú príkaz nahodne
a zmen.xy
môžu vymyslieť prenášanie korytnačiek na náhodné miesto na strome napr.
? opakuj 10 [pre poc [zmen.xy -150 + nahodne 132
-25 + nahodne 140]]
Pozn.: toto sú súradnice vymyslené
pre umiestenie môjho stromu na Ploche, Váš strom je zrejme nakreslený inde
Nakoniec navrhneme príkaz, ktorý vygeneruje
koľko jabĺk ostalo na strome a toľko korytnačiek–jabĺk ukáže.
viem daj.jablka
urob "p.jablk 1 + nahodne 10
opakuj :p.jablk [pre poc [zmen.xy -150 + nahodne
132 -25 + nahodne 140 ukaz]]
koniec
Ďalej vytvorme dva hlavné príkazy – jeden
bude zabezpečovať chodenie ježka – zbieraj.jablka
a v ňom volanie druhého – vyries.klik,
ktorý vyrieši situáciu, keď sa kliklo na jablko a následné padnutie príslušného
jablka.
Volanie oboch príkazov dajme do príkazu
start.
viem start
daj.jablka
zbieraj.jablka
koniec
Príkaz zbieraj.jablka
skontroluje, či sú ešte na strome nejaké jablká – doplňme vytvorenie a
inicializovanie na nulu premennej "p.pozbieranych
do príkazu start.
Ak áno, pokračuje ďalej, ak nie, príkaz končí – všetky jablká sú pozbierané
(buď si ich odniesol ježko alebo sa stratili). Potom príkaz zistí, či bolo
niečo stlačené – operácia klaves?
V prípade, že sa niečo stlačilo, zavolá príkaz vyries.klik.
Ak nebolo stlačené nič, v príkaze sa kontroluje ježkova x-ovú súradnica
(ak je ježko mimo oblasti pod stromom otočí ho o 180), ježko prejde dopredu
a rekurzívnym volaním dosiahneme opakovanie popisovaných činností až kým
nie sú pozbierané všetky jablká.
viem zbieraj.jablka
ak :p.jablk = :p.pozbieranych [ukonci]
ak klaves? [vyries.klik]
ak x.sur < - 180 [vl 180]
ak x.sur > 10 [vl 180]
do 5
cakaj 10
zbieraj.jablka
koniec
Ostáva zapísať príkaz vyries.klik.
Vieme, že bolo niečo stlačené, najprv príkaz zistí, či to bolo ľavé tlačidlo
myši – výsledkom operácie klaves
je 0. Ak bolo, ešte je potrebné zistiť, či sa kliklo na niektoré z jabĺk
– výsledok operácie zvolena
nie je prázdny. V takom prípade oslovíme zvolenú korytnačku – jablko a
zavoláme príkaz jablko.padaj,
ktorý dorieši padnutie jablka a jeho zmiznutie alebo objavenie sa v ježkovom
brlôžku.
viem vyries.klik
urob "k klaves
ak :k = 0 ~
[ak nie.je prazdna? zvolena [zvys "p.pozbieranych
oslov zvolena jablko.padaj]]
koniec
Malým nedostatkom tohto riešenia je kliknutie
na korytnačku 0 – ježko, to sa dá vyriešiť doplnením otázky ak
zvolena<>0 do predchádzajúceho
príkazu.
Príkaz jablko.padaj
skontroluje prekrývanie jablka s ježkom a y-ovú súradnicu padaného jablka.
V prípade, že jablko spadlo na ježka, objaví sa v pravej časti obrazovky.
Ak je pod úrovňou na ktorej chodí ježko, zmizne. V inom prípade pokračuje
vo svojom padaní.
viem jablko.padaj
ak nie.je prazdne? prekryvajuce ~
[ak prvy prekryvajuce = 0 ~
[zmen.xy 150 + nahodne 30
-150 + nahodne 30 oslov 0 ukonci]]
ak y.sur < -170 [skry oslov 0 ukonci]
do 5
jablko.padaj
koniec
Týmto je ľahší variant vyriešený.
Pre riešenie ťažšieho variantu najprv
vytvoríme brloh s pripravenými miestami na jablká. V Obrázkovom editore
navrhneme sivé jablko - premenná "sive.jablko.
V príkaze vytvor.brloh
najprv vytvoríme ďalšiu korytnačku navrhnutého tvaru. Táto korytnačka pomocou
otláčania svojho tvaru pripraví v brlohu toľko sivých jabĺk koľko ich je
na strome – premenná "p.jablk.
viem vytvor.brloh
urob.kor 11 [25 -150 90 ph skry :sive.jablko]
oslov 11
opakuj :p.jablk [zmen.xy x.sur + 25 -150 otlac]
zrus.kor 11
koniec
Volanie príkazu vytvor.brloh
doplníme do príkazu start.
Kvôli tomu, aby mohol byť v nasledujúcej hre iný počet jabĺk, musíme Plochu
so stromom v príkaze načítavať. Okrem toho musíme ukrývať všetky korytnačky,
aby príkaz daj.jablka
ukázal len počet jabĺk v tejto hre (to bolo potrebné robiť aj v jednoduchšom
variante). Okrem toho je potrebné pred začatím zbierania jabĺk osloviť
iba ježka – korytnačka 0.
viem start
pre vsetky [skry] oslov 0 ukaz
citaj.p "strom.bmp
daj.jablka
vytvor.brloh
oslov 0
urob "p.pozbieranych 0
zbieraj.jablka
koniec
|
|
Teraz už iba zmeníme časť príkazu jablko.padaj.
Namiesto náhodného umiestnenia jablka, vytvoríme ďalší príkaz – k.brlohu.
V ňomsa sa ježko a jabloko otočia do smeru k pravej časti obrazovky, prejdú
k brlohu – príkaz chod.k.brlohu.
Po uložení jablka na prvé voľné miesto sa ježko otočí a vráti pod strom
– príkaz pod.strom.
viem k.brlohu
pre 0 [zmen.smer 90]
zmen.smer 90
chod.k.brlohu
oslov 0
zmen.smer 270
pod.strom
koniec
Príkaz chod.k.brlohu
je opäť rekurzívny. Kontroluje sa x-ová súradnica práve oslovenej korytnačky
– jablka. Ak je už pri brlohu, jablko sa umiestni – podľa toho, kde sme
v príkaze vytvor.brloh
začali prípravu miest pre jablká. Ak sú od brlohu ešte ďaleko, posúvajú
sa ježko s jablkom bližšie k brlohu. Aby sme vedeli, ktoré je prvé voľné
miesto, budeme počítať počet jabĺk v brlohu – vytvorme a inicializujem
premennú "p.v.brlohu
v starte,
jej zvyšovanie doplníme do príkazu k.brlohu,
ale až za samotné volanie príkazu chod.k.brlohu
(urob "p.v.brlohu :p.v.brlohu+1).
viem chod.k.brlohu
ak x.sur > 40 [zmen.xy 50 + :p.v.brlohu * 25
-150 zmen.smer 180 ukonci]
pre 0 [do 3]
do 3
chod.k.brlohu
koniec
Posledný príkaz pod.strom
presunie ježka na miesto pod stromom – pre náš strom je vhodná napr. x-ová
súradnica menšia ako 10.
viem pod.strom
ak x.sur < 10 [ukonci]
do 3
pod.strom
koniec
Takto sme vyriešili aj ťažší variant úlohy.