Разработка игры "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

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