Разработка игровых приложений в С++ Builder 6.0

Развитие игровой индустрии и виды обеспечения автоматизированных систем ОАО "Электроавтомат". Работа с графическими объектами в ИСР C++ Builder 6.0, разработка справочной системы и реализация кода ее вызова. Создание интерфейса и отладка программы.

Рубрика Программирование, компьютеры и кибернетика
Вид дипломная работа
Язык русский
Дата добавления 08.12.2010
Размер файла 3,2 M

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

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

Компонент - MainMenu

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

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

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

Значок компонента MainMenu можно поместить в любое место формы, т. к. во время работы программы он не виден. Пункты меню появляются в верхней части формы в результате настройки компонента. Для настройки меню используется редактор меню, который запускается двойным щелчком левой кнопкой мыши на значке компонента или путем выбора из контекстного меню компонента команды Menu Designer. В начале работы над новым меню, сразу после добавления компонента к форме, в окне редактора находится один-единственный прямоугольник - заготовка пункта меню. Чтобы превратить эту заготовку в меню, нужно в поле Caption окна Object Inspector ввести название меню.Если перед какой-либо буквой в названии меню ввести знак &, то во время работы программы можно будет активизировать этот пункт меню путем нажатия комбинации клавиши <Alt> и клавиши, соответствующей символу, перед которым стоит знак &. В названии меню эта буква будет подчеркнута. Чтобы добавить в главное меню элемент, нужно в окне редактора меню выбрать последний (пустой) элемент меню и ввести название нового пункта. Чтобы добавить в меню команду, нужно выбрать тот пункт меню, в который надо добавить команду, переместить указатель активного элемента меню в конец списка команд меню и ввести название команды. После того как будет сформирована структура меню, нужно, используя окно Object Inspector, выполнить настройку элементов меню (выбрать настраиваемый пункт меню можно в окне формы приложения или из списка объектов в верхней части окна Object Inspector). Каждый элемент меню (пункты и команды) -это объект типа TMenuitem. Свойства объектов TMenuitem определяют вид меню во время работы программы. При выборе во время работы программы элемента меню происходит событие Click. Чтобы создать процедуру обработки этого события, нужно в окне формы выбрать пункт меню и щелкнуть левой кнопкой мыши -C++ Builder создаст шаблон процедуры обработки этого события. В качестве примера ниже приведена функция обработки события click, которое возникает в результате выбора из меню ? команды Справка. N3 - это имя элемента меню, соответствующего этой команде.

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

void fastcall TForml::N3Click(TObject *Sender)

{

WinHelp(Forml->Handle,"saper.hip",HELP_CONTEXT,I);

}

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

Глава 3. Реализация программного продукта

3.1 Анализ постановки задачи. Разработка интерфейса

Всем, кто работает с операционной системой Windows, хорошо знакома игра "Сапер". Здесь рассматривается аналогичная программа.

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

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

Задача игрока -- найти все мины и пометить их флажками.

Используя кнопки мыши, игрок может открыть клетку или поставить в нее флажок, указав тем самым, что в клетке находится мина. Клетка открывается щелчком левой кнопки мыши, флажок ставится щелчком правой. Если в клетке, которую открыл игрок, есть мина, то происходит взрыв (сапер ошибся, а он, как известно, ошибается только один раз) и игра заканчивается. Если в клетке мины нет, то в этой клетке появляется число, соответствующее количеству мин, находящихся в соседних клетках. Анализируя информацию о количестве мин в клетках, соседних с уже открытыми, игрок может обнаружить и пометить флажками все мины. Ограничений на количество клеток, помеченных флажками, нет. Однако для завершения игры (для выигрыша) флажки должны быть установлены только в тех клетках, в которых есть мины. Ошибочно установленный флажок можно убрать, щелкнув правой кнопкой мыши в клетке, в которой он находится. В программе игровое поле представлено массивом N+2 на М+2, где NxM - размер игрового поля. Элементы массива с номерами строк от 1 до N и номерами столбцов от 1 до М соответствуют клеткам игрового поля первые и последние столбцы и строки соответствуют границе игрового поля.

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

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

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

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

3.2 Игровое поле

На разных этапах игры игровое поле выглядит по-разному. Вначале поле просто разделено на клетки. Во время игры, в результате щелчка правой кнопкой мыши, в клетке появляется флажок. Щелчок левой кнопкой тоже меняет вид клетки: клетка меняет цвет и в ней появляется цифра или мина (игра на этом заканчивается). Рассмотрим объекты, свойства и методы,обеспечивающие работу с графикой.

3.3 Кодирование, тестирование и отладка программного продукта

void __fastcall NewGame(); // новая игра - "разбрасывает" мины

void __fastcall Open(int row, int col); /* открывает текущую и соседние

пустые клетки */

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

void __fastcall TForm1::FormMouseDown(TObject *Sender, TMouseButton Button, TShiftState Shift, int x, int y)

{

if ( status == 2 ) return;

if ( status == 0) status = 1;

x -= LEFT;

y -= TOP;

if (x > 0 && y > 0)

{

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

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

int row = y/H + 1;

int col = x/W + 1;

if (Button == mbLeft)

{

if ( Pole[row][col] == 9 )

{

Pole[row][col] +=100;

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

ShowPole(status);

}

else if ( Pole[row][col] < 9 )

{

Open(row,col);

ShowPole(status);

}

}

else if (Button == mbRight)

{

nFlag++;

if ( Pole[row][col] == 9 )

nMin++;

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

if (nMin == NM && nFlag == NM)

{

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

ShowPole(status);

}

else Kletka(row, col, status);

}

}

}

// Функция обработки события OnCreate обычно используется

// для инициализации глобальных переменных

void __fastcall TForm1::FormCreate(TObject *Sender)

{

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

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

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

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

for ( int row=0; row <= MR+1; row++)

for ( int col=0; col <= MC+1; col++)

Pole[row][col] = -3;

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

Form1->ClientWidth = W*MC;

Form1->ClientHeight = H*MR+TOP+1;

}

// Вывод поля как результат обработки события Paint

// позволяет проводить любые манипуляции с формой во время работы программы

void __fastcall TForm1::FormPaint(TObject *Sender)

{

ShowPole(status);

}

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

void __fastcall TForm1::ShowPole( int status)

{

for ( int row = 1; row <= MR; row++ )

for ( int col = 1; col <= MC; col++ )

Kletka(row, col, status);

}

// рисует на экране клетку

void __fastcall TForm1::Kletka(int row, int col, int status)

{

int x = LEFT + (col-1)* W;

int y = TOP + (row-1)* H;

if (status == 0) // начало игры

{

// клетка - серый квадрат

Canvas->Brush->Color = clLtGray;

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

return;

}

// во время (status = 1) и в конце (status = 2) игры

if ( Pole[row][col] < 100 )

{

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

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

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

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

Mina( x, y); // игра закончена, показать мину

return;

}

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

Canvas->Brush->Color = clWhite; // открытые белые

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

if ( Pole[row][col] == 100 ) // клетка открыта, но она пустая

return;

if ( Pole[row][col] >= 101 && Pole[row][col] <= 108 )

{

Canvas->Font->Size = 14;

Canvas->Font->Color = clBlue;

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

return;

}

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

Flag(x, y);

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

{

Canvas->Brush->Color = clRed;

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

}

if (( Pole[row][col] % 10 == 9) && (status == 2))

Mina( x, y);

}

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

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

void __fastcall Open(int row, int col)

{

if (Pole[row][col] == 0)

{

Pole[row][col] = 100;

// открываем клетки слева, справа, снизу и сверху

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);

}

else

// -3 это граница игрового поля

if (Pole[row][col] < 100 && Pole[row][col] != -3)

Pole[row][col] += 100;

}

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

void __fastcall NewGame()

{

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

// клеткам, а в неотображаемые (по границе игрового поля)

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

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

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

int row,col;

for (row=0; row <= MR+1; row++)

for (col=0; col <= MC+1; col++)

Pole[row][col] = -3;

for (row=1; row <= MR; row++)

for (col=1; col <= MC; col++)

Pole[row][col] = 0;

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

time_t t; // используется ГСЧ

srand((unsigned) time(&t)); // инициализация ГСЧ

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

do

{

row = rand() % MR +1;

col = rand() % MC +1;

if ( Pole[row][col] != 9)

{

Pole[row][col] = 9;

n++;

}

}

while ( n < 10);

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

int k;

for ( row = 1; row <= MR; row++)

for ( col = 1; col <= MC; col++)

if ( Pole[row][col] != 9 ) {

k =0;

if ( Pole[row-1][col-1] == 9 ) k++;

if ( Pole[row-1][col] == 9 ) k++;

if ( Pole[row-1][col+1] == 9 ) k++;

if ( Pole[row][col-1] == 9 ) k++;

if ( Pole[row][col+1] == 9 ) k++;

if ( Pole[row+1][col-1] == 9 ) k++;

if ( Pole[row+1][col] == 9 ) k++;

if ( Pole[row+1][col+1] == 9 ) k++;

Pole[row][col] = k;

}

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

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

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

}

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

