6. diel - Java - Aréna s bojovníkmi
V minulej lekcii, Bojovník do arény , sme si vytvorili triedu bojovníka. Hraciu kocku máme hotovú z prvých lekcií objektovo orientovaného programovania.
Dnes teda dáme všetko dohromady a vytvoríme funkčnú arénu. Tutoriál bude skôr oddychový a pomôže nám zopakovať si prácu s objektmi.
Potrebujeme napísať nejaký kód na obsluhu bojovníkov a výpis správ
užívateľovi. Samozrejme ho nebudeme búšiť rovno do východzieho súboru s
metódou main()
, ale vytvoríme si objekt Arena, kde sa bude zápas
odohrávať. V metóde main()
sa potom len založia objekty ao
zvyšok sa bude starať objekt Arena
. Pridajme k projektu teda
poslednú triedu Arena
.
Trieda bude viac-menej jednoduchá, ako atribúty bude obsahovať 3 potrebné inštancie: 2 bojovníkov a hraciu kocku. V konštruktore sa tieto atribúty naplnia z parametrov. Kód triedy bude teda nasledujúci (komentáre si dopíšte):
Zamyslime sa nad metódami. Z
verejných metód bude určite potrebná len tá na simuláciu zápasu. Výstup
programu na konzole urobíme trochu na úrovni a tiež umožníme triede
Arena
, aby priamo ku konzole pristupovala. Rozhodli sme sa, že
výpis bude v kompetencii triedy, pretože sa nám to tu oplatí. Naopak keby
výpis vykonávali aj bojovníci, bolo by to na škodu (neboli by univerzálne).
Potrebujeme teda metódu, ktorá vykreslí obrazovku s aktuálnymi údajmi o
bicykli a životmi bojovníkov. Správy o útoku a obrane budeme chcieť
vypisovať s dramatickou pauzou, aby bol výsledný efekt lepší, urobíme si
pre takýto typ správy ešte pomocnú metódu. Začnime s vykreslením
informačnej obrazovky:
Metóda
vykresli()
je privátna, budeme ju používať len vo vnútri
triedy.
Ďalšou privátnou metódou bude výpis správy s dramatickou pauzou:
Kód je zrejmý až na triedu
Thread
, ktorá umožňuje prácu s vláknami. My z nej využijeme
iba metódu sleep()
, ktorá uspí vlákno programu na daný počet
milisekúnd. S vláknami budeme pracovať až na konci seriálu. Bloky
try-catch
zatiaľ nebudeme riešiť, nie sú tu dôležité a
budeme ich preberať neskôr, uspokojíme sa s tým, že sú tu nutné.
Obe metódy vlastne len vypisujú na konzole, pripadá mi zbytočné ich
skúšať, presunieme sa teda už k samotnému zápasu. Metóda
zapas()
nebude mať žiadne parametre a nebude ani nič vracať.
Vnútri bude cyklus, ktorý bude na striedačku volať útoky bojovníkov
navzájom a vypisovať informačnú obrazovku a správy. Metóda by mohla
vyzerať takto:
Kód vypíše jednoduché
informácie a po stlačení klávesy prejde do cyklu s bojom. Ide o cyklus
while
, ktorý sa opakuje, kým sú obaja bojovníci nažive.
Prvý bojovník zaútočí na druhého, jeho útok vnútorne zavolá na
druhom bojovníkovi obranu. Po útoku vykreslíme obrazovku s informáciami a
ďalej správy o útoku a obrane pomocou našej metódy
vypisZpravu()
, ktorá po výpise urobí dramatickú pauzu. To isté
urobíme aj pre druhého bojovníka.
Presuňme sa do súboru TahovyBoj.java
, vytvorme patričné
inštancie a zavolajme na aréne metódu zapas()
:
Charakteristiky hrdinov si môžete upraviť podľa ľubovôle. Program spustíme:
Výsledok je celkom pôsobivý. Objekty spolu komunikujú, grafický život ubúda ako má, zážitok umocňuje dramatická pauza. Aréna má však 2 nedostatky.
- V cykle s bojom útočí prvý bojovník na druhého. Potom však vždy
útočí aj druhý bojovník, nehľadiac na to, či ho prvý nezabil. Môže
teda útočiť už ako mŕtvy. Pozrite sa na výstup vyššie, Shadow útočil
ako posledný aj keď bol mŕtvy. Až potom sa vystúpilo z cyklu
while
. U prvého bojovníka tento problém nie je, u druhého musíme pred útokom kontrolovať, či je nažive. - Druhým nedostatkom je, že bojovníci vždy bojujú v rovnakom poradí,
čiže tu
Zalgoren
má vždy výhodu. Poďme vniesť ďalší prvok náhody a pomocou kocky rozhodneme, ktorý z bojovníkov bude začínať. Keďže sú bojovníci vždy dvaja, stačí hodiť kockou a pozrieť sa, či padlo číslo menšie alebo rovné polovici počtu stien kocky. Teda napr. pokiaľ padne na desaťstennej kocke číslo do 5, začína 2. bojovník, inak začína prvý. Zostáva zamyslieť sa nad tým, ako do kódu zaniesť prehadzovanie bojovníkov. Iste by bolo veľmi neprehľadné opodmienkovať príkazy vo while cykle. Keďže už vieme, že v Jave fungujú referencie, nie je pre nás problém urobiť si dve premenné, v ktorých budú inštancie bojovníkov, nazvime ich jednoducho rovnako ako atribúty, tedabojovnikA
abojovnikB
. Do týchto premenných si na začiatku dosadíme bojovníkov z atribútovthis.bojovnikA
athis.bojovnikB
tak, ako potrebujeme. Môžeme teda pri pozitívnom hode kockou dosadiť do premennejbojovnikA
premennúthis.bojovnikB
a naopak, výsledkom bude, že začínať bude ten druhý. Kód cyklu sa takto vôbec nezmení a zostane stále prehľadný a jednoduchý.
Program vyskúšajme:
Vidíme, že všetko je už v poriadku. Gratulujem vám, ak ste sa dostali až sem a tutoriály naozaj čítali a pochopili, máte základy objektového programovania a dokážete tvoriť rozumné aplikácie:)
V budúcej lekcii, Dedičnosť a polymorfizmus , si vysvetlíme dedičnosť a polymorfizmus.
Mal si s čímkoľvek problém? Stiahni si vzorovú aplikáciu nižšie a porovnaj ju so svojím projektom, chybu tak ľahko nájdeš.
Stiahnuť
Stiahnutím nasledujúceho súboru súhlasíš s licenčnými podmienkami
Stiahnuté 1162x (11.9 kB)
Aplikácia je vrátane zdrojových kódov v jazyku Java