Aktuálně: Postihly zákazy tvou profesi? Poptávka po ajťácích prudce roste, využij slevové akce 30% výuky zdarma!
Pouze tento týden sleva až 80 % na e-learning týkající se PHP
PHP týden

Lekce 6 - Java - Aréna s bojovníky

V minulé lekci, Bojovník do arény, jsme si vytvořili třídu bojovníka. Hrací kostku máme hotovou z prvních lekcí objektově orientovaného programování.

Dnes tedy dáme vše dohromady a vytvoříme funkční arénu. Tutoriál bude spíše oddechový a pomůže nám zopakovat si práci s objekty.

Potřebujeme napsat nějaký kód pro obsluhu bojovníků a výpis zpráv uživateli. Samozřejmě ho nebudeme bušit rovnou do výchozího souboru s metodou main(), ale vytvoříme si objekt Arena, kde se bude zápas odehrávat. V main se() potom jen založí objekty a o zbytek se bude starat objekt Arena. Přidejme k projektu tedy poslední třídu a to Arena.java

Třída bude víceméně jednoduchá, jako atributy bude obsahovat 3 potřebné instance: 2 bojovníky a hrací kostku. V konstruktoru se tyto atributy naplní z parametrů. Kód třídy bude tedy následující (komentáře si dopiště):

class Arena {
    private Bojovnik bojovnik1;
    private Bojovnik bojovnik2;
    private Kostka kostka;

    public Arena(Bojovnik bojovnik1, Bojovnik bojovnik2, Kostka kostka) {
        this.bojovnik1 = bojovnik1;
        this.bojovnik2 = bojovnik2;
        this.kostka = kostka;
        }

}

Zamysleme se nad metodami. Z veřejných metod bude určitě potřeba jen ta k simulaci zápasu. Výstup programu na konzoli uděláme trochu na úrovni a také umožníme třídě Arena, aby přímo ke konzoli přistupovala. Rozhodli jsme se, že výpis bude v kompetenci třídy, jelikož se nám to zde vyplatí. Naopak kdyby výpis prováděli i bojovníci, bylo by to na škodu (nebyli by univerzální). Potřebujeme tedy metodu, která vykreslí obrazovku s aktuálními údaji o kole a životy bojovníků. Zprávy o útoku a obraně budeme chtít vypisovat s dramatickou pauzou, aby byl výsledný efekt lepší, uděláme si pro takový typ zprávy ještě pomocnou metodu. Začněme s vykreslením informační obrazovky:

private void vykresli() {
    System.out.println("-------------- Aréna -------------- \n");
    System.out.println("Zdraví bojovníků: \n");
    System.out.printf("%s %s\n", bojovnik1, bojovnik1.grafickyZivot());
    System.out.printf("%s %s\n", bojovnik2, bojovnik2.grafickyZivot());
}

Metoda je privátní, budeme ji používat jen uvnitř třídy.

Tento výukový obsah pomáhají rozvíjet následující firmy, které dost možná hledají právě tebe!

Další privátní metodou bude výpis zprávy s dramatickou pauzou:

private void vypisZpravu(String zprava) {
    System.out.println(zprava);
    try {
            Thread.sleep(500);
        } catch (InterruptedException ex) {
        System.err.println("Chyba, nepovedlo se uspat vlákno");
    }
}

Kód je zřejmý až na třídu Thread, která umožňuje práci s vlákny. My z ní využijeme pouze metodu sleep(), která uspí vlákno programu na daný počet milisekund. S vlákny budeme pracovat až na konci seriálu. Bloky try-catch prozatím nebudeme řešit, nejsou zde důležité a budeme je probírat později, spokojíme se s tím, že jsou zde nutné.

Obě metody vlastně jen vypisují na konzoli, připadá mi zbytečné je zkoušet, přesuneme se tedy již k samotnému zápasu. Metoda zapas() nebude mít žádné parametry a nebude ani nic vracet. Uvnitř bude cyklus, který bude na střídačku volat útoky bojovníků navzájem a vypisovat informační obrazovku a zprávy. Metoda by mohla vypadat takto:

