Глава 3 Программная реализация группового преследования




Описание интерфейса

После нажатия на быструю клавишу(F2) начинается новая игра и рисуется сетка. Выбирается управление полицейским(F5), задаются координаты преступника относительно полицейского P1 исходя карты, чтобы просмотреть её на форме необходимо нажать «карта», по желанию можно задать дополнительных полицейских в поле количество и расположить их на карте. Затем начинается игра по кнопке старт, результат выводится в поле цена игры, при неоптимальном режиме, подсчитывается количество шагов полицейского от начала игры до поимки преступника.

 

 

Описание алгоритма программы

Программа предназначена для реализации задачи группового преследования для решения поставленной задачи используется метод объектное ориентированного программирования программа написана на языке C++ с использованием среды для разработки BorlandC++ Builder 6. Ресурсов для работы требует минимальных. Входные данные это координаты преступника относительно полицейского. выходные данные это количество шагов за которое полицейский поймает преступника и наглядное представление оптимального пути поимки. Правильность работы можно проверить аналитическим путем, посмотрев какой результат должен быть из теоретического представления.

 

Пример работы программы

Рассмотрим пример работы программы

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

 

 

В игру вступает 2 полицейских т.к преступник находится в их зоне досягаемости.

 

Заключение.

По данным теоретическим результатам и алгоритмам была написана программа.В работе описаны методы решения задач и реализованы в среде BuilderC++ в виде приложения под ОС Windows. Результаты работы программы полностью совпадают с теоретическим значением.


Список используемой литературы

[1]. Айзекс Р.Дифференциальные игры, издательство «Мир» Москва 1-й риж. переулок,2,1965г

[2]. Васин А.А., Морозов В.ВВведение в теорию игр с приложениями к экономике, Москва 2003 г

[3]. Крушеский А.В,Теория игр, Киев головное издательство издательского объединения «Вища школа» 1977 г

 

 

Приложение

//--------------------------------------------------------------------------- Unit 1.cpp

 

#include <vcl.h>

#pragma hdrstop

 

#include "Unit1.h"

#include "Unit2.h"

#include "Unit3.h"

#include "Unit4.h"

#include "Unit5.h"

#include "stdio.h"

#include "math.h"

#include <vcl\iniFiles.hpp>

 

#define MUp 0

#define MRight 1

#define MDown 2

#define MLeft 3

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

#pragma package(smart_init)

#pragma resource "*.dfm"

TForm1 *Form1;

//TCub *Police2;

TCub *Offender;

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

__fastcall TForm1::TForm1(TComponent* Owner)

: TForm(Owner)

{

NewGame=0;

control = false;

NumOfPolice = 6;

helpPolice = false;

flagMap = false;

TIniFile *ini;

ini = new TIniFile(ChangeFileExt(Application->ExeName,".INI"));

sizeH = 20;//StrToInt(ini->ReadString("матрица","Размер_ячейки","20"));

MatrixHeight = 15;//StrToInt(ini->ReadString("матрица","Высота_матрицы","13"));

MatrixWidth = 12;//StrToInt(ini->ReadString("матрица","Ширина_матрицы","10"));

MatrixFile=fopen(ini->ReadString("матрица","Файл_с_матрицей","matrix.txt").c_str(),"r");

Police_X=3;//StrToInt(ini->ReadString("матрица","Полицейский_х","2"));

Police_Y=8;//StrToInt(ini->ReadString("матрица","Полицейский_у","7"));

PoliceSpeed=2;//StrToInt(ini->ReadString("скорости","Полицейского","2"));

OffenderSpeed=1;//StrToInt(ini->ReadString("скорости","Преступника","1"));

deleteini;

Matrix=(int *)malloc(MatrixHeight*MatrixWidth*sizeof(int));

ReadMatrix(Matrix,MatrixFile,MatrixHeight,MatrixWidth);

}

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

 

void __fastcall TForm1::N5Click(TObject *Sender)

{

control = true;

Label4->Caption = "ручное";

Form1->Edit4->Enabled=true;

}

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

 

void __fastcall TForm1::N6Click(TObject *Sender)

{

control = false;

Label4->Caption = "оптимальное";

}

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

void TForm1::DrawSetka()

