NOVINKA: Získej 40 hodin praktických dovedností s AI – ZDARMA ke každému akreditovanému kurzu!
Hledáme nové posily do ITnetwork týmu. Podívej se na volné pozice a přidej se do nejagilnější firmy na trhu - Více informací.

Diskuze – Lekce 12 - Aréna s mágem (dědičnost a polymorfismus)

Zpět

Upozorňujeme, že diskuze pod našimi online kurzy jsou nemoderované a primárně slouží k získávání zpětné vazby pro budoucí vylepšení kurzů. Pro studenty našich rekvalifikačních kurzů nabízíme možnost přímého kontaktu s lektory a studijním referentem pro osobní konzultace a podporu v rámci jejich studia. Toto je exkluzivní služba, která zajišťuje kvalitní a cílenou pomoc v případě jakýchkoli dotazů nebo projektů.

Komentáře
Avatar
Daniel Martinek:3.12.2016 22:07

Ahoj, malinko jsem si to vylepšil.
Přidal jsem si do třídy Bojovnik "duše" - každý má 3 duše, když umře, tak 1 ztratí.
Je to takhle v pořádku, nebo by jsi to udelal jinak ?

class Bojovnik:
    """
    Třída reprezentující bojovníka do arény.
    """

    def __init__(self, jmeno, zivot, utok, obrana, duse, kostka):

        self._jmeno = jmeno
        self._zivot = zivot
        self._max_zivot = zivot
        self._utok = utok
        self._obrana = obrana
        self._duse = duse
        self._kostka = kostka
        self.__zprava = ""

    def __str__(self):
        return str(self._jmeno)

    def __repr__(self):
        return str("Bojovnik({0}, {1}, {2}, {3}, {4})".format(self._jmeno,
                                                              self._max_zivot,
                                                              self._utok,
                                                              self._obrana,
                                                              self._kostka))

    @property
    def nazivu(self):
        """
        Vrátí True, pokud je bojovník naživu.
        Jinak vrátí False.
        """
        return self._zivot > 0

    def graficky_zivot(self):
        celkem = 20
        pocet = int(self._zivot / self._max_zivot * celkem)
        if(pocet == 0 and self.nazivu):
            pocet = 1
        return "[{0}{1}]       Duše: {2}".format("#"*pocet, " "*(celkem-pocet),
                                                  self._duse)
    def bran_se(self, uder):
        zraneni = uder - (self._obrana + self._kostka.hod())
        if zraneni > 0:
            zprava = "{0} utrpěl poškození {1} hp.".format(self._jmeno,
                                                           zraneni)
            self._zivot = self._zivot - zraneni
            if self._zivot <= 0:
                if self._duse == 1:
                    self._duse = self._duse - 1
                    self._zivot = 0
                    zprava = zprava[:-1] + " a zemřel."
                else:
                    self._duse = self._duse - 1
                    self._zivot = self._max_zivot
        else:
            zprava = "{0} odrazil útok.".format(self._jmeno)
        self._nastav_zpravu(zprava)

    def utoc(self, souper):
        uder = self._utok + self._kostka.hod()
        zprava = "{0} útočí s úderem za {1} hp.".format(self._jmeno, uder)
        self._nastav_zpravu(zprava)
        souper.bran_se(uder)

    def _nastav_zpravu(self, zprava):
        self.__zprava = zprava

    def vrat_posledni_zpravu(self):
        return self.__zprava

    def __nastav_duse(self, duse):
        if self._zivot == 0:
            souper.__duse = souper._duse + 1

    def konec_hry(self):
        return self._duse < 5

Dal jen duse Mag vydedil a pri vytvareni jsou nastaveny duse na "3":

zalgoren = Bojovnik("Zalgoren", 50, 20, 10, 3, kostka)
gandalf = Mag("Gandalf ", 40, 15, 12, 3, kostka, 30, 45)

Diky moc a omlouvam se za dlouhy zdrojak... :D

Editováno 3.12.2016 22:09
 
Odpovědět
3.12.2016 22:07
Avatar
Paul
Člen
Avatar
Paul:30.7.2018 14:57

Myslím, že by v metodě bran_se() měla být podmínka uprava na

if self._zivot <= 0:

V současné době nemáme ošetřeno, když se posledním útokem hodnota života dostane na 0.
Pak dojde k tomu, že se hra ukončí, ale nedojde k vypsání o tom, že jeden z hráčů zemřel.

 
Odpovědět
30.7.2018 14:57
Avatar
Rastislav Kish:18.11.2018 16:19

Ahoj, nemala by metóda graficky_ukazatel byť skôr vnútorná? S vonkajškom nijako nesúvisí, je to len pomocná metóda, ktorú využíva logika triedy pre spracovanie výsledkov, programátor používajúci našu triedu by k nej nemal mať prístup.

 
Odpovědět
18.11.2018 16:19
Avatar
Jakub Faktoriál Dvořák:12.3.2019 23:44

Já jsem zas duše implementoval pomocí upravení funkce nazivu(self), přijde mi to trochu elegantnější, ale nevím zda to má nevýhody...

@property
def nazivu(self):
    """
    Vrátí True, pokud je bojovník naživu a má ještě duši k dobru.
    Jinak vrátí False.
    """
    return self._zivot > 0 and self._duse >= 0

mimojiné je třeba upravit funkci bran_se(self, uder)

if zraneni > 0:
    zprava = "{0} utrpěl poškození {1} hp.".format(self._jmeno,
                                                    zraneni)
    self._zivot = self._zivot - zraneni
    if self._zivot < 0:
        self._zivot = 0
        zprava = zprava[:-1] + " a zemřel."
        if self._duse > 1:
            self._duse = self._duse -  1
            zprava = zprava + " Dostal další ŠANCI."
            self._zivot = self._max_zivot // 2
else:
    zprava = "{0} odrazil útok.".format(self._jmeno)
self._nastav_zpravu(zprava)
 
Odpovědět
12.3.2019 23:44
Avatar
Matěj Štolfa:22.5.2019 18:52

Ve třetím odstavci pod nadpisem Konstruktor potomka je v první větě překlem v prvním slově.
>

 
Odpovědět
22.5.2019 18:52
Avatar
Matěj Štolfa:22.5.2019 19:12

Opět jako minule ti to napíše gandalf utrpěl.. ale hp se odečte hrdinovi.. Zpomalil jsem ty pauzy na 1s a všiml jsem si, že na konci je to způsobeno tím, že prvně se to ubere a potom co se to ubere se odečte hp.. Ale ten snímek s tím odečtením zároveň zobrazí i utoc(), takže to je matoucí, když chceš zpomalit pauzy, aby to bylo záživnější. Bylo by lepší to zmodifikovat na to, aby se další útok vypsal až po tom, co se odebere život, místo toho, aby se provedly současně.

 
Odpovědět
22.5.2019 19:12
Avatar
Jaroslav Toninger:16.9.2022 12:13

Konec jsem opravdu nepochopil, ani když jsem potom projížděl kód autora, nenašel jsem patřičné zorientování. I tak děkuji autorovi.

Odpovědět
16.9.2022 12:13
Bez extrému by nebyl pokrok v přírodě.
Avatar
Jakub Urbánek:26.9.2022 13:03

Myslím si, že jako tutoriál zbytečně komplikované. Více času člověk tráví přemýšlením nad detaily hry, než nad funkčností probíraných témat.

 
Odpovědět
26.9.2022 13:03
Avatar
Marie Formánková:18.11.2022 15:14

...tohle není vysvětlení jak funguje OOP ale návod jak si vytvořit hru...

 
Odpovědět
18.11.2022 15:14
Avatar
Petr Vácha
Člen
Avatar
Petr Vácha:17.1.2023 16:54

Vyšperkovat se zápas dá nekonečně daleko, ale jen mě zarazilo, že jsme neošetřili počáteční manu mága. Někdy má plno a někdy nula, ale třeba to byl záměr.

 
Odpovědět
17.1.2023 16:54
Děláme co je v našich silách, aby byly zdejší diskuze co nejkvalitnější. Proto do nich také mohou přispívat pouze registrovaní členové. Pro zapojení do diskuze se přihlas. Pokud ještě nemáš účet, zaregistruj se, je to zdarma.

Zobrazeno 10 zpráv z 34.