คุณสามารถใช้อัลกอริทึมที่ตรวจสอบใกล้บล็อกและความน่าจะเป็นที่แตกต่างกันไปขึ้นอยู่กับสิ่งที่มี - แต่ฉันคิดว่ามันเป็นวิธีการที่ผิดส่วนใหญ่
สิ่งที่คุณต้องการดูคือประเภทเสียงเศษส่วน - ในกรณีนี้เสียง 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 ที่หายไปเมื่อคุณแบ่งย่อย
แน่นอนว่าผลลัพธ์ที่ดีที่สุดจะมาจากการรวมวิธีการเหล่านี้เข้าด้วยกัน - เลเยอร์ต่อชั้นเทคนิคบางอย่างจะช่วยให้คุณได้รับผืนดินที่ยอดเยี่ยมส่วนอื่น ๆ จะให้ถ้ำที่ยอดเยี่ยมแก่คุณ