{

TIniFile *ini;

ini = new TIniFile(ChangeFileExt(Application->ExeName,".INI"));

sizeH = StrToInt(ini->ReadString("матрица","Размер_ячейки","20"));

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

//Горизонтальныелинии

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

{

Image1->Canvas->MoveTo(0,i*sizeH);

Image1->Canvas->LineTo(20*sizeH+1,i*sizeH);

}

//Вертикальныелинии

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

{

Image1->Canvas->MoveTo(i*sizeH,0);

Image1->Canvas->LineTo(i*sizeH,30*sizeH+1);

}

}

 

void __fastcall TForm1::N2Click(TObject *Sender)

{

NewGame=1;

PushStart=0;

 

Image1->Canvas->Pen->Color=clWhite;

Image1->Canvas->Rectangle(0,0,Image1->Width,Image1->Height);

 

Form1->DrawSetka();

//если Police создано, то удаляем его

if (Police!= NULL) {

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

if (Police[i]!= NULL) {delete Police[i];}

}

free(Police);

}

//если Offender создан, то удаляем его

if (Offender!=NULL) {delete Offender;}

//Police[6] = new TCub(15,10,clYellow,Image1);

//Police2=new TCub(15,18,clRed,Image1);

//PositionMatr=MUp;

Form1->Label10->Visible= false;

Form1->Label6->Visible= true;

Form1->Label11->Visible= false;

Form1->Label12->Visible= false;

//Form1->Label13->Visible= false;

Form1->Edit3->Text=' ';

Form1->Edit4->Text=' ';

Form1->Button1->Enabled=true;

Form1->Edit1->Enabled=true;

Form1->Edit2->Enabled=true;

PositionMatr=MUp;

}

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

 

DWORD WINAPI ClientThread1(LPVOID lpParam)

{

//TODO: продумать нормально как тут организовать

while (1)

{

Form1->LogikaPolice(Offender->GetX(), Offender->GetY(), Form1->Police[1]);

}

return 0;

}

 

bool TForm1::Proverka(TCub *Police)//проверка на попадание преступника в сетку полицейского

{

bool temp = true;

intPosX,PosY;

intPositionMatrix = PositionM(Police->GetLastX(), Police->GetLastY(),

Police->GetX(), Police->GetY());

switch (PositionMatrix)

{

caseMUp:

if (!((Offender->GetX() - Police->GetX() >= -3 && Offender->GetX() - Police->GetX() <= 8) &&

(Offender->GetY() - Police->GetY() >= -8 && Offender->GetY() - Police->GetY() <= 6)))

temp = false;

else

{

PosY=Police_Y+Offender->GetY()-Police->GetY();

PosX=Police_X+Offender->GetX()-Police->GetX();

}

break;

caseMDown:

if (!((Offender->GetX() - Police->GetX() >= -8 && Offender->GetX() - Police->GetX() <= 3) &&

(Offender->GetY() - Police->GetY() >= -6 && Offender->GetY() - Police->GetY() <= 8)))

temp = false;

else

{

PosY=Police_Y-Offender->GetY()+Police->GetY();

PosX=Police_X-Offender->GetX()+Police->GetX();

}

break;

caseMRight:

if (!((Offender->GetX() - Police->GetX() >= -6 && Offender->GetX() - Police->GetX() <= 8) &&

(Offender->GetY() - Police->GetY() >= -3 && Offender->GetY() - Police->GetY() <= 8)))

temp = false;

else

{

PosY=Police_Y-Offender->GetX()+Police->GetX();

PosX=Police_X+Offender->GetY()-Police->GetY();

}

break;

caseMLeft:

if (!((Offender->GetX() - Police->GetX() >= -8 && Offender->GetX() - Police->GetX() <= 6) &&

(Offender->GetY() - Police->GetY() >= -8 && Offender->GetY() - Police->GetY() <= 3)))

temp = false;

else

{

PosY=Police_Y+Offender->GetX()-Police->GetX();

PosX=Police_X-Offender->GetY()+Police->GetY();

}

break;

}

if (temp == true) {

if (*(Matrix+PosY*MatrixWidth+PosX) == -1) {

temp = false;

}

}

return temp;

}

 

boolTForm1::EndOfGame()//проверканаконецигры

{

bool temp = true;

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

//если они стоят далеко друг от друга

if (!((fabs(Police[i]->GetX()-Offender->GetX())<=PoliceSpeed-OffenderSpeed)&&

(fabs(Police[i]->GetY()-Offender->GetY())<=PoliceSpeed-OffenderSpeed)))

{

temp = false;

}

else

{

temp = true;

break;

}

}

return temp;

}

 

void __fastcall TForm1::Button1Click(TObject *Sender)

{

PushStart=1;

DWORD dwThreadId;

HANDLE hThread;

 

NumOfPolice = Edit5->Text.ToInt();

 

Police = (TCub **)malloc(NumOfPolice*sizeof(TCub *));

Police[0]=new TCub(10,16,clRed,Image1);

for (int i = 1; i <NumOfPolice; i++) {

Police[i]=new TCub(rand()%20,rand()%30,clRed,Image1);

//Police[2]->Move(PoliceSpeed,0,Image1);

}

/*Police[0]=new TCub(10,16,clRed,Image1);

Police[1]=new TCub(15,18,clRed,Image1);

Police[2]=new TCub(-1,1,clRed,Image1);

Police[2]->Move(PoliceSpeed,0,Image1);

Police[3]=new TCub(19,-1,clRed,Image1);

Police[3]->Move(0,PoliceSpeed,Image1);

Police[4]=new TCub(21,29,clRed,Image1);

Police[4]->Move(-PoliceSpeed,0,Image1);

Police[5]=new TCub(1,31,clRed,Image1);

Police[5]->Move(0,-PoliceSpeed,Image1);*/

//Form1->Edit3->Enabled=true;

try

{

Offender=new TCub(StrToInt(Edit1->Text)+10,16-StrToInt(Edit2->Text),clBlue,Image1);

}

catch (...)

{

MessageBox(NULL,"Нехватаетданных","Ошибка",MB_OK | MB_ICONERROR);

}

 

Edit3->Text=*(Matrix+(Police_Y+Offender->GetY()-Police[0]->GetY())*MatrixWidth+Police_X+Offender->GetX()-Police[0]->GetX());

/*if ((*(Matrix+(Police_Y+Offender->GetY()-Police->GetY())*MatrixWidth+Police_X+Offender->GetX()-Police->GetX())==-1)||

(Police_Y+Offender->GetY()-Police->GetY()>MatrixHeight)||

(Police_X+Offender->GetX()-Police->GetX()>MatrixWidth))

{

MessageBox(NULL,"Полицейскийнепоймаетпреступника","Сообщение",MB_OK | MB_ICONINFORMATION);

}

else

{*/

if (!control) {GamesProcess();}//автоматическое

else //ручное

{

//TODO: тут нужно создавать новый поток, в котором должен ходить полицейский

MSG msg;

PoliceShag=0;

Edit3->Text=*(Matrix+(Police_Y+Offender->GetY()-Police[0]->GetY())*MatrixWidth+Police_X+Offender->GetX()-Police[0]->GetX());

 

CenaControl=0;

while (!EndOfGame())

{

if (PeekMessage(&msg, NULL, NULL, NULL, PM_REMOVE))

{

TranslateMessage(&msg);

DispatchMessage(&msg);

if (msg.message == WM_QUIT) break;

}

if (PoliceShag)

{

if (Proverka(Police[1]))

{

Form1->LogikaPolice(Offender->GetX(),Offender->GetY(), Police[1]);

}

// if (Proverka(Police[6]))

//{

//Form1->LogikaPolice(Offender->GetX(),Offender->GetY(), Police[6]);

//}

if (!EndOfGame()) {

Form1->LogikaOffender();

}

PoliceShag=0;

}

 

}

//control=false;

Edit4->Text = CenaControl;

 

}

//}

 

//Form1->LogikaOffender(Police->GetX(),Police->GetY(),MUp);

}

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

 

void __fastcall TForm1::N3Click(TObject *Sender)

{

Close();

}

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

void __fastcall TForm1::N11Click(TObject *Sender)

{

TIniFile *ini;

ini = new TIniFile(ChangeFileExt(Application->ExeName,".INI"));

Application->CreateForm(__classid(TForm3), &Form3);

Form1->Enabled = false;

Form3->Edit1->Text = StrToInt(ini->ReadString("матрица","Размер_ячейки","20"));

Form3->Edit2->Text = ini->ReadString("матрица","Файл_с_матрицей","").c_str();

Form3->Visible = true;

deleteini;

}

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

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

{

fclose(MatrixFile);

}

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

void TForm1::ReadMatrix(int *M,FILE *F,intHeightM, intWidthM)

{

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

{

for (int j=0; j<WidthM-1; j++)

{

fscanf(F,"%i ",&(*(M+i*WidthM+j)));

}

fscanf(F,"%i\n",&(*(M+i*WidthM+WidthM-1)));

}

}

 

