Компьютерная программа, реализующая игру 'Арканоид'

  • Вид работы:
    Курсовая работа (т)
  • Предмет:
    Информационное обеспечение, программирование
  • Язык:
    Русский
    ,
    Формат файла:
    MS Word
    437,73 Кб
  • Опубликовано:
    2017-03-02
Вы можете узнать стоимость помощи в написании студенческой работы.
Помощь в написании работы, которую точно примут!

Компьютерная программа, реализующая игру 'Арканоид'

АННОТАЦИЯ

Данная работа является пояснительной запиской к компьютерной программе, реализующей игру «Арканоид». Пояснительная записка содержит описание постановки задачи, математической модели и схемы алгоритма решения.

ОГЛАВЛЕНИЕ

ВВЕДЕНИЕ

. ПОСТАНОВКА ЗАДАЧИ

. ОПИСАНИЕ АЛГОРИТМА РЕШЕНИЯ

.1 ПАРАМЕТРЫ СЦЕНЫ И ФИГУР

.2 АЛГОРИТМ РАБОТЫ ПРОГРАММЫ

. ОПИСАНИЕ ФУНКЦИЙ

. РУКОВОДСТВО ПОЛЬЗОВАТЕЛЯ

ЗАКЛЮЧЕНИЕ

ЛИТЕРАТУРА

ПРИЛОЖЕНИЕ

ВВЕДЕНИЕ


Цель данной курсовой работы - создать программу, реализующую игру «Арканоид».

Основными задачами, решаемыми в ходе выполнения курсовой работы являются освоение приемов программирования на языке С++ с использованием средств OpenGL, разбор структуры и логики игры, приобретение навыков работы с 3D графикой.

1. ПОСТАНОВКА ЗАДАЧИ

Необходимо разработать компьютерную программу, реализующую игру «Арканоид», на языке программирования С. Среда разработки - Borland C++ 5.5.

Данная программа реализует классический вариант игры «Арканоид», с несколькими уровнями сложности. Главное окно содержит платформу, двигающуюся вертикально от одной стенки к другой, блоки, зафиксированные на месте, и шарик, отскакивающий от платформы, стенок и блоков, разрушая последние при этом.

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

После запуска приложения на экране появляется игровое поле (рис. 1).

Рис. 1. Главное окно программы.

Пусть наше игровое поле находится внутри некоторой сферы. Тогда при помощи кнопок A и D можно перемещать камеру по параллелям сферы, а с помощью W и S - вверх и вниз по меридианам (рис.2).

Рис. 2. Движение камеры.

В правой части экрана находится информация о текущей игре.

На главном окне программы имеется меню, состоящее из двух пунктов: «Игра» и «Справка».

Меню «Игра» содержит следующие пункты (рис. 3):

·        «Новая игра»;

·        «Уровень сложности»;

·        «Выход».

Рис. 3. Меню «Игра».

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

Пункт меню «Уровень сложности» содержит следующие пункты:

·        «Сложный»;

·        «Нормальный»;

·        «Легкий».

Меню «Справка» содержит следующие пункты (рис. 4):

·        «Помощь»;

·        «О программе».

При выборе пункта «Помощь» в меню «Справка» пользователь найдет ответы на вопросы, возникшие у него при работе с приложением (рис. 5). А при выборе пункта «О программе» пользователь получит общее представление о продукте (рис. 6).

Рис. 4. Меню «Справка».

Рис. 5. Окно «Справка».

Рис. 6. Окно «О продукте»

Кнопками в правом верхнем углу окна можно свернуть, развернуть и закрыть окно, соответственно.

компьютерный игра программирование графика

2. ОПИСАНИЕ АЛГОРИТМА РЕШЕНИЯ

 

.1 ПАРАМЕТРЫ СЦЕНЫ И ФИГУР


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

Для прорисовки кирпичей используется матрица вершин и текстуры камня для кирпичей прочности больше 1 и текстуры дерева - для кирпичей прочности 1.

Для прорисовки игрового поля используется матрица вершин и текстура звездного неба.

Для прорисовки ракетки-платформы используется матрица вершин и текстура бетона.

Для прорисовки шарика и капсул-призов используется примитив сферы, параметры которой задаются в программе. Для шарика используется текстура металла.

Все текстуры хранятся в папке с приложением.

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

2.2 АЛГОРИТМ РАБОТЫ ПРОГРАММЫ


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


Вспомогательный алгоритм обработки сообщений



4. ОПИСАНИЕ ФУНКЦИЙ

) Модуль «Arkanoid.cpp»

В этом модуле заключены операторы инициализации компонентов приложения, создания главного окна приложения и дочерних окон, а так же выполнения приложения.

) Модуль «Main»

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

bool TForm1::bSetupPixelFormat(HDC hDC) - установка подходящего формата пикселей. Входной параметр: контекст окна.

void __fastcall TForm1::FormCreate(TObject *Sender) - событие при создании окна. Инициализирует некоторые элементы окна.

void __fastcall TForm1::FormDestroy(TObject *Sender) - событие при уничтожении окна. Вызывает функцию деинициализации графики.__fastcall TForm1::FormResize(TObject *Sender) - событие при изменении размеров окна, перерисовывает область просмотра OpenGL.

void __fastcall TForm1::Timer1Timer(TObject *Sender) - функция обработки сообщения таймера. Обновляет время.__fastcall TForm1::FormKeyDown(TObject *Sender, WORD &Key, TShiftState Shift) - обработка нажатий клавиш.__fastcall TForm1::FormMouseMove(TObject *Sender, TShiftState Shift, int X, int Y) - обработка движения мышки.

void TForm1::Draw() - функция прорисовки фона, игрового поля, шарика, кирпичей и ракетки.LoadGLTextures() - функция загрузки картинки и конвертирования в текстуру.TForm1::NewGame() - функция начала новой игры. В этой функции иницилизируются все необходимые начальные параметры.

void __fastcall TForm1::N2Click(TObject *Sender) - функция обработки выбора пункта меню «Новая игра».

