Добавил:
Upload Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз: Предмет: Файл:
Магистерская диссертация.docx
Скачиваний:
4
Добавлен:
29.10.2018
Размер:
688.96 Кб
Скачать

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

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

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

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

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

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

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

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

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

4.Заключение.

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

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

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

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

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

6.Приложение

//--------------------------------------------------------------------------- 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"));

delete ini;

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;

int PosX,PosY;

int PositionMatrix = PositionM(Police->GetLastX(), Police->GetLastY(),

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

switch (PositionMatrix)

{

case MUp:

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;

case MDown:

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;

case MRight:

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;

case MLeft:

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;

}

bool TForm1::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;

delete ini;

}

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

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

{

fclose(MatrixFile);

}

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

void TForm1::ReadMatrix(int *M,FILE *F,int HeightM, int WidthM)

{

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()

{

int GlobalMaxX = 0;

int GlobalMaxY = 0;

int GlobalPosX = 0;

int GlobalPosY = 0;

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

int GlobalPositionMatrix;

int PositionMatrix;

int PosX,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)

{

case MUp:

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

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

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

break;

case MRight:

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

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

break;

case MDown:

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

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

break;

case MLeft:

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

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

break;

}

int MaxX;

int MaxY;

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)

{

case MUp:

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

break;

case MRight:

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

break;

case MDown:

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

break;

case MLeft:

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

break;

}

}

void TForm1::LogikaPatrol(int OffenderX, int OffenderY, TCub *PoliceTmp)

{

int PositionMatrix = PositionM(PoliceTmp->GetLastX(), PoliceTmp->GetLastY(),

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

if (Proverka(PoliceTmp)) {

switch (PositionMatrix)

{

case MUp:

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;

case MRight:

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;

case MDown:

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;

case MLeft:

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)

{

case MUp:

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

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

}

else {

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

}

break;

case MRight:

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

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

}

else {

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

}

case MDown:

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

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

}

else {

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

}

case MLeft:

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

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

}

else {

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

}

break;

}

}

}

void TForm1::LogikaPolice(int OffenderX, int OffenderY, TCub *PoliceTmp)

{

int PositionMatrix = PositionM(PoliceTmp->GetLastX(), PoliceTmp->GetLastY(),

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

switch (PositionMatrix)

{

case MUp:

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;

case MRight:

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;

case MDown:

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;

case MLeft:

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(int lastX, int lastY, int newX, int newY)

{

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

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()

{

bool tmp=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(int newX, int newY, TColor tColor, TImage *Img)

{

x=newX;

y=newY;

lastX=x;

lastY=y;

color=tColor;

Point(Img, 1);

}

void TCub::ChangeCoord(int dx, int dy)

{

lastX=x;

lastY=y;

x=x+dx;

y=y+dy;

}

void TCub::Point(TImage *Img, bool VisibleFlag)

{

int sizeH=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;

}

}

}

void TCub::Move(int dx, int dy, TImage *Img)

{

Point(Img, 0);

ChangeCoord(dx,dy);

Point(Img, 1);

}

int TCub::GetX()

{

return x;

}

int TCub::GetY()

{

return y;

}

int TCub::GetLastX()

{

return lastX;

}

int TCub::GetLastY()

{

return lastY;

}

//---------------------------------------------------------------------------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);

delete ini;

if (Form1->NewGame == 1)

{

Form1->N2Click(NULL);

}

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

Form3->Close();

}

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

36