void __fastcall TForm1::Mina(int x, int y)

{

Canvas->Brush->Color = clGreen;

Canvas->Pen->Color = clBlack;

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

// корпус

Canvas->Rectangle(x+8,y+30,x+32,y+34);

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

// полоса на корпусе

Canvas->MoveTo(x+12,y+32); Canvas->LineTo(x+28,y+32);

// основание

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

// вертикальный "ус"

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

// боковые "усы"

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

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

}

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

void __fastcall TForm1::Flag( int x, int y)

{

TPoint p[4]; // координаты флажка и нижней точки древка

// точки флажка

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;

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

Canvas->Brush->Color = clRed;

Canvas->Pen->Color = clRed; // чтобы контур флажка был красный

Canvas->Polygon(p, 2); // флажок

// древко

Canvas->Pen->Color = clBlack;

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

Canvas->LineTo(x+4,y+36);

TPoint m[5]; // буква М

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;

Canvas->Pen->Color = clWhite;

Canvas->Polyline(m,4);

Canvas->Pen->Color = clBlack;

}

// команда главного меню Новая игра

void __fastcall TForm1::N1Click(TObject *Sender)

{

NewGame();

ShowPole(status);

}

3.4 Реализация кода вызова справочной системы

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

void __fastcall TForm1::N4Click(TObject *Sender)

{

AboutForm->Top = Form1->Top + Form1->Height/2

- AboutForm->Height/2;

AboutForm->Left = Form1->Left + Form1->Width/2

- AboutForm->Width/2;

AboutForm->ShowModal();

}

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

void __fastcall TForm1::N3Click(TObject *Sender)

{

WinHelp(Form1->Handle,"saper.hlp",HELP_CONTEXT,1);

}

Заключение

При написание этой дипломной работы я получил фундаментальные знания навыки в создании игр. Я достиг поставленные мною задачи а именно

1.Разработал интуитивно понятный интерфейс.

2.Изучил методы построения графических примитивов.

3.Усовершенствовал ранее полученные навыки.

4.изучил средства создания справочной системы.

Список использованной литературы

Культин Н. Б. Самоучитель C++ Builder

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


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

  • Реализация программного кода "Organizer 1.0". Разработка приложений баз данных с помощью Borland C++ Builder 6. Компоненты системы программирования для работы по технологии InterBase. Программный код и интерфейс "Organizer 1.0", структура приложения.

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

  • Работа в Borland C++ Builder. Среда разработки и компоненты C++ Builder. Свойства компонентов. Менеджер проектов. Создание приложений в C++ Builder. Выбор компонентов для групповых операций. Работа с базами данных в Borland C++ Builder.

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

  • Создание консольных приложений с использованием графического интерфейса пользователя. Содержание палитры компонентов программы С++ Builder. Использование возможностей объектно-ориентированного программирования, особенности редактора кода и форм в С++.

    лекция [27,0 K], добавлен 22.12.2010

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

    отчет по практике [1,2 M], добавлен 16.09.2012

  • Разработка приложения "Ведомость начисления заработной платы" в среде программирования C++Builder. Алгоритм и сценарий работы программы. Проектирование интерфейса пользователя. Написание программных модулей и результаты тестирования данной программы.

    курсовая работа [597,4 K], добавлен 31.01.2016

  • Визуальное проектирование и событийное программирование. Повышение производительности программиста при использовании RAD-систем. Составление алгоритмов, разработка приложения для решения прикладных задач на примере консольных приложений C++ Builder 6.

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

  • C++ Builder - SDI-приложение, главное окно которого содержит настраиваемую инструментальную панель и палитру компонентов. Свойства атрибутов компонента, определяющие его внешний вид и поведение. События, методы и VCL компоненты в среде C++ Builder.

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

  • Разработка приложений для работы с графикой в Borland C++ Builder. Вывод изображения на экран, изменение цвета и толщины линии контура, перемещение объекта по экрану, получение нового объекта вычитанием двух существующих. Основные обработчики событий.

    контрольная работа [1,5 M], добавлен 28.03.2012

  • Интегрированная среда программирования C++ Builder 6. Методы вычерчивания графических примитивов. Основные свойства инструментов рисования. Разработка рисунка паутины с центром в точке с произвольным числом лучей. Алгоритм программы в виде блок-схемы.

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

  • Разработка прикладной программы для операций создания и уничтожения объектов в системе визуального объектно-ориентированного программирования C++Builder. Алгоритм работы программы, набор функций и операторов, компонент и модулей, кнопки событий.

    дипломная работа [672,5 K], добавлен 16.08.2012

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