Компьютерная игра "Zuma"

Разработка программы казуальной игры "Zuma Deluxe" на языке С\С++. Использование стиля древних инков и ацтеков, возможностей графического движка HGE version 1.53. Назначение основных классов игры. Руководство пользователя, содержание главного меню.

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

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

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

Размещено на http://www.allbest.ru/

Отчет по курсовому проекту

на тему

Компьютерная игра "Zuma”

Содержание

  • Задание
  • Введение
  • 1. Теория
  • 2. Практика
  • 3. Руководство пользователя
  • Заключение
  • Список использованных источников
  • Приложения

Задание

Задание курсовой работы заключалось в том, чтобы написать игру "Zuma Deluxe" на языке С\С++. Создать как можно более похожую на исходную программу. "Zuma Deluxe" представляет собой двухмерный тир. Расстреливать надо очень длинную змейку, неспешно движущуюся из точки А в точку В. Играющему нужно её остановить. Если она все же вдруг достигает конечной точки, то игроку засчитывают проигрыш. Змейка состоит из множества цветных шаров, а игрок управляет зелёной лягушкой, которая плюётся в этот подвижный состав точно такими же цветными шарами. При попадании шарик заскакивает внутрь змейки, раздвигая соседние шары, и становиться её частью. Добавлять шарики нужно таким образом, чтобы в змейке получались последовательности из трёх и более шаров одного цвета. В результате эти шары исчезнут, а длина змейки за счёт этого уменьшится. Составлять последовательности нужно до тех пор, пока от змейки вообще ничего не останется.

Введение

Компьютерная головоломка Zuma увидела свет в конце 2003 года благодаря известному в мире казуальных игр разработчику PopCapGame. И уже в 2004 году игра завоевала первую награду - "Игра года" от RealArcade. Zuma стала бестселлером и до сих пор привлекает интерес большинства поклонников игр жанра casual. Существует всего 3 версии игры: Zuma, Zuma Deluxe (расширенная версия) и Zuma's Revenge!

Казалось бы, чего нового можно придумать в двухмерных играх, всё и так уже есть. Но и в наше время придумывают совершенно новые концепции игрового процесса. Яркий пример - игра "Zuma Deluxe". Процесс разбавляется временно появляющимися бонусами, такими как, например лазерная наводка, взрыв, радужные цвета, остановка или даже обратный ход шариков. Кроме того, особо учитываются попадания сквозь поток шариков, серия результативных попаданий без ошибок, время выполнения уровней.

В "Zuma" использован стиль древних инков и ацтеков, им пронизано всё вокруг. Выбор уровней происходит под сводами ацтекских храмов, на уровнях змейки бегут по каменным желобкам с узнаваемыми орнаментами, главная героиня - лягушка общается с каменным божеством, даже на цветных шариках изображены рожицы индейских идолов. Единый оригинальный стиль делает игру запоминающейся и узнаваемой. Подходит практически любому возрасту и социальному статусу. Игра Тренирует сообразительность, реакцию, логику и глазомер.

1. Теория

Моя игра написана с использованием графического движка HGE version 1.53. В этом разделе я опишу кратко его возможности.

Это полнофункциональное посреднеческая библиотека для всех, кто хочет разрабатывать быстро и легко качественные коммерческие 2D игры.

HGE работает на Microsoft Windows 98, 2000, NT, ME, XP and требует DirectX 8.0. Она даже запустится на low-end видеокартах, включая встроенные, такие как Intel Solano (i815 chipset). HGE можно использловать практически с любым C++ компилятором включая Visual C++, Borland C++, MinGW и Metrowerks Codewarrior.

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

Спрайты и анимация

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

Шрифты

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

Система частиц и сетка искажения

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

Менеджер ресурсов

Powerful resource script; on the fly script switching; create complex objects with just a single function call; fully automated memory management; precaching and purging of specific resource groups.

Графический интерфес пользователя

Простое и гибкое управление контролами; стандартные контролы: текст, кнопки и ползунки; поддержка сильно активных, анимированных ГУИ.

Векторы и цвета

Полный набор операций и функций для поддержки 2д векторов; полный набор операций для вычислений с цветами в формате ARGB; аппаратное преобразование цветов; фиксирование цветов.

Всю информации, по использованию этой библиотеки я брала на сайте gamesmaker.ru (там расположена документации на русском об этой библиотеке).

Интерфейсные функции

· hgeCreateВозвращает указатель на интерфейс HGE.

· ReleaseОсвобождает полученный интерфейс HGE.

Системные функции

· System_ShutdownВосстанавливает видеорежим и освобождает выделенные ресурсы.

· System_StartНачинает выполнять определенную пользователем функцию кадра.

· System_SetStateУстанавливает внутреннюю переменную системы.

Функции работы с таймером

· Timer_GetTimeВозвращает время, прошедшее после вызова функции System_Initiate.

· Timer_GetDeltaВозвращает время, прошедшее с последнего вызова функции кадра.

Графические функции

· Gfx_BeginSceneНачинает вывод графики.

· Gfx_EndSceneЗаканчивает вывод графики и отображает буфер на экране.

· Gfx_ClearОчищает цель вывода и z-буфер.

С помощью этих функций и некоторых других предоставленных этой библиотекой, я написала игру "Zuma Deluxe".

2. Практика

В процессе создания игры были разработаны четыре класса: Player, Game, BallPath, hgeGUIMenuItem и Forminput. У каждого из классов своё особое назначение. Их задачу можно легко определить из их названия. А теперь подробнее о каждом из них.

класс Player

Этот класс отвечает за действия игрока, в игре игроком является лягушка, которой и управляет человек.

Класс устроен довольно простою

Три public поля:

· int level (назначает уровень игрока);

· int life (сколько у игрока осталось жизней);

· float fx,fy (координаты лягушки на экране, зависит от уровня игрока).

Так же в классе имеется ряд полезных функций:

· bool ChekBall (Ball ListBall [20], int i) - вызывается, когда мы достаем шарик из цепочки, для проверки нет ли на этом месте три шарика одинакового цвета;

· void DrawFrogBall (Ball ListBall [20], int i) - вычисляет координаты всех шариков, после изъятия одного из цепочки;

· void DrawBallAfter (Ball ListBall [20], int i, int frog) - вычисляет координаты всех шариков, после вставки в цепочку шарика;

· int GetBall (HGE *hge,Ball ListBall [20]) - вычисляет по какому шарику кликнул игрок и вызывает функцию DrawFrogBall;

int Player:: GetBall (HGE *hge,Ball ListBall [20])

{

if (hge->Input_GetKeyState (HGEK_LBUTTON) ==true)

{

float mx,my;

// bool check;

hge->Input_GetMousePos (&mx,&my);

for (int i=0; i<20; i++)

{

if ( (ListBall [i]. x<=mx&&mx<=ListBall [i]. x+30) && (ListBall [i]. y<=my&&my<=ListBall [i]. y+30))

{

if (ListBall [i]. explosition==false)

DrawFrogBall (ListBall, i);

if (ChekBall (ListBall, i) ==true)

return 2;

return 1;

}

else

continue;

}

return 0;

}

return 0;

}

bool PushBall (HGE *hge,Ball ListBall [20], int frog) - вычисляет после какого шарика игрок хочет вставить свой шарик и вызывает функци. DrawBallAfter;

bool Player:: PushBall (HGE *hge,Ball ListBall [20], int frog)

{

if (hge->Input_GetKeyState (HGEK_LBUTTON) ==true)

{

float mx,my;

hge->Input_GetMousePos (&mx,&my);

for (int i=0; i<20; i++)

{

if ( (ListBall [i]. x<=mx&&mx<=ListBall [i]. x+30) && (ListBall [i]. y<=my&&my<=ListBall [i]. y+30))

{

DrawBallAfter (ListBall, i,frog);

BlowUp (i,ListBall,frog);

float t=hge->Timer_GetDelta ();

while (t<30000)

t=t+hge->Timer_GetDelta ();

return true;

}

else

continue;

}

return false;

}

return false;

}

· bool BlowUp (int i,Ball ListBall [20], int frog) - взрывает шарики одного цвета вызывается функцией PushBall.

Класс BallPath

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

Имеется четыре основных поля:

· float ballX, ballY (начальные координаты шариков в цепочки, зависят от уровня игрока);

· Player pl (отвечает за данного игрока);

· HGEG g (структура в которой хранятся спрайты, звуки и т. д);

· Ball ListBall [20] (сама цепочка шариков);

Здесь же можно рассказать про структуру Ball. Она отвечает за каждый шарик в отдельности, за его свойства.

Поля структуры:

· int col (цвет);

· Bonus bonus (бонус);

· float x;

· float y;

· float prevx;

· float prevy;

· bool frogs (является ли данный шарик лягушкиным);

· bool hidden (появился ли этот шарик уже на экране);

· bool explosition (взорван ли этот шарик);

Но вернемся к нашему к классу. В нем имеется несколько очень важных функций:

· void CheckColor (HGE *hge) - проверяет нет ли у нас шариков таких цветов, что в цепочке уже не наберется три или более одинаковых шарика;

void BallPath:: CheckColor (HGE *hge)

{

int color=0;

int col=0;

int i=0;

for (color; color<6; color++)

{

while (i! =20&& (ListBall [i]. col! =color||ListBall [i]. explosition==true))

{

i++;

}

if (i==20)

{

i=0;

continue;

}

for (i; i<20; i++)

{

if (ListBall [i]. col==color)

col++;

}

if (col>=3)

{

col=0;

i=0;

continue;

}

else if (col==0)

{

col=0;

i=0;

continue;

}

else

{

for (i=0; i<20; i++)

{

if (ListBall [i]. explosition==true)

{

ListBall [i]. explosition=false;

ListBall [i]. col=color;

col++;

BallLoad (hge, i,color);

if (col>=3)

{

col=0;

break;

}

}

}

i=0;

}

}

}

· int CheckExpl (HGE *hge) - проверяет цепочку на уничтожение всех шаров;