public void zapas() {
    System.out.println("Vítejte v aréně!");
    System.out.printf("Dnes se utkají %s s %s! \n\n", bojovnik1, bojovnik2);
    System.out.println("Zápas může začít...");

    // cyklus s bojem
    while (bojovnik1.nazivu() && bojovnik2.nazivu()) {
        bojovnik1.utoc(bojovnik2);
        vykresli();
        vypisZpravu(bojovnik1.vratPosledniZpravu()); // zpráva o útoku
        vypisZpravu(bojovnik2.vratPosledniZpravu()); // zpráva o obraně
        bojovnik2.utoc(bojovnik1);
        vykresli();
        vypisZpravu(bojovnik2.vratPosledniZpravu()); // zpráva o útoku
        vypisZpravu(bojovnik1.vratPosledniZpravu()); // zpráva o obraně
        System.out.println();
    }
}

Kód vypíše jednoduché informace a po stisku klávesy přejde do cyklu s bojem. Jedná se o while cyklus, který se opakuje, dokud jsou oba bojovníci naživu. První bojovník zaútočí na druhého, jeho útok vnitřně zavolá na druhém bojovníkovi obranu. Po útoku vykreslíme obrazovku s informacemi a dále zprávy o útoku a obraně pomocí naší metody vypisZpravu(), která po výpisu udělá dramatickou pauzu. To samé provedeme i pro druhého bojovníka.

Přesuňme se do TahovyBoj.java, vytvořme patřičné instance a zavolejme na aréně metodu zapas():

    // vytvoření objektů
    Kostka kostka = new Kostka(10);
    Bojovnik zalgoren = new Bojovnik("Zalgoren", 100, 20, 10, kostka);
    Bojovnik shadow = new Bojovnik("Shadow", 60, 18, 15, kostka);
    Arena arena = new Arena(zalgoren, shadow, kostka);
    // zápas
    arena.zapas();
class Bojovnik {
    private String jmeno;
    private int zivot;
    private int maxZivot;
    private int utok;
    private int obrana;
    private Kostka kostka;
    private String zprava;

    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 boolean nazivu() {
    return (zivot > 0);
    }

    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 void utoc(Bojovnik souper) {
    int uder = utok + kostka.hod();
    nastavZpravu(String.format("%s útočí s úderem za %s hp", jmeno, uder));
    souper.branSe(uder);
    }

    public void branSe(int uder) {
    int zraneni = uder - (obrana + kostka.hod());
    if (zraneni > 0) {
        zivot -= zraneni;
        zprava = String.format("%s utrpěl poškození %s hp", jmeno, zraneni);
            if (zivot <= 0) {
            zivot = 0;
            zprava += " a zemřel";
            }

    } else
        zprava = String.format("%s odrazil útok", jmeno);
        nastavZpravu(zprava);
    }

    private void nastavZpravu(String zprava) {
    this.zprava = zprava;
    }

    public String vratPosledniZpravu() {
    return zprava;
    }

    @Override
    public String toString() {
    return jmeno;
    }
}
class Arena {
    private Bojovnik bojovnik1;
    private Bojovnik bojovnik2;
    private Kostka kostka;

    public Arena(Bojovnik bojovnik1, Bojovnik bojovnik2, Kostka kostka) {
    this.bojovnik1 = bojovnik1;
    this.bojovnik2 = bojovnik2;
    this.kostka = kostka;
    }

    private void vykresli() {
    System.out.println("-------------- Aréna -------------- \n");
    System.out.println("Zdraví bojovníků: \n");
    System.out.printf("%s %s\n", bojovnik1, bojovnik1.grafickyZivot());
    System.out.printf("%s %s\n", bojovnik2, bojovnik2.grafickyZivot());
    }

    private void vypisZpravu(String zprava) {
    System.out.println(zprava);
    try {
        Thread.sleep(500);
    } catch (InterruptedException ex) {
        System.err.println("Chyba, nepovedlo se uspat vlákno");
    }
    }

    public void zapas() {
    System.out.println("Vítejte v aréně!");
    System.out.printf("Dnes se utkají %s s %s! \n\n", bojovnik1, bojovnik2);
    System.out.println("Zápas může začít...");

    // cyklus s bojem
    while (bojovnik1.nazivu() && bojovnik2.nazivu()) {
        bojovnik1.utoc(bojovnik2);
        vykresli();
        vypisZpravu(bojovnik1.vratPosledniZpravu()); // zpráva o útoku
        vypisZpravu(bojovnik2.vratPosledniZpravu()); // zpráva o obraně
        bojovnik2.utoc(bojovnik1);
        vykresli();
        vypisZpravu(bojovnik2.vratPosledniZpravu()); // zpráva o útoku
        vypisZpravu(bojovnik1.vratPosledniZpravu()); // zpráva o obraně
        System.out.println();
    }
    }
}

