⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 decisionthread.cpp

📁 本程序是2005年参加中国机器人大赛的比赛程序
💻 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 + -