· void BallLoad (HGE *hge, int i, int a) - вызывается, когда нужны добавочные шарики;

· void TextureBallLoadRandom (HGE *hge) - устанавливает рандомно цвет шариков и загружает их текстуры. Вызывается при инициализации уровня;

void BallPath:: TextureBallLoadRandom (HGE *hge)

{

for (int i=0; i<20; i++)

{

int a = rand () % 6;

ListBall [i]. col=a;

if (a==0)

g. texBalls [i] =hge->Texture_Load ("image\\baAccuracyBlue. png");

else if (a==1)

g. texBalls [i] =hge->Texture_Load ("image\\baAccuracyGreen. png");

else if (a==2)

g. texBalls [i] =hge->Texture_Load ("image\\baAccuracyPurple. png");

else if (a==3)

g. texBalls [i] =hge->Texture_Load ("image\\baAccuracyRed. png");

else if (a==4)

g. texBalls [i] =hge->Texture_Load ("image\\baAccuracyWhite. png");

else if (a==5)

g. texBalls [i] =hge->Texture_Load ("image\\baAccuracyYellow. png");

}

}

Следующие три функции непостредственно вычисляют новые координаты шариков в цепочке в зависимости от уровня:

· int CalculatePositionLev1 (float h);

· int CalculatePositionLev2 (float h);

· int CalculatePositionLev3 (float h);

класс Game

Этот класс осуществляет взаимодействие цепочки шариков и игрока, т.е. класса BallPath и Player.

Два поля:

· Player player (отвечает за игрока);

· BallPath b (отвечает за цепочку шариков);

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

Основные функции:

· bool InitSimulation (HGE *hge) - инициализирует спрайты и звуки в соответсвии с уровнем игрока, так же цепочку шариков и свойства каждого шарика в отдельности;

· void DoneSimulation (HGE *hge) - освобждает ресурсы после завершения основного цикла;

· int UpdateSimulation (HGE *hge) - -обновляет координаты шариков цепочки, время и оттенки цвета;

int Game:: UpdateSimulation (HGE *hge)

{

int seq [9] = {0, 0, 1, 2, 2, 2, 1, 0, 0};

DWORD levelTopColors [] = {0xFF15092A, 0xFF6C6480, 0xFF89B9D0};

DWORD levelBtmColors [] = {0xFF303E57, 0xFFAC7963, 0xFFCAD7DB};

float h;

const float cellw=SCREEN_WIDTH/15;

hgeColor col1, col2;

if (b. speed==0.0f) time=b. GetTime ();

else

{

time+=hge->Timer_GetDelta () *b. speed;

if (time>=24.0f) time-=24.0f;

}

b. seq_id= (int) (time/3);

b. seq_residue=time/3-b. seq_id;

h= (time/400);

col1. SetHWColor (levelTopColors [seq [3]]);

col2. SetHWColor (levelTopColors [seq [4]]);

b. collevelTop=col2*3 + col1* (1.0f-3);

col1. SetHWColor (levelBtmColors [seq [3]]);

col2. SetHWColor (levelBtmColors [seq [4]]);

b. collevelBtm=col2*3 + col1* (1.0f-3);

b. colball. SetHWColor (0xFFEAE1BE);

b. colball=b. colball* (1);

int k;

if (b. pl. level==1)

{

k=b. CalculatePositionLev1 (h);

}

else if (b. pl. level==2)

k=b. CalculatePositionLev2 (h);

else if (b. pl. level==3)

k=b. CalculatePositionLev3 (h);

return k;

}

· void RenderSimulation () - рисует заданные спрайты на полученных координатах;

· void SaveToFile (char *name) - -сохраняет текущего игрока и ее время в файл уровня;

· void WinersFromFile () - считывает лучших игроков уровней из файла;

· void CheckWin (HGE *hge) - проверяет не пуста ли цепочка, если да то переходит на слеующий уровень;

void Game:: CheckWin (HGE *hge)

{

int i;

for (i=0; i<20; i++)

{

if (b. ListBall [i]. explosition==false)

break;

}

if (i==20)

{

b. pl. level++;

InitSimulation (hge);

}

}

класс hgeGUIMenuItem

Этот класс является классом-наследником виртуального класса hgeGUIObject библиотеки HGE, поэтому методы у него такие же как и в стандартном классе:

· virtual voidRender () - рисует наше меню;

· virtual voidUpdate (float dt) - обновляет анимацию на фоне меню;

· virtual voidEnter () - отвечает за то, когда меню должно появится на экране;

· virtual voidLeave () - отвечает за то, когда меню должно исчезнуть с экрана;

· virtual boolIsDone () - проверяет закончена ли анимация;

· virtual voidFocus (bool bFocused) - обеспечивает работу с элементами меню (кнопками);

· virtual voidMouseOver (bool bOver) - уведамляет когда курсор мыши вышел за пределы окна;

void hgeGUIMenuItem:: MouseOver (bool bOver)

{

if (bOver) gui->SetFocus (id);

}

· virtual boolMouseLButton (bool bDown) - уведомляет о состоянии левой кнопки мыши;

