Добавил:
Upload Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз: Предмет: Файл:
Программирование / Курсовая работа / Курсовая работа на Delphi.pdf
Скачиваний:
54
Добавлен:
27.05.2015
Размер:
961.42 Кб
Скачать

2 Пример выполнения курсовой работы

Задание: Дана квадратная область, разбитая на 100 квадратов. В каждом из квадратов может находится шар, характеризуемый размером и начальным цветом. Шары передвигаются по клеткам на каждом шаге случайным образом с шагом ±1 по каждой из координат. Если клетка в направлении движения занята, то шар остаётся на месте, но меняет свой цвет на цвет шара, блокирующего его. Провести отображение задачи. Предусмотреть добавление и удаление шаров, изменение их размеров (размер шара не может быть больше размера клетки), сохранение и загрузку состояния программы, изменение скорости перемещения шаров.

Примечание: Ниже приводятся краткие примеры выполнения некоторых разделов курсовой работы.

2.1 Постановка задачи

В соответствии с условиями задачи требуется применение средств графического отображения, а также компонента класса «Timer» для организации непрерывного независимого движения шаров. Для добавления и редактирования шаров целесообразно применять диалоговые окна.

2.2 Выделение классов

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

TBall = class public

Index : integer; Koord : TPoint; Color : TColor;

6

Radius : integer; Table : TTable;

constructor Create(NewIndex, NewRadius : integer; NewColor : TColor; BallTable : Ttable; NewKoord : TPoint);

destructor Destroy; override; procedure Show;

procedure Hide; procedure Move;

end;

где: Index

-

уникальный номер шара для идентификации и отображения,

 

 

целое число;

Koord

-

текущие координаты шара. Каждая из координат шара может

 

 

принимать значения в диапазоне 1 10;

Color

-

текущий цвет шара;

Radius -

текущий радиус шара, не может превышать размера клетки;

Table

-

ссылка на область отображения, по которой перемещается шар.

Метод constructor Create служит для создания нового шара, задания начальных значений полей класса и добавления шара в область отображения.

constructor TBall.Create; begin

inherited Create; Index := NewIndex; Radius := NewRadius; Color := NewColor; Table := BallTable; Koord := NewKoord; Show;

end;

Координаты начального расположения шара, передаваемые в конструктор (параметр NewKoord), выбираются случайным образом, например с использованием следующего алгоритма.

var

i,j,n : integer;

MasPoint : array[1..100] of Tpoint; Koord : Tpoint;

begin

{Для выбора начального расположения первоначально производится поиск всех свободных клеток,}

n := 0;

for i := 1 to 10 do for j := 1 to 10 do

if Table.Cells[i,j]=nil then begin

inc(n);

7

MasPoint[n].X := i; MasPoint[n].Y := j;

end;

{а потом среди них производится выбор случайным образом} i := Random(n)+1;

Koord := MasPoint[i]; end;

Метод destructor Destroy позволяет разрушать шар при его удалении.

destructor TBall.Destroy; begin

Hide;

inherited Destroy; end;

Метод procedure Show служит для отображения шара.

procedure TBall.Show; var

X,Y : integer; s : string;

begin

{Определим по координатам клетки точку ее центра}

X := Table.Size*(Koord.X-1)+ Table.Size div 2; Y := Table.Size*(Koord.Y-1)+ Table.Size div 2;

{Перед рисованием шара необходимо задать цвет рисования}

Table.Canvas.Pen.Color := Color;

Table.Canvas.Brush.Color := Color; Table.Canvas.Ellipse(X-Radius,Y-Radius,X+Radius,Y+Radius);

{Для идентификации шара на области отображения в центре шара выведем его номер}

s := IntToStr(Index); Table.Canvas.TextOut(X-Table.Canvas.TextWidth(s) div 2,

Y-Table.Canvas.TextHeight(s) div 2,s);

{После того как шар отображен, установим признак занятости клетки}

Table.Cells[Koord.X,Koord.Y] := self; end;

Метод procedure Hide служит для стирания шара с поверхности отображения.

procedure TBall.Hide; var

X,Y : integer; begin

X := Table.Size*(Koord.X-1)+ Table.Size div 2; Y := Table.Size*(Koord.Y-1)+ Table.Size div 2;

{Перед стиранием шара установим в качестве цвета рисования цвет фона области отображения}

Table.Canvas.Pen.Color := Table.Color;

8

Table.Canvas.Brush.Color := Table.Color; Table.Canvas.Ellipse(X-Radius,Y-Radius,X+Radius,Y+Radius);

{После того как шар стерт с области отображения, пометим данную клетку свободной}

Table.Cells[Koord.X,Koord.Y] := nil;

end;

Метод procedure Move служит для перемещения шара случайным образом по области отображения. Перемещение заключается в стирании шара в старом месте отображения, изменении его координат или свойств, и отрисовке в соответствии с новыми значениями свойств.

procedure TBall.Move; var

dx,dy : integer; begin

Hide;

{Для определения направления движения шара воспользуемся функцией генерации случайных чисел. При возможном

перемещении за пределы области рисования изменим

направление движения на противоположное. Определение направления движения будем осуществлять до тех пор, пока хотя бы по одной из координат не будет перемещения} repeat

dx := Random(3)-1;

if not((Koord.X+dx) in [1..10]) then dx := -dx;

dy := Random(3)-1;

if not((Koord.Y+dy) in [1..10]) then dy := -dy;

until (dx<>0) or (dy<>0);

{Если клетка, куда будет перемещен шар свободна, то меняем

координаты шара. В противном случае меняем его цвет на цвет блокирующего шара}

if Table.Cells[Koord.X+dx,Koord.Y+dy]=nil then begin

Koord.X := Koord.X+dx;

Koord.Y := Koord.Y+dy; end

else

Color := Table.Cells[Koord.X+dx,Koord.Y+dy].Color; Show;

end;

Класс области отображения описывается следующим образом:

TTable = class public

Size : integer; Canvas : TCanvas; Color : TColor;

9