Разработка приложения в среде Delphi для нахождения кратчайшего пути передвижения короля по заданному полю, соединяющего два заданных поля доски. Разработка и поиск алгоритма решения задачи, спецификация исходных данных и функций, тестирование программы.
Условие решаемой задачи дословно по заданию звучит следующим образом: «найти кратчайший путь передвижения короля по заданному клеточному полю, соединяющих два заданных поля доски» Диалог может длиться день, месяц… В моей ситуации требуется написать программу, чтобы она могла найти кратчайший путь передвижения короля по заданному клеточному полю, соединяющих два заданных поля доски. Отметив на поле короля, мы делаем проверку, чтобы пользователь не мог отметить клетку-цель на поле, не совпадающее цвету, поля короля, а также на поле где расположен сам король. Отметив на поле короля, мы делаем проверку, чтобы пользователь не мог отметить клетку-цель на поле, не совпадающее цвету, поля короля, а также на поле где расположен сам короля. var code: integer; // Сюда функция val запишет ошибку, в случае ее возникновения begin val (edit2.text, RAZMERY, code); // Получаем размер поля val (edit1.text, RAZMERX, code); // из текстовых полейРезультатом работы над курсовой работой создано приложение среде Delphi, которое находит в нем кратчайший путь и визуализирует его на форме приложения.
Введение
Условие решаемой задачи дословно по заданию звучит следующим образом: «найти кратчайший путь передвижения короля по заданному клеточному полю, соединяющих два заданных поля доски»
Целью представленной работы является разработка приложения “Поиск кратчайшего пути”, которое создает шахматную доску, находит кратчайший путь передвижения короля и отображает его.
Перед началом вычисления пользователь должен указывать в программе следующую информацию: - размерность поля
- установить слона на начальную позицию и указать конечную (при помощи мыши)
После этого программа должна показать кратчайший путь (пути) движения короля, выделяя его другим цветом.
Неформальная постановка задачи
Задачу ставит заказчик, а принимает разработчик. Между разработчиком и заказчиком должен состояться диалог, цель которого выяснить, одинаково ли они понимают задачу. Диалог может длиться день, месяц… В моей ситуации требуется написать программу, чтобы она могла найти кратчайший путь передвижения короля по заданному клеточному полю, соединяющих два заданных поля доски. Причем начальная и целевая клетки указываются при помощи мыши в запущенной программе.
Формальная постановка задачи
Разработка или поиск алгоритма решения задачи
Проект программы: Задаем размер поля n.
Проверим, чтобы король и его местоположение должны находиться на полях одного цвета.
Образуем матрицу для расчета пути размерности n 1.
С помощью полученной матрицы во избежание выхода за шахматное поле заполним окаймляющие элементы значениями false.
Выберем все возможные клетки, когда король из начального местоположения и точки назначения, используя ранее полученную матрицу.
Спецификация функций программы
В появившемся при вызове программы окне вводим размерность поля. а) если мы вводим размерность поля меньше или больше указанного диапазона, то выводится сообщение
В главном окне отмечаем расположение короля и цели. Отметив на поле короля, мы делаем проверку, чтобы пользователь не мог отметить клетку-цель на поле, не совпадающее цвету, поля короля, а также на поле где расположен сам король.
Тем самым указываются все случаи, которые могут возникнуть при решении задачи на компьютере. Каждый такой случай оформляется как некоторая функция (в смысли достижения цели)
Руководство пользователя
При разработке приложения применялся принятый в среде Delphi объектно-ориентированный подход реализации интерфейса. При реализации алгоритмов обработки данных использовался структурный подход при проектировании к написании программ приложения.
В появившемся при вызове программы окне вводим размерность поля.
В главном окне отмечаем расположение слона и цели. Отметив на поле короля, мы делаем проверку, чтобы пользователь не мог отметить клетку-цель на поле, не совпадающее цвету, поля короля, а также на поле где расположен сам короля.
Если мы вводим размерность поля меньше или больше указанного диапазона, то выводится сообщение
Проектирование программы
Все предшествующие этапы необходимы для сбора информации, используемой для проектирования программы. Проект программы это не сама программа, а ее эскиз, в котором четко зафиксированы все функции задачи, как некоторые ее подзадачи.
var code: integer; // Сюда функция val запишет ошибку, в случае ее возникновения begin val (edit2.text, RAZMERY, code); // Получаем размер поля val (edit1.text, RAZMERX, code); // из текстовых полей
// В случае возникновения введенного числа возможному размеру поля надо выдать ошибку и завершить выполнение процедуры if ((RAZMERX25)) then begin application.MESSAGEBOX("Неправильная циферка!", "Шахматы", MB_APPLMODAL); exit; end;
Form2.execute(RAZMERX, RAZMERY); // Передаем данные на Form 2 form2.SHOWMODAL; // Показываем Form 2 end;
procedure TFORM1.Edit1Change(Sender: TOBJECT);
begin edit2.text:=edit1.text; // Поле - квадрат end;
procedure TFORM1.FORMPAINT(Sender: TOBJECT);
begin if unit2.tf=true then self.Close; // Если пользователь нажимает Выход на Form 2, нужно завершить работу проги end;
// Изменим внешний вид и функцию кнопки под мемо bitbtn1.Kind:=BKRETRY;
bitbtn1.Caption:=" Еще раз!";
bitbtn1.tag:=2;
end;
procedure TFORM2.PROCCLICK(sender: tobject);
// Процедура постановки короля на поле и указания клетки - цели var x, y:integer;
begin
//
// Получаем координаты по tag x:=(sender as timage).Tag div 100;
y:=(sender as timage).tag mod 100;
// Если это постановка короля, загрузить «короля» в выбранную клетку if etap=postanovka then begin if ((x y) mod 2)=0 then (sender as timage).Picture.LOADFROMFILE("krch.bmp") else
(sender as timage).Picture.LOADFROMFILE("krbl.bmp");
etap:=SELECTPLACE; // Теперь переходим к указанию места назначения
KOROLX:=x;
KOROLY:=y;
memo1.Clear;
memo1.Lines.add("Укажите целевую клетку");
end;
// Мы выбрали клетку - цель if etap=SELECTPLACE then begin
// Если аккурат в этой клетке стоит король, выходим из процедуры, пользователь должен выбрать другое место if ((KOROLX=x) and (KOROLY=y)) then exit;
// Загрузим в клетку маркер
(sender as timage).Picture.LOADFROMFILE("zel.bmp");
NADOX:=x;
NADOY:=y;
// Изменим значение переменой etap, чтобы больше ничего нельзя было делать: ни расставлять короля, ни выбирать клетку inc(etap);
// И прочертим линию от короля до клетки - назначения - это и будет кратчайший путь dda_line(KOROLX, KOROLY, NADOX, NADOY);
end;
//else end;
procedure TFORM2.Execute(x, y: integer);
// Процедура вызывается, когда от пользователя получена информация о размерах X и Y поля var wid, i, j: integer;
begin
RAZMERX:=x;
RAZMERY:=y;
etap:=postanovka; // Сейчас пользователь будет ставить короля, развернем окно на весь экран self.WINDOWSTATE:=WSMAXIMIZED;
//
// Высчитываем размер клетки исходя из размеров окна и количества клеток wid:=self.Width div (max(x, y) 2);
for i:=1 to x do for j:=1 to y do begin img[i,j]:=timage.create(self); // Выделяем память img[i,j].Parent:=self; // Указываем родителя, чтобы клетка была именно на Form 2, а не где - то img[i,j].Top:=j*wid;
img[i,j].Stretch:=true; // Чтоб весь рисунок помещался img[i,j].Left:=i*wid;
// В зависимости от координат поля загружаем то черный, то белый фоны для клеток if ((i j) mod 2)=0 then img[i,j].picture.loadfromfile("ch.bmp") //:=inttostr(x y);
// Устанавливаем обработчик нажатия на клетку img[i,j].onclick:=PROCCLICK;
end;
// Для пущей верности self.WINDOWSTATE:=WSMAXIMIZED;
// Снабдим мемо текущей информацией memo1.Clear;
memo1.Lines.Add("Укажите начальное место расположения короля");
memo1.Left:=wid*(x 2);
memo1.Font.Name:="Times New Roman";
memo1.Font.Size:=25;
memo1.Width:=round(form2.width /2.5);
memo1.Height:=self.Height div 2;
// Придадим кнопке под мемо соответствующий вид bitbtn1.Left:=memo1.left;
bitbtn1.top:=memo1.Top memo1.Height;
bitbtn1.Width:=memo1.Width-25;
bitbtn1.Tag:=1;
bitbtn1.Kind:=BKCANCEL;
bitbtn1.Font:=memo1.font;
bitbtn1.height:=memo1.font.size*2;
bitbtn1.Caption:="Выход";
end;
procedure TFORM2.Button1Click(Sender: TOBJECT);
begin
// // end;
procedure TFORM2.FORMCREATE(Sender: TOBJECT);
begin self.WINDOWSTATE:=WSMAXIMIZED;
unit2.tf:=false;
end;
procedure TFORM2.BITBTN1Click(Sender: TOBJECT);
var i, j:integer;
begin
// Если tag=1, то выходим из программы if (sender as tbitbtn).tag=1 then begin self.close; tf:=true; end;
// Иначе вновь загружаем Form 1 для указания размеров for i:=1 to RAZMERX do for j:=1 to RAZMERY do img[i,j].Free;
self.WINDOWSTATE:=WSNORMAL;
self.Visible:=false;
end;
end.
Тестовый пример программы
Рис.1. Рабочее окно приложения - ставим короля
Рис.2. Рабочее окно приложения - нахождение кратчайшего пути шахматного короля
Вывод
Результатом работы над курсовой работой создано приложение среде Delphi, которое находит в нем кратчайший путь и визуализирует его на форме приложения. Приложение является полупрофессиональным. Выполненные многочисленные тестовые примеры позволяют утверждать, что надежность программного обеспечения проекта довольно высока.
Список литературы
1. Иванов Б.Н. Дискретная математика. Алгоритмы и программы: Учеб. Пособие. - Владивосток: Изд - во ДВГТ, 2000. - 288с.
2. Молчанова Л.А., Прудникова Л.И. Delphi в примерах и задачах: Учеб. пособие. Владивосток: Изд - во ТГЭУ, 2006. - 92с.
Вы можете ЗАГРУЗИТЬ и ПОВЫСИТЬ уникальность своей работы