bool hgeGUIMenuItem:: MouseLButton (bool bDown)

{

if (! bDown)

{

offset=4;

return true;

}

else

{

hge->Effect_Play (snd);

offset=0;

return false;

}

}

· virtual boolKeyClick (int key, int chr) - управлять меню можно также с помощью кнопак ENTER и SPACE;

класс Forminput

Этот класс так же является классом-наследником виртуального класса hgeGUIObject библиотеки HGE, поэтому методы у него такие же как и в стандартном классе: Предназначен для ввода имени игрока.

А так же имеет несколько дополнительных функций.

· void setText (char *newText);

· char *getText () - для получения введенной строки;

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

bool FrameFunc1 () - кадр какого-либо уровня

bool RenderFunc1 () - его прорисовка

bool FrameFuncI () - кадр Инструкции

bool RenderFuncI () - -прорисовка Инструкции

bool FrameFunc () - кадр Главного меню

bool RenderFunc () - его прорисовка

bool FrameFuncW () - кадр Победители

bool RenderFuncW () - его прорисовка

void Rev () - для возрата в главное меню

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

3. Руководство пользователя

При загрузке приложения сначала появлется заставка самого движка, сделано в благодарность разработчикам. Затем запускается главное меню.

Кнопка Play запускает основной цикл игры, начиная с первого уровня.

Кнопка Instructions запускает окно с очень небольшими инструкциями.

Кнопка Winers запускает окно с победителями уровней.

Кнопка Exit закрывает окно.

Для возрата в главное меню достаточно нажать клавишу ESCAPE.

Основной элемент управления меню - это мышь, но кнопки также реагирует на нажатие клавиш ENTER и SPACE, и еще переключать кнопки можно с помощью стрелок (вверх и вниз).

И так нажимаем кнопку Instructions. У нас появляется окно.

Как можно видеть информации недостаточно, но если нужно очень подробная информация нужно открыть файл "Instructions".

И так прочитав инструкцию, можно приступать к началу игры.

Нажав кнопку Play на экране появится такое окно.

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

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

Игрок должен попасть курсором мыши по шарику, который он хочет забрать в лягушку. Затем он щелкает мышью по шарику после которого он хочет вставить свій шарик. Внимание!!! Если вы хотите вставить третий шарик в место где уже есть два шарика такого цвета, то нужно щелкать по дальнему шарику. Если цепочка дайдет до злой звезды, то пользователь проиграл. У него либо отнимется жизнь либо, если жизней не осталось, выйдет из игры.

Для сохранение текущего результата можно нажать клавишу S, для смены уровня достаточно нажатия клавиши L. Убедительная просьба в имени игрока не включать эти буквы!!!

Теперь нажмем клавишу ESCAPE, чтобы вернутся в главное меню. После мы можем зайти в окно Winers, путям нажатия кнопки Winers. У нас выскочит такое окно. Где видны победители каждого из уровней.

компьютерная игра руководство пользователь

Заключение

В результате выполнения курсового проекта была разработана казуальная игра Zuma.

В игре имеется три не очень сложных уровня.

Была разработана отличная графика в сопровождения с музыкой.

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

В ходе разработки приложения использовалась среда Microsoft Visual Studio 2010, а для работы приложения - библиотека HGE. DLL.

Список использованных источников

1. Лафоре Р. Объектно-ориентированное программирование / Р. Лафоре - 4-е изд. - Питер.: 2010. - 654 с.

2. Давыдов В.Г. Технологии программирования. / В.Г. Давыдов - Санкт-Петербург: БХВ-Петербург, 2009. - 432 с.

3. Касюк С.Т. Конспект лекций по дисциплине "Информатика" / С.Т. Касюк - Челябинск: ЮУрГУ, 2011. - 212 с.

Приложения

Приложения 1. Исходный код

Функции кадра меню и его прорисовки

bool FrameFunc ()

