กำลังมองหาอัลกอริทึมการสร้างแผนที่โลกที่ดี [ปิด]


98

ฉันกำลังทำงานกับเกมที่มีลักษณะคล้ายอารยธรรมและฉันกำลังมองหาอัลกอริทึมที่ดีในการสร้างแผนที่โลกแบบ Earth ฉันได้ทดลองกับทางเลือกสองสามทาง แต่ยังไม่ได้ผู้ชนะที่แท้จริง

ทางเลือกหนึ่งคือสร้างแผนที่ความสูงโดยใช้เสียง Perlinและเติมน้ำในระดับเพื่อให้ประมาณ 30% ของโลกเป็นที่ดิน ในขณะที่เสียง Perlin (หรือเทคนิคที่ใช้เศษส่วนที่คล้ายกัน) มักใช้สำหรับภูมิประเทศและมีความสมจริงพอสมควร แต่ก็ไม่ได้มีวิธีการควบคุมจำนวนขนาดและตำแหน่งของทวีปที่เกิดขึ้นมากนักซึ่งฉันต้องการ มีจากมุมมองการเล่นเกม

เสียง Perlin

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

การขยายแบบสุ่ม

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


3
ฉันไม่เห็นว่าทำไมต้องปิดคำถามธรรมดาที่มีการโหวตมากกว่า 90+ รายการ การลงคะแนนเพื่อเปิดอีกครั้ง
John Coleman

คำตอบ:


38

คุณสามารถใช้ความคิดจากธรรมชาติและปรับเปลี่ยนความคิดที่สองของคุณ เมื่อคุณสร้างทวีปของคุณแล้ว (ซึ่งมีขนาดเท่ากันทั้งหมด) ให้สุ่มย้ายและหมุนและชนกันและทำให้เสียรูปซึ่งกันและกันและแยกออกจากกัน (หมายเหตุ: นี่อาจไม่ใช่สิ่งที่ง่ายที่สุดในการนำไปใช้)

แก้ไข:นี่เป็นอีกวิธีหนึ่งในการทำมันสมบูรณ์ด้วยการดำเนินงาน - เหลี่ยมแผนที่รุ่นสำหรับเกม


2
นี่เป็นความคิดที่ดี ฉันไม่รู้เกี่ยวกับการพยายามเลียนแบบแผ่นเปลือกโลกโดยสิ้นเชิง แต่ตราบใดที่แต่ละทวีป "เป็นเจ้าของ" แผ่นดินของตัวเอง (ตรงข้ามกับการทำหน้าที่เป็นเครื่องกำเนิดไฟฟ้าสำหรับอาร์เรย์แผนที่) และตั้งอยู่บนหรือทำหน้าที่เป็นจานของตัวเอง มันคงไม่ยากที่จะนำไปใช้ ฉันจะต้องลองตอนนี้ :)
nathanchere

@FerretallicA ขอบคุณ ฉันอยากไปที่นี่ด้วยตัวเองมาก - เมื่อฉันมีเวลาว่างมากขึ้น ... :-)
David Johnstone

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

คุณสามารถใช้การปรับเปลี่ยนการจัดกลุ่ม K-mean เพื่อกำหนดว่า 'ทวีป' แต่ละผืนดินแต่ละผืนเป็นของใคร จากนั้นใช้แผนภาพ Voronoi (ซึ่งควรจะง่ายเมื่อคุณกำหนดกลุ่มแล้ว) เพื่อกำหนดขอบเขตของแผ่นเปลือกโลก ... สำหรับแต่ละส่วนของเส้นตรงใน Voronoi คุณจะกำหนดเวกเตอร์การเคลื่อนที่แบบสุ่มและควรสามารถกำหนดโซนแผ่นดินไหวเทียบกับภูเขาไฟได้ โซน ฯลฯ แต่ละจุดของที่ดินจะลงเอยด้วยเวกเตอร์แต่ละจุดตามตำแหน่งของมันโดยสัมพันธ์กับขอบเขตของแผ่นเปลือกโลกและควรลงเอยด้วยการจำลองที่ค่อนข้างเหมือนจริงในการทำงาน
Steve

