Разработка программы, реализующей игру Сапер

Delphi как типизированный объектно-ориентированный язык программирования. Словесный алгоритм программы игры, ее главная форма. Основное окно, структура и настройки меню. Описание процедур. Справочная информация. Листинг и результат работы программы.

Рубрика Программирование, компьютеры и кибернетика
Вид курсовая работа
Язык русский
Дата добавления 12.05.2012
Размер файла 658,7 K

Отправить свою хорошую работу в базу знаний просто. Используйте форму, расположенную ниже

Студенты, аспиранты, молодые ученые, использующие базу знаний в своей учебе и работе, будут вам очень благодарны.

Размещено на http://www.allbest.ru/

1. Общие сведения

Delphi -- язык программирования, который используется в одноимённой среде разработки. Сначала язык назывался Object Pascal. Начиная со среды разработки Delphi 7.0, в официальных документах Borland стала использовать название Delphi для обозначения языка Object Pascal.

В последнее время резко возрос интерес к программированию. Это связано с развитием и внедрением в повседневную жизнь информационно-коммуникационных технологий. Если человек имеет дело с компьютером, то рано или поздно у него возникает желание, а иногда и необходимость, программировать.

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

Несколько лет назад рядовому программисту оставалось только мечтать о создании собственных программ, работающих в среде Windows, т. к. единственным средством разработки был Borland C++ for Windows, явно ориентированный на профессионалов, обладающих серьезными знаниями и опытом.

Бурное развитие вычислительной техники, потребность в эффективных средствах разработки программного обеспечения привели к появлению систем программирования, ориентированных на так называемую "быструю разработку", среди которых можно выделить Borland Delphi и Microsoft Visual Basic. В основе систем быстрой разработки (RAD-систем, Rapid Application Development -- среда быстрой разработки приложений) лежит технология визуального проектирования и событийного программирования, суть которой заключается в том, что среда разработки берет на себя большую часть рутинной работы, оставляя программисту работу по конструированию диалоговых окон и функций обработки событий. Производительность программиста при использовании RAD-систем - фантастическая!

Delphi -- это среда быстрой разработки, в которой в качестве языка программирования используется язык Delphi. Язык Delphi -- строго типизированный объектно-ориентированный язык, в основе которого лежит хорошо знакомый программистам Object Pascal.

В настоящее время программистам стала доступна очередная версия пакета Delphi - Borland Delphi 7 Studio. Как и предыдущие версии, Borland Delphi 7 Studio позволяет создавать самые различные программы: от простейших однооконных приложений до программ управления распределенными базами. В состав пакета включены разнообразные утилиты, обеспечивающие работу с базами данных, XML-документами, создание справочной системы, решение других задач. Отличительной особенностью седьмой версии является поддержка технологии .NET.

2. Словесный алгоритм программы

2.1 Представление данных

В программе игровое поле представлено массивом N+2 на M+2, где N xM -- размер игрового поля. Элементы массива с номерами строк от 1 до N и номерами столбцов от 1 до М соответствуют клеткам игрового поля (рис. 1), первые и последние столбцы и строки соответствуют границе игрового поля.

Рис. 1. Клетке игрового поля соответствует элемент массива.

В начале игры каждый элемент массива, соответствующий клеткам игрового поля, может содержать число от 0 до 9. Ноль соответствует пустой клетке, рядом с которой нет мин. Клеткам, в которых нет мин, но рядом с которыми мины есть, соответствуют числа от 1 до 8. Элементы массива, соответствующие клеткам, в которых находятся мины, имеют значение 9.

Элементы массива, соответствующие границе поля, содержат -3.

В качестве примера на рис. 2 изображен массив, соответствующий состоянию поля в начале игры.

Рис. 2. Массив в начале игры.

В процессе игры состояние игрового поля меняется (игрок открывает клетки и ставит флажки) и, соответственно, меняются значения элементов массива. Если игрок поставил в клетку флажок, то значение соответствующего элемента массива увеличивается на 100. Например, если флажок поставлен правильно в клетку, в которой есть мина, то значение соответствующего элемента массива станет 109. Если флажок поставлен ошибочно, например, в пустую клетку, элемент массива будет содержать число 100. Если игрок открыл клетку, то значение элемента массива увеличивается на 200. Такой способ кодирования позволяет сохранить информацию о исходном состоянии клетки.

2.2 Форма приложения

Главная (стартовая) форма игры Сапер приведена на рис. 3.