{

float dt=hge->Timer_GetDelta ();

static float t=0.0f;

float tx,ty;

int id;

static int lastid=0;

if (hge->Input_GetKeyState (HGEK_ESCAPE)) { lastid=5; gui->Leave (); }

id=gui->Update (dt);

if (id == - 1)

{

switch (lastid)

{

case 1:

{

hge->Gfx_Clear (0);

hge->System_SetState (HGE_FRAMEFUNC, FrameFunc1);

game. b. pl. level=3;

game. InitSimulation (hge);

hge->System_SetState (HGE_RENDERFUNC, RenderFunc1);

hge->System_SetState (HGE_TITLE, "LEVEL");

hge->System_SetState (HGE_USESOUND, true);

hge->System_SetState (HGE_WINDOWED, true);

hge->System_SetState (HGE_SCREENWIDTH,SCREEN_WIDTH);

hge->System_SetState (HGE_SCREENHEIGHT, SCREEN_HEIGHT);

hge->System_SetState (HGE_SCREENBPP, 32);

gui1=new hgeGUI ();

gui1->SetNavMode (HGEGUI_UPDOWN | HGEGUI_CYCLED);

gui1->SetCursor (spr);

gui1->SetFocus (1);

gui1->Enter ();

if (hge->System_Initiate ())

{

fnt=new hgeFont ("font2. fnt");

hge->System_Shutdown ();

hge->Release ();

break;

}

break;

}

case 2:

case 3:

{

snd=hge->Effect_Load ("music\\instructions. mp3");

hge->Effect_Play (snd);

hge->Gfx_Clear (0);

hge->System_SetState (HGE_FRAMEFUNC, FrameFuncI);

background1=hge->Texture_Load ("image\\dialogbox. jpg");

instructions=new hgeSprite (background1, 0, 0, SCREEN_WIDTH, SCREEN_HEIGHT);

hge->System_SetState (HGE_RENDERFUNC, RenderFuncI);

hge->System_SetState (HGE_TITLE, "INSTRUCTIONS");

hge->System_SetState (HGE_USESOUND, true);

hge->System_SetState (HGE_WINDOWED, true);

hge->System_SetState (HGE_SCREENWIDTH, SCREEN_WIDTH);

hge->System_SetState (HGE_SCREENHEIGHT, SCREEN_HEIGHT);

hge->System_SetState (HGE_SCREENBPP, 32);

if (! FrameFuncI)

{

hge->System_Shutdown ();

hge->Release ();

break;

}

break;

}

case 4:

gui->SetFocus (1);

gui->Enter ();

break;

case 5: return true;

}

}

else if (id) { lastid=id; gui->Leave (); }

t+=dt;

tx=50*cosf (t/60);

ty=50*sinf (t/60);

quad. v [0]. tx=tx; quad. v [0]. ty=ty;

quad. v [1]. tx=tx+800/64; quad. v [1]. ty=ty;

quad. v [2]. tx=tx+800/64; quad. v [2]. ty=ty+600/64;

quad. v [3]. tx=tx; quad. v [3]. ty=ty+600/64;

return false;

}

bool RenderFunc ()

{

hge->Gfx_BeginScene ();

hge->Gfx_RenderQuad (&quad);

gui->Render ();

fnt->SetColor (0xFFFFFFFF);

fnt->printf (5, 5, HGETEXT_LEFT, "dt: %.3f\nFPS: %d", hge->Timer_GetDelta (), hge->Timer_GetFPS ());

hge->Gfx_EndScene ();

return false;

}

void Game:: SaveToFile (char *name)

{

char *plname;

while (*name! =' ')

{

name++;

}

name++;

plname=name;

char *namef;

if (b. pl. level==1)

{

namef="level1. txt";

}

else if (b. pl. level==2)

{

namef="level2. txt";

}

else if (b. pl. level==3)

{

namef="level3. txt";

}

char timel [10];

sprintf (timel,"%f",b. timelevel);

FILE *f=fopen (namef,"r+");

if (! f)

{

printf ("File was not opened!!!");

}

fseek (f,0,SEEK_END);

fputc ('\n',f);

fputc ('\n',f);

// внесение в Базу данных

fputs ("Имя: ",f);

fputc ('\n',f); // fputs не переходит на другую строку

fputs (plname,f);

fputc ('\n',f); // fputs не переходит на другую строку

fputs ("Время: ",f);

fputc ('\n',f); // fputs не переходит на другую строку

fputs (timel,f);

fclose (f);

}

void Game:: WinersFromFile ()

{

char str [30]; // строка для взятия из файла

char tname [30];

float ttime=0;

int len=30;

FILE *f1=fopen ("level1. txt","r");

if (! f1)

{

printf ("File was not opened!!!");

}

FILE *f2=fopen ("level2. txt","r");

if (! f2)

{

printf ("File was not opened!!!");

}

FILE *f3=fopen ("level3. txt","r");

if (! f3)

{

printf ("File was not opened!!!");

}

// int max=0;

for (int i=0; i<3; i++)

maxtime [i] =100;

fgets (str,len,f1); // первая строчка: " База Данных: "

while (! feof (f1)) // пока мы не найдем нужный счет

{

fgets (str,len,f1); // пустая строчка

fgets (str,len,f1); // Имя:

fgets (str,len,f1); // Alex

strcpy (tname,str); // копируем в темповое имя имя польхователя

fgets (str,len,f1); // вВремя:

fgets (str,len,f1); // 1234

ttime=atof (str); // получаем time

if (ttime<=maxtime [0])

{

maxtime [0] =ttime;

strcpy (maxname1,tname);

}

}

fclose (f1);

fgets (str,len,f2); // первая строчка: " База Данных: "

while (! feof (f2)) // пока мы не найдем нужный счет

{

fgets (str,len,f2); // пустая строчка

fgets (str,len,f2); // Имя:

fgets (str,len,f2); // Alex

strcpy (tname,str); // копируем в темповое имя имя польхователя

fgets (str,len,f2); // вВремя:

fgets (str,len,f2); // 1234

ttime=atof (str); // получаем time

if (ttime<=maxtime [1])

{

maxtime [1] =ttime;

strcpy (maxname2,tname);

}

}

fclose (f2);

fgets (str,len,f3); // первая строчка: " База Данных: "

while (! feof (f3)) // пока мы не найдем нужный счет

{

fgets (str,len,f3); // пустая строчка

fgets (str,len,f3); // Имя:

fgets (str,len,f3); // Alex

strcpy (tname,str); // копируем в темповое имя имя польхователя

fgets (str,len,f3); // вВремя:

fgets (str,len,f3); // 1234

ttime=atof (str); // получаем time

if (ttime<=maxtime [2])

{

maxtime [2] =ttime;

strcpy (maxname3,tname);

}

}

fclose (f3);

}

