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

📄 brain.cpp

📁 浙江大学 RoboCup3D 2006 源代码
💻 CPP
📖 第 1 页 / 共 2 页
字号:
				Angle ang2=(b.pos-g2).ang();
				Dist dist1=(b.pos-g1).mod();
				Dist dist2=(b.pos-g2).mod();
				Angle ang=(dist1*ang2+dist2*ang1)/(dist1+dist2);
				ang=Normalize(ang+180);
				Line l;
				l=l.makeLineFromPositionAndAngle(b.pos,ang);

				p.x=-X(100)+1.5;
				if(b.pos.x<-X(90))
					p.x=(-X(100)+b.pos.x)/2.;
				p.y=l.getYGivenX(p.x);
				if(fabs(p.y)>SS->mGoalWidth/2.+0.5)
					p.y=SS->mGoalWidth/2.*(b.pos.y/fabs(b.pos.y))*1.1;

#ifdef WIN32
           		ShowLine(b.pos, 50, ang ,"0 255 0 2");
				ShowCircle(p, 0.22,"0 255 255 2");
#endif

				Vector3 F;
				F = predictor.predictForceToReachPoint(p,a);
				cmd1=SoccerCommand(CT_DRIVE,F);
				cmd2=SoccerCommand(CT_CATCH);
				for(int i=0;i<20;i++) {
					list.clear();
					list.push_back(cmd1);
					list.push_back(cmd2);
					cmds.push_back(list);
				}
				ActionSystem::AddCommandQueue(cmds);
			}
		}
	}
}

void Brain::ThinkPlaying()
{
	ExecuteSoccerSceneList(m_ThinkList);
}

void Brain::ThinkPositioning()
{
}

