Скачиваний:
30
Добавлен:
28.06.2014
Размер:
2.3 Mб
Скачать

Список литературы

  1. Касихин В.В. «Как стать создателем компьютерных игр»

  2. Архангельский А.Я. «Программирование в C++Builder6»

  3. Bob Swart, Mark Cashman, Paul Gustavson and Jarrod Hollingworth «Borland C++ Builder 6 Developer’s Guide»

  4. «Киберспорт в России», адрес в интернете: http://www.thercl.ru/

  5. «BorlandXPortal», адрес в интернете:http://borland.xportal.ru/

Приложение Исходный код программы

Модуль uMain.cpp:

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

#include

#include

#include

#pragma hdrstop

#include "uMain.h"

#include "uTest.h"

#pragma package(smart_init)

#pragma resource "*.dfm"

#define c_nH 10

#define c_nW 10

#define c_nCell 45

#define imGrassPath "res\\grass.bmp"

#define imWallPath "res\\wall.bmp"

#define imHeroPath "res\\hero.bmp"

#define imObjectPath "res\\object.bmp"

TfMain *fMain;

int Field[c_nH][c_nW], *pField =(int *)Field;

TImage * iField[c_nH][c_nW];

TImage * iHero;

//Классы----------------------------------------------------------------------

class clObject

{

protected:

//координаты объектов

int nPosX;

int nPosY;

int nLevel;

public:

//процедуры и функции

int getPosX() {return nPosX;};

int getPosY() {return nPosY;};

int getLevel() {return nLevel;};

void setPosX(int nX) {nPosX = nX;};

void setPosY(int nY) {nPosY = nY;};

void setLevel(int nT) {nLevel = nT;};

};

class clGame

{

protected:

int nScore;

int nTry;

public:

//процедуры и фунции

void init();

int question(int nLevel);

int getScore() {return nScore;};

void setScore(int nT) {nScore = nT;};

};

class clHero : public clObject

{

public:

bool bCanMoveUp();

bool bCanMoveDown();

bool bCanMoveLeft();

bool bCanMoveRight();

bool bMeet();

void moveUp();

void moveDown();

void moveLeft();

void moveRight();

void meet();

};

clGame Game;

clHero Hero;

//Классы----------------------------------------------------------------------

void clGame::init()

{

//инициализация

setScore(nScore);

Hero.setPosX(0);

Hero.setPosY(0);

}

int clGame::question(int nLevel)

{

fMain->Tag = nLevel;

fTest = new TfTest(fMain);

fTest->Show();

return 0;

}

bool clHero::bCanMoveUp()

{

int nI, nJ;

nI = getPosX();

nJ = getPosY();

if ((fMain->bCanMove)&&(getPosY() < c_nH - 1) && (Field[nJ+1][nI] != 1))

{

return true;

}

else return false;

}

bool clHero::bCanMoveDown()

{

int nI, nJ;

nI = getPosX();

nJ = getPosY();

if ((fMain->bCanMove)&&(getPosY() > 0) && (Field[nJ-1][nI] != 1))

{

return true;

}

else return false;

}

bool clHero::bCanMoveLeft()

{

int nI, nJ;

nI = getPosX();

nJ = getPosY();

if ((fMain->bCanMove)&&(getPosX() > 0) && (Field[nJ][nI-1] != 1))

{

return true;

}

else return false;

}

bool clHero::bCanMoveRight()

{

int nI, nJ;

nI = getPosX();

nJ = getPosY();

if ((fMain->bCanMove)&&(getPosX() < c_nW - 1) && (Field[nJ][nI+1] != 1))

{

return true;

}

else return false;

}

bool clHero::bMeet()

{

int nI, nJ;

nI = getPosX();

nJ = getPosY();

if (Field[nJ][nI] == 3)

{

Field[nJ][nI] = 0;

delete(iField[nJ][nI]);

return true;

}

else return false;

}

void clHero::moveUp()

{

setPosY(getPosY()+1);

iHero->Top -= c_nCell;

if (bMeet()) meet();

}

void clHero::moveDown()

{

setPosY(getPosY()-1);

iHero->Top += c_nCell;

if (bMeet()) meet();

}

void clHero::moveLeft()

{

setPosX(getPosX()-1);

iHero->Left -= c_nCell;

if (bMeet()) meet();

}

void clHero::moveRight()

{

setPosX(getPosX()+1);

iHero->Left += c_nCell;

if (bMeet()) meet();

}

void clHero::meet()

{

nLevel = 1;

Game.question(nLevel);

Game.setScore(Game.getScore()+fMain->Tag);

}

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

__fastcall TfMain::TfMain(TComponent* Owner)

: TForm(Owner)

{

}

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

void __fastcall TfMain::FormCreate(TObject *Sender)

{

Randomize();

nScore = 0;

nMark = 2;

nTry = 0;

nAll = 0; //vsego geroev

fMain->Caption = "";

imBack->Height = c_nH * c_nCell;

imBack->Width = c_nW * c_nCell;

Game.init();

}

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

void __fastcall TfMain::mOpenClick(TObject *Sender)

