Toto je starší verze dokumentu!


Cvičení 05 - ZORK

Úvod do cvičení

Na dnešním cvičení budete mít za úkol připravit si základ kostry pro třetí domácí úlohu a nacvičit si na ní práci s proudy. Aby to bylo o něco zajímavější, budete psát základ serveru jednoduché interaktivní počítačové hry.

První úkol

V každé druhé hře máte nějaké protivníky. V této budete bojovat s různou havětí, zejména troly a pavouky. Pro začátek tedy začněte vytvořením nepřátel (-ských datových typů).

Zadání úkolu

Vhodnou objektovou hierarchií reprezentujte dva druhy monster: pavouka a trola. Každé monstrum má svůj zdravotní stav (integer; ⇐ max. zdraví), maximální zdraví (100-255) a jméno. Každá příšera přichází na svět buď zdravá jako řípa, nebo s explicitně uvedeným zdravím a maximálním zdravím. V každém případě je potřeba monstrum nějak pojmenovat.

  1. Implementujte nad každým monstrem operátor<< (1. argument std::ostream &; 2. argument monstrum), který na obrazovku vypíše rasu každého monstra, jeho jméno a počet životů. Formát výpisu je uveden v uvozovkách "<rasa><mezera><"><jméno><"><mezera><současné zdraví><mezera>/<počáteční zdraví>".
    Tip: operátor<< jako samostatná funkce, pomocná virtuální metoda print(std::ostream &);
    Všimněte si, že součástí výpisu není znak nového řádku. Za každým vypsaným řetězcem/číslem také řádkujete až když se Vám zachce.
  2. Nad společným předkem monster implementujte operátor>> (1. argument std::istream &; 2. argument reference na monstrum (supertřída)). Tento operátor nastaví jméno, zdraví a maximální zdraví monstra. Formát je identický s formátem výstupu vyjma úvodního rozlišení rasy a následující mezery. Vstup vždy načítejte jako celý řádek, teprve pak jej parsujte. Předpokládejte korektní vstup. Jméno je obaleno uvozovkami jak na výstupu, tak na vstupu.
    Tip: std::getline, std::stringstream, std::string::find_first_of std::string::find_last_of;
Ukázka výstupu:

spider odula("Odula", 53, 271);
troll brick("Brick");
 
std::cout << odula << std::endl;
std::cout << brick << std::endl;
--------------------------------
spider "Odula" 53 / 271
troll "Brick" 100 / 100

Ukázka vstupu, který očekává operátor»:

"Cihla" 45 / 170

Zajistěte, aby se při následujícím volání vždy vytiskl správný výstup:

Troll brick;
cout << "vytvorte trola: ";
cin >> brick;
Monster & m = brick;
cout << m << endl;
--------------------
vytvorte trola: "Cihla" 45 / 170
troll "Cihla" 45 / 170

Druhý úkol

Nepřítele máme, co s ním? Zabít! A k tomu jsou potřeba zbraně…

Zadání úkolu

Vhodnou objektovou hierarchií dále reprezentujte dva druhy zbraní: sekeru a meč. Útočnou sílu zbraně reprezentujte jako celé číslo, každý druh zbraně je jinak efektivní na různé druhy nepřátel.

Tabulka vah útoků a akcí

Monstrum/Zbraň Axe Sword
Spider 0,2 0,4
Troll Akce Z 0,7

Akce Z: Když je troll zasažen sekerou, způsobí mu to ztrátu paměti a zapomene jak se jmenuje. Protože by ale pak neměl žádné jméno, nastaví se mu jako jméno jeho současné zdraví (formát: '<aktuální><mezera>/<mezera><maximální>'). A také ztratí 0,6 *<síla zbraně> životů.

Tip: virtuální metoda getDamage(MonsterEnum); pomocný enum; virtuální metoda receiveAttack + 2. pomocný enum; std::stringstream

Kód a výstup:

    Troll brick("Cihla", 181, 181);
    Spider odula("Odula", 71, 100);
 
    Axe a(40);
    Sword s(40);
 
    std::cout << "pocatecni stavy: " << brick << " a " << odula << endl;
 
    brick.receiveAttack(&a, AXE);
    odula.receiveAttack(&a, AXE);
 
    std::cout << "po utoku sekerou: " << brick << " a " << odula << endl;
 
    brick.receiveAttack(&s, SWORD);
    odula.receiveAttack(&s, SWORD);
 
    std::cout << "po utoku mecem: " << brick << " a " << odula << endl;
--------------------------------------------------------------
pocatecni stavy: troll "Cihla" 181 / 181 a spider "Odula" 71 / 100
po utoku sekerou: troll "181 / 181" 157 / 181 a spider "Odula" 63 / 100
po utoku mecem: troll "181 / 181" 129 / 181 a spider "Odula" 47 / 100

Třetí úkol

Kde jsou ty zlaté časy kdy bylo umění projet hru bez jediného načtení a neustálého automatického ukládání… když si to ale trh žádá - máte za úkol načíst a uložit monstra do souboru.

Zadání úkolu

Zde si stáhněte soupisku nepřátel k načtení.

  1. Programově otevřete výstupní soubor, do kterého budete ukládat slabá monstra.
  2. Stažený soubor v programu otevřete a postupně načítejte všechny řádky.
  3. Na každém řádku se nejprve podívejte na typ monstra, které budete načítat; následně toto monstrum vytvořte se správným typem.
  4. Monstrum načtěte.
  5. Pokud má monstrum zdraví menší než 60, uložte jej do souboru se slabými monstry.
Tip: std::getline, std::stringstream, std::fstream

Vzorové řešení

Referenční řešení všech 3 úloh najdete na adrese http://www.organovabanka.cz/cs/vyuka/PB161/podzim2014/referencni_cv05.tar.gz.

QR Code
QR Code public:pb161:fall14_cviko05 (generated for current page)