logo

Bastlíš, bastlím, bastlíme...

Programování je zajímavá a pro Amigu i velmi záslužná činnost, protože dobrého softu je na Amize poslední dobou pomálu. V tomto seriálku bych se chtěl věnonat právě programování a systému "zevnitř". Programování bude spíš ve formě popisu různých zajímavých algoritmů a "fíglů" jak co udělat. A systém zevnitř ? Tak to bude asi pro Vás to nejzajímavější z mého snažení, protože se chystám vytvořit něco jako "Malý průvodce AMIGA DOSu pro bastlíře". Zkrátka a dobře - (velmi) stručně okomentovaný překlad
>>> AMIGA Developer CD V1.1 <<<.
 
      Mno, nechám už úvodů a vokecávek a vrhnu se do akce.
 
  Dnes jsem si pro Vás připravil lahůdečku v podobě hry Sokoban - notoricky známé pařby snad ze všech počítačových platforem, které kdy spatřily světlo světa.

  Pravidla hry jsou primitivní a zná je asi každý, ale pro jistotu je ještě zopakuju. Základem je určité bludiště, ve kterém jsou rozmístěny kameny a plošinky. Hráč, reprezentovaný nějakou postavičkou, musí všechny kameny dotlačit právě na ty plošinky. V této činnosti ho omezuje jednak bludiště, kterým se musí proplétat, a také fakt, že kameny může jen tlačit před sebou a to vždy jen jeden kámen. Jednoduché, ale věřte tomu, že to dokáže pěkně potrápit mozkovnu.
 
  Začneme tím, že si vyjmenujeme aktéry naší hry:

  1. Zeď - Zdi tvoří vlastní bludiště, nelze jimi procházet ani přez ně tlačit kameny (kupodivu:)).
  2. Podlaha - Reprezentuje plochu, po které může hráč chodit a kutálet kameny.
  3. Plošinka - Na každou je potřeba umístnit kámen a tím plnit poslání hry. Je doufám jasné, že kámen lze na plošinku jak natlačit, tak i z ní vytlačit ven.
  4. Kámen - Neřád, o kterém se Vám bude celé noci zdát... Můžete ho jen tlačit. Při pohybu se zarazí o zeď nebo o jiný kámen.
  5. Hráč - Pobíhá po bludišti a občas strčí do nějakého kamenu nebo vrazí do zdi.

  Nyní již známe vše potřebné pro naší hru. Dáme se tedy do práce...
 
  Začneme bludištěm. Je to určité pole, které obsahuje informace o rozmístnění zdí, podlahy a plošinek. Může mít tvar čtverce nebo obdélníku. Jeho nejvhodnější realizace je dvourozměrné pole obsahující kódy, které reprezentují zdi a všecho ostatní. V Basicu by to vypadalo asi takhle:
 
        Dim bludiste(19,19)
 