void TForm1::LogikaOffender()

{

intGlobalMaxX = 0;

intGlobalMaxY = 0;

intGlobalPosX = 0;

intGlobalPosY = 0;

int Global = 100;//Значениематрицывточке (GlobalMaxX, GlobalMaxY)

intGlobalPositionMatrix;

intPositionMatrix;

intPosX,PosY;//Координатыпреступникавматрицеизфайла

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

{

if (Proverka(Police[i]))//если преступник попал в сетку полицейского

{

//вPositionMatrixзаноситсянапривлениематрицы

PositionMatrix = PositionM(Police[i]->GetLastX(), Police[i]->GetLastY(),

Police[i]->GetX(), Police[i]->GetY());

switch (PositionMatrix)

{

caseMUp:

//DONE: понятьзачтоотвечаетPolice_X, Police_Y

PosY=Police_Y+Offender->GetY()-Police[i]->GetY();

PosX=Police_X+Offender->GetX()-Police[i]->GetX();

break;

caseMRight:

PosY=Police_Y-Offender->GetX()+Police[i]->GetX();

PosX=Police_X+Offender->GetY()-Police[i]->GetY();

break;

caseMDown:

PosY=Police_Y-Offender->GetY()+Police[i]->GetY();

PosX=Police_X-Offender->GetX()+Police[i]->GetX();

break;

caseMLeft:

PosY=Police_Y+Offender->GetX()-Police[i]->GetX();

PosX=Police_X-Offender->GetY()+Police[i]->GetY();

break;

}

intMaxX;

intMaxY;

if (*(Matrix+(PosY+1)*MatrixWidth+PosX)>=(*(Matrix+(PosY-1)*MatrixWidth+PosX)))

{

MaxX=PosX;

MaxY=PosY+1;

} //определяем в какую сторону ходить преступнику

else

{

MaxX=PosX;

MaxY=PosY-1;

}

if (*(Matrix+MaxY*MatrixWidth+MaxX)<=(*(Matrix+PosY*MatrixWidth+PosX+1)))

{

MaxX=PosX+1;

MaxY=PosY;

}

if (*(Matrix+MaxY*MatrixWidth+MaxX)<=(*(Matrix+PosY*MatrixWidth+PosX-1)))

{

MaxX=PosX-1;

MaxY=PosY;

}

 

if (Global > *(Matrix+MaxY*MatrixWidth+MaxX)) {

Global = *(Matrix+MaxY*MatrixWidth+MaxX);

GlobalMaxX = MaxX;

GlobalMaxY = MaxY;

GlobalPositionMatrix = PositionMatrix;

GlobalPosX = PosX;

GlobalPosY = PosY;

}

}

}// for (int i = 0; i <NumOfPolice; i++)

 

//проверка относительно других полицейских

 

 

switch (GlobalPositionMatrix)

{

caseMUp:

Offender->Move(GlobalMaxX-GlobalPosX,GlobalMaxY-GlobalPosY,Image1);

break;

caseMRight:

Offender->Move(GlobalPosY-GlobalMaxY,GlobalMaxX-GlobalPosX,Image1);

break;

caseMDown:

Offender->Move(GlobalPosX-GlobalMaxX,GlobalPosY-GlobalMaxY,Image1);

break;

caseMLeft:

Offender->Move(GlobalMaxY-GlobalPosY,GlobalPosX-GlobalMaxX,Image1);

break;

}

}

 

void TForm1::LogikaPatrol(intOffenderX, intOffenderY, TCub *PoliceTmp)