void Brain::ThinkWhenDeadBall()
{
	if(!global.wm.ballPos.isInField(-15)){
		cerr<<"isInField(-15)_in_thinkWhenDeadBall"<<endl;
		double theta=0;
		Angle power=1;
		ActionSystem::AddCommand(SoccerCommand(CT_KICK,theta,power));
		return;
	}

	CommandQueue cmds;
	Dist distApart = 1.1;
	Angle cornerDegree = 90.0;
	Angle throwInDegree =  30.0;
	Dist distAround = 0.4;

	if(global.wm.mSensationCount == 0){
		ActionSystem::AddCommand(SoccerCommand(CT_CREATE_AGENT));
		return;
	}

	if(global.wm.mSensationCount < 5){
		return;
	}

	if(global.wm.mSensationCount == 5){
		ActionSystem::AddCommand(SoccerCommand(CT_INIT_AGENT));
		return;
	}

	if(global.wm.noball>=2){
		double theta=0;
		Angle power=1;
		ActionSystem::AddCommand(SoccerCommand(CT_KICK,theta,power));
		return;
	}

	if(global.wm.pm == PM_BeforeKickOff){
		as.doWhenBeforeKickoff(cmds);
		ActionSystem::AddCommandQueue(cmds);
		return;
	} else if(global.wm.pm == PM_KickOff_Our || global.wm.pm == PM_KickOff_Opp){
		if(global.wm.myNumber == 9 && global.wm.pm == PM_KickOff_Our){
			if(ST->isBallKickable()&&global.wm.noball==0){
				AddCommand(SoccerCommand(CT_KICK,50,20));
				return;
			}
			as.runTo(cmds,Vector3(-0.331,0,0));
			ActionSystem::AddCommandQueue(cmds);
			return;
		} else{
			as.positioningKickoff(cmds);
			ActionSystem::AddCommandQueue(cmds);
			return;
		}
	} else if(global.wm.pm == PM_CORNER_KICK_Our){
		if(ST->shouldIKickOff()&&global.wm.noball==0){						
			Vector3 pos(0,0,0);
			pos.x=global.wm.ballPos.x-30;
			if(fabs(global.wm.myPos.y)<Y(95)){
				if(global.wm.ballPos.y>0)
					pos=Vector3(X(105),Y(96),0);
				else
					pos=Vector3(X(105),-Y(96),0);

				as.runTo(cmds, pos);
				ActionSystem::AddCommandQueue(cmds);
				return;
			} else {	// intercept
				if(ST->isBallKickable()&&global.wm.noball==0&&(global.wm.myPos.x>X(100)||global.wm.myPos.y>Y(100))){
					AddCommand(SoccerCommand(CT_KICK,50,20));
					return;
				}
				if(global.wm.ballPos.y>0)
					as.runTo(cmds,Vector3(global.wm.ballPos.x+0.3,global.wm.ballPos.y+0.2,0));
				else
					as.runTo(cmds,Vector3(global.wm.ballPos.x+0.3,global.wm.ballPos.y-0.2,0));
				ActionSystem::AddCommandQueue(cmds);
				return;
			}

			as.interceptFastest(cmds,pos);
			ActionSystem::AddCommandQueue(cmds);
			return;
		} else{		// positioning
			Vector3 pos = strategy.SBSPPosition(global.wm.myNumber);
			pos.z = 100;
			if (global.wm.myNumber != 1) {
				pos.y += global.wm.ballPos.y > 0 ? 5 : -5;
			}
			if(global.wm.myNumber==9){
				if(global.wm.ballPos.y>0) {
					pos=Vector3(X(75),Y(85),0);
				} else {
					pos=Vector3(X(75),-Y(85),0);
				}
			} else if(global.wm.myNumber==8) {
				pos=Vector3(X(70),-Y(20),0);
			} else if(global.wm.myNumber==7) {
				pos=Vector3(X(70),Y(20),0);
			}
			as.runTo(cmds,pos);
			ActionSystem::AddCommandQueue(cmds);
			return;
		}
	} else if(global.wm.pm == PM_KickIn_Our){			
		if(ST->shouldIKickOff()&&global.wm.noball==0){						
			Vector3 pos(0,0,0);
			if(ST->isBallKickable()&&global.wm.noball==0&&fabs(global.wm.myPos.y)>Y(100)){
				AddCommand(SoccerCommand(CT_KICK,50,20));
				return;
			}
			Vector3 ball=global.wm.ballPos;
			Vector3 myPos=global.wm.myPos;
			if(myPos.x>ball.x+1||myPos.x<ball.x-1) {
				pos=Vector3(ball.x,(ball.y+3*(ball.y/fabs(ball.y))),0);
			} else if(fabs(myPos.y)>Y(99)) {
				pos=Vector3(ball.x-0.2,(ball.y+0.1*(ball.y/fabs(ball.y))),0);
			} else {
				pos=Vector3(ball.x+1.5*((myPos.x-ball.x)/fabs(myPos.x-ball.x)),(ball.y+0.5*(ball.y/fabs(ball.y))),0);
			}
			as.runTo( cmds, pos);
			ActionSystem::AddCommandQueue(cmds);
			return;
		} else {		// positioning
			Vector3 pos = strategy.SBSPPosition(global.wm.myNumber);
			pos.z = 100;
			if (global.wm.myNumber != 1) {
				pos.y += global.wm.ballPos.y > 0 ? 5 : -5;
			}
			if (global.wm.myNumber != 1 && global.wm.ballPos.x < X(80)) {
				pos.x += 5;
				pos.x = pos.x < X(100) - 5 ? pos.x : X(100) - 5;
			}
			as.runTo(cmds,pos);
			ActionSystem::AddCommandQueue(cmds);
			return;
		}
	} else if(global.wm.pm == PM_KickIn_Opp||global.wm.pm == PM_CORNER_KICK_Opp){	// positioning
		Vector3 pos = strategy.SBSPPosition(global.wm.myNumber);
		pos.z = 100;
		if (global.wm.myNumber != 1) {
			pos.y += global.wm.ballPos.y > 0 ? 4 : -4;
		}
		if (global.wm.myNumber != 1 && global.wm.ballPos.x > -X(80)&&global.wm.pm == PM_KickIn_Opp) {
			pos.x -= 5;
			pos.x = pos.x > -X(100) + 5 ? pos.x : -X(100) + 5;
		}
#ifdef WIN32
		ShowCircle(pos,1,"100 100 100 2");
#endif
		as.runTo(cmds,pos);
		ActionSystem::AddCommandQueue(cmds);
		return;
	} else if (global.wm.pm == PM_GOAL_KICK_Opp) {
		Vector3 pos = strategy.SBSPPosition(global.wm.myNumber);
		Vector3 pos11 = strategy.SBSPPosition(11);
		double back = 0;
		if (pos11.x > SS->mFieldLength / 2. - 17) {
			back = pos11.x - (SS->mFieldLength / 2. - 17);
			if (global.wm.myNumber > 5) {
				pos.x -= 1.5 * back;
				if (global.wm.myNumber == 7 || global.wm.myNumber == 8) {
					pos.y += pos.y > 0 ? 10 : -10;
				} else if (global.wm.myNumber == 9) {
					pos.x -= 0.5 * back;
				} else if (global.wm.myNumber == 6) {
					pos.x += 3;
				}
			}
		}
		pos.z = 100;
		as.runTo(cmds, pos);
		ActionSystem::AddCommandQueue(cmds);
		return;
	} else if (global.wm.pm == PM_GOAL_KICK_Our){
		if(ST->shouldIKickOff()){
			if(ST->isDribbleSafe()){
				as.dribbleForward(cmds);
				ActionSystem::AddCommandQueue(cmds);
				return;
			} else {
				Vector3 pos(0,0,0);
				pos.x=global.wm.ourPos[6].x;
				as.interceptFastest(cmds,pos);
				ActionSystem::AddCommandQueue(cmds);
				return;
			}
		}
		if(global.wm.myNumber==1) {
			as.runTo(cmds,Vector3(X(95),0,0));
		} else {
			Vector3 pos=strategy.SBSPPosition(global.wm.myNumber);
			as.runTo(cmds,pos);
		}
	}

	as.doWhenBeforeKickoff(cmds);
	ActionSystem::AddCommandQueue(cmds);	 
}

void Brain::ExecuteSoccerSceneList(SoccerSceneList& sceneList){
	for(SoccerSceneList::iterator sceneIter = sceneList.begin(); sceneIter != sceneList.end(); ++sceneIter){
		SoccerScene* scene = *sceneIter;
		if(scene->isValid()){
			scene->Execute();
			if(scene->EnoughReturn())
				break;
		}
	}
}

⌨️ 快捷键说明

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