Autor | Zpráva | ||
---|---|---|---|
1Pupik1989 Profil |
#1 · Zasláno: 25. 2. 2011, 21:42:20
Zdravím, potřeboval bych nakopnout s generátorem mapy na browser hru. Budou tři typy políček 1. Prázdná vesnice, 2. Speciální vesnice, 3. Les. Vesnice vygeneruji v pohodě, problém je les, ten musí být u sebe, třeba jako pět polí na ose X a k tomu pět polí na ose Y. Ví někdo jak toho docílit?
|
||
Alphard Profil |
#2 · Zasláno: 26. 2. 2011, 22:22:02
V čem je problém? Jestli už máte uložené souřadnice lesa, prostě vytvoříte les. Jestli jde o náhodné vygenerování, vygenerujte 1 pole pro les a pak doplňte okolo pár dalších.
|
||
1Pupik1989 Profil |
#3 · Zasláno: 27. 2. 2011, 17:24:25 · Upravil/a: 1Pupik1989
Jde o to, že by na les museli být 3 vnořené cykly a to mi přijde dost nechutné a při generování mapy s rozměry 200x200 polí docela i náročné.
Zatím to vypadá takto: Generování mapy po třetí |
||
imploder Profil |
#4 · Zasláno: 1. 3. 2011, 01:15:45
1Pupik1989:
„Zatím to vypadá takto: Generování mapy po třetí“ To vypadá dobře, ne? Pokud chceš radu, jak to optimalizovat, tak ukaž kód. Jak to myšlíš s těmi cykly asi nikdo netuší, je potřeba vidět, jak je to udělané. |
||
Darker Profil |
#5 · Zasláno: 1. 3. 2011, 02:32:25
Html kód je maximálně nepřehledný, používej PHP_EOL, nebo "\n".
Bez kódu se nekneme, jinak s kamarádem jsme mapy ukládali jako řadu čísel, výšku a šířku a převáděli na mapu přes vnořené fory. Např. 3;3;0,1,1,1,0,2,3,0,0 kde 0:nic; 1:mesto; 2:les; 3:hory By hodilo nic |mesto|mesto| mesto|nic |les | hory |nic |nic |
||
1Pupik1989 Profil |
#6 · Zasláno: 1. 3. 2011, 06:31:24
No napsané je to zatím takto:
//Počáteční a konečné pole na ose X a Y $MinPocet_X=1; $MinPocet_Y=1; $MaxPocet_X=50; $MaxPocet_Y=50; //Počet polí lesa na ose Y $LesNahoda_Y=10; //Nastavení rozsahu polí lesa v ose X a Y na obě strany pro náhodný výběr $LesNahoda_X_Min=3; $LesNahoda_Y_Min=0; $LesNahoda_X_Max=10; $LesNahoda_Y_Max=2; //Vytvoření polí lesa na ose Y a následné zamíchání $Les_range_Y=range($MinPocet_Y,$MaxPocet_Y); shuffle($Les_range_Y); for($i=1;$i<=$LesNahoda_Y;$i++){ //Náhodný střed lesa osy X na ose Y $Les_rand_X=rand(1,$MaxPocet_X); //Náhodný rozsah lesa na ose X do obou stran $Les_rand_Leva=rand($LesNahoda_X_Min,$LesNahoda_X_Max); $Les_rand_Prava=rand($LesNahoda_X_Min,$LesNahoda_X_Max); $Les_rand_Leva=($Les_rand_Leva-$MinPocet_X>=$MinPocet_X) ? $Les_rand_Leva : 0; $Les_rand_Prava=($Les_rand_Prava+$MaxPocet_Y>=$MaxPocet_Y) ? $Les_rand_Prava : 0; for($j=($Les_rand_X-$Les_rand_Leva);$j<=($Les_rand_X+$Les_rand_Prava);$j++){ $Les_rand_Nahoru=rand($LesNahoda_Y_Min, $LesNahoda_Y_Max); $Les_rand_Dolu=rand($LesNahoda_Y_Min, $LesNahoda_Y_Max); $Les_rand_Nahoru=($Les_rand_Nahoru-$MinPocet_Y>=$MinPocet_Y) ? $Les_rand_Nahoru : 0; $Les_rand_Dolu=($Les_rand_Dolu+$MinPocet_Y<=$MaxPocet_Y) ? $Les_rand_Dolu : 0; for($k=-$Les_rand_Nahoru;$k<=$Les_rand_Dolu;$k++){ $Les_Array[($Les_range_Y[$i]+$k)][$j]=0; } } } Tam je vidět ten třetí vnořený cyklus, který teprve na ose Y generuje náhodně nastavené rozmezí. Docela jsem se v tom zamotal, ale víc řešení asi nebude. Samozřejmě pole je vytvořeno jako $Les_Array[8][2]=0, kde 8 je bod na ose Y, 2 na ose X a 0 je typ políčka, v tomhle případě les. Darker:: Prázdné pole, tedy nic nemá cenu generovat. Vykreslení mapy už není takový problém. Na té stránce co jsem linkoval je samozřejmě vykreslení jen na oko, abych věděl jak to zhruba vypadá. |
||
Darker Profil |
#7 · Zasláno: 1. 3. 2011, 08:01:51
1Pupik1989:
„Prázdné pole, tedy nic nemá cenu generovat.“ A ta bílá políčka jsou teda co? 1Pupik1989: „ale víc řešení asi nebude.“ Samo sebou že bude. Vzhledem k tomu, jaké máme ve škole nainstalované jazyky klávesnice, nahodím jen koncepci: Ke každému objektu si vytvoříš tři proměnné -počet-vytvořit=rand(min,max) -počet=0 Poté vytvoříš vnořený cyklus for (nevím jestli se tomu dá říct kvadratický, ale bude to cyklus který projde čtverec) "Horní" cyklus bude procházet řádky, ten v něm sloupce. Žádné tři!!! Potom musíš pro každou buňku počítat pravděpodobnost tak, aby se statisticky dalo očekávat, že budou města (a stromy a hory a cokoliv dalšího) rozložena rovnoměrně. |
||
1Pupik1989 Profil |
#8 · Zasláno: 1. 3. 2011, 09:11:50
já tam jednoduše 0 jako prazdno negeneruji. Prostě pokud daná souřadnice není v poli, pak nechám trávu jako prázdné pole.
|
||
Darker Profil |
#9 · Zasláno: 1. 3. 2011, 09:40:43 · Upravil/a: Darker
1Pupik1989:
Pochopils jak sem myslel návrh v [#7]? |
||
1Pupik1989 Profil |
#10 · Zasláno: 1. 3. 2011, 14:44:00
No asi to opravdu trošku nechápu, příklad by byl o mnoho (pro mě) pochopitelnější.
|
||
1Pupik1989 Profil |
#11 · Zasláno: 3. 3. 2011, 15:31:25
Tak princip generátoru je hotový, ale s ním přišla další věc. Potřebuju vyobrazení krajů lesu. Čili abych zjistil, jestli to je spodní levá část, horní pravá, nebo jen spodní atd. Šlo yb to v poli zjistit pomocí isset, ale bylo by to strašně moc podmínek. Kdo ví, nechť odpoví :)
|
||
Darker Profil |
#12 · Zasláno: 3. 3. 2011, 18:12:51 · Upravil/a: Darker
Pokud víš, jak je mapa velká, pak to snadno zjistíš, ne? Pokud si nějak pokačoval v metodě, kterou používáš v [#6] tak si podle mně solidně komplikuješ život.
Živá ukázka by neškodila. Popř. zdroják (na velký prosím odkaž externě). |
||
1Pupik1989 Profil |
#13 · Zasláno: 3. 3. 2011, 18:27:00
Už dobré, nakonec dořešeno, takže pro mě uzamčeno :)
|
||
Časová prodleva: 13 let
|
0