ฉันใช้วิธีเมล็ดเดียว มีข้อเสนอแนะเกี่ยวกับการเพิ่มภูมิประเทศที่ซับซ้อนมากขึ้นเช่นเทือกเขาลงในสิ่งนี้หรือไม่?
A Tyshka

11

ฉันขอแนะนำให้คุณสำรองข้อมูลและ

  1. ลองนึกถึงสิ่งที่ทำให้ทวีป "ดี"
  2. เขียนอัลกอริทึมที่สามารถบอกเค้าโครงทวีปที่ดีจากรูปแบบที่ไม่ดี
  3. ปรับแต่งอัลกอริทึมเพื่อให้คุณสามารถวัดได้ว่าเค้าโครงที่ดีเป็นอย่างไร

เมื่อคุณมีสิ่งนั้นแล้วคุณสามารถเริ่มใช้อัลกอริทึมซึ่งควรมีรูปร่างดังนี้:

  • สร้างทวีปเส็งเคร็งแล้วปรับปรุงให้ดีขึ้น

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


1
ที่ไม่ค่อยมีเหตุผลในบริบทนี้ มันจะเหมือนกับการบอกว่าสำหรับเครื่องกำเนิดเศษส่วนคุณควรสร้างโปรแกรมที่สร้างเศษส่วนเส็งเคร็งจากนั้นลองเขียนโปรแกรมที่บอกคุณว่าสิ่งที่คุณมีนั้นเป็นเศษส่วนที่ดีหรือไม่ ง่ายกว่ามากที่จะทำให้ 'ถูกต้อง' ตั้งแต่เริ่มต้น มิฉะนั้นคุณจะเอียงโฟกัสและขอบเขตของปัญหาโดยสิ้นเชิง
nathanchere

1
@FerretallicA ไม่เห็นด้วยอย่างยิ่ง ด้วยกราฟิกการเริ่มต้นด้วยการรับบางสิ่งบางอย่างบนหน้าจอจะเป็นประโยชน์ จากนั้นสมองซีกขวาของคุณจะเริ่มทำงานบางอย่างได้
luser droog

11

ฉันเขียนสิ่งที่คล้ายกับสิ่งที่คุณต้องการสำหรับการโคลนของ Civilization สไตล์สกรีนเซฟเวอร์อัตโนมัติสำหรับบันทึกฉันเขียนสิ่งนี้ใน VB.net แต่เนื่องจากคุณไม่ได้พูดถึงอะไรเกี่ยวกับภาษาหรือแพลตฟอร์มในคำถามของคุณฉันจะเก็บไว้ มันเป็นนามธรรม

"แผนที่" ระบุจำนวนทวีปความแปรปรวนของขนาดทวีป (เช่น 1.0 จะทำให้ทุกทวีปมีพื้นที่แผ่นดินโดยประมาณเท่ากันโดยลดลงเหลือ 0.1 ทำให้ทวีปมีอยู่ได้โดยมีมวล 1 ใน 10 ของทวีปที่ใหญ่ที่สุด) พื้นที่สูงสุด (เป็นเปอร์เซ็นต์) ในการสร้างและอคติที่ดินส่วนกลาง "เมล็ดพันธุ์" จะกระจายแบบสุ่มรอบ ๆ แผนที่สำหรับแต่ละทวีปโดยถ่วงน้ำหนักไปที่จุดศูนย์กลางของแผนที่ตามอคติส่วนกลาง (เช่นความเอนเอียงที่ต่ำจะทำให้เกิดทวีปที่มีการกระจายคล้ายกับโลกมากขึ้นโดยที่อคติส่วนกลางที่สูงจะคล้ายกับ a Pangea). จากนั้นสำหรับการเติบโตซ้ำแต่ละครั้ง "เมล็ด" จะกำหนดกระเบื้องที่ดินตามอัลกอริธึมการกระจาย (เพิ่มเติมในภายหลัง) จนกว่าจะถึงพื้นที่สูงสุด

