Некоторые свойства:
Name – имя объекта;
Caption – заголовок окна;
Left, Top - положение окна по X и Y
Width, Height - размеры окна по X и Y
Color – цвет фона окна;
Некоторые обработчики событий:
OnCreate – действия при создании окна:
OnClose - действия при закрытии окна:
OnPaint – действия при перерисовке окна.
Некоторые методы:
Close – закрыть окно;
Hide – свернуть окно;
Show – показать окно.
TMainMenu помещает главное меню в программу. При помещении TMainMenu на форму это выглядит, как просто иконка. Иконки данного типа называют невидимым (невизуальным) компонентом, поскольку они невидимы во время выполнения программы.
Создание меню включает три шага:
1) Помещение TMainMenu на форму,
2) Вызов Дизайнера Меню через свойство Items в Инспекторе Объектов,
3) Определение пунктов меню в Дизайнере Меню.
TStatusBar необходим для отображения в поле игры количества очков и собранных линий.
TImageотображает графическое изображение на форме. Воспринимает форматы BMP, ICO, WMF.
Компонент ImageList представляет собой набор изображений одинаковых размеров, на которые можно ссылаться по индексам, начинающимся с 0. Теперь рассмотрим основные свойства TimageList:
Height - высота изображений в списке;
Wight — ширина изображений в списке;
AllocBy — Определяет количество изображений, на которое увеличивается список для добавления новых изображений;
Count – Определяет число изображений в списке. Свойство толькр для чтения.
В закладке TDialog находятся компоненты OpenDialog и SaveDialog, которые являются основой почти всех программ. Компонент OpenDialog открывает файл, а SaveDialog сохраняет текущее состояние программы (в привычной для пользователя форме обозначает пункт «Сохранить файл как...»).
2. Разработка алгоритмов.
Перед написанием программы необходимо составить ее алгоритм. Составленный мною алгоритм представлен на рис. 1
-
|
Выход Сохранение Загрузка Новая игра
|
|
Рисунок 1. – Блок-схема алгоритма
| |||
-
|
| ||
|
Рисунок 1. – Блок-схема алгоритма (продолжение)
В данном алгоритме входные данные представляет собой сигналы, поступающие с мыши, а выходные данные – изменение соответствующих параметров в поле игры.
Самое основное действие в алгоритме, как и в самой игре – передвижение шариков и проверка их на упорядоченность.
Алгоритм позволяет сохранять прогресс в игре каждого пользователя и показывать успехи в таблице рекордов.
Кроме того, алгоритм может сохранять игру, и в дальнейшем её открывать.
Рисунок2 - Блок-схема алгоритма заполнения массива нулями
Процедура обнуляет матрицы в соответствии со значениями переменных m,w,r.
3. Руководство программиста.
Пакет Delphi предназначен для создания больших программ, которые неудобно размещать в одном файле. В связи с этим программа формируется из нескольких файлов. Любая программа в Delphi состоит из файла проекта (файл с расширением dpr) и одного или нескольких модулей (файлы с расширением pas). Каждый из таких файлов описывает программную единицу Object Pascal.
Файл проекта представляет собой программу, написанную на языке Object Pascal и предназначенную для обработки компилятором. Эта программа автоматически создается Delphi.
Модули предназначены для размещения в них фрагментов программ. Текст модуля тоже сформирован Delphi, но программист может изменять его, придавая программе нужную функциональность.
После служебного слова Uses в каждом модуле идет перечисление тех модулей, к которым может обращаться данный модуль в процессе своей работы, что значительно облегчает задачу программиста при написании программы.
Проект данной работы состоит из главной формы, в которой описаны все функции, выполняемые приложением «Линии».
Таблица 1. – Используемые формы и модули.
Название | Описание | Размер |
Unit1.pas | Главный модуль | 485 Кb |
Unit2.pas | Модуль таблицы | 2 Kb |
Unit3.pas | Модуль рекордов | 1Kb |
Unit1.dfm | Главная форма | 485 Kb |
Unit2.dfm | Форма таблицы | 2Kb |
Unit3.dfm | Форма рекордов | 1Kb |
Project1.dpr | Файл проекта | 1 Kb |
Project1.res | Файл ресурсов | 20 Kb |
Основной частью программы является файл с расширением dpr. При компиляции программы Delphi создает файлы с расширениями pas, dfm и dcu для каждого модуля: pas – файл содержит копию текста из окна кода программы, в файле с расширением dfm хранится описание содержимого окна программы, а в dcu-файле – результат преобразования в машинные инструкции текста из обоих файлов. Файлы dcu создаются компилятором и дают необходимую базу для работы компоновщика, который преобразует их в единый загружаемый файл с расширением exe.
Разрабатываемая мной программа должна предусматривать некорректные действия пользователя и выводить сообщения о них. В Delphi предусмотрены сообщения на такие ошибки пользователя.
Глобальные переменные программы:
x,y,:integer– координаты шарика;
c:integer – цвет шарика;
i,j:integer – вспомогательные координаты;
sc,nl:integer – набранные очки.
Главный модуль содержит следующие программные элементы:
· Класс формы TForm1.
· Обработчики событий.
· procedure Init(m,w,r:boolean) - Инициализация, заполняем массивы нулями
· procedure CreateSpheres(x,y,c:integer) - Создаем шарик с координатами x,y и цветом c
· procedure NewSpheres(quantity:integer) - Создаем шарики с случайными позициями
· procedure ClickSpheres(Sender: TObject) - Щелчок на шарике
· procedure Wave(x1,y1,x2,y2:integer) - Распространение волны
· procedure Way(x1,y1,x2,y2:integer) - Нахождение пути от (x1, y1) до (x2, y2)
· procedure Move(x1,y1,x2,y2:integer) - Движение шарика по найденному пути
· procedure Pause(milliseconds:integer) - Пауза
· procedure DestroySpheres(x,y,k,i,j:integer) - Удаление k шариков, где i, j вспомогательные координаты для направления
· procedure Data(sc,nl:integer) - Очки
· procedure DestroyLines - Поиск линий
· procedure Restart - Новая игра
· Методы:
function EmptyPos(Pole:Desk):integer - Количество пустых позиций (для проверки проигрыша)
function ExitMap(x,y:integer):Boolean - Выход за границы поля
function FindLine(x,y,i,j:integer):integer - Поиск линии с координат x,y
function FindSphere(x,y:integer):TImage - Поиск Image'a с координатами x,y
procedure FormCreate(Sender: TObject); - Обработчик события при создании формы
Листинг программы расположен в приложении А.
4. Руководство пользователя
Назначение программы: программа, разработанная в курсовой работе, предназначена для развлечения и досуга пользователей. Приложение «Линии» обладает простейшими функциями, как движение цветных шариков, сохранение и загрузка игры, наличие таблицы рекордов.
Системные требования:
1) ОС Windows XP\Vista.
2) Объём оперативной памяти 64Мб
3) Свободное место на жёстком диске 1 Мб.
Для запуска программы достаточно скопировать файл с расширением.exe в любую папку, расположенную на жестком диске и запустить его (для деинсталляции достаточно лишь удалить файл расширением.exe с диска).
После запуска программы открывается окно главной формы и в поле игры появляется три шарика разного цвета в случайно выбранных клетках (рисунок Б.1) – можно начинать игру.
Для работы с главным меню:
1. Выход из программы осуществляется либо нажатием ALT+X, либо Файл – Выход.(рисунок Б.2)
2. Для вызова окна о разработавшем программу студенте (рисунок Б.3) нужно в меню нажать Справка – О программе.
Работа с памятью:
1. Чтобы сохранить текущую игру, нужно на главном меню кликнуть закладку «Игра», а далее в открывшемся списке – «Сохранить игру».
2. Чтобы открыть сохранённую ранее игру, находим в той же закладке «Игра» пункт «Загрузить игру».
3. Чтобы сбросить текущую игру, и начать заново, кликаем по пункту «Новая игра».
Для вызова таблицы рекордов в меню выбираем соответствующий пункт после чего появится таблица (Рисунок Б4.).
«Линии» выводит сообщения об ошибке при попытке выполнения некорректных действий (рисунок Б.5).
К некорректным действиям относятся:
1. Попытка передвигать шарики, когда не остаётся свободных позиций.
Заключение
В процессе выполнения курсовой работы было разработано приложение ОС Windows «Линии» в среде программирования Borland Delphi.
С помощью разработанной программы можно выполнять простые арифметические и довольно сложные инженерные расчеты: производить вычисления тригонометрических функций, натуральных и десятичных логарифмов, возводить числа в степень, извлекать корни, вести историю вычислений и преобразовывать числа из десятичной системы счисления в двоичную и шестнадцатеричную. При этом сама программа занимает очень мало места на диске, не требует установки и высоких системных требований.
В дальнейшем к калькулятору может быть добавлено выполнение арифметических действий над числами в различных системах счисления.
Список использованных источников
1. Фаронов В.В. Delphi. Программирование на языке высокого уровня. – Питер, СПб, 2005г.
2. Справочная система среды Delphi.
3. Зубов, А. Программирование на Delphi. Трюки и эффекты / А. Зубов. - СПб: Питер, 2005.
4. Delphi 7. Наиболее полное руководство / А. Хомоненко, В. Гофман, Е. Мещеряков, В. Никифоров. - СПб: БХВ, 2008.
Приложение А.
(обязательное)
Листинг программы
1. Модуль Unit1. Pas
unit Unit1;
interface
uses
Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms,
Dialogs, ExtCtrls, Buttons, Menus, ComCtrls;
type Desk=array [0..8,0..8] of integer;
type
TForm1 = class(TForm)
Area: TImage;
MainMenu1: TMainMenu;
N1: TMenuItem;
N2: TMenuItem;
StatusBar1: TStatusBar;
N3: TMenuItem;
N4: TMenuItem;
N5: TMenuItem;
N6: TMenuItem;
N8: TMenuItem;
N9: TMenuItem;
N11: TMenuItem;
OpenDialog1: TOpenDialog;
SaveDialog1: TSaveDialog;
N7: TMenuItem;
procedure Init(m,w,r:boolean); //Инициализация, заполняем массивы нулями
procedure CreateSpheres(x,y,c:integer); //Создаем шарик с координатами x,y и цветом c
procedure NewSpheres(quantity:integer); //Создем шарики с случайными позициями
procedure ClickSpheres(Sender: TObject); //Щелчок на шарике
procedure Wave(x1,y1,x2,y2:integer); //Распространение волны
procedure Way(x1,y1,x2,y2:integer); //Нахождение пути от (x1, y1) до (x2, y2)
procedure Move(x1,y1,x2,y2:integer); //Движение шарика по найденному пути
procedure Pause(milliseconds:integer); //Пауза
procedure DestroySpheres(x,y,k,i,j:integer);//Удаление k шариков, где i, j вспомогательные координаты для направления
procedure Data(sc,nl:integer); //Очки
procedure DestroyLines; //Поиск линий
procedure Restart; //Новая игра
function EmptyPos(Pole:Desk):integer; //Количество пустых позиций (для проверки проигрыша)
function ExitMap(x,y:integer):boolean; //Выход за границы поля
function FindLine(x,y,i,j:integer):integer; //Поиск линии с координат x,y
function FindSphere(x,y:integer):TImage; //Поиск Image'a с координатами x,y
procedure FormCreate(Sender: TObject);
procedure AreaMouseUp(Sender: TObject; Button: TMouseButton; Shift: TShiftState; X, Y: Integer);
procedure N6Click(Sender: TObject);
procedure N3Click(Sender: TObject);
procedure N4Click(Sender: TObject);
procedure N5Click(Sender: TObject);
procedure N11Click(Sender: TObject);
procedure N7Click(Sender: TObject);
private
{ Private declarations }
public
{ Public declarations }
end;
var
Form1: TForm1;
Road,WaveMap,Map:Desk;
clisp:boolean;
xsp,ysp:integer;
numlines,score:integer;
RoadFlag,DestroyFlag:boolean;
implementation
uses Unit2, Unit3;
{$R *.dfm}
procedure TForm1.Init(m,w,r:boolean);
var
x,y:integer;
begin
for y:=0 to 8 do begin
for x:=0 to 8 do begin
if m=true then Map[x,y]:=0;
if w=true then WaveMap[x,y]:=0;
if r=true then Road[x,y]:=0;
end;
end;
end;
procedure TForm1.CreateSpheres(x,y,c:integer);
begin
with TImage.Create(self) do begin
Autosize:=true; TransParent:=true;
Left:=x; Top:=y;
Picture.LoadFromFile('Bitmaps\'+inttostr(c)+'.bmp');
parent:=form1;
Onclick:=ClickSpheres;
end;
end;
procedure TForm1.NewSpheres(quantity:integer);
var
i,c,x,y:integer;
label Return;
begin
Randomize;
if EmptyPos(Map)>3 then begin
for i:=1 to Quantity do begin
Return:
x:=random(9);
y:=random(9);
c:=random(7)+1;
if Map[x,y]=0 then begin
Map[x,y]:=c;
CreateSpheres(x*30,y*30,c);
end else goto Return;
end;
end else begin
showmessage('Вы проиграли.');
Form3.Show;
Restart;
NewSpheres(3);
end;
end;
function TForm1.ExitMap(x,y:integer):boolean;
begin
ExitMap:=false;
if (x>=0) and (x<=8) and (y>=0) and (y<=8) then ExitMap:=true;
end;
procedure TForm1.Wave(x1,y1,x2,y2:integer);
var
x,y,k:integer;
flag:boolean;
begin
flag:=true;
for y:=0 to 8 do begin
for x:=0 to 8 do begin
if Map[x,y]>0 then WaveMap[x,y]:=-1 else WaveMap[x,y]:=0;
end;
end;
k:=1; WaveMap[x1,y1]:=k;
while flag do begin
flag:=false;
for y:=0 to 8 do begin
for x:=0 to 8 do begin
if WaveMap[x,y]=k then begin
if (WaveMap[x-1,y]=0) and (Exitmap(x-1,y)=true) then begin
WaveMap[x-1,y]:=k+1;
flag:=true;
end;
if (WaveMap[x+1,y]=0) and (Exitmap(x+1,y)=true) then begin
WaveMap[x+1,y]:=k+1;
flag:=true;
end;
if (WaveMap[x,y-1]=0) and (Exitmap(x,y-1)=true) then begin
WaveMap[x,y-1]:=k+1;
flag:=true;
end;
if (WaveMap[x,y+1]=0) and (Exitmap(x,y+1)=true) then begin
WaveMap[x,y+1]:=k+1;
flag:=true;
end;
end;
end;
end;
if WaveMap[x2,y2]>0 then flag:=false else k:=k+1;
end;
end;
procedure TForm1.Way(x1,y1,x2,y2:integer);
var
k:integer;
begin
k:=WaveMap[x2,y2];
Road[x2,y2]:=k-WaveMap[x1,y1]+1;
if (ExitMap(x2-1,y2)=true) and (WaveMap[x2-1,y2]=k-1) then Way(x1,y1,x2-1,y2) else
if (ExitMap(x2+1,y2)=true) and (WaveMap[x2+1,y2]=k-1) then Way(x1,y1,x2+1,y2) else
if (ExitMap(x2,y2-1)=true) and (WaveMap[x2,y2-1]=k-1) then Way(x1,y1,x2,y2-1) else
if (ExitMap(x2,y2+1)=true) and (WaveMap[x2,y2+1]=k-1) then Way(x1,y1,x2,y2+1);
end;
function TForm1.FindSphere(x,y:integer):TImage;
var
i:integer;
begin
for i:=0 to ComponentCount-1 do begin
if (Components[i] is TImage) and (Timage(Components[i]).Name<>'Area') and (Timage(Components[i]).Left=x) and (Timage(Components[i]).top=y) then begin
Result:=Timage(Components[i]);
exit;
end;
end;
end;
procedure TForm1.Move(x1,y1,x2,y2:integer);
var
Image:Timage;
x,y,i:integer;
begin
RoadFlag:=false;
init(false,true,true);
Image:=FindSphere(x1*30,y1*30);
Wave(x1,y1,x2,y2);
if WaveMap[x2,y2]>0 then begin
RoadFlag:=true;
Way(x1,y1,x2,y2);
x:=x1;
y:=y1;
repeat
Pause(50);
if Road[x-1,y]-Road[x,y]=1 then begin
x:=x-1;
end else
if Road[x+1,y]-Road[x,y]=1 then begin
x:=x+1;
end else
if Road[x,y-1]-Road[x,y]=1 then begin
y:=y-1;
end else
if Road[x,y+1]-Road[x,y]=1 then begin
y:=y+1;
end;
Image.Left:=x*30;
Image.Top:=y*30;
until (x=x2) and (y=y2);
Map[x2,y2]:=Map[x1,y1];
Map[x1,y1]:=0;
end;
end;
procedure TForm1.ClickSpheres(Sender: TObject);
begin
clisp:=true;
xsp:=(sender as TImage).Left div 30;
ysp:=(sender as TImage).top div 30;
end;
procedure TForm1.FormCreate(Sender: TObject);
begin
score:=0;
numlines:=0;
Init(true,true,true);
NewSpheres(3);
end;
procedure TForm1.Pause(milliseconds:integer);
begin
application.ProcessMessages;
sleep(milliseconds);
end;
procedure TForm1.DestroySpheres(x,y,k,i,j:integer);
var
n,dx,dy:integer;
image:TImage;
begin
n:=0; dx:=x; dy:=y;
while n<>k do begin
image:=FindSphere(dx*30,dy*30); image.Destroy;
application.ProcessMessages;
Map[dx,dy]:=0;
n:=n+1; dx:=dx+i; dy:=dy+j;
end;
Data(k,1);
DestroyFlag:=true;
end;
function TForm1.FindLine(x,y,i,j:integer):integer;
var
dx,dy,k:integer;
begin
dx:=x; dy:=y; k:=0;
while Map[x,y]=Map[dx,dy] do begin
if ExitMap(dx,dy)=true then begin
dx:=dx+i;
dy:=dy+j;
k:=k+1;
end else break;
end;
result:=k;
end;
procedure TForm1.DestroyLines;
var
x,y,k,i,j:integer;
begin
DestroyFlag:=false;
for y:=0 to 8 do begin
for x:=0 to 8 do begin
if Map[x,y]<>0 then begin
if FindLine(x,y,1,0)>3 then DestroySpheres(x,y,FindLine(x,y,1,0),1,0) else
if FindLine(x,y,1,1)>3 then DestroySpheres(x,y,FindLine(x,y,1,1),1,1)else
if FindLine(x,y,0,1)>3 then DestroySpheres(x,y,FindLine(x,y,0,1),0,1) else
if FindLine(x,y,-1,1)>3 then DestroySpheres(x,y,FindLine(x,y,-1,1),-1,1);
end;
end;
end;
end;
function TForm1.EmptyPos(Pole:Desk):integer;
var
x,y,e:integer;
begin
e:=0;
for y:=0 to 8 do begin
for x:=0 to 8 do begin
if Pole[x,y]=0 then e:=e+1;
end;
end;
result:=e;
end;
procedure TForm1.Data(sc,nl:integer);
begin
numlines:=numlines+nl;
score:=score+sc;
Statusbar1.Panels[0].Text:='Уничтожено линий: '+inttostr(numlines);
Statusbar1.Panels[1].Text:='Очки: '+inttostr(score);
end;
procedure TForm1.AreaMouseUp(Sender: TObject; Button: TMouseButton; Shift: TShiftState; X, Y: Integer);
begin
if clisp=true then begin
clisp:=false;
Move(xsp,ysp,x div 30,y div 30);
if RoadFlag=true then begin
Pause(100);
DestroyLines;
Pause(150);
if DestroyFlag=false then begin
NewSpheres(3);
DestroyLines;
end;
end;
RoadFlag:=false;
end;
end;
procedure TForm1.N6Click(Sender: TObject);
begin
form1.Close;
end;
procedure TForm1.Restart;
var
i:integer;
label Return;
begin
init(true,true,true);
score:=0;
numlines:=0;
Return:
for i:=0 to ComponentCount-1 do begin
if (Components[i] is TImage) and (Timage(Components[i]).Name<>'Area') then begin
Timage(Components[i]).Destroy;
goto Return;
end;
end;
Statusbar1.Panels[0].Text:='Уничтожено линий: 0';
Statusbar1.Panels[1].Text:='Очки: 0';
end;
procedure TForm1.N3Click(Sender: TObject);
begin
Restart;
NewSpheres(3);
end;
procedure TForm1.N4Click(Sender: TObject);
var
F:File;
begin
if SaveDialog1.Execute then begin
//if FileExists(SaveDialog1.FileName) then
// if Application.MessageBox('Такой файл уже существует. Перезаписать?','Вопрос',mb_YesNo) <> 6 then Exit;
AssignFile(f,SaveDialog1.FileName+'.sav');
{$I-} ReWrite(f,1); {$I+}
//ReWrite(f);
//WriteLn(F,);
end;
if IOResult <> 0 then begin
Application.MessageBox('Ошибка записи файла!','Ошибка',mb_ok);
Exit;
end;
end;
procedure TForm1.N5Click(Sender: TObject);
var
f:File;
s:string;
begin
S:=OpenDialog1.FileName;
AssignFile(f,s);
{$I-} Reset(f,1); {$I+}
if IOResult <> 0 then begin
Application.MessageBox('Ошибка чтения файла или файл отсутствует!','Ошибка',mb_ok);
Exit;
end;
end;
procedure TForm1.N11Click(Sender: TObject);
begin
showmessage('Автор программы: Буянов Алексей);
end;
procedure TForm1.N7Click(Sender: TObject);
begin
Form2.Show;
end;
end.
2.Модуль Unit2. Pas
unit Unit2;
interface
uses
Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms,
Dialogs, StdCtrls, jpeg, ExtCtrls;
type
TForm2 = class(TForm)
Image1: TImage;
Label1: TLabel;
Label2: TLabel;
Label3: TLabel;
Label4: TLabel;
Label5: TLabel;
Label6: TLabel;
Label7: TLabel;
Label8: TLabel;
Label9: TLabel;
Button1: TButton;
Button2: TButton;
procedure Button1Click(Sender: TObject);
procedure Button2Click(Sender: TObject);
private
{ Private declarations }
public
{ Public declarations }
end;
var
Form2: TForm2;
implementation
uses Unit1, Unit3;
{$R *.dfm}
procedure TForm2.Button1Click(Sender: TObject);
begin
close;
end;
procedure TForm2.Button2Click(Sender: TObject);
begin
if application.Messagebox ('Удалить рекорды?','information',mb_yesno)= id_yes then
begin
Label1.Caption:='---';
Label2.Caption:='---';
Label3.Caption:='---';
Label4.Caption:='---';
Label5.Caption:='---';
Label6.Caption:='---';
end;
end;
end.
3.Модуль Unit3. Pas
unit Unit3;
interface
uses
Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms,
Dialogs, StdCtrls;
type
TForm3 = class(TForm)
Edit1: TEdit;
Button1: TButton;
Button2: TButton;
procedure Button1Click(Sender: TObject);
procedure Button2Click(Sender: TObject);
private
{ Private declarations }
public
{ Public declarations }
end;
var
Form3: TForm3;
implementation
uses Unit1, Unit2;
{$R *.dfm}
procedure TForm3.Button1Click(Sender: TObject);
begin
if strtoint(Form2.Label4.caption)> score then
begin
Form2.label5.Caption:=inttostr(score);
Form2.Label2.Caption:=Edit1.text;
end;
if strtoint (Form2.Label5.Caption)>score then
begin Form2.Label6.Caption:=inttostr(score);
Form2.Label3.Caption:=Form3.Edit1.Text;
end;
Form2.Label1.Caption:=Form3.Edit1.Text;
Form2.Label4.Caption:=inttostr(score);
close;
end;
procedure TForm3.Button2Click(Sender: TObject);
begin
close;
end;
end.
Приложение Б
(обязательное)
Снимки окон программы
Рисунок Б1. – Главное окно программы.
Рисунок Б2 – Окно формы «Выход»
Рисунок Б3. – Окно формы «Справка».
Рисунок Б4. – Окно формы «Таблица рекордов» .