Рис. 3. Главная форма программы Сапер.

Следует обратить внимание, что размер формы не соответствует размеру игрового поля. Нужный размер формы будет установлен во время работы программы. Делает это процедура обработки события OnFormActivate, которая на основе информации о размере игрового поля (количестве клеток по вертикали и горизонтали) и клеток устанавливает значение свойств ClientHeight и ClientWidth, определяющих размер клиентской области главного окна программы.

Основное окно программы содержит компонент MainMenu1, который представляет собой главное меню программы. Значок компонента MainMenu находится на вкладке Standard (рис. 4).

Рис. 4. Компонент MainMenu.

Значок компонента MainMenu можно поместить в любое место формы, так как во время работы программы он не виден. Пункты меню появляются в верхней части формы в результате настройки меню. Для настройки меню используется редактор меню, который запускается двойным щелчком левой кнопкой мыши на значке компонента или выбором из контекстного меню компонента команды Menu Designer. В начале работы над новым меню, сразу после добавления компонента к форме, в окне редактора находится один-единственный прямоугольник -- заготовка пункта меню. Чтобы превратить эту заготовку в меню, нужно в окне Object Inspector в поле Caption ввести название меню.

Если перед какой-либо буквой в названии меню ввести знак &, то во время работы программы можно будет активизировать этот пункт меню путем нажатия комбинации клавиши <Аlt> и клавиши, соответствующей символу, перед которым стоит знак &. В названии меню эта буква будет подчеркнута.

Чтобы добавить в главное меню элемент, необходимо в окне редактора меню выбрать последний (пустой) элемент меню и ввести название нового пункта.

Чтобы добавить в меню команду, необходимо выбрать пункт меню, в который нужно добавить команду, переместить указатель активного элемента меню в конец списка команд меню и ввести название команды.

На рис. 5 приведено окно редактора меню, в котором находится меню программы Сапер.

Рис. 5. Структура меню программы Сапер.

После того как будет сформирована структура меню, нужно, используя окно Object Inspector, выполнить настройку элементов меню (выбрать настраиваемый пункт меню можно в окне формы приложения или из списка объектов в верхней части окна Object Inspector).

Таблица 1. Свойства объекта TMenuItem

Свойство

Определяет

Name

Имя элемента меню. Используется для доступа к свойствам

Caption

Название меню или команды

Bitmap

Значок, который отображается слева от названия элемента меню

Enabled

Признак доступности элемента меню. Если значение свойства равно False, то элемент меню недоступен, при этом название меню отображается серым цветом

Каждый элемент меню (пункты и команды) -- это объект типа TMenuitem. Свойства объектов TMenuitem (табл.1) определяют вид меню во время работы программы.

При выборе во время работы программы элемента меню происходит событие Click. Чтобы создать процедуру обработки этого события, нужно в окне формы выбрать пункт меню и щелкнуть левой кнопкой мыши - Delphi создаст шаблон процедуры обработки этого события. В качестве примера ниже приведена процедура обработки события, которое возникает в результате выбора из меню? команды Справка. N3 -- это имя элемента меню, соответствующего этой команде.

3. Описание процедур

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

3.1 Процедура NewGame

// новая игра -- генерирует новое поле

procedure NewGame ();

row,col : integer; // координаты клетки (индексы массива)

n : integer; // количество поставленных мин

k : integer; // кол-во мин в соседних клетках

begin

// Очистим эл-ты массива, соответствующие клеткам

// игрового поля

for row :=1 to MR do

for col :=1 to MC do Pole[row,col] := 0;

// расставим мины

Randomize О; // инициализация ГСЧ (генератор случайных чисел)

n := 0; // кол-во мин

repeat

row := Random(MR) + 1;

col := Random(MC) + 1;

if (Pole[row,col] <> 9) then begin

Pole[row,col] := 9; n := n+1;

end;

until (n = NM);

// для каждой клетки вычислим // кол-во мин в соседних клетках

for row := 1 to MR do

for col := 1 to MC do

if (Pole[row,col] <> 9) then

begin k :=0 ;

if Pole[row-l,col-l] = 9 then k = k + 1;

if Pole[row-1,col] =' 9 then k = k + 1;

if Pole[row-1,col+1] = 9 then k = k + 1;

if Pole[row,col-1] = 9 then k = k + 1;

if Pole[row,col+1] = 9 then k = k + 1;

if Pole[row+1,col-1] = 9 then k = k + 1;

