birmaga.ru
добавить свой файл

1


Министерство образования Российской Федерации
Томский политехнический университет


Факультет Автоматики и Вычислительной техники

Кафедра ИПС

 

Пояснительная записка к курсовой работе

по дисциплине «Программирование на ЯВУ»

Defenders of the Galaxy”



Космическая стрелялка


Выполнил:
студент группы 8В83
Мишунин О.Б.

Проверил:
преподаватель
Погребная Т.К.

Томск 2010

Содержание



ТЕХНИЧЕСКОЕ ЗАДАНИЕ НА РАЗРАБОТКУ ПРОГРАММНОЙ РЕАЛИЗАЦИИ ЗАДАЧИ О ГОЛЛАНДСКОМ ФЛАГЕ 4

1. ВВЕДЕНИЕ 4

2. ОСНОВАНИЕ ДЛЯ РАЗРАБОТКИ 4

2.1. Документ, на основании которого ведется разработка 4

2.2. Организация, утвердившая документ 4

3. НАЗНАЧЕНИЕ РАЗРАБОТКИ 4

4. ТРЕБОВАНИЯ К РАЗРАБОТКЕ 4

4.1. Требования к функциональным характеристикам 4

4.2. Требования к составу и параметрам технических средств 4

4.3.Требования к информационной и программной совместимости 4

5. ТРЕБОВАНИЯ К ПРОГРАММНОЙ ДОКУМЕНТАЦИИ 4

ВВЕДЕНИЕ 5

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

2.СПОСОБ РЕАЛИЗАЦИИ 6

2.1.Введенные классы 6

2.2.Переопределение стандартных операций для абстрактных типов данных. 12

3.РУКОВОДСТВО ПО ИСПОЛЬЗОВАНИЮ 13

ЗАКЛЮЧЕНИЕ 13

14

ПРИЛОЖЕНИЕ 14




ТЕХНИЧЕСКОЕ ЗАДАНИЕ НА РАЗРАБОТКУ ПРОГРАММНОЙ РЕАЛИЗАЦИИ ЗАДАЧИ О ГОЛЛАНДСКОМ ФЛАГЕ




1. ВВЕДЕНИЕ


1.1 Наименование продукта

Аркадная игра «Defenders of the Galaxy».


1.2. Краткая характеристика области применения

Игра «Defenders of the Galaxy» позволяет пользователю уничтожать космические корабли пришельцев в больших количествах, используя собственный корабль, оснащенный лазерным оружием.


2. ОСНОВАНИЕ ДЛЯ РАЗРАБОТКИ

2.1. Документ, на основании которого ведется разработка


Задание на курсовую работу по дисциплине «Программирование на языке высокого уровня».

2.2. Организация, утвердившая документ


Томский политехнический университет.

3. НАЗНАЧЕНИЕ РАЗРАБОТКИ


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

4. ТРЕБОВАНИЯ К РАЗРАБОТКЕ

4.1. Требования к функциональным характеристикам


4.1.1. Программа должна поддерживать подсчет результата.

4.1.2. Программа должна поддерживать несколько игровых уровней.

4.1.3. Программа должна предоставить возможность увеличения уровня сложности.

4.1.4. Программа должна иметь простой графический интерфейс.


4.2. Требования к составу и параметрам технических средств


Для функционирования игры «Defenders of the Galaxy» необходим компьютер IBM PC совместимый и следующие технические средства:

  • процессор Intel Pentium или совместимый;

  • объем свободной оперативной памяти 8 Мб;

  • объем необходимой памяти на жестком диске 2 Мб;

  • стандартный VGA-монитор или совместимый;

  • стандартная клавиатура;



4.3.Требования к информационной и программной совместимости


Для функционирования логической игры «Defenders of the Galaxy» необходимо наличие операционной системы Microsoft Windows 95 или совместимой. Язык интерфейса – русский.

5. ТРЕБОВАНИЯ К ПРОГРАММНОЙ ДОКУМЕНТАЦИИ


Предварительный состав программной документации:



ВВЕДЕНИЕ

Данная курсовая работа является примером реализации классической вертикальной игры-стрелялки «Invaders from Space», написанной с применением объектно-ориентированного программирования на языке высокого уровня С++.

Объектно-ориентированное программирование (ООП) — методология программирования, основанная на представлении программы в виде совокупности объектов каждый из которых является экземпляром определенного класса, а классы образуют иерархию наследования.

