मैं अपने खेल में यादृच्छिक झीलों और नदियों को कैसे उत्पन्न कर सकता हूं?


19

मेरे पास 2 डी ब्लॉक बिल्डिंग गेम है और मैं बेतरतीब ढंग से उत्पन्न झीलों और नदियों को बनाने की कोशिश कर रहा हूं। मैंने पेरलिन शोर एल्गोरिथ्म में देखा है, लेकिन, मैं इसे यादृच्छिक और अच्छे परिणाम उत्पन्न करने के लिए नहीं पा सका।

मैं अजगर शोर पुस्तकालय का उपयोग करने की कोशिश कर रहा हूं , लेकिन, इसने बहुत ही बेतरतीब ढंग से नक्शे नहीं बनाए।

वहाँ कुछ बीज समारोह मैं उस पुस्तकालय पर याद कर रहा हूँ इसे और अधिक यादृच्छिक बनाने के लिए? अगर मैं चाहता हूं कि मैं इसे और अधिक यादृच्छिक रूप से बदलूं तो मैं किस चर को बदलूं? यदि संभव हो, तो मुझे कम तकनीकी उत्तर दें, कम गणित और अधिक अजगर शब्दों के साथ।

नक्शा एक 2D टाइल नक्शा है। यहाँ अन्य एल्गोरिथ्म के गैर-यादृच्छिकता के कुछ उदाहरण दिए गए हैं। निम्न कोड एक पंक्ति में 3 बार आउटपुट किया गया था। मैं सप्तक और आवृत्ति को कुछ इस तरह से यादृच्छिक कर रहा था:freq = 16.0 * random.randint(1, 500000) * 0.000001 + 0.5

1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 0 0 0 0 0 1 1 1 1 1 1 1 1
1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 0 0 0 0 0 0 0 1 1 1 1 1 1 1
1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 0 0 0 0 0 0 0 0 0 0 1 1 1 1 1
1 1 1 1 1 1 1 1 1 0 0 1 1 1 1 1 1 1 1 1 1 1 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
1 1 1 1 1 1 1 1 0 0 0 0 1 1 1 1 1 1 1 1 1 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
1 1 1 1 1 1 1 1 0 0 0 0 0 1 1 1 1 1 1 1 1 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
1 1 1 1 1 1 1 0 0 0 0 0 0 1 1 1 1 1 1 1 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
1 1 1 1 1 1 1 0 0 0 0 0 0 1 1 1 1 1 1 1 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
1 1 1 1 1 1 1 0 0 0 0 0 0 1 1 1 1 1 1 1 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
1 1 1 1 1 1 1 0 0 0 0 0 0 1 1 1 1 1 1 1 1 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
1 1 1 1 1 1 1 1 0 0 0 0 1 1 1 1 1 1 1 1 1 1 1 1 1 0 0 0 0 0 0 0 0 0 0 0 1 1 1 1
1 1 1 1 1 1 1 1 1 0 0 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1
1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1
1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1
1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1
1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1
1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1
1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1
1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1
1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1
1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 0 0 0 0 0 0 1 1 1 1
1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 0 0 0 0 0 0 0 1 1 1 1
1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 0 0 0 0 0 0 0 0 1 1 1 1
1 1 1 1 1 1 1 0 0 0 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 0 0 0 0 0 0 0 0 1 1 1 1
1 1 1 1 1 1 0 0 0 0 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 0 0 0 0 0 0 0 0 1 1 1 1 1
1 1 1 1 1 0 0 0 0 0 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 0 0 0 0 0 0 0 0 1 1 1 1 1 1
1 1 1 0 0 0 0 0 0 0 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 0 0 0 0 0 0 0 0 0 1 1 1 1 1 1
0 0 0 0 0 0 0 0 0 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 0 0 0 0 0 0 0 0 1 1 1 1 1 1 1
0 0 0 0 0 0 0 0 0 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 0 0 0 0 0 0 0 0 0 1 1 1 1 1 1 1
0 0 0 0 0 0 0 0 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 0 0 0 0 0 0 0 0 0 1 1 1 1 1 1 1 1

यह वह कोड है जो उपरोक्त आउटपुट का उत्पादन करता है:

"""Writes a 256x256 grayscale simplex noise texture file in pgm format
(see http://netpbm.sourceforge.net/doc/pgm.html)
"""
# $Id: 2dtexture.py 21 2008-05-21 07:52:29Z casey.duncan $

import sys
from noise import pnoise2
import random
octaves = random.randint(1, 500000) * 0.000001 + 0.5
freq = 16.0 * octaves
for y in range(30):
    for x in range(40):
        n = int(pnoise2(x/freq, y / freq, 1)*10+3)
        if n>=1:
            n=1
        else:
            n=0
        print n,
    print

अधिक जानकारी के लिए, कृपया। इस सवाल का जवाब वर्तमान स्थिति में नहीं दिया जा सकता है।
गुस्तावो मैकिएल

मैंने थोड़ा और जोड़ा, लेकिन, आपको क्या पता होना चाहिए।
जूलियन

आपने अच्छी जानकारी जोड़ी है, लेकिन हमें थोड़ी और आवश्यकता है। "बहुत बेतरतीब ढंग से नहीं" क्या है? किसी भी स्क्रीन शॉट को हम देखते हैं कि दिया गया परिणाम क्या है, और वांछित परिणाम क्या है? आपने इसे कैसे आजमाया? आप हमें दिखाने के लिए कोई कोड? आपका संदर्भ क्या है? 2 डी या 3 डी? टाइल की गई या बहुभुज? क्षमा करें यदि यह सब बहुत अधिक है, लेकिन मैं केवल मदद करने की कोशिश कर रहा हूं। -1 मेरा नहीं था, अगर आप जानकारी नहीं देते हैं, तो सवाल साइट के लिए अयोग्य हो जाएगा और वे इसे बंद कर देंगे। तो फिर, मैं मदद करने की कोशिश कर रहा हूं।
गुस्तावो मैकिएल

2
+1, अब यह एक अच्छा सवाल है :) मैं पेर्लिन शोर और सभी प्रक्रियात्मक पीढ़ी के साथ अच्छा नहीं हूं, लेकिन, क्या आप यादृच्छिक वस्तु को बो रहे हैं? अगर मैं गलत नहीं हूँ, random.seed()तो इसका सिस्टम समय बीज के रूप में उपयोग किया जाएगा। और इसके बजाय octaves = random.randint(1,500000)*.000001+.5आप कोशिश कर सकते हैं: octaves = random.random() (इसका एक ही परिणाम है, आपको 0 और 1 के बीच एक नंबर मिलेगा, लेकिन इसकी बहुत अधिक संभावनाएं सिर्फ 500000 नंबर से अधिक होंगी।)
Gustavo Maciel

धन्यवाद +1 :) :) प्लस 1 टिप्पणी की कोशिश की, लेकिन मैं नहीं कर सकता
जूलियन

जवाबों:


7

ठीक है, जैसा कि लगता है, आप रैंडम नंबर जनरेटर को सीड नहीं कर रहे हैं । अजगर में, यह आसानी से सिर्फ एक random.seed () के साथ किया जा सकता है ।

और मैं यह भी देख सकता हूं कि आप 1 और 500000 के बीच एक संख्या उत्पन्न कर रहे हैं और इसे 0 और 1 के बीच बना रहे हैं। यह एक कार्यात्मक तरीका है, लेकिन यह केवल 500000 संभावनाओं के लिए छाया हुआ है। आप random.random()पहले से ही इसका उपयोग करने के साथ बेहतर हैं पहले से ही 0 और 1 के बीच एक संख्या उत्पन्न करता है, लेकिन बहुत अधिक संभावनाओं के साथ! यदि आपको अभी भी 0.5 और 1.0 के बीच की संख्या की आवश्यकता है, जैसा कि आपका कोड बताता है, आप बस कर सकते हैं:(random.random() * 0.5) + 0.5

आपका अंतिम कोड निम्नानुसार होना चाहिए:

import sys
from noise import pnoise2
import random
random.seed()
octaves = random.random()
# octaves = (random.random() * 0.5) + 0.5
freq = 16.0 * octaves
for y in range(30):
    for x in range(40):
        n = int(pnoise2(x/freq, y / freq, 1)*10+3)
        if n>=1:
            n=1
        else:
            n=0
        print n,
    print

