Bir tohumdan rastgele seviye nasıl oluşturulur? [kapalı]


46

Oyun seviyesi oluşturmak için rastgele bir tohum kullanmayı nasıl yaparım? Aynı tohum daima aynı seviyeyi oluşturmalıdır.

Bu örnek için Worms stil seviyesi olurdu . Böylece her seviyenin bir teması (otlaklar, karlar vb.), Temel araziler, ağaçlar gibi farklı nesneler olacaktır.

Peki bu tür bir seviye üretecini nerede yaratmaya başlarım? Neler karışacak? Hangi kavramları kullanıyor?

Herhangi bir iyi bağlantı için bonus puanlar ( solucanlarda veya benzerlerinde nasıl yapıldığına ilişkin herhangi bir şey için bonus bonus puanları).

Teşekkürler.


Rastgele seviye üretimi aynı zamanda Prosedürel İçerik Üretimi (PCG) olarak da bilinir. Ve işte bununla ilgilenen bir wiki. pcg.wikidot.com Size bazı fikirler vermeli ! : o)
Kaj

1
Chris Crawford'ın ilginç bulabileceğiniz bir makalesi var. 90'lı yılların başında yazılmış ancak yine de alakalı. Bir Dünya Nasıl Kurulur
Anthony

Eğer (her nasılsa sistem saati gibi değişmezler gizlice hariç) aynı üretici kullanan herhangi bir biçimde ya da algoritma kullanırsanız, aynı tohum olacak aynı düzeyde oluşturmak, gerçekten etrafında hiçbir yolu yoktur.
Kaj

1
Evet, ama püf nokta, aslında seviyeyi oluşturmak için ilk etapta bir tohum kullanıyor. Daha önce rastgele seviye jeneratörleri yaptım, ancak tek bir tohum kullanmadılar. Genellikle rastgele puanlar seçerdim, sonra her nokta için oraya yerleştirmek üzere rastgele bir varlık seçerdim. Bu şekilde yaparak, her zaman aynı seviyeyi üretecek BİR gerçek tohum yoktur, çünkü orada rastgele sayılar üreten bir sürü şey vardır.
Adam Harte

10
"Tohum" un ne demek olduğunu bildiğinden emin misin? Bu, örneğin içinden geçen "ilk vektör" dür srand(int). Sonraki çağrılar rand(), bu tohumu temel alarak her zaman aynı sırada hesaplanan sıralı değerleri döndürür. Tohumunu programında bir kere ayarladın. Bundan sonra, eğer algoritma sadece sonuçlara bağlıysa rand, her seferinde aynı sonucu elde edersiniz.
Heath Hunnicutt

Yanıtlar:


7

Bunun anahtarı, bilinen tohum değeriyle ilklendirdiğiniz kendi sözde rastgele rastgele sayı üreticinizi kullanmaktır. "Mersenne Twister" popüler bir algoritma, işte Vikipedi girişi ve bazı örnek kaynaklar . Bu ve diğer, PRNG algoritmaları aslında, tohum değerinin bir başlangıç ​​noktası olarak görev yaptığı (çok uzun) bir sabit sayı dizisi üretir.

Her zaman dünyanızı oluşturmak için aynı prosedürü uyguladığınız sürece, her değer benzersiz bir yeniden üretilebilir dünyayı temsil edecektir.


4

İşte ActionScript'te (AS2 veya AS3'te mevcut) uygulanan bir PRNG (sözde rasgele sayı üreteci). Hafif ve hızlı, oyunlar için ideal: http://lab.polygonal.de/2007/04/21/a-good-pseudo-random-number-generator-prng/

Yukarıdaki uygulama Park-Miller-Carta PRNG'ye dayanmaktadır . Bu site, tüm bunların arkasındaki matematik hakkında size biraz daha bilgi verecektir.

Solucanlar benzeri bir seviye oluşturmak için muhtemelen bir Perlin-Gürültü işlevi kullanırdım . 1 piksel yüksekliğinde ve oyun dünyanızın genişliğinde bir perlin gürültüsü görüntüsü oluşturuyorsanız, temel olarak kullanıma hazır bir yükseklik haritası elde edersiniz. Perlin gürültüsü işlevleri de daima aynı tohumla aynı haritayı oluşturur.

Daha sonra haritada rastgele Nesnelerin nereye yerleştirileceğini veya yerde bir delik açılacağını belirlemek için yukarıda belirtilen PRNG'yi kullanabilirsiniz. Delikler için tekrar perlin gürültüsünden de yararlanabilirsiniz. Haritanızın boyutunda (x, y) bir perlin gürültüsü görüntüsü oluşturun ve ardından haritanızda piksel değerinin belirli bir eşiğin altında olduğu bir delik oluşturun (örn. 0.2).


Perlin gürültüsünü kullanırdım, ama biraz farklı bir şekilde, 3B yükseklik haritası oluşturmak, haritayı yokuşa koymak ve eşik değerinizden düşük tüm pikselleri kaldırmak için kullanın. (eğer pixel.height - (pixel.distanceToBottom * slopeFactor) <eşik) piksel = saydam)
Niels

2

Teorik olarak, haritaları aracılığıyla paylaşmak için sözde rasgele sayı üreteci (Perlin-Noise veya Marsenne Twister gibi) kullanabilirsiniz.

tohum numaraları o zaman ayrıca özel haritalar oluşturabilir ve bunları tohumlara indirgeyebilir, bu durumları oluşturamamak sorununu çözebilir.

PRNG'leri kullanırken özel haritalar. Ancak bu birkaç varsayım üzerine kuruludur. Yani sözde rasgele sayı üreteçleri

tersinir bir işlem ve bir PRNG'ye geri beslenen HERHANGİ bir veri, bir tohum bile olsa geçerli bir tohum üretecektir!

Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.