Charakteristiky hrdinů si můžete upravit dle libosti. Program spustíme:

Konzolová aplikace
-------------- Aréna --------------

Zdraví bojovníků:

Zalgoren [######              ]
Shadow [                    ]
Shadow útočí úderem za 20 hp
Zalgoren utrpěl poškození 4 hp

Výsledek je docela působivý. Objekty spolu komunikují, grafický život ubývá jak má, zážitek umocňuje dramatická pauza. Aréna má však 2 nedostatky.

  • V cyklu s bojem útočí první bojovník na druhého. Poté však vždy útočí i druhý bojovník, nehledě na to, zda ho první nezabil. Může tedy útočit již jako mrtvý. Podívejte se na screenshot výše, Shadow útočil jako poslední i když byl mrtvý. Až potom se vystoupilo z while cyklu. U prvního bojovníka tento problém není, u druhého musíme před útokem kontrolovat, zda je naživu.
  • Druhým nedostatkem je, že bojovníci vždy bojují ve stejném pořadí, čili zde "Zalgoren" má vždy výhodu. Pojďme vnést další prvek náhody a pomocí kostky rozhodněme, který z bojovníků bude začínat. Jelikož jsou bojovníci vždy dva, stačí hodit kostkou a podívat se, zda padlo číslo menší nebo rovné polovině počtu stěn kostky. Tedy např. pokud padne na desetistěnné kostce číslo do 5ti, začíná 2. bojovník, jinak začíná první. Zbývá zamyslet se nad tím, jak do kódu zanést prohazování bojovníků. Jistě by bylo velmi nepřehledné opodmínkovat příkazy ve while cyklu. Jelikož již víme, že v Javě fungují reference, není pro nás problém udělat si 2 proměnné, ve kterých budou instance bojovníků, nazvěme je jednoduše b1 a b2. Do těchto proměnných si na začátku dosadíme bojovníky bojovnik1 a bojovnik2 tak, jak potřebujeme. Můžeme tedy při pozitivním hodu kostkou dosadit do b1 bojovník2 a naopak, výsledkem bude, že začínat bude ten druhý. Kód cyklu se takto vůbec nezmění a zůstane stále přehledný a jednoduchý, jen místo bojovnik bude b.

Změněná verze včetně podmínky, aby nemohl útočit mrtvý bojovník, by mohla vypadat nějak takto:

    public void zapas() {
    // původní pořadí
    Bojovnik b1 = bojovnik1;
    Bojovnik b2 = bojovnik2;
    System.out.println("Vítejte v aréně!");
    System.out.printf("Dnes se utkají %s s %s! \n\n", bojovnik1, bojovnik2);
    // prohození bojovníků
    boolean zacinaBojovnik2 = (kostka.hod() <= kostka.vratPocetSten() / 2);
    if (zacinaBojovnik2) {
        b1 = bojovnik2;
        b2 = bojovnik1;
    }
    System.out.printf("Začínat bude bojovník %s! \n\nZápas může začít...", b1);

    // cyklus s bojem
    while (b1.nazivu() && b2.nazivu()) {
        b1.utoc(b2);
        vykresli();
        vypisZpravu(b1.vratPosledniZpravu()); // zpráva o útoku
        vypisZpravu(b2.vratPosledniZpravu()); // zpráva o obraně
        if (b2.nazivu()) {
        b2.utoc(b1);
        vykresli();
        vypisZpravu(b2.vratPosledniZpravu()); // zpráva o útoku
        vypisZpravu(b1.vratPosledniZpravu()); // zpráva o obraně
        }
        System.out.println();
    }
    }
import java.util.Random;

public class Kostka {

    private Random random;
    private int pocetSten;

    public Kostka() {
    pocetSten = 6;
    random = new Random();
    }

    public Kostka(int pocetSten) {
    this.pocetSten = pocetSten;
    random = new Random();
    }

    public int vratPocetSten() {
    return pocetSten;
    }

    public int hod() {
    return random.nextInt(pocetSten) + 1;
    }

    @Override
    public String toString() {
    return String.format("Kostka s %s stěnami", pocetSten);
    }
}
class Bojovnik {
    private String jmeno;
    private int zivot;
    private int maxZivot;
    private int utok;
    private int obrana;
    private Kostka kostka;
    private String zprava;

    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 boolean nazivu() {
    return (zivot > 0);
    }

    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 void utoc(Bojovnik souper) {
    int uder = utok + kostka.hod();
    nastavZpravu(String.format("%s útočí s úderem za %s hp", jmeno, uder));
    souper.branSe(uder);
    }

    public void branSe(int uder) {
    int zraneni = uder - (obrana + kostka.hod());
    if (zraneni > 0) {
        zivot -= zraneni;
        zprava = String.format("%s utrpěl poškození %s hp", jmeno, zraneni);
        if (zivot <= 0) {
        zivot = 0;
        zprava += " a zemřel";
        }

    } else
        zprava = String.format("%s odrazil útok", jmeno);
        nastavZpravu(zprava);
    }

    private void nastavZpravu(String zprava) {
     this.zprava = zprava;
    }

    public String vratPosledniZpravu() {
    return zprava;
    }

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

Program vyzkoušejme.

Konzolová aplikace
-------------- Aréna --------------

Zdraví bojovníků:

Zalgoren [#########           ]
Shadow [                    ]
Zalgoren útočí úderem za 27 hp
Shadow utrpěl poškození 11 hp a zemřel

Vidíme, že je vše již v pořádku. Gratuluji vám, pokud jste se dostali až sem a tutoriály opravdu četli a pochopili, máte základy objektového programování a dokážete tvořit rozumné aplikace :)

V příští lekci, Dědičnost a polymorfismus, se podíváme na objektově orientované programování podrobněji. V úvodu jsme si říkali, že OOP stojí na pilířích: zapouzdření, dědičnost a polymorfismus. První umíme již velmi dobře a modifikátor private je nám známý. Další dva nás čekají příště.


 

Měla jsi s čímkoli problém? Stáhni si vzorovou aplikaci níže a porovnej ji se svým projektem, chybu tak snadno najdeš.

Stáhnout

Stažením následujícího souboru souhlasíš s licenčními podmínkami

Staženo 901x (27.78 kB)
Aplikace je včetně zdrojových kódů v jazyce java

 

Předchozí článek
Bojovník do arény
Všechny články v sekci
Objektově orientované programování v Javě
Článek pro vás napsal David Čápka
Avatar
Jak se ti líbí článek?
41 hlasů
David je zakladatelem ITnetwork a programování se profesionálně věnuje 13 let. Má rád Nirvanu, sushi a svobodu podnikání.
Unicorn university David se informační technologie naučil na Unicorn University - prestižní soukromé vysoké škole IT a ekonomie.
Aktivity (13)

 

 

Komentáře

Avatar
jiri.korejtko:2.4.2013 9:14

Parádní tutoriál, jednoduše popsaný a srozumitelný kod :-)

Odpovědět
2.4.2013 9:14
Minulost je minulost, tak proto žij přítomností
Avatar
lukas.klm94
Člen
Avatar
lukas.klm94:16.4.2013 21:24

Opravdu super. Díky!:)

 
Odpovědět
16.4.2013 21:24
Avatar
honza86
Člen
Avatar
honza86:26.12.2013 7:30

