Разработка игры "Lines"

 

Введение


В данном курсовом проекте должна быть разработана в среде Delphi игра «Lines». Приложение должно иметь графический интерфейс, что предполагает освоение навыков работы с 2D графикой. Ввиду того, что приложение является игрой, следует обратить больше внимание на уровень интерактивности и время отклика системы.

Lines - логическая игра, в которой необходимо очищать игровое поле от шариков. Поле представляет собой квадрат, состоящий из клеток. В начале игры на него выставляется три шарика разных цветов. Как правило, используется семь (классически) различных цветов. За ход игрок может передвинуть один шарик, выделив его и указав его новое местоположение. При этом для совершения хода необходимо, чтобы между начальной и конечной клетками существовал путь из свободных клеток. При выстраивании линии из четырёх и более шариков одного цвета (по горизонтали, вертикали или диагонали) она исчезает. После каждого хода выставляются новые три шарика, но при исчезновении линии этого не происходит.



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


Согласно заданию необходимо написать игру «Lines» на языке Object Pascal в среде Delphi. Игра должна быть разработана как приложение ОС Windows.

Предполагаемый размер поля 10х10 клеток. Опытным путём было получено, что для поля такого размера оптимальное количество цветов равно 5, минимальная длина линии - 5, число появляющихся после хода шаров - 3. Более низкое значение этих параметров сделает игру слишком лёгкой, а высокое - тяжёлой.

Под игровым полем следует поместить счётчик очков. Он должен вести подсчёт убранных шаров.

Должен присутствовать метод оповещения о проигрыше. Методы оповещения о выигрыше не нужны ввиду бесконечности процесса игры.

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

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



2. Разработка программы


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


2.1 Алгоритм работы программы


Общий цикл работы программы можно представить следующим образом. После запуска возникает окно приложения с пустым игровым полем. После этого надо дать команду на начало игры. На поле генерируются три случайных шарика, и начинается игровой процесс. В течение него игрок в любой момент может заново запустить игру. После каждого хода появляются три новых шарика. Если на поле не осталось места для них, то игроку засчитывается проигрыш. В этом случае игра начинается заново. Блок-схема алгоритма игрового процесса приведена на рисунке 2.2.


2.2 Описание метода генерации поля


Задачи генерации расположения трёх новых шаров и определения их цветов выполняются с помощью двух функций: Randomize и Random. Обе являются стандартными для Delphi. Randomize используется для того, чтобы каждый раз получить разный результат. Random непосредственно предоставляет случайные значения.



Рисунок 2.2 - Блок-схема алгоритма игрового процесса


.3 Используемые константы и переменные


Здесь описано назначение используемых в программе констант и переменных.

Константы:

-COUNT_COLORS - количество цветов;

-COLORS - массив используемых цветов;

-R_MAX - размер шарика;

-R_MIN - размер будущего шарика;

-FIELD_SIZE - размер одной ячейки игрового поля;

-OFFSET_X - отступ игрового поля слева от экрана;

-OFFSET_Y - отступ игрового поля справа от экрана.

Переменные:

-sizeX, sizeY: integer - размеры игрового поля;

-balls: array of array of Ball - массив шариков;

-canvas: TCanvas - холст для рисования.

-selIndexX, selIndexY: integer - индексы выделенного шарика;

-countToGenerate: integer - количество генерирующихся шаров;

-dx, dir: integer - приращение и направление анимации;

-sel, mov: boolean - флаги выбора и перемещения шаров;

-field: array of array of integer - массив чисел для поиска путей;

-score: integer - счётчик очков.


.4 Процедуры и функции общего назначения


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

Procedure doMove (m, n, m2, n2: integer) перемещает шар из одной клетки в другую.

-m, n: integer - начальные координаты;

-m2, n2: integer - конечные координаты.

Procedure doSelect (m, n: integer) производит выбор шара.

-m, n: integer - координаты выбираемого шара.

Procedure draw() отображает на экране текущее состояния игры.