อัลกอริธึมการกระจายที่ดินสามารถแม่นยำเท่าที่คุณต้องการ แต่ฉันพบผลลัพธ์ที่น่าสนใจกว่าโดยใช้อัลกอริทึมทางพันธุกรรมต่างๆและหมุนลูกเต๋า "เกมแห่งชีวิต" ของคอนเวย์เป็นเกมที่ง่ายมากที่จะเริ่มต้นด้วย คุณจะต้องเพิ่มตรรกะที่รับรู้ทั่วโลกบางส่วนเพื่อหลีกเลี่ยงสิ่งต่างๆเช่นทวีปที่เติบโตต่อกัน แต่ส่วนใหญ่ดูแลตัวเอง ปัญหาที่ฉันพบเมื่อใช้วิธีการที่ใช้เศษส่วนมากขึ้น (ซึ่งเป็นความโน้มเอียงแรกของฉัน) คือผลลัพธ์ที่ได้ดูมีแบบแผนเกินไปหรือนำไปสู่สถานการณ์มากเกินไปที่ต้องใช้กฎการแก้ปัญหาความรู้สึกเหมือนแฮ็กเพื่อให้ได้ผลลัพธ์ที่ยังไม่รู้สึกถึงไดนามิกเพียงพอ ขึ้นอยู่กับอัลกอริทึมที่คุณใช้คุณอาจต้องการใช้การส่งผ่าน "การเบลอ" เพื่อกำจัดสิ่งต่างๆเช่นกระเบื้องมหาสมุทรสี่เหลี่ยมจัตุรัสเดี่ยวที่มีอยู่มากมายและแนวชายฝั่งตาหมากรุก ในกรณีที่มีบางสิ่งบางอย่างเช่นทวีปถูกสร้างขึ้นโดยรอบโดยคนอื่น ๆ อีกหลายคนและไม่มีที่ให้เติบโตให้ย้ายเมล็ดพันธุ์ไปยังจุดใหม่บนแผนที่และดำเนินการต่อจากการเติบโต ใช่มันอาจหมายความว่าบางครั้งคุณต้องจบลงด้วยทวีปมากกว่าที่วางแผนไว้ แต่ถ้าเป็นสิ่งที่คุณไม่ต้องการอย่างแน่วแน่วิธีอื่นที่จะช่วยหลีกเลี่ยงได้ก็คืออัลกอริธึมการเติบโตที่มีอคติดังนั้นพวกเขาจึงสนับสนุนการเติบโตในทิศทางที่ใกล้เคียงกับอื่น เมล็ด. ที่แย่ที่สุด (ในความคิดของฉันอยู่แล้ว) คุณสามารถตั้งค่าสถานะชุดว่าไม่ถูกต้องเมื่อเมล็ดพันธุ์ไม่เหลือที่ให้เติบโตและสร้างแผนที่ใหม่ ตรวจสอบให้แน่ใจว่าคุณได้กำหนดจำนวนครั้งสูงสุดดังนั้นหากมีการระบุสิ่งที่ไม่สมจริง (เช่นการติดตั้งทวีปที่มีน้ำหนักเท่ากัน 50 รายการบนกระดาน 10x10) จะไม่ใช้เวลาตลอดไปในการพยายามหาวิธีแก้ปัญหาที่ถูกต้อง

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


11

ฉันได้สร้างสิ่งที่คล้ายกับภาพแรกของคุณใน JavaScript มันไม่ซับซ้อนมาก แต่ใช้งานได้:

http://jsfiddle.net/AyexeM/zMZ9y/

<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
<html xmlns="http://www.w3.org/1999/xhtml">
<head>
<meta http-equiv="Content-Type" content="text/html; charset=utf-8" />
<title>Untitled Document</title>

<script src="https://ajax.googleapis.com/ajax/libs/jquery/1.7.2/jquery.min.js"></script>
<style type="text/css">
    #stage{
        font-family: Courier New, monospace;
    }
    span{
        display: none;
    }
    .tile{
        float:left;
        height:10px;
        width:10px;
    }
    .water{
        background-color: #55F;
    }
    .earth{
        background-color: #273;
    }
</style>
</head>

<body>


<div id="stage">

</div>

<script type="text/javascript">

var tileArray = new Array();
var probabilityModifier = 0;
var mapWidth=135;
var mapheight=65;
var tileSize=10;

var landMassAmount=2; // scale of 1 to 5
var landMassSize=3; // scale of 1 to 5


