1   2   3   4   5
Ім'я файлу: Магистерская диссертация.docx
Розширення: docx
Розмір: 673кб.
Дата: 19.05.2020
скачати

Глава 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

#pragma hdrstop
#include "Unit1.h"

#include "Unit2.h"

#include "Unit3.h"

#include "Unit4.h"

#include "Unit5.h"

#include "stdio.h"

#include "math.h"

#include
#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
1   2   3   4   5

скачати

© Усі права захищені
написати до нас