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

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
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());
        }

}
Odpovědět
7.3.2016 21:42
Když mi dáš mínus, napiš proč!
Avatar
pocitac770
Tvůrce
Avatar
Odpovídá 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

 
Odpovědět
8.3.2016 12:36
Avatar
David Novák
Tvůrce
Avatar
Odpovídá 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 :)

Odpovědět
8.3.2016 13:14
Chyba je mezi klávesnicí a židlí.
Avatar
Erik Báča
Člen
Avatar
Odpovídá 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

Odpovědět
8.3.2016 15:32
Když mi dáš mínus, napiš proč!
Avatar
pocitac770
Tvůrce
Avatar
Odpovídá 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 :)

Editováno 8.3.2016 15:57
 
Odpovědět
8.3.2016 15:55
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?

 
Odpovědět
10.9.2016 16:16
Avatar
pocitac770
Tvůrce
Avatar
Odpovídá 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

Editováno 10.9.2016 16:22
 
Odpovědět
10.9.2016 16:22
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. :)

Odpovědět
25.9.2016 18:01
RD
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
Odpovědět
19.1.2017 20:43
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

 
Odpovědět
31.1.2017 6:22
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 71.