Робот-перфекционист.
Автор
Загрузка библиотек.
In [ ]:
using Plots, Images, FileIO, TestImages
gr()
cd( @__DIR__ )
include("Room.jl");
include("Robot.jl");
Создание комнаты со стенами и проверка доступности.
In [ ]:
function test_room(width, height)
println("Test: room")
room = Room("room", width, height)
room.set_walls(room)
Robot(room)
println("Starting point: ", room.robot.start_x," ", room.robot.start_y)
room.floodfill(room, room.robot.start_x, room.robot.start_y)
room.draw(room)
room.animatedfloodfill(room)
end
test_room(20, 20);
In [ ]:
load("room.gif")
Out[0]:
In [ ]:
load("roomA.gif")
Создание случайного связного лабиринта.
Алгоритм создания лабиринта. Выбираем произвольную точку на карте, в которой нет стены и окружение которой тоже не содержит стен. От этой точки рисуем прямую стену в случайном направлении, пока не упремся в какую-нибудь стену. Повторяем эту процедуру несколько раз.
In [ ]:
function test_labirinth(width, height)
println("Test: labirinth")
room = Room("labirinth", width, height)
room.make_labirinth(room, (width + height) * 10)
Robot(room)
println("Starting point: ", room.robot.start_x," ", room.robot.start_y)
room.floodfill(room, room.robot.start_x, room.robot.start_y)
room.draw(room)
room.animatedfloodfill(room)
end
test_labirinth(100, 100);
In [ ]:
load("labirinth.gif")
Out[0]:
In [ ]:
load("labirinthA.gif")
Алгоритм робота-перфекциониста.
Если Вам кажется, что робот убирает не достаточно тщательно, то этот алгоритм для Вас. Данный робот выбирает направление, в следующей клетке которого он меньше всего бывал. Сам алгоритм определен в функции stepT.
In [ ]:
function test_walk(name, width, height, walls, steps)
println("Test: ", name)
room = Room(name, width, height)
room.make_labirinth(room, walls)
robot = Robot(room)
room.animatedfloodfill(room)
println("Starting point: ", robot.start_x, " ", robot.start_y)
println("Direction: ", robot.dir)
robot.move_forward(robot)
x0, y0 = robot.x, robot.y
A = Animation()
for i in 1:steps
robot.stepT(robot)
room.frame1(room)
frame(A)
end
gif(A, name * "B.gif", fps = 10)
room.draw(room)
end
test_walk("wash1", 30, 30, 10, 2500);
test_walk("wash2", 30, 30, 1000, 2500);
Далее два примера.
Пример номер 1.
Результат работы робота.
In [ ]:
load("wash1.gif")
Out[0]:
Область доступности:
In [ ]:
load("wash1A.gif")
In [ ]:
load("wash1B.gif")
Пример номер 2.
Результат работы робота.
In [ ]:
load("wash2.gif")
Out[0]:
In [ ]:
load("wash2A.gif")
Область доступности.
In [ ]:
load("wash2B.gif")
Работа робота в динамике.