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

📄 intercept.cpp

📁 RoboCup 2D 仿真组老牌强队Mersad 2005的完整源代码
💻 CPP
📖 第 1 页 / 共 2 页
字号:
				if (interceptGTBVector.getMagnitude() < 8)				{					if (fabs(deltaAngleToBallAngle) < 90)						extraKickableForAngleNoise = (Degree::cos(fabs(deltaAngleToBallAngle)) + 0) * 1.5;					else if (fabs(deltaAngleToBallAngle) < 120)						extraKickableForAngleNoise = (Degree::cos(fabs(deltaAngleToBallAngle)) + 0) * .2;					else if (fabs(deltaAngleToBallAngle) >= 120)						extraKickableForAngleNoise = (Degree::cos(fabs(deltaAngleToBallAngle)) + 0) * .4;				}				else				{					if (fabs(deltaAngleToBallAngle) < 90)						extraKickableForAngleNoise = (Degree::cos(fabs(deltaAngleToBallAngle)) + 0) * 1.5;					else if (fabs(deltaAngleToBallAngle) < 120)						extraKickableForAngleNoise = (Degree::cos(fabs(deltaAngleToBallAngle)) + 0) * 1.5;					else if(fabs(deltaAngleToBallAngle) >= 120)						extraKickableForAngleNoise = (Degree::cos(fabs(deltaAngleToBallAngle)) + 0) * 1.5;				}			}			else			{				extraKickableForAngleNoise = 0;				extraKickableForNoise /= 2.00;			}		/////////////////////NEGATIVE ANGLE NOISE						if (waitBall.getBodyVec().getMagnitude() <= (bodyKickableArea + extraKickableForNoise + extraKickableForAngleNoise))			{				gtbPoint[gtbPointsNumber] = Point(waitBody.getPos().getX(), waitBody.getPos().getY()); 				extraGTBTime[gtbPointsNumber] = i;								mainGtbTime[gtbPointsNumber] = mainGoToBallTime + 								extraGTBTime[gtbPointsNumber];				gtbStatus[gtbPointsNumber] = 2;													gtbTime[gtbPointsNumber] = mainGoToBallTime + (extraGTBTime[gtbPointsNumber] / 2.00);//				gtbTime[gtbPointsNumber] -= 2;								minBallDistance[gtbPointsNumber] = waitBall.getBodyVec().getMagnitude();/*TOF2*/	gtbPointWeight[gtbPointsNumber] += min((bodyKickableArea - minBallDistance[gtbPointsNumber]) , (float).3) * 10; 						distToBegin[gtbPointsNumber] = hypot(waitBall.getPos().getX() - worldModel->getBall().getPos().getX(), waitBall.getPos().getY() - worldModel->getBall().getPos().getY());				delete gtbCommand[gtbPointsNumber];				gtbCommand[gtbPointsNumber] = new DashCommand(AT_INTERCEPT, mainNegativeDashPower);				catchedBall = 1;				gtbPointsNumber++;			}			waitBody.simulateByDynamics();			waitBall.simulateByDynamics(waitBody);		}				if (catchedBall) 				catchedBallCycles++;	}//	LOG << "MeisamGoToBall : gtbPointsNumberT! : " << gtbPointsNumber << endl;///////////////OneTurnPositiveDash		Body virtualDashBody;	virtualDashBody = simBody;	virtualDashBody.setVel().setAsCartesian(0,0);	Vector goToBallVector;	float deltaAngleToGTB;	float gtbRadius = bodyKickableArea;//	LogMaker.Log("GTBRadius 1 : ", GTBRadius); 	simBody = worldModel->getBody();	simBall = worldModel->getBall();	catchedBallCycles = 0;	catchedBall = 0;	mainGoToBallTime = 0;	extraKickableForNoise = -.045 * mainGoToBallTime;	simBody.simulateByDynamics();	simBall.simulateByDynamics(simBody);	goToBallVector.setByPoints(Point(simBody.getPos().getX(), simBody.getPos().getY()), Point(simBall.getPos().getX(), simBall.getPos().getY()));	deltaAngleToGTB = simBody.getBodyDir() - goToBallVector.getDirection();	deltaAngleToGTB = normalizeAngle(deltaAngleToGTB);//	LogMaker.Log("DeltaAngleToGTB 1 : ", DeltaAngleToGTB);	mainGoToBallTime++;//KOMAK	virtualDashBody.setStamina(virtualDashBody.setStamina() + virtualDashBody.getStaminaIncMax() * 1);/*One Turn*/;	dashPower = 100;	if (virtualDashBody.getStamina() < 1400)		dashPower = virtualDashBody.getStaminaIncMax();	tempDashCommand.setPower(dashPower);		while (mainGoToBallTime < MAX_GTB_CHECKED_TIME && gtbPointsNumber < 30)	{		mainGoToBallTime++;//KOMAK		virtualDashBody.setStamina(virtualDashBody.getStamina() + virtualDashBody.getStaminaIncMax() * 1);/*One Turn*/;				dashPower = 100;		if (virtualDashBody.getStamina() < 1400)				dashPower = virtualDashBody.getStaminaIncMax();		tempDashCommand.setPower(dashPower);			virtualDashBody.simulateByAction(&tempDashCommand);//KOMAK		virtualDashBody.setStamina(virtualDashBody.getStamina() - dashPower);		gtbRadius += virtualDashBody.getVel().getMagnitude();				extraKickableForNoise = - .045 * mainGoToBallTime;		extraKickableForNoise -= .45;		simBody.simulateByDynamics();		simBall.simulateByDynamics(simBody);		goToBallVector.setByPoints(Point(simBody.getPos().getX(), simBody.getPos().getY()), Point(simBall.getPos().getX(), simBall.getPos().getY()));		deltaAngleToGTB = goToBallVector.getDirection() - simBody.getBodyDir();		deltaAngleToGTB = normalizeAngle(deltaAngleToGTB);		float deltaAngleToBallAngle;		Vector gtbVector;		gtbVector.setByPoints(Point(simBody.getPos().getX(), simBody.getPos().getY()), Point(simBall.getPos().getX(), simBall.getPos().getY()));		deltaAngleToBallAngle = gtbVector.getDirection() - simBall.getVel().getDirection();		deltaAngleToBallAngle = normalizeAngle(deltaAngleToBallAngle);		if (goToBallVector.getMagnitude() < 10)		{			if (fabs(deltaAngleToBallAngle) < 90)//				extraKickableForAngleNoise = (Degree::cos(fabs(deltaAngleToBallAngle)) + 0) * 1;			extraKickableForAngleNoise = 0;						else if (fabs(deltaAngleToBallAngle) < 120)				extraKickableForAngleNoise = (Degree::cos(fabs(deltaAngleToBallAngle)) + 0) * 1;			else if (fabs(deltaAngleToBallAngle) >= 120)				extraKickableForAngleNoise = (Degree::cos(fabs(deltaAngleToBallAngle)) + 0) * 1;		}		else		{				if (fabs(deltaAngleToBallAngle) < 90)//				extraKickableForAngleNoise = (Degree::cos(fabs(deltaAngleToBallAngle)) + 0) * 1;			extraKickableForAngleNoise = 0;			else if (fabs(deltaAngleToBallAngle) < 120)				extraKickableForAngleNoise = (Degree::cos(fabs(deltaAngleToBallAngle)) + 0) * 1.8;			else if (fabs(deltaAngleToBallAngle) >= 120)				extraKickableForAngleNoise = (Degree::cos(fabs(deltaAngleToBallAngle)) + 0) * 1.8;		}		if ((gtbRadius + extraKickableForNoise  + extraKickableForAngleNoise) >= goToBallVector.getMagnitude() && fabs(deltaAngleToGTB) <= BasicTurn::getTurnAngle(179,worldModel->getBody())) 		{			gtbPoint[gtbPointsNumber] = Point(simBody.getPos().getX(), simBody.getPos().getY()); 			gtbTime[gtbPointsNumber] = mainGoToBallTime;			extraGTBTime[gtbPointsNumber] = 0;						mainGtbTime[gtbPointsNumber] = mainGoToBallTime + 								extraGTBTime[gtbPointsNumber];			gtbStatus[gtbPointsNumber] = 3;										minBallDistance[gtbPointsNumber] = goToBallVector.getMagnitude() - gtbRadius + bodyKickableArea;			distToBegin[gtbPointsNumber] = hypot(simBall.getPos().getX() - worldModel->getBall().getPos().getX(), simBall.getPos().getY() - worldModel->getBall().getPos().getY());				delete gtbCommand[gtbPointsNumber]; 			gtbCommand[gtbPointsNumber] = TurnAngle(AT_INTERCEPT, deltaAngleToGTB, worldModel->getBody()).getCommand();/*TOF*/			if (fabs(deltaAngleToGTB) <= 8){				delete gtbCommand[gtbPointsNumber]; /*TOF*/				gtbCommand[gtbPointsNumber] = new DashCommand(AT_INTERCEPT, mainPositiveDashPower);}			gtbPointsNumber++;		}		}	//	LOG << "MeisamGoToBall : gtbPointsNumber 2 : " << gtbPointsNumber << endl;///////////////OneTurnNegativeDash	/*	virtualDashBody = simBody;	virtualDashBody.setVel().setAsCartesian(0,0);	gtbRadius = bodyKickableArea;	simBody = worldModel->getBody();	simBall = worldModel->getBall();	catchedBallCycles = 0;	catchedBall = 0;	mainGoToBallTime = 0;	extraKickableForNoise = .06 * mainGoToBallTime;	simBody.simulateByDynamics();	simBall.simulateByDynamics(simBody);	goToBallVector.setByPoints(Point(simBody.getPos().getX(), simBody.getPos().getY()), Point(simBall.getPos().getX(), simBall.getPos().getY()));	deltaAngleToGTB = simBody.getBodyDir() - goToBallVector.getDirection();	deltaAngleToGTB = normalizeAngle(deltaAngleToGTB);	mainGoToBallTime++;//KOMAK	virtualDashBody.setStamina(virtualDashBody.getStamina() + virtualDashBody.getStaminaIncMax() * 1);	dashPower = -100;	if (virtualDashBody.getStamina() < 1400)		dashPower = -virtualDashBody.getStaminaIncMax() / 2.00;   tempDashCommand.setPower(dashPower);		while (mainGoToBallTime < MAX_GTB_CHECKED_TIME && gtbPointsNumber < 50)	{		mainGoToBallTime++;//KOMAK		virtualDashBody.setStamina(virtualDashBody.getStamina() + virtualDashBody.getStaminaIncMax() * 1);				dashPower = -100;		if (virtualDashBody.getStamina() < 1400)				dashPower = -virtualDashBody.getStaminaIncMax() / 2.00;		tempDashCommand = DashCommand(dashPower);			virtualDashBody.simulateByAction(&dashCommand);//KOMAK				virtualDashBody.setStamina(virtualDashBody.getStamina() + DashPower * 2);		gtbRadius += virtualDashBody.getVel().getMagnitude();				extraKickableForNoise = .06 * mainGoToBallTime;		simBody.simulateByDynamics();		simBall.simulateByDynamics(simBody);		goToBallVector.setByPoints(Point(simBody.getPos().getX(), simBody.getPos().getY()), Point(simBall.getPos().getX(), simBall.getPos().getY()));		goToBallVector.setAsPolar(goToBallVector.getMagnitude(), normalizeAngle(goToBallVector.getDirection() + 180));		deltaAngleToGTB = goToBallVector.getMagnitude() - simBody.getBodyDir();		deltaAngleToGTB = normalizeAngle(deltaAngleToGTB);//KOMAK		if((gtbRadius + extraKickableForNoise) >= goToBallVector.getMagnitude() && fabs(deltaAngleToGTB) <= calculate.Public.GetVirtualTurnAngle(179)) 		{			gtbPoint[gtbPointsNumber] = Point(simBody.getPos().getX(), simBody.getPos().getY()); 			gtbTime[gtbPointsNumber] = mainGoToBallTime;			extraGTBTime[gtbPointsNumber] = 0;			minBallDistance[gtbPointsNumber] = goToBallVector.getMagnitude() - gtbRadius + bodyKickableArea;			distToBegin[gtbPointsNumber] = hypot(simBall.getPos().getX() - worldModel->getBall().getPos().getX(), simBall.getPos().getY() - worldModel->getBall().getPos().getY());			gtbCommand[gtbPointsNumber] = *TurnAngle(deltaAngleToGTB, worldModel->getBody());			gtbPointsNumber++;		}		}*///	LOG << "MeisamGoToBall : gtbPointsNumber 3 : " << gtbPointsNumber << endl;///////////////TwoTurnPositiveDash		virtualDashBody = simBody;	virtualDashBody.setVel().setAsCartesian(0,0);	gtbRadius = bodyKickableArea;	simBody = worldModel->getBody();	simBall = worldModel->getBall();	catchedBallCycles = 0;	catchedBall = 0;	mainGoToBallTime = 0;	extraKickableForNoise = - .045 * mainGoToBallTime;	for (int i = 0; i < 2; i++)	{		simBody.simulateByDynamics();		simBall.simulateByDynamics(simBody);		goToBallVector.setByPoints(Point(simBody.getPos().getX(), simBody.getPos().getY()), Point(simBall.getPos().getX(), simBall.getPos().getY()));		deltaAngleToGTB = simBody.getBodyDir() - goToBallVector.getDirection();		deltaAngleToGTB = normalizeAngle(deltaAngleToGTB);		mainGoToBallTime++;//KOMAK				virtualDashBody.setStamina(virtualDashBody.getStamina() + virtualDashBody.getStaminaIncMax());	}	dashPower = 100;	if (virtualDashBody.getStamina() < 1400)		dashPower = virtualDashBody.getStaminaIncMax();	tempDashCommand.setPower(dashPower);		while (mainGoToBallTime < MAX_GTB_CHECKED_TIME && gtbPointsNumber < 70)	{		mainGoToBallTime++;//		virtualDashBody.setStamina()(virtualDashBody.getStamina() + virtualDashBody.getStaminaIncMax());				dashPower = 100;		if (virtualDashBody.getStamina() < 1400)				dashPower = virtualDashBody.getStaminaIncMax();		tempDashCommand.setPower(dashPower);			virtualDashBody.simulateByAction(dynamic_cast <Command *> (&tempDashCommand));//KOMAK				virtualDashBody.setStamina(virtualDashBody.getStamina() - dashPower);		gtbRadius += virtualDashBody.getVel().getMagnitude();				extraKickableForNoise = -.045 * mainGoToBallTime;		extraKickableForNoise -= .45;		simBody.simulateByDynamics();		simBall.simulateByDynamics(simBody);		goToBallVector.setByPoints(Point(simBody.getPos().getX(), simBody.getPos().getY()), Point(simBall.getPos().getX(), simBall.getPos().getY()));		deltaAngleToGTB = goToBallVector.getDirection() - simBody.getBodyDir();		deltaAngleToGTB = normalizeAngle(deltaAngleToGTB);		float deltaAngleToBallAngle;		Vector gtbVector;		gtbVector.setByPoints(Point(simBody.getPos().getX(), simBody.getPos().getY()), Point(simBall.getPos().getX(), simBall.getPos().getY()));		deltaAngleToBallAngle = gtbVector.getDirection() - simBall.getVel().getDirection();		deltaAngleToBallAngle = normalizeAngle(deltaAngleToBallAngle);		if (goToBallVector.getMagnitude() < 10)		{			if (fabs(deltaAngleToBallAngle) < 90)//				extraKickableForAngleNoise = (Degree::cos(fabs(deltaAngleToBallAngle)) + 0) * 1;			extraKickableForAngleNoise = 0;			else if (fabs(deltaAngleToBallAngle) < 120)				extraKickableForAngleNoise = (Degree::cos(fabs(deltaAngleToBallAngle)) + 0) * 1;			else if (fabs(deltaAngleToBallAngle) >= 120)				extraKickableForAngleNoise = (Degree::cos(fabs(deltaAngleToBallAngle)) + 0) * 1;		}		else		{				if (fabs(deltaAngleToBallAngle) < 90)//				extraKickableForAngleNoise = (Degree::cos(fabs(deltaAngleToBallAngle)) + 0) * 1;			extraKickableForAngleNoise = 0;			else if (fabs(deltaAngleToBallAngle) < 120)				extraKickableForAngleNoise = (Degree::cos(fabs(deltaAngleToBallAngle)) + 0) * 1.8;			else if (fabs(deltaAngleToBallAngle) >= 120)				extraKickableForAngleNoise = (Degree::cos(fabs(deltaAngleToBallAngle)) + 0) * 1.8;		}		if ((gtbRadius + extraKickableForNoise + extraKickableForAngleNoise) >= goToBallVector.getMagnitude())// && fabs(deltaAngleToGTB) <= Calculate.Public.GetVirtualTurnAngle(180)) 		{			gtbPoint[gtbPointsNumber] = Point(simBody.getPos().getX(), simBody.getPos().getY()); 			gtbTime[gtbPointsNumber] = mainGoToBallTime;			extraGTBTime[gtbPointsNumber] = 0;			mainGtbTime[gtbPointsNumber] = mainGoToBallTime + 								extraGTBTime[gtbPointsNumber];			gtbStatus[gtbPointsNumber] = 4;						minBallDistance[gtbPointsNumber] = goToBallVector.getMagnitude() - gtbRadius + bodyKickableArea;			distToBegin[gtbPointsNumber] = hypot(simBall.getPos().getX() - worldModel->getBall().getPos().getX(), simBall.getPos().getY() - worldModel->getBall().getPos().getY());				delete gtbCommand[gtbPointsNumber];			gtbCommand[gtbPointsNumber] = TurnAngle(AT_INTERCEPT, deltaAngleToGTB, worldModel->getBody()).getCommand();/*TOF*/			if (fabs(deltaAngleToGTB) <= 8){				delete gtbCommand[gtbPointsNumber];/*TOF*/				gtbCommand[gtbPointsNumber] = new DashCommand(AT_INTERCEPT, mainPositiveDashPower);}			gtbPointsNumber++;		}		}//	LOG << "MeisamGoToBall : gtbPointsNumber 4 : " << gtbPointsNumber << endl;	for (int i = 0; i < gtbPointsNumber; i++)	{		gtbPointWeight[i] -= gtbTime[i];		if (gtbStatus[i] == 0)			if (worldModel->getCurInterCalculate().existFastestOppPlayer())			{					float bestOppTime = worldModel->getCurInterCalculate().								getFastestOppInterPlayer().getInterTime();				if (bestOppTime < mainGtbTime[i]);					gtbPointWeight[i] -= (mainGtbTime[i] - bestOppTime) * 5;						}		if (gtbStatus[i] == 1)			if (library.lastBodyCycleCommand->getCreator() == AT_DRIBBLE ||				library.lastBodyCycleCommand->getCreator() == AT_SRPDRIBBLE ||				library.lastBodyCycleCommand->getCreator() == AT_DRIBBLE_INTERCEPT)			gtbPointWeight[i] -= 10000;//		gtbPointWeight[i] += extraGTBTime[i];		}		bestGTBPointNumber = 0;	for (int i = 0; i < gtbPointsNumber; i++)	{//		LOG << "i , gtbTime[i] : " <<  i << " " << gtbTime[i] << endl;//		LOG << "i , gtbWeightPoint[i] : " << i << " " <<  gtbPointWeight[i] << endl;//		LOG << "i , extraGTBTime[i] : " << i << " " << extraGTBTime[i] << endl;//		LOG << "i , minBallDistance[i] : " << i << " " << minBallDistance[i] << endl;		if (gtbPointWeight[i] > gtbPointWeight[bestGTBPointNumber])			bestGTBPointNumber = i; 	}	 //		LOG << "BestGTBCommand : " << gtbCommand[bestGTBPointNumber]->toString() << endl;		//	LOG << "BestGTBPointNumber : " << bestGTBPointNumber << endl;	return AD_NORMAL_VALUE;}void Intercept::execute(Form &form, const Library &library){	LOG << "Intercept::execute" << endl;	command = gtbCommand[bestGTBPointNumber];}

⌨️ 快捷键说明

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