Procedure click (m, n: integer) обрабатывает нажатие левой клавиши мыши.

-m, n: integer - координаты, по которым происходит нажатие;

Procedure tick() - тик от таймера.rocedure clear() - очищает поле от шаров.

Function checkFigure(): boolean проверяет наличие линий.

Function existPath (m, n, m2, n2: integer): boolean проверяет наличие свободного пути между двумя клетками.

-m, n: integer - координаты 1-ой клетки;

-m2, n2: integer - координаты 2-ой клетки.

Procedure start() запускает процесс игры.

Procedure generate() генерирует новые шары. toGameX (x, y: integer) конвертирует оконные координаты в игровую координату Х.

-x, y:integer - экранные координаты х и y.

Function toGameY (x, y: integer) конвертирует оконные координаты в игровую координату Y.

-x, y:integer - экранные координаты х и y.

Procedure lose() отвечает за события в приложении при проигрыше.

игра программа форма lines

2.5 Описание элементов формы. Обработка событий


Рисунок. 2.5 - Стартовая форма приложения

В главном меню содержится только один пункт: «Игра». Он содержит подпункты «Новая» и «Выход». Первый подпункта запускают процесс игры. Второй подпункт позволяет выйти из игры. После запуска игрового процесса на игровом поле в произвольных местах появляются шесть шариков случайного цвета. Три из них по размеру совпадают с клетками игрового поля. Они обозначают выставленные на игровое поле шарики. Три других имеют меньший размер и показывают места, в которые будут выставлены шарики соответствующего цвета после хода игрока. Пример игрового поля после начала игрового процесса показан на рисунке 2.6.


Рисунок 2.6 - Форма приложения после старта игрового процесса


Чтобы сделать ход, игроку необходимо кликнуть по шарику, который он хочет переместить, а затем щёлкнуть по тому месту, куда он хочет его переместить. При щелчке по шарику последний начинает прыгать. Это сделано для того, чтобы обозначить тот шар, который будет перемещен при щелчке по пустой клетке. Пример изменения положения прыгающего шарика показан на рисунке 2.7.


Рисунок 2.7 - Прыгающий шарик


При перемещении выбранного шара на клетку с мелким шариком появление нового произойдёт уже в случайной клетке. Таким образом, сохраняется число шаров появляющихся после хода игрока. Это проиллюстрировано на рисунке 2.8. (стрелками указаны направления движения шариков для лучшего понимания происходящего).


Рисунок 2.8 - Смещение появления шарика


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

Если на игровом поле не остаётся больше места для появления новых шаров, то игроку засчитывается проигрыш и появляется окошко с соответствующим сообщением. Оно проиллюстрировано на рисунке 2.9.


Рисунок 2.9 - Окошко с сообщением о проигрыше


При нажатии на кнопку «ОК» игровой процесс начинается заново.



Заключение


В ходе работы над курсовым проектом была разработана в среде Delphi игра «Lines». Приложение имеет графический интерфейс. Игра имеет довольно низкие системные требования. В качестве перспектив развития проекта можно указать добавление музыкального сопровождения, таблицы рекордов, таймера времени, настройки уровня сложности, анимации при перемещении и удалении.

Можно перечислить следующие недостатки:

-не самое высокое качество графического оформления;

-отсутствует выбор или настройка уровня сложности;

-отсутствует анимация перемещения и исчезновения шариков;

-отсутствует таблица рекордов.

Для нормального функционирования программы техническая система должна удовлетворять следующим минимальным требованиям: процессор Celeron 266 МГц, оперативная память 64 Мб, свободное место на жестком диске 1 Мб.



Список источников


1Зубов, А. Программирование на Delphi. Трюки и эффекты / А. Зубов. - СПб: Питер, 2005. - 396 с.

2Фаронов, В.В. Delphi. Программирование на языке высокого уровня / В. Фаронов. - СПб: Питер, 2004. - 640 с.

Delphi 7. Наиболее полное руководство / А. Хомоненко, В. Гофман, Е. Мещеряков, В. Никифоров. - СПб: БХВ, 2008. - 1216 с.