void __fastcall TForm1::N8Click(TObject *Sender) - функция обработки выбора пункта меню «Сложный уровень сложности».

void __fastcall TForm1::N9Click(TObject *Sender) - функция обработки выбора пункта меню «Нормальный уровень сложности».

void __fastcall TForm1::N10Click(TObject *Sender) - функция обработки выбора пункта меню «Легкий уровень сложности».

void __fastcall TForm1::N4Click(TObject *Sender) - функция обработки выбора пункта меню «Выход». Завершает работу программы.TForm1::LoadLevel() - функция инициализации уровней. Выполняет инициализацию игровых параметров уровня.TForm1::IsFinish() - функция проверки завершения игры.

void TForm1::SetDifficulty(int iDiff) - функция инициализации уровня сложности. Входной параметр - идентификатор уровня сложности.

void __fastcall TForm1::FormCanResize(TObject *Sender, int &NewWidth, int &NewHeight, bool &Resize) - функция обработки события изменения размеров окна.__fastcall TForm1::N6Click(TObject *Sender) - функция обработки выбора пункта меню «Помощь». Вызывает соответствующее окно.__fastcall TForm1::N7Click(TObject *Sender) - функция обработки выбора пункта меню «О программе». Вызывает соответствующее окно.

void __fastcall TForm1::FormMouseDown(TObject *Sender, TMouseButton Button, TShiftState Shift, int X, int Y) - обработка нажатия левой клавши мыши. Параметры X, Y - координаты курсора мыши. Параметр Sender указывает на объект, вызвавший событие.

) Модуль «Ball»

В этом модуле реализуется класс Ball, описывающий шарик.

Интерфейс класса Ball:Ball

{:

float x, y, // координаты центра, dy, // скорость по координатам, // радиус; // скоростьactive; // движется ли мячseries; // количество кирпичей в серии

//конструктор(): x(), y(), v(SPEED), r(), dx(), dy(), active(false), series(0){}

void move(); //движение шарикаsetDefRad(); //вернуть радиус

void incRad(); //увеличить радиусBounce(Brick &, int, int); //отскок от кирпичейisCollision(Brick &, int, int); //столкновение с кирпичомDraw(GLuint); //прорисовка

};

Методы класса:

Ball() - конструктор.move() - определяет координаты шарика.setDefRad() - устанавливает значение радиуса шарика на начальное.

void incRad() - увеличивает радиус шарика.

void Bounce(Brick &, int, int) - определяет поведение шарика после столкновения с кирпичом. Входные параметры: кирпич, номер строки и столбца, в котором находится кирпич.

bool isCollision(Brick &, int, int) - определяет произошло ли столкновение с кирпичом. Входные параметры: кирпич, номер строки и столбца, в котором находится кирпич.

void Draw(GLuint) - прорисовка шарика. Входной параметр: идентификатор текстуры.

) Модуль «Board»

В этом модуле реализуется класс Board, описывающий платформу-ракетку.

Интерфейс класса Board:Board

{:x, y, //координаты платформы

w, h; //ширина и высотаlifes; //жизни(): x(100), y(340), lifes(3), w(40), h(8){} //конструкторexpand(); //расширить платформуsetDefSize(); //вернуть начальную ширинуcenter(); //возвращает координату х центра платформыDraw(GLuint); //прорисовка платформы

};

Методы класса:() - конструктор.expand() - увеличивает ширину платформы.setDefSize() - восстанавливает ширину платформы.center() - возвращает координату х центра платформы.Draw(GLuint) - выполняет прорисовку платформы. Входной параметр: идентификатор текстуры.

) Модуль «Brick»

В этом модуле реализуется класс Brick, описывающий кирпичи.

Интерфейс класса Brick:Brick

{:active; // активность кирпичаhit; // прочностьbonus; // бонус

float w, l, h;// ширина, длина, высота

// конструктор(): w(BRICKW), l(BRICKL), h(-BRICKW), hit(1), bonus(), active(false){};Draw(int, int, GLuint); //прорисовка

};

Методы класса:() - конструктор.Draw(int, int, GLuint) - функция прорисовки кирпича. Входные параметры: номер строки и столбца, в котором находится кирпич, и идентификатор текстуры.

) Модуль «Bonus»

В этом модуле реализуется класс Bonus, описывающий капсулы-призы.

Интерфейс класса Bonus:bonus{EMPTY, EXPAND, PLAYER, BALLINCR};Bonus

{:x, y, //координаты, //радиус, v; //скоростиtype; //типactive; //активность

//конструкторы():x(), y(), v(SPEED-2), dy(), r(6), type(EMPTY), active(false){}(float x_, float y_, bonus type_): x(x_), y(y_), v(SPEED-2),(6), dy(), type(type_), active(false){}

//движениеmove();

//прорисовкаDraw();

};

Методы класса:

Bonus() - конструктор по умолчанию.

Bonus(float x_, float y_, bonus type_) - конструктор. Входные параметры: координаты центра капсулы, тип бонуса.move() - определяет движение капсулы.Draw() - прорисовка капсулы.

) Модуль «About»

В этом модуле реализуется работа окна с информацией о программе.

Функции:

void __fastcall TForm3::Button1Click(TObject *Sender) - обработка нажатия кнопки «Закрыть».

) Модуль «Help»

В этом модуле реализуется работа окна со справочной информацией.

Функции:

void __fastcall TForm2::Button1Click(TObject *Sender) - обработка нажатия кнопки «Закрыть».

) Модуль «vars.h»

В этом модуле определены основные константы, используемые в программе.

5. РУКОВОДСТВО ПОЛЬЗОВАТЕЛЯ

После запуска приложения «Арканоид 3D» открывается главное окно программы (рис. 12), представляющее собой игровое поле, шарик на платформе и набор кирпичей. Для начала игры нужно запустить шарик нажатием клавиши «пробел» или левой кнопки мыши. Для того, чтобы выиграть, нужно двигая платформу отбивать шарик, разбивая при этом максимальное количество кирпичей. Двигать платформу можно с помощью клавиш «стрелка вправо» и «стрелка влево» или с помощью мыши.

