首先,有很多方法可以进行程序生成,但都不是一件容易的事,我将通过某种方式来决定如何使其能够工作,取决于您采用,修改或丢弃它。
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线并取反新的y:
刷== x:noswiped.y,y:-1 *(noswiped.x)
现在您应该有类似的东西,它看起来不像一个城镇吗?:P
300
________________
| \\ // |
| \\// || |
| \\ || | 300
| //\X===== |
| // || |
| || |
|_______________|
3º现在,您只需要将大街与短街道互连即可,也可以在整个城镇中生成随机的正方形,并对其进行相同的制作,或者仅从第二个正方形生成小街道,这取决于您。
请记住,您的街道最短,小镇看上去很混乱。