Meningkatkan kemungkinan ubin serupa untuk dihasilkan di samping satu sama lain

9

Saya sedang mengerjakan sistem peta ubin, yang sejauh ini terlihat seperti ini (hijau adalah rumput, udara putih, batu abu-abu, dan biru adalah air):

Ubin

Ini menggunakan generator nomor acak sederhana sehingga ada peluang 45% ubin menjadi rumput, 30% kemungkinan menjadi air, dan 25% kemungkinan menjadi batu.

Adakah saya bisa meningkatkan kecenderungan balok rumput / batu untuk berkumpul bersama untuk membentuk massa daratan, dan membuat balok air membentuk lautan (seperti apa yang bisa dilihat dalam permainan seperti Minecraft)?

airplaneman19
sumber

Jawaban:

17

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.

salmonmoose
sumber
+1 Seperti yang saya pikir lompatan ke kebisingan pada umumnya di mana ini akan mengarah .. Saya bertanya-tanya apakah itu mungkin agak terlalu besar lompatan meskipun begitu awal 'memindai sekitar dan mengubah persen' memudahkan saya untuk memilih :)
James
3

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.

Jason Morales
sumber
2

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.

dhasenan
sumber
2

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.

Vite Falcon
sumber
0

Anda dapat melakukannya menggunakan metode ini:

  • letakkan semua ubin dalam daftar yang tidak ditentukan
  • sementara ada ubin di daftar yang tidak ditentukan
  • mulai
  • pilih satu ubin dari daftar itu
  • periksa tetangga ubin itu, dan pilih jenis tergantung tetangganya
  • hapus ubin itu dari daftar yang tidak ditentukan
  • akhir
Ali1S232
sumber