Разработка игры "Lines"
Написание игры "Lines" на языке Object Pascal в среде Delphi. Алгоритм работы программы. Описание метода генерации поля. Используемые константы и переменные. Форма приложения после старта игрового процесса. Основные элементы формы и обработки событий.
Рубрика | Программирование, компьютеры и кибернетика |
Вид | курсовая работа |
Язык | русский |
Дата добавления | 12.04.2012 |
Размер файла | 225,0 K |
Отправить свою хорошую работу в базу знаний просто. Используйте форму, расположенную ниже
Студенты, аспиранты, молодые ученые, использующие базу знаний в своей учебе и работе, будут вам очень благодарны.
Размещено на http://www.allbest.ru/
Введение
В данном курсовом проекте должна быть разработана в среде 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 непосредственно предоставляет случайные значения.
Размещено на http://www.allbest.ru/
Рисунок 2.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 - счётчик очков.
2.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() - тик от таймера.
Procedure clear() - очищает поле от шаров.
Function checkFigure(): boolean проверяет наличие линий.
Function existPath (m, n, m2, n2: integer): boolean проверяет наличие свободного пути между двумя клетками.
- m, n: integer - координаты 1-ой клетки;
- m2, n2: integer - координаты 2-ой клетки.
Procedure start() запускает процесс игры.
Procedure generate() генерирует новые шары.
Function 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 с.
3 Delphi 7. Наиболее полное руководство / А. Хомоненко, В. Гофман, Е. Мещеряков, В. Никифоров. - СПб: БХВ, 2008. - 1216 с.
Приложение
Исходный код
unit main;
interface
uses
Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms,
Dialogs, GameManager, ExtCtrls, Menus, StdCtrls;
type
TmainForm = class(TForm)
Timer1: TTimer;
MainMenu1: TMainMenu;
N1: TMenuItem;
N2: TMenuItem;
N3: TMenuItem;
scores: TLabel;
procedure FormCreate (Sender: TObject);
procedure FormClose (Sender: TObject; var Action: TCloseAction);
procedure N3Click (Sender: TObject);
procedure N2Click (Sender: TObject);
procedure Timer1Timer (Sender: TObject);
procedure FormMouseDown (Sender: TObject; Button: TMouseButton;
Shift: TShiftState; X, Y: Integer);
procedure FormPaint (Sender: TObject);
procedure FormResize (Sender: TObject);
private
{Private declarations}
public
{Public declarations}
end;
var
mainForm: TmainForm;
g: Game;
implementation
{$R *.dfm}
procedure TmainForm. FormCreate (Sender: TObject);
begin
width:= GameManager.OFFSET_X + GameManager.FIELD_SIZE * 10 + GameManager.OFFSET_X;
height:= GameManager.OFFSET_Y + GameManager.FIELD_SIZE * 12 + GameManager.OFFSET_Y;
g:= Game.create (canvas, 10,10,3);
scores. Top:= GameManager.OFFSET_Y + GameManager.FIELD_SIZE * 10 + 10;
end;
procedure TmainForm.N3Click (Sender: TObject);
begin
g. Free;
Application. Terminate;
end;
procedure TmainForm.N2Click (Sender: TObject);
begin
g.start();
timer1. Enabled:= true;
end;
procedure TmainForm. Timer1Timer (Sender: TObject);
begin
g.tick();
scores. Caption:= 'Очки: ' + IntToStr (g.score);
end;
procedure TmainForm. FormMouseDown (Sender: TObject; Button: TMouseButton;
Shift: TShiftState; X, Y: Integer);
begin
if (button = mbLeft) then
g.click (g.toGameX (x, y), g.toGameY (x, y));
end;
procedure TmainForm. FormPaint (Sender: TObject);
begin
g.draw();
end;
procedure TmainForm. FormResize (Sender: TObject);
begin
width:= GameManager.OFFSET_X + GameManager.FIELD_SIZE * 10 + GameManager.OFFSET_X;
height:= GameManager.OFFSET_Y + GameManager.FIELD_SIZE * 12 + GameManager.OFFSET_Y;
end;
end.
unit main;
interface
uses
Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms,
Dialogs, GameManager, ExtCtrls, Menus, StdCtrls;
type
TmainForm = class(TForm)
Timer1: TTimer;
MainMenu1: TMainMenu;
N1: TMenuItem;
N2: TMenuItem;
N3: TMenuItem;
scores: TLabel;
procedure FormCreate (Sender: TObject);
procedure FormClose (Sender: TObject; var Action: TCloseAction);
procedure N3Click (Sender: TObject);
procedure N2Click (Sender: TObject);
procedure Timer1Timer (Sender: TObject);
procedure FormMouseDown (Sender: TObject; Button: TMouseButton;
Shift: TShiftState; X, Y: Integer);
procedure FormPaint (Sender: TObject);
procedure FormResize (Sender: TObject);
private
{Private declarations}
public
{Public declarations}
end;
var
mainForm: TmainForm;
g: Game;
implementation
{$R *.dfm}
procedure TmainForm. FormCreate (Sender: TObject);
begin
width:= GameManager.OFFSET_X + GameManager.FIELD_SIZE * 10 + GameManager.OFFSET_X;
height:= GameManager.OFFSET_Y + GameManager.FIELD_SIZE * 12 + GameManager.OFFSET_Y;
g:= Game.create (canvas, 10,10,3);
scores. Top:= GameManager.OFFSET_Y + GameManager.FIELD_SIZE * 10 + 10;
end;
procedure TmainForm. FormClose (Sender: TObject; var Action: TCloseAction);
begin
g. Free;
end;
procedure TmainForm.N3Click (Sender: TObject);
begin
g. Free;
Application. Terminate;
end;
procedure TmainForm.N2Click (Sender: TObject);
begin
g.start();
timer1. Enabled:= true;
end;
procedure TmainForm. Timer1Timer (Sender: TObject);
begin
g.tick();
scores. Caption:= 'Очки: ' + IntToStr (g.score);
end;
procedure TmainForm. FormMouseDown (Sender: TObject; Button: TMouseButton;
Shift: TShiftState; X, Y: Integer);
begin
if (button = mbLeft) then
g.click (g.toGameX (x, y), g.toGameY (x, y));
end;
procedure TmainForm. FormPaint (Sender: TObject);
begin
g.draw();
end;
procedure TmainForm. FormResize (Sender: TObject);
begin
width:= GameManager.OFFSET_X + GameManager.FIELD_SIZE * 10 + GameManager.OFFSET_X;
height:= GameManager.OFFSET_Y + GameManager.FIELD_SIZE * 12 + GameManager.OFFSET_Y;
end;
end.
unit gameBall;
interface
uses Graphics;
type
Ball = class
color: TColor;
x, y, r: integer;
ox, oy, fs: integer;
small: boolean;
constructor create (c: TColor; x, y, r:integer); overload;
procedure draw (canvas: TCanvas);
end;
implementation
{BALL}
constructor Ball.create (c: TColor; x, y, r:integer);
begin
color:= c;
self.x:= x;
self.y:= y;
self.r:= r;
end;
procedure Ball.draw (canvas: TCanvas);
var oldPen:TColor;
oldBrush:TColor;
worldX, worldY: integer;
begin
oldPen:= canvas. Pen. Color;
oldBrush:= canvas. Brush. Color;
canvas. Pen. Color:= clBlack;
canvas. Brush. Color:= color;
worldX:= oy + fs*(y+1);
worldY:= ox + fs*x;
canvas. Ellipse (worldX-r, worldY-r, worldX+r, worldY+r);
canvas. Pen. Color:= oldPen;
canvas. Brush. Color:= oldBrush;
end;
end.
unit gameGrid;
interface
uses Graphics, gameBall;
type
Grid = class
private
sizeX, sizeY: integer;
balls: array of array of Ball;
canvas: TCanvas;
selIndexX, selIndexY: integer;
score: integer;
countToGenerate: integer;
procedure doMove (m, n, m2, n2: integer);
public
constructor create (canvas: TCanvas; sx, sy:integer); overload;
destructor destroy(); overload;
procedure draw();
procedure doSelect (m, n: integer);
function canMoveHere (m, n:integer): boolean;
procedure tick();
procedure clear();
procedure checkFigure();
function existPath (m, n, m2, n2: integer): boolean;
end;
implementation
{GRID}
constructor Grid.create (canvas: TCanvas; sx, sy:integer);
var i:integer;
begin
self.canvas:= canvas;
sizeX:= sx;
sizeY:= sy;
selIndexX:= -1;
selIndexY:= -1;
SetLength (balls, sizeX);
for i:=0 to sizeX-1 do
SetLength (balls[i], sizeY);
end;
destructor Grid.destroy();
var i:integer;
begin
for i:=0 to sizeX-1 do
SetLength (balls[i], 0);
SetLength (balls, 0);
end;
procedure Grid.draw();
var i, j:integer;
begin
for i:=0 to sizeX-1 do
for j:=0 to sizeY-1 do
if (balls [i, j] <> nil) then
balls [i, j].draw(canvas);
end;
procedure Grid.doSelect (m, n: integer);
begin
selIndexX:= m;
selIndexY:= n;
end;
procedure Grid.doMove (m, n, m2, n2: integer);
begin
end;
function Grid.canMoveHere (m, n:integer): boolean;
begin
result:= false;
end;
procedure Grid.tick();
begin
end;
procedure Grid.clear();
begin
end;
procedure Grid.checkFigure();
begin
end;
function Grid.existPath (m, n, m2, n2: integer): boolean;
begin
result:= false;
end;
end.
unit Ball;
interface
uses Graphics;
type
Ball = class
private
color: TColor;
x, y, r: integer;
small: boolean;
public
constructor create (c: TColor; x, y, r:integer); overload;
procedure draw (canvas: TCanvas);
end;
implementation
{BALL}
constructor Ball.create (c: TColor; x, y, r:integer);
begin
color:= c;
self.x:= x;
self.y:= y;
self.r:= r;
end;
procedure Ball.draw (canvas: TCanvas);
var oldPen:TColor;
oldBrush:TColor;
begin
oldPen:= canvas. Pen. Color;
oldBrush:= canvas. Brush. Color;
canvas. Pen. Color:= clBlack;
canvas. Brush. Color:= color;
canvas. Ellipse (x-r, y-r, x+r, y+r);
canvas. Pen. Color:= oldPen;
canvas. Brush. Color:= oldBrush;
end;
unit Ball;
interface
uses Graphics;
type
Ball = class
private
color: TColor;
x, y, r: integer;
small: boolean;
public
constructor create (c: TColor; x, y, r:integer); overload;
procedure draw (canvas: TCanvas);
end;
implementation
{BALL}
constructor Ball.create (c: TColor; x, y, r:integer);
begin
color:= c;
self.x:= x;
self.y:= y;
self.r:= r;
end;
procedure Ball.draw (canvas: TCanvas);
var oldPen:TColor;
oldBrush:TColor;
begin
oldPen:= canvas. Pen. Color;
oldBrush:= canvas. Brush. Color;
canvas. Pen. Color:= clBlack;
canvas. Brush. Color:= color;
canvas. Ellipse (x-r, y-r, x+r, y+r);
canvas. Pen. Color:= oldPen;
canvas. Brush. Color:= oldBrush;
end;
end.
Размещено на Allbest.ru
Подобные документы
Элементы языка Object Pascal: идентификаторы, константы, переменные, выражения. Структура проекта Delphi. Операторы и метки. Типы данных языка OPascal. Статические и динамические массивы. Записи с вариантными полями. Совместимость и преобразование типов.
курс лекций [385,4 K], добавлен 18.02.2012Разработка программы логической игры в "крестики-нолики" пять в ряд на поле размера 15х15 клеток с применением графики на языке Pascal с использованием объектно-ориентированного программирования. Структура алгоритма программы и описание ее работы.
курсовая работа [821,5 K], добавлен 13.02.2012Создание Windows-приложения на алгоритмическом языке Object Pascal в среде визуального программирования Delphi, которое, как планируется, будет обеспечивать решение специализированных задач по формированию, обработке на ЭВМ и выводу информации.
курсовая работа [967,6 K], добавлен 20.05.2008Описания объектов, свойств, методов, формы и основных модулей текста программы в среде Delphi. Создание Windows-приложения на алгоритмическом языке Object Pascal в среде визуального программирования. Анализ результатов тестирования программного продукта.
курсовая работа [2,4 M], добавлен 27.08.2012Краткое описание работы базы данных. Программирование на языке Object Pascal в среде Delphi. Структура данных, описание типов и файлов. Глобальные и локальные переменные, процедуры, используемые в модуле. Расчёт объёма необходимой оперативной памяти.
курсовая работа [215,7 K], добавлен 07.12.2010Разработка программы обработки типизированных файлов с кодом на языке Object Pascal, с использованием компонентов Delphi для ввода и вывода данных. Разработка экранных форм и алгоритма программы. Описание программных модулей и инструкция оператору.
курсовая работа [1,5 M], добавлен 08.02.2011Разработка и тестирование программы на языке Pascal для поиска, вывода на экран и сохранения в файл списка книг с фамилиями авторов в алфавитном порядке, изданных после 2012 года. Разработка алгоритма и его описание. Инструкции по эксплуатации приложения.
курсовая работа [903,0 K], добавлен 13.06.2013Интегрированная среда разработки Delphi и элементы, входящие в ее состав. Математическая модель, алгоритм решения и его свойства. Описание операторов, процедур, функций и методов. Создание приложений по аналитической геометрии и теоретической механике.
курсовая работа [1,8 M], добавлен 26.05.2010Язык программирования Pascal и его турбооболочка. Аналитический обзор игрового программного обеспечения. Функции модуля Crt. Постановка задачи создания несложной игровой программы "Турбозмей", алгоритм реализации и описание пользовательского интерфейса.
курсовая работа [100,4 K], добавлен 15.05.2014Описание входной и выходной документации. Требования к интерфейсу Windows-приложения и информационной базе. Разработка алгоритмов обработки данных и SQL-запросов к базе данных. Язык программирования Object Pascal и среда Delphi. Используемая СУБД.
дипломная работа [228,7 K], добавлен 25.11.2007