$('#stage').css('width',(mapWidth*tileSize)+'px');


for (var i = 0; i < mapWidth*mapheight; i++) {

    var probability = 0;
    var probabilityModifier = 0;

    if (i<(mapWidth*2)||i%mapWidth<2||i%mapWidth>(mapWidth-3)||i>(mapWidth*mapheight)-((mapWidth*2)+1)){

        // make the edges of the map water
        probability=0;
    }
    else {

        probability = 15 + landMassAmount;

        if (i>(mapWidth*2)+2){

            // Conform the tile upwards and to the left to its surroundings 
            var conformity =
                (tileArray[i-mapWidth-1]==(tileArray[i-(mapWidth*2)-1]))+
                (tileArray[i-mapWidth-1]==(tileArray[i-mapWidth]))+
                (tileArray[i-mapWidth-1]==(tileArray[i-1]))+
                (tileArray[i-mapWidth-1]==(tileArray[i-mapWidth-2]));

            if (conformity<2)
            {
                tileArray[i-mapWidth-1]=!tileArray[i-mapWidth-1];
            }
        }

        // get the probability of what type of tile this would be based on its surroundings 
        probabilityModifier = (tileArray[i-1]+tileArray[i-mapWidth]+tileArray[i-mapWidth+1])*(19+(landMassSize*1.4));
    }

    rndm=(Math.random()*101);
    tileArray[i]=(rndm<(probability+probabilityModifier));

}

for (var i = 0; i < tileArray.length; i++) {
    if (tileArray[i]){
        $('#stage').append('<div class="tile earth '+i+'"> </div>');
    }
    else{
        $('#stage').append('<div class="tile water '+i+'"> </div>');
    }
}

</script>

</body>
</html>

3
การใช้งานที่สง่างามมากฉันชอบ
nathanchere

ขอบคุณครับ !! มันเบาและดีมาก
Liberateur

9

บทความการสร้างแผนที่หลายเหลี่ยมอธิบายการสร้างแผนที่ทีละขั้นตอนโดยใช้รูปหลายเหลี่ยม Voronoi

ผู้ชายคนนี้ให้ซอร์สโค้ดทั้งหมดด้วย เป็น Flash (ActionScript 3 / ECMAScript) แต่สามารถเปลี่ยนเป็นภาษาเชิงวัตถุอื่น ๆ ได้

หรือลองใช้อัลกอริทึมที่ใช้ในซอฟต์แวร์สภาพแวดล้อมเศษส่วนเช่นTerraJ


5

แค่คิดถึงข้อมือที่นี่:

เลือกจุดเริ่มต้นและกำหนดขนาดที่วาดแบบสุ่ม (หวังว่าจะ) คุณสามารถรักษาการวาดขนาดแยกกันสำหรับทวีปที่วางแผนไว้และเกาะที่วางแผนไว้ได้หากคุณต้องการ

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

  1. ระยะทางไปยังที่ดิน "อื่น ๆ " ที่ใกล้ที่สุด ยิ่งไปกว่านั้นคือการสร้างพื้นที่มหาสมุทรกว้าง ๆ ช่องทางแคบ ๆ จะดีกว่า คุณต้องตัดสินใจว่าคุณจะปล่อยให้บิตรวมเข้าด้วยกันหรือไม่
  2. ระยะห่างจากเมล็ด ใกล้กว่าหมายถึงมวลที่ดินขนาดกะทัดรัดยิ่งไกลขึ้นหมายถึงบิตที่พันกันยาว
  3. จำนวนพื้นที่สี่เหลี่ยมที่อยู่ติดกัน การให้น้ำหนักกับสี่เหลี่ยมที่อยู่ติดกันทำให้คุณมีชายฝั่งที่ราบเรียบการเลือกไม่กี่ตัวจะช่วยให้คุณมีเวิ้งและคาบสมุทรจำนวนมาก
  4. มีสี่เหลี่ยม "ทรัพยากร" อยู่ใกล้ ๆ ? ขึ้นอยู่กับกฎของเกมเมื่อคุณสร้างทรัพยากรสแควร์และหากคุณต้องการทำให้ง่าย
  5. คุณจะยอมให้บิตเข้าใกล้หรือเข้าร่วมกับเสาหรือไม่?
  6. ??? ไม่รู้มีอะไรอีก

ดำเนินต่อไปจนกว่ามวลที่ดินทั้งหมดจะมีขนาดตามแผนหรือไม่สามารถเติบโตได้อีกต่อไปด้วยเหตุผลบางประการ

โปรดสังเกตว่าการลดพารามิเตอร์เป็นปัจจัยถ่วงน้ำหนักเหล่านี้ช่วยให้คุณสามารถปรับแต่งประเภทของโลกที่สร้างขึ้นซึ่งเป็นคุณลักษณะที่ฉันชอบเกี่ยวกับ Civs บางตัว

ด้วยวิธีนี้คุณจะต้องทำการสร้างภูมิประเทศในแต่ละบิตแยกกัน


4

คุณสามารถลองใช้อัลกอริทึมสี่เหลี่ยมเพชรหรือเสียงเพอร์ลินเพื่อสร้างบางอย่างเช่นแผนที่ความสูง จากนั้นกำหนดค่าช่วงให้กับสิ่งที่แสดงบนแผนที่ หาก "ความสูง" ของคุณเพิ่มขึ้นจาก 0 ถึง 100 ให้สร้างน้ำ 0-20, ชายหาด 20 - 30, หญ้า 30 - 80, ภูเขา 80 - 100 ฉันคิดว่า notch ทำอะไรคล้าย ๆ กับสิ่งนี้ใน minicraft แต่ฉันไม่ใช่ผู้เชี่ยวชาญฉันแค่อยู่ในกรอบความคิดสี่เหลี่ยมเพชรหลังจากที่มันใช้งานได้ในที่สุด


3

ฉันคิดว่าคุณสามารถใช้แนวทางรูปแบบ "โปรแกรมไดนามิก" ได้ที่นี่

แก้ปัญหาเล็ก ๆ ก่อนและรวมวิธีแก้ปัญหาอย่างชาญฉลาดเพื่อแก้ปัญหาที่ใหญ่กว่า

A1= [elliptical rectangular random ... ]// list of continents with area A1 approx. 
A2= [elliptical rectangular random ... ]// list of continents with area A2 approx.
A3= [elliptical rectangular random ... ]// list of continents with area A3 approx.
...
An= [elliptical rectangular random ... ]// list of continents with area An approx.

// note that elliptical is approximately elliptical in shape and same for the other shapes.

Choose one/more randomly from each of the lists (An).

Now you have control over number and area of continents.

You can use genetic algorithm for positioning them 
as you see "fit" ;)

จะเป็นการดีมากหากลองดู "อัลกอริทึมการออกแบบกราฟ"

คุณสามารถปรับเปลี่ยนสิ่งเหล่านี้ให้เหมาะกับวัตถุประสงค์ของคุณ


3

ฉันมีความคิดในการสร้างแผนที่คล้ายกับคำตอบของแผ่นเปลือกโลก มันเป็นแบบนี้:

  1. กวาดผ่านช่องตารางให้แต่ละตารางเป็น "ที่ดิน" สี่เหลี่ยมถ้า rnd <= 0.292 (เปอร์เซ็นต์ที่แท้จริงของพื้นที่แห้งบนดาวเคราะห์โลก)
  2. ย้ายที่ดินแต่ละผืนเป็นสี่เหลี่ยมจัตุรัสไปยังเพื่อนบ้านที่ใหญ่ที่สุดที่ใกล้ที่สุด ถ้าเพื่อนบ้านอยู่ห่างกันเท่ากันให้ไปหากลุ่มที่ใหญ่กว่า หากชิ้นมีขนาดเท่ากันให้เลือกแบบสุ่ม
  3. หากสี่เหลี่ยมที่ดินสองอันสัมผัสกันให้จัดกลุ่มให้เป็นก้อนแล้วย้ายสี่เหลี่ยมทั้งหมดเป็นหนึ่งจากนี้ไป
  4. ทำซ้ำจากขั้นตอนที่ 2 หยุดเมื่อเชื่อมต่อชิ้นส่วนทั้งหมดแล้ว

