Разработка приложения «Сапер» в интегрированной среде программирования Delphi/Lazarus
Министерство образования и науки РФ
ФГОУ ВПО «Чувашский государственный университет имени И.Н.Ульянова»
Экономический факультет
Кафедра информационных систем
Курсовая работа
По дисциплине
по дисциплине «Высокоуровневые методы информатики и программирования»
на тему:
«Разработка приложения «Сапер» в интегрированной среде
программирования Delphi/Lazarus»
Выполнила: студентка группы ЭК-61-08
Степанова Арина
Руководитель:
Митрофанов Е.П.
Чебоксары
2011
Оглавление
Введение
Глава 1. Компоненты Delphi используемые в программе
1.1.Компонент TMainMenu
1.2. Компонент TLabel
1.3. Компонент TCanvas
Глава 2. Алгоритм и способы решения задачи
2.1. Постановка задачи
2.2. Алгоритм реализации игровой программы
Глава 3. Разработка программы
3.1. Описание пользовательского интерфейса
3.2. Описание функций используемых в программе
Заключение
Список использованной литературы:
Приложение
Введение
Все, кто имеет дело с компьютером, так или иначе сталкивались с компьютерными играми, и подавляющее большинство может сходу назвать несколько игр, которые им особенно понравились. Те, кто уже совсем наигрался, почти наигрался или еще не наигрался, но в процессе общения с компьютером уже начал совмещать игры с чем-нибудь более полезным, возможно, хотели бы придумать какие-нибудь свои, не похожие ни на какие другие игры.
Многое захватывает в таком творчестве. И не сам процесс игры, а разработка игровой вселенной, ее проектирование и реализация. Когда можно слить воедино сценарий, графику, музыку, искусно задуманный и умело запрограммированный алгоритм — создать единый фантастический мир, живущий по законам, которые ты же для него и придумал.
В данной курсовой работе речь пойдет о создании несложной игровой программы «Сапер», которая и будет являться объектом исследования.
В первой главе данной курсовой работы рассматриваются аспекты программирования игр с использованием визуальных компонентов, и приводится описание компонентов, используемых при реализации практической части курсовой работы. Во второй главе приведены этапы разработки программы, такие как постановка задачи, алгоритм реализации и описание пользовательского интерфейса.
Список использованных источников содержит полный перечень технической литературы, использованной для написания данной курсовой работы.
Приложения содержат блок-схемы всех процедур программы, и текст самой программы.
Целью данной курсовой работы является программирование с помощью интегрированной среды программирования Delphi . Прежде чем начать выполнять свое задание рассмотрим эту систему программирования, в общем.
Delphi - это греческий город, где жил дельфийский оракул. И этим именем был назван новый программный продукт с феноменальными характеристиками.
Надо отметить, что к моменту выхода продукта обстановка вокруг компании Borland складывалась не лучшим для нее образом. Поговаривали о возможной перепродаже компании, курс акций компании неудержимо катился вниз. Сейчас уже можно без всяких сомнений утверждать, что период трудностей позади. Неверно, конечно, было бы говорить, что только Delphi явился причиной восстановления компании; кроме Delphi, у Borland появились и другие замечательные продукты, так же, как и Delphi, основывающиеся на новых, появившихся недавно у компании Borland, технологиях.
Тем не менее, именно Delphi стал тем единственным продуктом, который может настолько удачно сочетать несколько передовых технологий.
Delphi - это комбинация нескольких важнейших технологий:
Высокопроизводительный компилятор в машинный код;
Объектно-ориентированная модель компонент;
Визуальное (а, следовательно, и скоростное) построение приложений из программных прототипов;
Масштабируемые средства для построения баз данных.
Компилятор, встроенный в Delphi, обеспечивает высокую производительность, необходимую для построения приложений в архитектуре “клиент-сервер”. Этот компилятор в настоящее время является самым быстрым в мире, его скорость компиляции составляет свыше 120 тысяч строк в минуту на компьютере 486DX33. Он предлагает легкость разработки и быстрое время проверки готового программного блока, характерного для языков четвертого поколения (4GL) и в то же время обеспечивает качество кода, характерного для компилятора 3GL. Кроме того, Delphi обеспечивает быструю разработку без необходимости писать вставки на Си или ручного написания кода (хотя это возможно).
Глава 1. Компоненты Delphi используемые в программе
1.1.Компонент TMainMenu
TMainMenu позволяет поместить главное меню в программу. При помещении TMainMenu на форму это выглядит, как просто иконка. Иконки данного типа называют невидимым (невизуальным) компонентом, поскольку они невидимы во время выполнения программы. Создание меню включает три шага:
1) помещение TMainMenu на форму,
2) вызов Дизайнера Меню через свойство Items в Инспекторе Объектов,
3) определение пунктов меню в Дизайнере Меню.
Этот компонент доступен из модуля MENUS, и находится на странице Палитры компонентов Standard.
Этот компонент представляет главное меню формы и наследует все методы и свойства TMenu. Особенность его в том, что в нем реализован сложный механизм объединения меню. Это необходимо по следующим причинам:
1. Если в приложении имеется несколько форм со своими меню, то для упрощения работы целесообразно соединить их в одно и управлять меню из главной формы;
2. Объединение меню нужно при работе с интерфейсом MDI и его подокнами;
3. Механизм объединения меню используется серверами OLE, запускаемыми по месту нахождения объекта OLE. Загружаясь, сервер дописывает осуществляемые им операции к меню другого приложения.
Для того чтобы реализовать объединение меню, у тех форм, меню которых будут присоединены к главному, необходимо установить в True свойство: (Рb) property AutoMerge: Boolean.
При этом у главного меню оно должно оставаться равным False, иначе главное меню будет вообще невидимым. Объединение будет происходить автоматически при активизации новых форм или серверов OLE. Кроме автоматического режима, объединение меню можно выполнить при вызове метода: procedure Merge(Menu: TMainMenu).
На форму можно поместить сколько угодно объектов этого класса, но отображаться в полосе меню в верхней части формы будет только тот из них, который указан в свойстве Menu формы. Каждая опция главного меню может раскрываться в список подопций или содержать конечную команду. После установки компонента на форму необходимо создать его опции. На рис. 1 показан вид окна конструктора меню.
Рис. 1. Окно конструктора TMainMenu.
Свойства компонента:
Property AutoMerge: Boolean - разрешает/запрещает слияние главного меню вторичной формы с главным меню основной формы в не MDI-приложениях.
Тype TMenuItemAutoFlag = (maAutomatic, maManual, maPar-ent) ; property AutoHotkeys: TMenuAuto-Flag - определяет, будет ли следить программа за уникальностью клавиш быстрого выбора для всех опций меню: maAutomatic - автоматически при создании опции; maManual -с помощью вызова специального метода; maparent - по правилу, установленному для опции верхнего уровня.
Property AutoLineReduction: TMenuItemAutoFlag - определяет, будет ли программа автоматически удалять лишние разделители между опциями многоколончатого меню. Тип TMenuItemAutoFlag описан в свойстве AutoHotkeys.
Property Images: TCustomImageList - содержит ссылку на объект - хранилище изображении, которые могут появляться около индивидуальных элементов (пунктов) в меню.
Property Items: TMenuItem; default - открывает индексированный доступ к опциям меню.
Property OwnerDraw: Boolean - определяет, будет ли программа прорисовывать опции меню автоматически или с помощью обработчика onDrawltem.
1.2. Компонент TLabel
TLabel служит для отображения текста на экране. Можно изменить шрифт и цвет метки, если дважды щелкнуть на свойство Font в инспекторе объектов. Видно, что это легко сделать и во время выполнения программы, написав всего одну строчку кода.
Этот компонент доступен из модуля STDCTRLS, и находится на странице палитры компонентов Standard.
Компонент представляет собой статический текст. С помощью этого компонента на рабочей поверхности формы можно отобразить информацию, сделать пояснения и показать названия других компонентов. Но он имеет и другую важную функцию — если в составе текста TLabel есть символы-акселераторы, информация об их нажатии может передаваться от TLabel другому элементу управления.
Свойства компонента приведены в табл.1:
Таблица 1
Свойства компонента TLabel
Свойство | Описание |
(Pb) property Caption: TCaption; TCaption = string[255]; | Содержит строку с выводимым текстом. |
(Pb) property Alignment: TAlignment; | Устанавливает правило выравнивания текста — по правому, левому краю или по центру клиентской области. |
(Pb) property AutoSize: Boolean; | В случае True происходит автоматическое приведение размеров компонента к размерам текста и высоте шрифта. |
(Pb) property FocusControl: TWinControl; | Определяет оконный компонент, которому посылаются сообщения о вводе акселератора. |
(Pb) property Transparent: Boolean; | Прозрачность фона компонента. Если свойство установлено в True, то при перерисовке элемента управления не происходит закрашивание клиентской области. В противном случае — происходит закрашивание кистью bsSolid и цветом Color. |
(Pb) property WordWrap: Boolean; | Определяет возможность разрыва слов в случае, если длина выводимого текста превышает ширину компонента. |
1.3. Компонент TCanvas
Класс TCanvas представляет собой сложное образование для создания изображений. Он объединяет в себе устройство графического интерфейса CDI, инструменты (перо, кисть и шрифт, которые уже рассмотрены) и набор методов для рисования простейших геометрических фигур. Класс TCanvas не является компонентом, а входит в качестве свойства во многие визуальные компоненты: TBitmap, TComboBox,
TDBComboBox, TDBGrid, TDBListBox, TDirectoryListBox, TDrawGrid,
TFileListBox, TForm, Tlmage, TListBox, TOutline, TPaintBox,
TPrinter, TStringGrid.
На канве можно представить наличие невидимого курсора, который определяет текущее положение карандаша. Для ряда случаев рисование тех или иных примитивов (например, линии) начинается с текущего положения этого курсора. Имеются средства установки курсора, в заданное положение. При выполнении некоторых операций курсор меняет свое положение.
Основные свойства класса TCanvas представлены в табл. 3.
Компонент TStatusBar (Строка состояния) удобно использовать для отображения различной информации, полезной при выполнении программы. Строка состояния может иметь одну или несколько панелей для вывода текстовой информации.
Возможность поддержки строкой состояния нескольких панелей определяет свойство SimplePanel типа Boolean. Если свойство имеет значение True, то строка состояния имеет только одну панель, и выводимый на ней текст можно задать через свойство SimpleText типа String. Если свойство SimplePanel имеет значение False (по умолчанию), то строка состояния имеет несколько панелей, и текст каждой из них устанавливается с помощью свойства Text типа String каждой панели.
Таблица 3.Свойства класса TCanvas
Свойство SizeGrip по умолчанию принимает значение True и лучше его оставлять в этом состоянии, тогда при изменении размеров формы будет изменяться и размер строки состояния.
Компонент TTimer (таймер) служит для отсчета интервалов реального времени. Его свойство interval определяет интервал времени в миллисекундах, который должен пройти от включения таймера до наступления события onTimer. Таймер включается при установке значения True в его свойство Enabled. Раз включенный таймер все время будет возбуждать события onTimer до тех пор, пока его свойство Enabled не примет значения False.
Глава 2. Алгоритм и способы решения задачи
2.1. Постановка задачи
Разработать приложение «Сапер», которое представляет собой логическую игру, основной целью которой является нахождения всех спрятанных бомб на минном поле. Ваша задача открыть все ячейки поля, не содержащие бомб, заблокировав(пометив) при этом ячейки, в которых расположены бомбы.
Поле игры задано в виде двухмерного массива. В этом массиве расположены ячейки. Изначально они все закрыты. Ячейки могут быть пустые, с цифрами и с бомбами. Для каждой такой ячейки мы задаем класс. При нажатии левой клавиши мыши открывается ячейка, при нажатии правой кнопки, выставляется флажок, при этом левой кнопкой мыши вы уже не можете нажать на заблокированную ячейку, но правой кнопкой можно снять пометку флажка. Ячейка с цифрой обозначает то, сколько мин находится в округе этой ячейки. При первом нажатии кнопки мыши на ячейку не может открыться ячейка с бомбой.
Игра считается проигранной, если вы открыли ячейку с бомбой.
Игра считается выигранной, если на игровом поле все ячейки с бомбами отмечены и все остальные ячейки - открыты.
Игра затягивает пользователя, прежде всего популярностью близкой игры «Пятнашки», которая не так давно была очень популярна.
Данная программа должна работать автономно под управлением операционных систем Windows 95, Windows 98, Windows ME, NT 4.0, Windows 2000, Windows XP.
2.2. Алгоритм реализации игровой программы
Запуск программы осуществляется следующим образом: необходимо открыть папку, содержащую данную игру, и найти исполняемый файл Sapper.exe. На этом файле следует выполнить двойной щелчок левой клавишей манипулятора мышь.
Проект программы состоит из файла проекта, содержащего необходимые конструкции для исполнения, и модуля Sapper.
Модуль Sapper является основным модулем проекта, содержащим все необходимые для работы программы процедуры.
После запуска программы на экран выводится основная форма Form1 (рис.2), на которой расположены следующие объекты:
1. Главное меню
Рис.2 Вид программы после запуска
Игра, т. е. работа программы начинается сразу после того, как выбираешь из меню «Игра» подменю «Старт» (рис.3). Автоматически устанавливается размер формы равный размеру поля. Отображается поле (ShowPole). Процедура ShowPole выводит изображение поля последовательно, клетка за клеткой. Вывод изображения отдельной клетки выполняет процедура Kletka. Процедура Kletka используется для вывода изображения поля в начале игры, во время игры и в ее конце. В начале игры (значение параметра status = 0) процедура выводит только контур клетки, во время игры — количество мин в соседних клетках или флажок, а в конце отображает исходное состояние клетки и действия пользователя. Информацию о фазе игры процедура Kletka получает через параметр status.
Рис.3 Вид программы после нажатия меню «Игра»
Во время игры программа воспринимает нажатия кнопок мыши. Основную работу выполняет процедура обработки события onMouseDown. Сначала процедура преобразует координаты точки, в которой игрок нажал кнопку мыши, в координаты клетки игрового поля. Затем делает необходимые изменения в массиве Pole и, если нажата правая кнопка, рисует в клетке флажок. Если нажата левая кнопка в клетке, в которой нет мины, то эта клетка открывается, на экран выводится ее содержимое. Если нажата левая кнопка в клетке, в которой есть мина, то вызывается процедура showPole, которая показывает все мины, в том числе и те, которые игрок не успел найти (см. рис.4).
Когда заканчивается игра на панели выводится информация о количестве оставшихся мин, ненайденных мин и времени(см. рис.4).
Рис. 4 Окончание игры
Глава 3. Разработка программы
3.1. Описание пользовательского интерфейса
Меню в приложении создано с помощью компонента TMainMenu описанного в первой главе. Оно состоит из:
Игра – Старт – начать новую игру не зависимо собрана ли картинка.
Игра – Выход – выход из программы.
Помощь – О программе – Выводится короткая информация о программе (Рис.5).
Рис. 5. «О программе»
3.2. Описание функций используемых в программе
Функция Random:
Функция Random генерирует случайные числа. Это могут быть числа с плавающей запятой числами в диапазоне:
0 <= Number <1.0
или целые числа в диапазоне:
0 <= Number
Delphi использует генератор псевдослучайных чисел, который, каждый раз, при выполнении программы возвращает одну и ту же последовательность значений (232).
Чтобы избегать этой предсказуемости, используйте процедуру Randomize. Она в качестве начального псевдослучайного значения устанавливает текущее время.
Процедура ShowPole:
Процедура showPole выводит изображение поля последовательно, клетка за клеткой.
Функция MessageDlg:
Функция MessageDlg используется для отображения сообщений пользователю. Эти сообщения могут быть информационными, предупреждающими или что бы то ни было. Даётся полный свободный выбор кнопок, которые пользователь может нажать, чтобы подтвердить диалог.
Например, пользователю можно показать сообщение об ошибках, и дан выбор прерывания, повтора или отмены ошибочного процесса.
Значение DialogType может иметь одно из следующих перечисленных значений:
mtWarning - Отображает символ восклицания
mtError - Отображает красный "Х"
mtInformation - Отображает "i" в круге
mtConfirmation - Отображает знак вопроса
mtCustom - Отображает только сообщение
Значение Buttons может быть одним из следующих перечисленных значений:
mbYes - Отображает кнопку "Yes"
mbNo - Отображает кнопку "No"
mbOK - Отображает кнопку "OK"
mbCancel - Отображает кнопку "Cancel"
mbAbort - Отображает кнопку "Abort"
mbRetry - Отображает кнопку "Retry"
mbIgnore - Отображает кнопку "Ignore"
mbAll - Отображает кнопку "All"
mbNoToAll - Отображает кнопку "No to all"
mbYesToAll - Отображает кнопку "Yes to all"
mbHelp - Отображает кнопку "Help"
Эти значения задаются в квадратных скобках разделённых запятой.
Delphi обеспечивает множество предопределенных комбинаций кнопок:
mbYesNoCancel = [mbYes, mbNO, mbCancel]
mbYesAllNoAllCancel = [mbYes, mbYesToAll, mbNo, mbNoToAll, mbCancel]
mbOKCancel = [mbOK, mbCancel]
mbAbortRetryCancel = [mbAbort, mbRetry, mbCancel]
mbAbortIgnore = [mbAbort, mbIgnore]
Теперь, кажется, что в Delphi сделали конструкторскую недоработку при установке возвращаемого значения диалогового окна. Вместо того, чтобы определить перечисляемое значение нажатой кнопки, используется полностью различный набор перечисляемых имён:
mrYes = 6
mrNo = 7
mrOK = 1
mrCancel = 2
mrAbort = 3
mrRetry = 4
mrIgnore = 5
mrAll = 8
mrNoToAll = 9
mrYesToAll = 10
Значения получают числовые значения этих перечислений, данных в числовом порядке, которые определены как эквивалентные mb. Эти значения определены в модуле Controls, а не в модуле Dialogs.
Процедура ShowMessage:
Процедура ShowMessage выводит простое диалоговое окно на экране с кнопкой ОК, содержащее строку Text.
Она используется, чтобы сообщить пользователю какую-либо информацию - без необходимости пользователю принимать решение.
Символы возврата каретки и переноса строки (#13#10) в переменную Text служат для показа многострочного сообщения (Приложение 1).
Заключение
Разработка собственных приложений в настоящее время вызывает интерес у многих людей, чьи умения в сфере разработки позволяют осуществить поставленную задачу. Главная задача игрового приложения заставить пользователя отвлечься от проблем повседневных, т.е. развлечься, что, собственно, является задачей всех игр.
В результате выполнения курсовой работы в среде программирования Delphi была смоделирована игра под названием «Сапер». Игра содержит меню, используя которое можно начать новую игру, либо закончить текущую.
Во время разработки приложения были изучены компонент интегрированной среде программирования Delphi.
Также в данной курсовой работе рассматриваются аспекты программирования игр с использованием визуальных компонентов, и приводится описание компонентов, используемых при реализации практической части курсовой работы. Во второй главе приведены этапы разработки программы, такие как постановка задачи, алгоритм реализации и описание пользовательского интерфейса.
Данный проект может с большим успехом использоваться на уроках информатики в школе, в качестве примера программы, разработанной средствами Delphi, а также в качестве одной из игр, развивающих логическое мышление.
Список использованной литературы:
1. Архангельский А. Я. Приемы программирования в Delphi. Бином-Пресс, 2007. 344 с.
2. Глушаков С. В., Клевцов А. Л. Delphi 2007. АСТ, АСТ Москва, Хранитель, 2008. 325 с.
3. Культин Н.М. Программирование в Turbo Pascal 7.0 и Delphi. БХВ-Петербург, 2007. 167 с.
4. Любавин С. А. Turbo Delphi для новичков и не только. НТ Пресс, 2008. 98 с.
5. Молочков В.П., Карпинский В.Б. От Delphi 7 к Delphi 2006 для начинающих. 2007. 324 с.
6. Осипов Д.В. Графика в проектах Delphi. Символ-Плюс, 2008. 459 с.
7. Фленов М.Е. Библия Delphi (2-е издание). БХВ-Петербург, 2008. 453 с.
8. Чеснокова О.В. Delphi 2007. Алгоритмы и программы. НТ Пресс, 2008. 178 с.
9. Чиртик А., Борисок В, Корвель Ю. Delphi. Трюки и эффекты Питер,2007. 196 с.
10. http://www.sdteam.com/?tid=331
11. http://www.delphisources.ru/
12. http://www.delphibasics.ru/
13. http://www.delphisources.ru/
14. http://program.rin.ru/
15. http://www.delphilab.ru/
Приложение
Листинг программы
unit Sapper;
interface
uses
Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms,
Dialogs, ImgList, Menus, StdCtrls, ComCtrls, MPlayer,MMsystem, ExtCtrls;
type
TForm1 = class(TForm)
MainMenu1: TMainMenu;
N1: TMenuItem;
N2: TMenuItem;
N6: TMenuItem;
N7: TMenuItem;
N9: TMenuItem;
StatusBar1: TStatusBar;
Timer1: TTimer;
StaticText1: TStaticText;
StaticText2: TStaticText;
Timer2: TTimer;
Timer3: TTimer;
procedure N7Click(Sender: TObject);
procedure N9Click(Sender: TObject);
procedure FormCreate(Sender: TObject);
procedure N2Click(Sender: TObject);
procedure Timer1Timer(Sender: TObject);
procedure Form1Paint(Sender: TObject);
procedure Timer2Timer(Sender: TObject);
procedure FormMouseUp(Sender: TObject; Button: TMouseButton;
Shift: TShiftState; X, Y: Integer);
procedure Timer3Timer(Sender: TObject);
private
{ Private declarations }
public
{ Public declarations }
end;
Option = record
kletka_x:integer;{количество клеток по вертикали и горизонтали}
kletka_y:integer;
{количество клеток по вертикали и горизонтали}
mina:integer;{количество мин}
sound:boolean;{наличие звука}
end;
var
Form1: TForm1;
Canvas:TCanvas;
TX,TY,jx,jy,kx,ky,w,w77,w44:
Z_X,Z_Y,Z_M:Integer; {Z_X - количество строк, Z_Y - количество столбцов}
sec, min: integer; {время игры}
h_time:string[7];
Z_S:Boolean;
Z_M_Na: integer;{количество найденных мин}
Flags: integer; {количество установленных флагов}
status: integer; {статус игры - 0 - начало; 1 - игра; 2- результат}
Pole: array [0..12, 0..9] of Integer;{массив представляет игровое поле}
{значение: 0-8 => кол-во мин в соседних клетках, 9 => мина,
100-109=> клетка открыта, 200-209 => поставлен флаг}
procedure NewGame();
procedure ShowPole(Canvas: TCanvas; status: integer);
procedure Kletka(Canvas: TCanvas; R,C,Status: integer);
Procedure Mina(Canvas : TCanvas; x, y : integer);
Procedure Flag( Canvas : TCanvas; x, y : integer);
Procedure Open( R, C : integer);
procedure Gen_Graphy();