Рис. 12.

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

Если шарик пролетает ниже уровня платформы и задевает нижнюю границу игрового поля, у игрока отнимается одна жизнь. Когда количество жизней становится равным нулю, игра заканчивается.

С помощью клавиш «W», «S», «A», «D» игрок может вращать игровое поле. Чтобы приостановить игру игрок может нажать клавишу «Р», а так же возобновить игру повторным нажатием клавиши.

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

Получить необходимую справочную информацию игрок может, выбрав пункт меню «Справка» (рис. 13), а информацию об авторе - выбрав пункт меню «О программе» (рис. 14).

Рис. 13.

Рис. 14.

ЗАКЛЮЧЕНИЕ

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

В ходе выполнения курсовой работы были решены все задачи, поставленные ранее.

Стоит отметить, что в дальнейшем программа может быть улучшена. Например, увеличить количество доступных бонусов, ввести «анти-бонусы», реализовать рейтинг игроков.

ЛИТЕРАТУРА

1.      Хилл Ф. OpenGL. Программирование компьютерной графики. Для профессионалов - СПб.: Питер, 2002. - 1088 с.: ил.

.        Райт Р.С.-мл., Липчак Б. OpenGL. Суперкнига, 3-е издание: Пер. с англ - М.: Издательский дом «Вильямс», 2006. - 1040 с.: ил.

.        Эйнджел Э. Интерактивная компьютерная графика. Вводный курс на базе OpenGL, 2 изд: Пер. с англ - М.: Издательский дом «Вильямс», 2001. - 592 с.: ил.

.        Херн Д, Бейкер М. Паулин. Компьютерная графика и стандарт OpenGL, 3-е изд: Пер. с англ - М.: Издательский дом «Вильямс», 2005. - 1168 с.: ил.

.        ГОСТ 19.701-90 (ИСО 5807-90). ЕСПД. Схемы алгоритмов, программ, данных и систем. Условные обозначения и правила выполнения.

ПРИЛОЖЕНИЕ

Текст программы

В файле Arkanoid.cpp:

//--------------------------------------

#include <vcl.h>

#pragma hdrstop

//--------------------------------------("Main.cpp", Form1);("About.cpp", Form3);("Help.cpp", Form2);

//--------------------------------------WinMain(HINSTANCE, HINSTANCE, LPSTR, int)

{

{>Initialize();>Title = "Arkanoid3D";>CreateForm(__classid(TForm1), &Form1);>CreateForm(__classid(TForm2), &Form2);>CreateForm(__classid(TForm3), &Form3);>Run();

}(Exception &exception)

{>ShowException(&exception);

}(...)

{

{Exception("");

}(Exception &exception)

{>ShowException(&exception);

}

}0;

}

//--------------------------------------

В файле vars.h:

#define INITX 150

#define INITY 100

#define WINH 800

#define WINW800

#define HEIGHT 350

#define WIDTH 300

#define BRICKL30

#define BRICKH15

#define BRICKW30

#define SPEED8

#define BRICK_ROWS 8

#define BRICK_COLS 10

#define TXTR 6

#pragma once

В файле Main.h:

//--------------------------------------

#ifndef MainH

#define MainH

//--------------------------------------

#include <Classes.hpp>

#include <Controls.hpp>

#include <StdCtrls.hpp>

#include <Forms.hpp>

#include <math.h>

#include <math.hpp>

#include <ComCtrls.hpp>

#include <ExtCtrls.hpp>

#include <Menus.hpp>

#include <fstream>

#include <string>

#include <iostream>

#include <GL/gl.h>

#include <GL/glu.h>

#include <GL/glaux.h>

#include "vars.h"

#include "Brick.h"

#include "Ball.h"

#include "Board.h"

//#pragma oncenamespace std;

//--------------------------------------TForm1: public TForm

{

__published:// IDE-managed Components*Timer1;*MainMenu1;*N1;*N2;*N3;*N4;*N5;*N6;*N7;*N8;*N9;*N10;*edtLevel;*edtScore;*edtTime;*edtLifes;__fastcall FormCreate(TObject *Sender);__fastcall FormDestroy(TObject *Sender);__fastcall FormResize(TObject *Sender);__fastcall FormPaint(TObject *Sender);__fastcall FormKeyDown(TObject *Sender, WORD &Key, TShiftState Shift);__fastcall Timer1Timer(TObject *Sender);__fastcall FormMouseMove(TObject *Sender, TShiftState Shift, int X,Y);__fastcall N2Click(TObject *Sender);__fastcall N8Click(TObject *Sender);__fastcall N9Click(TObject *Sender);__fastcall N4Click(TObject *Sender);__fastcall N10Click(TObject *Sender);__fastcall FormCanResize(TObject *Sender, int &NewWidth, int &NewHeight,&Resize);__fastcall N6Click(TObject *Sender);__fastcall N7Click(TObject *Sender);__fastcall FormMouseDown(TObject *Sender, TMouseButton Button,Shift, int X, int Y);:// User declarationsghRC; // указатель на контекст воспроизведения (Rendering Context)hDC; // дескриптор (контекст) устройства:// User declarations

__fastcall TForm1(TComponent* Owner);brick[BRICK_ROWS][BRICK_COLS];ball;board;bSetupPixelFormat(HDC);Draw();NewGame();LoadLevel();IsFinish();SetDifficulty(int);curTime, dTime;

};LoadGLTextures();

//--------------------------------------PACKAGE TForm1 *Form1;

//--------------------------------------

#endif

В файле Main.cpp:

//--------------------------------------

#include <vcl.h>

#pragma hdrstop

#include "Main.h"

#include "Help.h"

#include "About.h"

//--------------------------------------

#pragma package(smart_init)

#pragma resource "*.dfm"*Form1;tetta=91, phi=90;short level=1, score=0;[TXTR];V1[8][3]={

{INITX, INITY, BRICKH},

{INITX+WIDTH, INITY, BRICKH},

{INITX+WIDTH, INITY+HEIGHT, BRICKH},

{INITX, INITY+HEIGHT, BRICKH},

{INITX, INITY+HEIGHT, 1},

{INITX, INITY, 1},

{INITX+WIDTH, INITY, 1},

{INITX+WIDTH, INITY+HEIGHT, 1}

};

//--------------------------------------

__fastcall TForm1::TForm1(TComponent* Owner)

: TForm(Owner)

{

}

//--------------------------------------TForm1::bSetupPixelFormat(HDC hDC)

{pfd; //Создаем структуруpixelformat;.nSize = sizeof (PIXELFORMATDESCRIPTOR); //Размер структуры.nVersion = 1; //Версия структуры.dwFlags = PFD_DOUBLEBUFFER | PFD_SUPPORT_OPENGL | PFD_DRAW_TO_WINDOW;.iLayerType = PFD_MAIN_PLANE; //Тип поверхности.iPixelType = PFD_TYPE_RGBA; //Формат указания цвета.cColorBits = 16; //Глубина цвета.cDepthBits = 16; //Размер буфера глубины.cAccumBits = 0; //Общее число битовых плоскостей в буфере аккумулятора

pfd.cStencilBits = 0; //Размер буфера трафарета

if (!(pixelformat=ChoosePixelFormat(hDC, &pfd))){

MessageBox(NULL, "Невозможно выбрать формат пикселей", "Error", MB_OK);

return false;

}(!SetPixelFormat (hDC, pixelformat, &pfd)){(NULL, "Невозможно установить формат пикселей", "Error", MB_OK);

return false;

}true;

}

//--------------------------------------__fastcall TForm1::FormCreate(TObject *Sender)

{.x=board.center();.y=board.y;();=0;->Checked = true;>Text="Время: 00:00";>Text="Очки: 0";>Text="Жизни: " + IntToStr(board.lifes);= GetDC(Handle); //Handle - дескриптор окна (hwnd в WinAPI)(!bSetupPixelFormat(hDC)) //Устанавливаем формат пикселей;= wglCreateContext(hDC); //Создаем контекст воспроизведения(hDC, ghRC); //Делаем его текущим(GL_TEXTURE_2D);(1.0, 1.0, 1.0, 1.0); //Цвет экрана при очищении(GL_COLOR_MATERIAL); //Разрешаем задавать цвет объектам

glEnable(GL_DEPTH_TEST); //Тест глубины для объемности изображения

glEnable(GL_LIGHTING); //Разрешаем освещение

glEnable(GL_LIGHT0); //Включили освещение 0

glEnable(GL_LINE_SMOOTH);

glShadeModel(GL_SMOOTH); // Разрешение сглаженного закрашивания

glDepthFunc(GL_LEQUAL); // Тип теста глубины

glHint(GL_PERSPECTIVE_CORRECTION_HINT, GL_NICEST); // Улучшенные вычисления перспективы();// Загрузка текстурp[4]={0, 100, -300, 0};(GL_LIGHT0, GL_POSITION, p); //Установка позиции освещения

GLfloat LightAmbient[]= { 0.5f, 0.5f, 0.5f, 1.0f }; // Значения фонового света ( НОВОЕ )

glLightfv(GL_LIGHT0, GL_AMBIENT, LightAmbient); // Установка Фонового Света

}

//--------------------------------------__fastcall TForm1::FormDestroy(TObject *Sender)

{(ghRC){(hDC, 0);(ghRC);

}(hDC) ReleaseDC(Handle, hDC);

}

//--------------------------------------__fastcall TForm1::FormResize(TObject *Sender)

{(-INITX, -INITY, WINW, WINH);(GL_PROJECTION);();(45, WINW/WINH, 1, 900);(-260, -300, 0);(GL_MODELVIEW);();

}

//--------------------------------------TForm1::Draw()

{(GL_DEPTH_BUFFER_BIT | GL_COLOR_BUFFER_BIT);();(GL_TEXTURE_2D, texture[0]);f(255, 255, 255);(GL_QUADS);f(0, 0); glVertex3f(0, 0, -850);f(1, 0); glVertex3f(WINW+200, 0, -850);f(1, 1); glVertex3f(WINW+200, WINH, -850);f(0, 1); glVertex3f(0, WINH, -850);();(INITX+WIDTH/2, INITY+HEIGHT/2, 0);(180, 0, 0, 1);angle1 = tetta*M_PI/180,= -phi*M_PI/180;rd=700;x = rd*sin(angle1)*cos(angle2),= rd*sin(angle1)*sin(angle2),= rd*cos(angle1);(x, y, z, 0, 0, 0, 0, 1, 0);(-INITX-WIDTH/2, -INITY-HEIGHT/2, 0);.Draw(texture[5]);(GL_TEXTURE_2D, texture[1]);

//игровое полеub(255, 255, 255);(GL_QUADS);f(0.0f, 0.0f); glVertex3f(V1[0][0], V1[0][1], V1[0][2]);f(1.0f, 0.0f); glVertex3f(V1[1][0], V1[1][1], V1[1][2]);f(1.0f, 1.0f); glVertex3f(V1[2][0], V1[2][1], V1[2][2]);f(0.0f, 1.0f); glVertex3f(V1[3][0], V1[3][1], V1[3][2]);f(0.0f, 0.0f); glVertex3f(V1[0][0], V1[0][1], V1[0][2]);f(1.0f, 0.0f); glVertex3f(V1[1][0], V1[1][1], V1[1][2]);f(1.0f, 1.0f); glVertex3f(V1[6][0], V1[6][1], V1[6][2]);f(0.0f, 1.0f); glVertex3f(V1[5][0], V1[5][1], V1[5][2]);f(0.0f, 0.0f); glVertex3f(V1[0][0], V1[0][1], V1[0][2]);f(1.0f, 0.0f); glVertex3f(V1[3][0], V1[3][1], V1[3][2]);f(1.0f, 1.0f); glVertex3f(V1[4][0], V1[4][1], V1[4][2]);f(0.0f, 1.0f); glVertex3f(V1[5][0], V1[5][1], V1[5][2]);f(0.0f, 0.0f); glVertex3f(V1[4][0], V1[4][1], V1[4][2]);f(1.0f, 0.0f); glVertex3f(V1[5][0], V1[5][1], V1[5][2]);f(1.0f, 1.0f); glVertex3f(V1[6][0], V1[6][1], V1[6][2]);f(0.0f, 1.0f); glVertex3f(V1[7][0], V1[7][1], V1[7][2]);f(0.0f, 0.0f); glVertex3f(V1[1][0], V1[1][1], V1[1][2]);f(1.0f, 0.0f); glVertex3f(V1[2][0], V1[2][1], V1[2][2]);f(1.0f, 1.0f); glVertex3f(V1[7][0], V1[7][1], V1[7][2]);f(0.0f, 1.0f); glVertex3f(V1[6][0], V1[6][1], V1[6][2]);f(0.0f, 0.0f); glVertex3f(V1[2][0], V1[2][1], V1[2][2]);f(1.0f, 0.0f); glVertex3f(V1[3][0], V1[3][1], V1[3][2]);f(1.0f, 1.0f); glVertex3f(V1[4][0], V1[4][1], V1[4][2]);f(0.0f, 1.0f); glVertex3f(V1[7][0], V1[7][1], V1[7][2]);();.Draw(texture[2]);(GL_TEXTURE_2D, texture[3]);

//блоки(int i=0; i<BRICK_ROWS; i++){(int j=0; j<BRICK_COLS; j++){&b=brick[i][j];(b.active){f(0.15*j, 0.11*i, 0.12*(BRICK_COLS-j+1));(b.hit==1).Draw(i, j, texture[3]);.Draw(i, j, texture[4]);

}(b.bonus.active).bonus.Draw();

}

}();(hDC);

}

