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

📄 clear.cpp

📁 RoboCup 2D 仿真组老牌强队Mersad 2005的完整源代码
💻 CPP
📖 第 1 页 / 共 2 页
字号:
	}	else	{ // Defense kick#ifdef CLEAR_LOG1	LOG << "Clear::defense" << endl;#endif		if ((worldModel->getBall().getPos().getX() >= -28 ||			fabs(worldModel->getBall().getPos().getY()) >= 21) &&			!worldModel->getBody().isGoalie())			return AD_MIN_VALUE;		Point clearPoints[20];		int clearPointsNum = 0;		float clearWeights[20];		bool clearToTeammate[20];		Ball clearBall;		Command *curClearCommand;		float maxWeight;		int maxPointNum;		InterceptCalculate clearIntercept;		float interceptX;		Point oppPoint;				clearPoints[0] = Point(0, 20);		clearPoints[1] = Point(0, 10);		clearPoints[2] = Point(0, 0);		clearPoints[3] = Point(0, -10);		clearPoints[4] = Point(0, -20);		clearPoints[5] = Point(-14, 30);		clearPoints[6] = Point(-14, -30);		clearPoints[7] = Point(0, worldModel->getBody().getPos().getY());		if (worldModel->getBody().getPos().getY() > 0)			clearPoints[8] = Point(worldModel->getBody().getPos().getX(), 30);		else			clearPoints[8] = Point(worldModel->getBody().getPos().getX(), -30);		clearPointsNum = 9;		clearIntercept.startSession(1);		clearIntercept.updateByWorldModel(worldModel);				clearIntercept.setTmmSlowDashPower(20);		clearIntercept.setTmmFastDashPower(80);		clearIntercept.setTmmDirectDashPower(100);		clearIntercept.setTmmSeeBallDelay(2);		clearIntercept.setTmmPosDevRate(0.8);		clearIntercept.setOppSlowDashPower(20);		clearIntercept.setOppFastDashPower(90);		clearIntercept.setOppDirectDashPower(100);		clearIntercept.setOppSeeBallDelay(1);		clearIntercept.setOppPosDevRate(0.8);				for (i = 0; i < clearPointsNum; i++)		{			FastKickToPoint fastKick(AT_CLEAR, clearPoints[i], worldModel->getBall(),					worldModel->getBody());			if (!fastKick.isPossible())			{#ifdef CLEAR_LOG1	LOG << "Clear:point [" << i << "] = " << clearPoints[i] << " not possible" << endl;#endif				clearWeights[i] = AD_MIN_VALUE;				if (fastKick.getCommand())					delete fastKick.getCommand();				continue;			}			curClearCommand = fastKick.getCommand();			clearBall = worldModel->getBall();			clearBall.simulateByAction(worldModel->getBody(), curClearCommand);									clearIntercept.setVirtualBall(clearBall);			clearIntercept.setKickCycles(1);			clearIntercept.run();#ifdef CLEAR_LOG1	LOG << "Clear:point [" << i << "] = " << clearPoints[i] << endl;#endif			if (clearIntercept.existFastestPlayer())			{				if (clearIntercept.getFastestPlayer().getTeamId() == TID_TEAMMATE)				{#ifdef CLEAR_LOG1	LOG << "Clear:fastest exist teammate" << endl;#endif					interceptX = clearIntercept.getFastestInterPlayer().getInterPoint().x;#ifdef CLEAR_LOG1	LOG << "Clear:interceptX = " << interceptX << endl;#endif					if (interceptX < -36)						clearWeights[i] = -10;					else if (interceptX < -25)						clearWeights[i] = Basics::reRate(interceptX, -36, -25, -10, 45);					else						clearWeights[i] = Basics::reRate(interceptX, -25, 10, 45, 70);					clearWeights[i] += 25;					clearToTeammate[i] = true;				}				else				{#ifdef CLEAR_LOG1	LOG << "Clear:fastest exist opponent" << endl;#endif					interceptX = clearIntercept.getFastestInterPlayer().getInterPoint().x;#ifdef CLEAR_LOG1	LOG << "Clear:interceptX = " << interceptX << endl;#endif					if (interceptX < -36)						clearWeights[i] = -50;					else if (interceptX < -25)						clearWeights[i] = Basics::reRate(interceptX, -36, -25, -50, 5);					else						clearWeights[i] = Basics::reRate(interceptX, -25, 10, 5, 25);					clearToTeammate[i] = false;				}			}			else			{				clearWeights[i] = 20;			}#ifdef CLEAR_LOG1	LOG << "Clear:clearWeight = " << clearWeights[i] << endl;#endif		}		maxPointNum = 0;		maxWeight = -0xFFFF * 10;		for (i = 0; i < clearPointsNum; i++)			if (clearWeights[i] > maxWeight)			{				maxWeight = clearWeights[i];				maxPointNum = i;			}		if (maxWeight <= AD_MIN_VALUE)		{#ifdef CLEAR_LOG1	LOG << "Clear: all not possible" << endl;#endif			if (worldModel->getBody().getPos().getY() >= 0)				clearCommand = new KickCommand(AT_CLEAR, 100, 50);			else				clearCommand = new KickCommand(AT_CLEAR, 100, -50);			return -60;		}#ifdef CLEAR_LOG1	LOG << "Clear::selected =" << maxPointNum << " " << clearPoints[maxPointNum] << endl;	LOG << "Clear::weight =" << maxWeight << endl;#endif		clearCommand = FastKickToPoint(AT_CLEAR, clearPoints[maxPointNum],			worldModel->getBall(), worldModel->getBody()).getCommand();		if (clearToTeammate[maxPointNum])			maxWeight -= 15;#ifdef CLEAR_LOG1	LOG << "Clear::weight(after add1) =" << maxWeight << endl;#endif					maxWeight += Basics::reRate(worldModel->getBall().getPos().getX(),				-53, -34, 2, 20, RRM_REVERSE);		#ifdef CLEAR_LOG1	LOG << "Clear::weight(after add2) =" << maxWeight << endl;#endif		for (i = 0; i < FULL_PLAYERS_NUM; i++)			if (worldModel->getFullPlayer(TID_OPPONENT, i).isValid())			{				oppPoint = worldModel->getFullPlayer(TID_OPPONENT, i).getPos();				if (oppPoint.x > worldModel->getBody().getPos().getX() - 2.5 &&					oppPoint.x < worldModel->getBody().getPos().getX() + 5 &&					oppPoint.y > worldModel->getBody().getPos().getY() - 7 &&					oppPoint.y < worldModel->getBody().getPos().getY() + 7)				{					maxWeight += Basics::reRate(worldModel->getBody().getDistance(oppPoint),							0, 9, 1, 4, RRM_REVERSE);#ifdef CLEAR_LOG1	LOG << "Clear::addOpp " << i + 1 << endl;#endif				}			}#ifdef CLEAR_LOG1	LOG << "Clear::weight(after add3) =" << maxWeight << endl;#endif		if (worldModel->getBody().isGoalie())			return AD_ALWAYS_RUN_VALUE;		if (maxWeight > 75)			return AD_ALWAYS_RUN_VALUE;		else			return maxWeight;		// Previous Methdod		if ((worldModel->getBall().getPos().getX() >= -36 ||			fabs(worldModel->getBall().getPos().getY()) >= 20))			return AD_MIN_VALUE;					if(worldModel->getBall().getVel().getMagnitude() > 2)		{			if(worldModel->getBall().getAbsVec().getMagnitude() > .8)			{				if(worldModel->getBody().getPos().getY() < 0)				{					kickPoint.x = 0.00; ////////////////TOF Chasbide					kickPoint.y = 9.00;					clearCommand = FastKickToPoint(AT_CLEAR, kickPoint, worldModel->getBall(),						worldModel->getBody()).getCommand();										if ((worldModel->getBall().getPos().getX() >= -46 ||						fabs(worldModel->getBall().getPos().getY()) >= 15))						return defaultClearWeight;					else						return AD_ALWAYS_RUN_VALUE;				}				else				{					kickPoint.x = 0.00; ////////////////TOF Chasbide					kickPoint.y = -9.00;					clearCommand = FastKickToPoint(AT_CLEAR, kickPoint, worldModel->getBall(),						worldModel->getBody()).getCommand();					if ((worldModel->getBall().getPos().getX() >= -46 ||						fabs(worldModel->getBall().getPos().getY()) >= 15))						return defaultClearWeight;					else						return AD_ALWAYS_RUN_VALUE;				}				}			else			{				kickPoint.x = worldModel->getBody().getPos().getX() + 42; ////////////////TOF Chasbide				kickPoint.y = worldModel->getBody().getPos().getY();				clearCommand = FastKickToPoint(AT_CLEAR, kickPoint, worldModel->getBall(),					worldModel->getBody()).getCommand();				if ((worldModel->getBall().getPos().getX() >= -46 ||					fabs(worldModel->getBall().getPos().getY()) >= 15))					return defaultClearWeight;				else					return AD_ALWAYS_RUN_VALUE;			}		}		else if(worldModel->getBall().getVel().getMagnitude() > .9)		{			Vector ballVector;			ballVector.setByPoints(worldModel->getBody().getPos(), 				worldModel->getBall().getPos());							ballVector.setAsPolar(.45, ballVector.getDirection());						kickPoint.x = worldModel->getBody().getPos().getX() + ballVector.getX();			kickPoint.y = worldModel->getBody().getPos().getY() + ballVector.getY();						clearCommand = KickToPointArriveVelocity(AT_CLEAR, kickPoint, 0, 				worldModel->getBall(), worldModel->getBody()).getCommand();			if ((worldModel->getBall().getPos().getX() >= -46 ||				fabs(worldModel->getBall().getPos().getY()) >= 15))				return defaultClearWeight;			else				return AD_ALWAYS_RUN_VALUE;		}			else		{			///in ke joloye darvaze dar mavaghei, bayad be darvazeban pass bede va hamin joori be jolo shoot nakone ra bayad ba'dan bezaram			kickPoint.x = worldModel->getBody().getPos().getX() + 42; ////////////////TOF Chasbide			kickPoint.y = worldModel->getBody().getPos().getY();			clearCommand = KickToPointArriveVelocity(AT_CLEAR, kickPoint, 0, 				worldModel->getBall(), worldModel->getBody()).getCommand();			if ((worldModel->getBall().getPos().getX() >= -46 ||				fabs(worldModel->getBall().getPos().getY()) >= 15))				return defaultClearWeight;			else				return AD_ALWAYS_RUN_VALUE;		}	}	return AD_MIN_VALUE;}

⌨️ 快捷键说明

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