बस इतना ही!


मैं स्पष्ट नहीं हूं कि बीजारोपण का इससे कोई लेना-देना नहीं है। यदि आप बीज नहीं लगाते हैं, तो रैंडम नंबर अभी भी रैंडम होंगे। बीजारोपण नहीं करने का एकमात्र लक्षण हर बार जब आप कार्यक्रम चलाते हैं (हर बार एक ही बीज का उपयोग किया जाता है, यह मानते हुए) एक ही यादृच्छिक क्रम होना चाहिए।
टिम होलट

1
यदि आप एक ही आउटपुट को तीन बार पंक्ति में ले रहे हैं जैसा कि आपके प्रश्न में उल्लेख किया गया है, तो यह बहुत संभावना है क्योंकि आपने यादृच्छिक जनरेटर को बीज नहीं दिया है। इसे सीड करें और देखें कि क्या यह समस्या को ठीक करता है।
ashes999

आह मैंने "3 बार एक पंक्ति में" नहीं देखा था - बिट पढ़ रहा था, "क्या कुछ बीज समारोह है जो मुझे उस लाइब्रेरी पर याद आ रहा है ताकि इसे अधिक यादृच्छिक" भाग बना सकें। हां गैर-दोहराव यादृच्छिकता के लिए बीजारोपण :)
टिम होल्ट

8

यह आपके विशिष्ट प्रोग्रामिंग प्रश्न का उत्तर नहीं दे रहा है, लेकिन विचार करें कि झीलों और नदियों का निर्माण बेतरतीब ढंग से पानी की बूँदें और उन पर पानी के स्ट्रिप्स रखने के बारे में नहीं है। यह इलाके की ऊंचाई के बारे में है - अवसादों (बेसिन) के बारे में जो झीलों में बदल जाते हैं, और पानी जो उच्च से निचले स्थानों पर बहता है।

यदि आप झीलों और नदियों को बनाने का एक बड़ा उदाहरण चाहते हैं, तो आप इस ब्लॉग पोस्ट को देख सकते हैं -> http://simblob.blogspot.com/2010/09/polygon-map-generation-part-1.html यह इस तरह की चीज के लिए एक अच्छा संदर्भ यदि आपका लक्ष्य उचित रूप से यथार्थवादी हाइड्रोग्राफी है।


2

यह बहुत सरल है: यदि आप एक ही पंक्ति (या अधिक) में तीन बार एक ही मानचित्र प्राप्त कर रहे हैं, तो यह इसलिए है क्योंकि आपने बीज को यादृच्छिक नहीं किया है।

इसका क्या मतलब है?

कंप्यूटर स्वाभाविक रूप से निर्धारक (गैर-यादृच्छिक) होते हैं, इसलिए वे यादृच्छिकता का अनुकरण करते हैं। यह वास्तव में दोहराव यादृच्छिक है (यही कारण है कि हम इसे "छद्म यादृच्छिक संख्या जनरेटर" कहते हैं)।

यह कैसे काम करता है?

जब आप एक यादृच्छिक संख्या बनाते हैं, तो आपके पास इसे "बीज" देने का विकल्प होता है। महत्वपूर्ण बात यह है कि यदि आप हमेशा एक ही बीज का उपयोग करते हैं, तो आपको हमेशा उसी क्रम में यादृच्छिक संख्याओं का क्रम प्राप्त होगा। हमेशा। यह अच्छा भी हो सकता है बुरा भी।

आपके मामले में, ऐसा लगता है कि आप यादृच्छिक जनरेटर को सीड नहीं कर रहे हैं, और डिफ़ॉल्ट रूप से, आपको एक ही बीज मिल रहा है - यह शायद आपकी तारीख / समय के कुछ घटक का उपयोग करता है। इसलिए, मैं आपको इसे यादृच्छिक बनाने की सलाह देता हूं।

जैसा कि गुसातावो ने अपने उत्तर में बताया है, आपको random.seed () कॉल करने की आवश्यकता है । डॉक्स बताता है कि "यदि X [डिफ़ॉल्ट पैरामीटर] छोड़ा गया है या None, वर्तमान सिस्टम समय का उपयोग किया जाता है।" यह पर्याप्त होना चाहिए।

हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.