เพิ่มความน่าจะเป็นสำหรับไพ่ที่คล้ายกันเพื่อสร้างถัดจากกันและกัน


9

ฉันกำลังทำงานกับระบบแผนที่ย่อยซึ่งตราบเท่าที่มีลักษณะเช่นนี้ (สีเขียวคือหญ้าอากาศเป็นสีขาวหินเป็นสีเทาและสีน้ำเงินคือน้ำ):

กระเบื้อง

มันใช้ตัวสร้างตัวเลขสุ่มอย่างง่ายเพื่อให้มีโอกาส 45% ของกระเบื้องที่เป็นหญ้าโอกาส 30% ของการเป็นน้ำและโอกาส 25% ที่จะเป็นหิน

มีอยู่แล้วฉันสามารถเพิ่มแนวโน้มสำหรับบล็อกหญ้า / ก้อนหินให้รวมตัวกันเพื่อก่อให้เกิดมวลบกและทำให้บล็อกน้ำก่อตัวในมหาสมุทร

คำตอบ:


17

คุณสามารถใช้อัลกอริทึมที่ตรวจสอบใกล้บล็อกและความน่าจะเป็นที่แตกต่างกันไปขึ้นอยู่กับสิ่งที่มี - แต่ฉันคิดว่ามันเป็นวิธีการที่ผิดส่วนใหญ่

สิ่งที่คุณต้องการดูคือประเภทเสียงเศษส่วน - ในกรณีนี้เสียง perlin หรือ simplex หากคุณสร้างเสียงคุณจะได้รับค่าตั้งแต่ -1 ถึง 1

http://en.wikipedia.org/wiki/Perlin_noise

จากนั้นคุณสามารถปรับระดับน้ำของคุณโดยการตั้งค่าการนวดของสิ่งที่ทำให้น้ำ สำหรับบล็อกอื่นคุณสามารถเรียกใช้เสียงชุดที่สองเพื่อสลับระหว่างหินและหญ้า (วิธีนี้คุณสามารถมีน้ำขนาดใหญ่ แต่มีก้อนหินเล็ก ๆ )

getTerrain(x,y) {
if(perlin_noise(x,y) > 0) {
    if(perlin_noise(x * scale,y * scale) > 0) {
        return rock
    } else {
        return dirt
    }
} else {
    return water
}

เนื่องจากฉันคิดว่าวิธีการสแกนและการโยนมีความซับซ้อนมากเกินไปและไม่สามารถปรับขนาดได้อย่างมากเกินไปฉันจะแนะนำวิธีอื่นที่ฉันชอบ:

วางตารางลงบนแผนที่ของคุณแบ่งแผนที่เป็นสี่เหลี่ยมขนาดใหญ่

สร้างตัวเลขสุ่มที่จุดตัดแต่ละแห่ง (ระหว่าง 0 ถึง 1 จะทำงานกับเปอร์เซ็นต์ของคุณ)

แบ่งออกเป็นส่วน ๆ โดยการตัดสี่เหลี่ยมจัตุรัสแต่ละอันออกเป็น 4 สี่เหลี่ยมจตุรัส - ตามเส้นเก่าและที่ที่คุณพบเส้นแบ่งย่อยสร้างตัวเลขสุ่มระหว่างจุดที่อยู่ติดกัน 2 จุดเช่นเดียวกันสำหรับจุดศูนย์กลางของไม้กางเขนสร้างจุดที่อยู่ระหว่างจุดสูงสุด และค่าต่ำสุด

ล้างและทำซ้ำ คุณจะได้รับการสุ่มเริ่มต้นจากการผ่านครั้งแรก แต่การผ่านหลังจะให้ความเท่าเทียมกันขออภัยสำหรับหมายเลขที่สุ่มโดย psuedo:

0-------5  0---3---5 0-1-3-4-5 011233455
|       |  |   |   | | | | | | 012344555
|       |  |   |   | 0-2-4-6-5 002445665
|       |  |   |   | | | | | | 123445666
|       |  2---5---7 2-4-5-7-7 234455777
|       |  |   |   | | | | | | 233455688
|       |  |   |   | 2-3-5-5-9 223455589
|       |  |   |   | | | | | | 233455589
2-------9  2---4---9 2-4-4-5-9 234445579

วิธีนี้ใช้งานได้ดียิ่งขึ้นสำหรับสามเหลี่ยมเนื่องจากคุณไม่มี cross-bar ที่หายไปเมื่อคุณแบ่งย่อย

แน่นอนว่าผลลัพธ์ที่ดีที่สุดจะมาจากการรวมวิธีการเหล่านี้เข้าด้วยกัน - เลเยอร์ต่อชั้นเทคนิคบางอย่างจะช่วยให้คุณได้รับผืนดินที่ยอดเยี่ยมส่วนอื่น ๆ จะให้ถ้ำที่ยอดเยี่ยมแก่คุณ


+1 เนื่องจากฉันคิดว่าการกระโดดข้ามไปยังเสียงโดยทั่วไปจะนำไปสู่ ​​.. ฉันสงสัยว่ามันอาจจะกระโดดใหญ่เกินไป แต่การเริ่มต้น 'สแกนไปรอบ ๆ และเปลี่ยนเปอร์เซ็นต์' ทำให้ฉันลงคะแนน :)
James