Приложение


Исходный код

unit main;

interface, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms,, GameManager, ExtCtrls, Menus, StdCtrls;= class(TForm): TTimer;: TMainMenu;: TMenuItem;: TMenuItem;: TMenuItem;: TLabel;FormCreate (Sender: TObject);FormClose (Sender: TObject; var Action: TCloseAction);N3Click (Sender: TObject);N2Click (Sender: TObject);Timer1Timer (Sender: TObject);FormMouseDown (Sender: TObject; Button: TMouseButton;: TShiftState; X, Y: Integer);FormPaint (Sender: TObject);FormResize (Sender: TObject);

{Private declarations}

{Public declarations};: TmainForm;: Game;

{$R *.dfm}TmainForm. FormCreate (Sender: TObject);:= GameManager.OFFSET_X + GameManager.FIELD_SIZE * 10 + GameManager.OFFSET_X;:= GameManager.OFFSET_Y + GameManager.FIELD_SIZE * 12 + GameManager.OFFSET_Y;:= Game.create (canvas, 10,10,3);. Top:= GameManager.OFFSET_Y + GameManager.FIELD_SIZE * 10 + 10;;TmainForm.N3Click (Sender: TObject);. Free;. Terminate;;TmainForm.N2Click (Sender: TObject);.start();. Enabled:= true;;TmainForm. Timer1Timer (Sender: TObject);.tick();. Caption:= 'Очки: ' + IntToStr (g.score);;TmainForm. FormMouseDown (Sender: TObject; Button: TMouseButton;: TShiftState; X, Y: Integer);(button = mbLeft) then.click (g.toGameX (x, y), g.toGameY (x, y));;TmainForm. FormPaint (Sender: TObject);.draw();;TmainForm. FormResize (Sender: TObject);:= GameManager.OFFSET_X + GameManager.FIELD_SIZE * 10 + GameManager.OFFSET_X;:= GameManager.OFFSET_Y + GameManager.FIELD_SIZE * 12 + GameManager.OFFSET_Y;;.main;, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms,, GameManager, ExtCtrls, Menus, StdCtrls;= class(TForm): TTimer;: TMainMenu;: TMenuItem;: TMenuItem;: TMenuItem;: TLabel;FormCreate (Sender: TObject);FormClose (Sender: TObject; var Action: TCloseAction);N3Click (Sender: TObject);N2Click (Sender: TObject);Timer1Timer (Sender: TObject);FormMouseDown (Sender: TObject; Button: TMouseButton;: TShiftState; X, Y: Integer);FormPaint (Sender: TObject);FormResize (Sender: TObject);

{Private declarations}

{Public declarations};: TmainForm;: Game;

{$R *.dfm}TmainForm. FormCreate (Sender: TObject);:= GameManager.OFFSET_X + GameManager.FIELD_SIZE * 10 + GameManager.OFFSET_X;:= GameManager.OFFSET_Y + GameManager.FIELD_SIZE * 12 + GameManager.OFFSET_Y;:= Game.create (canvas, 10,10,3);. Top:= GameManager.OFFSET_Y + GameManager.FIELD_SIZE * 10 + 10;;TmainForm. FormClose (Sender: TObject; var Action: TCloseAction);. Free;;TmainForm.N3Click (Sender: TObject);. Free;. Terminate;;TmainForm.N2Click (Sender: TObject);.start();. Enabled:= true;;TmainForm. Timer1Timer (Sender: TObject);.tick();. Caption:= 'Очки: ' + IntToStr (g.score);;TmainForm. FormMouseDown (Sender: TObject; Button: TMouseButton;: TShiftState; X, Y: Integer);(button = mbLeft) then.click (g.toGameX (x, y), g.toGameY (x, y));;TmainForm. FormPaint (Sender: TObject);.draw();;TmainForm. FormResize (Sender: TObject);:= GameManager.OFFSET_X + GameManager.FIELD_SIZE * 10 + GameManager.OFFSET_X;:= GameManager.OFFSET_Y + GameManager.FIELD_SIZE * 12 + GameManager.OFFSET_Y;;.gameBall;Graphics;= class: TColor;

