PB071 - Závěrečný příklad

Hledání min (25 - 35 bodů)

Jestliže nevidíte správně česká písmena, zvolte potřebné kódování češtiny manuálně.

15. 5. 2005: Upraven soubor api.h. Zdůrazněno pořadí zadávání souřadnic.
16. 5. 2005: Přidána zkompilovaná knihovna libstack.a pro Linux.
19. 5. 2005: Doplněna informace o ranlib.
20. 5. 2005: Stanoveno zadávání argumentů programu

Úvod:

Hledání min je dobře známá hra, která spočívá v nalezení min v hracím poli (moři). Na začátku zakryté hrací pole odkrýváme po políčkách, ze kterých se dozvídáme, kolik min se nalézá v jejich bezprostředním okolí. Hra končí prohrou, když hráč při odkrývání narazí na políčko s minou. Naopak hráč vítězí, když se mu podaří odkrýt všechna políčka bez min.

Zadání:

Základní verze (25 bodů)

Naprogramujte textovou verzi hry Hledání min. Pro základní verzi bez bonusů vytvoříte dva zdrojové soubory:
  1. API (api.c): Obsahuje důležité funkce na práci s hracím polem, aplikační část programu. K dispozici máte zdrojový kód hlavičkového souboru api.h, který definuje rozhraní API. Tento soubor použijete beze změny. Do souboru api.c opíšete deklarace funkcí a naplníte jejich těla. Účel každé funkce je popsán v komentáři.
  2. Hlavní program (miny.c): Slouží jako prezentační složka programu. Bude přijímat vstup od užvatele a generovat výstup. Měl by kromě funkcí na vstup/výstup používat funkce výhradně z API (není to podmínka, ale slušnost).
Hra bude probíhat následovně: Hráč se pokusí odkrýt políčko, když na něm je mina, prohrává. Když není, tak se označí jako odhalené. Pokud na něm nejsou žádné miny, odkryjí se všechna políčka kolem něj a postup odhalování se opakuje (rozuměj na okolní políčka tak, aby se odkryla souvislá plocha vzájemně sousedících políček bez min). Toto lze implementovat dvěma způsoby:
  1. Rekurze - zavoláme objevovací funkci na všechna okolní políčka. (využijeme zásobník procesu (zásobník funkcí))
  2. Procházení zásobníkem (+5 bodů) - políčko uložíme na zásobník, abychom ho v zápětí na začátku cyklu ze zásobníku vybrali, a označili ho jako objevené. Pokud kolem políčka nejsou žádné miny, uložíme na zásobník všechna okolní políčka, a postup opakujeme, dokud není zásobník prázdný.

    Máte k dispozici statickou knihovnu (libstack.a pro IRIX; libstack.a pro Linux) s hlavičkovým souborem (stack.h), které obsahují funkce na práci se zásobníkem. Dokumentace viz. hlavičkový soubor. Abyste mohli knihovnu použít, sestavíte program příkazem:

    gcc -std=c99 -pedantic -Wall miny.o api.o -o miny -lstack -L.

    -L. znamená, že se má při hledání knihoven pátrat i v aktuálním adresáři

Argumenty na příkazové řádce

  1. x-ová velikost moře
  2. y-ová velikost moře
  3. počet min
  4. (nepovinný) soubor pro načtení moře. Když je argument zadán, program načte moře ze souboru. Když se načtení nepodaří, vygeneruje se moře náhodně se zadaným počtem min. Když se načtení podaří, nastaví se počet min podle počtu min v souboru. Funkce pro načtení ze souboru má ladící charakter, proto nekontroluje, jestli je počet min ve správném rozmezí.

Uživatelský vstup

Hráč může zadat vstup ve čtyřech variantách (první se zadává souřadnice sloupce, číslování je od jedné):

>>> 10 5 // odkrýt políčko na pozici 10 (sloupec) 5 (řádek)

>>> 10 5 f // označit/odznačit políčko 10 5; označené políčko nelze odkrýt

>>> 10 5 x // odkrýt blok 3*3 políček se středem v 10 5; označená políčka se neodkrývají

>>> exit(nebo znak ^D) // ukončí hru

Rozšířená verze (+5 dalších bodů)

Pro zásobníkovou verzi programu naprogramujte podle rozhraní definovaného v stack.h knihovnu na práci se zásobníkem (stack.c). Pro uchovávání dat není dovoleno používat pole, ale je nutné použít strukturu deklarovanou v hlavičkovém souboru. Ze souboru stack.o si můžete vytvořit knihovnu příkazy:

ar r libstack.a stack.o
ranlib libstack.a # vygeneruje index knihovny

Program ranlib je součástí balíku devel2 (module add devel2), ale použitelnou knihovnu můžete vytvořit i pouze pomocí prvního příkazu. V manuálové stránce ranlib stojí: "Index ve statické knihovně urychluje její linkování a umožňuje funkcím z knihovny, aby se vzájemně volaly, a nemusely přitom vědět o svém umístění(adrese)."

Požadavky:

Poznámky:


Předchozí Hlavní stránka závěrečných příkladů Hlavní stránka Hlavní stránka PB071