Příliš hlučná samota
Původně jsem chtěl vytvořit hru, která by byla podobná Skladníkovi či známému Sokobanu, ale s náhodně generovanými úrovněmi. Když jsem pak přemýšlel nad názvem a nad grafikou, napadlo mě, že to nemusí být vždy nutně zrovna o uskladňování beden. Prvně mě napadlo, že udělám hru o kotelníkovi, který tlačí vozíky uhlí do kotle. Hned pak se mi vybavila vzpomínka na známou novelu B. Hrabala, ve které hlavní hrdina Hanťa po 35 let lisoval starý papír. Od toho se též odvinul nápad proložit úrovně příběhem, v němž jsou někdy parafrázovány, někdy citovány a někdy jen zmíněny události či myšlenky z knihy.
Kód
Jedná se o klasickou WPF aplikaci, v níž je dodržován vzor
Model-View-ViewModel. Obsahuje několik tříd (pro ukládání hry, pro
ukládání výsledků apod.), většinu práce přitom odvádí největší
třída Hra.cs
. Základem každé úrovně je mapa, která má
podobu dvojrozměrného pole typu char
, ve kterém jednotlivé
symboly značí, co na daném místě je (např. 'p'
je
'podlaha').
Samotné generování nových úrovní byl asi největší oříšek: bylo třeba zavést opatření, aby nevznikaly úrovně, které nejsou řešitelné. Např. když se při dělání chodby změní směr, spustí se režim vykreslování zatáčky, který přidává políčka podlahy i do stran. Nesmí jich však zase přidávat příliš moc, jinak by hra byla triviální. I tak je spíše o pozornosti a neudělání chyby (nezatlačení balíku ke zdi či k jiným balíkům tak, že už nepůjde dostat do lisu) než vyloženě o potřebě začít s každou novou úrovní uvažovat jinak. Od umístěných balíků se počítají průchozí trasy k lisu, aby bylo jisté, že k němu s daným balíkem lze dojít.
Po vytvoření mapy do pole následuje její vykreslení, k čemuž je
použit Canvas
, na který se postupně sázejí políčka
odpovídající poli. Pak už je možná hra, která se ovládá šipkami. Při
pohybu postavičky či balíků se nepřekresluje neustále celá plocha. To by
sice šlo, ale bylo by to zbytečně pomalé a náročné na výpočet. Místo
toho se jen na nové políčko (lze-li na něj jít) vykreslí postavička či
bedna a na to staré podlaha. Hanťa má různé obrázky, podle toho, jestli
jde zrovna nahoru, doprava, doleva či dolů.
Problémy se hrou vznikají, když má někdo ve Windows nastavené jiné měřítko než 100 %: díky pevně nastaveným rozměrům se mohou v případě vyšší hodnoty (třeba 125 %) její (horní a dolní) části (zejména na širokoúhlých monitorech) objevit mimo obraz. Problémy by teoreticky mohly taky vyvstat při spouštění v sandboxu antiviru, ale to nemám úplně ověřené.
Hra
Před samotným spuštěním hry, na třetí obrazovce, kde jsou vypsána pravidla i ovládání, je možnost šipkami nastavit délku hry (tj. počet levelů a jak často se obměňuje textura zdí a posunuje příběh) i počty balíků ve hře.
V každé úrovni jde o dostání všech balíků do lisu (což
odpočítává počítadlo). Když se tak stane, načte se nová úroveň. Mezi
některými úrovněmi jsou přitom příběhové vstupy. Většina úrovní by
měla být řešitelná, ale kdyby náhodou ne, popř. kdyby se hráč zasekl
(protože třeba zatlačí balík do pozice, z níž už jej nedostane), je
možné si klávesou "R" nechat vygenerovat nový layout dané úrovně
(úroveň se tímto nepřičte). Další možností záchrany balíku z
beznadějné situace je omezená možnost balík táhnout po stisku klávesy
Z. Táhnutí balíku je však fyzicky náročné, proto stojí
každé políčko Hanťu jedno láhvové pivo, která se poměrně řídce
vyskytují v některých levelech. Když má u sebe 0
piv, táhnout
balíky nemůže (a je smutný).
Příběhový režim hry má (při nastavené standardní délce) 30 standardních a jednu poněkud jinou úroveň. Při postupu úrovněmi se čas od času mění textura zdí. Poté je možné pokračovat v tzv. "nekonečné hře", kdy se již textury nemění, příběh nepokračuje a nenásleduje žádný konec. Čím vyšší úroveň, tím více balíků (které jsou dříve daleko od sebe, ale později se začnou spawnovat vedle sebe, takže je třeba je nejdřív nějak "rozdělit"), ale tím také více otevřeného prostoru.
Dohrát příběhovou část hry by mělo (při nastavené standardní délce) trvat asi 20-30 minut. Po dohrání příběhu se objeví okno pro zadání přezdívky a výsledné skóre se zapíše do žebříčku (který je uložený v XML). Skóre se přičítá za slisovaný balík, přitom se však odvíjí od průměrného počtu kroků za úroveň. Proto by se měl hráč snažit, chce-li vyloženě maximalizovat své skóre, o co nejefektivnější procházení úrovní. Skóre se také přičítá za nalezení lahvového piva a odečítá za nové vygenerování úrovně skrz klávesu "R" (jinak by mohl hráč tak dlouho generovat, až by vygeneroval tu nejvýhodnější variantu).
Hru je možné uložit klávesou F5 a opět nahrát (třeba při dalším spuštění aplikace) klávesou F9. Pozice se ukládá do XML.
Nápovědy i příběh jsou (dle zadání) v angličtině, ale kdyby chtěl
někdo procházet zdrojový kód, tam jsou komentáře i většina názvů
atributů či metod česky. Ke hře je pomocí SoundPlayer
přidána hudba (royalty free z netu), již lze klávesou M vypínat
a zapínat.
Tým
Hru jsem dělal sám.
Přílohy
V příloze jsou (v archivu) vybuildované EXE se hrou a složka se solution.
Hodnocení poroty
Tento projekt se účastnil soutěže ITnetwork summer 2020.
Porotce | Bodů | Hodnocení |
---|---|---|
David Čápka |
8 | Nadějný remake Sokobana s příběhem, což je opravdu dobrý nápad na
oživení herní mechaniky. S postavou jsem se ale nějak nesžil, možná, že
pití piva pro získání energie mi nějak nesedne. Automatické generování
levelů je dobrý nápad a tím příběhem a střídáním textur by jsi se
mohl vyhnout určité šablonovitosti. Určitě jsi ale hrál Sokobany a víš,
že levely se dost různí, je tam důvtip lidského faktoru, kdy v prvním
levelu stačí pomalu tlačit jednu bednu rovně, aby hráč pochopil, co má
dělat, v dalším už musí zjistit, že se nesmí zaseknout o zeď a podobně.
Ty máš tu samou obtížnost v každém levelu, je někde na začátku
původního Sokobana, kdy se člověk nesmí překliknout, ale je to
vygenerované tak, aby bez přemýšlení level většinou vyhraje, takže pak
už jen mechanicky hýbe panáčkem a spíše se nudí. Určitě by se dalo
část levelu vygenerovat úplně náhodně a pak to zkusit algoritmem, zda se
to dá vyhrát, věřím, že by tam někdy vznikly zajímavé věci. Jako
další prvek by generátor mohl kromě náhodného segmentu používat nějaké
blokové, již předpřipravené segmenty, inspirované klasickým Sokobanem
(tam bylo snad 50 levelů). Co se týká implementace, určitě bych neukládal
políčka jako char , ale udělal enum , od toho tam je.
Překreslování je určitě lepší dát na celou obrazovku, než mazat texturu
za postavou, umožnilo by to třeba plynulý pohyb. |
Samuel Hél |
7 | Hra má příběh s obrázky a herní prvky Sokobana. Cením novou funkci táhnout bednu k sobě za posbíraná pivka. Líbí se mi použití náhodně vygenerovaných levelů, obtížnost mi přijde ale málo stupňující a po chvilce hra díky tomu nudí a jen tupě děláte furt to samé dokola. |
Michal Čápka |
7.5 | I mně to dost evokuje Sokobana, kterého jsem měl moc rád. Na rozdíl od něj je zde i možnost táhnout bednu, která se kompenzuje spotřebou piva, což mi přijde jako super nápad. Rovněž se mi líbí i to, že ses tomu snažil dát nějaký příběh, aby to nebylo jen monotónní posouvání beden z bodu A do bodu B. Budu se opakovat, ale stejně jako ostatním mi zde časem chyběla nějaká výzva, protože obtížnost levelů se bohužel nestupňovala. |
Galerie
Stáhnout
Stažením následujícího souboru souhlasíš s licenčními podmínkami
Staženo 8x (71.26 MB)
Aplikace je včetně zdrojových kódů v jazyce C#