{

intPositionMatrix = PositionM(PoliceTmp->GetLastX(), PoliceTmp->GetLastY(),

PoliceTmp->GetX(), PoliceTmp->GetY());

if (Proverka(PoliceTmp)) {

switch (PositionMatrix)

{

caseMUp:

if ((OffenderY-PoliceTmp->GetY()<=-PoliceSpeed)||

((OffenderX-PoliceTmp->GetX()>=2*PoliceSpeed)&&(OffenderY-PoliceTmp->GetY()==-OffenderSpeed)))

{

PoliceTmp->Move(0,-PoliceSpeed,Image1);

}

else

{

PoliceTmp->Move(PoliceSpeed,0,Image1);

}

break;

caseMRight:

if ((PoliceTmp->GetX()-OffenderX<=-PoliceSpeed)||

((OffenderY-PoliceTmp->GetY()>=2*PoliceSpeed)&&(PoliceTmp->GetX()-OffenderX==-OffenderSpeed)))

{

PoliceTmp->Move(PoliceSpeed,0,Image1);

}

else

{

PoliceTmp->Move(0,PoliceSpeed,Image1);

}

break;

caseMDown:

if ((PoliceTmp->GetY()-OffenderY<=-PoliceSpeed)||

((PoliceTmp->GetX()-OffenderX>=2*PoliceSpeed)&&(PoliceTmp->GetY()-OffenderY==-OffenderSpeed)))

{

PoliceTmp->Move(0,PoliceSpeed,Image1);

}

else

{

PoliceTmp->Move(-PoliceSpeed,0,Image1);

}

break;

caseMLeft:

if ((OffenderX-PoliceTmp->GetX()<=-PoliceSpeed)||

((PoliceTmp->GetY()-OffenderY>=2*PoliceSpeed)&&(OffenderX-PoliceTmp->GetX()==-OffenderSpeed)))

{

PoliceTmp->Move(-PoliceSpeed,0,Image1);

}

else

{

PoliceTmp->Move(0,-PoliceSpeed,Image1);

}

break;

}

}

else {

switch (PositionMatrix)

{

caseMUp:

if (PoliceTmp->GetY()>1) {

PoliceTmp->Move(0,-PoliceSpeed,Image1);

}

else {

PoliceTmp->Move(PoliceSpeed,0,Image1);

}

break;

caseMRight:

if (PoliceTmp->GetX()<19) {

PoliceTmp->Move(PoliceSpeed,0,Image1);

}

else {

PoliceTmp->Move(0,PoliceSpeed,Image1);

}

caseMDown:

if (PoliceTmp->GetY()<29) {

PoliceTmp->Move(0,PoliceSpeed,Image1);

}

else {

PoliceTmp->Move(-PoliceSpeed,0,Image1);

}

caseMLeft:

if (PoliceTmp->GetX()>1) {

PoliceTmp->Move(-PoliceSpeed,0,Image1);

}

else {

PoliceTmp->Move(0,-PoliceSpeed,Image1);

}

break;

}

}

}

 

void TForm1::LogikaPolice(intOffenderX, intOffenderY, TCub *PoliceTmp)

{

intPositionMatrix = PositionM(PoliceTmp->GetLastX(), PoliceTmp->GetLastY(),

PoliceTmp->GetX(), PoliceTmp->GetY());

switch (PositionMatrix)

{

caseMUp:

if ((OffenderY-PoliceTmp->GetY()<=-PoliceSpeed)||

((OffenderX-PoliceTmp->GetX()>=2*PoliceSpeed)&&(OffenderY-PoliceTmp->GetY()==-OffenderSpeed)))

{

PoliceTmp->Move(0,-PoliceSpeed,Image1);

}

else

{

PoliceTmp->Move(PoliceSpeed,0,Image1);

}

break;

caseMRight:

if ((PoliceTmp->GetX()-OffenderX<=-PoliceSpeed)||

((OffenderY-PoliceTmp->GetY()>=2*PoliceSpeed)&&(PoliceTmp->GetX()-OffenderX==-OffenderSpeed)))

{

PoliceTmp->Move(PoliceSpeed,0,Image1);

}

else

{

PoliceTmp->Move(0,PoliceSpeed,Image1);

}

break;

caseMDown:

if ((PoliceTmp->GetY()-OffenderY<=-PoliceSpeed)||

((PoliceTmp->GetX()-OffenderX>=2*PoliceSpeed)&&(PoliceTmp->GetY()-OffenderY==-OffenderSpeed)))

{

PoliceTmp->Move(0,PoliceSpeed,Image1);

}

else

{

PoliceTmp->Move(-PoliceSpeed,0,Image1);

}

break;

caseMLeft:

if ((OffenderX-PoliceTmp->GetX()<=-PoliceSpeed)||

((PoliceTmp->GetY()-OffenderY>=2*PoliceSpeed)&&(OffenderX-PoliceTmp->GetX()==-OffenderSpeed)))

{

PoliceTmp->Move(-PoliceSpeed,0,Image1);

}

else

{

PoliceTmp->Move(0,-PoliceSpeed,Image1);

}

break;

}

}

 

int TForm1::PositionM(intlastX, intlastY, intnewX, intnewY)