สิ่งนี้คล้ายกับการทำงานของแรงโน้มถ่วงในอวกาศ 3 มิติ มันค่อนข้างซับซ้อน อัลกอริทึมที่ง่ายกว่าสำหรับความต้องการของคุณจะทำงานดังนี้:

  1. วาง n กำลังสองของที่ดินเริ่มต้นที่ตำแหน่ง x, y แบบสุ่มและระยะทางที่ยอมรับได้จากกันและกัน สิ่งเหล่านี้คือเมล็ดพันธุ์สำหรับทวีปของคุณ (ใช้ทฤษฎีบทพีทาโกรัสเพื่อให้แน่ใจว่าเมล็ดมีระยะห่างขั้นต่ำระหว่างตัวมันและเมล็ดอื่น ๆ ทั้งหมด)
  2. สร้างตารางที่ดินจากสี่เหลี่ยมที่ดินที่มีอยู่ในทิศทางแบบสุ่มหากทิศทางนั้นเป็นตารางมหาสมุทร
  3. ทำซ้ำขั้นตอนที่ 2 หยุดเมื่อสี่เหลี่ยมที่ดินเต็ม 30% ของขนาดแผนที่ทั้งหมด
  4. หากทวีปอยู่ใกล้กันมากพอให้วางสะพานบกตามต้องการเพื่อจำลองเอฟเฟกต์ประเภทปานามา
  5. วางเกาะเล็ก ๆ แบบสุ่มตามต้องการเพื่อให้ดูเป็นธรรมชาติมากขึ้น
  6. สำหรับสี่เหลี่ยม "เกาะ" พิเศษแต่ละอันที่คุณเพิ่มให้ตัดทะเลภายในและสี่เหลี่ยมทะเลสาบออกจากทวีปโดยใช้อัลกอริทึมเดียวกันในทางกลับกัน นี้จะรักษาเปอร์เซ็นต์ที่ดินในจำนวนที่ต้องการ

แจ้งให้เราทราบว่าวิธีนี้ได้ผลอย่างไร ฉันไม่เคยลองด้วยตัวเอง

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


2

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

คำอธิบายที่ดีเกี่ยวกับ metaballs หากคุณไม่เคยทำงานกับพวกเขามาก่อน:

http://www.gamedev.net/page/resources/_//feature/fprogramming/exploring-metaballs-and-isosurfaces-in-2d-r2556


2

นี่คือสิ่งที่ฉันคิดเนื่องจากฉันกำลังจะนำสิ่งนี้ไปใช้กับเกมที่กำลังพัฒนา :

โลกแบ่งออกเป็นภูมิภาค ขึ้นอยู่กับขนาดของโลกมันจะกำหนดจำนวนภูมิภาค สำหรับตัวอย่างนี้เราจะถือว่าเป็นโลกขนาดกลางโดยมี 6 ภูมิภาค แต่ละโซนกริดแบ่งออกเป็น 9 โซนกริด โซนกริดเหล่านั้นแบ่งออกเป็น 9 กริด (สิ่งนี้ไม่ได้มีไว้สำหรับการเคลื่อนไหวของตัวละคร แต่เป็นเพียงการสร้างแผนที่เท่านั้น) กริดมีไว้สำหรับไบโอมโซนกริดมีไว้สำหรับคุณสมบัติเหนือดินโค้ง (ทวีปและมหาสมุทร) และภูมิภาคต่างๆมีไว้สำหรับสภาพอากาศโดยรวม กริดพังเป็นกระเบื้อง

