Mikuláš je tu! Získaj 90 % extra kreditov ZADARMO s promo kódom CERTIK90 pri nákupe od 1 199 kreditov. Len do nedele 7. 12. 2025! Zisti viac:
NOVINKA: Najžiadanejšie rekvalifikačné kurzy teraz s 50% zľavou + kurz AI ZADARMO. Nečakaj, táto ponuka dlho nevydrží! Zisti viac:

Diskusia – 10. 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
Posledné komentáre sú na spodnej časti poslednej stránky.
Avatar
fenrir
Člen
Avatar
fenrir:12.10.2016 20:23

Ahoj.
Proč je gandalf deklarovaný jako datový typ Bojovnik a ne jako Mag? Podle toho jak tomu rozumím, nepřináší to nic než drobnou komplikaci v nutnosti přetypování v metodě VypisBojovnika, ale žádnou výhodu to nepřináší. Proč se teda nedeklaruje rovnou jako Mag?

Avatar
pocitac770
Tvůrce
Avatar
Odpovedá na fenrir
pocitac770:12.10.2016 22:53

To je podle me jenom ukazka, ze ho muzes do Bojovnika normalne ulozit, pro pochopení např pole, co v sobě bude mít např. Bojovníky, Mágy, Střelce... jen díky tomu, že bude pole typováno "obecně" na Bojovnika a tudíž se tam v tomto stavu budou ukládat, samozřejmě s vnitřní logikou svého vlastního typu.
A pokud jde o tu metodu "VypisBojovnika()", tam to ani jinak nemůžeš udělat, jako s tím polem. Musíš umět použít jakéhokoliv bojovníka s jakýmkoliv interním typem, takže ti přes parametr projde Bojovnik -> i jeho potomci, kdybys tam dal jenom Mag, tak by ti nešel vykreslit normální Bojovnik, protože by tě to přes parametr prostě nepustilo (-> jeden z principů OOP - znovupoužotelnost kódu, a může se jednat takto i o metodu v rámci jednoho projektu)

Avatar
Jan Krejčí
Člen
Avatar
Jan Krejčí:27.1.2017 19:04

"Přepsaná metoda Utoc" Použití jen jedné podmínky. Myslím, že ušetří nějaký řádek a efekt je stejný. Doplňuji jen tak pro zajimavost. :)

public override void Utoc(Bojovnik bojovnik)
{
if (mana == maxMana)
{
mana = 0;
int uder = magickyUtok + kostka.hod();
bojovnik.Bran­Se(uder);
NastavZpravu($"{jme­no} útočí na {bojovnik.Jmeno} magickým úderem {uder}.");
}
else
{
base.Utoc(bojov­nik);
mana += 10;
}

Avatar
Jan Krejčí
Člen
Avatar
Jan Krejčí:27.1.2017 19:10
public override void Utoc(Bojovnik bojovnik)
{
    if (mana == maxMana)
    {
        int uder = magickyUtok + kostka.hod();
        mana = 0;
        bojovnik.BranSe(uder);
        NastavZpravu($"{jmeno} útočí na {bojovnik.Jmeno} magickým úderem {uder}.");
    }
    else
    {
        base.Utoc(bojovnik);
        mana += 10;
    }
Avatar
Poggy
Člen
Avatar
Poggy:5.3.2017 12:53

Ahoj, mám problém u konstruktoru mága. Změnil jsem modifikátory ve třídě Bojovnik na protected dle návodu, konstruktor jsem opsal stejně jako tady. Viz. zdroják, ale z neznámého důvodu mi to podtrhuje slovo base. VS se z nějakého důvodu nelíbí pravděbodně poslední parametr "kostka.
Konstruktor mága:

namespace Arena2
{
    class Mag: Bojovnik
    {
        private int mana;
        private int maxMana;
        private int magickyUtok;

        public Mag(string jmeno, int zivot, int utok, int obrana, Kostka kostka, int mana, int magickyUtok)
                    : base(jmeno, zivot, obrana, kostka)/*zde mám base podtrženo, chyba bude asi v parametru kostka,
                                                          ale ve třídě Bojovnik mám také parametr kostka s malým
                                                          písmenem na začátku, viz. druhý zdroják*/

        {
            this.mana = mana;
            maxMana = mana;
            this.magickyUtok = magickyUtok;
        }
    }
}

Konstruktor bojovníka:

namespace Arena2
{
    class Bojovnik
    {
        protected string jmeno;
        protected int zivot;
        protected int maxZivot;
        protected int utok;
        protected int obrana;
        protected Kostka kostka;
        private string zprava;

        public Bojovnik(string jmeno, int zivot, int utok, int obrana, Kostka kostka)
        {
            this.jmeno = jmeno;
            this.zivot = zivot;
            maxZivot = zivot;
            this.utok = utok;
            this.obrana = obrana;
            this.kostka = kostka;
        }

Poradí někdo co mám blbě? Děkuji.

Avatar
Odpovedá na Poggy
Petr Štechmüller:5.3.2017 12:58

Ahoj v tom base

base(jmeno, zivot, obrana, kostka)
//               ^ za tuhle čárku přidej proměnnou utok

Ti chybí předat proměnnou utok

Editované
Odpovedať
Pokud spolu kód a komentář nekorespondují, budou patrně oba chybné
Avatar
Poggy
Člen
Avatar
Odpovedá na Petr Štechmüller
Poggy:5.3.2017 13:07

Děkuji moc, už funguje. :-)
VS mi hlásilo chybu v kostce, ale nevšiml jsem si, že jsem nepředal vše a hledal chybu v kostce. Už jsem tu hlášku pochopil. Díky.

Editované
Avatar
Michal Dvořáček:27.5.2017 15:00

Dobrý den, můžu se prosím zeptat.

private void VypisBojovnika(Bojovnik b)
{
        Console.WriteLine(b);
        Console.Write("Život: ");
        Console.WriteLine(b.GrafickyZivot());
        if (b is Mag)
        {
                Console.Write("Mana:  ");
                Console.WriteLine(((Mag)b).GrafickaMana());
        }
}

Pokud v podmínce zjistíme, že "b" odpovídá mágovi, proč je nutné ho pak přetypovávat?

Avatar
Odpovedá na Michal Dvořáček
Petr Štechmüller:27.5.2017 15:48

Protože třída Bojovnik nezná metodu GrafickaMana. Aby bylo možné tu metodu zavolat, musí se proměnná b přetypovat.

Odpovedať
Pokud spolu kód a komentář nekorespondují, budou patrně oba chybné
Avatar
Ondřej Čech:4.11.2017 11:59

Zdravím, nevím, jestli jste si toho někdo všiml, ale když začne boj, a vypíšou se úvodní informace, tak ještě před vyhodnocením prvního boje má jeden z bojovníků ubraný život. To protože ta pauza(Thread.Sle­ep(500)) se dělá při výpisu zpráv, ale boj jako takový je vyhodnocen ihned?

Posledné komentáre sú na 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 zaloguj. Ak ešte nemáš účet, zaregistruj sa, je to zadarmo.

Zobrazené 10 správy z 138.