Trước hết, có rất nhiều cách để tạo ra thủ tục và không có cách nào dễ dàng cả, tôi sẽ thực hiện cách tiếp cận để bạn có thể làm cho nó hoạt động, tùy thuộc vào bạn, sửa đổi hoặc loại bỏ nó.
Sẽ giả mã trong JS vì nó dễ hiểu hơn.
1º xác định một điểm vào, vì bạn muốn xây dựng một thành phố thời trung cổ, chúng ta sẽ bắt đầu với một hình vuông, vì vậy giả sử thị trấn của bạn sẽ có 300 đơn vị bình phương và hình vuông sẽ ở giữa nó (đại diện bằng chữ X).
300
________________
| |
| |
| | 300
| X |
| |
| |
|_______________|
const square = [ 150, 150 ];
Bây giờ chúng ta sẽ có các con đường, sẽ có một số ngẫu nhiên trong số chúng, chúng sẽ thẳng và sẽ bắt đầu từ quảng trường giữa hoặc từ các đại lộ khác
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
Điều này sẽ cung cấp cho bạn một hình vuông và vài đường phố chính
300
________________
| \\ |
| \\ |
| \\ | 300
| X===== |
| |
| |
|_______________|
Bây giờ chúng ta phải đặt các đại lộ không bắt đầu ở quảng trường chính, chúng sẽ giao với các đại lộ khác
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] ];
}
Để có được các vectơ vuông góc, bạn phải hoán đổi các dây x, y và phủ định y mới:
đã vuốt == x: noswiped.y, y: -1 * (noswiped.x)
Ngay bây giờ bạn nên có một cái gì đó tương tự như thế này, nó không giống như một thị trấn? : P
300
________________
| \\ // |
| \\// || |
| \\ || | 300
| //\X===== |
| // || |
| || |
|_______________|
Bây giờ bạn chỉ phải kết nối các đại lộ với những con đường ngắn, ngoài ra, bạn có thể sinh ra những ô vuông ngẫu nhiên dọc theo thị trấn và tạo ra những con đường giống như trên cho tất cả chúng, hoặc chỉ sinh ra những con đường nhỏ từ một số quảng trường kín đáo, tùy thuộc vào bạn.
Hãy nhớ rằng, đường phố của bạn ngắn nhất, thị trấn hỗn loạn trông như thế nào.