Объектно-ориентированное программирование — это обобщение структурного и модульного программирования для оптимизации создания программ и программных комплексов. ООП позволяет быстро и с минимальным количеством ошибок написать программу, код которой легко понять другим и самому, и, следовательно, изменить при необходимости. Язык программирования является объектно-ориентированным, когда выполняются условия:



  • поддерживаются объекты или абстракции данных, имеющие интерфейс в виде именованных операций и собственные данные с ограничением доступа к ним;

  • объекты относятся к соответствующим типам;

  • типы (классы) могут наследовать атрибуты супертипов (базовых классов).

Три основные положения объектно-ориентированного программирования:

  • инкапсуляция

  • наследование

  • полиморфизм

В языке C++ программист имеет возможность вводить собственные типы данных и определять операции над ними с помощью классов. Классы — это производные структурированные типы, введенные программистом на основе уже существующих типов. Механизм классов позволяет вводить собственные типы данных, т.е. класс задает некоторую структурированную совокупность типизированных данных и позволяет определить набор операций над этими данными. Закрытые данные - члены класса и определения всех функций членов класса входят во внутреннюю используемую часть класса private. Для возможности работы с этим классом часть членов должна быть открытой. Эта часть класса называется интерфейсом (public). В отличие от прототипов функции членов класса, объявленных открытыми, определение этих функций не входит в интерфейс класса. Класс инкапсулирует информацию, связывая вместе члены и методы и обращаясь с ними как с одним целым. Возможность изменения используемой части класса, без опасности возникновения ошибок в программах, использующих этот класс, называется инкапсуляцией. Важность инкапсуляции заключается в том, что каждый класс может изменяться в процессе разработки или даже после ее завершения без нарушения работоспособности остальных частей программы.


Инкапсуляция – это максимально возможная независимость каждого объекта. Внутренняя структура объекта скрыта для всех остальных объектов. Одним из способов организации взаимодействия объектов является обмен сообщениями. Структура этих сообщений не зависит от конкретных объектов, которым или от которых они передаются. Имя функции обрабатывающей одно и то же событие для всех объектов одинаково, но ее реализация зависит от объекта, точнее от класса этого объекта, и определяется во время выполнения программы. Конкретная реализация функции с учетом объекта будет выполняться во время выполнения программы. Это свойство называется полиморфизмом и поддерживается с помощью механизма виртуальных функций. Общая концепция виртуальных функций поддерживает наследование в том, что позволяет двум или более объектам в иерархии наследования иметь методы с одним и тем же объявлением, выполняющие различные задачи.

Объекты разных классов и сами классы могут находиться в отношении наследования, при котором формируется иерархия объектов, соответствующая заранее предусмотренной иерархии классов. Иерархия классов позволяет определять новые классы на основе уже имеющихся. Производный класс получает данные и методы базового класса – и, кроме того, может пополняться собственными компонентами (данными или методами). Наследуемые компоненты не перемещаются в производный класс, а остаются в базовом классе. Сообщение, обработку которого не могут выполнить методы производного класса, автоматически передается в базовый класс.



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

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


2.СПОСОБ РЕАЛИЗАЦИИ

В данной программе были созданы следующие классы:

CShip – базовый класс космического корабля. Служит основой для классов конкретных кораблей;


Ship – корабль игрока;

Alien – инопланетный корабль;

alienGroup – группа вражеских кораблей;

Lazerлазерный снаряд;
И множество функций упрощающих написание и представление программы.

2.1.Введенные классы