Teto příkaz (Dim) vytvoří v paměti dvourozměrné pole o rozměrech 20 řádků a 20 sloupců (souřadnice jsou vždy 0 až 19). Toto pole je potřeba naplnit daty, které nám popíšou tvar bludiště. Nejdříve celé pole vynulujeme - třeba nějakým For-Next cyklem. Tam, kde má být zeď, zapíšeme jedničku, podlahu nahradíme dvojkou a plošinku trojkou (čísla mohou být samozřejmě libovolná). Tím jsme získali jednoduchý popis levelu a můžeme se věnovat kamenům.
 
  Pro kameny si vytvoříme zvláštní pole se stejnými rozměry, jaké má bludiště (např. Dim kameny(20,20)). Toto pole také nejdříve vynulujeme a pak do něj zapíšeme rozmístnění kamenů. Dejme tomu, že tam, kde má být kámen, dáme čtyřku. Proč je potřeba další pole jen na kameny ? Mno, nemuselo by být, ale ušetří to pár podmínek při vyhodnocování pohybů kamenů.
 
  A co hráč ? Ten existuje v podobě dvou proměných, které udávají jeho pozici v poli bludiste() a zároveň i v poli kameny(). Např. PlayerX (sloupec) PlayrY (řádka).

  Je taky dobré si někde pamatovat, kolik je kamenů ve hře a kolik znich už je na svém místě. Proměnné "PocKamenu" a "Splneno" by měly stačit...
 
  Toť vše. Nyní se můžeme věnovat vytváření vlastní logiky hry. Je jednoduchá, ale je třeba ji navrhnout tak, aby fungovala zcela spolehlivě ve všech situacích - jednoduše řečeno, aby byla dostatečně "blbuvzdorná". Vyjmenujme si vše, co si musíme pohlídat:

  1. Pozice hráče (proměnné PlayerX a PlayerY) se může pohybovat jen v souřadnicích 0 <= x <=19 a 0 <= y <=19 (v našem případě).
  2. Hráč se může pohybovat jen po podlaze (kód 2) a po plošinkách (kód 3). To znamená, že nám nepoleze přez zeď ani nám nebude hopsat po kamenech.
  3. Je-li před hráčem kámen, tak s ním může pohnout jen když před ním je podlaha nebo plošinka (před tím kamenem). Nebo naopak. Kamenem nelze pohnout, je-li před ním jimý kámen, nebo, je-li před ním zeď. Jasné ?
  4. Došoupe-li už konečně hráč kámen na nějakou plošinku, musíme mu to připsat k dobru - to znamená patřičně zvýšit skóre, ale hlavně přičíst jedničku k obsahu proměnné "Splneno" (viz výše). "Splneno=Splneno+1" provedeme jen tehdy, když dojde k posunutí kamene z podlahy na plošinku. Jinak ne !
  5. Asi Vám došlo, že takhle by to šlo pěkně "vochcat". Hráč by prostě jeden kámen opakovaně strkal na plošnku a z ní hned zase pryč, skóre by mu neustále narůstalo a veškerá obtížnost by se ze hry vytratila. A proto dáme hráčovi pořádnej kouř... Dojde-li k posunu kamene z plošinky na ven na podlahu, provedeme pouhé "Splneno=Splneno-1" a je vymalováno :-).
  6. Když hráč dostrká všechny kameny na plošinky, musíme zkončit. Stačí jen otestovat, zda proměnná "Spleno" je rovná proměnné "PocKamenu" a můžeme jít do exitu.
  7. Toto jsou všechny podstatný testy, který musej proběhnout. Následujou už jen "sichr" testy, na který jistě přijdete sami...

  Nejem si zcela jistej, jestli jste všechno pochopili. Řekl bych, že občas jsem zmát i sám sebe :). No nic. Pokračujeme dále.
 
  Předpokládejme, že nám logika už pracuje, že jsme zvládli ovládání (joy, klávesnice, myš) i načítání levelů. Nyní je řada na zpracování zobrazování bludiště, kamenů a hráče. Je jasné, že souřadnice, se kterými pracujeme v polích Bludiste() a Kameny(), nejsou vhodné pro vykreslování na obrazovku. Použijeme-li například rozlišení lowres (320x256), pak by bludiště zabíralo plošku 20x20 pixelů kdesi v levém horním rohu. Nepomůže ani posunutí vykreslování o nějakou konstantu (např. PlayerX+50 a PlayerY+50). Těžko budete používat pro znázornění hráče, kamenů a všeho ostatního jen jednopixelové miniatury, ale využijete "malých obrázků", např. spritů, kreslených v nějakém rastru, třeba 10x10 bodů. Takže, je potřeba nejen posunout začátek kreslení (viz výše), ale i vykreslovat po krocích daných velikostí oněch "malých obrázků". Jinak řečeno, začneme vykreslovat třeba od bodu [10,10] a s krokem třeba taky 10. Další sprajtík tedy vykreslíme například na souřadnicích 10,20 nebo 20,10 nebo 20,20 nebo ... Je potřeba sesmolit převodní vztah mezi souřadnicemi v poli Bludiste() a souřadnicemi na obrazovce.
 

  Pro souřadnici X (sloupce):
   X = (PX * krok) + posunx
  Pro Y:
   Y = (PY * krok) + posuny

   Kde:
    X,Y jsou souřadnice bodu na obrazovce;
    PX, PY jsou souřadnice v poli Bludiste() nebo Kameny();
    krok je velikos spritů v pixelech (šéřka nebo výška);
    posunx, posuny jsou souřadnice počátku vykreslování.

  Takhle nějak by to mělo fungovat. Když ne, tak si to dolaďte :-). Není to zrovna zcela úplnej popis všeho, co se ve hře nakonec musí vyskytnout (ovládámí, zvuky, nařítání levelů a jejich formát zápisu na disk, a mnoho dalšího, ale na druhou stranu - zkuste si taky na něco přijít sami... Ale aby jste si nemysleli, že jsem nějakej kruťas, tak vám jako bonus poskytnu odladěnej zdroják celý hry se vším všudy, a je to !
 
P.S. Ten zdroják je psanej v BLITZ Basicu II a jmenuje se "Soko-Source.bb2".

E.N.I.F.         

 
 
__________________________________________

 Zpátky do Obsahu