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 – 7. diel - Bojovník do arény

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
Erik Báča
Člen
Avatar
Erik Báča:7.3.2016 21:42

Nenapadá tu někoho, proč mi ho to vždycky zabije? nemůžu na to přijít :/

package Game;

public class Bojovnik {

        private String jmeno;
        private int zivot;
        private int maxzivot;
        private int utok;
        private int obrana;
        private Kostka kostka;

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

        public void branSe(int uder)
        {
                int zraneni = uder - (obrana + kostka.hod());
                if (zraneni > 0)
                {
                        zivot -= zraneni;
                        if (zivot <= 0);
                        {
                                zivot = 0;
                        }
                }
        }

        public void utoc(Bojovnik souper)
        {
                int uder = utok + kostka.hod();
                souper.branSe(uder);
        }

        public String grafickyZivot()
        {
                String s = "[";
                int celkem = 20;
                double pocet = Math.round(((double)zivot / maxzivot) * celkem);
                if ((pocet == 0) && (nazivu()))
                                pocet = 1;
                for (int i = 0; i < pocet; i++)
                        s += "#";
                for (int i = 0; i < celkem - pocet; i++)
                        s += " ";
                s += "]";
                return s;
        }

        public boolean nazivu()
        {
                return (zivot > 0);
        }

        @Override
        public String toString()
        {
                return jmeno;
        }

        public static void main(String[] args) {
                Kostka kostka = new Kostka(10);
                Bojovnik bojovnik = new Bojovnik("Zalgoren", 100, 20, 10, kostka);

                System.out.printf("Bojovník: %s\n", bojovnik); // test toString();
                System.out.printf("Naživu: %s\n", bojovnik.nazivu()); // test Nazivu();
                System.out.printf("Život: %s\n", bojovnik.grafickyZivot()); // test GrafickyZivot();

                bojovnik.utoc(bojovnik); // test útoku
                System.out.printf("Život po útoku: %s\n", bojovnik.grafickyZivot());
        }

}
Odpovedať
Když mi dáš mínus, napiš proč!
Avatar
pocitac770
Tvůrce
Avatar
Odpovedá na Erik Báča
pocitac770:8.3.2016 12:36
if (zivot <= 0);
    {
        zivot = 0;
    }

Za if se středník nepíše, tady způsobil, že se vynulování prpvede vždy

Avatar
David Novák
Tvůrce
Avatar
Odpovedá na pocitac770
David Novák:8.3.2016 13:14

Jen bych doplnil - středník znamená konec příkazu. if (..) {..} je příkaz větvení. Když hned za podmínku dáš středník, tak je to vlastně prázdný příkaz a kód se pak dá přepsat třeba takto:

if (zivot <= 0)
{

}

{
    zivot = 0;
}

Tedy zivot = 0 se provede vždy, nezávisle na podmínce :)

Odpovedať
Chyba je mezi klávesnicí a židlí.
Avatar
Erik Báča
Člen
Avatar
Odpovedá na David Novák
Erik Báča:8.3.2016 15:32

Díky, já to samozřejmě vím, byla to chyba z nepozornosti, ale ani za nic jsem ji nenašel... :D

Odpovedať
Když mi dáš mínus, napiš proč!
Avatar
pocitac770
Tvůrce
Avatar
Odpovedá na Erik Báča
pocitac770:8.3.2016 15:55

Když se něco takového příště stane, tak můžeš zkusit debug (nechápu, jak jsem bez toho mohl žít... :D )
Pokud nevíš, jak se používá, tak si to můžeš nahradit tím, že v nějakých kritických častech kódu si vypisuješ, kde se změní ona hodnota na tu divnou (například že máš najednou 0 životů... Kdepak jsme to přepisovali?).. Tím pak najdeš chybný řádek a vše jednoduše vyřešíš. Jak jsem již zmínil, debug to zlehčuje :)

Editované
Avatar
jan valenta
Člen
Avatar
jan valenta:10.9.2016 16:16

Zdravím, dlouho jsem si lámal hlavu s kouskem nastavováním zpráv a chtěl bych se zeptat, proč je zde toto:

nastavZpravu(Strin­g.format("%s útočí s úderem za %s hp", jmeno, uder));
...
private void nastavZpravu(String zprava)
{
this.zprava = zprava;
}

když vůbec nepotřebuji funkci nastavZpravu. V článku to autor vlastně využívá jen k tomu, že zprávu přiřazuje sama sobě, nijak to nemění přístup k ní (stále je private), ani výstup programu. Pokud se nastavZpravu odstrani a dá se místo ní jen zpráva = , vše funguje úplně stejně:

zprava = (String.format("%s útočí s úderem za %s hp", jmeno, uder));

nevíte někdo, co mi na tom uniklo?

Avatar
pocitac770
Tvůrce
Avatar
Odpovedá na jan valenta
pocitac770:10.9.2016 16:22

Víceméně ti neuniklo nic. Ta metoda je tam jenom proto, aby vás to naučilo spíše přistupovat k atributům přes metody, ve kterých si vy případně dodatečnou funkcionalitu (metoda nebude zajišťovat jenom nastavení zprávy, ale třeba nějakou zpětnou kontrolu něčeho, teď mě nic smysluplného nenapadá :D ). Ten hlavní důvod je ale takové pasivní zažití se do používání getterů a setterů, jejihž správné použití a taktéž trochu květnatější vysvětlení mé odpovědi se dozvíš v pozdější (10.) lekci

Editované
Avatar
Roman Duchoň:25.9.2016 18:01

No já nevím, snad na to nedoplatím, ale jel jsem si víc podle sebe.
Grafické zobrazení život mi přišlo prozatím zbytečné, takže:

@Override
 public String toString()    {
     return jmeno +" HP:" + hp + "/" + hpmax;
 }

Nevím, zda konkrétní boj vychází z nějaké deskové hry, ale mnohem více reálné mi přišlo (náhodné číslo z (konstanty útoku) * (hod kostkou 1 -10)):

    public void utoc(Bojovnik obet)  {
        this.uder = utok * kostka.hod();
        this.branit = obet.obrana * obet.kostka.hod();
        zraneni = uder - branit;
// A dál samozřejmě podmínky pro práci se životem...

Takže výsledný boj probíhá tímto:

roman.utoc(souper);

Také doufám, že mi ty náhody dělají co mají. :) Ale simulace je taková nahodilá, tak snad jo.
Každopádně... návod zas moc fajn, snad na tu individualitu nedoplatím v dalším díle. :)

Avatar
Craftmanek
Člen
Avatar
Craftmanek:19.1.2017 20:43
package tahovyboj;
public class Bojovnik {
    private String jmeno;
    private int maxZivot;
    private int zivot;
    private int utok;
    private int obrana;
    private Kostka kostka;
    public Bojovnik (String jmeno, int zivot, int utok, int obrana, Kostka kostka){
        this.jmeno = jmeno;
        this.maxZivot=maxZivot;
        this.zivot=zivot;
        this.utok=utok;
        this.obrana=obrana;
        this.kostka=kostka;
    }
    @Override
    public String toString(){
        return jmeno;
    }
    public boolean nazivu(){
        if (zivot>0){
            return true;
        }
        else{
            return false;
        }
    }
    public String grafickyZivot(){
        String s = "[";
        int celkem = 20;
        double pocet = Math.round(((double)zivot / maxZivot) * celkem);
        if ((pocet == 0) && (nazivu()))
                pocet = 1;
        for (int i = 0; i < pocet; i++)
                s += "#";
        for (int i = 0; i < celkem - pocet; i++)
            s += " ";
        s += "]";
        return s;
    }
}

Nenapadá někoho proč se mi vše vypíše, jen ne ten grafickyUtok() ? Todle mi potom vyjede...

run:
Bojovnik: Zalgoren
Naživu: true
Odpovedať
Ten, kdo chce umět, ale neumí.
Avatar
Petr Vít
Člen
Avatar
Petr Vít:31.1.2017 6:22

Otazka:

double pocet = Math.round(((double)zivot/maxZivot)*celkem);

proc tam je ten druhy double v zavorkach ? ..Zjistil jsem ze bez neho mi to nepocita spravne.
Ale proc tam je a co dela, jsem se nedozvedel, a v clanku to vysvetleno take neni.
Diky

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