if Pole[row+1,col] = 9 then k = k + 1;

if Pole[row+l,col+l] = 9 then k := k + 1;

Pole[row,col] := k;

end;

status := 0; // начало игры

nMin := 0; // нет обнаруженных мин

nFlag := 0; // нет поставленных флагов

end;

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

3.2 Процедура ShowPole

// Показывает поле

Procedure ShowPoie(Canvas : TCanvas; status : integer);

var

row,col : integer;

begin

for row := 1 to MR do

for col := 1 to MC do

Kletka(Canvas, row, col, status);

end;

Процедура showPole выводит изображение поля последовательно, клетка за клеткой. Вывод изображения отдельной клетки выполняет процедура Kletka. Процедура Kletka используется для вывода изображения поля в начале игры, во время игры и в ее конце. В начале игры (значение параметра status = 0) процедура выводит только контур клетки, во время игры -- количество мин в соседних клетках или флажок, а в конце отображает исходное состояние клетки и действия пользователя. Информацию о фазе игры процедура Kletka получает через параметр status.

3.3 Процедура Kletka

// выводит на экран изображение клетки

Procedure Kletka(Canvas : TCanvas;

row, col, status : integer);

var

x,y : integer; // координаты области вывода

begin

x := (col-1)* W + I; у := (row-1)* H + 1;

if status = 0 then begin

Canvas.Brush.Color := clLtGray;

Canvas.Rectangle(x-1,y-1,x+W,y+H);

exit;

end;

if Pole[row,col] < 100 then

begin

Canvas.Brush.Color := clLtGray; // неоткрытые -- серые

Canvas.Rectangle(x-1,y-l,x+W,y+H);

// если игра завершена (status = 2), то показать мины

if (status = 2) and (Pole[row,col] = 9)

then Mina(Canvas, x, y) ; exit; end;

// открытая клетка

Canvas.Brush.Color := clWhite; // открытые белые

Canvas.Rectangle(x-1,y-l,x+W,y+H);

if (Pole[row,col] = 100)

then exit; // клетка открыта, но она пустая

if (Pole[row,col] >= 101)

and (Pole[row,col] <= 108)

then begin // в соседних клетках есть мины

Canvas.Font.Size := 14;

Canvas.Font.Color := clBlue;

Canvas.TextOut(x+3,y+2,IntToStr(Pole[row,col] -100));

exit;

end;

if (Pole[row,col] >= 200)

then Flag(Canvas, x, y);

if (Pole[row,col] = 109)

then // на этой мине подорвались!

begin

Canvas.Brush.Color := clRed;

Canvas.Rectangle(x-1,y-1,x+W,y+H);

end;

if ((Pole[row,col] mod 10) = 9)

and (status = 2) then

Mina(Canvas, x, y);

end;

Во время игры программа воспринимает нажатия кнопок мыши и, в соответствии с правилами игры, открывает клетки или ставит в клетки флажки. Основную работу выполняет процедура обработки события onMouseDown. Сначала процедура преобразует координаты точки, в которой игрок нажал кнопку мыши, в координаты клетки игрового поля. Затем делает необходимые изменения в массиве Pole и, если нажата правая кнопка, рисует в клетке флажок. Если нажата левая кнопка в клетке, в которой нет мины, то эта клетка открывается, на экран выводится ее содержимое. Если нажата левая кнопка в клетке, в которой есть мина, то вызывается процедура showPole, которая показывает все мины, в том числе и те, которые игрок не успел найти.

3.4 Процедура обработки события OnMouseDown на поверхности

игрового поля

// нажатие кнопки мыши на игровом поле

procedure TForm1.Form1MouseDown(Sender: TObject;

Button: TMouseButton;

Shift: TShiftState; X, Y: Integer);

var

row, col : integer;

begin

if status = 2 // игра завершена

then exit;

if status = 0 then // первый щелчок

status := 1;

// преобразуем координаты мыши в индексы

// клетки поля

row := Trunc(y/H) + 1;

col := Trunc(x/W) + 1;

if Button = mbLeft then

begin

if Pole[row,col] = 9 then

begin // открыта клетка, в которой есть мина

Pole[row,col] := Pole[row,col] + 100;

status := 2; // игра закончена

ShowPole(Form1.Canvas, status);

end else

if Pole[row,col] < 9 then

Open(row,col);

end else

if Button = mbRight then

if Pole[row,col] > 200 then begin

// уберем флаг и закроем клетку

nFlag := nFlag -- 1;

Pole[row,col] := Pole[row,col]-200;

// уберем флаг

x := (col-D* W + 1; у := (row-1)* H + 1;

Canvas.Brush.Color := clLtGray;

Canvas.Rectangle(x-1,y-1,x+W,y+H);

end else

begin // поставить в клетку флаг

nFlag := nFlag + 1; if Pole[row,col] = 9

then nMin := nMin + 1;

Pole[row,col]:=Pole[row,col]+200;

// поставили флаг

if (nMin = NM) and (nFlag = NM) then begin

status := 2;

// игра закончена

ShowPole(Form1.Canvas, status);

end

else Kletka(Form1.Canvas, row, col, status);

end;

end;

3.5 Справочная информация

При выборе из меню? команды Справка появляется справочная информация -- правила игры (рис. 6).

Рис. 6. Окно справочной информации.

Примечание

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

3.6 Процедура, обеспечивающая вывод справочной информации

// выбор из меню ? команды Справка

procedure TForm1.N3Click(Sender: TObject);

HelpFile : string; // файл справки

HelpTopic : string; // раздел справки

pwHelpFile : PWideChar;

// файл справки (указатель на строку WideChar)

pwHelpTopic : PWideChar;

// раздел (указатель на строку WideChar)

begin

HelpFile := 'saper.chm';

HelpTopic := 'saper_02.htm';

// выделить память для

WideChar-строк GetMem(pwHelpFile, Length(HelpFile) * 2);

GetMem(pwHelpTopic, Length(HelpTopic)*2);

// преобразовать ANSI-строку в WideString-строку

pwHelpFile := StringToWideChar(HelpFile,

pwHelpFile, MAX_PATH*2);

pwHelpTopic := StringToWideChar(HelpTopic,

pwHelpTopic,32);

// вывести справочную информацию

Form1.Hhopen1.OpenHelp(pwHelpFile,

pwHelpTopic);

end;

3.7 Информация О программе

При выборе из меню ? команды О программе на экране должно появиться одноименное окно (рис. 7).

Рис. 7. Окно О программе.

Чтобы программа во время своей работы могла вывести на экран окно, отличное от главного (стартового), нужно создать это окно. Делается это выбором из меню File команды New form. В результате выполнения команды New form в проект добавляется новая форма и соответствующим ей модуль.

Вид формы AboutForm после добавления необходимых компонентов приведен на рис. 8, значения ее свойств -- в табл. 2.

Рис. 8. Форма О программе.

Таблица 2. Значения свойств формы О программе

Свойство

Значение

Name

AboutForm

Caption

0 программе

BorderStyle

BsSingle

Borderlcons . biSystemMenu

False

Borderlcons .biMininize

False

Borderlcons . biMaximize

False

Вывод окна О программе выполняет процедура обработки события click, которое происходит в результате выбора из меню ? команды О программе.

Непосредственно вывод окна выполняет метод showModal, который выводит окно как модальный диалог.

3.8.Процедура обработки события click, выполняющая вывод окна О

программе

// выбор из меню ? команды О программе

procedure TForm1.N4Click(Sender: TObject);

begin

AboutForm.Top :=

Trunc(Forml.Top + Forml.Height/2 - AboutForm.Height/2);

AboutForm.Left :=

Trunc (Form1.Left +Form1 .Width/2

- AboutForm. Width/2 }; AboutForm. ShowModal;

end;

Примечание

Модальный диалог перехватывает все события, адресованные другим окнам приложения. Пока модальный диалог находится на экране, другие окна приложения не реагируют на действия пользователя. Для продолжения работы с приложением нужно закрыть модальный диалог. В большинстве программ в том числе и в Delphi, информация о программе реализована как модальный диалог.

Если не предпринимать никаких усилий, то окно О программе появится в той точке экрана, в которой находилась форма во время ее разработки вместе с тем, можно "привязать" это окно к главному окну программы так, чтобы оно появлялось в центре главного окна. Привязка осуществляется на основании информации о текущем положении главного окна программы и размере окна О программе. Окно О программе должно быть удалено с экрана в результате щелчка на кнопке Ok. Процедура обработки этого события приведена ниже.

procedure TAboutForm.ButtonlClick (Sender: TObject) ;

begin

ModalResult := mrOk;

end;

4. Листинг программы

//модуль главной формы

unit saper_1;

interface

uses

Windows, Messages, SysUtils, Classes,

Graphics, Controls, Forms, Dialogs,

Menus, StdCtrls, OleCtrls, HHOPENLib_TLB;

type

TForm1 = class(TForm)

MainMenu1: TMainMenu;

N1: TMenuItem;

N2: TMenuItem;

N3: TMenuItem;

N4: TMenuItem;

Hhopen1: THhopen;

procedure Form1Create(Sender: TObject);

procedure Form1Paint(Sender: TObject);

procedure Form1MouseDown(Sender: TObject; Button: TMouseButton;

Shift: TShiftState; X, Y: Integer);

procedure N1Click(Sender: TObject);

procedure N4Click(Sender: TObject);

procedure N3Click(Sender: TObject);

private

{ Private declarations }

public

{ Public declarations }

end;

var

Form1: TForm1;

implementation

uses saper_2;

{$R *.DFM}

const

MR = 10; // кол-во клеток по вертикали

MC = 10; // кол-во клеток по горизонтали

NM = 10; // кол-во мин

W = 40; // ширина клетки поля

H = 40; // высота клетки поля

var

Pole: array[0..MR+1, 0.. MC+1] of integer; // минное поле

// значение элемента массива:

// 0..8 - количество мин в соседних клетках

// 9 - в клетке мина

// 100..109 - клетка открыта

// 200..209 - в клетку поставлен флаг

nMin : integer; // кол-во найденных мин

nFlag : integer; // кол-во поставленных флагов

status : integer; // 0 - начало игры; 1- игра; 2 -результат

Procedure NewGame(); forward;

// генерирует новое поле

Procedure ShowPole(Canvas : TCanvas; status : integer); forward;// Показывает поле

Procedure Kletka(Canvas : TCanvas; row, col, status : integer); forward; // выводит содержимое клетки

Procedure Open( row, col : integer); forward;// открывает текущую и все соседние клетки, в которых нет мин

Procedure Mina(Canvas : TCanvas; x, y : integer); forward; // Рисует мину

Procedure Flag( Canvas : TCanvas; x, y : integer); forward;// Рисует флаг

// выводит на экран содержимое клетки

Procedure Kletka(Canvas : TCanvas; row, col, status : integer);

var

x,y : integer; // координаты области вывода

begin

x := (col-1)* W + 1;

y := (row-1)* H + 1;

if status = 0 then

begin

Canvas.Brush.Color := clLtGray;

Canvas.Rectangle(x-1,y-1,x+W,y+H);

exit;

end;

if Pole[row,col] < 100 then

begin

Canvas.Brush.Color := clLtGray; // не открытые - серые

Canvas.Rectangle(x-1,y-1,x+W,y+H);

// если игра завершена (status = 2), то показать мины

if (status = 2) and (Pole[row,col] = 9)

then Mina(Canvas, x, y);

exit;

end;

// открываем клетку

Canvas.Brush.Color := clWhite; // открытые белые

Canvas.Rectangle(x-1,y-1,x+W,y+H);

if ( Pole[row,col] = 100 )

then exit; // клетка открыта, но она пустая

if ( Pole[row,col] >= 101) and (Pole[row,col] <= 108 ) then

begin

Canvas.Font.Size := 14;

Canvas.Font.Color := clBlue;

Canvas.TextOut(x+3,y+2,IntToStr(Pole[row,col] -100 ));

exit;

end;

if ( Pole[row,col] >= 200 ) then

Flag(Canvas, x, y);

if (Pole[row,col] = 109 ) then // на этой мине подорвались!

begin

Canvas.Brush.Color := clRed;

Canvas.Rectangle(x-1,y-1,x+W,y+H);

end;

if ( (Pole[row,col] mod 10) = 9) and (status = 2) then

Mina(Canvas, x, y);

end;

// Показывает поле

Procedure ShowPole(Canvas : TCanvas; status : integer);

var

row,col : integer;

begin

for row := 1 to MR do

for col := 1 to MC do

Kletka(Canvas, row, col, status);

end;

// рекурсивная функция открывает текущую и все соседние

// клетки, в которых нет мин

Procedure Open( row, col : integer);

begin

if Pole[row,col] = 0 then

begin

Pole[row,col] := 100;

Kletka(Form1.Canvas, row,col, 1);

Open(row,col-1);

Open(row-1,col);

Open(row,col+1);

Open(row+1,col);

//примыкающие диагонально

Open(row-1,col-1);

Open(row-1,col+1);

Open(row+1,col-1);

Open(row+1,col+1);

end

else

if (Pole[row,col] < 100) and ( Pole[row,col] <> -3 ) then

begin

Pole[row,col] := Pole[row,col] + 100;

Kletka(Form1.Canvas, row, col, 1);

end;

end;

// новая игра - генерирует новое поле

procedure NewGame();

var

row,col : integer; // координаты клетки

n : integer; // количество поставленных мин

k : integer; // кол-во мин в соседних клетках

begin

// Очистим эл-ты массива, соответствующие клеткам

// игрового поля.

for row :=1 to MR do

for col :=1 to MC do

Pole[row,col] := 0;

// расставим мины

Randomize(); // инициализация ГСЧ

n := 0; // кол-во мин

repeat

row := Random(MR) + 1;

col := Random(MC) + 1;

if ( Pole[row,col] <> 9) then

begin

Pole[row,col] := 9;

n := n+1;

end;

until ( n = NM );

// для каждой клетки вычислим

// кол-во мин в соседних клетках

for row := 1 to MR do

for col := 1 to MC do

if ( Pole[row,col] <> 9 ) then

begin

k :=0 ;

if Pole[row-1,col-1] = 9 then k := k + 1;

if Pole[row-1,col] = 9 then k := k + 1;

if Pole[row-1,col+1] = 9 then k := k + 1;

if Pole[row,col-1] = 9 then k := k + 1;

if Pole[row,col+1] = 9 then k := k + 1;

if Pole[row+1,col-1] = 9 then k := k + 1;

if Pole[row+1,col] = 9 then k := k + 1;

if Pole[row+1,col+1] = 9 then k := k + 1;

Pole[row,col] := k;

end;

status := 0; // начало игры

nMin := 0; // нет обнаруженных мин

nFlag := 0; // нет флагов

end;

// Рисует мину

Procedure Mina(Canvas : TCanvas; x, y : integer);

begin

with Canvas do

begin

Brush.Color := clGreen;

Pen.Color := clBlack;

Rectangle(x+16,y+26,x+24,y+30);

Rectangle(x+8,y+30,x+16,y+34);

Rectangle(x+24,y+30,x+32,y+34);

Pie(x+6,y+28,x+34,y+44,x+34,y+36,x+6,y+36);

MoveTo(x+12,y+32); LineTo(x+26,y+32);

MoveTo(x+8,y+36); LineTo(x+32,y+36);

MoveTo(x+20,y+22); LineTo(x+20,y+26);

MoveTo(x+8, y+30); LineTo(x+6,y+28);

MoveTo(x+32,y+30); LineTo(x+34,y+28);

end;

end;

// Рисует флаг

Procedure Flag( Canvas : TCanvas; x, y : integer);

var

p : array [0..3] of TPoint; // координаты флажка и нижней точки древка

m : array [0..4] of TPoint; // буква М

begin

// зададим координаты точек флажка

p[0].x:=x+4; p[0].y:=y+4;

p[1].x:=x+30; p[1].y:=y+12;

p[2].x:=x+4; p[2].y:=y+20;

p[3].x:=x+4; p[3].y:=y+36; // нижняя точка древка

m[0].x:=x+8; m[0].y:=y+14;

m[1].x:=x+8; m[1].y:=y+8;

m[2].x:=x+10; m[2].y:=y+10;

m[3].x:=x+12; m[3].y:=y+8;

m[4].x:=x+12; m[4].y:=y+14;

with Canvas do

begin

// установим цвет кисти и карандаша

Brush.Color := clRed;

Pen.Color := clRed;

Polygon(p); // флажок

// древко

Pen.Color := clBlack;

MoveTo(p[0].x, p[0].y);

LineTo(p[3].x, p[3].y);

// буква М

Pen.Color := clWhite;

Polyline(m);

Pen.Color := clBlack;

end;

end;

// выбор из меню ? команды О программе

procedure TForm1.N4Click(Sender: TObject);

begin

AboutForm.Top := Trunc(Form1.Top + Form1.Height/2 - AboutForm.Height/2);

AboutForm.Left := Trunc(Form1.Left +Form1.Width/2 - AboutForm.Width/2);

AboutForm.ShowModal;

end;

procedure TForm1.Form1Create(Sender: TObject);

var

row,col : integer;

begin

// В неотображаемые эл-ты массива, которые соответствуют

// клеткам по границе игрового поля запишем число -3.

// Это значение используется функцией Open для завершения

// рекурсивного процесса открытия соседних пустых клеток.

for row :=0 to MR+1 do

for col :=0 to MC+1 do

Pole[row,col] := -3;

NewGame(); // "разбросать" мины

Form1.ClientHeight := H*MR + 1;

Form1.ClientWidth := W*MC + 1;

end;

// нажатие кнопки мыши на игровом поле

procedure TForm1.Form1MouseDown(Sender: TObject; Button: TMouseButton;

Shift: TShiftState; X, Y: Integer);

var

row, col : integer;

begin

if status = 2 // игра завершена

then exit;

if status = 0 then // первый щелчок

status := 1;

// преобразуем координаты мыши в индексы

// клетки поля

row := Trunc(y/H) + 1;

col := Trunc(x/W) + 1;

if Button = mbLeft then

begin

if Pole[row,col] = 9 then

begin // открыта клетка, в которой есть мина

Pole[row,col] := Pole[row,col] + 100;

status := 2; // игра закончена

ShowPole(Form1.Canvas, status);

end

else if Pole[row,col] < 9 then

Open(row,col);

end

else

if Button = mbRight then

if Pole[row,col] > 200 then

begin

// уберем флаг и закроем клетку

nFlag := nFlag - 1;

Pole[row,col] := Pole[row,col] - 200; // уберем флаг

x := (col-1)* W + 1;

y := (row-1)* H + 1;

Canvas.Brush.Color := clLtGray;

Canvas.Rectangle(x-1,y-1,x+W,y+H);

end

else

begin // поставить в клетку флаг

nFlag := nFlag + 1;

if Pole[row,col] = 9

then nMin := nMin + 1;

Pole[row,col] := Pole[row,col]+ 200; // поставили флаг

if (nMin = NM) and (nFlag = NM) then

begin

status := 2; // игра закончена

ShowPole(Form1.Canvas, status);

end

else Kletka(Form1.Canvas, row, col, status);

end;

end;

// Выбор меню Новая игра

procedure TForm1.N1Click(Sender: TObject);

begin

NewGame();

ShowPole(Form1.Canvas,status);

end;

// выбор из меню ? команды Справка

procedure TForm1.N3Click(Sender: TObject);

var

HelpFile : string; // файл справки

HelpTopic : string; // раздел справки

pwHelpFile : PWideChar; // файл справки (указатель на WideChar строку)

pwHelpTopic : PWideChar; // раздел (указатель на WideChar строку)

begin

HelpFile := 'saper.chm';

HelpTopic := 'saper_02.htm';

// выделить память для WideChar строк

GetMem(pwHelpFile, Length(HelpFile) * 2);

GetMem(pwHelpTopic, Length(HelpTopic)*2);

// преобразовать Ansi строку в WideString строку

pwHelpFile := StringToWideChar(HelpFile,pwHelpFile,MAX_PATH*2);

pwHelpTopic := StringToWideChar(HelpTopic,pwHelpTopic,32);

// вывести справочную информацию

Form1.Hhopen1.OpenHelp(pwHelpFile,pwHelpTopic);

end;

procedure TForm1.Form1Paint(Sender: TObject);

begin

ShowPole(Form1.Canvas, status);

end;

end.

// модуль формы О программе

unit saper 2;

interface

uses

Windows, Messages, SysUtils, Classes, Graphics, Controls,

Forms, Dialogs, StdCtrls, saper_l;

type

TAboutForm = class(TForm)

Buttonl: TButton;

Label1: TLabel;

Label2: TLabel;

procedure ButtonlClick(Sender: TObject);

private

{ Private declarations }

public

I Public declarations }

