Karel and his Sensors

Ciele

  1. Precvičiť si vetvenie toku programu na základe podmienok v programovacom jazyku C.
  2. Naučiť sa používať logické cykly v programovacom jazyku C.
  3. Osvojiť si príkazy break a continue pre riadenie behu cyklov.

Úvod

Na tomto cvičení si opäť precvičíte rozhodovanie v Karlových programoch na základe senzorov, ktoré obsahuje. Úlohou tohto cvičenia je naučiť sa vytvárať jednoduché cykly a s ich pomocou efektívne vyriešiť problém.

Postup

Krok č. 1

V prvom kroku vytvoríte niekoľko jednoduchých funkcií, ktoré môžete neskôr využiť v niektorých úlohách.

Úloha 1.1:

Vytvorte funkciu turnRight(), po vykonaní ktorej bude robot Karel otočený vpravo vzhľadom na jeho východziu pozíciu. Pri tvorbe funkcie použite niektorý z cyklov.

Úloha 1.2:

Vytvorte funkciu turnToNorth(), po vykonaní ktorej bude robot Karel otočený na sever.

Úloha 1.3:

Vytvorte funkciu pickAllBeepers(), po vykonaní ktorej robot Karel vezme všetky značky z aktuálnej pozície a vloží si ich do batohu.

Úloha 1.4:

Vytvorte funkciu plantBeepers(). Po jej zavolaní začne Karel "sadiť" značky postupne pred seba krok za krokom, pričom jednu značku zasadí v každom kroku. Ak cestou vpred Karel nájde na pozícii inú značku alebo sa dopredu už nebude môcť pohnúť, funkcia sa ukončí.

Úloha 1.5:

Vytvorte funkciu findExitOnLeft(). Po jej zavolaní sa Karel rozbehne vpred a zastaví sa vtedy, keď sa už nebude môcť pohnúť vpred. V prípade, ak sa po Karlovej ľavej ruke nachádza voľná pozícia, otočí sa vľavo a zastaví sa.

Krok č. 2

V tomto kroku pomôžete robotovi Karlovi premeniť prázdny svet na šachovnicu.

Úloha 2.1:

Vytvorte pre robota Karla program, pomocou ktorého premení aktuálny prázdny svet na šachovnicu. O svete je možné povedať, že má vždy párny počet políčok. Pre otestovanie tejto úlohy si môžete stiahnuť súbory svetov empty4.kw a empty5.kw.
Počiatočná situácia:
Koncová situácia:

Úloha 2.2:

Upravte svoje riešenie tak, aby Karel vedel šachovnicu spraviť aj v prípade, že sa na začiatku bude nachádzať na ľubovoľnej pozícii.

Krok č. 3

Karlove prípravy na RobOlympiádu vrcholia. V tomto kroku pomôžete Karlovi dotiahnuť prípravy a naučiť ho zdolať v rámci prekážkového behu prekážky ľubovoľne od seba vzdialené aj ľubovoľne vysoké prekážky. Na začiatku každého behu sa Karel vždy bude nachádzať na pozícii [1,1]. Karlov beh sa opäť zastaví vtedy, keď vo svojom behu nájde značku.

Úloha 3.1:

Otvorte si riešenie doplňujúcej úlohy č. 1 z minulého cvičenia alebo si ho prevezmite a otvorte súbor olympics1.c.

Úloha 3.2:

Upravte program tak, aby Karel zvládol prebehnúť ľubovoľný počet prekážok, ktoré môžu byť od seba ľubovoľne vzdialené. Karel svoj beh zastaví vtedy, keď vo svojej trati natrafí na značku, pričom značka sa bude v Karlovej ceste vždy nachádzať. Svoje riešenie tejto úlohy si môžete otestovať na prekážkovej dráhe olympics1.kw a olympics2.kw.

Úloha 3.3:

Upravte program tak, aby Karel zvládol prebehnúť ľubovoľne vysoké prekážky. Karel svoj beh zastaví vtedy, keď vo svojej trati natrafí na značku, pričom značka sa bude v Karlovej ceste vždy nachádzať.
Svoje riešenie tejto úlohy si môžete otestovať na nasledujúcich mapách, ktoré predstavujú predkolá veľkého finále RobOlympiády: olympics3.kw, olympics4.kw.
Počiatočná situácia:
Koncová situácia:

Úloha 3.4:

Upravte program tak, aby robot Karel vedel preskočiť aj ľubovoľne široké prekážky. Karel svoj beh zastaví vtedy, keď vo svojej trati natrafí na značku, pričom značka sa bude v Karlovej ceste vždy nachádzať.
Svoje riešenie tejto úlohy si môžete otestovať na nasledujúcich mapách, ktoré predstavujú posledné kolá veľkého finále RobOlympiády: olympics5.kw, olympics6.kw.
Počiatočná situácia:
Koncová situácia:

