Bagaimana cara saya menggunakan seed acak untuk menghasilkan level game? Benih yang sama harus selalu menghasilkan tingkat yang sama persis.
Untuk contoh ini akan menjadi level gaya Worms . Jadi setiap level akan memiliki tema (padang rumput, salju dll), medan dasar, objek yang berbeda seperti pohon.
Jadi di mana saya akan mulai membuat generator level seperti ini? Apa yang akan terlibat? Konsep apa yang digunakannya?
Poin bonus untuk setiap tautan baik ( poin bonus bonus untuk apa pun yang terkait dengan bagaimana hal itu dilakukan dalam worm atau sejenisnya).
Terima kasih.
algorithm
procedural-generation
random
Adam Harte
sumber
sumber
srand(int)
,. Panggilan selanjutnya untukrand()
akan mengembalikan nilai sekuensial yang selalu dihitung dalam urutan yang sama, berdasarkan pada seed ini. Anda menetapkan seed sekali dalam program Anda. Setelah itu, jika algoritma hanya bergantung pada hasil darirand
, Anda akan mendapatkan hasil yang sama setiap saat.Jawaban:
Kunci untuk ini adalah menggunakan generator nomor pseudo-acak kustom Anda sendiri yang Anda inisialisasi dengan nilai seed yang dikenal. "Mersenne Twister" adalah algoritma yang populer, di sini adalah entri Wikipedia dan beberapa sumber sampel . Algoritma PRNG ini, dan lainnya, benar-benar menghasilkan serangkaian angka tetap (sangat panjang) dimana nilai seed berfungsi sebagai titik awal.
Selama Anda mengikuti prosedur yang sama persis untuk menghasilkan dunia Anda setiap saat, setiap nilai akan mewakili dunia unik yang dapat direproduksi.
sumber
Inilah PRNG (generator angka acak semu) yang diimplementasikan dalam ActionScript (tersedia dalam AS2 atau AS3). Ini ringan dan cepat, ideal untuk game: http://lab.polygonal.de/2007/04/21/a-good-pseudo-random-number-generator-prng/
Implementasi di atas didasarkan pada PRNG Park-Miller-Carta . Situs ini akan memberi Anda lebih banyak wawasan tentang matematika di balik semua ini.
Untuk membangun level seperti cacing, saya mungkin akan menggunakan fungsi Perlin-Noise . Jika Anda menghasilkan gambar noise perlin dengan ketinggian 1px dan lebar dunia game Anda, maka pada dasarnya Anda mendapatkan peta ketinggian, siap digunakan. Fungsi noise Perlin juga selalu menghasilkan peta yang sama dengan seed yang sama.
Anda kemudian dapat menggunakan PRNG yang disebutkan di atas untuk menentukan di mana menempatkan Objek acak di peta, atau di mana membuat lubang di tanah. Untuk lubang Anda juga bisa memanfaatkan kebisingan perlin lagi. Cukup buat gambar perlin-noise dengan ukuran peta Anda (x, y), dan kemudian buat lubang di peta Anda di mana nilai piksel di bawah ambang yang diberikan (mis. 0,2).
sumber
Secara teoritis jika Anda dapat menggunakan generator angka pseudo-acak (seperti Perlin-Noise atau Marsenne Twister) untuk berbagi peta melalui
nomor benih maka Anda juga dapat membuat peta khusus dan menguranginya menjadi benih, memecahkan masalah tidak bisa membuat
peta khusus saat menggunakan PRNG. Namun ini dibangun di atas beberapa anggapan. Yaitu bahwa generator nomor pseudo-acak
sebuah proses yang dapat dibalik dan bahwa SETIAP data yang diumpankan mundur ke dalam PRNG akan menghasilkan seed yang valid, apalagi seed sama sekali!
sumber