x, y, r: integer;, oy, fs: integer;

small: boolean;create (c: TColor; x, y, r:integer); overload;draw (canvas: TCanvas);;

{BALL}Ball.create (c: TColor; x, y, r:integer);:= c;.x:= x;.y:= y;.r:= r;;Ball.draw (canvas: TCanvas);oldPen:TColor;:TColor;, worldY: integer;:= canvas. Pen. Color;:= canvas. Brush. Color;. Pen. Color:= clBlack;. Brush. Color:= color;:= oy + fs*(y+1);:= ox + fs*x;. Ellipse (worldX-r, worldY-r, worldX+r, worldY+r);. Pen. Color:= oldPen;. Brush. Color:= oldBrush;;.gameGrid;Graphics, gameBall;= class, sizeY: integer;: array of array of Ball;

canvas: TCanvas;, selIndexY: integer;

score: integer;: integer;doMove (m, n, m2, n2: integer);create (canvas: TCanvas; sx, sy:integer); overload;destroy(); overload;draw();

procedure doSelect (m, n: integer);

function canMoveHere (m, n:integer): boolean;tick();clear();checkFigure();existPath (m, n, m2, n2: integer): boolean;;

{GRID}Grid.create (canvas: TCanvas; sx, sy:integer);i:integer;.canvas:= canvas;:= sx;:= sy;:= -1;:= -1;(balls, sizeX);i:=0 to sizeX-1 do(balls[i], sizeY);;Grid.destroy();i:integer;i:=0 to sizeX-1 do(balls[i], 0);(balls, 0);;Grid.draw();i, j:integer;i:=0 to sizeX-1 doj:=0 to sizeY-1 do(balls [i, j] <> nil) then[i, j].draw(canvas);;Grid.doSelect (m, n: integer);:= m;:= n;;Grid.doMove (m, n, m2, n2: integer);;Grid.canMoveHere (m, n:integer): boolean;:= false;;Grid.tick();;Grid.clear();;Grid.checkFigure();;Grid.existPath (m, n, m2, n2: integer): boolean;:= false;;.Ball;Graphics;= class: TColor;, y, r: integer;: boolean;create (c: TColor; x, y, r:integer); overload;draw (canvas: TCanvas);;

{BALL}Ball.create (c: TColor; x, y, r:integer);:= c;.x:= x;.y:= y;.r:= r;;Ball.draw (canvas: TCanvas);oldPen:TColor;:TColor;:= canvas. Pen. Color;:= canvas. Brush. Color;. Pen. Color:= clBlack;. Brush. Color:= color;. Ellipse (x-r, y-r, x+r, y+r);. Pen. Color:= oldPen;. Brush. Color:= oldBrush;;Ball;Graphics;= class: TColor;, y, r: integer;: boolean;create (c: TColor; x, y, r:integer); overload;draw (canvas: TCanvas);;

{BALL}Ball.create (c: TColor; x, y, r:integer);:= c;.x:= x;.y:= y;.r:= r;;Ball.draw (canvas: TCanvas);oldPen:TColor;:TColor;:= canvas. Pen. Color;:= canvas. Brush. Color;. Pen. Color:= clBlack;. Brush. Color:= color;. Ellipse (x-r, y-r, x+r, y+r);. Pen. Color:= oldPen;. Brush. Color:= oldBrush;;.



Введение В данном курсовом проекте должна быть разработана в среде Delphi игра «Lines». Приложение должно иметь графический интерфейс, что пред

Больше работ по теме:

КОНТАКТНЫЙ EMAIL: [email protected]

Скачать реферат © 2018 | Пользовательское соглашение

Скачать      Реферат

ПРОФЕССИОНАЛЬНАЯ ПОМОЩЬ СТУДЕНТАМ