IT rekvalifikácia. Seniorní programátori zarábajú až 6 000 €/mesiac a rekvalifikácia je prvým krokom. Zisti, ako na to!

Diskusia – 11. diel - Aréna s mágom (dedičnosť a polymorfizmus)

Späť

Upozorňujeme, že diskusie pod našimi online kurzami sú nemoderované a primárne slúžia na získavanie spätnej väzby pre budúce vylepšenie kurzov. Pre študentov našich rekvalifikačných kurzov ponúkame možnosť priameho kontaktu s lektormi a študijným referentom pre osobné konzultácie a podporu v rámci ich štúdia. Toto je exkluzívna služba, ktorá zaisťuje kvalitnú a cielenú pomoc v prípade akýchkoľvek otázok alebo projektov.

Komentáre
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

Editované 3.12.2016 22:09
 
Odpovedať
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.

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

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

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

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

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

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

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

 
Odpovedať
17.1.2023 16:54
Robíme čo je v našich silách, aby bola tunajšia diskusia čo najkvalitnejšia. Preto do nej tiež môžu prispievať len registrovaní členovia. Pre zapojenie sa do diskusie sa zaloguj. Ak ešte nemáš účet, zaregistruj sa, je to zadarmo.

Zatiaľ nikto nevložil komentár - buď prvý!