Autorské riešenie
[stiahni]

Táto úloha nie je veľmi náročná. To, na čo si treba dať pozor je, aké podmienky budeme testovať.  Zaujímať nás bude, či sme myškou klikli na smajlíka, činnosť smajlíka a počet jeho zabávajúcich sa susedov. Z týchto informácii vieme zistiť, ako sa bude smajlík správať nasledujúci deň. Zároveň by sme mali porozmýšľať aj o tom, ako sa pýtať, aby niektoré naše otázky alebo kroky neboli zbytočné.

Prvá otázka by mala byť, či sme klikli na smajlíka. Ak sme klikli mimo, nebude sa diať nič. Stači zistiť, či farba na ktorej sa korytnačka nachádza je "modrá alebo "červená.

ak2 farbaBodu = "modra [
 
][
 ak farbaBodu = "cervena [
 ]
]

Všimnime si, že ak farba bodu nie je "modra, tak to ešte neznamená, že je "cervena. Kliknúť sme mohli aj mimo smajlíka.

Ďalej potrebujeme zistiť, koľko susedných smajlíkov okolo vybratého sa zabáva. Podľa toho budeme vedieť, čo bude robiť smajlík nasledujúci deň. Počet zabávajúcich sa smajlíkov okolo zistíme tak, že spočítame, koľko susedov je červených.

urobTu "pocetZabavajucichOkolo 0
opakuj 6 [
 do 30 ak farbaBodu = "cervena [zvys "pocetZabavajucichOkolo] vz 30
 vp 60
]

Tento postup bude fungovať správne aj v prípade, že sme klikli na krajného smajlíka (plochy okolo neho nebudú farby "cervena).

Teraz už len stačí prepísať podmienky zo zadania úlohy. Celá procedúra môže vyzerať aj takto:

viem dalsiDen
 urobTu "pocetZabavajucichOkolo 0
 opakuj 6 [
  do 30 ak farbaBodu = "cervena [zvys "pocetZabavajucichOkolo] vz 30
  vp 60
 ]

 ak2 farbaBodu = "modra [
  ak2 :pocetZabavajucichOkolo = 2 [
   pis "|bude sa zabavat|
  ][
   pis "|nebude sa zabavat|
  ]
 ][
  ak farbaBodu = "cervena [
   ak2 :pocetZabavajucichOkolo < 2 [
    pis "|nebude sa zabavat|
   ][
    ak2 :pocetZabavajucichOkolo > 3 [
     pis "|nebude sa zabavat|
    ][
     pis "|bude sa zabavat|
    ]
   ]
  ]
 ]
koniec

Tí pozornejší z vás si určite všimli, že počet zabávajúcich susedov počítame niekedy zbytočne (v prípade, ak neklikneme na smajlíka). Počet zabávajúcich sa susedov by sme mali počítať len vtedy, ak sme klikli na nejakého smajlíka (farba bodu je "cervena alebo "modra). Ak by sme príslušný kód skopírovali na príslušné miesta, mali by sme dve kópie rovnakého kódu. Výhodnejšie preto bude vytvoriť si procedúru, ktorá vypočíta počet zabávajúcich sa susedov. Po tejto úprave bude vyzerať celá procedúra nasledovne (kód sme sprehľadili aj použitím pikazu akJe namiesto niekoľkých príkazov ak):

viem dalsiDen
 akJe farbaBodu [
  modra [
   urobTu "pocetZabavajucichOkolo vratPocetZabavajucichOkolo
   ak2 :pocetZabavajucichOkolo = 2 [
    pis "|bude sa zabavat|
   ][
    pis "|nebude sa zabavat|
   ]
  ]
  cervena [
   urobTu "pocetZabavajucichOkolo vratPocetZabavajucichOkolo
   akJe :pocetZabavajucichOkolo [
    0 1 [pis "|nebude sa zabavat|]
    2 3 [pis "|bude sa zabavat|]
        [pis "|nebude sa zabavat|]
   ]
  ]
 ]
koniec

Samotná procedúra vratPocetZabavajucichOkolo obsahuje pôvodný kód pre výpočet počtu zabávajúcich sa susedov okolo.

viem vratPocetZabavajucichOkolo
 urobTu "pom 0
 opakuj 6 [
  do 30 ak farbaBodu = "cervena [zvys "pom] vz 30
  vp 60
 ]
 vysledok :pom
koniec

Vaše zaujímavé riešenia a najčastejšie chyby

Najčastejšie nedostatky, ktorých ste sa dopustili vo svojich riešeniach a naše odporúčania:

  • vyhodnocovanie vašich podmienok bolo často neefektívne, podmienky ste písali nezávisle (viacero AK pod sebou), výhodnejšie je podmienky vnárať do seba (viď. autorské riešenie),
  • niektorí z vás zabudli na prípad, ak spiaci smajlík ostáva spiacim aj nasledujúci deň,
  • počet spiacich smajlíkov kolo vybratého nie je potrebné vôbec zisťovať, stačí zistiť počet zabávajúcich sa smajlíkov.