9. díl - Šibenice pro Android - Analýza a návrh aplikace

Java Android Šibenice pro Android - Analýza a návrh aplikace

V minulém tutoriálu jsme se bavili o animacích, sdílených nastavení a intent. Známe tedy již vše potřebné pro vytvoření naší šibenice. Dnešní díl věnujme sběru požadavků, analýze a návrhu aplikace.

Požadavky

Vytvořit jednoduchou hru Šibenice podle klasických pravidel s tím, že bude obsahovat:

  • systém bodování hráče, hráč bude mít na začátku hry 10000 bodů, za každou chybu mu bude 1000 bodů odečteno a za každé uhádnuté písmeno 500 bodů připočítáno s tím, že pokud uhádne více písmen za sebou, bude se mu počet bodů násobit.
  • slova z několika okruhů,
  • maximální délka slova 10 písmen,
  • hráč si bude moci vybrat, z jakého okruhu chce slova hádat,
  • po výhře/prohře se zobrazí hádané slovo a dosažené body (score),
  • dosažené score bude moci hráč uložit,
  • hráči bude také umožněno vymazat dosavadní výsledky,
  • jak při uložení score, tak při mazání score bude hráči položen dotaz, zda skutečně chce údaje uložit/smazat ve formě dialogu.
  • v žádné části aplikace nebude umožněna změna orientace obrazovky.

Analýza a návrh aplikace

Aktivity

  • Školní animace (Kapitola 11 úvodní animace)
  • Hlavní menu - (nabídka),
  • aktivita pro zobrazení výsledků,
  • aktivita pro výběr okruhu,
  • aktivita pro samotnou hru,
  • po výhře / prohře přechod do aktivity EndGame, kde dojde k zobrazení výsledků a hádaného slova.

Logika přechodů mezi aktivitami bude vypadat tedy následovně:

Diagram aktivit

Obrázek 1 - diagram aktivit

Welcome

Tato úvodní školní aktivita s animací je podrobně popsána v „Android programování 2 Calc – kapitola 5“.

MENU

Jednoduchý „rozcestník“ pro naši druhou aplikaci. Návrh bude obsahovat tři tlačítka a jeden ImageView s obrázkem pro zpestření.

  • První pro přechod do aktivity, ve které si hráč vybere okruh hádaných slov,
  • druhé pro zobrazení výsledků, přechod do aktivity pro výpis score,
  • třetí pro zavření aplikace.
Logika menu

Pomocí intentu změníme po kliknutí na tlačítko aktivitu buď na výběr okruhů (první tlačítko) nebo na výpis score (druhé tlačítko) anebo ukončíme aktivitu pomocí finish (třetí tlačítko).

Výběr okruhu

V této aktivitě si uživatel vybere, z jakého okruhu bude chtít slova hádat. Pro výběr použijeme RadioGroup se čtyřmi RadioButtony. Na závěr přidáme tlačítko, kterým budeme spouštět „přechod“ do další aktivity.

Logika Výběru okruhu

Pomocí metody getCheckedRadi­oButtonId() dostaneme ID radio buttonu, které je zaškrtnuté. Pomocí tohoto ID vytvoříme objekt RadioButton, ze kterého dostaneme metodou getText() string s okruhem.

Tento string zobrazíme jako toast.

Pomocí podmínky zjistíme, jaký okruh byl vybrán a nastavíme patřičnou hodnotu proměnné „met“ (hodnota 1 pro informatiku, 2 pro města, 3 pro zvířata a 4 pro auta).

Vytvoříme intent, který nás přesune do další aktivity „main game“. Ještě před přeskokem přidáme extra data pod názvem "VybranaMetoda", jako konkrétní hodnota bude figurovat proměnná met.

Main game

Aktivita, ve které bude probíhat hraní naší hry.

Při spuštění se v horní části obrazovky spustí animace v ImageView.

Pod animací se bude zobrazovat „hrací plocha“. V té se budou zobrazovat chybně zadané písmena a postupně se bude vykreslovat šibenice dle obvyklých pravidel.

Pod hrací plochu se budou vypisovat uhádnutá písmena.

Pod uhádnutými písmeny bude editText pro vkládání znaků.

Logika Main game

onCreate() nastavíme animaci pomocí AnimationDrawable. Pomocí getIntent().ge­tIntExtra() vytáhneme hodnotu, kterou jsme přidávali v předchozí aktivitě jako extra data. Tato hodnota nám řekne, z jakého okruhu budeme vybírat slovo. Zavoláme metodu VyberSlovo().

V metodě VyberSlovo() vylosujeme jedno slovo na základě vybraného okruhu pomocí Random. Hned potom ještě v onCreate() zavoláme metodu uprav.

Metoda uprav() má jako vstup vylosované slovo. V úvodu metody si vytvoříme objekty TextView 3 až 10, protože naše slova budou mít minimálně 2 písmena a maximálně 10 písmen (jeden TextView pro jedno písmeno). Na základě délky vylosovaného slova „pošleme pryč“ určitý počet textView. To uděláme pomocí metody setVisibility() s parametrem GONE.

Pro pochopení přidávám příklad. Pokud slovo bude mít délku 2, je jasné, že obsahuje pouze dvě písmena, takže můžeme „poslat pryč“ textView3,4,5,6,7,­8,9 a 10. Pokud slovo bude mít délku 8, pošleme pryč pouze textView9 a 10.

Tlačítku „Zadej“ přiřadíme metodu Vlozeni().

Vlozeni

V této metodě načteme vložený znak jako řetězec z editText, ten vyprázdníme a abychom předešli rozlišování mezi malými a velkými písmeny, aplikujeme na načtený řetězec metodu toLowerCase(), čímž zajistíme, že aplikace nebude brát zřetel na velká a malá písmena. Převedeme na char a podmínkou zjistíme, zda se jedná o české písmeno. Na editTextu je nastaveno maxLength="1", proto není třeba ošetřovat vstup delší než 1 znak. Ještě před převodem na char musíme zjistit podmínkou, zda je vůbec co převádět (jinak by došlo k pádu aplikace).

Pomocí for cyklu projdeme všechny znaky v hádaném slově. Pokud narazíme na shodu, zavoláme metodu ZapisSpravne() a ScorePlus(), dále zvedáme hodnotu proměnné PocetVyskytu.

Po každém dokončeném projití cyklu kontrolujeme, zda se zadané písmeno vyskytuje v našem pomocném stringu PomDelka.

PomDelka je pomocný string, do kterého budeme ukládat zadané písmena. Na začátku je prázdná. Pokud nám metoda indexOf(zadané písmeno) vrátí hodnotu -1, znamená to, že jsme počet uhádnutých písmen ještě nepřičetli. V tomto případě připočítáme k proměnné delkaSlova hodnotu proměnné PocetVyskytu.

PocetVyskytu musí být nastavena na 0 před každým novým zadáním. Ve for cyklu se její hodnota zvedá o +1 pokaždé, když dojde ke shodě zadaného písmena v hledaném slově. Počítá nám tedy, kolikrát se vyskytuje zadané písmeno v hádaném slově. Pokud se tato hodnota rovná 0, je jasné, že jsme písmeno neuhádli.

Po zvednutí hodnoty proměnné delkaSlova se kontroluje, zda už tato hodnota odpovídá délce hádaného slova, pokud ano, hráč vyhrál, protože uhádl všechna písmena.

Na závěr se zkontroluje, zda je PocetVyskytu roven 0. Pokud ano, volá se metoda ZapisSpatne() a ScoreMinus(), protože zadané písmeno se ve slově nevyskytuje a tím pádem hráč hádal špatně.

Pro lepší pochopení přidávám zmíněné pochody zpracované graficky. Pro větší přehlednost jsou jednotlivé proměnné zvýrazněny.

Diagram hádání písmena

Obrázek 2 - diagram hádání písmena

ZapisSpravne

Jako parametr má zadané písmeno a jeho pozici v hledaném slově. Vytvoříme si objekty TextView 1 až 10. Na základě pozice pomocí konstrukce switch case zjistíme, jaký textView přepsat z původního „_“ na zadané písmeno.

ScorePlus

Multiplikátor bude na začátku nastaven na 0. Pokud se zavolá tato metoda, zvedne multiplikátor o +1 a vynásobí ho hodnotou 500. Za první uhádnutí je tedy 500 bodů, za druhé v řadě 1000, za třetí 1500 atd. Multiplikátor se bude nastavovat zpět na 0 v metodě ScoreMinus() (tzn. při chybě).

Abychom předešli tomu, že hráč zadá několikrát za sebou stejné písmeno a bude se mu zvedat score, použijeme stejný způsob jako v metodě Vlozeni().

Vytvoříme si tedy další instanční proměnnou. Prázdný string Suhadnute.

if (Suhadnute.indexOf(Pismeno)==-1) { ... }

Pokud je podmínka splněna, znamená to, že jsme score pro zadané písmeno ještě nepřičetli. V těle podmínky nesmíme zapomenout přidat uhádnuté písmeno do pomocného řetězce.

Suhadnute+=Pismeno;
ZapisSpatne

Tato metoda se volá, pokud se zadané písmeno v hádaném slově nevyskytuje ani jednou. Do textView přidáme zadané písmeno a podle počtu chyb vykreslíme správný obrázek až do deváté chyby, potom se bude volat metoda KonecHry().

ScoreMinus

Od score odečte -1000 a nastaví multiplikátor na 0. Ošetříme stejným způsobem jako u ScorePlus(), abychom předešli odečtení score při zadání stejného chybného písmene víckrát za sebou.

KonecHry

Volá se při deváté chybě. Pomocí Intentu přejdeme do aktivity EndGame a přidáme extra data v podobě hádaného slova a dosaženého score.

Je důležité aktivitu MainGame ukončit pomocí finish.

Vyhra

Obdobné jako KonecHry(). Pomocí intentu přeskočíme do aktivity WinGame a jako extra přidáme hádané slovo a dosažené score.

I zde pomocí finish ukončíme MainGame aktivitu.

EndGame

Jedná se o aktivitu, ve které se zobrazí výsledky po dokončení hry, tedy hádané slovo a dosažené score. Také se zobrazí animace podle toho, zda se bude jednat o výhru nebo prohru. Hráč bude moci score uložit anebo se vrátit do hlavní nabídky bez uložení.

Logika EndGame

V onCreate() se vytáhne pomocí getIntent() hodnota score, hádané slovo a informace o tom, zda se jedná o prohru nebo výhru. Ještě v onCreate() zavoláme metodu ZobrazScore() a NactiAnimaci().

ZobrazScore

V textView zobrazíme hádané slovo, které jsme načetli v onCreate(). Totéž uděláme s hodnotou score.

NactiAnimaci

Vytvoříme objekt AnimationDrawable a pomocí podmínek zjistíme, zda se jedná o prohru nebo výhru (podle hodnoty, kterou jsme načetli v onCreate()) a nahrajeme patřičné snímky pro animaci.

UlozScore

Na tlačítko „Ulož score“ nastavíme metodu UlozScore(). Ta si načte string z editTextu. Pokud tento string bude delší než 3 znaky (podmínka) a nebude obsahovat enter, vytvoří AlertDialog. V případě že ho uživatel potvrdí klepnutím na „Ano“, zavolá metodu UlozDoPameti().

UlozDoPameti

Vytvoří SharedPreferences „VYSLEDKY“, který bude v modu private. Dále vytvoří editor. Pomocí editoru vloží výsledky do SharedPreferences.

Po uložení se aktivita pomocí finish ukončí.

Ukonci

Tato metoda bude na tlačítku Hlavní nabídka. Udělá pouze to, že ukončí současnou aktivitu pomocí finish.

ShowScore

Aktivita pro zobrazení výsledků.

Logika ShowScore

V onCreate() načte data z SharedPreferences a zobrazí je v textView.

Na tlačítku „Vymazat“ bude AlertDialog builder pro potvrzení akce.

Tlačítko „X“ bude sloužit pro ukončení této aktivity pomocí finish.

V příštím dílu se budeme věnovat návrhu jednotlivých aktivit a začneme s implementací.


 

  Aktivity (1)

Článek pro vás napsal Jiří Hlavík
Avatar
Autor se věnuje programování v C# a vývoji aplikací pro platformu Android a dalším věcem spojeným s Android OS

Jak se ti líbí článek?
Celkem (3 hlasů) :
55555


 



 

 

Komentář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.

Zatím nikdo nevložil komentář - buď první!