{

inttemp;//возвращаемое значение

if (lastX==newX)

{

if (newY>lastY)

{

temp=MDown;

}

else

{

temp=MUp;

}

}

else

{

if (newX>lastX)

{

temp=MRight;

}

else

{

temp=MLeft;

}

}

return temp;

}

 

void TForm1::GamesProcess()

{

booltmp=1;

if (!EndOfGame())

{

if (tmp)

{

Timer2->Enabled = true;

Sleep(250);

Timer1->Enabled = true;

if (tmp==1) {tmp=0;}

else {tmp=1;}

}

}

}

void __fastcall TForm1::Timer1Timer(TObject *Sender)

{

Form1->LogikaOffender();

}

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

 

void __fastcall TForm1::Timer2Timer(TObject *Sender)

{

Form1->LogikaPolice(Offender->GetX(),Offender->GetY(), Police[0]);

for (int i = 1; i <NumOfPolice; i++) {

if (Proverka(Police[i]))

{

//if (*(Matrix+(Police_Y+Offender->GetY()-Police[1]->GetY())*MatrixWidth+Police_X+Offender->GetX()-Police[1]->GetX())!=-1)

Form1->LogikaPolice(Offender->GetX(),Offender->GetY(), Police[i]);

}

}

//if (Proverka(Police[6]))

//{

//if (*(Matrix+(Police_Y+Offender->GetY()-Police[1]->GetY())*MatrixWidth+Police_X+Offender->GetX()-Police[1]->GetX())!=-1)

// Form1->LogikaPolice(Offender->GetX(),Offender->GetY(), Police[6]);

//}

//TODO: Понять почему не работает второй и третий полицейский

//Form1->LogikaPatrol(Offender->GetX(),Offender->GetY(), Police[2]);

//Form1->LogikaPatrol(Offender->GetX(),Offender->GetY(), Police[3]);

//Form1->LogikaPatrol(Offender->GetX(),Offender->GetY(), Police[4]);

//Form1->LogikaPatrol(Offender->GetX(),Offender->GetY(), Police[5]);

if (EndOfGame())

{

Timer1->Enabled = false;

Timer2->Enabled = false;

}

}

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

 

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

TShiftState Shift)

{

if (control&&PushStart)

{

//TODO: переделать PositionMatr, чтобы считалась тут

switch (Key)

{

case VK_UP:

if ((PositionMatr==MUp)||(PositionMatr==MLeft))

{

Police[0]->Move(0,-PoliceSpeed,Image1);

PositionMatr = PositionM(Police[0]->GetLastX(),Police[0]->GetLastY(),Police[0]->GetX(),Police[0]->GetY());

PoliceShag=1;

CenaControl++;

//Form1->LogikaOffender(Police->GetX(),Police->GetY(),PositionMatr);

}

break;

case VK_RIGHT:

if ((PositionMatr==MUp)||(PositionMatr==MRight))

{

Police[0]->Move(PoliceSpeed,0,Image1);

PositionMatr = PositionM(Police[0]->GetLastX(),Police[0]->GetLastY(),Police[0]->GetX(),Police[0]->GetY());

PoliceShag=1;

CenaControl++;

//Form1->LogikaOffender(Police->GetX(),Police->GetY(),PositionMatr);

}

break;

case VK_DOWN:

if ((PositionMatr==MDown)||(PositionMatr==MRight))

{

Police[0]->Move(0,PoliceSpeed,Image1);

PositionMatr = PositionM(Police[0]->GetLastX(),Police[0]->GetLastY(),Police[0]->GetX(),Police[0]->GetY());

PoliceShag=1;

CenaControl++;

//Form1->LogikaOffender(Police->GetX(),Police->GetY(),PositionMatr);

}

break;

case VK_LEFT:

if ((PositionMatr==MDown)||(PositionMatr==MLeft))

{

Police[0]->Move(-PoliceSpeed,0,Image1);

PositionMatr = PositionM(Police[0]->GetLastX(),Police[0]->GetLastY(),Police[0]->GetX(),Police[0]->GetY());

PoliceShag=1;

CenaControl++;

//Form1->LogikaOffender(Police->GetX(),Police->GetY(),PositionMatr);

}

break;

case VK_SPACE:

helpPolice = true;

break;

}

}

}

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

 

void __fastcall TForm1::N8Click(TObject *Sender)

{

Application->CreateForm(__classid(TAboutBox), &AboutBox);

AboutBox->ShowModal();

AboutBox->Free();

}

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

