Anda bisa menggunakan algoritma yang memeriksa blok dekat, dan memvariasikan probabilitas tergantung pada apa yang ada - tapi saya pikir itu sebagian besar pendekatan yang salah.
Yang ingin Anda lihat adalah tipe noise fraktal - dalam hal ini, perlin atau noise simpleks. Jika Anda menghasilkan suara, Anda akan mendapatkan nilai dari -1 hingga 1.
http://en.wikipedia.org/wiki/Perlin_noise
Anda kemudian dapat menyesuaikan ketinggian air Anda dengan menetapkan ambang batas apa yang membuat air. Untuk blok lain Anda dapat menjalankan set kebisingan kedua untuk beralih antara batu dan rumput. (dengan cara ini Anda dapat memiliki bercak besar air, tetapi rumpun batu yang lebih kecil).
getTerrain(x,y) {
if(perlin_noise(x,y) > 0) {
if(perlin_noise(x * scale,y * scale) > 0) {
return rock
} else {
return dirt
}
} else {
return water
}
Karena saya pikir metode pemindaian dan pelemparan terlalu rumit dan tidak terlalu dapat diukur, saya akan menyarankan metode lain yang saya nikmati:
Letakkan kisi di peta Anda, pecahkan peta menjadi kotak besar.
Hasilkan angka acak di setiap persimpangan (antara 0 dan 1 akan bekerja untuk persentase Anda)
Membagi dengan memotong setiap kotak menjadi 4 kotak genap - ikuti garis lama, dan di mana Anda menemukan garis pembagian, menghasilkan angka acak antara 2 titik yang berdekatan, sama, untuk pusat salib, menghasilkan titik yang terletak di antara yang tertinggi dan nilai terendah.
Bilas, dan ulangi. Anda akan mendapatkan keacakan awal dari pass pertama, tetapi pass terakhir akan memberikan keseragaman Maaf untuk angka psuedo-acak:
0-------5 0---3---5 0-1-3-4-5 011233455
| | | | | | | | | | 012344555
| | | | | 0-2-4-6-5 002445665
| | | | | | | | | | 123445666
| | 2---5---7 2-4-5-7-7 234455777
| | | | | | | | | | 233455688
| | | | | 2-3-5-5-9 223455589
| | | | | | | | | | 233455589
2-------9 2---4---9 2-4-4-5-9 234445579
Ini bekerja lebih baik untuk segitiga, karena Anda tidak memiliki bilah silang yang hilang saat Anda membagi.
Tentu saja, hasil terbaik mutlak akan datang dari menggabungkan metode ini - lapis demi lapis, beberapa teknik akan memberi Anda massa daratan yang besar, yang lain akan memberi Anda gua-gua yang mengagumkan, yang lain berfungsi untuk bukit, dan lebih banyak lagi akan bekerja untuk sistem air.
Kebisingan adalah salah satu solusi yang baik, seperti yang telah disebutkan. Pilihan lain adalah mengambil lintasan kedua pada data untuk mendorongnya ke tata letak yang Anda inginkan. Gaussian Blur adalah salah satu dari banyak cara Anda dapat mencapai ini. Melakukan lulus dengan itu akan membuat Anda gumpalan "putaran" yang bagus dari setiap jenis.
Tidak peduli metode apa yang Anda gunakan, satu hal penting yang perlu diingat adalah menyimpan hasil proses di lokasi baru. Jika Anda memodifikasi peta di tempat, bagian yang sudah Anda proses akan mulai mempengaruhi algoritma dan Anda akan berakhir dengan beberapa pola aneh.
sumber
Cara yang relatif sederhana untuk melakukan ini adalah dengan membuat sejumlah inti pada posisi acak. Gambarkan diagram Voronoi dari titik-titik ini. Tetapkan elemen ke setiap wilayah hasil.
Ini menghasilkan sesuatu yang terlihat agak jelek dan mekanis. Keruh batas sedikit dan Anda akan berada dalam kondisi yang layak.
Jika Anda menghasilkan peta besar, Anda bisa melakukan ini pada dua level. Buat diagram Voronoi awal Anda menggunakan, katakanlah, 20 inti, dan sebut setiap wilayah yang dihasilkan sebagai negara. Buat diagram lain menggunakan 400 nuklei dan panggil masing-masing wilayah yang dihasilkan sebagai pendeta.
Semua vikaris yang benar-benar terkandung dalam suatu negara akan memiliki elemen bangsa. Vicarage yang sebagian terkandung dalam dua atau lebih negara akan mengambil salah satu elemen negara terlampir mereka secara acak.
Posting ini layak mendapat gambar, tetapi saya terlalu malas untuk menyediakannya.
sumber
Polygonal Map Generator akan menjadi bacaan yang baik untuk membuat peta dengan 'zona' berbeda yang akan memberi Anda peta yang terbentuk lebih baik juga. Ini didasarkan pada diagram voronoi tapi saya kira ini akan menjadi awal yang baik untuk itu.
sumber
Anda dapat melakukannya menggunakan metode ini:
sumber