Bagaimana cara menghasilkan level acak dari sebuah seed? [Tutup]

46

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.

Adam Harte
sumber
Generasi tingkat acak juga dikenal sebagai Pembuatan Konten Prosedural (PCG). Dan inilah wiki yang menangani hal itu. pcg.wikidot.com Harus memberi Anda beberapa ide! : o)
Kaj
1
Chris Crawford memiliki artikel yang menurut Anda menarik. Itu ditulis pada awal 90-an tetapi masih relevan. How to Build a World
Anthony
Jika Anda menggunakan bentuk atau algoritme apa pun yang menggunakan generator angka acak yang sama (kecuali yang entah bagaimana menyelinap dalam waktu sistem yang tidak pasti), seed yang sama akan menghasilkan level yang sama, benar-benar tidak ada jalan lain.
Kaj
1
Ya, tapi saya pikir triknya sebenarnya menggunakan seed di tempat pertama untuk menghasilkan level. Saya telah membangun generator level acak sebelumnya, tetapi mereka tidak menggunakan seed tunggal. Seringkali saya akan memilih poin acak, maka untuk setiap poin pilih aset acak untuk ditempatkan di sana. Melakukannya dengan cara ini tidak ada SATU benih sejati yang akan selalu menghasilkan tingkat yang sama, karena ada banyak hal yang menghasilkan angka acak sendiri.
Adam Harte
10
Apakah Anda yakin tahu apa arti "benih"? Ini adalah "vektor awal" yang dikirimkan melalui, misalnya srand(int),. Panggilan selanjutnya untuk rand()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 dari rand, Anda akan mendapatkan hasil yang sama setiap saat.
Heath Hunnicutt

Jawaban:

7

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.

Jason Morales
sumber
4

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).

bummzack
sumber
Saya akan menggunakan noise perlin, tetapi sedikit berbeda, menggunakannya untuk membuat peta ketinggian 3D, meletakkan peta pada kemiringan dan menghapus semua piksel lebih rendah dari ambang Anda. (if pixel.height - (pixel.distanceToBottom * slopeFactor) <treshold) pixel = transparan)
Niels
2

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