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