Karel and the Beepers

Ciele

  1. Vytvárať funkcie, ktoré vracajú hodnoty.

Úvod

Na tomto cvičení bude vašou úlohou implementovať podporu značiek. Karel bude obsahovať batoh, do ktorého ich môže vkladať a na každej pozícii sveta bude možné umiestniť 0 a viac značiek. Okrem toho Karla vybavíme vhodnými senzormi, ktoré bude vedieť použiť na prácu so značkami.

Postup

Krok č. 1

V prvom kroku vytvoríte pre robota Karla batoh, v ktorom bude značky nosiť. Vytvoríte taktiež senzory beepersInBag() a noBeepersInBag(), pomocou ktorých bude Karel vedieť, či u seba nejakú značku má alebo nie.

Úloha 1.1:

Vytvorte premennú karel_beepers, ktorá bude reprezentovať počet značiek, ktoré Karel nesie.

Úloha 1.2:

Vytvorte senzor beepersInBag(), ktorý vráti hodnotu 1 (true), ak má Karel aspoň jednu značku v batohu. V opačnom prípade vráti hodnotu 0 (false).

Úloha 1.3:

Vytvorte senzor noBeepersInBag(), ktorý bude opakom senzora beepersInBag().

Úloha 1.4:

Aktualizujte stavový riadok doplnením o informáciu, koľko značiek sa nachádza v karlovom batohu.
Statový riadok môže po úprave vyzerať napr. takto:
CORNER   FACING  BEEP-BAG
(0, 0)    North     10
alebo takto:
POSITION = [1,2] - East  BEEP-BAG = 10

Úloha 1.5:

Overte správnosť svojho riešenia inicializovaním premennej karel_beepers a následným overením karlových senzorov beepersInBag() a noBeepersInBag().

Krok č. 2

V tomto kroku implementujete senzory beepersPresent() a noBeepersPresent(), pomocou ktorých bude Karel vedieť, či sa nachádza na rohu so značkami alebo nie. Taktiež aktualizujete funkciu draw(), v ktorej upravíte výpis stavového riadku a vykreslenie sveta.

Úloha 2.1:

Vytvorte senzor beepersPresent(), ktorý vráti hodnotu 1 (true), ak sa na aktuálnej pozícii robota Karla nachádza aspoň jedna značka. V opačnom prípade vráti hodnotu 0 (false).
Počet značiek, ktoré sa budú nachádzať na mape, bude realizovaný kladnou hodnotou v dvojrozmernom poli reprezentujúcom mapu. To znamená, že ak bude hodnota na danej pozícii 8, počet značiek na danej pozícii bude tiež 8.

Úloha 2.2:

Vytvorte senzor noBeepersPresent(), ktorý bude opakom senzora beepersPresent().

Úloha 2.3:

Aktualizujte stavový riadok doplnením o informáciu, koľko značiek sa nachádza na aktuálnej pozícii robota Karla.
Statový riadok môže po úprave vyzerať napr. takto:
CORNER   FACING  BEEP-BAG  BEEP-CORNER
(0, 4)    North     10        0
alebo takto:
POSITION = [1,2]:0 - East  BEEP-BAG = 10

Úloha 2.4:

Aktualizujte funkciu turnOn() tak, aby pri načítavaní mapy sveta vedela správne rozpoznať aj rozmiestnenie značiek v ňom.

Úloha 2.5:

Aktualizujte funkciu draw() tak, aby ste do mapy sveta vniesli informáciu o značkách, ktoré sa v ňom môžu nachádzať.
Keďže svet bude v tejto implementácii dosť "úzky", nie je potrebné zobrazovať počet značiek na konkrétnej pozícii. Pokiaľ si ho ale vhodne rozšírite (zväčšením vzdialeností medzi susednými pozíciami), môžete. Stačí však, ak miesto, na ktorom sa značka nachádza, zvýrazníte špeciálnym znakom (v našom prípade budeme používať značku hviezdička, '*').

Úloha 2.6:

Overte správnosť svojho riešenia napísaním funkcie walk(), pomocou ktorej robot Karel prejde postupne celý svet.
Pre overenie karlovej prechádzky môžete použiť nasledujúci svet:
                char* fullOfStars = "******|******|******|******|>*****";
            
