
В приведенном выше выходном изображении есть две проблемы.
- Линии стен лабиринта неполные, но присутствуют. Длина линии не такая, как должна быть, что приводит к «полулабиринту».
- Из-за расширяющегося характера круглого лабиринта каждый Слой (или «уровень», как я называю его в сценарии) определяет количество ячеек, помещаемых в указанный слой, что позволяет создать более естественный вид лабиринта вместо лабиринта с коридорами, которые продолжают увеличиваться в размерах по мере удаления от уровня. центр. Это вызывает небольшие расхождения при соединении двух слоев. Это не на каждом уровне. Именно тогда, когда необходимо увеличить количество клеток.
from PIL import Image, ImageDraw
import math
import random
from collections import deque
class CircularMaze:
def __init__(self, levels, line_len, wall_width, corridor_size, canvas_size):
assert line_len > 0, "Line length must be greater than 0"
self.canvas_size = canvas_size
self.num_levels = levels
self.line_length = line_len
self.wall_width = wall_width
self.corridor_size = corridor_size
self.num_cells_at_level = self.cell_count_by_level()
self.total_cells = sum(self.num_cells_at_level)
def cell_count_by_level(self):
cells_by_level = [1]
for level in range(1, self.num_levels): cells_by_level.append(int(math.pow(2, math.floor(math.log2(level + 1)) + 3)))
return cells_by_level
def index_1d_from_2d(self, level, cell):
if level >= self.num_levels: raise Exception("level greater than maze levels")
idx = 0
for lvl in range(level): idx += self.num_cells_at_level[lvl]
idx += cell
return idx
def index_2d_from_1d(self, idx):
if idx >= self.total_cells: raise Exception("1D index greater than total number of cells")
level = 0
while idx - self.num_cells_at_level[level] >= 0:
idx -= self.num_cells_at_level[level]
level += 1
return level, idx
def parent_index_1d(self, level, cell):
if level
Подробнее здесь: https://stackoverflow.com/questions/786 ... oing-wrong