{

TStringList *FieldFile = new TStringList();

if (OpenDialog->Execute())

{

FieldFile->LoadFromFile(OpenDialog->FileName);

}

AnsiString sTemp = FieldFile->Strings[0];

Graphics::TBitmap * imGrass = new Graphics::TBitmap;

imGrass->LoadFromFile(imGrassPath);

Graphics::TBitmap * imWall = new Graphics::TBitmap;

imWall->LoadFromFile(imWallPath);

Graphics::TBitmap * imObject = new Graphics::TBitmap;

imObject->LoadFromFile(imObjectPath);

Graphics::TBitmap * imHero = new Graphics::TBitmap;

imHero->LoadFromFile(imHeroPath);

for(int i=0; i<c_nH * c_nW; i++)

{

char cTemp = sTemp[i+1];

*pField++ = StrToInt(cTemp);

}

int T=26+(c_nH-1)*(c_nCell),L=10;

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

{

for(int j=0; j<c_nW; j++)

{

iField[i][j] = new TImage(fMain->gbMain);

iField[i][j]->Parent = fMain->gbMain;

iField[i][j]->Height = c_nCell;

iField[i][j]->Width = c_nCell;

iField[i][j]->Transparent = true;

if (Field[i][j] == 1)

{

iField[i][j]->Picture->Assign(imWall);

}

else if (Field[i][j] == 3)

{

iField[i][j]->Picture->Assign(imObject);

nAll++;

}

iField[i][j]->Top = T;

iField[i][j]->Left = L;

L+=c_nCell;

}

T-=c_nCell;

L=10;

}

iHero = new TImage(fMain->gbMain);

iHero->Picture->Assign(imHero);

iHero->Parent = fMain->gbMain;;

iHero->Height = c_nCell;

iHero->Width = c_nCell;

iHero->Top = 26 + (c_nH - 1) * c_nCell;

iHero->Left = 10 + Hero.getPosX() * c_nCell;

iHero->Transparent = true;

bCanMove = true;

}

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

void __fastcall TfMain::FormKeyPress(TObject *Sender, char &Key)

{

if ((Key == 'w')&&(Hero.bCanMoveUp()))

{

Hero.moveUp();

}

if ((Key == 's')&&(Hero.bCanMoveDown()))

{

Hero.moveDown();

}

if ((Key == 'a')&&(Hero.bCanMoveLeft()))

{

Hero.moveLeft();

}

if ((Key == 'd')&&(Hero.bCanMoveRight()))

{

Hero.moveRight();

}

}

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

void __fastcall TfMain::mExitClick(TObject *Sender)

{

Close();

}

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

void __fastcall TfMain::mAboutClick(TObject *Sender)

{

Application->MessageBox("Автоматизированная подсистема решения учебных \nзадач в условиях игровой ситуации","О программе...", MB_OK);

}

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

Модуль uTest.cpp:

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

#include <vcl.h>

#pragma hdrstop

#include "uMain.h"

#include "uTest.h"

#define datPath "dat\\Level"

#define txt ".txt"

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

#pragma package(smart_init)

#pragma resource "*.dfm"

TfTest *fTest;

AnsiString sQuestion;

AnsiString sAnswer;

AnsiString sLearn;

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

__fastcall TfTest::TfTest(TComponent* Owner)

: TForm(Owner)

{

}

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

void __fastcall TfTest::btnAnswerClick(TObject *Sender)

{

if (edAnswer->Text == sAnswer)

{

Application->MessageBox("Ответ ВЕРНЫЙ, оценка 5","Сообщение", MB_OK);

fMain->nMark = 5;

}

else

{

Application->MessageBox("Ответ НЕВЕРНЫЙ, оценка 2","Сообщение", MB_OK);

fMain->nMark = 2;

}

lblLearn->Caption = sLearn;

btnAnswer->Enabled = false;

}

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

void __fastcall TfTest::FormCreate(TObject *Sender)

{

btnAnswer->Enabled = true;

fMain->nMark = 2;

int nLevel = fMain->Tag;

AnsiString fName = datPath + IntToStr(nLevel) + txt;

TStringList *TextFile = new TStringList();

TextFile->LoadFromFile(fName);

lblQuestion->Width = 200;

lblLearn->Width = 200;

int nI = random(TextFile->Capacity/3);

sQuestion = TextFile->Strings[3*nI];

sAnswer = TextFile->Strings[3*nI+1];

sLearn = TextFile->Strings[3*nI+2];

lblQuestion->Caption = sQuestion;

delete TextFile;

}

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

void __fastcall TfTest::FormClose(TObject *Sender, TCloseAction &Action)

{

fMain->nScore += fMain->nMark;

fMain->lblMarks->Caption = IntToStr(fMain->nScore);

fMain->lblLast->Caption = IntToStr(fMain->nMark);

fMain->nTry++;

if (fMain->nTry == fMain->nAll)

{

fMain->bCanMove = false;

Application->MessageBox("Игра окончена!","Сообщение", MB_OK);

double c = (fMain->nScore / fMain->nTry);

int k;

if (c < 0) k=(c-0.5); // near int

else k=(c+0.5); // near int

fMain->lblLast->Visible = true;

fMain->lblLastTxt->Visible = true;

fMain->lblLast->Caption = IntToStr(k);

}

delete(fTest);

}

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

52