from random import random from random import randint """ Poznamka: tento navrh nie je uplne idealny. Praca so vstupom a vystupom by nemala byt sucastou metod objektov. Tento navrh sluzi len k prezentacii pouzitelnosti objektov a je nasilu zmrsteny do 3 objektov """ class Attack: # Naimplementujte konstruktor (inicializator), ktory vezme vsetky zadane parametre a nastavi ich ako atributy objektu # Naiplementujte __str__ tak aby sa vypisovali vsetky vlastnosti utoku def get_attack_power(self): """ Metoda vypise ci nastal kriticky utok a silu vykonaneho utoku. Navratova hodnota metody je sila vykonaneho utoku. """ pass class Hero: # Naimplementujte konstruktor, ktory vezme vsetky zadane parametre a nastavi ich ako atributy objektu # kazdy hrdina by si mal taktiez pamatat svoje povodne - "maximalne" zdravie a povodnu - tzn "maximalnu" energiu # Naimplementujte __str__ tak aby sa vypisovali vsetky podstatne vlastnosti hrdinu # utoky sa v __str__ nemaju vypisovat na to sluzi metoda print_attacks def regenerate(self): """ Metoda zregeneruje hrdinu. tzn zvysi mu zdravie o 10% maximalneho zdravie a energiu o 10% maximalnej energie. Priklad: Hrdina ma maximalne zdravie 100 jednotiek. Pred regeneraciou ma : 56 jednotiek Po regeneracii bude mat: 56 + (0.1 * 100) = 66 (osetrite aby vam nevyslo cele cislo zaokruhlenim) Po zregenerovani sa este skontroluje ci nahodou nebol prekroceny maximalny zdravie/ maximalna energia vypiste stav po regeneracii. """ pass def take_damage(self, damage): """ Znizi zdravie hrdinu o hodnotu 'damage' Pokial znizenim sa dostalo zdravie hrdinu do zaporu nastavi jeho zdravie na 0. :param damage: celociselne mnozstvo jednotiek zdravia o ktore prisiel utokom """ pass def is_defeated(self): """ :return: boolean (True,False) ci je hrdinove zdravie rovne nule """ pass def print_attacks(self): """ Vypise vsetky dostupne utoky hrdinu Idealne pekne naformatovane :) """ pass def attack_other_hero(self, other_hero, attack): """ Vypise, ze sa zacina utok tohto hrdinu na `other_hero` pomocou utoku `attack` vypocita akou silu utoku - attack.get_attack_power() znizi energiu utociaceho hrdinu o energiu, ktoru stal utok. znizi zravie other_hero :param other_hero: Druhy objekt triedy Hero na ktoreho sa bude utocit :param attack: Objekt triedy Attack ktory bude pouzity k utoku """ pass def reset(self): """ Resetne zdravie a energiu hrdinu na povodne hodnoty (pouziva sa pri opakovani hry) """ pass def has_enough_energy(self, index, output=True): """ Overi ci ma hrdina dostatok energie na utok, ktory je na indexe 'index' Pokial je povoleny vystup tak vypise v pripade nedostatku energie chybovu hlasku. :param index: index objektu zo zoznamu attacks :param output: ci je povoleny vystup :return: boolean ci ma hrdina dostatok energie """ pass def get_attack_from_computer(self): """ !!! TUTO CAST IMPLEMENTUJE AZ NAKONIEC!!! Tu budete mat naimplemetovanu vasu strategiu pre "singleplayerovu kampan' vid poziadavky :return: objekt typu utok zo zoznamu hrdinovych utokov pre ktory ma dostatok energie """ def get_attack_from_input(self): """ Metoda vrati objekt triedy Attack, ktory si uzivatel vybral. (naimplementovane za vas) :return: objekt triedy Attack, ktory si uzivatel vybral. """ print("Choose attack:") index = input() while not self.valid_index(index): print("Enter again:") index = input() return self.attacks[int(index) - 1] def valid_index(self, index): """ Metoda overi ci dany vstup je validny pre dany objekt tzn: je cislo? Je cislo v rozsahu [0, dlzka zoznamu utokov] ? Ma hrdina dostatok energie na utok? V pripade nesplnenia podmienky vypise vhodnu chybovu hlasku. :param index: textovy retazec zo vstupu :return: boolean ci splna vsetky spomenute podmienky """ class Arena: def __init__(self, hero1, hero2, computer=False): """ Naimplementujte konstruktor, ktory vezme vsetky zadane parametre a nastavi ich ako atributy objektu konstruktor by mal nastavit pocitac kol na 1 a hrdinov. :param hero1: prvy objekt triedy Hero :param hero2: druhy objekt triedy Hero """ pass def is_game_over(self): """ Metoda zistuje ci skoncila hra (ci zomrel nejaky z hrdinov) :return: boolean podla toho ci hra skoncila alebo nie """ pass def print_result(self): """ Metoda vypise vysledok hry: pokial ziju obidvaja hrdinovia tak vypise, ze hra este neskoncila. Pokial zomreli obaja hrdinovia tak oznami remizu. Pokial zomrel prvy hrdina oznami vitazstvo druheho hrdinu. Pokial zomrel druhy hrdina oznami vitazstvo prveho hrdinu. """ def restart_match(self): """ Restartne zdravie a energiu obidvom hrdinom na maximum a nastavi pocitac kol na 1 """ pass def perform_round(self): """ Pokial este hra neskoncila tak: Ohlasi zaciatok dalsieho kola spravi utok prveho hrdinu na druheho hrdinu overi ci neskoncila hra spravi utok druheho hrdinu na prveho hrdinu (Naimplementovane za vas) :return: """ if self.is_game_over(): print("Game over") return print("+", "-" * 25, "Round ", self.round_counter, "-" * 25, "+") self.perform_attack(self.hero1, self.hero2) if not self.is_game_over(): self.perform_attack(self.hero2, self.hero1, self.computer) self.round_counter += 1 def perform_attack(self, attack_hero, defense_hero, computer=False): """ Pred kazdym kolom by sa mal defense_hero zregenerovat Vypise informacie o utoku hrdinu attack_hero na hrdinu defense_hero potom sa vyberie utok podla nasledovneho: ak hra uzivatel tak vypise zoznam utokov attack_hero a vypyta si od uzivatela utok, ktory si vybral ak hra pocitac tak pouzije get_attack_from_computer pre ziskanie vstupu od pocitaca ( vami naipmlementovanej strategie) po vybere utoku uz len pouzije vybraty utok. :param attack_hero: utociaci hrdina :param defense_hero: braniaci sa hrdina :param computer: priznak urcujuci ci hra pocitac alebo uzivatel """ pass # Tento kod odkomentujte ked budete mat naimplementovane vsetky ulohy vyssie # sluzi len na ukazku ako moze byt implementovany suboj. Upravte ho do podoby kde si uzivatel moze najskor vybrat medzi singleplayerom a multiplayerom. # Doplnte este moznosti vyberu hrdinov - mozno dalsia trieda? # Je mozne, ze budete musiet rozsirit triedy alebo dopisat dalsie metody tak sa toho nebojte. """ fist = Attack("Fist", 10, 5, 0.5, 1.4) hook_combo = Attack("Hook & Fist combo", 40, 18, 0.3, 2.1) rampage = Attack("Rampage", 280, 175, 0.1, 1.5) batman_attacks = list() batman_attacks.append(fist) batman_attacks.append(hook_combo) batman_attacks.append(rampage) tail_whip = Attack("Tail whip", 10, 5, 0.5, 3) electro_ball = Attack("Electro ball", 50, 24, 0.3, 3) thunder_shock = Attack("Thunder shock", 300, 150, 0.1, 1.3) pikachu_attacks = list() pikachu_attacks.append(tail_whip) pikachu_attacks.append(electro_ball) pikachu_attacks.append(thunder_shock) batman = Hero("Batman", 350, 175, batman_attacks) pikachu = Hero("Pikachu", 300, 150, pikachu_attacks) # singleplayer #a = Arena(pikachu, batman, True) # multiplayer a = Arena(pikachu, batman) again = "y" while again == "y": while not a.is_game_over(): a.perform_round() a.print_result() again = input("Want to play again? Enter `y` to play again.").lower() a.restart_match() """