IT rekvalifikácia. Seniorní programátori zarábajú až 6 000 €/mesiac a rekvalifikácia je prvým krokom. Zisti, ako na to!

Príliš hlučná samota

Pôvodne som chcel vytvoriť hru, ktorá by bola podobná skladník alebo známemu Sokoban, ale s náhodne generovanými úrovňami. Keď som potom premýšľal nad názvom a nad grafikou, napadlo ma, že to nemusí byť vždy nutne zrovna o uskladňovaní debien. Najprv ma napadlo, že urobím hru o kotelníkovi, ktorý tlačí vozíky uhlia do kotla. Hneď potom sa mi vybavila spomienka na známu novelu B. Hrabala, v ktorej hlavný hrdina HANT po 35 rokov lisoval starý papier. Od toho sa tiež odvinula nápad preložiť úrovne príbehom, v ktorom sú niekedy parafrázovanie, niekedy citované a niekedy len spomenuté udalosti či myšlienky z knihy.

hra - Zdrojákoviště C # .NET - Okenné aplikácie WPF

Kód

Jedná sa o klasickú WPF aplikáciu, v ktorej je dodržiavaný vzor Model-View-ViewModel. Obsahuje niekoľko tried (pre ukladanie hry, pre ukladanie výsledkov a pod.), Väčšinu práce pritom odvádza najväčší trieda Hra.cs. Základom každej úrovne je mapa, ktorá má podobu dvojrozmerného poľa typu char, v ktorom jednotlivé symboly značí, čo na danom mieste je (napr. 'p' je 'podlaha').

Samotné generovanie nových úrovní bol asi najväčší oriešok: bolo potrebné zaviesť opatrenia, aby nevznikali úrovne, ktoré nie sú riešiteľné. Napr. keď sa pri robení chodby zmení smer, spustí sa režim vykresľovania zákruty, ktorý pridáva políčka podlahy aj do strán. Nesmie ich však zase pridávať príliš moc, inak by hra bola triviálne. Aj tak je skôr o pozornosti a nevybavené chyby (nezatlačení balíka ku stene či k iným balíkom tak, že už nepôjde dostať do lisu) ako vyložene o potrebe začať s každou novou úrovňou uvažovať inak. Od umiestnených balíkov sa počítajú priechodná trasy k lisu, aby bolo isté, že k nemu s daným balíkom možno dôjsť.

Po vytvorení mapy do poľa nasleduje jej vykreslenie, k čomu je použitý Canvas, na ktorý sa postupne sadia políčka zodpovedajúce poli. Potom už je možná hra, ktorá sa ovláda šípkami. Pri pohybe postavičky či balíkov sa nepřekresluje neustále celá plocha. To by síce išlo, ale bolo by to zbytočne pomalé a náročné na výpočet. Namiesto toho sa len na nové políčko (ak možno na neho ísť) vykreslí postavička či debna a na to staré podlaha. HANT má rôzne obrázky, podľa toho, či ide práve hore, doprava a doľava alebo nadol.

Problémy sa hrou vznikajú, keď má niekto vo Windows nastavenej iné merítko ako 100%: vďaka pevne nastaveným rozmerom sa môžu v prípade vyššej hodnoty (napríklad 125%) jej (horná a dolná) časti (najmä na širokouhlých monitoroch) objaviť mimo obraz. Problémy by teoreticky mohli taky vyvstať pri spúšťaní v sandboxe antivírusu, ale to nemám úplne overené.

príbehová vsuvka - Zdrojákoviště C # .NET - Okenné aplikácie WPF

Hra

Pred samotným spustením hry, na tretiu obrazovke, kde sú vypísané pravidlá i ovládanie, je možnosť šípkami nastaviť dĺžku hry (tj. Počet levelov a ako často sa obmieňa textúra múrov a posúva príbeh) aj počty balíkov v hre.

V každej úrovni ide o dostaniu všetkých balíkov do lisu (čo odpočítava počítadlo). Keď sa tak stane, načíta sa nová úroveň. Medzi niektorými úrovňami sú pritom príbehové vstupy. Väčšina úrovňou by mala byť riešiteľná, ale keby náhodou nie, popr. keby sa hráč zasekol (pretože napríklad zatlačí balík do pozície, z ktorej už ho nedostane), je možné si klávesom "R" nechať vygenerovať nový layout danej úrovne (úroveň sa týmto nebudú pripisovať). Ďalšou možnosťou záchrany balíka z beznádejnej situácie je obmedzená možnosť balík ťahať po stlačení klávesy Z. Tiahnutie balíku je však fyzicky náročné, preto stojí každé políčko Hant jedno fľašové pivo, ktorá sa pomerne riedko vyskytujú v niektorých leveloch. Keď má pri sebe 0 pív, ťahať balíky nemôže (a je smutný).

Príbehový režim hry má (pri nastavenej štandardnej dĺžke) 30 štandardných a jednu trochu inú úroveň. Pri postupe úrovňami sa čas od času mení textúra múrov. Potom je možné pokračovať v tzv. "Nekonečnej hre", kedy sa už textúry nemení, príbeh nepokračuje a nenasleduje žiadny koniec. Čím vyššia úroveň, tým viac balíkov (ktoré sú skôr ďaleko od seba, ale neskôr sa začnú spawnovat vedľa seba, takže je potrebné ich najskôr nejako "rozdeliť"), ale tým tiež viac otvoreného priestoru.