3

เสียงรบกวนเป็นทางออกที่ดีอย่างหนึ่งดังที่ได้กล่าวไปแล้ว อีกทางเลือกหนึ่งคือการส่งผ่านข้อมูลครั้งที่สองเพื่อเขยิบไปยังเค้าโครงที่คุณต้องการเกาส์เบลอเป็นหนึ่งในหลาย ๆ วิธีที่คุณสามารถทำได้ ทำผ่านกับที่คุณควรได้รับ blobs "รอบ" ที่ดีของแต่ละประเภท

ไม่ว่าคุณจะใช้วิธีใดก็ตามสิ่งสำคัญที่คุณควรคำนึงถึงคือการเก็บผลลัพธ์ของกระบวนการไว้ในตำแหน่งใหม่ หากคุณแก้ไขแผนที่ในสถานที่ส่วนที่คุณดำเนินการแล้วจะเริ่มส่งผลกระทบต่ออัลกอริทึมและคุณจะพบกับรูปแบบแปลก ๆ


2

วิธีง่ายๆในการทำเช่นนี้คือการสร้างนิวเคลียสจำนวนมากที่ตำแหน่งสุ่ม วาดแผนภาพ Voronoiของจุดเหล่านี้ กำหนดองค์ประกอบให้กับแต่ละพื้นที่ของผลลัพธ์

สิ่งนี้ส่งผลให้บางสิ่งที่ดูน่าเกลียดและเป็นกลไก โคลนขึ้นเล็กน้อยแล้วคุณจะมีรูปร่างที่ดี

หากคุณกำลังสร้างแผนที่ขนาดใหญ่คุณสามารถทำได้สองระดับ สร้างไดอะแกรม Voronoi เริ่มต้นของคุณโดยใช้, พูด, 20 นิวเคลียสและเรียกแต่ละภูมิภาคที่เป็นประเทศ สร้างไดอะแกรมอีกอันโดยใช้ 400 นิวเคลียสและเรียกพื้นที่แทนผลลัพธ์แต่ละอัน

ตัวแทนทั้งหมดที่มีอยู่ทั้งหมดภายในประเทศจะมีองค์ประกอบของประเทศ Vicarages ที่มีอยู่ในสองชาติหรือมากกว่านั้นจะใช้องค์ประกอบหนึ่งของการล้อมรอบชาติโดยการสุ่ม

โพสต์นี้สมควรได้รับรูปภาพ แต่ฉันขี้เกียจเกินไปที่จะจัดหารูปภาพ


2

เครื่องสร้างแผนที่รูปหลายเหลี่ยมจะเป็นการอ่านที่ดีในการสร้างแผนที่ที่มี 'โซน' ที่แตกต่างกันซึ่งจะช่วยให้คุณสร้างแผนที่ที่ดีขึ้นได้เช่นกัน มันใช้ไดอะแกรมของโวโรโนอิ แต่ฉันคิดว่านี่จะเป็นการเริ่มต้นที่ดี


0

คุณสามารถทำได้โดยใช้วิธีนี้:

  • ใส่ไทล์ทั้งหมดในรายการที่ไม่ระบุ
  • ในขณะที่มีไทล์ในรายการที่ไม่ได้ระบุ
  • เริ่ม
  • เลือกหนึ่งไทล์จากรายการนั้น
  • ตรวจสอบเพื่อนบ้านของกระเบื้องนั้นและเลือกประเภทขึ้นอยู่กับประเทศเพื่อนบ้าน
  • เอาไทล์นั้นออกจากรายการที่ไม่ได้ระบุ
  • ปลาย
โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.