The World of Karel the Robot Implementation

Ciele

  1. Osvojiť si prácu s jednorozmernými a dvojrozmernými poliami.
  2. Tvorba vlastných makier.
  3. Práca s príkazom switch.

Úvod

Na tomto cvičení začnete implementovať svoje vlastné zadanie. Cieľom tohto cvičenia je vytvoriť reprezentáciu sveta, v ktorom sa bude môcť robot Karel pohybovať. Hlavnou úlohou je teda vytvoriť funkciu draw(), pomocou ktorej vykreslíte karlov svet na obrazovku a primitívu robota Karla turnOn() na načítanie sveta robota Karla. Karlov svet bude vnútorne reprezentovaný dvojrozmerným poľom.

Postup

Krok č. 1

V prvom kroku si stiahnete kostru vášho budúceho projektu, na ktorom budete postupne počas cvičení pracovať a ďalej rozvíjať. Vytvoríte v ňom taktiež potrebné makrá a premenné, ktoré budú použité pre reprezentáciu karlovho sveta.

Úloha 1.1:

Stiahnite si projekt s názvom The Project a otvorte ho vo svojom vývojovom prostredí.
V projekte sa budú po stiahnutí nachádzať tieto súbory a priečinky:
  • súbor main.c, v ktorom sa aktuálne nachádza hlavná funkcia main(),
  • priečinok lib, ktorý obsahuje knižnicu curses pre operačný systém Windows, a
  • priečinok include, ktorý obsahuje hlavičkové súbory knižnice curses pre operačný systém Windows.
Poznámka:  Pri otváraní projektu však pozor! Podľa obrázku nižšie si vyberte vhodnú konfiguráciu pre vašu platformu alebo ak v zozname konfigurácií vaša platforma uvedená nie je, vytvorte si ju. Ak zasa predvolená konfigurácia vo vašom prípade nefunguje správne, opravte si ju podľa svojich nastavení.

Úloha 1.2:

Vytvorte makrá MAX_HEIGHT a MAX_WIDTH a obe nastavte na hodnotu 30.
Tieto makrá budú reprezentovať maximálnu šírku a maximálnu výšku sveta.
Poznámka:  V programovaní predstavuje menná konvencia súbor pravidiel pre pomenovávanie identifikátorov premenných, funkcií a pod. V rámci mennej konvencie sa pre pomenovávanie makier používajú výlučne LEN VEĽKÉ PÍSMENÁ.

Úloha 1.3:

Definujte dve celočíselné premenné world_width a world_height, ktoré budú obsahovať informáciu o aktuálnej šírke a výške sveta.

Úloha 1.4:

Vytvorte definíciu dvojrozmerného poľa s názvom world, ktorého šírku a výšku nastavte na hodnotu makier MAX_WIDTH a MAX_HEIGHT.
Obsahom poľa budú celočíselné hodnoty, ktoré budú reprezentovať jednotlivé prvky nachádzajúce sa vo svete robota Karla.

Úloha 1.5:

Vytvorte makrá EMPTY a WALL, ktoré budú reprezentovať prvky sveta.
Hodnotu makra EMPTY nastavte na 0 a hodnotu makra WALL nastavte na -1.

Krok č. 2

Hlavnou úlohou tohto kroku bude vytvoriť funkcie turnOn() a draw(). Funkcia turnOn() bude slúžiť na zapnutie robota Karla a na načítanie sveta, v ktorom Karel bude vykonávať svoj program. Funkcia draw() vykreslí na obrazovku svet, ktorého reprezentácia je uložená v premennej world.

Úloha 2.1:

Vytvorte prázdnu definíciu funkcie turnOn(), ktorá bude inicializovať svet robota Karla.
Funkcia turnOn() nebude mať zatiaľ žiadne parametre a taktiež nebude vracať žiadnu hodnotu.

Úloha 2.2:

Vo funkcii turnOn() prekopírujte svet z reťazca (resp. jednorozmerného poľa) uloženého v premennej map do premennej world.

Reťazec map bude obsahovať údaje o svete, v ktorom sa robot Karel bude nachádzať. V budúcnosti bude nahradený načítaním aktuálneho sveta zo súboru, ktorý však bude uložený v rovnakom formáte, aký je použitý v tomto reťazci.

Obsah premennej map je teda nasledovný:

                        char* map = "#######|#-^-#-#|#**-*-#|#---*-#|#-----#|#--*--#|#######";
                    
pričom význam jednotlivých položiek mapy je nasledovný:
  • znak '#' reprezentuje stenu,
  • znak '-' reprezentuje prázdne miesto,
  • znak '*' reprezentuje značku,
  • znaky '>', '<', 'v' a '^' reprezentujú aktuálnu pozíciu a smer robota Karla na mape, a
  • znak '|' reprezentuje koniec riadku.
Pri načítavaní ignorujte znaky reprezentujúce značky a pozíciu robota Karla a nahraďte ich prázdnym miestom (ako keby vo svete neboli). Ich podporu budete implementovať v priebehu ďalších cvičení.
Poznámka:  Nezabudnite zistiť hodnoty výšky a šírky sveta, a automaticky tak nastaviť hodnoty premenných world_width a world_height.

Úloha 2.3:

Vytvorte funkciu draw(), ktorá vykreslí na obrazovku svet nachádzajúci sa v premennej world.
Funkcia nemá žiadny parameter a nevracia žiadnu hodnotu. Pri vykreslovaní sa riaďte nasledovne:
  • ak v poli načítate hodnotu EMPTY, vypíšte na obrazovku medzeru (znak ' ') alebo (pre lepšiu orientáciu v mape) bodku (znak '.'),
  • ak v poli načítate hodnotu WALL, vypíšte na obrazovku mriežku (znak '#').

Úloha 2.4:

Overte si správnosť svojho riešenia zavolaním oboch vytvorených funkcií priamo z funkcie main().
Poradie volania oboch funkcií je nasledovné:
                        turnOn();
                        draw();
                    
V prípade úspechu sa na obrazovke vykreslí nasledujúci svet:
#######
#   # #
#     #
#     #
#     #
#     #
#######
                    

Doplňujúce úlohy

  1. Implementujte podporu Run length encoding pre načítavanie sveta z premennej map vo funkcii turnOn(). Predpokladajte, že číslo udávajúce počet výskytov ďalšieho znaku je jednomiestne.

    Vašu implementáciu si môžete overiť na nasledujúcom upravenom svete:

                    char* map = "7#|#.^-#-#|#2*-*-#|#3-*-#|#5-#|#2-*2-#|7#";
                
    Poznámka:  Pre rozlíšenie znaku a určenie, či sa jedná o znak alebo číslicu, môžete použiť buď knižnicu ctype.h alebo vykonať jednoduchú konverziu na základe hodnoty znaku v ASCII tabuľke.
  2. Upravte riešenie predchádzajúcej úlohy tak, aby bolo možné rozpoznať aj viacmiestne čísla reprezentujúce opakovanie nasledujúceho znaku.
  3. 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$