bool Game:: InitSimulation (HGE *hge)

{

player. life=1;

// загрузка текстур

b. g. sndrol=hge->Effect_Load ("music\\rolling. wav");

b. g. sndpop=hge->Effect_Load ("music\\pop. wav");

b. g. snddes=hge->Effect_Load ("music\\ballsdestroyed. wav");

if (b. pl. level==1)

{

b. pl. fx=490;

b. pl. fy=280;

b. g. background=hge->Texture_Load ("levels\\inversespiral. png");

if (! b. g. background) return false;

b. g. texFrog=hge->Texture_Load ("image\\SMALLFROG1. png");

if (! b. g. texFrog) return false;

b. TextureBallLoadRandom (hge);

b. g. snd1=hge->Effect_Load ("music\\level1. mp3");

// создание спрайтов

hge->Effect_PlayEx (b. g. snd1,10,0,-1,true);

b. g. level=new hgeSprite (b. g. background, 0, 0, SCREEN_WIDTH, SCREEN_HEIGHT);

b. g. frog=new hgeSprite (b. g. texFrog,0, 0, 90, 100);

for (int i=0; i<20; i++)

{

b. g. ball [i] =new hgeSprite (b. g. texBalls [i],0,0,33,32);

}

b. pl. life=3;

b. colWhite. SetHWColor (0xFFFFFFFF);

time=b. GetTime ();

b. speed=6.4f;

b. ballX=40;

b. ballY=440;

b. ListBall [0]. x=b. ballX;

b. ListBall [0]. y=b. ballY;

b. ListBall [0]. frogs=false;

b. ListBall [0]. hidden=false;

b. ListBall [0]. explosition=false;

for (int i=1; i<20; i++)

{

b. ListBall [0]. frogs=false;

b. ListBall [i]. hidden=true;

b. ListBall [i]. explosition=false;

b. ListBall [i]. x=40;

b. ListBall [i]. y=440;

}

}

else if (b. pl. level==2)

{

b. pl. fx=360;

b. pl. fy=300;

b. g. background=hge->Texture_Load ("levels\\squaresville. png");

if (! b. g. background) return false;

b. g. texFrog=hge->Texture_Load ("image\\SMALLFROG1. png");

if (! b. g. texFrog) return false;

b. TextureBallLoadRandom (hge);

b. g. snd1=hge->Effect_Load ("music\\level2. mp3");

// создание спрайтов

hge->Effect_PlayEx (b. g. snd1,5,0,-1,true);

b. g. level=new hgeSprite (b. g. background, 0, 0, SCREEN_WIDTH, SCREEN_HEIGHT);

b. g. frog=new hgeSprite (b. g. texFrog,0, 0, 90, 100);

for (int i=0; i<20; i++)

{

b. g. ball [i] =new hgeSprite (b. g. texBalls [i],0,0,33,32);

}

b. pl. life=3;

hge->Effect_Play (b. g. snd1);

b. g. level=new hgeSprite (b. g. background, 0, 0, SCREEN_WIDTH, SCREEN_HEIGHT);

b. g. frog=new hgeSprite (b. g. texFrog,0, 0, 90, 100);

for (int i=0; i<20; i++)

{

b. g. ball [i] =new hgeSprite (b. g. texBalls [i],0,0,33,32);

}

b. pl. life=3;

b. colWhite. SetHWColor (0xFFFFFFFF);

time=b. GetTime ();

b. speed=6.4f;

b. ballX=770;

b. ballY=60;

b. ListBall [0]. x=b. ballX;

b. ListBall [0]. y=b. ballY;

b. ListBall [0]. frogs=false;

b. ListBall [0]. hidden=false;

b. ListBall [0]. explosition=false;

for (int i=1; i<20; i++)

{

b. ListBall [0]. frogs=false;

b. ListBall [i]. hidden=true;

b. ListBall [i]. explosition=false;

b. ListBall [i]. x=770;

b. ListBall [i]. y=60;

}

}

else if (b. pl. level==3)

{

b. pl. fx=290;

b. pl. fy=310;

b. g. background=hge->Texture_Load ("levels\\tunnellevel. png");

if (! b. g. background) return false;

b. g. texFrog=hge->Texture_Load ("image\\SMALLFROG1. png");

if (! b. g. texFrog) return false;

b. TextureBallLoadRandom (hge);

b. g. snd1=hge->Effect_Load ("music\\level3. mp3");

// создание спрайтов

hge->Effect_PlayEx (b. g. snd1,5,0,-1,true);

b. g. level=new hgeSprite (b. g. background, 0, 0, SCREEN_WIDTH, SCREEN_HEIGHT);

b. g. frog=new hgeSprite (b. g. texFrog,0, 0, 90, 100);

for (int i=0; i<20; i++)

{

b. g. ball [i] =new hgeSprite (b. g. texBalls [i],0,0,33,32);

}

b. pl. life=3;

hge->Effect_Play (b. g. snd1);

b. g. level=new hgeSprite (b. g. background, 0, 0, SCREEN_WIDTH, SCREEN_HEIGHT);

b. g. frog=new hgeSprite (b. g. texFrog,0, 0, 90, 100);

for (int i=0; i<20; i++)

{

b. g. ball [i] =new hgeSprite (b. g. texBalls [i],0,0,33,32);

}

b. pl. life=3;

b. colWhite. SetHWColor (0xFFFFFFFF);

time=b. GetTime ();

b. speed=6.4f;

b. ballX=750;

b. ballY=5;

b. ListBall [0]. x=b. ballX;

b. ListBall [0]. y=b. ballY;

b. ListBall [0]. frogs=false;

b. ListBall [0]. hidden=false;

b. ListBall [0]. explosition=false;

for (int i=1; i<20; i++)

{

b. ListBall [0]. frogs=false;

b. ListBall [i]. hidden=true;

b. ListBall [i]. explosition=false;

b. ListBall [i]. x=750;

b. ListBall [i]. y=5;

/

}

}

return true;

}

