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

📄 arsfield.cpp

📁 多机器人目标围捕 用MFC自行设计了简单的机器人围捕场景。机器人策略采用注册机制易于机器人的策略的扩展。捕捉机器人策略应用了人工势场法。
💻 CPP
字号:
#include "StdAfx.h"
#include "ARSField.h"


ARSField::ARSField()
{
	m_iGroudSize = GROUND_DEFAULT_SIZE;
	m_stSituation.ptThief.x = m_iGroudSize/2;
	m_stSituation.ptThief.y = m_iGroudSize/2;
	
	ARSPOINT ptTmp;
	ptTmp.x = 1;ptTmp.y = 1;
	m_stSituation.ptPloice.push_back(ptTmp);
	
	ptTmp.x = 1;ptTmp.y = m_iGroudSize;
	m_stSituation.ptPloice.push_back(ptTmp);
	
	ptTmp.x = m_iGroudSize;ptTmp.y = 1;
	m_stSituation.ptPloice.push_back(ptTmp);
	
	ptTmp.x = m_iGroudSize;ptTmp.y = m_iGroudSize;
	m_stSituation.ptPloice.push_back(ptTmp);

	m_ThiefMenuDir = STILL;
}


ARSField::~ARSField()
{
	m_stSituation.ptPloice.clear();
}

bool ARSField::IsArrest()
{

	bool bFlag = false;
	int i;
	//左
	if (m_stSituation.ptThief.x==1)
	{
		bFlag = true;
	}
	if (!bFlag)
	{
		for (i = 0;i<(int)m_stSituation.ptPloice.size();i++)
		{
			if (m_stSituation.ptThief.x-1 == m_stSituation.ptPloice[i].x
 			&&m_stSituation.ptThief.y == m_stSituation.ptPloice[i].y)
			{
				bFlag = true;
				break;
			}
		}
	}
	if (!bFlag)
	{
		return false;
	}
	//右
	bFlag = false;
	if (m_stSituation.ptThief.x==m_iGroudSize)
	{
		bFlag = true;
	}
	if (!bFlag)
	{
		for (i = 0;i<(int)m_stSituation.ptPloice.size();i++)
		{
			if (m_stSituation.ptThief.x+1 == m_stSituation.ptPloice[i].x
 			&&m_stSituation.ptThief.y == m_stSituation.ptPloice[i].y)
			{
				bFlag = true;
				break;
			}
		}
	}
	if (!bFlag)
	{
		return false;
	}

	//上
	bFlag = false;
	if (m_stSituation.ptThief.y==m_iGroudSize)
	{
		bFlag = true;
	}
	if (!bFlag)
	{
		for (i = 0;i<(int)m_stSituation.ptPloice.size();i++)
		{
			if (m_stSituation.ptThief.x == m_stSituation.ptPloice[i].x
 			&&m_stSituation.ptThief.y + 1== m_stSituation.ptPloice[i].y)
			{
				bFlag = true;
				break;
			}
		}
	}
	if (!bFlag)
	{
		return false;
	}

	//下
	bFlag = false;
	if (m_stSituation.ptThief.y==1)
	{
		bFlag = true;
	}
	if (!bFlag)
	{
		for (i = 0;i<(int)m_stSituation.ptPloice.size();i++)
		{
			if (m_stSituation.ptThief.x == m_stSituation.ptPloice[i].x
 			&&m_stSituation.ptThief.y -1== m_stSituation.ptPloice[i].y)
			{
				bFlag = true;
				break;
			}
		}
	}
	if (!bFlag)
	{
		return false;
	}

	return true;
}

