Ciele

  1. Oboznámiť sa s významom a použitím prúdov údajov v jazyku Java.
  2. Oboznámiť sa s významom a použitím serializácie v jazyku Java.
  3. 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

  1. 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íka minesweeper. 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 triedy Settings implementáciu rozhraniaSerializable, ktoré sa nachádza v balíku java.io.
    Poznámka: Rozhranie Serializable nedefinuje žiadnu metódu. Slúži len na označenie možnosti objektov tejto triedy serializovať ich (návrhový vzor Marker Interface).
    Úloha: Vo vytvorenej triede Settings vytvorte členské premenné rowCount, columnCount a mineCount typu private final int, ktoré budú definovať veľkosť hracieho poľa a počet mín. Vytvorte v tejto triede konštruktor public 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é slovo this).
    Ú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 triedy Settings 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).
    Tieto premenné sú typu 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 triede Settings premennú SETTING_FILE typu private 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ť nasledovne SETTING_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 triede Settings prekryť metódu public boolean equals(Object o) triedy Object. Táto metóda sa používa na porovnávanie dvoch objektov.
    V 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ými BEGINNER, INTERMEDIATE a EXPERT uvedenými vyššie. Podmienkou, kedy dva objekty typu Settings 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 triede Settings vykonávanie metódy public int hashCode() definovanej v triede Object.
    Poznámka: Je to nutné z dôvodu nami definovanej implementácie metódy public boolean equals(Object o). Objekty, pre ktoré platí rovnosť na základe porovnania metódou equals, majú mať rovnakú návratovú hodnotu pri použití metódy hashCode. Návratovou hodnotou implementácie tejto metódy bude hodnota výrazu počet riadkov * počet stĺpcov * počet mín.
  2. 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 triede Settings, ktorá uloží nastavenie zvolenej obtiažnosti hry do súboru použitím prúdu FileOutputStream a prúdu ObjectOutputStream pre serializáciu objektov. Pre identifikáciu súboru, do ktorého bude nastavenie uložené použite hodnotu premennej SETTING_FILE.
    Poznámka: Metóda public 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é slovo this.
    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ódu public static Settings load() v triede Settings, ktorá načíta uložené nastavenie obtiažnosti hry zo súboru použitím prúdov ObjectInputStream a FileInputStream. Pre identifikáciu súboru, z ktorého bude serializovaný objekt získaný použite hodnotu premennej SETTING_FILE. V prípade, že sa nepodarí deserializovať objekt typu Settings s uloženým nastavením používateľa, bude návratovou hodnotou objekt s obtiažnosťou nastavenou v premennej BEGINNER.
  3. 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 triede Minesweeper súkromnú premennú setting typu Settings.
    Úloha: Vygenerujte v triede Minesweeper metódy public Settings getSetting() a public 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ódu Settings load() triedy Settings v konštruktore triedy Minesweeper.
    Úloha: Pri zmene nastavení v metóde public void setSetting(Settings setting) zabezpečte uloženie nových nastavení pomocou metódy void save() nad objektom setting.
  4. Na otestovanie funkčnosti implementovanej triedy Settings vytvorte vhodný JUnit test.
  5. Aktuálny model tried aplikácie je nasledujúcom obrázku.
    Obr.: : Diagram tried aplikácie Minesweeper (na konci cvičenia 7)
  6. Vymažte projekt z disku a zrušte všetky vami vytvorené nastavenia v prostredí NetBeans!

Zdroje

  1. Metóda public boolean equals(Object o) v Java API.
  2. Metóda public int hashCode() v Java API.
comments powered by Disqus