Doplňujúce úlohy

  1. Upravte predchádzajúce dva programy tak, aby robot Karel smeroval z východu na západ.
    Poznámka:  Pre otestovanie týchto programov je potrebné modifikovať súbory svetov.
  2. Otvorte si riešenie kroku č. 2 z minulého cvičenia alebo si ho prevezmite a otvorte súbor road1.c. Upravte program tak, aby Karel vedel vyplniť vždy všetky diery nezávisle na ich množstve až do konca cesty. Pôvodná cesta, ktorú mal Karel vyplniť, sa nachádza v súbore road.kw. Ďalšie súbory svetov: road2.kw, road3.kw, road4.kw, road5.kw a road6.kw.
    Počiatočná situácia:
    Koncová situácia:
  3. Vytvorte program pre robota Karla, pomocou ktorého Karel zozbiera všetky značky, ktoré sa v ňom nachádzajú. Karel ich všetky umiestni v juhovýchodnom rohu miestnosti a sám sa nakoniec presunie na juhozápadnú pozíciu. Pre otestovanie tejto úlohy si môžete stiahnuť súbory svetov collector1.kw a collector2.kw.
    Počiatočná situácia:
    Koncová situácia:
  4. Vytvorte program pre robota Karla, pomocou ktorého Karel prejde bludiskom. Koniec bludiska je označený značkou, pričom v bludisku je vždy iba jedna značka. Pre otestovanie tejto úlohy si môžete stiahnuť súbory svetov maze1.kw, maze2.kw a maze3.kw.
    Počiatočná situácia:
    Koncová situácia:
  5. Robot Karel sa vydal hľadať poklad, pričom potrebuje sledovať špirálu smerom dovnútra, až kým nenájde poklad. Keď poklad nájde (značku), dá si ho do batohu. Karel vždy začína na pozícii [1,1] a nevie, aké dlhé sú steny. Riešenie tejto úlohy si môžete overiť na mape treasurehunt.kw.
    Počiatočná situácia:
    Koncová situácia:
    Poznámka:  Použite iné riešenie ako v predošlej úlohe (bludisko).
  6. Karel bol najatý, aby pomohol opraviť škody spôsobené za tie roky na Košickom hrade. Karel má teda opraviť sadu kamenných pilierov (samozrejme reprezentovaných značkami), v ktorých niektoré kamene chýbajú. Po skončení opráv budú všetky chýbajúce diery v stĺpoch opäť zaplnené. Riešenie tejto úlohy si môžete overiť na mapách stonemason1.kw a stonemason2.kw.
    Počiatočná situácia:
    Koncová situácia:

    Karel sa pri riešení tejto úlohy môže spoliehať na nasledujúce podmienky:

    • Karel začína na pozícii [1,1] a má v batohu dostatočné množstvo značiek.
    • Stĺpy sú od seba vzdialené vždy 4 stĺpce, teda stĺpy sa postupne nachádzajú na 1, 5, 9 a na nasledujúcich Streets vo svete.
    • Za všetkými stĺpmi sa na konci okamžite nachádza stena (v tomto príklade sa jedná o stĺpec č. 13).
    • Na vrchu stĺpu je hneď stena, ale nemôžete si byť istí, že stĺpy sú rovnako vysoké.
    • Niektoré stĺpy môžu obsahovať pôvodné kamene. Ak je to tak, váš program nesmie položiť značku na miesto, na ktorom sa už iná značka nachádza.
  7. Vytvorte program, v ktorom bude robot Karel neustále prechádzať medzi dvoma protiľahlými stenami, pričom nezáleží na veľkosti sveta ani na polohe a orientácii robota. Úlohu riešte prostredníctvom nekonečného cyklu. Riešenie si môžete overiť na mapách walls1.kw a walls2.kw.
    Poznámka:  Je bežné, že občas program uviazne. Pre ukončenie bežiaceho procesu v operačnom systéme Linux zvoľte CTRL+C.
  8. Vytvorte pre robota Karla program, pomocou ktorého bude vedieť nájsť stred sveta, v ktorom sa nachádza. Karel sa na začiatku môže nachádzať na ľubovoľnej pozícii a môže byť taktiež otočený ľubovoľným smerom. Vo svete sa nenachádzajú žiadne steny ani žiadne značky a počet ulíc, ako aj počet avenues je nepárny. Riešenie úlohy si môžete overiť na mapách middleearth1.kw a middleearth2.kw.
    Počiatočná situácia:
    Koncová situácia:
    Poznámka:  Podstatou tejto úlohy je precvičiť si algoritmické myslenie. Daný problém by ste preto nemali riešiť pomocou premenných (ak premenné už poznáte).
$Id$