class Lazer {

private:


int top, left;

bool alien;

TColor Color;
public:

Lazer() : top(487), left(376), alien(false) { }

Lazer( int t, int l, bool a) : top(t), left(l), alien(a) {

if (!alien) {

Color = clLime;

}

else {



Color = clWhite;

}

SpaceInvFrm->Canvas->Pen->Color = Color;



SpaceInvFrm->Canvas->Rectangle(left, top, left + 1, top + 10);

}

bool getAlien() {



return alien;

}

bool Move() {



killLazer();

if (alien) {

if (top + 10 >= 700) {

return true;

}

top++;


}

else {


if (top <= 0) {

return true;

}

top--;


}

SpaceInvFrm->Canvas->Pen->Color = Color;

SpaceInvFrm->Canvas->Rectangle(left, top, left + 1, top + 10);

return false;

}

int getTop() {



return top;

}

int getLeft() {



return left;

}

void killLazer() {



SpaceInvFrm->Canvas->Pen->Color = clBlack;

SpaceInvFrm->Canvas->Rectangle(left, top, left + 1, top + 10);

}

};
class CShip {



int left;

public:


CShip (){}

~CShip (){}

};
class Alien: public CShip{

private:


int left,top;

bool alive, type;

Graphics::TBitmap *alienType1;

public:

Alien() : left(8), top(8), alive(true) { }

Alien(int l, int t, int b) : left(l), top(t), alive(true), type(true){

CallResBitmaps *cbm = new CallResBitmaps;

alienType1 = new Graphics::TBitmap;

if (b == 1 || b == 2) {

alienType1 = cbm->BitmapAlien1;

}

if (b == 3) {

alienType1 = cbm->BitmapAlien2;

}
if (b == 4) {

alienType1 = cbm->BitmapAlien3;

}
if (b == 5) {

alienType1 = cbm->BitmapAlien4;

}

SpaceInvFrm->Canvas->Draw( left, top, alienType1 );



}

int getLeft() {

return left;

}

int getTop() {



return top;

}

bool getAlive() {



return alive;

}

void setLeft(int l) {



if (alive)

left = l;

return;

}

void setTop(int t) {



if (alive)

top = t;


return;

}

void setAlive(bool a) {



alive = a;

return;


}
bool atRightEdge() {

if (left >= 820 && alive)

return true;

return false;

}
bool atLeftEdge() {

if (left <= 8 && alive)

return true;

return false;

}
bool atBottom() {

if (top >= 556 && alive) {

return true;

}

return false;



}

void moveLeft() {

if (alive)

left--;


return;

}

void moveRight() {



if (alive)

left++;


return;

}

void moveDown() {



if (alive)

top += 61;

return;

}
Lazer* Shoot() {



Lazer *aL = new Lazer(top + 60, left + 30, true);

return aL;

}
bool Hit(int t, int l) {

if (alive) {

if ( (top + 60 >= t) && (top <= t + 10) && (left <= l + 1) && (left + 60 >= l) ) {

drawBlack();

alive = false;

return true;

}

}

return false;



}
void drawBlack() {

if (alive) {

SpaceInvFrm->Canvas->Pen->Color = clBlack;

SpaceInvFrm->Canvas->FillRect(Rect(left, top, left + 60, top + 60));

}

}
void drawLineLeft() {


SpaceInvFrm->Canvas->Pen->Color = clBlack;

SpaceInvFrm->Canvas->MoveTo(left - 1, top);

SpaceInvFrm->Canvas->LineTo(left - 1, top + 60);

return;


}
void drawLineRight() {

SpaceInvFrm->Canvas->Pen->Color = clBlack;

SpaceInvFrm->Canvas->MoveTo(left + 60, top);

SpaceInvFrm->Canvas->LineTo(left + 60, top + 60);

return;

}
void Redraw() {


if (alive) {

SpaceInvFrm->Canvas->Draw( left, top, alienType1 );

drawLineLeft();

drawLineRight();

}

}

};