alebo verziu sveta s podporou Run length encoding:
                char* fullOfStars = "6*|6*|6*|6*|>5*";
            
Počiatočná situácia:
CORNER  FACING BEEP-BAG BEEP-CORNER
(0, 0)   East      0        0

******
******
******
******
>*****
                    
Koncová situácia:
CORNER  FACING BEEP-BAG BEEP-CORNER
(5, 4)   North     0        1

*****^
******
******
******
.*****
                    
Poznámka:  Ako ste si všimli, svet nemusí mať na všetkých krajných pozíciách stenu. Tomu je potrebné prispôsobiť aj funkcie pre senzory. Ak vaše riešenie zatiaľ podobné situácie neuvažuje, vráťte sa k Úlohe 3.1 z predošlého cvičenia.

Krok č. 3

V tomto kroku vytvoríte dve funkcie, ktoré budú reprezentovať dva karlove príkazy: funkcia putBeeper(), pomocou ktorej Karel položí z batohu značku na aktuálnu pozíciu; a funkcia pickBeeper(), pomocou ktorej Karel vezme z aktuálnej pozície značku a vloží si ju do batohu.

Úloha 3.1:

Vytvorte funkciu putBeeper(), pomocou ktorej Karel položí z batohu značku na aktuálnu pozíciu.
Pri implementácii ošetrite prípad, keď Karel v batohu nemá žiadnu značku. Vtedy ukončite program s vypísaním vhodnej chybovej správy.

Úloha 3.2:

Vytvorte funkciu pickBeeper(), pomocou ktorej Karel vezme značku z aktuálnej pozície a vloží si ju do batohu.
Pri implementácii ošetrite prípad, keď sa na aktuálnej karlovej pozícii nenachádza žiadna značka. Vtedy ukončite program s vypísaním vhodnej chybovej správy.
Poznámka:  Pri volaní oboch funkcií nezabudnite aktualizovať stavový riadok zavolaním funkcie draw()!

Úloha 3.3:

Overte správnosť svojho riešenia napísaním funkcie harvestAll(), pomocou ktorej robot Karel prejde postupne celý svet a pozbiera v ňom všetky značky. Po pozbieraní Karel všetky pozbierané značky položí a vráti sa do východzej pozície.
Pre riešenie úlohy môžete použiť predchádzajúcu mapu (fullOfStars).
Počiatočná situácia:
Koncová situácia:

Doplňujúce úlohy

  1. Vytvorte funkciu transformation(), ktorá prevedie formát sveta pre robota Karla, ktorý bol používaný v knižnici karel v prvých cvičeniach, na formát, ktorý je používaný teraz. Funkcia nebude mať žiadny parameter, ale bude vracať reťazec znakov (char*), ktorý bude reprezentovať výslednú prevedenú mapu.

    V prípade načítavania značiek kvôli novému formátu stačí rozpoznať, či sa na danej pozícii značka nachádza alebo nie. Ak sa teda v pôvodnej mape bude nachádzať na pozícii 10 značiek, do novej mapy túto informáciu prevediete len s hodnotou 1.

    Načítanie sveta vo formáte použitom v knižnici karel vykonajte ručne. To znamená, že svet budete načítavať priamo zo vstupu postupným zadávaním jednotlivých hodnôt.

    Poznámka:  V operačnom systéme Linux môžete miesto ručného zadávania hodnôt s výhodou použiť presmerovanie vstupu, napr.:
                        $ ./a.out < empty.kw
                    
    Funkciu volajte z funkcie turnOn() vtedy, ak parameter funkcie turnOn() bude obsahovať hodnotu NULL. Príklad vstupu:
    5 4 1 1 E 10
    B 2 3 10
    W 3 3
    
    Vysvetlenie: Svet má rozmer 5x4, Karel sa na začiatku nachádza na pozícii [1,1], je otočený na východ, má v batohu 10 značiek, na pozícii [2,3] sa nachádza 10 značiek a na pozícii [3,3] je stena.
  2. Pridajte do Vášho riešenia komentáre a vygenerujte k nemu dokumentáciu vo formáte html prostredníctvom nástroja Doxygen.
    Poznámka:  Základné informácie k nástroju Doxygen nájdete na jeho webovej stránke, v pokynoch k vypracovaniu zadania č. 1 a v referenčnej príručke na stránkach predmetu Programovanie.
$Id$