2. týždeň

Úloha 1 - Návrh hry

Motivácia

Hry, ktoré budete v rámci cvičení implementovať, patria prevažne do skupiny dlaždicových hier a spôsob ich návrhu býva podobný. Cvičenia budú preto v nasledujúcich týždňoch popisovať postupnosť krokov vedúcich k vytvoreniu dlaždicovej hry a demonštrácia bude opísaná na príklade hry Minesweeper použitím technológie Java. V štúdii budete pokračovať priebežne, preto si medzi prvými krokmi naklonujete repozitár z GitLab-u, do ktorého budete pravidelne nahrávať implementáciu z každého týždňa.

Vašou úlohou v rámci dnešného cvičenia je vytvoriť návrh vašej hry vo forme diagramu tried a stavového diagramu. V poslednom kroku sa budete zaoberať návrhom základnej logiky hry - generovania herného poľa, ovládania, a pod.

Ciele

  1. Vytvoriť a naklonovať si repozitár projektu z GitLab Classroom a otvoriť ho v IntelliJ IDEA.
  2. Identifikovať základné entity, vzťahy a operácie dlaždicovej hry a vytvoriť konceptuálny model vlastnej hry.
  3. Identifikovať základné stavy hry a prechody medzi nimi.
  4. Navrhnúť základnú logiku hry.

Postup

Krok 1

Úloha 1.1

Vytvorte si projekt prostredníctvom aplikácie Gitlab Classroom podľa uvedeného postupu.

  1. Kliknutím na uvedený odkaz budete v GitLab-e vyzvaní na prihlásenie sa a autorizáciu aplikácie Gitlab Classroom, ktorú pre vás pripravil Manager.
  2. Autorizovaním aplikácie budete presmerovaní na stránku vytvárania projektov, kde si zvolíte skupinu podľa rozvrhovej jednotky, ktorú v rámci predmetu navštevujete.
  3. Do textového políčka zadáte názov hry, ktorú v rámci zadania riešite (napr. Míny).
  4. Kliknutím na tlačidlo pre vytvorenie projektu sa pre vás vytvorí v GitLab-e repozitár s pripravenou Maven štruktúrou projektu GameStudio. Tento projekt budete využívať počas celého semestra.

Úloha 1.2

Naklonujte si vytvorený repozitár na váš počítač a otvorte ho v prostredí IntelliJ IDEA. Oboznámte sa so štruktúrou pripraveného Maven projektu.

Poznámka

Pokiaľ máte repozitár prázdny, požiadajte o pomoc cvičiaceho.

Základná štruktúra adresárov projektu je nasledovná:

gamestudio // hlavný adresár projektu
├── src
│ ├── main // zdrojové súbory projektu
│ │ └── java
│ │   └── sk
│ │     └── tuke
│ │       └── gamestudio // hlavný balík projektu GameStudio
│ │         └── game // balík pre implementáciu hier
│ │           ├── minesweeper
│ │           └── vasahra - balík s názvom vašej hry
│ └── test //zdrojové súbory testov
│   └── java // vaše testy pôjdu do tohto adresára
├── .gitignore
└── pom.xml // konfiguračný súbor Maven projektu

Projekt je spravovaný ako [Maven] projekt - konfiguračný súbor pom.xml obsahuje základné závislosti (knižnice) potrebné pre ďalšiu prácu.

Poznámka

Po otvorení projektu v IntelliJ IDEA môže prostredie zobraziť notifikáciu Maven pre načítanie závislostí. Potvrďte ju, aby sa stiahli potrebné knižnice.

Krok 2

Na príklade hry Minesweeper sa inšpirujte pri vytváraní návrhu vašej hry. Minesweeper je počítačová hra určená pre jedného hráča. Cieľom hry je vyčistenie herného poľa od mín bez ich detonácie.

Hra Minesweeper
Obr. 1: Hra Minesweeper

Ďalšie informácie o tejto hre je možné získať napr. na Wikipédii a zahrať si ju môžete na http://minesweeperonline.com/.