//--------------------------------------__fastcall TForm1::FormPaint(TObject *Sender)

{->Draw();

}

//--------------------------------------__fastcall TForm1::FormKeyDown(TObject *Sender, WORD &Key,Shift)

{(Key){VK_LEFT:{(board.x>=13).x-=13;if(board.x>0).x=0;(!ball.active){.x=board.center();.y=board.y-ball.r;

};

}VK_RIGHT:{(board.x + board.w+13 <= WIDTH).x+=13;if(board.x<WIDTH).x=WIDTH-board.w;(!ball.active){.x=board.center();.y=board.y-ball.r;

};

}VK_SPACE:{(!ball.active && board.lifes!=0){.active=true;.dx=0;.series=0;.dy=-ball.v;=Time();

};

}'A':{=2;;

}'D':{+=2;;

}'S':{(tetta<178)+=2;;

}'W':{(tetta>2)=2;;

}'P':{(Timer1->Enabled)+=Time()-curTime;=Time();->Enabled=!Timer1->Enabled;;

}

}

}

//--------------------------------------__fastcall TForm1::Timer1Timer(TObject *Sender)

{time=(Time()+dTime-curTime);(ball.active){>Text="Время: "+time.FormatString("nn:ss");.move();(int i=0; i<BRICK_ROWS; i++){(int j=0; j<BRICK_COLS; j++){&b=brick[i][j];(ball.isCollision(b, i, j)){.Bounce(b, i, j);(-b.hit==0){.active=false;(b.bonus.type != EMPTY){.bonus.active=true;.bonus.x=(j+0.5)*b.w;.bonus.y=(i+0.5)*b.l;.bonus.dy=b.bonus.v;

}(IsFinish()){.active=false;.dx=0;.dy=0;s="Вы прошли уровень "+IntToStr(level)+", набрав " +(score)+" очков за " +(Time()+curTime).FormatString("nn:ss")+"! Начать следующий?";iResult=MessageBox(Form1->Handle, s.c_str(), "Уровень пройден!", MB_YESNO|MB_ICONINFORMATION);(iResult == IDNO)->Close();++;();=0;

}

}+=50+10*(++ball.series-1);>Text="Очки: "+IntToStr(score);o;

}

}

}

}:(int i=0; i<BRICK_ROWS; i++)(int j=0; j<BRICK_COLS; j++)(brick[i][j].bonus.active)[i][j].bonus.move();();

}

//--------------------------------------__fastcall TForm1::FormMouseMove(TObject *Sender, TShiftState Shift, int X,Y)

{viewport[4];mvm[16];projm[16];wx, wy, wz;zval;(GL_VIEWPORT, viewport);(GL_MODELVIEW_MATRIX, mvm);(GL_PROJECTION_MATRIX, projm);(X, Y, 1, 1, GL_DEPTH_COMPONENT, GL_FLOAT, &zval);(X, 575, zval, mvm, projm, viewport, &wx, &wy, &wz);(wx>=INITX+board.w*0.5 && wx<=INITX+WIDTH-board.w*0.5).x=wx-INITX-board.w*0.5;(!ball.active){.x=board.center();.y=board.y-ball.r;

}

}

//--------------------------------------

TForm1::NewGame()

{->Enabled=false;iResult=MessageBox(Handle, "Вы действительно хотите начать новую игру?", "Новая игра", MB_YESNO|MB_ICONQUESTION);(iResult == IDNO){->Enabled=true;;

}(iResult == IDYES)->Enabled=true;=1;();.active=false;.dx=0;.dy=0;.lifes=3;=0;=0;>Text="Время: 00:00";>Text="Очки: 0";>Text="Жизни: 3";

}__fastcall TForm1::N2Click(TObject *Sender)

{();

}

//--------------------------------------__fastcall TForm1::N8Click(TObject *Sender)

{(!N8->Checked)(2);

}

//--------------------------------------__fastcall TForm1::N9Click(TObject *Sender)

{(!N9->Checked)(1);

}

//--------------------------------------__fastcall TForm1::N4Click(TObject *Sender)

{->Close();

}

//--------------------------------------TForm1::LoadLevel()