Для примера высчитывания координат шариков

int BallPath:: CalculatePositionLev3 (float h)

{

int i=0;

for (i; i<20; i++)

{

if (ListBall [i]. hidden==false&&ListBall [i]. frogs! =true)

{

if (ListBall [i]. x==750&&ListBall [i]. y<560)

{

ListBall [i]. prevx=ListBall [i]. x;

ListBall [i]. prevy=ListBall [i]. y-30;

ListBall [i]. y+=h;

if (ListBall [i]. y-ListBall [i+1]. y>30)

ListBall [i+1]. hidden=false;

continue;

}

}

if (ListBall [i]. y>560&&ListBall [i]. x>100)

{

ListBall [i]. prevx=ListBall [i]. x+30;

ListBall [i]. prevy=ListBall [i]. y;

ListBall [i]. x-=h;

continue;

}

if (ListBall [i]. y>500&&ListBall [i]. x>55)

{

ListBall [i]. prevx=ListBall [i]. x;

ListBall [i]. prevy=ListBall [i]. y;

ListBall [i]. x-=h;

ListBall [i]. y-=h;

continue;

}

if (ListBall [i]. x<55&&ListBall [i]. y>95)

{

ListBall [i]. prevx=ListBall [i]. x;

ListBall [i]. prevy=ListBall [i]. y+30;

ListBall [i]. y-=h;

continue;

}

if (ListBall [i]. y>55&&ListBall [i]. x<115)

{

ListBall [i]. prevx=ListBall [i]. x;

ListBall [i]. prevy=ListBall [i]. y;

ListBall [i]. x+=h;

ListBall [i]. y-=h;

continue;

}

if (ListBall [i]. y<55&&ListBall [i]. x<550)

{

ListBall [i]. prevx=ListBall [i]. x-30;

ListBall [i]. prevy=ListBall [i]. y;

ListBall [i]. x+=h;

continue;

}

if (ListBall [i]. x<590&&ListBall [i]. y<95)

{

ListBall [i]. prevx=ListBall [i]. x;

ListBall [i]. prevy=ListBall [i]. y;

ListBall [i]. x+=h;

ListBall [i]. y+=h;

continue;

}

if (ListBall [i]. x>590&&ListBall [i]. x<591&&ListBall [i]. y<430)

{

ListBall [i]. prevx=ListBall [i]. x;

ListBall [i]. prevy=ListBall [i]. y-30;

ListBall [i]. y+=h;

continue;

}

if (ListBall [i]. x>520&&ListBall [i]. x<591&&ListBall [i]. y>420&&ListBall [i]. y<470)

{

ListBall [i]. prevx=ListBall [i]. x;

ListBall [i]. prevy=ListBall [i]. y;

ListBall [i]. x-=h;

ListBall [i]. y+=h;

continue;

}

if (ListBall [i]. x<555&&ListBall [i]. x>535&&ListBall [i]. y>470)

{

ListBall [i]. prevx=ListBall [i]. x+30;

ListBall [i]. prevy=ListBall [i]. y;

ListBall [i]. x-=h;

continue;

}

if (ListBall [i]. x<535&&ListBall [i]. x>490&&ListBall [i]. y>430)

{

ListBall [i]. prevx=ListBall [i]. x;

ListBall [i]. prevy=ListBall [i]. y;

ListBall [i]. x-=h;

ListBall [i]. y-=h;

continue;

}

if (ListBall [i]. x<490&&ListBall [i]. y>370)

{

ListBall [i]. prevx=ListBall [i]. x;

ListBall [i]. prevy=ListBall [i]. y+30;

ListBall [i]. y-=h;

continue;

}

if (ListBall [19]. x<490&&ListBall [19]. x>487&&ListBall [19]. y<370)

{

if (pl. life>1)

{

pl. life--;

ballX=750;

ballY=5;

ListBall [0]. x=ballX;

ListBall [0]. y=ballY;

ListBall [0]. hidden=false;

ListBall [0]. explosition=false;

for (int i=1; i<20; i++)

{

ListBall [i]. hidden=true;

ListBall [i]. explosition=false;

ListBall [i]. x=750;

ListBall [i]. y=5;

}

}

else

return 0;

}

}

return 1;

}