Pri tvorbe konceptuálneho modelu sa využíva metóda analýzy objektov a akcií, kde sa postupuje v dvoch smeroch: od objektov (entít) k akciám a od akcií k objektom.

  1. Najprv sa identifikujú základné objekty navrhovaného systému (v našom prípade hry) a následne sa identifikujú všetky akcie, ktoré sa s týmito objektami môžu vykonávať.
  2. Keď už nevzniká žiadna nová akcia, postupne sa prechádzajú všetky doposiaľ identifikované akcie a kontroluje sa, či pri ich vykonávaní nie je potrebný nejaký nový objekt.

Tento postup sa môže opakovať. Tiež sa identifikujú najdôležitejšie vlastnosti objektov a vzťahy medzi jednotlivými objektami.

Úloha 2.1

Analyzujte vašu hru. Na základe objektov a ich akcií, vlastností a vzťahov, ktoré v hre identifikujete, vytvorte konceptuálny model vašej hry.

Jednou z reprezentácií konceptuálneho modelu môže byť diagram tried.

Z objektov odvádzame triedy, z ich akcií vznikajú metódy, z ich vlastností vznikajú premenné tried a zo vzťahov medzi objektami vznikajú vzťahy medzi triedami v diagrame tried (dedičnosť, asociácia, agregácia, kompozícia).

Poznámka

Na kreslenie môžete využiť niektorý z nástrojov pre kreslenie UML diagramov (Diagrams.net, smartdraw, UMLet, Diagram Editor, Gliffy, Mermaid) alebo iný podľa vlastného výberu.

Nasledujúci obrázok predstavuje príklad jednoduchého diagramu tried pre hru Minesweeper.

Diagram tried hry Minesweeper
Obr. 2: Diagram tried hry Minesweeper

Úloha 2.2

Na základe analýzy objektov a akcií opíšte štruktúru balíkov a tried.

Pri návrhu dlaždicových hier odporúčame navrhnúť balíky pre členenie kódu. Váš zdrojový kód hry umiestňujte do balíka sk.tuke.gamestudio.game v adresári src/main/java. V rámci tohto balíka vytvorte podbalík s názvom vašej hry, napr. sk.tuke.gamestudio.game.minesweeper, a v ňom ďalšie podbalíky pre jadro hry (core) a konzolové rozhranie (consoleui).

Základná štruktúra balíkov pre hru Minesweeper môže vyzerať takto:

  • sk.tuke.gamestudio.game.minesweeper - základný balík hry, obsahuje hlavné triedy aplikácie.
    • Minesweeper - hlavná trieda aplikácie s metódou main.
  • sk.tuke.gamestudio.game.minesweeper.core - balík obsahuje triedy definujúce logiku herného poľa, nezávislé od používateľského rozhrania.
    • Field - trieda reprezentujúca herné pole a jeho funkčnosť. Herné pole obsahuje dlaždice.
    • Tile - trieda reprezentujúca dlaždicu herného poľa. Dlaždice sú dvoch typov: mína Mine a pomoc pri hľadaní mín Clue.
    • Mine - trieda reprezentujúca dlaždicu typu mína.
    • Clue - trieda reprezentujúca dlaždicu typu pomoc pri hľadaní mín.
    • TileState - enumeračný typ vyjadrujúci stav dlaždice.
    • GameState - enumeračný typ vyjadrujúci stav hry.
  • sk.tuke.gamestudio.game.minesweeper.consoleui - balík obsahuje triedy definujúce interakciu s používateľom.
    • ConsoleUI - trieda definujúca interakciu hry s používateľom.

Poznámka

Štruktúra balíkov a tried u dlaždicových hier môže byť podobná, preto sa pokojne inšpirujte, no samozrejme ju patrične prispôsobte vašej hre.

Krok 3

Úloha 3.1

Identifikujte všetky stavy herných dlaždíc a stavy hry. Pre ich vyjadrenie a opis nakreslite stavový diagram. V stavovom diagrame zaznačte aj akcie (reprezentujúce názvy metód), ktoré spôsobujú prechody medzi jednotlivými stavmi.

Napríklad, dlaždica v hre Minesweeper môže byť v stave odkrytá OPEN, neodkrytá CLOSED alebo označená MARKED.

