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

Späť

Upozorňujeme, že diskusie pod našimi online kurzmi 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
Posledné komentáre sú v spodnej časti poslednej stránky.
Avatar
Petr Kopečný:19.11.2025 23:17

Ve výsledném programu je drobná chybka. Pokud se stane, že bojovník "zemře" s tím, že má přesně 0 hp, nezobrazí se tato zpráva v konzoli kvůli podmínce if self._zivot < 0, je třeba podmínku změnit na if self._zivot <= 0.

Odpovedať
"Důstojníci mají takové rčení: Má-li nějaká práce smysl, má smysl udělat ji dobře. Nemá-li smysl, dejte ji Rimme...
Avatar
Milada Nováková:30. apríla 10:50

Arénu je možno ještě vylepšit v rámci vlastního cvičení např. životy nemusí mít stejný ukazatel jako mana. Dá se to vyřešit jednoduše přes parametr, kdy v graficky_ukazatel můžeme přidat další parametr např. symbol a pro život můžeme zobrazovat ♥, a protože by bylo divné, aby mana nesla symbol života bude vstupovat jiný symbol takže to potom může vypadat takto:
ve třídě bojovník:

def graficky_ukazatel(self, aktualni, maximalni, symbol = '♥', barva ="\033[31m"):
    celkem = 20
    pocet = int(aktualni / maximalni * celkem)
    if (pocet == 0 and self.je_nazivu()):
        pocet = 1

    reset ="\033[0m"

    return f"[{barva}{symbol * pocet}{' ' * (celkem - pocet)}{reset}]"

a ve třídě mág:

def graficka_mana(self):
    return self.graficky_ukazatel(self._mana, self._max_mana, '⟡', "\033[34m")

já si teda ještě pohrála trochu s barvou a mimo to jsem vnesla do hry ještě jeden moment náhody a to, že se losují bojovníci tzn. zda bude bojovat Shadow s mágem nebo Shadow s bojovníkem nebo bojovník s mágem.

Avatar
Peter Mihók
Člen
Avatar
Peter Mihók:25. októbra 14:19

Takto, keby som nemal pomoc AI tak absolútne neviem kde čo mám vložiť. Podľa autora článku je všetko jednoduché, kód je jednoduchý atď. Ja som úplný začiatočník a myslím si, že keby autor urobil video namiesto toho článku, ktorý musím čítať niekoľkokrát, tak by mi to dalo oveľa viac aby som vedel čo mám robiť. Hodiny strácam čítaním a rozmýšľaním, miesto toho aby som sa reálne vzdelával.

Avatar
DarkCoder
Člen
Avatar
Odpovedá na Peter Mihók
DarkCoder:25. októbra 16:55

Pokud pochopíš strukturu programu v Pythonu, bude to pro tebe snazší. Podívej se na níže uvedený příklad s autodílnou. Zejména na jeho sekce. Z toho pochopíš kam so umisťovat ve svých programech.

# =====================================================================
# 1. SEKCE: IMPORTY (Nástroje odjinud)
# Sem dáváme knihovny. Teprve až je naimportujeme, můžeme je používat níže.
# =====================================================================
import random  # Budeme potřebovat pro náhodné generování poruch
import time    # Budeme potřebovat pro simulaci času (čekání)


# =====================================================================
# 2. SEKCE: KONSTANTY (Globální nastavení)
# Věci, které platí pro celý program a nemění se. Píšeme je VELKÝMI PÍSMENY.
# =====================================================================
NAZEV_DILNY = "Super Kára Servis"
CENA_ZA_OPRAVU = 1500


# =====================================================================
# 3. SEKCE: OBJEKTY / TŘÍDY (Šablony)
# Třída (class) je jako tovární výkres. Říká, z čeho se auto skládá.
# Všimni si odsazení (tabulátorů) – vše, co je odsazené, patří pod to auto.
# =====================================================================
class Auto:
    def __init__(self, znacka, model, rok_vyroby):
        self.znacka = znacka
        self.model = model
        self.rok_vyroby = rok_vyroby
        self.je_rozbite = False  # Každé nové auto je na začátku v pořádku

    def info(self):
        """Metoda, která vrátí textový popis auta."""
        stav = "❌ ROZBITÉ" if self.je_rozbite else "✅ V POŘÁDKU"
        return f"{self.znacka} {self.model} ({self.rok_vyroby}) - Stav: {stav}"


