9. diel - Šibenice pre Android - Analýza a návrh aplikácie
V minulej lekcii, Šibenice pre Android - Animácie, Shared preferences a Intent , sme sa bavili o animáciách, zdieľaných nastavenie a intent. Poznáme teda už všetko potrebné pre vytvorenie našej šibenice. Dnešné Java Android tutoriál venujeme zberu požiadaviek, analýze a návrhu aplikácie.
Požiadavky
Vytvoríme jednoduchú hru Šibenica podľa klasických pravidiel s tým, že bude obsahovať:
- systém bodovania hráčov; hráč bude mať na začiatku hry 10000 bodov, za každú chybu mu bude 1000 bodov odpočítané a za každé uhádnuté písmeno 500 bodov pripočítané s tým, že ak uhádne viac písmen za sebou, bude sa mu počet bodov násobiť.
- slová z niekoľkých okruhov,
- maximálna dĺžka slová bude 10 písmen,
- hráč si bude môcť vybrať, z akého okruhu chce slová hádať,
- po výhre / prehre sa zobrazí hádanie slovo a dosiahnuté body (skóre),
- dosiahnuté skóre bude môcť hráč uložiť,
- hráči bude tiež umožnené vymazať doterajšie výsledky,
- ako pri uložení skóre, tak pri mazaní skóre bude hráčovi položený dotaz, či skutočne chce údaje uložiť / zmazať vo forme dialógu.
- v žiadnej časti aplikácie nebude umožnená zmena orientácie obrazovky.
Analýza a návrh aplikácie
Aktivity
V našej aplikácii budeme potrebovať nasledujúce aktivity:
- úvodnej animácie (Kapitola 11 úvodnej animácie)
- hlavné menu - (ponuka),
- aktivita pre zobrazenie výsledkov,
- aktivita pre výber okruhu,
- aktivita pre samotnú hru,
- po výhre / prehre prejdeme do aktivity Endgame, kde dôjde k zobrazenie výsledkov a hádaného slová.
Logika prechodov medzi aktivitami bude vyzerať teda nasledovne:
Obrázok 1 - diagram aktivít
Welcome
Túto úvodnú aktivitu sme si už opisovali v lekcii Welcome screen animácie kalkulačky a tu ju vytvoríme úplne rovnako.
Menu
Jednoduchý "rozcestník" pre našu druhú aplikáciu. Návrh bude obsahovať
tri tlačidlá a jeden ImageView
s obrázkom pre spestrenie.
- prvý pre prechod do aktivity, v ktorej si hráč vyberie okruh adaných slov,
- druhé pre zobrazenie výsledkov, prechod do aktivity pre výpis skóre,
- tretí pre zatvorenie aplikácie.
Logika menu
Pomocou Intent zmeníme po kliknutí na tlačidlo aktivitu buď na výber okruhov (prvé tlačidlo) alebo na výpis skóre (druhé tlačidlo) alebo ukončíme aktivitu pomocou finish (tretie tlačidlo).
Výber okruhu
V tejto aktivite si užívateľ vyberie, z akého okruhu bude chcieť slová
hádať. Pre výber použijeme RadioGroup
so štyrmi
RadioButton
. Na záver pridáme tlačidlo, ktorým budeme
spúšťať "prechod" do ďalšej aktivity.
Logika Výberu okruhu
Pomocou metódy getCheckedRadioButtonId()
dostaneme ID
RadioButton
u, ktorý je zaškrtnutý. Pomocou tohto ID vytvoríme
objekt RadioButton
, z ktorého dostaneme metódou
getText()
String
s okruhom.
Tento String
zobrazíme ako toast.
Pomocou podmienky zistíme, aký okruh bol vybraný a nastavíme patričnú
hodnotu premennej met
(hodnota 1
pre informatiku,
2
pre mestá, 3
pre zvieratá a 4
pre
automobily).
Vytvoríme intent, ktorý nás presunie do ďalšej aktivity
Maingate. Ešte pred preskokom pridáme extra dáta pod názvom
"VybranaMetoda"
, ako konkrétna hodnota bude figurovať premenná
met.
Maingate
Aktivita, v ktorej bude prebiehať hranie našej hry. Pri spustení sa v
hornej časti obrazovky spustí animácie v ImageView
. Pod
animácií sa bude zobrazovať "hracia plocha". V tej sa budú zobrazovať
chybne zadané písmená a postupne sa bude vykresľovať šibenice podľa
obvyklých pravidiel. Pod hraciu plochu sa budú vypisovať uhádnutie
písmená.
Pod uhádnutými písmenami bude editText
pre vkladanie
znakov.
Logika Maingate
V onCreate()
nastavíme animáciu pomocou
AnimationDrawable
. Pomocou getIntent().getIntExtra()
vytiahneme hodnotu, ktorú sme pridávali v predchádzajúcej aktivite ako extra
dáta. Táto hodnota nám povie, z akého okruhu budeme vyberať slovo.
Zavoláme metódu vyberSlovo()
.
V metóde vyberSlovo()
vyžrebujeme jedno slovo na základe
vybraného okruhu pomocou triedy Random
. Hneď potom ešte v
onCreate()
zavoláme metódu uprav()
.
Metóda uprav()
má ako vstup vyžrebované slovo. V úvode
metódy si vytvoríme objekty TextView
3 až 10, pretože naše
slová budú mať minimálne 2 písmená a maximálne 10 písmen (jeden
TextView
pre jedno písmeno). Na základe dĺžky vylosovaného
slová "pošleme preč" určitý počet TextView
. To urobíme
pomocou metódy setVisibility()
s parametrom GONE.
Pre pochopenie pridávam príklad. Ak slovo bude mať dĺžku 2, je jasné,
že obsahuje iba dve písmená, takže môžeme "poslať preč"
textView3
, textView4
, ... textView10
. Ak
slovo bude mať dĺžku 8, pošleme preč iba textView9
a
textView10
.
Tlačidlu "Zadaj" priradíme metódu vlozeni()
.
Vloženom ()
V tejto metóde načítame vložený znak ako reťazec z
editText
, ten vyprázdnime a aby sme predišli rozlišovanie medzi
malými a veľkými písmenami, aplikujeme na načítaný reťazec metódu
toLowerCase()
, čím zabezpečíme, že aplikácia nebude brať
ohľad na veľké a malé písmená. Prevedieme na char
a
podmienkou zistíme, či sa jedná o českej písmeno. Na editText
je nastavené maxLength="1"
, preto nie je potrebné ošetrovať
vstup dlhší ako 1 znak. Ešte pred prevodom na char
musíme
zistiť podmienkou, či je vôbec čo prevádzať (inak by došlo k pádu
aplikácie).
Pomocou for
cyklu prejdeme všetky znaky v hádanie slove. Ak
narazíme na zhodu, zavoláme metódu zapisSpravne()
a
scorePlus()
, ďalej zdvíhame hodnotu premennej
pocetVyskytu
.
Po každom dokončenom prejdení cykle kontrolujeme, či sa zadané písmeno
vyskytuje v našom pomocnom stringu pomDelka
.
pomDelka
je pomocný String
, do ktorého budeme
ukladať zadanej písmená. Na začiatku je prázdna. Ak nám metóda
indexOf(zadané písmeno)
vráti hodnotu -1
, znamená
to, že sme počet uhádnutých písmen ešte nepripísala. V tomto prípade
pripočítame k premennej delkaSlova
hodnotu premennej
pocetVyskytu
.
pocetVyskytu
musí byť nastavená na 0
pred
každým novým zadaním. Vo for
cyklu sa jej hodnota dvíha o
1
zakaždým, keď dôjde k zhode zadaného písmená v hľadanom
slove. Počíta nám teda, koľkokrát sa vyskytuje zadané písmeno v hádanie
slove. Ak sa táto hodnota rovná 0
, je jasné, že sme písmeno
neuhádli.
Po zdvihnutí hodnoty premennej delkaSlova
sa kontroluje, či
už táto hodnota zodpovedá dĺžke hádaného slová. Ak áno, hráč vyhral,
pretože uhádol všetky písmená.
Na záver sa skontroluje, či je pocetVyskytu
rovný
0
. Ak áno, volá sa metóda zapisSpatne()
a
scoreMinus()
, pretože zadané písmeno sa v slove nevyskytuje a
tým pádom hráč hádal zle.
Pre lepšie pochopenie pridávam spomínaný priebeh spracovaný graficky. Pre väčšiu prehľadnosť sú jednotlivé premenné zvýraznené.
Obrázok 2 - diagram hádanie písmená
ZapisSpravne
Ako parameter má zadané písmeno a jeho pozíciu v hľadanom slove.
Vytvoríme si objekty textView1
až textView10
. Na
základe pozície pomocou konštrukcie switch
zistíme, aký
TextView
prepísať z pôvodného _
na zadané
písmeno.
ScorePlus
Multiplikátor bude na začiatku nastavený na 0
. Ak sa zavolá
táto metóda, zdvihne multiplikátor o 1
a vynásobia ho hodnotou
500
. Za prvý uhádnutie je teda 500 bodov, za druhé v rade 1000,
za tretie 1500 atď. Multiplikátor sa bude nastavovať späť na 0
v metóde scoreMinus()
(tzn. Pri chybe).
Aby sme predišli tomu, že hráč zadá niekoľkokrát za sebou rovnaké
písmeno a bude sa mu dvíhať skóre, použijeme rovnaký spôsob ako v metóde
vlozeni()
.
Vytvoríme si teda ďalšie inštančný premennú. Prázdny
String
suhadnute
:
if (suhadnute.indexOf(pismeno)==-1) { ... }
Ak je podmienka splnená, znamená to, že sme skóre pre zadané písmeno ešte nepripísala. V tele podmienky nesmieme zabudnúť pridať uhádnuté písmeno do pomocného reťazca:
suhadnute+=pismeno;
ZapisSpatne ()
Táto metóda sa volá, ak sa zadané písmeno v hádanie slove nevyskytuje
ani raz. Do TextView
pridáme zadané písmeno a podľa počtu
chýb vykreslíme správny obrázok až do deviatej chyby, potom sa bude volať
metóda konecHry()
.
ScoreMinus ()
Metóda od skóre odpočíta 1000
a nastaví multiplikátor na
0
. Ošetríme rovnakým spôsobom ako u scorePlus()
,
aby sme predišli odpočítaní skóre pri zadaní rovnakého chybného písmena
viackrát za sebou.
KonecHry ()
Volá sa pri deviatej chybe. Pomocou Intent prejdeme do aktivity Endgame a pridáme extra dáta v podobe hádaného slová a dosiahnutého score.
Je dôležité aktivitu Maingau ukončiť pomocou
finish()
.
Vyhra ()
Obdobné ako konecHry()
. Pomocou Intent preskočíme do aktivity
WinGame a ako extra pridáme hádanie slovo a dosiahnuté
skóre.
Aj tu pomocou finish ukončíme Maingate aktivitu.
Endgame
Ide o aktivitu, v ktorej sa zobrazia výsledky po dokončení hry, teda hádanie slovo a dosiahnuté skóre. Tiež sa zobrazí animácia podľa toho, či sa bude jednať o výhru alebo prehru. Hráč bude môcť skóre uložiť alebo sa vrátiť do hlavnej ponuky bez uloženia.
Logika Endgame
V onCreate()
sa vytiahne pomocou getIntent()
hodnota skóre, hádanie slovo a informácie o tom, či sa jedná o prehru alebo
výhru. Ešte v onCreate()
zavoláme metódu
zobrazScore()
a nactiAnimaci()
.
ZobrazScore ()
V TextView
zobrazíme hádania slovo, ktoré sme si načítali v
onCreate()
. To isté urobíme s hodnotou skóre.
NactiAnimaci ()
Vytvoríme objekt AnimationDrawable
a pomocou podmienok
zistíme, či sa jedná o prehru alebo výhru (podľa hodnoty, ktorú sme
načítali v onCreate()
) a nahráme patričné snímky pre
animáciu.
UlozScore ()
Na tlačidlo "Ulož score" nastavíme metódu ulozScore()
. Tá
si načíta String
z editText
. Pokiaľ tento
String
bude dlhšia ako 3 znaky (podmienka) a nebude obsahovať
Enter, vytvorí AlertDialog
. V prípade, že ho
užívateľ potvrdí kliknutím na "Áno", zavolá metódu
ulozDoPameti()
.
UlozDoPameti ()
Vytvorí SharedPreferences
"VYSLEDKY"
, ktorý bude
v móde private. Ďalej vytvorí editor. Pomocou editora vloží výsledky do
SharedPreferences
.
Po uložení sa aktivita pomocou finish()
ukončí.
Ukončí ()
Táto metóda bude na tlačidle Hlavná ponuka. Urobí iba to, že ukončí
súčasnú aktivitu pomocou finish()
.
ShowScore
Aktivita pre zobrazenie výsledkov.
Logika ShowScore
V onCreate()
načíta dáta z SharedPreferences
a
zobrazí ich v TextView
.
Na tlačidle "Vymazať" bude AlertDialog
builder pre potvrdenie
akcie.
Tlačidlo "X" bude slúžiť pre ukončenie tejto aktivity pomocou finish.
V budúcej lekcii, Šibenice pre Android - Aktivity a implementácia , sa budeme venovať návrhu jednotlivých aktivít a začneme s implementáciou.