nemá to chybu. Díky moc

 
Odpovědět
26.12.2013 7:30
Avatar
vfsdfsdfdsf
Člen
Avatar
vfsdfsdfdsf:11.1.2014 21:03

Parádička :D Udělal jsem si tam ještě kritické zásahy a další drobné úpravy :)
Mockrát díky za tutorial :)

Editováno 11.1.2014 21:04
 
Odpovědět
11.1.2014 21:03
Avatar
lazenska.wewerka:13.5.2014 16:30

Zdravím všechny! Tutorial jsem projel poctivě až sem, ale nikde jsem se nedočetl, jak napsat kód, kterýn by uživateli umožnil zadat data, se kterými bude možné pracovat i při dalším spuštění programu. Např.: jména uživatelů, hesla,... Poradí někdo? Nebo věnuje se tomu nějaká část tutoriálu? Díky za rady:-)

 
Odpovědět
13.5.2014 16:30
Avatar
Odpovědět
13.5.2014 16:33
2x piš, jednou debuguj
Avatar
lazenska.wewerka:13.5.2014 16:41

AAAAAha. Tak sem jsem se ještě nedopracoval. Díky:-)

 
Odpovědět
13.5.2014 16:41
Avatar
tomas
Člen
Avatar
tomas:4.9.2014 12:16