void __fastcall TForm1::BitBtn1Click(TObject *Sender)

{

Close();

}

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

 

 

void __fastcall TForm1::Button2Click(TObject *Sender)

{

if (!flagMap) {

Application->CreateForm(__classid(TForm5), &Form5);

Form5->Show();

flagMap = true;

}

}

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

//---------------------------------------------------------------------------Unit2.cpp

 

 

#pragma hdrstop

 

#include "Unit2.h"

#include "Unit1.h"

#include "stdio.h"

 

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

 

#pragma package(smart_init)

TCub::TCub(intnewX, intnewY, TColortColor, TImage *Img)

{

x=newX;

y=newY;

lastX=x;

lastY=y;

color=tColor;

Point(Img, 1);

}

 

voidTCub::ChangeCoord(int dx, intdy)

{

lastX=x;

lastY=y;

x=x+dx;

y=y+dy;

}

 

voidTCub::Point(TImage *Img, boolVisibleFlag)

{

intsizeH=Form1->sizeH;

switch (VisibleFlag)

{

case true:

Img->Canvas->Pen->Color = color;

break;

case false:

Img->Canvas->Pen->Color = clWhite;

break;

}

Img->Canvas->Pen->Width = sizeH/2;

Img->Canvas->Ellipse(sizeH*(x-0.25),sizeH*(y-0.25),sizeH*(x+0.25),sizeH*(y+0.25));

Img->Canvas->Pen->Width = 1;

// TODO: Доделать это условие. Понять что там происходит и почему не рисует.

if (lastX!= x || lastY!= y) {

if (!VisibleFlag)

{

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

Img->Canvas->MoveTo(x*sizeH,sizeH*(y-0.5));

Img->Canvas->LineTo(sizeH*x,sizeH*(y+0.5));

Img->Canvas->MoveTo(sizeH*(x-0.5),sizeH*y);

Img->Canvas->LineTo(sizeH*(x+0.5),sizeH*y);

}

else

{

Img->Canvas->Pen->Width = sizeH/4;

Img->Canvas->Pen->Color = color;

Img->Canvas->MoveTo(lastX*sizeH,lastY*sizeH);

Img->Canvas->LineTo(x*sizeH,y*sizeH);

Img->Canvas->Pen->Width = 1;

}

}

}

 

voidTCub::Move(int dx, intdy, TImage *Img)

{

Point(Img, 0);

ChangeCoord(dx,dy);

Point(Img, 1);

}

 

intTCub::GetX()

{

return x;

}

 

intTCub::GetY()

{

return y;

}

 

intTCub::GetLastX()

{

returnlastX;

}

 

intTCub::GetLastY()

{

returnlastY;

}

 

 

//---------------------------------------------------------------------------Unit3.cpp

 

#include <vcl.h>

#pragma hdrstop

 

#include "Unit3.h"

#include "Unit1.h"

#include <vcl\iniFiles.hpp>

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

#pragma package(smart_init)

#pragma resource "*.dfm"

TForm3 *Form3;

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

__fastcall TForm3::TForm3(TComponent* Owner)

: TForm(Owner)

{

}

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

 

void __fastcall TForm3::Button1Click(TObject *Sender)

{

if (Form3->OpenDialog1->Execute())

{

Edit2->Text = OpenDialog1->FileName;

}

}

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

 

void __fastcall TForm3::Button3Click(TObject *Sender)

{

Form3->Close();

}

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

 

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

{

Form1->Enabled = true;

}

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

 

 

void __fastcall TForm3::Button2Click(TObject *Sender)

{

TIniFile *ini;

ini = new TIniFile(ChangeFileExt(Application->ExeName,".INI"));

ini->WriteString("матрица","Размер_ячейки",Edit1->Text);

ini->WriteString("матрица","Файл_с_матрицей",Edit2->Text);

deleteini;

if (Form1->NewGame == 1)

{

Form1->N2Click(NULL);

}

MessageBox(NULL,"Изменениясохранены","Сообщение",MB_OK | MB_ICONINFORMATION);

Form3->Close();

}

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

 

 

 



Поделиться:




Поиск по сайту

©2015-2024 poisk-ru.ru
Все права принадлежать их авторам. Данный сайт не претендует на авторства, а предоставляет бесплатное использование.
Дата создания страницы: 2022-11-27 Нарушение авторских прав и Нарушение персональных данных


Поиск по сайту: