Разработка игры "Палатки"
Возможности интегрированной среды разработки приложений Delphi. Основные алгоритмические конструкции языка программирования Pascal. Описание программы, ее листинг и блок-схема. Демонстрация работы приложения-игры "Палатки", работающего под ОС Windows.
Рубрика | Программирование, компьютеры и кибернетика |
Вид | курсовая работа |
Язык | русский |
Дата добавления | 13.06.2012 |
Размер файла | 1,7 M |
Отправить свою хорошую работу в базу знаний просто. Используйте форму, расположенную ниже
Студенты, аспиранты, молодые ученые, использующие базу знаний в своей учебе и работе, будут вам очень благодарны.
Размещено на http://www.allbest.ru
Задание
Таблица 10х10 представляет собой план леса, в котором указано положение 20 деревьев. К каждому дереву нужно привязать свою палатку (в клетку, касающуюся клетки дерева стороной), всего ровно 20 палаток. Клетки с палатками не должны касаться друг друга (даже углом!). Числа слева и вверху обозначают количество клеток, занятых палатками, в соответствующей строке или столбце.
Требования к программе:
-программа должна быть выполнена на языке Pascal;
-в программе предусмотреть раздел с правилами игры;
-игрок (пользователь) должен перемещать фишки с помощью манипулятора «мышь»;
-в игре предусмотреть счетчик ходов и отмену последнего сделанного хода.
программа игра приложение
Содержание
Введение
1 Среда разработки приложений Delphi
1.1 Основы языка Pascal
1.2 Элементы управления в Microsoft Delphi
1.3 Обработка событий в Microsoft RAD Studio
2. Описание программы
Заключение
Список использованных источников
Введение
Целью курсовой работы является получение опыта самостоятельной разработки в соответствии с заданием пользовательского приложения, работающего под управлением ОС Microsoft Windows, в среде разработки приложений Delphi, а также получение навыка составления пояснительной записки и оформления в соответствии с требованиями, принятыми на факультете «Информационные системы в управлении».
Задачами курсовой работы являются: 1) разработка программы в соответствии с заданием; 2) составление пояснительной записки в соответствии с требованиями.
В первой главе пояснительной записки к курсовой работе приводится краткое описание возможностей интегрированной среды разработки приложений Delphi, основных алгоритмических конструкций языка программирования Pascal и базовых элементов управления.
Во второй главе приводится краткое описание программы, блок-схема программы и демонстрация работы программы.
В заключении приводится перечень изученных вопросов и основных результатов курсовой работы.
В приложение вынесен программный код с подробными комментариями.
1. Среда разработки приложений Delphi
1.1 Основы языка Pascal
В таблице 1.1 описаны типы данных Pascal и диапазоны значений
Таблица 1.1 - Типы данных Pascal
Тип Visual Basic |
Диапазон значений |
|
Boolean |
True или False |
|
Byte |
От 0 до 255 (беззнаковый). |
|
Char |
От 0 до 65535 (беззнаковый). |
|
Real |
Значения вещественного типа занимают 8 байт, содержат 15-16 значащих цифр и по модулю не могут превосходить величины 1.7•10308.(вещественный) |
|
String |
Не более, чем 255 символов (строковый) |
|
Array |
Массив представляет собой набор элементов одного типа, каждый из которых имеет свой номер, называемый индексом. |
|
Integer |
От -2 147 483 648 до 2 147 483 647 (целый) |
|
Record |
Запись представляет собой набор элементов разных типов, каждый из которых имеет свое имя и называется полем записи |
|
Указатели |
Тип указателя на тип T имеет форму ^T. Бестиповой указатель описывается с помощью слова pointer. |
|
Single |
Число одиночной точности с плавающей запятой, от -3,4028235E+38 до -1,401298E-45 для отрицательных значений; от 1,401298E-45 до 3,4028235E+38 для положительных значений |
|
procedure |
Переменные, предназначенные для хранения процедур и функций, называются процедурными |
В таблице 1.2 кратко описаны основные циклические структуры в Pascal (позволяют выполнить одну или несколько строк кода несколько раз).
Таблица 1.2 - Циклические структуры Pascal
Циклическая конструкция |
Краткое описание |
|
While...do |
Перед каждой итерацией цикла условие вычисляется, и если оно истинно, то выполняется тело цикла, в противном случае происходит выход из цикла. |
|
For ...to...do (downto) |
Для первой формы цикла с ключевым словом to параметр цикла меняется от начального значения до конечного значения, увеличиваясь всякий раз на единицу, а для второй формы ключевым словом downto - уменьшаясь на единицу. |
|
repeat ...until |
условие вычисляется после очередной итерации цикла, и если оно истинно, то происходит выход из цикла. |
1.2 Элементы управления в Microsoft Delphi
Таблица 1.3 - Элементы управления
Имя |
Тип |
Назначение |
|
MainMenu1 |
MainMenu1 |
Содержит разделы меню программы |
1.3 Обработка событий в Microsoft RAD Studio
Большинство программ управляются событиями, то есть ход работы программы определяется внешними воздействиями, называемыми событиями.
Под событием в данном случае подразумевается сигнал, сообщающий приложению о внешнем воздействии, в частности, о действии пользователя. Например, когда пользователь щелкает элемент управления на форме, форма может инициировать событие Click и вызывать процедуру, обрабатывающую событие. События также допускают взаимодействие отдельных задач. Например, приложение выполняет задачу по сортировке. Если пользователь отменяет сортировку, то приложение может послать событие отмены, которое остановит процесс сортировки.
Любой объект, способный вызывать события, является отправителем событий, также называемым источником событий. Формы и элементы управления являются примерами отправителей событий.
Обработчики событий - это процедуры, вызываемые при возникновении соответствующего события. Можно использовать любые допустимые процедуры в качестве обработчика событий. В RAD Studio используется стандартное положение об именовании обработчиков событий. Имя должно состоять из имени отправителя события, знака присваивания и имени события. Например, событие Click кнопки с именем button1 будет иметь имя button1:=Click [1]. В теле процедуры необходимо описать действия, которые программа должна выполнить при получении сигнала о том, что данное событие произошло.
Пользователь оказывает управляющее воздействие на программу посредством внешних периферийных устройств. Наиболее распространенными среди них являются клавиатура и манипулятор «мышь».
2. Описание программы
Приложение представляет собой стандартное окно Windows фиксированных размеров, которое можно свернуть или закрыть. В окне имеется стандартное меню, включающее разделы «Игра» и «Справка». Раздел «Игра» включает подразделы «Отменить ход» (доступна только для последнего сделанного хода) и «Выход».. Программа поддерживает способ управления: с помощью мыши . В заголовке окна отображается информация о количестве сделанных ходов.
В таблице 2.1 перечислены используемые в программе глобальные константы и переменные, в таблице 2.2 - элементы управления, в таблице 2.3 - процедуры и функции.
Таблица 2.1 - Глобальные константы и переменные
Имя |
Тип |
Назначение |
|
CountInRows |
array [1..10] of integer |
количество палаток в строках |
|
connection |
array [1..20] of TPoint |
привязки деревьев к палатке |
|
selecttrees |
array [1..4] of Tpoint |
координаты выделенных деревьев |
|
selectmod |
boolean |
индикатор режима выделения |
|
selectcount |
integer |
количество выделенных деревьев |
|
curenttent |
TPoint |
текущая палатка, для которой выбирается дерево |
|
moves |
intege |
количество ходов |
|
tentscount |
integer |
количество поставленных палаток |
|
CountInCols |
array [1..10] of integer |
кол во палаток в столбцах |
Таблица 2.2 - Элементы управления
Имя |
Тип |
Назначение |
|
label1_Click |
label1 |
Содержит к клетки «Пятнашки» |
|
MainMenu |
MainMenu |
Содержит разделы меню программы |
Таблица 2.3 - Процедуры и функции
Имя |
Тип |
Назначение |
|
procedure tform2.save |
Пользовательская процедура |
сохраняем поле и его состояния |
|
procedure tform2.load |
Пользовательская функция |
загрузка соответственно |
|
function tform2.canpastetentbycount |
Пользовательская процедура |
проверка на допустимое кол во палаток в строке/столбце |
|
function tform2.canpastetent |
Пользовательская процедура |
проверка правил на свободные деревья и соседние палатки |
|
procedure TForm2.DrawGrid1Click |
Обработчик события |
Проверка режима |
2.1 Блок-схема программы
Рисунок 2.1
Рисунок 2.2
Рисунок 2.3
Рисунок 2.4
Рисунок 2.5
Рисунок 2.6
Рисунок 2.7
Рисунок 2.8
Листинг программы.
unit forest;
interface
uses
Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms,
Dialogs, Grids, StdCtrls, ImgList, ExtCtrls;
type
TForm2 = class(TForm)
DrawGrid1: TDrawGrid;
Button1: TButton;
ImageList1: TImageList;
Label1: TLabel;
Panel1: TPanel;
Button2: TButton;
Button3: TButton;
procedure FormCreate(Sender: TObject);
procedure DrawGrid1DrawCell(Sender: TObject; ACol, ARow: Integer;
Rect: TRect; State: TGridDrawState);
procedure DrawGrid1Click(Sender: TObject);
function canpastetent(x, y : integer) : integer;
function canpastetentbycount(x, y : integer) : boolean;
procedure Button1Click(Sender: TObject);
procedure save();
procedure load();
procedure Button2Click(Sender: TObject);
procedure Button3Click(Sender: TObject);
private
{ Private declarations }
public
{ Public declarations }
end;
var
Form2: TForm2;
implementation
{$R *.dfm}
{
каждое дерево имеет прявязку к палатке, привязка может быть нулевая, что означает отсутствие палатки
кждая палатка имеет ссылку на ту привязку, которой дерево привязано к данной палатке
объекты поля field[i, j].x
0 - дерево
1 - палатка
2 - выделенное дерево
-1 - пустая ячейка
}
var field : array [1..10, 1..10] of TPoint; //поле, x - тип объекта, y - указывает на привязку дерева к палатке
CountInRows : array [1..10] of integer;//кол во палаток в строках
CountInCols : array [1..10] of integer;//кол во палаток в столбцах
connection : array [1..20] of TPoint;//привязки деревьев к палатке(содержит координаты палатки)
selecttrees : array [1..4] of Tpoint;//координаты выделенных деревьев
selectmod : boolean;//индикатор режима выделения
selectcount : integer;//количество выделенных деревьев
curenttent : TPoint;//текущая полатка, для которой выбирается дерево
moves : integer;//кол во ходов
tentscount : integer;//кол во поставленных палаток
//данные для бэкапа
oldfield : array [1..10, 1..10] of TPoint;
oldconnection : array [1..20] of TPoint;
oldtentscount : integer;
procedure tform2.save;
var i, j :integer;
begin//сохраняем поле и его состояния
for i := 1 to 10 do begin
for j := 1 to 10 do begin
oldfield[i, j] := field[i, j];
if oldfield[i, j].X = 2 then begin
oldfield[i, j].X := 0;
end;
end;
end;
for i := 1 to 20 do begin
oldconnection[i] := connection[i];
end;
oldtentscount := tentscount;
button1.Enabled := true;
end;
procedure tform2.load;
var i, j :integer;
begin//загрузка
for i := 1 to 10 do begin
for j := 1 to 10 do begin
field[i, j] := oldfield[i, j];
end;
end;
for i := 1 to 20 do begin
connection[i] := oldconnection[i];
end;
tentscount := oldtentscount;
selectmod := false;
button1.Enabled := false;
drawgrid1.Repaint;;
end;
function tform2.canpastetentbycount(x: Integer; y: Integer) : boolean;
var i, cc, cr : integer;
begin//проверка на допустимое кол во палаток в строке/столбце(циферки сверху и сбоку)
result := true;
cc := 0;
cr := 0;
for i := 1 to 10 do begin
if field[i, y].X = 1 then begin
cc := cc +1;
end;
if field[x, i].X = 1 then begin
cr := cr +1;
end;
end;
result := result and (cc < CountInRows[y]) and (cr < CountInCols[x]);
if not result then begin
showmessage('Неверный ход: в строке или столбце максимальное количество палаток');
end;
end;
procedure TForm2.Button1Click(Sender: TObject);//бэкап
begin
load;
end;
procedure TForm2.Button2Click(Sender: TObject);
begin
form2.Close;
end;
procedure TForm2.Button3Click(Sender: TObject);
var s : string;
begin
s := 'К кждому дереву нужно привязать свою палатку' + #13#10+
'(в клетку касающуюся клетки дерева стороной)' + #13#10+
'всего ровно 20 палаток, клетки с палатками не должны касаться'+ #13#10+
'друг друга (даже углом!). Числа слева и сверху обозначают' + #13#10+
'количество клеток занятых палатками в соответствующей строке или столбце';
messagebox(form2.Handle, pchar(s), 'Справка', 32);
end;
function tform2.canpastetent(x: Integer; y: Integer) : integer;
var isfreetree, istent : boolean;
i : integer;
begin//проверка правил на свободные деревья и соседние палатки
result := 0;
istent := true;
isfreetree := false;
//4 схожих блока, каждый из них проверяет 2 своих ячейки вокруг выбранной клетки
if y > 1 then begin//и смотрит есть ли свободное дерево
istent := istent and (field[x, y - 1].X <> 1);
if field[x, y - 1].X = 0 then begin
if connection[field[x, y - 1].y].X = 0 then begin
isfreetree := true;
result := result + 1;
field[x, y - 1].x := 2;
selecttrees[result].X := x ;
selecttrees[result].y := y - 1;
end;
end;
if x > 1 then begin
istent := istent and (field[x - 1, y - 1].X <> 1);
end;
end;
if y < 10 then begin
istent := istent and (field[x, y + 1].X <> 1);
if field[x, y + 1].X = 0 then begin
if connection[field[x, y + 1].y].X = 0 then begin
isfreetree := true;
result := result + 1;
field[x, y + 1].x := 2;
selecttrees[result].X := x;
selecttrees[result].y := y + 1;
end;
end;
if x < 10 then begin
istent := istent and (field[x + 1, y + 1].X <> 1);
end;
end;
if x > 1 then begin
istent := istent and (field[x - 1, y].X <> 1);
if field[x - 1, y].X = 0 then begin
if connection[field[x - 1, y].y].X = 0 then begin
isfreetree := true;
result := result + 1;
field[x - 1, y].x := 2;
selecttrees[result].X := x - 1;
selecttrees[result].y := y;
end;
end;
if y < 10 then begin
istent := istent and (field[x - 1, y + 1].X <> 1);
end;
end;
if x < 10 then begin
istent := istent and (field[x + 1, y].X <> 1);
if field[x + 1, y].X = 0 then begin
if connection[field[x + 1, y].y].X = 0 then begin
isfreetree := true;
result := result + 1;
field[x + 1, y].x := 2;
selecttrees[result].X := x + 1;
selecttrees[result].y := y;
end;
end;
if y > 1 then begin
istent := istent and (field[x + 1, y - 1].X <> 1);
end;
end;
istent := istent and isfreetree;
if istent = false then begin//если нет свободных деревьев или есть рядом палатка выводи мессагу о неверном ходе
for i := 1 to result do begin
field[selecttrees[i].x, selecttrees[i].y].X := 0;
end;
showmessage('Неверный ход: отсутствие свободного дерева или наличие рядом палатки');
result := 0;
end else begin
selectmod := true;
selectcount := result;
end;
end;
procedure TForm2.DrawGrid1Click(Sender: TObject);
var i : integer;
begin
if not selectmod then//проверка режима
begin
if field[drawgrid1.Col, drawgrid1.Row].X = -1 then
begin
if canpastetentbycount(drawgrid1.Col, drawgrid1.Row) then begin
i := canpastetent(drawgrid1.Col, drawgrid1.Row);
curenttent.X := drawgrid1.Col;
curenttent.y := drawgrid1.row;
if i <> 0 then begin
save;
moves := moves + 1;
tentscount := tentscount + 1;
field[drawgrid1.Col, drawgrid1.Row].X := 1;
if i = 1 then begin //если нашлось только одно дерево свободное обходимся без режима выделения
field[drawgrid1.Col, drawgrid1.Row].y := field[selecttrees[i].x, selecttrees[i].y].y;
connection[field[drawgrid1.Col, drawgrid1.Row].y].X := drawgrid1.Col;
connection[field[drawgrid1.Col, drawgrid1.Row].y].y := drawgrid1.Row;
field[selecttrees[i].x, selecttrees[i].y].x := 0;
selectmod := false;
end;
end;
end;
end else begin
if field[drawgrid1.Col, drawgrid1.Row].X = 1 then begin
save;
moves := moves + 1;
tentscount := tentscount - 1;
field[drawgrid1.Col, drawgrid1.Row].X := -1;
connection[field[drawgrid1.Col, drawgrid1.Row].y].X := 0;
connection[field[drawgrid1.Col, drawgrid1.Row].y].y := 0;
end;
end;
end else begin//в режиме выделения тыкаем на нужное дерево, тем самым привязывая его к палатке
if field[drawgrid1.Col, drawgrid1.Row].X = 2 then begin
field[curenttent.x, curenttent.y].y := field[drawgrid1.Col, drawgrid1.Row].y;
connection[field[drawgrid1.Col, drawgrid1.Row].y].X := curenttent.x;
connection[field[drawgrid1.Col, drawgrid1.Row].y].y := curenttent.y;
for i := 1 to selectcount do begin
field[selecttrees[i].x, selecttrees[i].y].x := 0;
end;
selectmod := false;
end;
end;
drawgrid1.Repaint;
label1.Caption := 'Ходов ' + inttostr(moves);
if tentscount = 20 then begin//условие победы
showmessage('Вы выйграли');
drawgrid1.Enabled := false;
end;
end;
procedure TForm2.DrawGrid1DrawCell(Sender: TObject; ACol, ARow: Integer;
Rect: TRect; State: TGridDrawState);
begin//отрисовочка ячеек
if (acol > 0) and (arow > 0) then begin
imagelist1.Draw(drawgrid1.Canvas, rect.Left, rect.Top, field[acol, arow].X, true);
end else begin
if (acol > 0) or (arow > 0) then begin
if acol = 0 then begin
drawgrid1.Canvas.TextOut(drawgrid1.CellRect(acol, arow).Left, drawgrid1.CellRect(acol, arow).top, inttostr(countinrows[arow]));
end else begin
drawgrid1.Canvas.TextOut(drawgrid1.CellRect(acol, arow).Left, drawgrid1.CellRect(acol, arow).top, inttostr(countincols[acol]));
end;
end;
end;
end;
procedure TForm2.FormCreate(Sender: TObject);
var i, j : integer;
begin
selectmod := false;
moves := 0;
tentscount := 0;
for i := 1 to 10 do
begin
for j := 1 to 10 do
begin
field[i, j].Y := 0;
field[i, j].x := -1;
end;
end;
//расстановка деревьев
field[2,1].X :=0;
field[4,1].X :=0;
field[6,2].X :=0;
field[8,2].X :=0;
field[3,3].X :=0;
field[8,3].X :=0;
field[7,4].X :=0;
field[2,5].X :=0;
field[7,5].X :=0;
field[1,6].X :=0;
field[5,6].X :=0;
field[10,6].X :=0;
field[8,7].X :=0;
field[1,8].X :=0;
field[4,8].X :=0;
field[3,9].X :=0;
field[7,9].X :=0;
field[9,9].X :=0;
field[4,10].X :=0;
field[8,10].X :=0;
//задаем деревьям связи
field[2,1].y :=1;
field[4,1].y :=2;
field[6,2].y :=3;
field[8,2].y :=4;
field[3,3].y :=5;
field[8,3].y :=6;
field[7,4].y :=7;
field[2,5].y :=8;
field[7,5].y :=9;
field[1,6].y :=10;
field[5,6].y :=11;
field[10,6].y :=12;
field[8,7].y :=13;
field[1,8].y :=14;
field[4,8].y :=15;
field[3,9].y :=16;
field[7,9].y :=17;
field[9,9].y :=18;
field[4,10].y :=19;
field[8,10].y :=20;
//количество палаток в строках
CountInRows[1] := 3;
CountInRows[2] := 1;
CountInRows[3] := 2;
CountInRows[4] := 1;
CountInRows[5] := 3;
CountInRows[6] := 1;
CountInRows[7] := 3;
CountInRows[8] := 1;
CountInRows[9] := 2;
CountInRows[10] := 3;
//и в столбцах
CountInCols[1] := 3;
CountInCols[2] := 1;
CountInCols[3] := 3;
CountInCols[4] := 1;
CountInCols[5] := 2;
CountInCols[6] := 2;
CountInCols[7] := 2;
CountInCols[8] := 2;
CountInCols[9] := 2;
CountInCols[10] := 2;
end;
end.
Демонстрация работы программы
Для начала работы с программой нужно запустить файл Gaime .
Появится окно программы в которой мы должны поставить нашу первую палатку.
Мы ставим нашу первую палатку.
Нужно выбрать к какому дереву мы ее привяжим по одной палатке на дерево.
Посмотрим справку.
Можно ознакомиться с правилами игры и что нам нужно сделать.
Неверный ход
Если мы поставим больше палаток чем доступно в строке или столбце увидим сообщение о неверном ходе.
Палатка не привязана к дереву.
Если мы пытаемся поставить палатку не привязаную к дереву мы увидим эту надпись.
Заключение
В ходе выполнения курсовой работы были более подробно изучены и изложены в пояснительной записке следующие вопросы:
базовые элементы управления, их свойства и методы;
управление программой с помощью событий, связанных с мышью;
Полученные знания использованы на практике. Результатом работы является приложение-игра «Палатки», работающее под ОС Windows.
Список использованных источников
Библиотека MSDN (по-русски) [Электронный ресурс] -
Электрон. дан. - Microsoft Corporation, 2010 - Режим доступа: http://msdn.microsoft.com/ru-ru/library/ms123401.aspx, свободный. - Загл. с экрана. - Яз. рус.
FAQ по RAD Studio .- http://www.embarcadero.com/rad-in-action/rad-studio-2010 .
1. Размещено на www.allbest.ru
Подобные документы
Изучение текстового режима языка программирования Turbo Pascal. Написание игры "Змейка" с помощью средств, процедур и функций языка программирование Turbo Pascal. Структурное и функциональное описание разработки. Листинг и общие примеры работы программы.
контрольная работа [286,3 K], добавлен 10.04.2011Особенности разработки приложений для операционной системы с помощью императивного, структурированного, объектно-ориентированного языка программирования Delphi. Формальное начало программы. Выделение конца программного блока. Листинг и описание программы.
курсовая работа [1,2 M], добавлен 04.08.2014Основы программирования на 32-битном Ассемблере, разработка с его помощью программы, демонстрирующей работу одного из разделов ОС Windоws. Описание используемых АРI-функций как интерфейса программирования приложений. Листинг программы, результаты работы.
курсовая работа [164,5 K], добавлен 18.05.2014Разработка и создание игры "Змейка". Использование динамически-активных принципов языка Java. Графические объекты программы. Описание игры, правила, теоретические сведения. Классы приложения. Типы данных. Реализация. Метод. Объект. Блок-схема игры.
курсовая работа [12,4 K], добавлен 18.06.2008Описание принципа развивающей игры в слова "Виселица". Разработка программы, реализующей задачу данной игры на языке Delphi. Обоснование выбора среды программирования, листинг файла, результаты отладки и тестирования, руководство для пользователя.
курсовая работа [572,7 K], добавлен 14.07.2012Приемы программирования в Delphi. Алгоритм поиска альфа-бета отсечения, преимущества. Описание программного средства. Разработка программы, реализующая алгоритм игры "реверси". Руководство пользователя. Листинг программы. Навыки реализации алгоритмов.
курсовая работа [357,1 K], добавлен 28.02.2011Особенности программирования аркадных игр в среде Python. Краткая характеристика языка программирования Python, его особенности и синтаксис. Описание компьютерной игры "Танчики" - правила игры, пояснение ключевых строк кода. Демонстрация работы программы.
курсовая работа [160,3 K], добавлен 03.12.2014Исследование базовых концепций программирования приложений под операционную систему Windows. Изучение истории создания универсального языка программирования Си. Разработка графического пользовательского интерфейса. Обзор правил игры и алгоритма работы.
курсовая работа [58,2 K], добавлен 09.11.2012Разработка программы "Сапер", удовлетворяющей необходимым требованиям эффективности в интегрированной среде программирования Microsoft Visual C++. Специфика создания Windows-приложений. Применение логической игры для развития интереса к обучению у детей.
курсовая работа [511,1 K], добавлен 01.06.2013Создание компьютерной игры посредством среды программирования Delphi. Инструменты разработки, компоненты и методы для разработки программы. Логическая и физическая структуры, основные функции и элементы управления программы, ее тестирование и отладка.
курсовая работа [27,9 K], добавлен 26.07.2014