En primer lugar, hay muchísimas maneras de hacer la generación de procedimientos y ninguna de ellas es fácil en absoluto, haré una especie de enfoque sobre cómo podría hacer que funcione, depende de usted tomarlo, modificarlo o descartarlo.
Pseudocódigo en JS ya que es más fácil de entender.
1º defina un punto de entrada, ya que desea construir una ciudad medieval comenzaremos con un cuadrado, así que digamos que su ciudad tendrá 300 unidades cuadradas y el cuadrado estará en el medio (representado con una X).
300
________________
| |
| |
| | 300
| X |
| |
| |
|_______________|
const square = [ 150, 150 ];
2º ahora vamos a las avenidas, habrá un número aleatorio de ellas, serán rectas y comenzarán desde el cuadrado del medio o desde otras avenidas
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
Esto debería darte una plaza y un par de calles principales
300
________________
| \\ |
| \\ |
| \\ | 300
| X===== |
| |
| |
|_______________|
Ahora tenemos que establecer las avenidas que no comienzan en la plaza principal, se cruzarán con las otras avenidas
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] ];
}
Para obtener vectores perpendiculares, debe intercambiar los cables x, y y negar la nueva y:
swiped == x: noswiped.y, y: -1 * (noswiped.x)
En este momento deberías tener algo similar a esto, ¿no parece una ciudad? :PAG
300
________________
| \\ // |
| \\// || |
| \\ || | 300
| //\X===== |
| // || |
| || |
|_______________|
3º ahora solo tienes que interconectar las avenidas con calles cortas, además, puedes generar cuadrados aleatorios a lo largo de la ciudad y hacer lo mismo que todos los anteriores, o simplemente generar pequeñas calles de algunos cuadrados secundarios, depende de ti.
Recuerde, cuanto más cortas son sus calles, más caótica se ve la ciudad.