Na začátku jsme brainstormovali zadání - hra s hrdinou, co se snaží projít bludištěm (do nějakého cílového políčka). Variace je Sokoban = hrdina posouvá bedny na cílová místa. Exotičtější varianta je třeba Boulder Dash ve kterém se pracuje i s jednoduchou gravitací.
Bludiště je čtvercová síť. Představte si čtverečkovaný papír, nebo šachy. Buňky indexujeme dvojicí čísel - například 5,3 jsou souřadnice buňky 5 vpravo a 3 dolů od výchozího bodu (zpravidla levý horní roh je souřadnice 0,0). Každá buňka bludiště má nějaký výchozí stav (například že jde o prázdné místo nebo zeď). Krom toho jsou v bludišti nějaká speciální místa (například start a cíl) a pohybující se věci - hráč a příšery.
V kódu máme pro lepší přehlednost souřadnice většinou jako objekt: {x:5, y:3}
. V našem kódu máme základní neměnnou mapu v dvojitém poli: mapa[y][x]
tedy například mapa[3][5]
obsahuje hodnotu X
což značí zeď. Pozor - indexy jsou opravdu přehozeny, první y druhé x - první je totiž index řádku = vnější a druhý index jednotlivé buňky v řádku.
Ve hře máme i pohyblivé objekty: hráče a příšery. Pro jednodušší pohybování tyto objekty nejsou uvnitř pole mapa
(ta může být tedy neměnná po celou hru), ale jsou vyjádřeni souřadnicí například let player = {x: 3, y:2}
. O kombinaci mapy a těchto dynamických objektů se stará funkce vykresli
- v našem případě je trochu složitější, protože je schopná si ad hoc vytvořit html elementy (buňky) které potřebuje.
Co jsme za ten měsíc s bludištěm zkoušeli?
* pohyb hráče pomocí kláves
* přidání příšer a jejich pohyb
* příšery mohou mít různou strategii (ideově „pluginy“)
* (experiment): přigenerovávání mapy (random zdi)
Co ještě nemáme?
* vykresli
si nedovede poradit s jiným počtem příšer než 2
* nedetekujeme že hráč došel na konec
* neděláme game over když se příšera a hráč dostanou na stejné políčko
Královskou disciplínou v bludišti je hledání nejkratší cesty - například pro hráče, aby se dostal k cíli. Může jít ale také o hledání cesty příšery k hráči aby ho snědla. Podobný algoritmus se také používá k generování a kontrole automaticky generovaných bludišť. Hledání nemusí být příliš výpočetně náročné, dá se tedy opakovat při každém tahu - a například reagovat na dynamické jevy (překážky, příšery). Ve hrách se spojitým světem se tomu říká pathfinding
bludiste-hledani.zip - verze s funkčním hledáním, okomentováno