Hledáš dárek, který neskončí v koši? Nyní 90 % extra kreditů ZDARMA s promo kódem PREKVAPENI90. Zjisti více:
NOVINKA: Staň se datovým analytikem od 0 Kč a získej jistotu práce, lepší plat a nové kariérní možnosti. 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
Nejnovější komentáře jsou na konci poslední stránky.
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
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.

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.

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)
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ě.
>

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ě.

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
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.

Avatar
Marie Formánková:18.11.2022 15:14

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

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.

Nejnovější komentáře jsou na konci poslední stránky.
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 41.