Super :), jednoduché a všetko do seba pekne zapadá a síce som to ako tak pochopil sámeho by ma to takto nenapadlo (kedže mam talent robit všetko zložitejšie)

 
Odpovědět
4.9.2014 12:16
Avatar
hrebavka
Člen
Avatar
hrebavka:18.11.2014 18:13

Omlouvám se jestli se opakuji, ale nejsem si jistý jestli byl můj dotaz
odeslán. Byla tam velká pochvala a dík za tutoriál. A dotaz jestli by
nebylo lepší dát volbu který bojovník začne až do cyklu while? Na začátku
boje se sice vybere kdo začne, ale potom se to už nemění. Ještě jednou dík.

 
Odpovědět
18.11.2014 18:13
Avatar
Odpovídá na hrebavka
Michal Haňáček:18.11.2014 18:34

Ahoj,
je v podstatě na tobě jaká pravidla si uděláš, taková je máš. Ale asi by bylo přirozenější co říkáš - tedy že by se v každém kole zvolil začínající bojovník.

Odpovědět
18.11.2014 18:34
Každé rozhodnutí a každý krok v životě nás někam posune. Bohužel jen některé nás posouvají dopředu.
Avatar
Roman
Člen
Avatar
Roman:25.6.2015 17:34

Servus
Perfektný tutorial, stránku síce sledujem už dlhšie ale zaregistrovať sa sem ma napadlo až oveľa neskôr aj keď sa to sem nehodí len by som chcel povedať: som rád, že existujú ľudia čo si dali námahu s týmto všetkým "pod tým samozrejme myslím celú stránku nie len program :)" klobúk dole a dúfam že to vydrží aj tak naďalej prajem len veľa úspechov :)

 
Odpovědět
25.6.2015 17:34
Avatar
Marek
Člen
Avatar
Marek:25.7.2015 1:14

Užasný tutoriál chvílema jsem sice an něj nadával tos e přiznávám :D seděl sjem u toho jak mamut a koukal se na to a přemýšlel co je špatně sakra. Pak jsem se dohnal k tomu že jsem to začal dokonce porovnávat řádek po řádku :D ,ale pak jsem na to konečně přišel chyběla tam někde nějaká čárka a odrazník. Bylo to jen mou únavou. Díky za vaši stránku je super :)

Odpovědět
25.7.2015 1:14
Nekecej a programuj
Avatar
Lubor Pešek
Člen
Avatar
Odpovídá na Michal Haňáček
Lubor Pešek:12.1.2016 13:49

Nazdar
chtěl jsem reagovat před měsícem, ale teď jsem měl své problémy, tak ti to píšu až včil:)

ten kód by vypadal asi takto:

private void zapas() {
        while (ncferrari.isNazivu() && ferrarie.isNazivu()) {
            vypis("\n\n*************************" + cisloKola + ". kolo" + "**************************");
            vypis("             NA ŘADĚ JE " + hracNaRade);
            hracNaRade.utoc(protivnik);
            vypis(hracNaRade.getMessage());
            vypis(protivnik.getMessage());
            ukazkaZdravi();
            prehodHrace();
            cisloKola++;
        }
    }

a pochopitelně to potřebuje definovat zmíněnou metodu prehodHrace:

private void prehodHrace() {
        if (hracNaRade == ncferrari) {
            hracNaRade = ferrarie;
            protivnik = ncferrari;
        } else {
            hracNaRade = ncferrari;
            protivnik = ferrarie;
        }
    }

PS1: je to jen ukázka dvou metod, které vyžadují další deklarace druhých metod a atributů. Samostatně vám fungovat nebudou - to pro ty, kteří kopírují cizí kódy na zkoušku k sobě do nových projektů (i já to dělávám:D)

