/* Kompletně smazán původní a zastaralý obsah, lze ho případně dohledat na stránkách z předchozích let nebo v historii editů. */
====== Semestrální práce ======
Cílem semestrální práce je ověřit znalosti nabyté v rámci přednášek a cvičení, a umožnit studentům vyzkoušet si práci na větším projektu v Javě. Semestrální práci je možno vykonávat samostatně či ve dvojicích, větší skupiny nejsou dovoleny. Při práci ve dvojici se předpokládá, že rozsah celé práce bude větší než při samostatné práci. Studenti v týmu mohou být z různých paralelek - v tom případě se ale domluví s oběma cvičícími, u kterého z nich budou práci odevzdávat.
===== Zadání =====
Téma semestrální práce si můžete určit sami, a pro formalizaci zadání je určen první checkpoint (viz níže); případně si můžete vybrat jedno z předpřipravených témat níže. V tom případě se však očekává, že dané zadání "obohatíte" o vlastní netriviální funkcionalitu. Předpřipravená zadání vám také mohou sloužit jako vodítko pro vlastní téma, abyste stanovili dostatečný rozsah práce. Rozsah bude případně korigován vašim cvičícím v jednotlivých checkpointech.
* [[courses:b0b36pjv:semestral:herni_engine|Herní engine]]
* [[courses:b0b36pjv:semestral:simulace|Simulace]]
* [[courses:b0b36pjv:semestral:arima|Arimaa]]
===== Nutné požadavky =====
Nehledě na vybrané téma **musí** každá odevzdaná práce splňovat následující požadavky:
- Semestrální práce bude psána v Javě >=21 (či po domluvě se cvičícím v Kotlinu), a spravována pomocí Mavenu.
- Práce bude mít doložitelný progress na GitLab. **Průběžně** (každou hotovou funkcionalitu s popisem) commitují **všichni** členové týmu. Pozor: neadekvátně málo commitů (velmi orientačně: méně než 10) obvykle vzbudí u cvičících (oprávněné) podezření na plagiát!
- Oba účastníci projektu se musí podílet na tvorbě **GUI** pomocí platformy [[https://openjfx.io/|JavaFX]] (jiný framework pouze po dohodě). Alespoň jedna netriviální komponenta bude vytvořena bez použití [[https://gluonhq.com/products/scene-builder/|Scene Builderu]] či jiného "klikacího nástroje".
- V projektu student předvede schopnost správně použít **vlákna** (za to se nepovažuje použití např. třídy ''Timer''). Například vytvořením hodin reálného času, které interagují s průběhem hry. Jelikož se jedná o aplikaci JavaFX, doporučuji používat třídy ''Task'' nebo ''Service'' namísto ''Thread''.
- Několik netriviálních tříd bude pokryto **unittesty** nebo komplexnějším funkčním testem, za použití libovolného testovacího frameworku.
- Budou použity **loggery**. Logovací zprávy bude možno zapnout nebo vypnout parametrem při spuštění, či jinou uživatelskou interakcí (**nikoliv** editací zdrojového kódu).
- Stav aplikace (průběh hry, nastavení apod.) bude možné uložit. Preferovaný je zápis do souboru, je ale možné využít i jiné datové zdroje (např. databáze).
- Veškeré netriviální ''public'' prvky v programu musí mít smysluplný **Javadoc** (v kódu, není třeba generovat dokument). Za triviální se považují například jednoduché gettery a settery bez vedlejších efektů.
- Všechny netriviální části kódu budou vhodně **okomentovány**.
- Ve Wiki projektu musí být aktuální a použitelný **uživatelský manuál** (viz příklad v CP3) a **technická dokumentace** programu - jeho vlastností, struktura projektu, použité technologie podle výše popsaných podmínek. Pozor, nejedná se o Javadoc!
- Kód i komentáře v něm jsou psány **v angličtině**. Uživatelská a technická dokumentace může být psána i česky/slovensky.
V případě nesplnění některého z požadavků bude práce výrazně penalizována či vrácena studentovi k dopracování.
===== Odevzdání =====
Průběžná práce a samotné odevzdání semestrálních prací probíhá ve třech "Checkpointech", a to vždy v GitLab projektu, který vám byl automaticky založen na začátku semestru, a který naleznete na adrese ''%%https://gitlab.fel.cvut.cz/B252_B0B36PJV/username%%'' - tedy např. ''%%https://gitlab.fel.cvut.cz/B252_B0B36PJV/novakjan%%''. Jednotlivé checkpointy zároveň vždy nahrajte i pod patřičný upload do [[https://cw.felk.cvut.cz/brute|BRUTE]].
==== CP1 - Vize projektu ====
Termín odevzdání („deadline“): **8.3.2026**
Cílem tohoto odevzdání je formalizovat zadání, na kterém budete dále pracovat. Zadání bude odevzdáno ve formě **PDF dokumentu** (případně wiki stránce ve vašem GitLab projektu) o rozsahu ~2x A4, ve kterém je popsáno kompletní fungování aplikace z pohledu uživatele, a který by měl obsahovat:
* zvolené téma práce
* manažerské shrnutí - 1 - 2 odstavce, představující vizi projektu
* podrobný popis funkcionalit, které bude/nebude práce umět, jako:
* průběh a cíl hry
* vlastnosti postavy
* popis předmětů ve hře, jejich vlastnosti (a případná interakce s nimi)
* ovládání, způsob načítání a ukládání
* a další...
* pro lepší pochopení lze přidat obrázky jako wireframes obrazovek, náčrty herního pole nebo herních map, vizuální návrhy prvků aplikace, apod.
V této fázi byste tedy měli mít podrobně vymyšlený celý projekt, a mělo by stačit se pustit do programování. Pro inspiraci si můžete prohlédnout, jak by měla vypadat {{ :courses:b0b36pjv:semestral:cp1_correct.pdf |správně}} odevzdaná vize projektu, a jak naopak {{ :courses:b0b36pjv:semestral:cp1_wrong.pdf |špatná}} (vč. komentářů, co je na dokumentu špatně).
Cvičící bude hodnotit podrobnost dokumentu, jeho formu i rozsah celé práce.
==== CP2 - Objektový návrh ====
Termín odevzdání („deadline“): **12.4.2026**
V rámci druhého checkpointu připravíte ve svém repozitáři (a odevzdáte pod patřičný upload do BRUTE):
* kostru kódu
* deklarace tříd, jejich vlastností a metod
* dědičnost a další vazby mezi třídami
* základní technickou dokumentaci
* zjednodušený diagram tříd a vztahů mezi nimi
* popis stavů hry/aplikace
* použité technologie, knihovny, apod.
* rozdělení práce mezi členy týmu (pokud pracujete ve dvojici)
Po tomto odevzdání by se základní struktura kódu neměla výrazně lišit, a mělo by stačit pouze doimplementovat předpřipravené třídy.
==== CP3 - Finální prezentace ====
Termín odevzdání („deadline“): **22.5.2026**
Poslední checkpoint je zaměřen nejen na dokončení celého projektu dle zadání z CP1, ale i finální prezentaci, jejíž formu vám sdělí cvičící na hodině.
Součástí odevzdání je i uživatelská dokumentace, která může být formou uživatelského manuálu, a která zahrnuje všechny podstatné aspekty aplikace (včetně jejího spuštění!). Inspirací vám může být například [[https://shared.fastly.steamstatic.com/store_item_assets/steam/apps/12360/manuals/Manual-Global.pdf|tato příručka pro hru FlatOut UC]].
Dokončena by měla být i technická dokumentace, obohacena o dokumentaci ve formátu JavaDoc (není třeba generovat HTML formu!). Pokud bude použita komunikace po síti, doporučuje se specifikovat komunikační protokol - tedy jaká data a v jakém formátu se budou mezi serverem a klientem posílat.
Kompletní práce se odevzdává během dvou posledních týdnů semestru. V případě dvojic se **oba** členové týmu **musí** zúčastnit odevzdání společně, a **oba musí** rozumět a být schopni odpovědět na otázky ohledně všech částí kódu (tedy nejen svých).
Jiný termín odevzdání je možný **pouze** ve výjimečných případech (nemoc, apod.) a po předchozí domluvě s cvičícím minimálně týden před oficiálním deadlinem!
===== Hodnocení =====
Za semestrální práci vám může být uděleno **maximálně 45 bodů**; **minimálně** však musíte získat:
* **20 bodů** z celé práce;
* **15 bodů** z finálního hodnocení (CP3);
* **alespoň jeden bod** z **každé** položky níže.
Práce jsou hodnoceny dle následující tabulky:
^ ^Položka^Max bodů^Poznámka^
|**CP1**|Vize projektu |5 |5b = jasně a podrobně popsaná vize projektu\\ 4–3b = mírné nejasnosti v částech popisu\\ 2–1b = výrazné nejasnosti v částech popisu či chybějící popis mechanik\\ 0b = příliš obecný popis, chybějící odevzdání |
|**CP2**|Objektový návrh |7 |7b = jasný a podrobný objektový návrh\\ 6–4b = mírné nejasnosti/chyby v částech návrhu\\ 3–1b = výrazné nejasnosti/chyby v částech návrhu či chybějící vlastnosti/vazby\\ 0b = návrh bez vlastností/vazeb, chybějící odevzdání |
|**CP3**|Rozsah implementace |10 |Plný počet za implementaci všech funkcí uvedených v zadání\\ až -2b za každou chybějící či nefunkční funkcionalitu |
|:::|Kvalita kódu|10 |Plný počet za vhodně navržený datový model, minimum duplicitního kódu a snadnou rozšířitelnost\\ až -4b za nevhodnou strukturu tříd a metod\\ až -3b za neduhy v datovém modelu\\ až -3b za nečitelnost kódu (příliš dlouhé metody, jména proměnných apod.) |
|:::|Funkčnost |5 |Plný počet za korektní chování programu v běžných i hraničních případech\\ -2b za každý neošetřený "edge-case", spadnutí programu apod. |
|:::|Dokumentace |5 |až 2.5b za uživatelskou dokumentaci (instalace, návod k použití apod.)\\ až 2.5b za technickou dokumentaci (diagramy, popis architektury, JavaDoc v kódu)|
|:::|Správné použití GITu |3 |3–2b = vhodné používání větví, merge requestů, issues apod.\\ 1b = základní práce s GITem (řádná velikost/pravidelnost commitů)\\ 0b = neprokazatelná historie (moc málo/moc velké commity) |
| **Celkem bodů**||**45**|
Pozdní odevzdání **každého** z "checkpointů" je penalizováno 1b za každých započatých 72h.