Сообщество Engee

Робот-перфекционист.

Автор
avatar-josephjoseph
Notebook

Загрузка библиотек.

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]:
No description has been provided for this image
In [ ]:
load("roomA.gif")

rooma_2.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]:
No description has been provided for this image
In [ ]:
load("labirinthA.gif")

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]:
No description has been provided for this image

Область доступности:

In [ ]:
load("wash1A.gif")

wash1a.gif

In [ ]:
load("wash1B.gif")

wash1b.gif

Пример номер 2.

Результат работы робота.

In [ ]:
load("wash2.gif")
Out[0]:
No description has been provided for this image
In [ ]:
load("wash2A.gif")

Область доступности.

wash2a_2.gif

In [ ]:
load("wash2B.gif")

Работа робота в динамике.

wash2b_2.gif