Добавил:
Upload Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз: Предмет: Файл:
Отчет.doc
Скачиваний:
20
Добавлен:
19.05.2015
Размер:
614.4 Кб
Скачать

5 Рекоменации пользователю

При запуске программы на экран выводится основное окно, разделенное на две области:

  • «карта» - представлена в виде квадратного поля размером 9x9 клеток;

  • информационное поле – содержит всю необходимую информацию.

Каждая клетка «карты» имеет свой индекс (пара чисел, соответствующих номеру строки и столбца). Также на карте располагаются непосредственно сам объект и препятствия. При поиске пути на карте отображаются фронты соответствующих волн, представляющие собой порядковый номер той или иной волны. После нахождения пути объект перемещается в целевую точку, перемещаясь от волны к волне. В случае, когда целевая клетка не достижима, на «карте» отображаются только фронты успешно построенных волн.

В информационном поле изначально содержится информация о назначении клавиши «пробел» и текущее положение объекта (индекс клетки, в которой он находится в данный момент). После успешного перемещения объекта в указанную клетку в поле добавляется информация о новом расположении объекта (индекс целевой клетки) и о количестве волн, созданных при построении пути. В случае, когда целевая клетка не достижима, в поле выводится информация о том, что пути нет.

Для того, чтобы переместить объект в нужную клетку, необходимо навести

курсор на свободную клетку и нажать левую кнопку мыши. Если данная клетка достижима, выполнится поиск пути, построение волн и перемещение объекта в указанную клетку. В противном случае программа выдаст сообщение о том, что пути нет. Реорганизация «карты» осуществляется нажатием клавиши «пробел». При этом объект остается на прежнем месте, изменяется лишь количество и расположение препятствий. Таким образом, обеспечивается возможность проверки работы алгоритма в разных ситуациях.

6 Рекомендации программисту

Программное средство реализовано при помощи среды PascalABC.NET с использованием модулей GraphABC и ABCSprites. Содержит следующие структурные данные:

  • константа Nk – используется как защита от зацикливания при поиске пути к недостижимой клетке;

  • запись Box – программная реализация клетки «карты», содержит целочисленные поля (x, y), хранящие координаты данной клетки, и поле index типа byte, хранящее информацию о состоянии клетки (свободна/не свободна), значения стартовой и целевой клетки и номера фронтов волн;

  • запись wall – программная реализация препятствия, содержит целочисленные поля i, j, хранящие индекс клетки, и поле pic, хранящее графическое представление данного объекта.

При запуске программы управление передается процедуре без параметров

Main. В ней осуществляется инициализация параметров графического окна, непосредственно отрисовка экрана, первоначальная инициализация рабочей матрицы (field) и установка объекта. Индексы матрицы задаются следующим образом:

  • если клетка свободна, ее индекс равен 254;

  • если клетка не свободна, ее индекс равен 255;

  • если клетка является стартовой, ее индекс равен 253;

  • если клетка является целевой (финишной), ее индекс равен 0.

Затем управление передается процедуре без параметров Init_field. Здесь при помощи нескольких генераторов случайных чисел задается количество и местоположение препятствий и происходит перерисовка «карты». После этого вызывается процедура без параметров Refresh_background. Она просто осуществляет перерисовку информационного поля. Когда происходит событие нажатия клавиши на клавиатуре, управление передается процедуре MyKeyDown. В качестве параметра в нее передается код нажатой клавиши. Если он соответствует коду клавиши «пробел», то вызывается процедура Init_field. При нажатии клавиши мыши вызывается процедура MyMouseDown. В качестве параметров в нее передаются координаты, в которых произошло событие нажатия, и код нажатой клавиши. Если данный код соответствует коду левой клавиши мыши, определяется, произошло ли событие нажатия в пределах свободной клетки «карты». Если это так, то вызываются следующие процедуры: Update_field (обновляет индексы клеток после очередного поиска пути), Refresh_background, Create_wave (начинает поиск пути).

Процедура Create_wave не содержит параметров. В ней изначально инициализируется счетчик итераций (Ni := 0), после чего запускается цикл, в котором построчно просматривается рабочий массив. Если индекс текущей клетки равен текущему значению счетчика итераций, то вызывается процедура построения фронта волны (Create_front). После этого счетчик итераций увеличивается на единицу. Цикл повторяется до тех пор, пока не будет достигнута целевая клетка, либо значение счетчика не превысит значение максимально возможного количества итераций (Nk), что будет указывать на то, что пути нет, и будет выдано соответствующее сообщение. Если же цикл прервался по причине достижения целевой клетки, то вызывается процедура построения пути (Create_path).

В процедуру Create_front в качестве параметров передается индекс текущей клетки и текущее значение счетчика итераций. Вокруг данной клетки в четырех направлениях просматриваются соседние клетки по следующим правилам:

  • если клетка свободна, ее индексу присваивается значение Ni + 1;

  • если индекс клетки совпадает с индексом начальной клетки, прерывание процедуры.

Процедура Create_path не содержит параметров. Начиная от стартовой

клетки в четырех направлениях просматриваются соседние клетки, и из них выбирается клетка с минимальным значением индекса. В эту клетку перемещается объект. Процесс повторяется до тех пор, пока объект не достигнет целевой точки.

Для усовершенствования программы можно переработать процедуру Init_field таким образом, чтобы количество и расположение препятствий задавались пользователем. Это позволит использовать программу для поиска пути в определенных ситуация с заранее указанной конфигурацией поля. Помимо этого, в программу можно добавить поддержку нескольких объектов для поиска пути с учетом изменения позиции того или иного объекта (подобный принцип полезно реализовать, например, в стратегических играх, где на карте одновременно находится несколько персонажей). Также можно реализовать изменение размера поля, однако для этого необходимо в параметрах графического окна «включить» опцию его масштабирования.