Eu e uma equipe estamos trabalhando em um jogo de construtor de fábrica que fornece ao jogador uma fábrica aleatória no início do jogo. Para tentar garantir que haja uma sensação de "justiça", idealmente, a fábrica gerada aleatoriamente teria uma área dentro de algumas unidades de (valor do espaço reservado) 30.
É relativamente simples escrever um gerador de retângulo aleatório básico para atender a essas especificações, mas nosso objetivo é que a fábrica seja mais complexa, talvez composta de 2, 3 ou até 4 retângulos que se cruzam, produzindo formas mais complexas (pense em L, Edifícios em forma de U e O).
Tentei gerar um retângulo aleatório e depois usar álgebra básica para preencher um segundo retângulo, mas até agora não tive sorte implementando mais de 2 retângulos, e mesmo assim estou descontente com os resultados de apenas um design de 2 retângulos .
Algumas informações mais relevantes: 2D de cima para baixo Algumas das mecânicas são do estilo fatorio, de modo que as salas devem ter comprimento e largura razoáveis para permitir espaço para máquinas Atualmente em Java e Lua (pode usar bibliotecas integradas, se necessário)
Desde já, obrigado!
EDIT: Quando digo saídas "boas" ou "ruins", uma saída ruim seria qualquer saída que tenha espaço inutilizável pelo player. O formato da fábrica limita onde o jogador pode colocar máquinas de fábrica, como correias transportadoras. Idealmente, a fábrica não deve ter áreas com apenas 1 a 2 blocos de largura, a forma não deve ter um ou dois retângulos grandes com uma linha de 1 a 2 blocos "pendurados" para um lado. Uma boa saída seria onde todo o espaço físico é "viável"; portanto, todas as áreas têm pelo menos 3-4 blocos de largura. Uma boa saída nem sempre precisa ser complexa (1 ou 2 retângulos são aceitáveis), mas deve ter uma boa chance se for composta por mais de 1-2 retângulos.
Dada uma restrição de "todas as áreas estão com pelo menos 3 a 4 blocos de largura", a primeira ideia que me vem à cabeça é algo como o seguinte:
A idéia básica é que, como você deseja que todas as áreas tenham pelo menos um determinado tamanho, trabalhe apenas em áreas desse tamanho. De maneira mais geral, se você deseja que algo seja verdadeiro para todas as saídas geradas, veja se isso pode ser verdadeiro para todas as saídas geradas parcialmente.
fonte
Considere usar os booleanos NOT e UNION e escolher entre eles aleatoriamente.
Então, eu calcularia a área e a escalaria para cima ou para baixo para corresponder mais ao tamanho aproximado que você procura e, em seguida, testaria se não há dimensões inferiores a uma quantidade mínima necessária.
fonte