Za jídlo, šaty a vzduch otročíme na programech z temných světů

Programujeme v BASICu: Generujeme krajinu

Slíbil jsem sice, že se budeme věnovat ještě dialogovým textovým hrám a rozhodně nemám v úmyslu tento slib porušit, ale dovolím si krátkou odbočku, jejíž plody nepochybně v budoucnu ještě zúročíme. Pojďme se podívat, jak v BASICu vygenerovat tvary podobné výškovému profilu krajiny. Může se to hodit.

Pokud nemáme BASIC, který umí vyplňovat plochy barvou, musíme genovat krajinu v cyklu jdoucím od nuly po maximální souřadnici X. Hodnota souřadnice Y, kterou vypočítáme pomocí nějakého přiměřeně sofistikovaného vzorce pak představuje výšku krajiny a je třeba vypnit všechny body pod ním. Toho dosáhneme na ZX Spectru například pomocí jednoduché dvojice příkazů PLOT x, 0: DRAW 0,y. Budeme se s nimi často potkávat.


Čistě pseudonáhodná krajina
Jistě každého napadné svěřit generování krajiny generátoru náhodných čísel. Vznikne tak například takovýto kód:

  5 LET y=64
10 FOR x=0 TO 255 STEP 1
15 LET y=y+(1-2*RND)
20 PLOT x, 0: DRAW 0,y
25 NEXT x

Principem je náhodný přírůstek +/- 1 pixelu v závislosti na náhodné hodnotě vrácené příkazem RND. Jistě, takovýto program funguje, je plně použitelný, avšak už první pohled odhalí, že výsledná krajina se nám moc nelíbí.

První krajinka

Ano, vytvořili jsme pěkný generátor polabských rovin, nic víc. Pokud použijeme generátor náhodných čísel takto jednoduše, vrací nám přibližně stejný počet čísel blížících se k +1 i k -1 a krajina tak víceméně osciluje okolo původní hodnoty y=64. I taková krajina se může někdy hodit, ale pojďme dál.


Krajina posedlá tmou sinem
Oku lahodí mírná kopcovitost krajiny a pokud chceme do krajiny umístit nějaké objekty, které se mají navzájem zlikvidovat, bude taková kopcovitost lahodit i nám a našemu záměru to těmto objektům neusnadnit. Když se řekne kopcovitost, jistě se vám hned vybaví funkce sinus a cosinus. Čistý sinus a cosinus jsou ovšem příliš pravidelné a kopce, které by nám vygenerují nám přírodu příliš připomínat nebudou, pokud tedy nežijeme poblíž ďáblické nebo jakékoliv jiné skládky. Vezměme první zdroják využívající pseudonáhodná čísla a přidejme trochu sinové kopcovitosti:

  5 LET y=64
10 FOR x=0 TO 255 STEP 1
15 LET y=y+(1-2*RND)+SIN (x/41)/2
20 PLOT x, 0: DRAW 0,y
25 NEXT x

Sinus má periodu 2*k*π, což znamená že v intervalu od 0 do 2*π udělá jeden „kopec“ a jedno „údolí“. Pokud nám tento počet vyhovuje, je třeba rozsah osy X – na ZX Spectru 0 až 255 – převést právě na rozsah 0 až 2*π a to uděláme zhruba vydělením číslem 41. Pokud chceme kopců méně, dělíme násobkem jednačtyřiceti, pokud chceme kopců více, dělíme polovinou, čtvrtinou atd. To, čím vydělíme výsledný sinus nám pak určuje výšku kopců. Výsledek už rozhodně nepřipomíná Polabí, tedy pokud náhodou nestojíte čelem k Řípu.

Druhá krajinka

Pokud by se nám snad nelíbilo, že „kopec“ se nachází uprostřed obrazu a „údolí“ po stranách, není nic snazšího než vyměnit sinus za cosinus a získáme skutečně jeden „kopec“ a jedno „údolí“, ovšem krajina pak citelněji připomíná průběh periodické funkce.

Třetí krajinka

Skládání funkcí
Abychom se vyhnuli přílišné vizuální pravidelnosti, musíme skládat funkce, kterými krajinu generujeme. Tady už záleží na vkusu každého jedince, jak si mezi sebou sečte, pronásobí nebo podělí různé sinusovky a další funkce tak, aby výsledek lahodil jeho oku. Jednoduchá ale názorná ukázka:

  5 LET y=64
10 FOR x=0 TO 255 STEP 1
15 LET y=y+(1-2*RND)+SIN (x/41)*SIN (x/80)*SIN (x/16)*RND*4
20 PLOT x, 0: DRAW 0,y
25 NEXT x

Tento prográmek vygeneruje přiměřeně členitou krajinku, která obsahuje několik různě vysokých „kopců“ i různě hlubokých „údolí“. Opakované spouštění s OVER 1 nám ukáže, že krajina sice vypadá při každém spuštění velmi podobně, ale ne zcela stejně. Jiné funkce pochopitelně dají jiné výsledky.

Čtvrtá krajinka

Věřím, že o generování pseudonáhodné pseudokrajinky pro hry typu Scorched Earth už hrubou představu máte. O víc mi ani nešlo, další kroky si představíme v méně či více vzdálené budoucnosti a vy se zatím můžete pochlubit, jak krásně náhodný a kopcovitý terén jste si vygenerovali.