bool ARSField::MoveOneStep(int iId,ARSPOINT & ptPrevious,MOVEDIRECTION direction)
{
	ARSPOINT ptTmp;
	ptTmp = ptPrevious;
	
	switch(direction)
	{

	case DOWN:
		ptTmp.y-=1;
		break;

	case LEFT:
		ptTmp.x-=1;
		break;
	case STILL:
		break;
	case RIGHT:
		ptTmp.x+=1;
		break;

	case UP:
		ptTmp.y+=1;
		break;

	default:
		break;
	}
	
	if (ptTmp.x<1)
		ptTmp.x = 1;
	if (ptTmp.x>m_iGroudSize)
		ptTmp.x = m_iGroudSize;
	if (ptTmp.y<1)
		ptTmp.y  = 1;
	if (ptTmp.y>m_iGroudSize)
		ptTmp.y = m_iGroudSize;
	
	
	int i;
	if (iId == 0)
	{
		for (i = 0;i<(int)m_stSituation.ptPloice.size();i++)
		{
			if (ptTmp.x == m_stSituation.ptPloice[i].x&&ptTmp.y == m_stSituation.ptPloice[i].y)
			{
				return false;
			}
		}
	}
	//避免警察重叠
	if (iId > 0)
	{
		if (ptTmp.x == m_stSituation.ptThief.x&&ptTmp.y== m_stSituation.ptThief.y)
		{
			return false;
		}
		for (i = 0;i<(int)m_stSituation.ptPloice.size();i++)
		{
			if ((iId-1!=i)&&ptTmp.x == m_stSituation.ptPloice[i].x&&ptTmp.y == m_stSituation.ptPloice[i].y)
			{
				return false;
			}
		}

	}	
	
	ptPrevious = ptTmp;
	return true;
	
	
}



bool ARSField::ToArrest(CPoint *pPtPerson,const int * iPerStrategy,int iMaxNum)
{
	m_stSituation.ptPloice.clear();

	m_stSituation.ptThief.x = pPtPerson[0].x;
	m_stSituation.ptThief.y = pPtPerson[0].y;

	ARSPOINT tmpPoint;

	for (int i = 1;i<iMaxNum;i++)
	{
		if (pPtPerson[i].x>0&&pPtPerson[i].y>0)
		{
			tmpPoint.x =pPtPerson[i].x;
			tmpPoint.y =pPtPerson[i].y;			
			m_stSituation.ptPloice.push_back(tmpPoint);
		}
	}
	
	ARSAction *pAction;
	MOVEDIRECTION nextDirection = STILL;
	//贼先动
	m_stSituation.iID = 0;
	if (iPerStrategy[0] == 0)
	{
		MoveOneStep(m_stSituation.iID,m_stSituation.ptThief,m_ThiefMenuDir);
		pPtPerson[0].x = m_stSituation.ptThief.x;
		pPtPerson[0].y = m_stSituation.ptThief.y;
	}
	else
	{
		pAction= ARSAction::GetTheAction(ARSAction::ms_dequeActionRegister[iPerStrategy[0]-1].name);
		if (pAction)
		{
			pAction->ExecuteAction(m_stSituation,nextDirection);
		}

		MoveOneStep(m_stSituation.iID,m_stSituation.ptThief,nextDirection);
		pPtPerson[0].x = m_stSituation.ptThief.x;
		pPtPerson[0].y = m_stSituation.ptThief.y;	
	}
	if (IsArrest())
	{
		return true;
	}
	int j = 0;
	for (i = 1;i<iMaxNum;i++)
	{
		if (pPtPerson[i].x>0&&pPtPerson[i].y>0)
		{
			m_stSituation.iID = j+1;
			pAction= ARSAction::GetTheAction(ARSAction::ms_dequeActionRegister[iPerStrategy[i]-1].name);
			if (pAction)
			{
				pAction->ExecuteAction(m_stSituation,nextDirection);
			}
			MoveOneStep(m_stSituation.iID,m_stSituation.ptPloice[j],nextDirection);
			
			pPtPerson[i].x = m_stSituation.ptPloice[j].x;
			pPtPerson[i].y = m_stSituation.ptPloice[j].y;
			j++;
		}
		if (IsArrest())
		{
			return true;
		}
	}

	return false;	
}


⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -