📄 decisionthread.cpp
字号:
// DecisionThread.cpp : implementation file
//
#include "stdafx.h"
#include "Robocup.h"
#include "DecisionThread.h"
#include "Global.h"
#include "windows.h"
#include "stdlib.h"
#include "stdio.h"
#include "DebugDlg.h"
#include "videodlg.h"
#include "object.h"
#include "afx.h"
#include "robocupdoc.h"
#include "robocupview.h"
#include "conio.h"
#ifdef _DEBUG
#define new DEBUG_NEW
#undef THIS_FILE
static char THIS_FILE[] = __FILE__;
#endif
/////////////////////////////////////////////////////////////////////////////
// CDecisionThread
//周全7.26.---23:00多线程已经实现,同步问题已经解决!!!!!
IMPLEMENT_DYNCREATE(CDecisionThread, CWinThread)
CDecisionThread::CDecisionThread()
{
m_pDeciThread=0;
}
CDecisionThread::~CDecisionThread()
{
delete m_pDeciThread;
}
BOOL CDecisionThread::InitInstance()
{
// TODO: perform and per-thread initialization here
return TRUE;
}
int CDecisionThread::ExitInstance()
{
// TODO: perform any per-thread cleanup here
return CWinThread::ExitInstance();
}
BEGIN_MESSAGE_MAP(CDecisionThread, CWinThread)
//{{AFX_MSG_MAP(CDecisionThread)
// NOTE - the ClassWizard will add and remove mapping macros here.
//}}AFX_MSG_MAP
END_MESSAGE_MAP()
/////////////////////////////////////////////////////////////////////////////
// CDecisionThread message handlers
#define findball1 1
#define findball2 4
#define defenceball1 3
#define defenceball2 2
#define goalieball 5
UINT DecisionProc(LPVOID pParam);
UINT DecisionProc2(LPVOID pParam);
UINT DecisionProc(LPVOID pParam)//上半场策略:从左往右进攻
{
::WaitForSingleObject(HMutex,INFINITE);
MSG lpMsg;
PeekMessage(&lpMsg,NULL,0,0,PM_REMOVE);
if((GetKeyState(VK_RSHIFT) &0x80) == 0x80)
{
g_MyTeam[1].BasicAct(0,0,0,0);
g_MyTeam[2].BasicAct(0,0,0,0);
g_MyTeam[3].BasicAct(0,0,0,0);
g_MyTeam[4].BasicAct(0,0,0,0);
g_MyTeam[5].BasicAct(0,0,0,0);
return 0;
}
switch(monitor.playmode)
{
case 'H':case 'S':case 'k':case'K':case 'p':case 'P':case 'f':case'F':case 'i':case'I':case't':case 'T':case '':case 'z':case 'Z':case 'g':case 'G':case 'd':case 'D':case 'y':case 'Y':case 'r':case 'R':case 'c'
{
Player::AllStop();
break;
}
case 's':case '1':case 'h':case '2':case 'o':case 'O':case 'a':
{//FindBall决策
if(isScanBall)
{
if(isScanMyteam[findball1-1])//采用FindBall决策的机器人编号1
{
g_MyTeam[findball1].losttime=0;
g_Deci[findball1].Boundary(g_MyTeam[findball1]);
if (!g_Deci[findball1].isboundary)
{
g_Deci[findball1].FindBall(g_MyTeam[findball1]);
}
}
else
{
g_MyTeam[findball1].losttime++;
g_Deci[findball1].LostObject(g_MyTeam[findball1]);
}
if(isScanMyteam[findball2-1])//采用FindBall决策的机器人编号2
{
g_MyTeam[findball2].losttime=0;
g_Deci[findball2].Boundary(g_MyTeam[findball2]);
if (!g_Deci[findball2].isboundary)
{
g_Deci[findball2].FindBall(g_MyTeam[findball2]);
}
}
else
{
g_MyTeam[findball2].losttime++;
g_Deci[findball2].LostObject(g_MyTeam[findball2]);
}
////////////////////////////////////////////////////////////////////////////////////
if(isScanMyteam[defenceball1-1])//采用DefenceBall决策的机器人编号
{
g_MyTeam[defenceball1].losttime=0;
g_Deci[defenceball1].Boundary(g_MyTeam[defenceball1]);
if (!g_Deci[defenceball1].isboundary)
{
if(g_Ball.Get_vPos().x <=abs(Player::FieldStruct.m_Field.Width()*3/8))
{
g_Deci[defenceball1].FindBall(g_MyTeam[defenceball1]);
}
}
}
else
{
g_MyTeam[defenceball1].losttime++;
if(g_MyTeam[defenceball1].losttime>30)
{
g_Deci[defenceball1].LostObject(g_MyTeam[defenceball1]);
}
}
if(isScanMyteam[defenceball2-1])//采用DefenceBall决策的机器人编号
{
g_MyTeam[defenceball2].losttime=0;
g_Deci[defenceball2].Boundary(g_MyTeam[defenceball2]);
if (!g_Deci[defenceball2].isboundary)
{
if(g_Ball.Get_vPos().x <=abs(Player::FieldStruct.m_Field.Width()*3/8))
{
g_Deci[defenceball2].FindBall(g_MyTeam[defenceball2]);
}
}
}
else
{
g_MyTeam[defenceball2].losttime++;
if(g_MyTeam[defenceball1].losttime>30)
{
g_Deci[defenceball2].LostObject(g_MyTeam[defenceball1]);
}
}
////////////////////////////////////////////////////////////////////////////////////////////////
if(isScanMyteam[goalieball-1])//采用GoalieBall决策的机器人编号
{
g_MyTeam[goalieball].losttime=0;
g_Deci[goalieball].Boundary(g_MyTeam[defenceball2]);
if (!g_Deci[goalieball].isboundary)
{
if(g_Ball.Get_vPos().x <=abs(Player::FieldStruct.m_Field.Width()/6))
{
g_Deci[goalieball].FindBall(g_MyTeam[goalieball]);
}
}
}
else
{
g_MyTeam[goalieball].losttime++;
if(g_MyTeam[goalieball].losttime>30)
{
g_Deci[goalieball].LostObject(g_MyTeam[goalieball]);
}
}
}
}
}
::ReleaseMutex(HMutex);//释放信号量
pDThread->NewRound();
return 0;
}
UINT DecisionProc2(LPVOID pParam)//下半场策略:从右往左进攻
{
::WaitForSingleObject(HMutex,INFINITE);
MSG lpMsg;
PeekMessage(&lpMsg,NULL,0,0,PM_REMOVE);
if((GetKeyState(VK_RSHIFT) &0x80) == 0x80)
{
g_MyTeam[1].BasicAct(0,0,0,0);
g_MyTeam[2].BasicAct(0,0,0,0);
g_MyTeam[3].BasicAct(0,0,0,0);
g_MyTeam[4].BasicAct(0,0,0,0);
g_MyTeam[5].BasicAct(0,0,0,0);
return 0;
}
switch(monitor.playmode)
{
case 'H':case 'S':case 'k':case'K':case 'p':case 'P':case 'f':case'F':case 'i':case'I':case't':case 'T':case '':case 'z':case 'Z':case 'g':case 'G':case 'd':case 'D':case 'y':case 'Y':case 'r':case 'R':case 'c'
{
Player::AllStop();
break;
}
case 's':case '1':case 'h':case '2':case 'o':case 'O':case 'a':
{//FindBall决策
if(isScanBall)
{
if(isScanMyteam[findball1-1])//采用FindBall决策的机器人编号1
{
g_MyTeam[findball1].losttime=0;
g_Deci[findball1].Boundary(g_MyTeam[findball1]);
if (!g_Deci[findball1].isboundary)
{
g_Deci[findball1].FindBall(g_MyTeam[findball1]);
}
}
else
{
g_MyTeam[findball1].losttime++;
g_Deci[findball1].LostObject(g_MyTeam[findball1]);
}
if(isScanMyteam[findball2-1])//采用FindBall决策的机器人编号2
{
g_MyTeam[findball2].losttime=0;
g_Deci[findball2].Boundary(g_MyTeam[findball2]);
if (!g_Deci[findball2].isboundary)
{
g_Deci[findball2].FindBall(g_MyTeam[findball2]);
}
}
else
{
g_MyTeam[findball2].losttime++;
g_Deci[findball2].LostObject(g_MyTeam[findball2]);
}
////////////////////////////////////////////////////////////////////////////////////
if(isScanMyteam[defenceball1-1])//采用DefenceBall决策的机器人编号
{
g_MyTeam[defenceball1].losttime=0;
g_Deci[defenceball1].Boundary(g_MyTeam[defenceball1]);
if (!g_Deci[defenceball1].isboundary)
{
if(g_Ball.Get_vPos().x <=abs(Player::FieldStruct.m_Field.Width()*3/8))
{
g_Deci[defenceball1].FindBall(g_MyTeam[defenceball1]);
}
}
}
else
{
g_MyTeam[defenceball1].losttime++;
if(g_MyTeam[defenceball1].losttime>30)
{
g_Deci[defenceball1].LostObject(g_MyTeam[defenceball1]);
}
}
if(isScanMyteam[defenceball2-1])//采用DefenceBall决策的机器人编号
{
g_MyTeam[defenceball2].losttime=0;
g_Deci[defenceball2].Boundary(g_MyTeam[defenceball2]);
if (!g_Deci[defenceball2].isboundary)
{
if(g_Ball.Get_vPos().x <=abs(Player::FieldStruct.m_Field.Width()*3/8))
{
g_Deci[defenceball2].FindBall(g_MyTeam[defenceball2]);
}
}
}
else
{
g_MyTeam[defenceball2].losttime++;
if(g_MyTeam[defenceball1].losttime>30)
{
g_Deci[defenceball2].LostObject(g_MyTeam[defenceball1]);
}
}
////////////////////////////////////////////////////////////////////////////////////////////////
if(isScanMyteam[goalieball-1])//采用GoalieBall决策的机器人编号
{
g_MyTeam[goalieball].losttime=0;
g_Deci[goalieball].Boundary(g_MyTeam[defenceball2]);
if (!g_Deci[goalieball].isboundary)
{
if(g_Ball.Get_vPos().x <=abs(Player::FieldStruct.m_Field.Width()/6))
{
g_Deci[goalieball].FindBall(g_MyTeam[goalieball]);
}
}
}
else
{
g_MyTeam[goalieball].losttime++;
if(g_MyTeam[goalieball].losttime>30)
{
g_Deci[goalieball].LostObject(g_MyTeam[goalieball]);
}
}
}
}
}
::ReleaseMutex(HMutex);//释放信号量
pDThread->NewRound2();
return 0;
}
void CALLBACK TimerProc(HWND hWnd,UINT nMsg,UINT nTimerID,DWORD dwTime)
{
switch(nTimerID)
{
/* case ID_TIMER:
{
KillTimer(CDebugDlg::m_pDebugDlg->m_hWnd,ID_TIMER);
// DWORD t1;
// fprintf(Player::pFile,"TimerProc start at %u ms\n",t1);
g_MyTeam[0].TurnTo4Debug(g_Ball.Get_vPos());// CDebugDlg::m_pDebugDlg->OnTurntoball();
break;//一定要加break!!!!!!!!!!!!!!!
}
case ID_TIMER_4_TURNTOANGLE:
{
KillTimer(CDebugDlg::m_pDebugDlg->m_hWnd,ID_TIMER_4_TURNTOANGLE);
DWORD t1;
t1=GetTickCount();;
// fprintf(Player::pFile,"TimerProc start at %u ms\n",GetTickCount()-timestart);
g_MyTeam[0].BasicAct(0,0,0,0);
// fprintf(Player::pFile,"TimerProc stop at %u ms\n",GetTickCount()-timestart);
break;
}
case ID_SHOOT:
{
KillTimer(CDebugDlg::m_pDebugDlg->m_hWnd,ID_SHOOT);
g_MyTeam[CDebugDlg::m_pDebugDlg->m_team*5+CDebugDlg::m_pDebugDlg->m_number-1].BasicAct(0,0,0,0);//CDebugDlg::m_pDebugDlg->m_team*5+CDebugDlg::m_pDebugDlg->m_number-1
g_MyTeam[CDebugDlg::m_pDebugDlg->m_team*5+CDebugDlg::m_pDebugDlg->m_number-1].Shoot4Debug();
break;
}
*/ case ID_BASICACT:
{
KillTimer(CDebugDlg::m_pDebugDlg->m_hWnd,ID_BASICACT);
// g_MyTeam[CDebugDlg::m_pDebugDlg->m_team*5+CDebugDlg::m_pDebugDlg->m_number-1].BasicAct(0,0,0,0);
break;
}
case ID_DECISIONPROC://重新启动视觉和决策的同步
{
// FILE *pFile;
// pFile=fopen("good.txt","a+");
// int t=GetTickCount();
// fprintf(pFile," \nResponse to ID_DECISIONPROC at %d\t\n",t);
// fclose(pFile);
KillTimer(CDebugDlg::m_pDebugDlg->m_hWnd,ID_DECISIONPROC);
pDThread2->NewRound3();
break;
}
default:return;
}
return;
}
/*UINT CDecisionThread::DecisionProc(LPVOID pParam)
{
::WaitForSingleObject(HMutex,INFINITE);
FILE *pFile;
// ::Sleep(10000);
if(pFile=fopen("good.txt","a+"))
{
int t=GetTickCount();
fprintf(pFile,"Thread2 start at %d\t\n ",t);
}
fclose(pFile);
::ReleaseMutex(HMutex);
return 0;
}
*/
extern unsigned long timestart;
extern HANDLE HMutex;
void CDecisionThread::VisualProc()//视觉处理,设置系统时间,过一段一定的时间就重新扫描然后决策
{
HMutex=::CreateMutex(NULL,//安全属性
TRUE,//互斥信号状态,FALSE为发送状态
NULL);//互斥信号名
CVideoDlg::m_pVideoDlg->OnRead();
CVideoDlg::m_pVideoDlg->SearchObject();
::ReleaseMutex(HMutex);
}
void CDecisionThread::NewRound()
{
DWORD ThreadArg=0X00;
m_pDeciThread=AfxBeginThread(DecisionProc,&ThreadArg,THREAD_PRIORITY_NORMAL,0,NULL,NULL);
VisualProc();
}
void CDecisionThread::NewRound2()
{
unsigned int ThreadArg=0X00;
m_pDeciThread2=AfxBeginThread(DecisionProc2,&ThreadArg,THREAD_PRIORITY_NORMAL,0,NULL,NULL);
TransVisualProc();
}
void CDecisionThread::NewRound3()
{
/* MSG lpMsg;
PeekMessage(&lpMsg,NULL,0,0,PM_REMOVE);//结束命令, 所有机器人全都停止
if((GetKeyState(VK_RSHIFT) &0x80) == 0x80)
{
g_MyTeam[5].BasicAct(0,0,0,0);
g_MyTeam[1].BasicAct(0,0,0,0);
g_MyTeam[2].BasicAct(0,0,0,0);
g_MyTeam[3].BasicAct(0,0,0,0);
g_MyTeam[4].BasicAct(0,0,0,0);
return ;
}
*/ DWORD ThreadArg=0X00;
m_pDeciThread=AfxBeginThread(DecisionProc2,this,THREAD_PRIORITY_NORMAL,0,NULL,NULL);
// FILE *pFile;
// pFile=fopen("good1.txt","a+");
// int t1, t2 ;
// t1 = GetTickCount();
// fprintf(pFile," \nVisualProc start time %d\n",t1 );
// fclose( pFile ) ;
VisualProc();
// t2 = GetTickCount();
// pFile=fopen("good1.txt","a+");
// fprintf(pFile," \nVisualProc end time %d\n",t2);
// fprintf(pFile," \nVisualProc Cosume time %d\n",t2-t1);
// fclose(pFile);
}
void CDecisionThread::TransVisualProc()
{
HMutex=::CreateMutex(NULL,//安全属性
TRUE,//互斥信号状态,FALSE为发送状态
NULL);//互斥信号名
CVideoDlg::m_pVideoDlg->OnRead();
CVideoDlg::m_pVideoDlg->SearchObject();
int width;
int height;
double angle;
width=int(abs(Player::FieldStruct.m_Field.Width()));
height=int(abs(Player::FieldStruct.m_Field.Height()));
for(int i=1;i<6;i++)
{
g_MyTeam[i].Set_vPos(Vector(width-g_MyTeam[i].Get_vPos().x,height-g_MyTeam[i].Get_vPos().y));
angle=g_MyTeam[i].Get_m_Angle();
if(angle>0)
g_MyTeam[i].Set_m_Angle(angle-180);
else
g_MyTeam[i].Set_m_Angle(angle+180);
g_TheirTeam[i].Set_vPos(Vector(width-g_TheirTeam[i].Get_vPos().x,height-g_TheirTeam[i].Get_vPos().y));
}
g_Ball.Set_vPos(Vector(width-g_Ball.Get_vPos().x,height-g_Ball.Get_vPos().y));
::ReleaseMutex(HMutex);
}
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -