10. týždeň

IQ Marathon, Part I.

Polia, reťazce, súbory, parametre funkcií

O čom je lab

V rámci tohto cvičenia naprogramujete ďalšiu hru - zjednodušenú verziu hry IQ Marathon.

Ciele

  1. Osvojiť si prácu so súbormi.
  2. Rutinne pracovať s parametrami funkcií.
  3. Rutinne pracovať s reťazcami.
  4. Rutinne pracovať s viacrozmernými poliami.
  5. Osvojiť si prácu s ternárnym operátorom.

Postup

Krok 1: Part I.

IQ Marathon je jednoduchá hra, v ktorej sa nachádza krava. Vždy sa pohybuje smerom, ktorým je natočená, až kým nenarazí na prekážku. Úlohou hráča je umiestniť do hry šípky tak, aby sa krava dostala do cieľovej pozície. V tomto kroku začnete programovať jednoduchšiu verziu tejto hry.

Hra IQ Marathon
Obr. 1: Hra IQ Marathon

Vašou úlohou je načítať hracie pole zo súboru a umiestniť do neho šípky <, v, > a ^ tak, aby sa krava mohla dostať do cieľovej pozície.

Úloha 1.1

Stiahnite si základnú kostru programu zo súboru iq_marathon.c.

Úloha 1.2

Načítajte hracie pole zo súboru do dvojrozmerného poľa world.

Použiť môžete nasledujúce funkcie:

  • fopen() Inicializácia práce so súborom
  • fclose() Ukončenie práce so súborom
  • fscanf() Načítanie obsahu zo súboru s určitým formátom
  • fgets() Načítanie riadku (reťazca) zo súboru
  • fgetc() Načítanie znaku zo súboru

Súbor obsahuje rozmer šírky hracieho poľa (celočíselná hodnota, max. rozmer je 30), rozmer výšky hracieho poľa (celočíselná hodnota, max. rozmer je 20) a obsah hracieho poľa (reťazec). Tieto 3 údaje sú oddelené medzerou. Príklad súboru:

10 5 XXXXXXXXXX|X F X    X|XXXXX    X|X E      X|XXXXXXXXXX

Reťazec v súbore predstavuje samotné hracie pole:

  • X Stena resp. hranica sveta
  • W, S, E resp. N Počiatočná pozícia kravy so smerom na západ, juh, východ resp. server
  • F Cieľová pozícia kravy
  • ' ' (medzera) Prázdna pozícia
  • | Nie je súčasťou hracieho poľa, odddeľuje jednotlivé riadky

Vaše riešenie otestujte na súbore maze1.

Úloha 1.3

Vytvorte funkciu void draw(const int height, const int width, char world[][width+1]), ktorá na obrazovku vykreslí aktuálny stav hracieho poľa. Vaše riešenie otestujte na súbore maze1.

Svet by mal aktuálne obsahovať tieto znaky:

  • X Stena resp. hranica sveta
  • W, S, E resp. N Počiatočná pozícia kravy so smerom na západ, juh, východ resp. server
  • F Cieľová pozícia kravy
  • ' ' (medzera) Prázdna pozícia

Ak je obsah súboru maze1 nasledovný:

10 5 XXXXXXXXXX|X F X    X|XXXXX    X|X E      X|XXXXXXXXXX

potom si pole world môžeme predstaviť nasledovne:

XXXXXXXXXX
X F X    X
XXXXX    X
X E      X
XXXXXXXXXX

Funkcia draw() vypíše tento obsah na obrazovku v nasledovnom tvare:

XXXXXXXXXX
X F X    X
XXXXX    X
X E      X
XXXXXXXXXX

Krok 2: Help Functions

V nasledujúcich úlohách vytvoríte funkcie, ktoré zjednodušia programovanie samotnej hry.

Úloha 2.1

Naprogramujte funkciu char find_cow(const int height, const int width, int* x, int* y, char world[][width + 1]), ktorá nájde v hracom poli kravu a zistí jej smer.

  • Ak je známa výška a šírka sveta, potom je možné uskutočniť postupný prechod svetom world a hľadať kravu. Hľadáme teda znak W, S, E resp. N.
  • V prípade nájdenia kravy funkcia upraví hodnoty *x a *y tak, aby uchovávali súradnice kravy vo svete.
  • Navyše, funkcia vráti znak, ktorý predstavuje smer kravy.

Úloha 2.2

Naprogramujte funkciu void find_finish(const int height, const int width, int* finish_x, int* finish_y, char world[][width + 1]), ktorá nájde v hracom poli cieľovú pozíciu.

  • Ak je známa výška a šírka sveta, potom je možné uskutočniť postupný prechod svetom world a hľadať cieľ. Hľadáme teda znak F.
  • V prípade nájdenia cieľa funkcia upraví hodnoty *finish_x a *finish_y tak, aby uchovávali súradnice cieľa vo svete.
  • Funkcia nevráti žiadnu hodnotu.

Úloha 2.3

Vytvorte funkciu char change_direction(const int x, const int y, const int finish_x, const int finish_y, const char direction), ktorá vráti znak W, S, E resp. N podľa toho, ako sa má zmeniť smer kravy.

Parametre funkcie obsahujú aktuálne súradnice kravy, súradnice cieľovej pozície a aktuálny smer kravy. Návratovou hodnotou funkcie je znak, ktorý vyjadruje nový smer kravy.

Logika našej verzie hry bude nasledovná: Krava pôjde vždy rovno, až kým nenarazí na stenu (znak X). Potom zmení smer. V prípade, že je aktuálny smer kravy W alebo E, nový smer bude S alebo N podľa toho, kde sa nachádza cieľová pozícia. Naopak, ak je aktuálny smer kravy S alebo N, nový smer bude W alebo E podľa toho, kde sa nachádza cieľová pozícia.

Poznámka

Posledné 3 vytvorené funkcie budú používané pri riešení hry na budúcom cvičení, a preto nie je nutné ich volať v hlavnej funkcii main().

Doplňujúce úlohy

Úloha A.1

Upravte Vaše riešenie tak, aby bolo možné pracovať so súborom, kde na každom riadku je uvedený iný level hry. Hráč na začiatku zadá poradové číslo levelu, pre ktorý bude hra vyriešená (hráč čísluje od 1). Vaše riešenie môžete overiť na tomto súbore.

Doplňujúce zdroje

  1. Súbory a jazyk C
  2. Viacrozmerné polia v jazyku C
  3. Funkcia fopen(): c-reference, cplusplus.com - Opens a file and returns a file stream associated with that file.
  4. Funkcia fclose(): c-reference, cplusplus.com - Closes the given file stream.
  5. Funkcia fscanf(): c-reference, cplusplus.com - Reads data from stdin, interprets it according to format and stores the results into given locations.
  6. Funkcia fprintf(): c-reference, cplusplus.com - Loads the data from the given locations, converts them to character string equivalents and writes the results to stdout.
  7. Funkcia perror(): c-reference, cplusplus.com - Displays a character string corresponding of the current error to stderr.
  8. Funkcia fgetc(): c-reference, cplusplus.com - Reads the next character from the given input stream.
  9. Funkcia fputc(): c-reference, cplusplus.com - Writes a character ch to the given output stream stream.
  10. Funkcia fgets(): c-reference, cplusplus.com - Gets a character string from a file stream.
  11. Funkcia fputs(): c-reference, cplusplus.com - Writes a character string to a file stream.
  12. Funkcia putchar(): c-reference, cplusplus.com - Writes a character to stdout.

Video