Saya mencari fungsi untuk menghasilkan peta acak berbasis ubin sebagai batas visual dari perubahan peta (dengan menelusuri peta). Saya ingin peta menjadi sangat besar, dan memiliki struktur seperti labirin.
Namun, jika dunia tidak terbatas, kembali ke tempat pemain sebelumnya telah menimbulkan masalah. Permainan itu harus mengingat bagaimana sebenarnya semua yang ada di sana.
Jadi, saya berpikir - "Bagaimana cara Minecraft memecahkan masalah ini?" dan saya berpikir pada diri sendiri bahwa mereka harus menggunakan semacam fungsi bilangan acak dengan sebuah seed, yang keduanya bisa maju tetapi juga mundur, dan dengan cara itu, menghasilkan ubin lama persis seperti sebelumnya, tetapi dalam contoh baru.
Apa pendapat Anda tentang ini?
tiles
random
minecraft-modding
tilemap
Mathias Lykkegaard Lorenzen
sumber
sumber
Jawaban:
Apa yang Anda perhatikan adalah perbedaan antara generator angka acak dan fungsi noise . Generator nomor acak mengeluarkan nomor yang berbeda setiap kali Anda memanggilnya. Fungsi noise mengambil beberapa argumen - katakanlah, peta x dan y - dan mengeluarkan angka dengan sifat statistik seperti acak , tetapi nilai yang sama untuk argumen yang sama setiap waktu , yaitu fungsi matematika yang tepat.
Keduanya sangat terkait erat. Sebuah fungsi noise dapat mensimulasikan nomor acak generator, dengan melewati dalam nilai yang berbeda setiap kali - misalnya
noise(1)
,noise(2)
dan sebagainya. Dan generator bilangan acak, yang dibuang ke meja raksasa, dapat bertindak sebagai fungsi derau. Namun dalam kedua kasus, Anda menggunakan alat yang salah untuk pekerjaan itu.Minecraft khususnya penggunaan Perlin noise , jenis kebisingan yang murah untuk menghitung, dan memiliki properti yang diinginkan menjadi terus menerus dalam beberapa dimensi seperti yang Anda perlu - jika Anda grafik
f(x)
untukf(x + 1)
, tidak akan ada setiap melompat tiba-tiba. Ini membuatnya sangat berguna untuk banyak hal seperti modulasi tekstur, awan dan gas volumetrik, dan generasi medan.Jika Anda mencari implementasi untuk mulai bermain, generator kebisingan Perlin Ken Perlin yang ditingkatkan adalah salah satu implementasi paling sederhana.
sumber
Cara Minecraft mengendalikan generasinya adalah dengan membuat seed level yang digunakan untuk seed semua generasi nomor acak untuk gim. Jika sepotong tidak ada pada disk ketika diminta, itu akan dihasilkan menggunakan fungsi generasi Notch berdasarkan pada seed level; itu kemudian disimpan ke disk untuk nanti.
Sepertinya Anda ingin mencapai perilaku serupa, jadi itu cara yang aman untuk dilakukan.
sumber
Seperti yang ditunjukkan Joe, Anda mencari fungsi hash. Secara umum, fungsi acak hanyalah fungsi hash yang diunggulkan dengan angka yang dikembalikan terakhir. Jadi, jika
Random()
dikembalikanHash(seed)=1234
, panggilan keduaRandom()
akan kembaliHash(1234)
, begitu seterusnya.Jika Anda mencari fungsi hashing sederhana untuk angka acak semu, periksa MurMurHash . Saya sudah menerapkannya di C # dan dapat mempostingnya di suatu tempat jika Anda tertarik. Informasi lebih rinci tentang Perlin Noise, yang menggunakan fungsi hash seperti itu, dapat ditemukan di sini , dan implementasinya dalam C # ada di sini .
Semua informasi ini berasal dari pertanyaan yang saya ajukan setahun yang lalu di sini di Stack Overflow. Apa yang Anda cari disebut pembuatan konten prosedural, jadi jika Anda memerlukan informasi lebih lanjut, lakukan pencarian untuk itu. Selamat menghasilkan medan!
sumber