PS2: ncferari a ferrari jsou bojovníci, ale já si je tak pojmenoval:) jsou to moje názvy postav z wowka:)

Odpovědět
12.1.2016 13:49
Existují dva způsoby, jak vyřešit problém. Za prvé vyhoďte počítač z okna. Za druhé vyhoďte okna z počítače.
Avatar
Lubor Pešek
Člen
Avatar
Lubor Pešek:12.1.2016 13:56

vypis() je to samé, jako v ukázkovém příkladu vypisZpravu()
ukazkaZdravi() je to samé, jako v ukázkovém příkladu vykresli()
getMessage je to samé, jako v ukázkovém příkladu vratPosledniZ­pravu(), ale já osobně už neumím používat slovíčka vrat, dej, navrat, nastav, udelej apod:) prostě settry a gettry a když to jde, tak v angličtině

atribut cisloKola je moje číslování kol, aby to bylo přehlednější
hracNaRade je další atribut, který v sobě uchovává referenci na hráče, který splní podmínku v metodě prehodHrace()

Odpovědět
12.1.2016 13:56
Existují dva způsoby, jak vyřešit problém. Za prvé vyhoďte počítač z okna. Za druhé vyhoďte okna z počítače.
Avatar
Hans Deutscher:11.2.2016 21:23

Chtěl bych moc poděkovat za tento i všechny ostatní tutoriály! Jsem začátečník v programování, ale hrozně se mi to líbí a hrozně mě to baví. Kdyby se mi podařilo se tím jednou živit, byl bych moc rád.
Každopádně jsi mi zase ukázal nové způsoby, techniky a metody, za což ti moc děkuji. Vše jsem perfektně pochopil a vše funguje hladce a bez problémů.

 
Odpovědět
11.2.2016 21:23
Avatar
Vít Pelc
Člen
Avatar
Vít Pelc:12.3.2016 22:27

Díky moc za tutoriál... jen bych chtěl nahlásit jeden menší problém. Když si dám vypsat grafický život, tak mi při plném zdraví vypíše buď jenom jeden "#" a nebo nevypíše žádný. Kód mám přesně podle vzoru (viz. tutoriál). Prosím poraďte, co s tím?

 
Odpovědět
12.3.2016 22:27
Avatar
Honza Novotný:27.7.2016 12:36

Ahoj, v textu se píše "Kód vypíše jednoduché informace a po stisku klávesy přejde do cyklu s bojem." Po stisku klávesy? Takto napsaný kód pokračuje a na stisk klávesy nečeká. Něco jsem přehlídl? Respektive jak se dá udělat, aby se program pozastavil a počkal na stisk klávesy?

 
Odpovědět
27.7.2016 12:36
Avatar
pocitac770
Redaktor
Avatar
Odpovídá na Honza Novotný
pocitac770:16.8.2016 21:17

Je to text okopírovaný z tutoriálu pro C#, tam to opravdu je..

Console.WriteLine("Vítejte v aréně!");
Console.WriteLine("Dnes se utkají {0} s {1}! \n", bojovnik1, bojovnik2);
Console.WriteLine("Zápas může začít...");
Console.ReadKey(); /* zde je ono čekání na klávesu */
// cyklus s bojem
while (bojovnik1.Nazivu() && bojovnik2.Nazivu())
.....

Bohužel Java toto pro základní konzoli nemá (tedy alespoň co vím), takže tato funkcionalita byla z programu odebrána, ale nějak se na to v textu zapomnělo.

Editováno 16.8.2016 21:19
 
Odpovědět
16.8.2016 21:17
Avatar
pocitac770
Redaktor
Avatar
pocitac770:16.8.2016 21:23

Jediné, co mě napadá jako náhrada je prázdné načtení řádku z konzole, ale to musíš použít enter (takže náhrada by mohla být "zmáčkněte enter pro pokračování"), s tím, že by jsi klasicky přidal do kódu řádky

System.out.println("Zmáčkněte ENTER pro pokračování");
new Scanner(System.in).nextLine();
 
Odpovědět
16.8.2016 21:23
Tento výukový obsah pomáhají rozvíjet následující firmy, které dost možná hledají právě tebe!
Avatar
Odpovídá na pocitac770
Honza Novotný:30.8.2016 17:06