class alienGroup {

private:


int numAliens;

bool moveRight;

Alien alienArray[5][11];
public:

alienGroup() : moveRight(true), numAliens(55) {

for (int i = 0; i < 5; i++) {

for (int j = 0; j < 11; j++) {

alienArray[i][j] = Alien((61 * j + 8), (61 * i + 8), i + 1);

}

}



}
bool Move() {

bool move = false, gameCont = true, bottom = false;

for (int i = 10; i >= 0; i--) {

for (int j = 4; j >= 0; j--) {

if (moveRight) {

if (alienArray[j][i].atRightEdge()) {

move = true;

moveRight = false;

}

}

else {



if (alienArray[j][i].atLeftEdge()) {

move = true;

moveRight = true;

}

}



if (alienArray[j][i].atBottom())

bottom = true;

}

}
if (move && bottom)



gameCont = false;

if (gameCont) {

for (int i = 4; i >= 0; i--) {

for (int j = 10; j >= 0; j--) {

if (move) {

alienArray[i][j].drawBlack();

alienArray[i][j].moveDown();

}

else {



if (moveRight)

alienArray[i][j].moveRight();

else

alienArray[i][j].moveLeft();



}

alienArray[i][j].Redraw();

}

}

}



return !gameCont;

}

int Hit(int t, int l) {


for (int i = 4; i >= 0; i--) {

for (int j = 10; j >= 0; j--) {

if ( alienArray[i][j].Hit(t, l) ) {

numAliens--;

if (numAliens == 0)

return 1;

return 2;

}

}


}

return 0;

}

void Redraw() {



for (int i = 4; i >= 0; i--) {

for (int j = 10; j >= 0; j--) {

alienArray[i][j].Redraw();

}

}



return;

}
Lazer* Shoot() {

vector columns;

vector rows;

for (int i = 10; i >= 0; i--) {

bool skip = false;

for (int j = 4; j >= 0; j--) {

if (alienArray[j][i].getAlive() && !skip) {

columns.push_back(i);

rows.push_back(j);

skip = true;

}

}



}

int which;

which = (int)(rand() % columns.size());

return alienArray[rows[which]][columns[which]].Shoot();

}
int getBottom() {

for (int i = 4; i >= 0; i--) {


for (int j = 10; j >= 0; j--) {
if (alienArray[i][j].getAlive())

return alienArray[i][j].getTop() + 60;

}

}

return 0;



}
int getEdge() {

int k = 0;

if (moveRight)

k = 10;


for (int i = 4; i >= 0; i--) {

for (int j = k; j >= 0; j--) {

if (alienArray[i][j].getAlive()) {

if (moveRight)

return alienArray[i][j].getLeft() + 60;

else


return alienArray[i][j].getLeft();

}

}



}

return 0;

}

~alienGroup(){delete alienArray;}



};
class Ship:public CShip {

private:


int left;

bool ableShoot;

CallResBitmaps *cbm;
public:
Ship(bool o) : left(366), ableShoot(true) {

cbm = new CallResBitmaps();

SpaceInvFrm->Canvas->Draw( left, 656, cbm->BitmapShip );

}

void moveLeft() {



if (left > 5) {

left--;


Redraw();

SpaceInvFrm->Canvas->Pen->Color = clBlack;

SpaceInvFrm->Canvas->MoveTo(left + 60, 656);

SpaceInvFrm->Canvas->LineTo(left + 60, 696);

}

return;

}
void moveRight() {

if (left + 60 < 885) {

left++;

Redraw();



SpaceInvFrm->Canvas->Pen->Color = clBlack;

SpaceInvFrm->Canvas->MoveTo(left - 1, 656);

SpaceInvFrm->Canvas->LineTo(left - 1, 696);

}

return;



}

Ship& operator++() {

moveRight();

return *this;

}

Ship& operator--() {



moveLeft();

return *this;

}

Lazer* Shoot() {



ableShoot = false;

Lazer *sL = new Lazer(656, left + 30, false);

return sL;

}

void setAble(bool aS) {



ableShoot = aS;

return;


}

bool getAble() {

return ableShoot;

}

bool Hit(int t, int l) {



if ((t + 10 < 656) || (t > 696))

return false;

if ((left <= l) && (left + 60 >= l))

return true;

return false;

}

void Redraw() {



SpaceInvFrm->Canvas->Draw( left, 656, cbm->BitmapShip );

return;


}

};

2.2.Переопределение стандартных операций для абстрактных типов данных.

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

Для распространения действия операции на новые пользовательские типы данных программист определяет специальную функцию, называемую “оператор-функция”. В нашем случае мы будем переопределять стандартные операции “++” и “--”.

Ship& operator++() {

moveRight();

return *this;

}
Ship& operator--() {

moveLeft();

return *this;

}
Операция «++» сдвигает корабля игрока на одну позицию вправо. Операция «--» - наоборот, влево.

3.РУКОВОДСТВО ПО ИСПОЛЬЗОВАНИЮ

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

После нажатия на клавишу OK начинается игра. При обращении к панели меню происходит остановка игры.

Оно содержит следующие пункты:


  • New Game

  • About

  • Quit

Рассмотрим подробнее каждый пункт меню.

  1. New Game.

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

  1. About.

Краткая информация о программе.

  1. Quit.

Выход из игры.

Управление игрой осуществляется с помощью стрелок влево, вправо для перемещения корабля и пробела для выстрела.


ЗАКЛЮЧЕНИЕ

В ходе написания программы были использованы элементы объектно-ориентированного программирования. Основу программы составили классы. Было использовано переопределение стандартных операций для переменных абстрактных типов, а так же работа с графикой, строками и т.д. Были применены знания, полученные в процессе изучения курса «Программирование на ЯВУ».

Разработанная программа является реализацией классической вертикальной игры-стрелялки «Invaders from Space». Смысл игры заключается в том, чтобы не пропустить вражеский флот к своей планете. Для удобства пользователя был создан простой графический интерфейс. Для улучшения внешнего вида были использованы различные модели космических кораблей.

ПРИЛОЖЕНИЕ


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

#include

#pragma hdrstop

#include "InvFromSpaceU.h"

#include "ClassesU.cpp"

#include "AboutFrmU.h"

#include "TIMER.cpp"

#pragma package(smart_init)

#pragma resource "*.dfm"

#pragma resource "IFS.res"

TSpaceInvFrm *SpaceInvFrm;

alienGroup *group1;

Ship *playerShip;

vector activeLazers;

bool GameOn = false;

int lives = 2, score = 0, level = 1;

double inputTimer = 0;
char lastKey = 'z';
bool kbdKeys[256], inptKeys[256];

__fastcall TSpaceInvFrm::TSpaceInvFrm(TComponent* Owner)

: TForm(Owner)

{

}

int lazerMove(Lazer *currentLazer) {



int lazerTop = currentLazer->getTop();

int lazerLeft = currentLazer->getLeft();

if (currentLazer->getAlien())

lazerTop += 10;


if (!(currentLazer->getAlien())) {

int happen = group1->Hit(currentLazer->getTop(), currentLazer->getLeft());

if (happen != 0) {

score++;


currentLazer->killLazer();

return happen + 2;

}

}

else {



if ( playerShip->Hit(currentLazer->getTop(), currentLazer->getLeft()) ) {

currentLazer->killLazer();

return 2;

}

}



return 0;

}

void clearMemory() {



GameOn = false;

for (int i = 0; i < activeLazers.size(); i++)

delete activeLazers[i];

activeLazers.clear();

delete group1;

delete playerShip;

SpaceInvFrm->NewGame1->Enabled = true;

SpaceInvFrm->Repaint();

return;

}
void playerDeath() {



Application->MessageBox("The Aliens have destroyed your ship and you have no spare ships.\nThe aliens continue their attack and destroy the planet.", "You Lose", MB_OK);

clearMemory();

return;

}
void __fastcall TSpaceInvFrm::About1Click(TObject *Sender)



{

AboutFrm->ShowModal();

}

void __fastcall TSpaceInvFrm::Exit1Click(TObject *Sender)



{

exit(0);


}

void __fastcall TSpaceInvFrm::FormCreate(TObject *Sender)

{

SpaceInvFrm->Top = (Screen->Height - SpaceInvFrm->Height) / 2;



SpaceInvFrm->Left = (Screen->Width - SpaceInvFrm->Width) / 2;

}

void __fastcall TSpaceInvFrm::FormKeyDown(TObject *Sender, WORD &Key,



TShiftState Shift)

{

kbdKeys[Key] = true;



}

void __fastcall TSpaceInvFrm::FormPaint(TObject *Sender)

{

if (GameOn) {


group1->Redraw();

playerShip->Redraw();

}

}

void __fastcall TSpaceInvFrm::NewGame1Click(TObject *Sender)



{

randomize();

GameOn = true;

NewGame1->Enabled = false;

score = 0;

double currentTime = TimerGetTime();

double alienMoveTimer = currentTime;

double alienFireDelay = currentTime;

double lazerMoveTimer = currentTime;

double shipMoveTimer = currentTime;

double animateTimer = currentTime;

double difficultyTimer = currentTime;

double alien_speed = .06, lazer_speed = .005, ship_speed = .01;

double difficulty_speed = 15;

lives = 2;

int alienChance = 11;

scoreLbl->Caption = score;

livesLbl->Caption = lives + 1;

levelLbl->Caption = level;
group1 = new alienGroup();

playerShip = new Ship(false);


Application->MessageBox("Aliens are coming to destroy your homeworld!\n Ready to battle?", "Briefing", MB_OK);

kbdKeys[VK_RIGHT] = false;

kbdKeys[VK_LEFT] = false;

kbdKeys[VK_SPACE] = false;

do {

Application->ProcessMessages();



currentTime = TimerGetTime();

if( currentTime - shipMoveTimer >= ship_speed ) {

shipMoveTimer = currentTime;

if (kbdKeys[VK_RIGHT] == true)

playerShip->operator++();

if (kbdKeys[VK_LEFT] == true)

playerShip->operator--();

if ( (kbdKeys[VK_SPACE] == true) && (playerShip->getAble()) ) {

activeLazers.push_back(playerShip->Shoot());

}

}



if( currentTime - animateTimer >= 1 ) {

animateTimer = currentTime;

}

if( currentTime - difficultyTimer >= difficulty_speed ) {

difficultyTimer = currentTime;

if (alien_speed > .005)

alien_speed -= .005;

if (ship_speed > .002)

ship_speed -= .001;

if (level == 5 && lazer_speed > .001)

lazer_speed -= .0005;

else if (lazer_speed > .002)

lazer_speed -= .0005;

if (alienChance > 1)

alienChance -= 1;

difficulty_speed += 2;

}

if( currentTime - alienMoveTimer >= alien_speed ) {

alienMoveTimer = currentTime;

if (group1->Move()) {

Application->MessageBox("The Aliens have made it past your defenses and have destroyed the planet.", "You Lose", MB_OK);

clearMemory();

}

}
if (activeLazers.size() > 0) {



if (currentTime - lazerMoveTimer >= lazer_speed) {

lazerMoveTimer = currentTime;

for (int j = 0; j < activeLazers.size(); j++) {

bool notalive = activeLazers[j]->Move();

if (notalive) {

if (!activeLazers[j]->getAlien())

playerShip->setAble(true);

delete activeLazers[j];

activeLazers.erase(activeLazers.begin() + j);

j--;


}

else {


int happen = lazerMove(activeLazers[j]);

if (happen == 2) {

bool cont = true;

double lastExplode = TimerGetTime();

double explodeTime = lastExplode;

int number = 1;

while (cont) {

lastExplode = TimerGetTime();

if (lastExplode - explodeTime >= .1) {

if (number < 6)

// playerShip->drawExplode(number);

lastExplode=lastExplode;

else

cont = false;



number++;

explodeTime = lastExplode;

}

}

if (lives > 0) {



lives--;

livesLbl->Caption = lives + 1;

bool ableTemp = playerShip->getAble();

delete playerShip;

kbdKeys[VK_RIGHT] = false;

kbdKeys[VK_LEFT] = false;


playerShip = new Ship(false);


playerShip->setAble(ableTemp);

delete activeLazers[j];

activeLazers.erase(activeLazers.begin() + j);

Repaint();

}

else {

lives--;

livesLbl->Caption = lives + 1;

Application->MessageBox("The Aliens have destroyed your ship and you have no spare ships.\nThe aliens continue their attack and destroy the planet.", "You Lose", MB_OK);

kbdKeys[VK_RIGHT] = false;

kbdKeys[VK_LEFT] = false;

kbdKeys[VK_SPACE] = false;

clearMemory();

}

}


else if (happen == 3) {

for (int i = 0; i < activeLazers.size(); i++)

delete activeLazers[i];

activeLazers.clear();

delete group1;

Repaint();

level++;

levelLbl->Caption = level;

group1 = new alienGroup();

playerShip->setAble(true);

}

else if (happen == 4) {



scoreLbl->Caption = score;

if (score % 82 == 0) {

lives++;

livesLbl->Caption = lives + 1;

}

if (!activeLazers[j]->getAlien())



playerShip->setAble(true);

delete activeLazers[j];

activeLazers.erase(activeLazers.begin() + j);

j--;


}

}

}



}

}
if ((currentTime - alienFireDelay >= .1) && GameOn) {

alienFireDelay = currentTime;

if (activeLazers.size() < 6) {

int shoot;

shoot = (int)(rand() % alienChance);

if (shoot == 0) {

activeLazers.push_back(group1->Shoot());

}

}

}



} while( GameOn );

Repaint();

NewGame1->Enabled = true;

}

void __fastcall TSpaceInvFrm::FormKeyUp(TObject *Sender, WORD &Key,



TShiftState Shift)

{

kbdKeys[Key] = false;



}

void __fastcall TSpaceInvFrm::Timer1Timer(TObject *Sender)

{

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



kbdKeys[i] = false;

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

inptKeys[i] = false;

NewGame1->Click();



Timer1->Enabled = false;

}