Универсальный робот
作者
function gen_room(x, y)
room = ones(Integer, x, y)
room[2:end-1,2:end-1] .= 0
return room
end
function gen_start_point(room)
x = size(room,1)
y = size(room,2)
start_x = rand(2:x-1)
start_y = rand(2:y-1)
if all(room[2:x-1,2:y-1] .== 1)
room[start_x, start_y] = 0
else
while room[start_x, start_y] == 1
start_x = rand(2:x-1)
start_y = rand(2:y-1)
end
end
dir_x, dir_y = rand(([1,0],[0,1],[-1,0],[0,-1]))
return start_x, start_y, dir_x, dir_y
end
#Checking voids in "Near" region
function check_near_voids(room, min_point, Near)
while true
NearSum = sum(Near) # Расчёт кол-ва клеток в окружении.
if NearSum > min_point
Near[rand(1:size(Near,1)),rand(1:size(Near,2))] = 0
else
break
end
end
return
end
# Checking voids near walls
function checking_walls(room, min_point)
x = size(room,1)
y = size(room,2)
for i in 3:x-2
for j in (2,y-1)
p = room[i, j]
if p == 0
Nind = CartesianIndices((max(i-1,2):min(i+1,x-1), max(j-1,2):min(j+1,y-1)))
Near = room[Nind] # Выделение окружения клетки.
check_near_voids(room, min_point, Near)
room[Nind] .= Near
end
end
end
for i in (2,x-1)
for j in 3:y-2
p = room[i, j]
if p == 0
Nind = CartesianIndices((max(i-1,2):min(i+1,x-1), max(j-1,2):min(j+1,y-1)))
Near = room[Nind] # Выделение окружения клетки.
check_near_voids(room, min_point, Near)
room[Nind] .= Near
end
end
end
for i in (2,x-1)
for j in (2,y-1)
p = room[i, j]
if p == 0
Nind = CartesianIndices((max(i-1,2):min(i+1,x-1), max(j-1,2):min(j+1,y-1)))
Near = room[Nind] # Выделение окружения клетки.
check_near_voids(room, min_point-1, Near)
room[Nind] .= Near
end
end
end
return room
end
# Checking voids inside the room
function checking_voids_inside(room, min_point)
x = size(room,1)
y = size(room,2)
for i in 3:x-2
for j in 3:y-2
p = room[i, j]
if p == 0
Near = room[(i-1):(i+1), (j-1):(j+1)] # Выделение окружения клетки.
run = true
while run
NearSum = sum(Near) # Расчёт кол-ва клеток в окружении.
if NearSum > min_point
Near[rand(1:3),rand(1:3)] = 0
else
run = false
end
end
room[(i-1):(i+1), (j-1):(j+1)] .= Near
end
end
end
return room
end
function gen_room_rand(x,y)
# Пустая комната
room = gen_room(x, y)
# Случайные стены
room[2:end-1,2:end-1] .= rand([1,0],x-2,y-2)
# Удаление части стен (не гарантирует проходы везде!!!)
room = checking_voids_inside(room,3)
room = checking_walls(room,2)
return room
end
function gen_room_square_rand(x,y, num)
room = gen_room(x,y)
# Генерация прямоугольников
for i in 1:num
room_mini = gen_room_rand(size_x[i],size_y[i]);
r_x = rand(1:(x-size_x[i]-1))
r_y = rand(1:(y-size_y[i]-1))
room[(1:size_x[i]).+r_x,(1:size_y[i]).+r_y] .= room_mini
end
# Удаление части стен у углов комнат (не гарантирует проходы везде!!!)
room = checking_voids_inside(room, 4)
room = checking_walls(room, 2)
return room
end