Autorské riešenie
[stiahni]

  • Počet riešiteľov: 8 / 8 = 100 %

  • Úspešnosť riešenia: 4,63 / 8 = 58 %

Našou úlohou je naprogramovať procedúru spracujTah, ktorá zistí, či niektorý z hráčov vyhral v hre piškvorky. Procedúra dostane súradnice miesta, kam klikol jeden z hráčov a vyfarbil políčko svojou farbou. Vieme teda, kde bol umiestnený posledný ťah (súradnice) a kto ho umiestnil (farba bodu na týchto súradniciach).

Ak chceme zistiť, či nejaký hráč vyhral, stačí nám otestovať, či tento ťah vytvoril niekde postupnosť piatich rovnako farebných štvorčekov za sebou. Nemusíme overiť všetky políčka hracieho plánu. Stačí otestovať vhodné okolie posledného ťahu. Nikde inde už rad piatich rovnako farebných štvorčekov nemôže byť. Ak by tam bol, našli by sme ho už predtým a to v čase, keď hráč tento rad vytvoril. Nasledujúci obrázok demonštruje, kde všade mohol vzniknúť rad piatich rovnako farebných štvorčekov, ak posledný ťah je vyznačený čiernym orámovaním. 

piskvorky

Všimnime si, že štvorčeky v navzájom opačných smeroch mohli spoločne vytvoriť výherný rad. Má teda zmysel testovať navzájom opačné smery spoločne, či v súčte nevytvoria súvislý rad piatich rovnako farebných štvorčekov. Určite ste prišli na to, že stačí spočítať koľko štvorčekov súvisle za sebou má rovnakú farbu ako farba posledného ťahu. A to pre obidva, navzájom opačné smery

Zistiť počet rovnako farebných štvorčekov za sebou pre každý z ôsmych smerov je takmer identická úloha. Mohli by sme si preto vytvoriť procedúru, ktorej zadáme len štartovaciu pozíciu a smer, ktorým má rovnako farebné štvorčeky spočítať. Ostáva otázka, ako zadať smer. Výhodné je zvoliť takú reprezentáciu smeru, ktorú môžeme priamo využiť pri pohybe v hracom pláne. Napr. ako zmenu pozície štvorčekov v danom smere. Zmenu pozície zadávame zmenou pozície x-ovej a y-ovej súradnice štvorčeka.

piskvorky

Procedúra spracujTah môže vyzerať nasledovne:

viem spracujTah :poz
  ak (pocetRovnakych :poz [1 1]) + (pocetRovnakych :poz [-1 -1]) >= 4 [
    nechPoz :poz vysledok farbaBodu
  ]
  ak (pocetRovnakych :poz [1 -1]) + (pocetRovnakych :poz [-1 1]) >= 4 [
    nechPoz :poz vysledok farbaBodu
  ]
  ak (pocetRovnakych :poz [1 0]) + (pocetRovnakych :poz [-1 0]) >= 4 [
    nechPoz :poz vysledok farbaBodu
  ]
  ak (pocetRovnakych :poz [0 1]) + (pocetRovnakych :poz [0 -1]) >= 4 [
    nechPoz :poz vysledok farbaBodu
  ]
  vysledok "
koniec

Postupne zisťujeme, aký dlhý súvislý rad rovnako farebných štvorčekov vznikol v každej dvojici navzájom opačných smerov. Procedúra pocetRovnakych zistí, koľko susedných štvorčekov v zadanom smere má rovnakú farbu ako štvorček na zadanej pozícii. Ak súčet z obidvoch smerov je aspoň 4, vieme, že sme našli víťazný ťah. Spolu so štartovacím políčkom sme dostali súvislý rad aspoň piatich rovnako farebných štvorčekov. Vieme dokonca aj to, ktorá farba vyhrala - farba štartovacieho políčka.

Ostáva ešte naprogramovať procedúru pocetRovnakych.

viem pocetRovnakych :poz :smer
  nechPoz :poz
  urobTu "pocet 0
  urobTu "farbaTahu farbaBodu
  nechPoz poz + :dlzka * :smer

  kym [:farbaTahu = farbaBodu][
    zvys "pocet
    nechPoz poz + :dlzka * :smer
  ]

  vysledok :pocet
koniec

V procedúre pocetRovnakych spočítame, koľko štvorčekov v súvislom rade má rovnakú farbu ako štvorček na štartovacej pozícii. Pozíciu susedných štvorčekov určuje zadaný smer. Ten nás však posunie len o +- jeden pixel. Štvorčeky na hracom pláne sú väčšie. Ich rozmer je uložený v premennej "dlzka. Budeme sa preto posúvať o násobky "dlzka  v zadanom smere. Do susedného políčka sa z aktuálne pozície presunieme zmenou súradnice na poz + :dlzka * :smer. Všimnime si, ako sme využili schopnosť Imaginu pracovať so zoznamamy. Súradnice nemusíme spracovávať po zložkách (x-ovú a y-ovú súradnicu zvlášť) ale možeme pracovať naraz s celým zoznamom. Zároveň si všimnime, že štvorčeky testujeme len dovtedy, kým majú rovnakú farbu ako štvorček na štartovacej pozícii.

Pozornejší z vás si isto všimli, že pri zisťovaní dĺžky súvislého radu (v procedúre pocetRovnakych) sa nezaoberáme tým, či sme náhodou nevyšli z hracieho poľa. Ak by sa tak aj stalo, cyklus kym skončí, pretože farba mimo hracej plochy je biela, teda určite iná ako farba políčka posledného ťahu.

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

Najčastejšou chybou bolo, že ste zabudli na prípad, ak práve spravený ťah spojil dva existujúce rady štvorčekov rovnakej farby. Zbytočne ste testovali celú hraciu plochu, stačilo otestovať len okolie posledného ťahu.

K autorskému riešenie sa najviac priblížil tím Bavolár.