สร้างขึ้นแบบสุ่มภูมิภาคต่างๆจะได้รับชุดสภาพอากาศเชิงตรรกะที่กำหนด โซนตารางได้รับการกำหนดแบบสุ่มเช่น; มหาสมุทรหรือที่ดิน กริดได้รับการกำหนด biomes แบบสุ่มด้วยตัวปรับแต่งตามโซนกริดและสภาพอากาศซึ่ง ได้แก่ ป่าไม้ทะเลทรายที่ราบน้ำแข็งบึงหรือภูเขาไฟ เมื่อกำหนดพื้นฐานเหล่านี้ทั้งหมดแล้วก็ถึงเวลาผสมผสานเข้าด้วยกันโดยใช้ฟังก์ชันสุ่มตามเปอร์เซ็นต์ที่เติมในชุดกระเบื้อง ตัวอย่างเช่น; หากคุณมีสิ่งมีชีวิตในป่าถัดจากสิ่งมีชีวิตในทะเลทรายคุณมีอัลกอริทึมที่ช่วยลดความเป็นไปได้ที่กระเบื้องจะเป็น "ป่า" และจะเพิ่มขึ้นว่าจะเป็น ดังนั้นประมาณครึ่งทางระหว่างพวกเขาคุณจะเห็นผลกระทบที่ผสมผสานกันระหว่างสองไบโอมเพื่อปิดการเปลี่ยนแปลงที่ค่อนข้างราบรื่นระหว่างพวกเขา การเปลี่ยนจากโซนกริดหนึ่งไปเป็นโซนถัดไปอาจต้องใช้เวลาเพิ่มขึ้นเล็กน้อยเพื่อประกันการก่อตัวของลอจิกจากพื้นดินตัวอย่างเช่นไบโอมจากโซนกริดหนึ่งที่สัมผัสกับไบโอมจากอีกโซนแทนที่จะมีเปอร์เซ็นต์การสลับอย่างง่ายตามความใกล้ชิด ตัวอย่างเช่นมีกระเบื้อง 50 แผ่นจากกึ่งกลางของ biome ไปจนถึงขอบของ biome ซึ่งหมายความว่ามี 50 ชิ้นจากขอบที่แตะไปที่กึ่งกลางของ biome ถัดไป นั่นจะทำให้เกิดการเปลี่ยนแปลง 100% จากไบโอมหนึ่งไปสู่อีกสิ่งหนึ่งอย่างมีเหตุผล ดังนั้นเมื่อกระเบื้องเข้าใกล้ขอบของสองไบโอมมากขึ้นเปอร์เซ็นต์ก็จะแคบลงเหลือประมาณ 60% ฉันคิดว่าอย่าฉลาดที่จะให้ความเป็นไปได้มากเกินไปที่จะข้ามสิ่งมีชีวิตที่ไกลจากชายแดน แต่คุณจะต้องการให้พรมแดนมีการผสมผสานกันบ้าง สำหรับโซนกริดการเปลี่ยนแปลงเปอร์เซ็นต์จะเด่นชัดขึ้นมาก แทนที่% จะลดลงเหลือประมาณ 60% กลับลดลงเหลือเพียง 80% เท่านั้น จากนั้นจะต้องทำการตรวจสอบครั้งที่สองเพื่อให้แน่ใจว่าไม่มีกระเบื้องน้ำแบบสุ่มอยู่ตรงกลางของสิ่งมีชีวิตบนบกถัดจากมหาสมุทรโดยไม่มีเหตุผลบางอย่าง ดังนั้นให้เชื่อมต่อกระเบื้องน้ำนั้นกับมวลมหาสมุทรเพื่อสร้างช่องสำหรับอธิบายกระเบื้องน้ำหรือลบออกทั้งหมด การลงจอดใน biome จากน้ำนั้นง่ายต่อการอธิบายโดยใช้โขดหินและสิ่งเหล่านี้

โอ้โง่ขอโทษ


สวัสดี! ฉันกำลังทำการวิจัยบางอย่างเนื่องจากฉันพยายามสร้างแผนที่เพื่อ .. และฉันกำลังจะนำไปใช้ตามที่คุณอธิบาย เพียงแค่อยากรู้ว่ามันกลายเป็นอย่างไร?
VivienLeger

1

ฉันจะวางภูมิประเทศแบบเศษส่วนตามรูปแบบที่คุณรู้ว่า "ใช้ได้" (เช่นกริด 2x2 เพชร ฯลฯ ที่มีความกระวนกระวายใจ) แต่มีการกระจายแบบเกาส์เซียนที่ลดระดับลงไปที่ขอบของศูนย์กลางทวีป วางระดับน้ำให้ต่ำลงเพื่อให้ส่วนใหญ่เป็นที่ดินจนกว่าคุณจะเข้าใกล้ขอบ

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