# =====================================================================
# 4. SEKCE: FUNKCE (Samostatné recepty / pracovní postupy)
# Funkce (def) dělají konkrétní činnosti. Vezmou auto a něco s ním provedou.
# =====================================================================
def simuluj_jizdu(auto):
    """Funkce vezme auto a s 50% šancí ho během jízdy rozbije."""
    print(f"🚗 {auto.znacka} vyjíždí na testovací jízdu...")
    time.sleep(1)  # Počkáme 1 sekundu

    # Náhodné rozhodnutí (True nebo False)
    if random.choice([True, False]):
        auto.je_rozbite = True
        print(f"💥 Křááách! {auto.znacka} se porouchala.")
    else:
        print(f"✨ Jízda proběhla hladce. {auto.znacka} je netknutá.")


def oprav_auto_v_dilne(auto):
    """Funkce zkontroluje auto a pokud je rozbité, opraví ho."""
    if auto.je_rozbite:
        print(f"🔧 Mechanici v dílně '{NAZEV_DILNY}' začínají pracovat...")
        time.sleep(1.5)
        auto.je_rozbite = False
        print(f"🛠️ Hotovo! Auto je opraveno. Účet: {CENA_ZA_OPRAVU} Kč.")
    else:
        print(f"👍 Auto {auto.znacka} je v pořádku, oprava není nutná.")


# =====================================================================
# 5. SEKCE: HLAVNÍ BĚH PROGRAMU (Tady se to reálně spouští)
# Teprve tady program ožívá. Používáme importy, konstanty, objekty i funkce.
# Všechno nad tímto řádkem byla jen příprava. Tady se reálně kliká na 'PLAY'.
# =====================================================================
if __name__ == "__main__":
    print(f"--- Vítejte v aplikaci pro {NAZEV_DILNY} ---\n")

    # 1. KROK: Vytvoříme objekt (konkrétní auto podle šablony z 3. sekce)
    moje_auto = Auto("Škoda", "Octavia", 2021)
    print(moje_auto.info())  # Vypíše, že je v pořádku
    print("-" * 40)

    # 2. KROK: Pošleme auto do funkce (z 4. sekce)
    simuluj_jizdu(moje_auto)
    print(moje_auto.info())  # Vypíše nový stav po jízdě
    print("-" * 40)

    # 3. KROK: Pošleme auto do opravny (z 4. sekce)
    oprav_auto_v_dilne(moje_auto)
    print(moje_auto.info())  # Vypíše konečný stav
Odpovedať
Jazyk C je jako formule. Můžete předjíždět ve 300 km/h. Každá drobná chyba vás ale nekompromisně pošle do zdi.
Avatar
Peter Mihók
Člen
Avatar
Odpovedá na DarkCoder
Peter Mihók:25. októbra 17:17

Veľká vďaka, z toho budem brať inšpiráciu. Inak k tej sekcii 2, to tu ešte asi nebolo nie? Neviem, že by som písal niečo veľkými písmenami a hneď pod import.

Avatar
DarkCoder
Člen
Avatar
Odpovedá na Peter Mihók
DarkCoder:25. októbra 19:18

Není zač! Ano, přesně tak, v těchto úvodních lekcích to nikde nezmiňují. V Pythonu je psaní identifikátorů VELKÝMI PÍSMENY čistě konvence (dohoda mezi lidmi) pro konstanty – tedy proměnné, které nastavíš jednou na začátku a už je v kódu nikdy neměníš.

Python totiž technicky konstanty vůbec neumí a nijak je neuzamkne. Všechno je to o disciplíně programátora. V Pythonu totiž platí pravidlo: prakticky každá změna hodnoty v kódu znamená, že Python na pozadí vytvoří úplně nový objekt v paměti a proměnnou na něj jen přesměruje (přelepí jmenovku na novou krabici).

x = 10
print(id(x))  # Vypíše adresu prvního objektu

x = 11  # "Změníme" hodnotu
print(id(x))  # Vypíše úplně jiné číslo! (důkaz, že vznikl nový objekt)

Tím, že to napíšeš velkými písmeny hned pod importy, dáváš ostatním (i svému budoucímu já) jasně najevo: „Tohle je pevné nastavení programu, na které se níže v kódu nesahá.“ Ať se ti v Pythonu daří!

Odpovedať
Jazyk C je jako formule. Můžete předjíždět ve 300 km/h. Každá drobná chyba vás ale nekompromisně pošle do zdi.
Posledné komentáre sú v spodnej časti poslednej stránky.
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 prihlás. Ak ešte nemáš účet, zaregistruj sa, je to zadarmo.

Zobrazené 6 správy z 46.