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 triedySettingsimplementáciu rozhraniaSerializable, ktoré sa nachádza v balíkujava.io.Úloha: Vo vytvorenej triedeSettingsvytvorte členské premennérowCount,columnCountamineCounttypuprivate 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ú typuSettingstri 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 triedeSettingspremennúSETTING_FILEtypuprivate static final Stringobsahujú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ýmiSettingsprekryť metódu public boolean equals(Object o) triedyObject. Táto metóda sa používa na porovnávanie dvoch objektov.BEGINNER,INTERMEDIATEaEXPERTuvedenými vyššie. Podmienkou, kedy dva objekty typuSettingssú 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 triedeSettingsvykoná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úduFileOutputStreama prúduObjectOutputStreampre 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údovObjectInputStreamaFileInputStream. 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 typuSettingss 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 triedeMinesweepersúkromnú premennú setting typuSettings.Úloha: Vygenerujte v triedeMinesweepermetódypublic Settings getSetting()apublic void setSetting(Settings setting).Úloha: Pri spustení hry Minesweeper inicializujte premennúsettingposledným uloženým nastavením obtiažnosti hry. Na tento účel použite statickú metóduSettings load()triedySettingsv 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.




Serializablenedefinuje žiadnu metódu. Slúži len na označenie možnosti objektov tejto triedy serializovať ich (návrhový vzor Marker Interface).