IT rekvalifikace s garancí práce. Seniorní programátoři vydělávají až 160 000 Kč/měsíc a rekvalifikace je prvním krokem. Zjisti, jak na to!
Hledáme nové posily do ITnetwork týmu. Podívej se na volné pozice a přidej se do nejagilnější firmy na trhu - Více informací.

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.

Hra - Zdrojákoviště C# .NET - Okenní aplikace WPF

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é.

Příběhová vsuvka - Zdrojákoviště C# .NET - Okenní aplikace WPF

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.

Hra - Zdrojákoviště C# .NET - Okenní aplikace WPF

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í
Zdrojákoviště C# .NET - Okenní aplikace WPF
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.
Zdrojákoviště C# .NET - Okenní aplikace WPF
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.
Zdrojákoviště C# .NET - Okenní aplikace WPF
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

Hra byla vytvořena v roce 2020.

 

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#

 

Všechny články v sekci
Zdrojákoviště C# .NET - Okenní aplikace WPF
Článek pro vás napsal Jakub Raida
Avatar
Uživatelské hodnocení:
1 hlasů
Autor má rád literaturu, dějiny, filmy, počítačové hry, paleontologii, vesmír a programování.
Aktivity