ก่อนอื่นมี loooooot หลายวิธีในการสร้างโพรซีเดอร์และไม่มีวิธีใดที่ง่ายเลยฉันจะทำให้วิธีการที่คุณสามารถทำให้มันทำงานขึ้นอยู่กับคุณที่จะเอามันปรับเปลี่ยนหรือทิ้งมัน
จะหลอกรหัสใน JS เพราะเข้าใจง่ายกว่า
1ºกำหนดจุดเริ่มต้นในขณะที่คุณต้องการสร้างเมืองยุคกลางที่เราจะเริ่มต้นด้วยสี่เหลี่ยมดังนั้นสมมติว่าเมืองของคุณจะมี 300 หน่วยกำลังสองและสี่เหลี่ยมจะอยู่ตรงกลาง (แสดงด้วย X)
300
________________
| |
| |
| | 300
| X |
| |
| |
|_______________|
const square = [ 150, 150 ];
2ºตอนนี้เราจะลู่ทาง, จะมีจำนวนสุ่ม, พวกมันจะตรงและจะเริ่มจากจัตุรัสกลางหรือจากลู่ทางอื่น
let avenues = [] // will contain start and end [[sx,sy],[ex,ey]]
const n_avenues = RANDOM(4, 8); // number of avenues
const n_av_from_square = RANDOM(0, avenues); // starting in the square
for av in av_from_square
avenues.push(square, [RANDOM(0, 200) + 100, RANDOM(0, 200) + 100])
// we want avenues to have, at least 100 units length, thats why we randomize just te last 200 units of the whole town size
สิ่งนี้ควรให้ถนนและจตุรัสหลักสองสามอันแก่คุณ
300
________________
| \\ |
| \\ |
| \\ | 300
| X===== |
| |
| |
|_______________|
ตอนนี้เราต้องตั้งค่าลู่ทางที่ไม่ได้เริ่มในจตุรัสหลักพวกเขาจะตัดกันลู่ทางอื่น
for av in (n_avenues - av_from_square){
const av_to_intersect = avenues[RANDOM(0,avenues.length)];
//check av_to... and get a perpendicular vector (explained bellow)
av[0] = [ av_to_intersect[0][1], - av_to_intersect[0][0] ];
av[1] = [ av_to_intersect[1][1], - av_to_intersect[1][0] ];
}
ในการรับเวกเตอร์ตั้งฉากคุณต้องสลับ x, y cords และทำให้ y ใหม่:
swiped == x: noswiped.y, y: -1 * (noswiped.x)
ตอนนี้คุณควรมีสิ่งที่คล้ายกับที่นี่ดูเหมือนเมืองหรือไม่? : P
300
________________
| \\ // |
| \\// || |
| \\ || | 300
| //\X===== |
| // || |
| || |
|_______________|
3ºตอนนี้คุณเพียง แต่ต้องเชื่อมต่อระหว่างถนนกับถนนสายสั้น ๆ เท่านั้นคุณยังสามารถวางไข่แบบสุ่มทั่วเมืองและทำแบบเดียวกันกับข้างต้นสำหรับพวกเขาทั้งหมดหรือแค่วางไข่บนถนนเล็ก ๆ
โปรดจำไว้ว่าถนนที่สั้นที่สุดของคุณคือเมืองที่วุ่นวาย