Diagram stavov dlaždice
Obr. 3: Diagram stavov dlaždice

Základné stavy hry u jednoduchých dlaždicových hier sú zväčša veľmi podobné, hra môže prebiehať (stav PLAYING), byť úspešne ukončená (stav SOLVED) alebo byť neúspešne ukončená (stav FAILED).

Môže sa ale stať, že vaša hra bude mať stavov viac. Napríklad pri hre Bejeweled sa môže vyskytnúť stav NO_POSSIBLE_MOVES, do ktorého sa hráč môže dostať po ktoromkoľvek ťahu. V tomto stave je možnou akciou napr. náhodné premiešanie dlaždíc.

Diagram stavov hry
Obr. 4: Diagram stavov hry

Poznámka

Pri identifikovaní prechodov medzi stavmi dlaždíc a hry sa môže stať, že identifikujete novú operáciu (metódu). Všetky takéto nové operácie doplňte do diagramu tried z predošlého kroku. Diagram tried a diagram stavov môžete vytvárať súbežne.

Krok 4

Úloha 4.1

Opíšte základnú logiku hry. Môžete použiť vývojový alebo sekvenčný diagram, prípadne využiť textový opis.

Poznámka

Pre opis základnej logiky hry je väčšinou potrebné opísať:

  • Spôsob generovania herného poľa.
  • Spôsob overovania stavov hry - či je hra vyhratá, prehratá, alebo prebieha.
  • Spôsob prechodu medzi stavmi dlaždíc, ťahy hráča.

Pri hre Minesweeper je pri generovaní herného poľa potrebné:

  1. Náhodne vygenerovať zadaný počet mín mineCount v hernom poli.
    • V cykle sa do poľa dlaždíc (field) na náhodnom riadku a náhodnom stĺpci vkladá mína - inštancia triedy Mine.
    • Aby sa zabezpečilo, že nová mína nebude vložená na miesto, kde už predtým bola nejaká mína vložená, skontroluje sa, či je náhodne vygenerovaná pozícia prázdna.
    • Cyklus končí, keď je do herného poľa vložený potrebný počet (mineCount) dlaždíc.
  2. Zvyšné prázdne miesta v poli sa vyplnia pomocnou dlaždicou typu Clue.
    • Hodnota pomocnej dlaždice sa určí zrátaním počtu mín v okolitých dlaždiciach, čo môže byť riešené oddelenou metódou (napr. countAdjacentMines()).

Po každom ťahu v hre Minesweeper sa kontroluje, či je hra prehratá alebo vyhratá.

  1. Ak hráč otvorí dlaždicu typu Mine, hra sa označí ako prehratá a skončí.
  2. Hra sa považuje za vyhratú, ak platí: počet všetkých dlaždíc - počet odokrytých dlaždíc = počet mín.
  3. Ak hra nebola ani vyhratá ani prehratá, pokračuje sa ďalším ťahom hráča.

Ťah hráča spočíva vo výbere typu akcie:

  • otvorenie dlaždice, len ak dlaždica je v stave CLOSED, realizované napr. metódou openTile(int row, int column),
  • označenie alebo od-značenie dlaždice - ak je dlaždica v stave CLOSED, prejde do stavu MARKED a opačne, realizované napr. metódou markTile(int row, int column).

Krok 5

Úloha 5.1

Nahrajte súbory s vašim návrhom (diagramy, textové dokumenty) do vášho repozitára na GitLab-e. Súbory môžete aktualizovať, popri tom ako na nich budete ďalej pracovať. Pred ďalším cvičením sa uistite, že máte v repozitári vaše aktuálne súbory. Zároveň si pripravte otázky, ktoré by ste na cvičení chceli vyriešiť.

Zdroje

  1. Detailnejšie informácie o hre Minesweeper na Wikipedii
  2. Hra Minesweeper online
  3. Zistite si viac o Maven projekte a jeho štruktúre, napr. na oficiálnych stránkach alebo v dokumentácii.

Nástroje pre tvorbu diagramov:

  1. Diagrams.net
  2. smartdraw
  3. UMLet
  4. Diagram Editor
  5. Gliffy
  6. Mermaid