Я и команда работаем над созданием фабричной игры, которая дает игроку случайную фабрику в начале игры. Чтобы попытаться убедиться в том, что существует чувство «справедливости», в идеале случайно сгенерированная фабрика должна иметь площадь в пределах нескольких единиц (значения заполнителя) 30.
Относительно просто написать простой генератор случайных прямоугольников, отвечающий этим спецификациям, но наша цель состоит в том, чтобы фабрика была более сложной, возможно, состоящей из 2, 3 или даже 4 пересекающихся прямоугольников, создавая более сложные формы (представьте L, U и O-образные здания).
Я попытался сгенерировать случайный прямоугольник, а затем с помощью базовой алгебры заполнить 2-й прямоугольник, но до сих пор мне не повезло с реализацией более 2-х прямоугольников, и даже тогда я недоволен результатами только для 2-прямоугольного дизайна ,
Немного более актуальной информации: 2D сверху вниз. Некоторые из механизмов выполнены в стиле factorio, поэтому комнаты должны иметь разумную длину и ширину, чтобы было достаточно места для машин. В настоящее время в Java и Lua (при необходимости можно использовать встроенные библиотеки из любой из них)
Заранее спасибо!
РЕДАКТИРОВАТЬ: Когда я говорю «хорошие» или «плохие» выходы, плохой вывод будет любой вывод, который имеет место, неиспользуемое игроком. Заводская форма ограничивает место, где игрок может разместить фабричные машины, такие как конвейерные ленты. В идеале на фабрике не должно быть областей шириной всего 1-2 блока, форма не должна быть одним или двумя большими прямоугольниками с линией из 1-2 блоков, свисающих в одну сторону. Хорошим результатом будет то, что вся площадь пола «работоспособна», поэтому все области имеют ширину не менее 3-4 блоков. Хороший вывод не всегда должен быть сложным (1 или 2 прямоугольника в порядке), но он должен иметь хорошие шансы, если он состоит из более чем 1-2 прямоугольников.
Учитывая ограничение «все области имеют ширину не менее 3-4 блоков», первая мысль, которая приходит мне в голову, выглядит примерно так:
Основная идея заключается в том, что если вы хотите, чтобы все области имели как минимум заданный размер, работайте только в областях такого размера. В более общем смысле, если вы хотите, чтобы что-то было верным для всех сгенерированных выходов, посмотрите, можно ли это сделать для всех частично сгенерированных выходов.
источник
Попробуйте использовать логические выражения NOT и UNION и выбирать между ними случайным образом.
Затем я вычислю площадь и увеличу ее или уменьшу, чтобы она более точно соответствовала приблизительному размеру, который вы ищете, а затем проверила, что нет размеров, меньших, чем требуемая минимальная величина.
источник