Hra 16 vojáků
Implementace v naších končinách poměrně neznámé deskové hry 16 vojáků. Program vznikl jakožto ročníkový projekt ve druhém ročníku studia aplikované informatiky na Univerzitě Palackého.
Program je napsán v jazyce Java, pro jeho zpuštění je tedy nutné mít nainstalovanou Javu. Program by díky zvolenému jazyku teoreticky měl být multiplatformní.
Zde dávám k dispozici veškeré materiály s aplikací související – aplikaci, zdrojové kódy a dokumentaci.
Zveřejněné materiály můžete libovolně použít pro vlastní práci, jen vždy nezapomeňte uvést autora ;) A také si nezapomeňte nejdříve přečíst část Komentáře ze současného pohledu, neboť některé části aplikace nejsou napsané zrovna nejlépe a tudíž není vhodné je dále využívat či se jimi ve větší míře inspirovat.
Pravidla hry
- Hra se hraje na následující hrací desce:

- Hráči hrají s 16 kameny, jeden má kameny barvy černé a druhý bílé. Kameny jsou na začátku hry rozestaveny na opačných stranách hrací desky.
- Hráči se střídají po jednom tahu. Začíná černý.
- Při tahu hráč posune jeden ze svých kamenů po čáře na sousední opěrný bod. Opěrné body jsou místa, kde se stýkají nebo protínají nejméně dvě čáry.
- Posun je povolen všemi směry. Lze vstoupit jen na opěrné body které nejsou obsazeny jiným kamenem.
- Jestliže je za bodem obsazeným protihráčovým kamenem další opěrný bod v přímém směru volný, může náš kámen cizí kámen přeskočit a zajmout - podobně jako při dámě. Zajatý kámen je ihned odstraněn z desky.
- Vícenásobné přeskoky jsou dovoleny všemi směry.
- Trojúhelníkové výběžky na okrajích herní desky jsou považovány za útočiště a kámen, který se tam uchýlí, smí být posunut při jednom tahu o dva body dále. Až trojúhelníkové útočiště opustí, smí se opět pohybovat jen o jediný bod.
- Vítězí ten, kdo zajme všechny soupeřovy kameny.
- Když zůstane oběma hráčům po jediném kamenu, dohodnou se na remíze.
Požadavky na projekt
- korektní implementace pravidel hry (nemožnost provést tah odporující pravidlům, správnéukončení hry, a podobně)
- algoritmy pro herní strategii, nastavitelná obtížnost hry v adekvátním rozsahu
- možnost hry dvou lidí, člověka proti počítači, a počítače proti počítači
- možnost nastavit a kdykoliv změnit obtížnost i v průběhu hry
- možnost kdykoliv zaměnit počítačového a lidského hráče, nebo černého a bílého hráče (bez ohledu na to, je-li hráčem člověk nebo počítač, změna i v průběhu hry)
- nápověda nejlepšího tahu
- ukládání a načítání (ukončených, rozehraných) partií
- undo/redo tahů do libovolné úrovně
- prohlížení historie tahů (přehledné zobrazení provedených tahů)
- zpětné přehrání partie po jejím dokončení (replay) s možností zastavení přehrávání, pohybu v historii stavů hry a opětovného rozběhnutí hry ze zvoleného stavu. Při zastavení přehrávání možnost začít novou hru nebo otevřít uloženou hru.
- robustnost (program musí reagovat správně na nesprávné uživatelské vstupy, zejména ovládání, vadný formát souboru apod., aplikace nesmí havarovat)
- vestavěná nápověda
- grafické uživatelské rozhraní (GUI) se zpracované podle standardů
- program ve spustitelné formě, je-li to pro zprovoznění aplikace nutné pak také instalátor
- kompletní zdrojové kódy programu včetně dalších částí nutných pro sestavení aplikace
- programátorská dokumentace k projektu vytvořená pomocí závazného stylu (PDF verze a zdrojová verze). Obsahuje zejména popis struktury kódu, algoritmy hry včetně herní strategie, postup pro sestavení aplikace. Dokumentace nemusí obsahovat uživatelskou příručku.
Ke stažení
Komentáře ze současného pohledu
Aplikace je dvouvrstvá – v jedné vrstvě je logická část, ve druhé je grafické rozhraní. Tyto části jsou od sebe odděleny a mohou být vyměněny bez ovlivnění té druhé. Každá taktéž běží v samostatném vlákně.
Logická vrstva vznikala postupně během prvního semestru a její návrh považuji za docela dobrý a praktický. Mírné vylepšení by si sice zasloužil návrh tříd na úrovni metod (některé jsou moc dlouhé atp.), občas by bylo vhodné zpřehlednit kód či přejmenovat proměnné, ale v souhrnu to není nic klíčového.
Grafické rozhraní je bohužel jiná kapitola. To vzniklo v druhém semestru a bylo postiženo dvěmi problémy. Jednak mojí nezkušeností s tvorbou grafického rozhraní (bylo to první trošku rozsáhlejší GUI které jsem kdy dělal). Druhak tzv. studentským syndromem - když je na jeden velký úkol hodně času, realizátor si obvykle čas náležitě nerozdělí, ale většinu času se fláká a na poslední chvíli se snaží vše dohnat. Konkrétně poslední úpravy jsem dokončil cca tři čtvrtě hodiny před deadline pro odevzdání.
Celé grafické rozhraní je napraseno do jedné třídy obsahující navíc jednu nechutně dlouhou metodu a místy vcelku zběsilou synchronizaci vláken (synchronizace bylo to, co jsem opravoval těsně před odevzdáním). Celkově se v tom asi již nikdy niko nevyzná.
Ale splnilo to okamžitý účel – funguje to a projekt jsem úspěšně obhájil (na kód se naštěstí nikdo nedíval).
Teď to již předělávat nebudu, neboť by to byla spousta práce pro nic. Berte tedy tuto část aplikace jako poučení pro vlastní aplikace – aneb tak takhle se to opravdu dělat nemá :)) A také jako varování před tím, co se stane, když se snažíte aplikaci mermomocí dodělat na poslední chvíli.