Dohrať príbehovú časť hry by malo (pri nastavenej štandardnej dĺžke) trvať asi 20-30 minút. Po dohraní príbehu sa objaví okno pre zadanie prezývky a výsledné skóre sa zapíše do rebríčka (ktorý je uložený v XML). Skóre sa pripisuje za zlisovaný balík, pritom sa však odvíja od priemerného počtu krokov za úroveň. Preto by sa mal hráč snažiť, ak chce vyložene maximalizovať svoje skóre, o čo najefektívnejšie prechádzanie úrovní. Skóre sa tiež pripisuje za nájdenie fľaškového piva a odpočíta za nové vygenerovanie úrovne skrz kláves "R" (inak by mohol hráč tak dlho generovať, až by vygeneroval tú najvýhodnejšiu variantu).

Hru je možné uložiť klávesom F5 a opäť nahrať (potrebné pri ďalšom spustení aplikácie) klávesom F9. Pozície sa ukladá do XML.

Pomocníka i príbeh sú (podľa zadania) v angličtine, ale keby chcel niekto prechádzať zdrojový kód, tam sú komentáre aj väčšina názvov atribútov či metód česky. K hre je pomocou SoundPlayer pridaná hudba (royalty free z netu), už možno klávesou M vypínať a zapínať.

hra - Zdrojákoviště C # .NET - Okenné aplikácie WPF

Tím

Hru som robil sám.

Prílohy

V prílohe sú (v archíve) vybuildované EXE sa hrou a zložka sa solution.

Hodnotenie poroty

Tento projekt sa zúčastnil súťaže ITnetwork summer 2020.

porotca bodov hodnotenie
Zdrojákoviště C # .NET - Okenné aplikácie WPF
David Čapka
8 Nádejný remake Sokoban s príbehom, čo je naozaj dobrý nápad na oživenie herné mechaniky. S postavou som sa ale nejako nesžil, možno, že pitie piva na získanie energie mi nejako nesadne. Automatické generovanie levelov je dobrý nápad a tým príbehom a striedaním textúr by si sa mohol vyhnúť určitej šablonovitosti. Určite si ale hral Sokoban a vieš, že levely sa dosť rôzni, je tam dôvtip ľudského faktora, kedy v prvom leveli stačí pomaly tlačiť jednu debnu rovno, aby hráč pochopil, čo má robiť, v ďalšom už musí zistiť, že sa nesmie zaseknúť o stenu a podobne. Ty máš tú istú obtiažnosť v každom leveli, je niekde na začiatku pôvodného Sokoban, kedy sa človek nesmie prekliknúť, ale je to vygenerované tak, aby bez premýšľania level väčšinou vyhrá, takže potom už len mechanicky hýbe panáčikom a skôr sa nudí. Určite by sa dalo časť levelu vygenerovať úplne náhodne a potom to skúsiť algoritmom, či sa to dá vyhrať, verím, že by tam niekedy vznikli zaujímavé veci. Ako ďalší prvok by generátor mohol okrem náhodného segmente používať nejaké blokové, už predpripravené segmenty, inšpirované klasickým Sokoban (tam bolo snáď 50 levelov). Čo sa týka implementácie, určite by som neukladal políčka ako char, ale urobil enum, od toho tam je. Prekresľovanie je určite lepšie dať na celú obrazovku, než mazať textúru za postavou, umožnilo by to potrebné plynulý pohyb.
Zdrojákoviště C # .NET - Okenné aplikácie WPF
Samuel Hél
7 Hra má príbeh s obrázkami a herné prvky Sokoban. Cením novú funkciu ťahať bedňu k sebe za pozbierané pivko. Páči sa mi použitie náhodne vygenerovaných levelov, obtiažnosť mi príde ale málo stupňujúci a po chvíľke hra vďaka tomu nudí a len tupo robíte furt to isté dokola.
Zdrojákoviště C # .NET - Okenné aplikácie WPF
michal Čapka
7.5 Aj mne to dosť evokuje Sokoban, ktorého som mal veľmi rád. Na rozdiel od neho je tu aj možnosť ťahať bedňu, ktorá sa kompenzuje spotrebou piva, čo mi príde ako super nápad. Takisto sa mi páči aj to, že si sa tomu snažil dať nejaký príbeh, aby to nebolo len monotónna posúvanie debien z A do bodu B. Budem sa opakovať, ale rovnako ako ostatným mi tu časom chýbala nejaká výzva, pretože obtiažnosť levelov sa bohužiaľ nestupňovala .

Galéria


 

Stiahnuť

Stiahnutím nasledujúceho súboru súhlasíš s licenčnými podmienkami

Stiahnuté 8x (71.26 MB)
Aplikácia je vrátane zdrojových kódov v jazyku C#

 

Všetky články v sekcii
Zdrojákoviště C # .NET - Okenné aplikácie WPF
Článok pre vás napísal Jakub Raida
Avatar
Užívateľské hodnotenie:
Ešte nikto nehodnotil, buď prvý!
Autor má rád literaturu, dějiny, filmy, počítačové hry, paleontologii, vesmír a programování.
Aktivity