Dík, asi to tak vyřeším :)

 
Odpovědět
30.8.2016 17:06
Avatar
Lesní Muž
Člen
Avatar
Lesní Muž:26.12.2016 20:07

Děkuji za tutoriál, mistře!

 
Odpovědět
26.12.2016 20:07
Avatar
Petr Vít
Člen
Avatar
Petr Vít:3.2.2017 8:30

Tak jsem napsal kod a program beha tak jak ma. .. Jedne veci ale nerozumim.
U bojovnika v tride TahovySouboj predavame parametry( jmeno,utok,obra­na,maxzivot,"kos­tka")
Proc predaveme kostku kdyz s ni potom bojovnik vubec nepracuje ?
Pracuje s ni v utoku a obrane ale tam se vola kostka.hod();
To znamena ze se vola primo z tridy Kostka metoda hod... Nikde jsem nenasel duvod proc se bojovnikum predava prave parametr kostka..
Diky za vysvetleni

 
Odpovědět
3.2.2017 8:30
Avatar
vajkuba1234
Člen
Avatar
Odpovídá na Petr Vít
vajkuba1234:3.2.2017 8:48

Mohl bys prosimte poslat link na tu tridu, at to nemusim cele procitat?

Odpovědět
3.2.2017 8:48
No hope, no future, JUST WAR! For world peace Israel must be DESTROYED!
Avatar
Petr Štechmüller
Překladatel
Avatar
Odpovídá na Petr Vít
Petr Štechmüller:3.2.2017 9:26

Ahoj, vždyť tu kostku používá právě v metodě utoc a branSe.

public void utoc(Bojovnik souper)
{
        int uder = utok + kostka.hod(); // Tady používá tu kostku, kterou dostane v konstruktoru
        nastavZpravu(String.format("%s útočí s úderem za %s hp", jmeno, uder));
        souper.branSe(uder);
}
Odpovědět
3.2.2017 9:26
Pokud spolu kód a komentář nekorespondují, budou patrně oba chybné
Avatar
Radka Jánská:26.2.2018 23:44

Ahoj! Tak jsem si říkala, nebylo by logičtější, aby se začínající bojovník vybíral po každém střetu? Tím myslím v cyklu while na začátku ... přijde mi, že to víc odpovídá realitě. Co myslíte?

 
Odpovědět
26.2.2018 23:44
Avatar
MiroslavP
Člen
Avatar
MiroslavP:6.6.2018 21:31

OOP zatím těžce vstřebavám. Je to zajímavý způsob přemýšlení. Díky tutoriálu mám pocit, že se mi sem otevřelo okénko. Děkuji M

 
Odpovědět
6.6.2018 21:31
Avatar
Petr Čech
Redaktor
Avatar
Odpovídá na MiroslavP
Petr Čech:7.6.2018 13:02

Ono to stojí za to vstřebat

Odpovědět
7.6.2018 13:02
the cake is a lie
Avatar
Matyáš Máslík:9.8.2018 17:55

Perfektní tutoriály :-) Dříve jsem se z ITnetwork učil PHP, ale moc jsem to nepobíral a ani mi nesedlo. Tohle jde do hlavy krásně :-D

 
Odpovědět
9.8.2018 17:55
Avatar
zelatko
Člen
Avatar
zelatko:12.9.2018 16:09

Díky za tutor!!!
Jen jsem si všiml, že po prvním bojovníkovi automaticky utočí bojovník2. Chtělo by to ošetřit případ, kdy bojovnik1 odrovná bojovníka2, aby pak neútočil ze záhrobí :D

 
Odpovědět
12.9.2018 16:09
Avatar
David Čápka
Tým ITnetwork
Avatar
Odpovídá na zelatko
David Čápka:12.9.2018 16:26

Když ten článek dočteš, tak zjistíš, že se to tam řeší :)

Odpovědět
12.9.2018 16:26
Jsem moc rád, že jsi na síti, a přeji ti top IT kariéru, ať jako zaměstnanec nebo podnikatel. Máš na to! :)
Avatar
Jozef Tomašec:17.2.2019 21:12

