Yo y un equipo estamos trabajando en un juego de construcción de fábricas que le da al jugador una fábrica aleatoria al comienzo del juego. Para tratar de asegurarse de que haya una sensación de "justicia", idealmente la fábrica generada al azar tendría un área dentro de unas pocas unidades de (valor de marcador de posición) 30.
Es relativamente sencillo escribir un generador de rectángulo aleatorio básico para cumplir con estas especificaciones, pero nuestro objetivo es que la fábrica sea más compleja, quizás compuesta de 2, 3 o incluso 4 rectángulos que se crucen, produciendo formas más complejas (piense en L, Edificios en forma de U y O).
Intenté generar un rectángulo aleatorio y luego usar álgebra básica para completar un segundo rectángulo, pero hasta ahora no he tenido suerte al implementar más de 2 rectángulos, e incluso entonces no estoy satisfecho con los resultados de solo un diseño de 2 rectángulos. .
Información más relevante: 2D de arriba hacia abajo Algunas de las mecánicas son de estilo factorio, por lo que las habitaciones deben tener una longitud y un ancho razonables para dejar espacio para maquinaria Actualmente en Java y Lua (puede usar bibliotecas integradas de cualquiera de las dos si es necesario)
¡Gracias por adelantado!
EDITAR: Cuando digo salidas "buenas" o "malas", una salida mala sería cualquier salida que tenga espacio inutilizable por el jugador. La forma de fábrica limita dónde el jugador puede colocar máquinas de fábrica, como cintas transportadoras. Idealmente, la fábrica no debería tener áreas que tengan solo 1-2 bloques de ancho, la forma no debería ser uno o dos rectángulos grandes con una línea de 1-2 bloques "colgando" a un lado. Un buen resultado sería donde todo el espacio del piso es "viable", por lo que todas las áreas tienen al menos 3-4 bloques de ancho. Un buen resultado no siempre tiene que ser complejo (1 o 2 rectángulos está bien), pero debe tener una buena posibilidad si se compone de más de 1-2 rectángulos.
Dada una restricción de "todas las áreas tienen al menos 3-4 bloques de ancho", la primera idea que se me ocurre es algo como lo siguiente:
La idea básica es que, dado que desea que todas las áreas tengan al menos un tamaño determinado, solo trabaje en áreas que tengan ese tamaño. En términos más generales, si desea que algo sea cierto para todas las salidas generadas, vea si puede hacerse realidad para todas las salidas parcialmente generadas.
fuente
Considere usar booleanos NOT y UNION y elegir entre ellos al azar.
Luego, calcularía el área y la escalaría hacia arriba o hacia abajo para que coincida más estrechamente con el tamaño aproximado que busca, y luego probaría que no hay dimensiones inferiores a la cantidad mínima requerida.
fuente