{s = "level" + IntToStr(level) + ".txt";myfile (s.c_str());(myfile.is_open()){(time(NULL));i=0;line;exp=false,=false,=false;(getline(myfile, line)){(unsigned int j=0; j<BRICK_COLS && i<BRICK_ROWS; j++){(line[j]>='0' && line[j]<='3'){[i][j].hit=line[j]-'0';t=EMPTY;(line[j]=='0')[i][j].active=false;{[i][j].active=true;num=random(10);(num==0 && !exp){=EXPAND;=true;

}if(num==1 && !plr){=PLAYER;=true;

}if(num==2 && ! ballincr){=BALLINCR;=true;

}

}[i][j].bonus = Bonus((j+0.5)*brick[i][j].w, (i+0.5)*brick[i][j].l, t);

}

}++;

}.close();.setDefSize();.setDefRad();>Text="Уровень: "+IntToStr(level);

}{n=MessageBox(Handle, "Не удалось открыть файл уровней!", "Ошибка!", MB_RETRYCANCEL|MB_ICONERROR);(n==IDCANCEL)();if(n==IDRETRY)();

}

}TForm1::IsFinish()

{(int i=0; i<BRICK_ROWS; i++)(int j=0; j<BRICK_COLS; j++)(brick[i][j].active == true)false;true;

}TForm1::SetDifficulty(int iDiff)