void Player:: DrawFrogBall (Ball ListBall [20], int i)

{

float x,y;

x=ListBall [i]. x;

y=ListBall [i]. y;

ListBall [i]. frogs=true;

ListBall [i]. x=fx+30;

ListBall [i]. y=fy+65;

int k=0;

int rev;

for (int j=19; j>i; j--)

{

if (ListBall [j-1]. explosition==true)

{

rev=j;

k=j-1;

while (ListBall [k]. explosition==true)

{

k--;

}

ListBall [j]. x=ListBall [k]. x;

ListBall [j]. y=ListBall [k]. y;

j=k+1;

}

else if (ListBall [j]. explosition! =true)

{

ListBall [j]. x=ListBall [j-1]. x;

ListBall [j]. y=ListBall [j-1]. y;

}

}

if (ListBall [i+1]. explosition! =true)

{

ListBall [i+1]. x=x;

ListBall [i+1]. y=y;

}

else if (k==i)

{

ListBall [rev]. x=x;

ListBall [rev]. y=y;

}

}

void Player:: DrawBallAfter (Ball ListBall [20], int i, int frog)

{

float x,y;

ListBall [frog]. x=ListBall [i]. x;

ListBall [frog]. y=ListBall [i]. y;

for (i; i<19; i++)

{

if (i+1==frog)

{

ListBall [i]. x=ListBall [i+2]. x;

ListBall [i]. y=ListBall [i+2]. y;

continue;

}

if (i==frog)

continue;

ListBall [i]. x=ListBall [i+1]. x;

ListBall [i]. y=ListBall [i+1]. y;

}

if (i! =frog)

{

ListBall [i]. x=ListBall [i]. prevx;

ListBall [i]. y=ListBall [i]. prevy;

}

ListBall [frog]. frogs=false;

}

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


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

  • Разработка компьютерной игры "Эволюция" с помощью игрового движка Unit. Сравнение критериев игры-аналога и разрабатываемой игры. Разработка графического интерфейса пользователя. Настройки камеры в редакторе Unity. Структура файла сохранения игры.

    дипломная работа [3,6 M], добавлен 11.02.2017

  • Особенности разработки компьютерной игры, в которой проводится чемпионат по волейболу. Список переменных и типов данных. Разработка текстового и графического алгоритма. Разбор основных этапов игры на примере. Основные положения руководства пользователя.

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

  • Обоснование необходимости разработки программы для игры "Тетрис". Математическая и графическая части алгоритма. Выбор языка и среды программирования. Отладка текста программы, разработка интерфейса пользователя. Тестирование, руководство пользователя.

    курсовая работа [1,5 M], добавлен 17.01.2011

  • Описание принципа развивающей игры в слова "Виселица". Разработка программы, реализующей задачу данной игры на языке Delphi. Обоснование выбора среды программирования, листинг файла, результаты отладки и тестирования, руководство для пользователя.

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

  • Программная реализация игры, необходимость наличия файла Arcanoid.exe. Список файлов, технические требования, состав программы. Алгоритм игры. Основные достоинства данного программного продукта, системные требования и руководство пользователя.

    курсовая работа [753,6 K], добавлен 28.12.2011

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

    курсовая работа [1,2 M], добавлен 02.03.2017

  • Описание алгоритма хода ЭВМ в режиме "пользователь-компьютер" в игре "Морской бой". Описание совокупности классов, их полей и методов. Разработка интерфейса и руководства пользователя по проведению игры. Листинг программы, написанной на языке Java.

    курсовая работа [645,0 K], добавлен 26.03.2014

  • Разработка программы-игры "Keyboard Racer". Главная особенность игры - визуализация простого и скучного набора текста гоночной игрой. Интуитивно понятный и эргономичный интерфейс программы, схема ее работы. Синхронизация между клиентом и сервером.

    курсовая работа [200,6 K], добавлен 25.05.2014

  • Разработка эскизного и технического проекта программы игры "Собери картинку". Назначение и область применения, основные технические характеристики. Разработка рабочего проекта, разработка и спецификация программы игры. Описание и тестирование программы.

    курсовая работа [22,6 K], добавлен 10.06.2010

  • Знакомство с интерфейсом пользователя и сценарием использования программы игры в крестики и нолики. Функциональные и нефункциональные требования для персонального компьютера. Исключительные ситуации и реакция программы. Пример кода игры и комментарии.

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

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