end;

var

AboutForm: TAboutForm;

implementation

{$R *.DFM}

procedure TAboutForm.ButtonlClick(Sender: TObject);

begin

ModalResult := mrOk;

end;

end.

5. Результат работы программы

Чтобы начать игру Сапер, необходимо запустить приложение saper.exe. Данное приложение аналогично игре Сапер, входящей в состав Microsoft Windows.

Пример окна программы в конце игры, после того как игрок открыл клетку, в которой находится мина, приведен на рис. 9.

Рис. 9. Окно программы Сапер.

Заключение

В данном курсовом проекте решена задача разработки программы реализующей игру Сапер, анализ результатов которой показал, что поставленная задача успешно решена. Основные характеристики программы: простота интерфейса и доступность широкому кругу пользователей.

Проблемы

Для вывода справочной информации игра Сапер использует компонент hhopen, который физически представляет собой файл hhopen.ocx.

Если компонент в системе не зарегистрирован, то в процессе запуска программы возникает ошибка (исключение).

Для того чтобы зарегистрировать компонент, надо:

скопировать файл hhopen.ocx в каталог c:\windows\system или c:\windows\system32 (если программа запускается в Microsoft Windows 2000)

зарегистрировать компонент hhopen, для чего надо из командной строки, которая становиться доступной в результате выбора команды Пуск/Выполнить, запустить системную утилиту regsrv32, указав в качестве параметра файл hhopen.ocx

delphi программа алгоритм меню листинг

Список литературы

1. Вальвачев А.Н, Сурков К.А, Сурков Д.А, Четырько Ю. М. Программирование на языке Delphi. Учебное пособие. -- 2005.

2. Культин Н.Б. Основы программирования в Delphi 7. СПБ: БХВ - Петербург 2002.

3. Архангельский А.Я. Программирование в Delphi 7 -М: ЗАО Издательство БИНОМ 2003.-768 с.

4. Кэнту М. Delphi 7: Для профессионалов

Размещено на Allbest.ru


Подобные документы

  • Описание принципа развивающей игры в слова "Виселица". Разработка программы, реализующей задачу данной игры на языке Delphi. Обоснование выбора среды программирования, листинг файла, результаты отладки и тестирования, руководство для пользователя.

    курсовая работа [572,7 K], добавлен 14.07.2012

  • Delphi - среда быстрой разработки, в которой в качестве языка программирования используется типизированный объектно-ориентированный язык Delphi. Варианты программного пакета. Особенности работы, вид экрана после запуска. Описание структуры программы.

    курсовая работа [1,3 M], добавлен 25.11.2014

  • Создание программы, реализующей игру "Линии". Среда разработки программы, описание ее общего вида. Основные алгоритмы программы. Реализация программы в среде разработки Microsoft Visual Studio 2008 на языке объектно-ориентированного программирования С++.

    курсовая работа [639,0 K], добавлен 16.03.2012

  • Особенности разработки приложений для операционной системы с помощью императивного, структурированного, объектно-ориентированного языка программирования Delphi. Формальное начало программы. Выделение конца программного блока. Листинг и описание программы.

    курсовая работа [1,2 M], добавлен 04.08.2014

  • Разработка программы проверки знаний для тестирования студентов по программированию с кодом на языке Delphi. Проектирование визуального интерфейса и словесный алгоритм работы программы. Алгоритмы разработанных процедур и функций, инструкция пользователя.

    курсовая работа [506,5 K], добавлен 21.02.2011

  • Язык Delphi как строго типизированный объектно-ориентированный язык, в основе которого лежит хорошо знакомый программистам Object Pascal, его главные особенности. Стадии создания автоматизированной системы. Листинг программы, разработка интерфейса.

    курсовая работа [933,9 K], добавлен 08.12.2011

  • Разработка программы, моделирующей игру "Кости". Использование в программе генератора псевдослучайных чисел. Схема иерархии модулей. Описание работы программы. Регистрация игрока, окно программы. Определение языка программирования, основные операторы.

    курсовая работа [3,2 M], добавлен 29.07.2010

  • Язык Паскаль - процедурно-ориентированный язык высокого уровня, его основные достоинства. Разработка программ для решения задач. Выбор метода обработки информации. Форма представления исходных данных. Разработка алгоритма, его описание, листинг программы.

    курсовая работа [3,6 M], добавлен 17.02.2013

  • Приемы программирования в Delphi. Алгоритм поиска альфа-бета отсечения, преимущества. Описание программного средства. Разработка программы, реализующая алгоритм игры "реверси". Руководство пользователя. Листинг программы. Навыки реализации алгоритмов.

    курсовая работа [357,1 K], добавлен 28.02.2011

  • Предмет объектно-ориентированного программирования и особенности его применения в средах Паскаль, Ада, С++ и Delphi. Интегрированная среда разработки Delphi: общее описание и назначение основных команд меню. Процедуры и функции программы Delphi.

    курсовая работа [40,8 K], добавлен 15.07.2009

Работы в архивах красиво оформлены согласно требованиям ВУЗов и содержат рисунки, диаграммы, формулы и т.д.
PPT, PPTX и PDF-файлы представлены только в архивах.
Рекомендуем скачать работу.