- •Оглавление
- •Введение
- •Глава 1. Анализ предметной области
- •1.1. Исследование существующих игровых программ
- •1.2. Применение игровой программной ситуации для обучения
- •1.3. Общая структура игровых программ для обучения
- •1.4. Постановка задачи
- •1.5. Выводы
- •Глава 2. Разработка и исследование моделей системы обучения на основе игровой ситуации
- •2.1. Разработка сценария игрового обучения
- •2.2. Моделирование информационной базы
- •2.3. Основные алгоритмы разрешения игровой ситуации
- •2.4. Выводы
- •Глава 3. Разработка и исследование архитектуры автоматизированной системы обучения на основе игровой ситуации
- •3.1. Общая архитектура системы
- •3.2. Разработка логической модели интерфейса системы
- •3.3. Разработка базы данных для системы
- •3.4. Разработка управляющей части
- •3.5. Выводы
- •Глава 4. Программная реализация
- •4.1. Общее представление системы с точки зрения пользователя
- •4.2. Сценарий работы пользователя с системой
- •4.3. Тестирование работы системы на основе типичных ситуаций
- •4.4. Основные физические характеристики системы
- •4.5. Выводы
- •Заключение Основные результаты работы
- •Список литературы
- •Приложение Исходный код программы
Список литературы
Касихин В.В. «Как стать создателем компьютерных игр»
Архангельский А.Я. «Программирование в C++Builder6»
Bob Swart, Mark Cashman, Paul Gustavson and Jarrod Hollingworth «Borland C++ Builder 6 Developer’s Guide»
«Киберспорт в России», адрес в интернете: http://www.thercl.ru/
«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);
}
//---------------------------------------------------------------------------