Ahoj. Program behá ako má, ako tak to asi aj chápem, ale ani zďaleka nemôžem súhlasiť s tvrením na konci: **"Gratuluji vám, pokud jste se dostali až sem a tutoriály opravdu četli a pochopili, máte základy objektového programování a dokážete tvořit rozumné aplikace" **
;-)

 
Odpovědět
17.2.2019 21:12
Avatar
Petr Hošek
Člen
Avatar
Petr Hošek:6.8.2019 22:48

Super tutorial:)

 
Odpovědět
6.8.2019 22:48
Avatar
Michal Richter:12.9.2019 16:33

Perfektní příklad na pochopení a rozvíjení, moc děkuji.
Určitě si přidám rozhodování kdo začne před každým kolem.
Přidal jsem si možnost vlastního pojmenování bojovníků.
Při výpisu se mi nelíbilo grafické zarovnání průběžných výsledků. Proto jsem si přidal za kratší jméno mezery do délky jména delšího.

Scanner sc = new Scanner(System.in, "Windows-1250");
System.out.printf("Zadej jméno bojovníka 1:");
String jmeno1 = sc.nextLine();
System.out.printf("Zadej jméno bojovníka 2:");
String jmeno2 = sc.nextLine();
int delka = Math.abs(jmeno1.length() - jmeno2.length());
String mezery = "";
for (int i = 0; i < delka; i++) {
        mezery += " ";
}
if(jmeno1.length() > jmeno2.length()){
    jmeno2 = jmeno2 + mezery;
} else {
    jmeno1 = jmeno1 + mezery;
}

Dotaz: Nešlo by to nějak jednodušeji? Např. jmeno + 3x mezera?
A ještě jeden dotaz: jak tímto jménem pojmenovat zakládaný objekt (zalgoren)?

Bojovnik zalgoren = new Bojovnik(jmeno1, 100, 20, 10, kostka);
 
Odpovědět
12.9.2019 16:33
Avatar
Pavel Javorek:22.5.2020 20:55

Výborný tutoriál, moc děkuju
Akorát mám dotaz, když například v metodě vykresli použiji:

System.out.printf("%s %s\n", bojovnik1, bojovnik1.grafickyZivot());

Jak se pozná (a ve které fázi překladu) že za první %s se doplní právě jméno bojovníka?
Přijde mi že v argumentech formátu mám pouze referenci na objekt bojovnik, bez nějakého určení že má použít právě bojovnik1.jmeno?

 
Odpovědět
22.5.2020 20:55
Avatar
Odpovídá na Pavel Javorek
Matúš Olejník:22.5.2020 21:11

Ahoj keď tam nepošleš priamo String objekt tak sa použije metóda toString() na tom objekte, ktorú si implementoval v predchádzajúcej lekcii, a práve v nej keď pozrieš sa vracia meno bojovníka.

Odpovědět
22.5.2020 21:11
/* I am not sure why this works but it fixes the problem */
Avatar
Odpovídá na Matúš Olejník
Pavel Javorek:23.5.2020 9:04

Super, děkuji za rychlou odpověď :)

 
Odpovědět
23.5.2020 9:04
Avatar
Jenifer Bartůšková:6. března 15:21

Díky moc za skvělý tutoriál! Musím říct, že se pomalu začínám do OOP dostávat a všechno to už dává větší smysl. Smekám před autorem, že dokáže i po tolika letech praxe a přemýšlení na úplně jiné úrovni, nováčkům naservírovat vše tak, aby to bylo pro ně smysluplné :-) Didaktická transformace na jedničku! :-)

Odpovědět
6. března 15:21
"Řekni mi, já to zapomenu. Ukaž mi, možná si to zapamatuji. Nech mě, zkusit si to a já to pochopím."
Avatar
Lubor Pešek
Člen
Avatar
Lubor Pešek:17. března 13:49

:D
Když se nad tím člověk trošku zamyslí, tak tato věta je zajímavá :D

Bloky try-catch prozatím nebudeme řešit, nejsou zde důležité a budeme je probírat později, spokojíme se s tím, že jsou zde nutné .

člověk samozřejmě v kontextu pochopí, jak je to míněno, ale zní to zajímavě, ne?:D

Editováno 17. března 13:50
Odpovědět
17. března 13:49
Existují dva způsoby, jak vyřešit problém. Za prvé vyhoďte počítač z okna. Za druhé vyhoďte okna z počítače.
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 38 zpráv z 38.