Autor Zpráva
1Pupik1989
Profil
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
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
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
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
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
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
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
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
1Pupik1989:
Pochopils jak sem myslel návrh v [#7]?
1Pupik1989
Profil
No asi to opravdu trošku nechápu, příklad by byl o mnoho (pro mě) pochopitelnější.
1Pupik1989
Profil
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
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
Už dobré, nakonec dořešeno, takže pro mě uzamčeno :)

Vaše odpověď

Mohlo by se hodit


Prosím používejte diakritiku a interpunkci.

Ochrana proti spamu. Napište prosím číslo dvě-sta čtyřicet-sedm:

0