Ciele
- Oboznámiť sa s významom a použitím prúdov údajov v jazyku Java.
- Oboznámiť sa s významom a použitím serializácie v jazyku Java.
- Implementovať podporu pre výber a uloženie nastavení v hre Minesweeper.
Úvod
-
Na dnešnom cvičení si vyskúšame prácu s údajovými prúdmi a do hry pridáme možnosť nastavenia obtiažnosti hry.
Postup
-
Nasledujúcim krokom v rámci implementácie hry Minesweeper je pridanie podpory pre uloženie nastavení hry. V nastaveniach bude uchovávaná informácia o naposledy zvolenej obtiažnosti hry.Úloha: Vytvorte triedu
Settings
, ktorá definuje nastavenie hry a zabezpečuje uloženie do súboru a získanie nastavenia zo súboru. Túto triedu umiestnite do balíkaminesweeper
. Nastavenie hry bude definovať veľkosť hracieho poľa a počet mín.Úloha: Vzhľadom na zámer serializácie nastavenia pridajte v definícii triedySettings
implementáciu rozhraniaSerializable
, ktoré sa nachádza v balíkujava.io
.Úloha: Vo vytvorenej triedeSettings
vytvorte členské premennérowCount
,columnCount
amineCount
typuprivate final int
, ktoré budú definovať veľkosť hracieho poľa a počet mín. Vytvorte v tejto triede konštruktorpublic Settings(int rowCount, int columnCount, int mineCount)
. V tele konštruktora nastavte hodnoty členských premenných s rovnakými menami (použite kľúčové slovothis
).Úloha: Použitím nástroja pre refaktorizáciu zdrojového kódu vygenerujte pre vytvorené premenné metódy na získanie ich hodnôt:public int getRowCount()
public int getColumnCount()
public int getMineCount()
Úloha: Pridajte do triedyTieto premenné sú typuSettings
tri statické premenné definujúce rozmery a počet mín hracieho poľa pre začiatočníkov (BEGINNER
), mierne pokročilých (INTERMEDIATE
) a pokročilých (EXPERT
).public static final Settings
. Veľkosti hracieho poľa a počty mín sú definované nasledovne:-
Hracie pole pre začiatočníkov - veľkosť 9x9, počet mín 10 -
BEGINNER = new Settings(9, 9, 10)
. -
Hracie pole pre mierne pokročilých - veľkosť 16x16, počet mín 40 -
INTERMEDIATE = new Settings(16, 16, 40)
. -
Hracie pole pre pokročilých - veľkosť 16x30, počet mín 99 -
EXPERT = new Settings(16, 30, 99)
.
Úloha: Definujte v triedeSettings
premennúSETTING_FILE
typuprivate static final String
obsahujúcu informáciu o súbore, kde bude nastavenie hry uložené, resp. z ktorého bude nastavenie hry získané pri jej spustení.Poznámka: Túto premennú môžete nastaviť nasledovneSETTING_FILE = System.getProperty("user.home") + System.getProperty("file.separator") + "minesweeper.settings";
.Úloha: Pre získanie informácie o nastavenej obtiažnosti hry je potrebné v triedeV našom prípade bude neskôr použitá pri označení zvolenej obtiažnosti hry v grafickom používateľskom rozhraní, kde bude potrebné vykonať porovnanie zvolenej obtiažnosti hry s preddefinovanými, ktoré sú reprezentované premennýmiSettings
prekryť metódu public boolean equals(Object o) triedyObject
. Táto metóda sa používa na porovnávanie dvoch objektov.BEGINNER
,INTERMEDIATE
aEXPERT
uvedenými vyššie. Podmienkou, kedy dva objekty typuSettings
sú rovnaké je platnosť nasledujúcich podmienok:- Majú rovnaký počet riadkov.
- Majú rovnaký počet stĺpcov.
- Majú rovnaký počet mín.
Poznámka: Pre porovnávanie objektov nie je vhodné používať operátor==
v prípade, ak je potrebné vykonať porovnanie objektov na základe ich stavu (hodnôt premenných). Operátor==
pri porovnaní hodnôt referečných typov porovnáva adresy umiestnenia objektov v pamäti!Úloha: Prekryte v triedeSettings
vykonávanie metódy public int hashCode() definovanej v triedeObject
.Poznámka: Je to nutné z dôvodu nami definovanej implementácie metódypublic boolean equals(Object o)
. Objekty, pre ktoré platí rovnosť na základe porovnania metódouequals
, majú mať rovnakú návratovú hodnotu pri použití metódyhashCode
. Návratovou hodnotou implementácie tejto metódy bude hodnota výrazu počet riadkov * počet stĺpcov * počet mín. -
V ďalšom kroku je potrebné realizovať uloženie nastavenia hry tak, aby nastavenie hry mohlo byť inicializované pri jej spustení. Nastavenia hry budú ukladané do súboru prostredníctvom serializácie objektov a pri spustení hry bude nastavenie načítané zo súboru.Úloha: Implementujte metódu
public void save()
v triedeSettings
, ktorá uloží nastavenie zvolenej obtiažnosti hry do súboru použitím prúduFileOutputStream
a prúduObjectOutputStream
pre serializáciu objektov. Pre identifikáciu súboru, do ktorého bude nastavenie uložené použite hodnotu premennejSETTING_FILE
.Poznámka: Metódapublic void save()
je metódou objektu a teda jej úlohou je vykonať uloženie tohto objektu (objektu nad ktorým je táto metóda aplikovaná). Preto je potrebné použiť kľúčové slovothis
.Poznámka: Odchytenie výnimky pri práci so serializáciou objektu (ale aj v ostatných prípadoch vyžadujúcich odchytenie výnimky) je možné realizovať v prostredí NetBeans nasledovne:- Označte kód, pre ktorý je požadované spracovanie výnimky.
- Nad ľavým okrajom sa objaví žiarovka nad ktorou zvoľte „Surround with try ...”.
Úloha: Implementujte statickú verejnú metódupublic static Settings load()
v triedeSettings
, ktorá načíta uložené nastavenie obtiažnosti hry zo súboru použitím prúdovObjectInputStream
aFileInputStream
. Pre identifikáciu súboru, z ktorého bude serializovaný objekt získaný použite hodnotu premennejSETTING_FILE
. V prípade, že sa nepodarí deserializovať objekt typuSettings
s uloženým nastavením používateľa, bude návratovou hodnotou objekt s obtiažnosťou nastavenou v premennejBEGINNER
. -
Posledným krokom pri implementácii ukladania/obnovenia nastavenia obtiažnosti hry Minesweeper je vykonanie úpravy v triede Minesweeper, ktorá sa nachádza v balíku
minesweeper
.Úloha: Definujte v triedeMinesweeper
súkromnú premennú setting typuSettings
.Úloha: Vygenerujte v triedeMinesweeper
metódypublic Settings getSetting()
apublic void setSetting(Settings setting)
.Úloha: Pri spustení hry Minesweeper inicializujte premennúsetting
posledným uloženým nastavením obtiažnosti hry. Na tento účel použite statickú metóduSettings load()
triedySettings
v konštruktore triedyMinesweeper
.Úloha: Pri zmene nastavení v metódepublic void setSetting(Settings setting)
zabezpečte uloženie nových nastavení pomocou metódyvoid save()
nad objektomsetting
. -
Na otestovanie funkčnosti implementovanej triedy Settings vytvorte vhodný JUnit test.
-
Vymažte projekt z disku a zrušte všetky vami vytvorené nastavenia v prostredí NetBeans!
Zdroje
- Metóda public boolean equals(Object o) v Java API.
- Metóda public int hashCode() v Java API.
Serializable
nedefinuje žiadnu metódu. Slúži len na označenie možnosti objektov tejto triedy serializovať ich (návrhový vzor Marker Interface).