{();(iDiff){2:{->Interval=30;->Checked = false;->Checked = false;->Checked = true;;

}1:{->Interval=50;->Checked = false;->Checked = true;->Checked = false;;

}0:{->Interval=70;->Checked = true;->Checked = false;->Checked = false;;

}

}__fastcall TForm1::N10Click(TObject *Sender)

{

if(!N10->Checked)

SetDifficulty(0);

}

// Загрузка картинки и конвертирование в текстуру

GLvoid LoadGLTextures()

{

// Загрузка картинки

AUX_RGBImageRec *texture1;

for(int i=0; i<TXTR; i++){s="tex"+IntToStr(i)+".bmp";= auxDIBImageLoad(s.c_str());

// Создание текстуры(1, &texture[i]);(GL_TEXTURE_2D, texture[i]);(GL_TEXTURE_2D, GL_TEXTURE_MAG_FILTER, GL_LINEAR);(GL_TEXTURE_2D, GL_TEXTURE_MIN_FILTER, GL_LINEAR);D(GL_TEXTURE_2D, 0, 3, texture1->sizeX, texture1->sizeY, 0,_RGB, GL_UNSIGNED_BYTE, texture1->data);

}

}

//--------------------------------------__fastcall TForm1::FormCanResize(TObject *Sender, int &NewWidth,&NewHeight, bool &Resize)

{=false;

}

//--------------------------------------__fastcall TForm1::N6Click(TObject *Sender)

{->ShowModal();

}

//--------------------------------------__fastcall TForm1::N7Click(TObject *Sender)

{->ShowModal();

}

//--------------------------------------__fastcall TForm1::FormMouseDown(TObject *Sender, TMouseButton Button,Shift, int X, int Y)

{(!ball.active && board.lifes!=0 && Button == mbLeft){.active=true;.dx=0;.series=0;.dy=-ball.v;=Time();

}

}

//--------------------------------------

В файле Ball.h:

//--------------------------------------

#ifndef BallH

#define BallH

#include "vars.h"

#pragma onceBrick;Ball

{:x, y, // координаты центра

dx, dy, // скорость по координатам, // радиус; // скоростьactive; // движется ли мячseries; // количество кирпичей в серии

//конструктор(): x(), y(), v(SPEED), r(), dx(), dy(), active(false), series(0){}

void move(); //движение шарикаsetDefRad(); //вернуть радиус

void incRad(); //увеличить радиусBounce(Brick &, int, int); //отскок от кирпичейisCollision(Brick &, int, int); //столкновение с кирпичомDraw(GLuint); //прорисовка

};

//--------------------------------------

#endif

В файле Ball.cpp:

//--------------------------------------

#pragma hdrstop

#include "Main.h"

#include "Ball.h"

//--------------------------------------

#pragma package(smart_init)Ball::move()

{+=dx;+=dy;(x-r<=0)

{=r;*=-1;

}if(y-r<=0)

{=r;*=-1;

}if(x+r>=WIDTH)

{=WIDTH-r;*=-1;

}if(y+r>=Form1->board.y && y+r<=Form1->board.y+Form1->board.h && x>Form1->board.x && x<Form1->board.x+Form1->board.w)

{=Form1->board.y-r;=0;alpha = M_PI/2+M_PI/3*(Form1->board.x+Form1->board.w*0.5-x)/(Form1->board.w*0.5);t=dy;=-sin(alpha)*sqrt(t*t+dx*dx);=cos(alpha)*sqrt(t*t+dx*dx);

}if(y>HEIGHT)

{=false;->dTime+=Time()-Form1->curTime;=Form1->board.center();=Form1->board.y-r;=0;=0;->board.setDefSize();();->edtLifes->Text="Жизни: " + IntToStr(-Form1->board.lifes);(Form1->board.lifes==0){iResult=MessageBox(Form1->Handle, "Вы проиграли. Начать новую игру?", "Вы проиграли", MB_YESNO);

if(iResult == IDYES)->NewGame();(iResult == IDNO)->Close();

}

}

}Ball::setDefRad()

{=7;

}Ball::incRad()

{+=2;

}Ball::Bounce(Brick &b, int i, int j)

{tx = x-j*b.w-b.w*0.5f,= y-i*b.l-b.l*0.5f;(-abs(tx)+abs(ty)>0)*=-1;if(abs(tx)-abs(ty)>0)*=-1;{(dx>0){(x < j*b.w)*=-1;

}if(x > (j+1)*b.w)*=-1;(dy>0){(y < i*b.l)*=-1;

}if(y > (i+1)*b.l)*=-1;

}

}Ball::isCollision(Brick &br, int row, int col)

{w=br.w, l=br.l;(br.active){(abs(x-col*w-w*0.5-2)<=r+w*0.5 && abs(y-row*l-l*0.5-2)<=r+l*0.5){(sqrt((col*w+w*0.5-x)*(col*w+w*0.5-x) + (row*l+l*0.5-y)*(row*l+l*0.5-y))

(w*0.5-1)*sqrt(2.0) - r > r*(sqrt(2.0)-1))0;1;

}

}0;

}Ball::Draw(GLuint txtr)

{(GL_TEXTURE_2D, txtr);

//шар*s;= gluNewQuadric();ub(255, 255, 255);(INITX+x, INITY+y, -BRICKH/2);(s, GL_TRUE);(s, GLU_FILL);(s, r, 100, 100);(-INITX-x, -INITY-y, BRICKH/2);(s);

}

В файле Board.h:

//--------------------------------------

#ifndef BoardH

#define BoardH

#pragma onceBoard

{:x, y, //координаты платформы, h; //ширина и высота

int lifes; //жизни

Board(): x(100), y(340), lifes(3), w(40), h(8){} //конструктор

void expand(); //расширить платформу

void setDefSize(); //вернуть начальную ширину

float center(); //возвращает координату х центра платформы

void Draw(GLuint); //прорисовка платформы

};

//--------------------------------------

#endif

В файле Board.cpp:

//--------------------------------------

#pragma hdrstop

#include "Main.h"

#include "Board.h"

//--------------------------------------

#pragma package(smart_init)Board::expand()

{*=1.5;(x+w>WIDTH)=w*0.5;

}Board::setDefSize()

{=40;

}Board::center()

{x+w*0.5;

}Board::Draw(GLuint txtr)

{V[8][3]={

{INITX+x, INITY+y, 0},

{INITX+x+w, INITY+y, 0},

{INITX+x+w, INITY+y+h, 0},

{INITX+x, INITY+y+h, 0},

{INITX+x, INITY+y+h, -BRICKH},

{INITX+x, INITY+y, -BRICKH},

{INITX+x+w, INITY+y, -BRICKH},

{INITX+x+w, INITY+y+h, -BRICKH}

};(GL_TEXTURE_2D, txtr);

//платформаub(255, 255, 255);(GL_QUADS);f(0.0f, 0.0f); glVertex3f(V[0][0], V[0][1], V[0][2]);f(1.0f, 0.0f); glVertex3f(V[1][0], V[1][1], V[1][2]);f(1.0f, 1.0f); glVertex3f(V[2][0], V[2][1], V[2][2]);f(0.0f, 1.0f); glVertex3f(V[3][0], V[3][1], V[3][2]);f(0.0f, 0.0f); glVertex3f(V[0][0], V[0][1], V[0][2]);f(1.0f, 0.0f); glVertex3f(V[1][0], V[1][1], V[1][2]);f(1.0f, 1.0f); glVertex3f(V[6][0], V[6][1], V[6][2]);f(0.0f, 1.0f); glVertex3f(V[5][0], V[5][1], V[5][2]);f(0.0f, 0.0f); glVertex3f(V[0][0], V[0][1], V[0][2]);f(1.0f, 0.0f); glVertex3f(V[3][0], V[3][1], V[3][2]);f(1.0f, 1.0f); glVertex3f(V[4][0], V[4][1], V[4][2]);f(0.0f, 1.0f); glVertex3f(V[5][0], V[5][1], V[5][2]);f(0.0f, 0.0f); glVertex3f(V[4][0], V[4][1], V[4][2]);f(1.0f, 0.0f); glVertex3f(V[5][0], V[5][1], V[5][2]);f(1.0f, 1.0f); glVertex3f(V[6][0], V[6][1], V[6][2]);f(0.0f, 1.0f); glVertex3f(V[7][0], V[7][1], V[7][2]);f(0.0f, 0.0f); glVertex3f(V[1][0], V[1][1], V[1][2]);f(1.0f, 0.0f); glVertex3f(V[2][0], V[2][1], V[2][2]);f(1.0f, 1.0f); glVertex3f(V[7][0], V[7][1], V[7][2]);f(0.0f, 1.0f); glVertex3f(V[6][0], V[6][1], V[6][2]);f(0.0f, 0.0f); glVertex3f(V[2][0], V[2][1], V[2][2]);f(1.0f, 0.0f); glVertex3f(V[3][0], V[3][1], V[3][2]);f(1.0f, 1.0f); glVertex3f(V[4][0], V[4][1], V[4][2]);f(0.0f, 1.0f); glVertex3f(V[7][0], V[7][1], V[7][2]);();

}

В файле Brick.h:

//--------------------------------------

#ifndef BrickH

#define BrickH

#include "Bonus.h"

#include "vars.h"

#pragma onceBrick

{:active; // активность кирпичаhit; // прочностьbonus; // бонус w, l, h;// ширина, длина, высота

// конструктор(): w(BRICKW), l(BRICKL), h(-BRICKW), hit(1), bonus(), active(false){};Draw(int, int, GLuint); //прорисовка

};

//--------------------------------------

#endif

В файле Brick.cpp:

//--------------------------------------

#pragma hdrstop

#include "Main.h"

#include "Brick.h"

//--------------------------------------

#pragma package(smart_init)Brick::Draw(int i, int j, GLuint txtr)

{(GL_TEXTURE_2D, txtr);(GL_QUADS);k=1.0f;f(0.0f, 0.0f);f(INITX+j*w+k, INITY+i*l+k, 0);//0f(1.0f, 0.0f);f(INITX+(j+1)*w-k, INITY+i*l+k, 0);//1f(1.0f, 1.0f);f(INITX+(j+1)*w-k, INITY+(i+1)*l-k, 0);//2f(0.0f, 1.0f);f(INITX+j*w+k, INITY+(i+1)*l-k, 0);//3f(0.0f, 0.0f);f(INITX+j*w+k, INITY+i*l+k, 0);//0f(1.0f, 0.0f);f(INITX+(j+1)*w-k, INITY+i*l+k, 0);//1f(1.0f, 1.0f);f(INITX+(j+1)*w-k, INITY+i*(l+k), h);//6f(0.0f, 1.0f);f(INITX+j*w+k, INITY+i*(l+k), h);//5f(0.0f, 0.0f);f(INITX+(j+1)*w-k, INITY+(i+1)*l-k, 0);//2f(1.0f, 0.0f);f(INITX+(j)*w+k, INITY+(i+1)*l-k, 0);//3f(1.0f, 1.0f);f(INITX+(j)*w+k, INITY+(i+1)*l-k, h);//4f(0.0f, 1.0f);f(INITX+(j+1)*w-k, INITY+(i+1)*l-k, h);//7f(0.0f, 0.0f);f(INITX+j*w+k, INITY+i*l+k, 0);//0f(1.0f, 0.0f);f(INITX+j*w+k, INITY+(i+1)*l-k, 0);//3f(1.0f, 1.0f);f(INITX+j*w+k, INITY+(i+1)*l-k, h);//4f(0.0f, 1.0f);f(INITX+j*w+k, INITY+i*l+k, h);//5f(0.0f, 0.0f);f(INITX+(j)*w+k, INITY+(i+1)*l-k, h);//4f(1.0f, 0.0f);f(INITX+j*w+k, INITY+i*l+k, h);//5f(1.0f, 1.0f);f(INITX+(j+1)*w-k, INITY+(i)*l+k, h);//6f(0.0f, 1.0f);f(INITX+(j+1)*w-k, INITY+(i+1)*l-k, h);//7f(0.0f, 0.0f);f(INITX+(j+1)*w-k, INITY+(i)*l+k, 0);//1f(1.0f, 0.0f);f(INITX+(j+1)*w-k, INITY+(i+1)*l-k, 0);//2f(1.0f, 1.0f);f(INITX+(j+1)*w-k, INITY+(i+1)*l-k, h);//7f(0.0f, 1.0f);f(INITX+(j+1)*w-k, INITY+(i)*l+k, h);//6();

}

В файле Bonus.h:

//--------------------------------------

#ifndef BonusH

#define BonusH

#include "vars.h"

#pragma oncebonus{EMPTY, EXPAND, PLAYER, BALLINCR};Bonus

{:x, y, //координаты, //радиус, v; //скоростиtype; //типactive; //активность

//конструкторы():x(), y(), v(SPEED-2), dy(), r(6), type(EMPTY), active(false){}(float x_, float y_, bonus type_): x(x_), y(y_), v(SPEED-2),(6), dy(), type(type_), active(false){}

//движениеmove();

//прорисовкаDraw();

};

//--------------------------------------

#endif

В файле Bonus.cpp:

//--------------------------------------

#pragma hdrstop

#include "Main.h"

#include "Bonus.h"

//--------------------------------------

#pragma package(smart_init)Bonus::move()

{+=dy;(y+r>=Form1->board.y && y+r<=Form1->board.y+Form1->board.h

&& x>Form1->board.x && x<Form1->board.x+Form1->board.w){(type){EMPTY: break;EXPAND:{->board.expand();=false;;

}PLAYER:{->edtLifes->Text="Жизни: " + IntToStr(++Form1->board.lifes);=false;;

}BALLINCR:{->ball.incRad();=false;;

}: break;

}

}if(y>HEIGHT)=false;

}Bonus::Draw()

{(type){EXPAND:{ub(0, 255, 0);;

}PLAYER:{ub(255, 216, 0);;

}BALLINCR:{ub(0, 0, 255);;

}: break;

}(INITX+x, INITY+y, -BRICKH/2);(6);(-INITX-x, -INITY-y, BRICKH/2);

}

В файле About.cpp:

//--------------------------------------

#include <vcl.h>

#pragma hdrstop

#include "About.h"

//--------------------------------------

#pragma package(smart_init)

#pragma resource "*.dfm"*Form3;

//--------------------------------------

__fastcall TForm3::TForm3(TComponent* Owner)

: TForm(Owner)

{

}

//--------------------------------------__fastcall TForm3::Button1Click(TObject *Sender)

{->Close();

}

//--------------------------------------

В файле About.h:

//--------------------------------------

#ifndef AboutH

#define AboutH

//--------------------------------------

#include <Classes.hpp>

#include <Controls.hpp>

#include <StdCtrls.hpp>

#include <Forms.hpp>

#include <ExtCtrls.hpp>

#include <Graphics.hpp>

//--------------------------------------TForm3: public TForm

{

__published:// IDE-managed Components*Button1;*Label1;*Label2;*Label3;*Label4;*Label5;*Label6;*Label7;*Image1;*Label8;__fastcall Button1Click(TObject *Sender);:// User declarations:// User declarations

__fastcall TForm3(TComponent* Owner);

};

//--------------------------------------PACKAGE TForm3 *Form3;

//--------------------------------------

#endif

В файле Help.cpp:

//--------------------------------------

#include <vcl.h>

#pragma hdrstop

#include "Help.h"

//--------------------------------------

#pragma package(smart_init)

#pragma resource "*.dfm"*Form2;

//--------------------------------------

__fastcall TForm2::TForm2(TComponent* Owner)

: TForm(Owner)

{

}

//--------------------------------------__fastcall TForm2::Button1Click(TObject *Sender)

{();

}

//--------------------------------------

В файле Help.h:

//--------------------------------------

#ifndef HelpH

#define HelpH

//--------------------------------------

#include <Classes.hpp>

#include <Controls.hpp>

#include <StdCtrls.hpp>

#include <Forms.hpp>

#include <ComCtrls.hpp>

//--------------------------------------TForm2: public TForm

{

__published:// IDE-managed Components*Label1;*Label2;*Label3;*Label4;*Label5;*Label6;*Label7;*Label8;*Label9;*Label10;*Label11;*Label12;*Label13;*Label14;*Label15;*Label16;*Label17;*Label18;*Label19;*Label20;*Label21;*Label22;*Button1;*Label23;*Label24;*Label25;*Label26;*Label27;*Label28;*Label29;__fastcall Button1Click(TObject *Sender);:// User declarations:// User declarations

__fastcall TForm2(TComponent* Owner);

};

//--------------------------------------PACKAGE TForm2 *Form2;

//--------------------------------------

#endif

Похожие работы на - Компьютерная программа, реализующая игру 'Арканоид'

 

Не нашли материал для своей работы?
Поможем написать уникальную работу
Без плагиата!