Pátá domácí úloha je zaměřená na procvičení tříd a objektů. Úkolem je napsat hru, ve které spolu zápasí 2 příšery. Program bude umožňovat jak hru dvou hráčů proti sobě (multiplayer), tak hru jednoho hráče proti počítači (single­player). Každá příšera má jméno, zdraví (body života), energii (ta je potřebná k vykonávání útoků), rychlost a několik útoků, které umí provádět. V každém kole útočí jedna z příšer na tu druhou, přičemž role útočníka a obránce (= příjemnce útoku) se po každém kole střídá. Začíná příšera, jejíž rychlost je větší (pokud mají obě stejnou rychlost, zvolte začínající příšeru libovolně). Příšera, která v aktuálním kole neútočí (obráce), odpočívá, tzn. přidá se jí 10 % z její celkové energie. Příšera, které klesne zdraví na 0, prohrává a hra končí. Každý útok má název, průměrnou sílu (= průměrný počet bodů života, který útok ubírá), přesnost (= pravděpodobnost, že se útok strefí) a obtížnost (= kolik bodů energie útok vyžaduje od útočící příšery). Pokud má příšera méně energie, než kolik útok vyžaduje, útok se neprovede. Pokud se příšera útokem strefí, určí se částečně náhodně skutečná (aktuální) síla útoku (např. +­ 30 % okolo průměrné síly útoku) a tento počet bodů života si obránce ubere (nejmenší počet bodů života příšery je 0). Nezávisle na tom, jestli se útok strefí, musí si útočící příšera ubrat příslušný počet bodů energie. Jedno kolo může vypadat následovně. (Na konci stránky najdete dvě ukázky kompletní hry.) ========== Charizard's turn ========== Charizard: health=200/200, energy=120/120 Machamp: health=180/180, energy=140/140 ­­­­­­­­­­ [1] wing attack: power=30, accuracy=90, difficulty=15 [2] seismic toss: power=110, accuracy=70, difficulty=60 [3] cut: power=15: accuracy=90, difficulty=5 [4] flamethrower: power=60, accuracy=80, difficulty=35 ­­­­­­­­­­ Select attack: 2 Charizard used seismic toss! Machamp was hit and lost 134 health points. Charizard: health=200/200, energy=60/120 Machamp: health=46/180, energy=140/140 Domácí úloha č. 5 ­ Zápas příšer Press ENTER to continue... Nebo klidně i takto: =============================== Charizard's turn =============================== Charizard      |##########| 200/200   |##########| 120/120 ­­­­­­­­­       health                 energy Machamp        |##########| 180/180   |##########| 140/140 ­­­­­­­         health                 energy ­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­     name            power accuracy difficulty [1] wing attack        30       90         15 [2] seismic toss      110       70         60 [3] cut                15       90          5 [4] flamethrower       60       80         35 ­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­ Select attack: 2 > Charizard used seismic toss! > Machamp was hit and lost 134 health points. Charizard      |##########| 200/200   |#####­­­­­| 60/120 ­­­­­­­­­       health                 energy Machamp        |###­­­­­­­| 46/180    |##########| 140/140 ­­­­­­­         health                 energy Press ENTER to continue... Hra by měla probíhat podle popisu uvedeného výše. Pokud si ale chcete herní koncept nějak upravit, klidně můžete (pokud upravit neznamená zjednodušit). V takovém případě popište váš herní koncept pořádně v komentáři na začátku programu. Hlavním cílem úlohy je procvičit práci s třídami a objekty, váš program by tedy měl obsahovat alespoň 4 třídy. Tři z nich by měly být  Creature ,  Attack  a  Match , dále si můžete zavést např. třídy pro reprezentaci kolekce příšer/útoků ( CreatureCollection ,  AttackCollection ) nebo strategie uživatele/počítače ( UserStrategy ,  ComputerStrategy ). Základní operace na datech objektů implementujte skrze metody (např. třída  Attack  může mít metodu  actual_power  pro výpočet částečně náhodné aktuální síly útoku, třída  Creature  metody  rest  pro přidání 10 % energie,  is_defeated  pro zjištění, zda jí už nezbývají žádné body života a pro zpracování útoků může také obsahovat metody  attack  a  undertake_attack , třída  Match  může mít např. metodu  one_turn  pro provední jednoho kola,  print_state  pro výpis aktuálního stavu zápasu,  finished  pro zjišťování, zda už zápas skončil, a  run  pro provedení celého zápasu). Výpis programu může být jednoduchý (jako v první ukázce), ale musí být vždy poznat, jaký je aktuální stav zápasu (kolik má který zápasník životů a energie, která příšera utočí, z kterých útoků má uživatel na výběr (pokud zrovna vybírá) a co se stalo, např. že se útok trefil a ubral 57 bodů života, že se útok netrefil a že zápas skončil a kdo vyhrál). Za velmi dobře zpracovanou úlohu lze získat bonusové body (např. můžete napsat třídy pro reprezentaci obou strategií a obou kolekcí, vymyslet chytřejší strategii pro počítač a pořádně ji popsat v komentáři, atd.) Odevzdejte jediný soubor  homework05.py . Alespoň 4 třídy a základní operace na třídách pomocí metod. Zápas bude probíhat podle pravidel uvedných výše, případné upravy budou jasně uvedeny v komentáři. Program by měl umožňovat jak hru uživatele proti počítači (single­player), tak hru dvou uživatelů proti sobě (multiplayer). Strategie počítače může být libovolně hloupá, ale pokud to jde, tak musí vybrat útok, na který má příšera dostatek energie (z těchto útoků může klidně vybrat náhodně). Pište přehledný kód, používejte vhodná jména proměnných. Úlohu si rozložte, napište si vhodné pomocné funkce a třídy. Vyhněte se opakování téměř totožného kódu na různých místech programu (pokud zjistíte, že se vám podobný kód v programu opakuje, napište pro danou funkcionalitu pomocnou funkci/metodu). Pokud se vám úlohu nepodaří úplně vyřešit, napište alespoň část řešení a v komentáři popište, co vašemu řešení chybí. Základní kostra řešení může vypadat následovně. Definujte si další atributy tříd, třídy a funkce podle potřeby. # ­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­ #  Utok # ­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­ Požadavky Kostra řešení class Attack(object):     """Reprezentace jednoho typu utoku.     Attributes:         name: (str) Jmeno utoku.         power: (int) Prumerny pocet bodu zivota, ktere utok zasazenemu ubira.         accuracy: (int) Pravdepodobnost, ze utok zasahne protivnika (1­100).         difficulty: (int) Kolik bodu energie vyzaduje provedeni utoku.     """     pass # ­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­ #   Prisera # ­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­ class Creature(object):     """Reprezentace jednoduche prisery.     Attributes:         name: (str) Jmeno prisery.         full_health: (int) Pocet bodu zivota (health points) pri plnem zdravi.         full_energy: (int) Pocet bodu energie (energy points) pri plne energii.         speed: (int) Prirozene cislo vyjadrujici rychlost prisery.         attacks: Kolekce utoku prisery (AttackCollection nebo seznam).         health: (int) Aktualni zdravi prisery (0­full_health).         energy: (int) Aktualni energie prisery (0­full_energy).     """     pass # ­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­ #  Zapas # ­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­ class Match(object):     """Trida reprezentujici stav zapasu mezi dvema priserami.     Attributes:       creatures: Seznam dvou zapasicich priser.       attacker: Prisera, ktera v aktualnim kole utoci.       defender: Prisera, na kterou je aktualne utoceno.     """     pass # ­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­ #  Main Function # ­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­ def main():     # Ve funkci main vytvorte kolekci (seznam) utoku a priser,     # nechejte vybrat mod hry a priseru/prisery,     # vytvorte novy zapas (instance tridy Match)     # a spuste ho (napr. match.run()).     pass main() ================================== Match Game ================================== ­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­ [1] single­player [2] multiplayer ­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­ Select game mode: 2 Player 1 ­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­     name            health  energy speed [1] Machamp            180     140    90 [2] Flareon            140     140   110 [3] Charizard          200     120   100 ­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­ Select creature: 3 > You have chosen Charizard. Player 2 ­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­     name            health  energy speed [1] Machamp            180     140    90 [2] Flareon            140     140   110 ­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­ Select creature: 1 > You have chosen Machamp. > The match begins! Press ENTER to continue... =============================== Charizard's turn =============================== Ukázka hry (multiplayer) Charizard      |##########| 200/200   |##########| 120/120 ­­­­­­­­­       health                 energy Machamp        |##########| 180/180   |##########| 140/140 ­­­­­­­         health                 energy ­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­     name            power accuracy difficulty [1] wing attack        30       90         15 [2] seismic toss      110       70         60 [3] cut                15       90          5 [4] flamethrower       60       80         35 ­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­ Select attack: 2 > Charizard used seismic toss! > Machamp was hit and lost 134 health points. Charizard      |##########| 200/200   |#####­­­­­| 60/120 ­­­­­­­­­       health                 energy Machamp        |###­­­­­­­| 46/180    |##########| 140/140 ­­­­­­­         health                 energy Press ENTER to continue... ================================ Machamp's turn ================================ Charizard      |##########| 200/200   |#####­­­­­| 60/120 ­­­­­­­­­       health                 energy Machamp        |###­­­­­­­| 46/180    |##########| 140/140 ­­­­­­­         health                 energy ­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­     name            power accuracy difficulty [1] mega punch         70       75         40 [2] seismic toss      110       70         60 [3] leer                0       50          0 [4] punch              15       90          5 ­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­ Select attack: 1 > Machamp used mega punch! > Charizard was hit and lost 85 health points. Charizard      |######­­­­| 115/200   |######­­­­| 72/120 ­­­­­­­­­       health                 energy Machamp        |###­­­­­­­| 46/180    |########­­| 100/140 ­­­­­­­         health                 energy Press ENTER to continue... =============================== Charizard's turn =============================== Charizard      |######­­­­| 115/200   |######­­­­| 72/120 ­­­­­­­­­       health                 energy Machamp        |###­­­­­­­| 46/180    |########­­| 100/140 ­­­­­­­         health                 energy ­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­     name            power accuracy difficulty [1] wing attack        30       90         15 [2] seismic toss      110       70         60 [3] cut                15       90          5 [4] flamethrower       60       80         35 ­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­ Select attack: 2 > Charizard used seismic toss! > Machamp was hit and lost 46 health points. Charizard      |######­­­­| 115/200   |#­­­­­­­­­| 12/120 ­­­­­­­­­       health                 energy Machamp        |­­­­­­­­­­| 0/180     |#########­| 114/140 ­­­­­­­         health                 energy > Machamp is defeated. > Charizard wins. ================================== Match Game ================================== ­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­ [1] single­player [2] multiplayer ­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­ Select game mode: 1 Player 1 Ukázka hry (single­player) ­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­     name            health  energy speed [1] Machamp            180     140    90 [2] Flareon            140     140   110 [3] Charizard          200     120   100 ­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­ Select creature: 3 > You have chosen Charizard. > Computer has chosen Machamp. > The match begins! Press ENTER to continue... =============================== Charizard's turn =============================== Charizard      |##########| 200/200   |##########| 120/120 ­­­­­­­­­       health                 energy Machamp        |##########| 180/180   |##########| 140/140 ­­­­­­­         health                 energy ­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­     name            power accuracy difficulty [1] wing attack        30       90         15 [2] seismic toss      110       70         60 [3] cut                15       90          5 [4] flamethrower       60       80         35 ­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­ Select attack: 2 > Charizard used seismic toss, but missed! Charizard      |##########| 200/200   |#####­­­­­| 60/120 ­­­­­­­­­       health                 energy Machamp        |##########| 180/180   |##########| 140/140 ­­­­­­­         health                 energy Press ENTER to continue... ================================ Machamp's turn ================================ Charizard      |##########| 200/200   |#####­­­­­| 60/120 ­­­­­­­­­       health                 energy Machamp        |##########| 180/180   |##########| 140/140 ­­­­­­­         health                 energy > Machamp used leer! > Charizard was hit and lost 0 health points. Charizard      |##########| 200/200   |######­­­­| 72/120 ­­­­­­­­­       health                 energy Machamp        |##########| 180/180   |##########| 140/140 ­­­­­­­         health                 energy Press ENTER to continue... =============================== Charizard's turn =============================== Charizard      |##########| 200/200   |######­­­­| 72/120 ­­­­­­­­­       health                 energy Machamp        |##########| 180/180   |##########| 140/140 ­­­­­­­         health                 energy ­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­     name            power accuracy difficulty [1] wing attack        30       90         15 [2] seismic toss      110       70         60 [3] cut                15       90          5 [4] flamethrower       60       80         35 ­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­ Select attack: 4 > Charizard used flamethrower! > Machamp was hit and lost 68 health points. Charizard      |##########| 200/200   |####­­­­­­| 37/120 ­­­­­­­­­       health                 energy Machamp        |#######­­­| 112/180   |##########| 140/140 ­­­­­­­         health                 energy Press ENTER to continue... ================================ Machamp's turn ================================ Charizard      |##########| 200/200   |####­­­­­­| 37/120 ­­­­­­­­­       health                 energy Machamp        |#######­­­| 112/180   |##########| 140/140 ­­­­­­­         health                 energy > Machamp used seismic toss, but missed! Charizard      |##########| 200/200   |#####­­­­­| 49/120 ­­­­­­­­­       health                 energy Machamp        |#######­­­| 112/180   |######­­­­| 80/140 ­­­­­­­         health                 energy Press ENTER to continue... =============================== Charizard's turn =============================== Charizard      |##########| 200/200   |#####­­­­­| 49/120 ­­­­­­­­­       health                 energy Machamp        |#######­­­| 112/180   |######­­­­| 80/140 ­­­­­­­         health                 energy ­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­     name            power accuracy difficulty [1] wing attack        30       90         15 [2] seismic toss      110       70         60 [3] cut                15       90          5 [4] flamethrower       60       80         35 ­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­ Select attack: 2 > Charizard doesn't have enought energy for this attack. Charizard      |##########| 200/200   |#####­­­­­| 49/120 ­­­­­­­­­       health                 energy Machamp        |#######­­­| 112/180   |#######­­­| 94/140 ­­­­­­­         health                 energy Press ENTER to continue... ================================ Machamp's turn ================================ Charizard      |##########| 200/200   |#####­­­­­| 49/120 ­­­­­­­­­       health                 energy Machamp        |#######­­­| 112/180   |#######­­­| 94/140 ­­­­­­­         health                 energy > Machamp used seismic toss! > Charizard was hit and lost 98 health points. Charizard      |######­­­­| 102/200   |######­­­­| 61/120 ­­­­­­­­­       health                 energy Machamp        |#######­­­| 112/180   |###­­­­­­­| 34/140 ­­­­­­­         health                 energy Press ENTER to continue... =============================== Charizard's turn =============================== Charizard      |######­­­­| 102/200   |######­­­­| 61/120 ­­­­­­­­­       health                 energy Machamp        |#######­­­| 112/180   |###­­­­­­­| 34/140 ­­­­­­­         health                 energy ­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­     name            power accuracy difficulty [1] wing attack        30       90         15 [2] seismic toss      110       70         60 [3] cut                15       90          5 [4] flamethrower       60       80         35 ­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­ Select attack: 2 > Charizard used seismic toss! > Machamp was hit and lost 112 health points. Charizard      |######­­­­| 102/200   |#­­­­­­­­­| 1/120 ­­­­­­­­­       health                 energy Machamp        |­­­­­­­­­­| 0/180     |####­­­­­­| 48/140 ­­­­­­­         health                 energy > Machamp is defeated. > Charizard wins.