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

📄 soccerscene.cpp

📁 浙江大学 RoboCup3D 2006 源代码
💻 CPP
📖 第 1 页 / 共 2 页
字号:
		} else {
			Vector3 goal;
			if(global.wm.myPos.y>0){
				goal.x=SS->mFieldLength/2;
				goal.y=SS->mGoalWidth/4;
			}else{
				goal.x=SS->mFieldLength/2;
				goal.y=-SS->mGoalWidth/4;	
			}
			as.interceptFastest(cmds, goal);
		}
		ActionSystem::AddCommandQueue(cmds);
	} else {
		//////////////////dribble/////////////////////////
		if(ST->isBallKickable()){
#ifdef WIN32
		ShowMessage("ball is kick able");
#endif

			if(res){
				if(isShoot || power > 100.0 - 1e-8 ||
					(global.wm.oppPos[ST->oppByDist2Ball[0]] - global.wm.ballPos).mod() < 2
					&& fabs(Normalize((global.wm.nextPos - global.wm.ballPos).ang() - (global.wm.oppPos[ST->oppByDist2Ball[0]] - global.wm.ballPos).ang())) > 45){

					SoccerCommand cmd1,cmd2;
					CommandList list;

					AgentStatus a,b;
					Vector3 dest;
					double angleTopos;
					a.pos = global.wm.nextPos;
					a.vel = global.wm.nextVel;
					b.pos = global.wm.ballPos+global.wm.ballVel;
					b.vel = global.wm.ballVel * SS->B_decay;
					angleTopos=(b.pos-a.pos).ang();
					dest=a.pos+Vector3(0.3,angleTopos,0,POLAR);/////////yzp0531
					cmd1 =intercept.runTo(dest, angleTopos);
					cmd2 = SoccerCommand(CT_KICK,theta,power);

					for(int i=0;i<20;i++){
						list.clear();
						list.push_back(cmd1);
						list.push_back(cmd2);
						cmds.push_back(list);
					}
					AddCommandQueue(cmds);

				} else{
					SoccerCommand cmd1,cmd2;
					CommandList list;
					Vector3 ballPos=global.wm.ballPos+global.wm.ballVel;
					Vector3 myPos=global.wm.nextPos;
					Angle angleTopos=(ballPos-myPos).ang();
					cmd1 =intercept.runTo(ballPos, angleTopos);
					cmd2 = SoccerCommand(CT_KICK,theta,power);

					list.clear();
					list.push_back(cmd1);
					list.push_back(cmd2);
					cmds.push_back(list);
					   
					AddCommandQueue(cmds);
				}

			} else {
				Vector3 opp2ball=global.wm.oppPos[ST->oppByDist2Ball[0]]-global.wm.ballPos;
				Vector3 ball_agent=global.wm.ballPos-global.wm.myPos;
				Angle ball_agent_angle=ball_agent.ang();
				if(global.wm.ballPos.getDistToOurGoal()<18&&fabs(opp2ball.ang())<100&&ST->opp_ITInfo[ST->oppByDist2Ball[0]].dDist2Ball<1&&ST->opp_ITInfo[ST->oppByITCyc[0]].nCyc<4){
					if(fabs(ball_agent_angle)>90&&global.wm.ballPos.x<-40&&fabs(global.wm.ballPos.y)<10) {
						for(int i=0;i<19;i++) {
							AddCommand(SoccerCommand(CT_KICK,50,100));
						}
					} else {
						for(int i=0;i<19;i++) {
							AddCommand(SoccerCommand(CT_KICK,30,100));
						}
					}
				} else {
					Vector3 p;
					if(ST->isBallInOurControl()&&global.wm.myPos.x>=SS->mFieldLength/2-12) {
						p=ST->passToMid();
					} else if (ST->isBallInOurControl()&&global.wm.ballPos.x>0) {
						p = ST->getBestPassPoint();
					} else {
				 		p = Vector3(X(100),0);
					}

					bool driForward=false;
					Angle ang2ball=(global.wm.nextBallPos-global.wm.nextPos).ang();
					Vector3 pp1(global.wm.nextPos.x+cos(ang2ball/360*2*3.14)*4.8,global.wm.nextPos.y+sin(ang2ball/360*2*3.14)*4.8,0);
					for(int i=0;i<11;i++){
						if((global.wm.oppPos[i]-global.wm.myPos).mod()>=1)
							continue;
						driForward=true;					
					}

					if(driForward&&(global.wm.oppPos[0]-pp1).mod()>4.8){
						as.dribbleForward( cmds);
					} else {
						as.interceptFastest(cmds,p);
					}

					ActionSystem::AddCommandQueue(cmds);
				}
			}
		} else if(ST->shouldIIntercept()){
			Vector3 p(X(98), 0, 0);
			if(isShoot&&(global.wm.ballPos.getDistToOppGoal() < 12 ||
					(global.wm.ballPos.getDistToOppGoal() < 20 && fabs(global.wm.ballPos.y) < 10))){
		        Vector3 apos=global.wm.nextPos;
			    Vector3 bpos = global.wm.ballPos+global.wm.ballVel;
				Vector3 oppgoaliapos=global.wm.oppPos[0];
				Vector3 g1=Vector3(X(100),SS->mGoalWidth/2.,0);
                Vector3 g2=Vector3(X(100),-SS->mGoalWidth/2.,0);
                Angle ang_ball2goaliaopp=(oppgoaliapos-bpos).ang();
	            Angle ang_ball2g1=(g1-bpos).ang();
		        Angle ang_ball2g2=(g2-bpos).ang();

                Angle ang_adjust;
	            Dist dist_ball2goaliaopp=(oppgoaliapos-bpos).mod();
		        ang_adjust=asinDeg(1/dist_ball2goaliaopp);

                Angle ang_ball2Goal1=ang_ball2goaliaopp+ang_adjust;
	            Angle ang_ball2Goal2=ang_ball2goaliaopp-ang_adjust;
                Angle ang_b2a=(bpos-apos).ang();

				if((ang_ball2Goal1>=ang_ball2g1-3&&ang_ball2Goal2<=ang_ball2g2+3)||ang_ball2Goal1<ang_ball2g2||ang_ball2Goal2>ang_ball2g1
		                ||ang_ball2g1<-25||ang_ball2g2>25) {
					if(global.wm.ballPos.x>X(95)&&fabs(global.wm.ballPos.y)<SS->mGoalWidth/2-0.5) {
						p = Vector3(X(98),global.wm.ballPos.y,0);
					}
				} else {
					Line l;
					double value=0;
					Angle dang1=ang_ball2g1-ang_ball2Goal1;
					Angle dang2=-ang_ball2g2+ang_ball2Goal2;
                    if(dang1>0) {
						Angle p_ang=(ang_ball2g1+ang_ball2Goal1)/2.;
						double dang11=fabs(p_ang-ang_b2a);
						l=l.makeLineFromPositionAndAngle(bpos, p_ang);
						p.x=X(100);
						p.y=l.getYGivenX(p.x);
#ifdef WIN32
						ShowCircle(p,0.22,"0 255 0 2");
						ShowLine(bpos,p,"255 120 0");
#endif
                        value=dang1/((p-bpos).mod()*(3+dang11/2));
	                }

                    if(dang2>0) {
						Angle p_ang=(ang_ball2g2+ang_ball2Goal2)/2.;
						double dang11=fabs(p_ang-ang_b2a);
						l=l.makeLineFromPositionAndAngle(bpos, p_ang);
						Vector3 tmp;
						tmp.x=X(100);
						tmp.y=l.getYGivenX(tmp.x);
#ifdef WIN32
						ShowCircle(tmp,0.22,"0 255 0 2");
						ShowLine(bpos,tmp,"255 120 0");
#endif
		                double valuetmp=dang2/((tmp-bpos).mod()*(3+dang11/2));
						if(valuetmp>value) {
				            p=tmp;
						}
					}
				}
			} else {
				if((ST->isBallInOurControl()&&global.wm.ballPos.x>-20&&global.wm.ballPos.getDistToOppGoal()>18)||global.wm.ballPos.getDistToOppGoal()<25) {
					if(ST->isBallInOurControl()&&global.wm.myPos.x>=SS->mFieldLength/2-12
						||(global.wm.myNumber>=9&&global.wm.myNumber<=11)) {
						p=ST->passToMid();
					} else {
						p=ST->getBestPassPoint();
					}
				} else {
					p = Vector3(X(90), 0, 0);
					if(global.wm.ballPos.x<X(-20)) {
						p=global.wm.ballPos;
						p.x += 10;
					}

					if(ST->shouldIStopBall()) {//||(fabs(bvel.y)>0.2&&fabs(bvelang)>60&&fabs(bvelang)<120&&bpos.x>X(70)&&fabs(bpos.y)<SS->mGoalWidth))
						as.interceptForStopBall(cmds);
					} else {
						as.interceptFastest(cmds,p);
					}
					ActionSystem::AddCommandQueue(cmds);
					return;
				}
			}

#ifdef WIN32
			ShowCircle(p.x, p.y, 0.4, "255 255 255 0");
#endif
			as.interceptFastest(cmds,p);
			ActionSystem::AddCommandQueue(cmds);

		} else {

			Vector3 pos;
			pos = strategy.SBSPPosition(global.wm.myNumber);
			if((global.wm.oppPos[ST->oppByDist2Ball[0]] - global.wm.ballPos).mod() < 2.5 &&
				global.wm.ballPos.x<-20&&fabs(global.wm.ballPos.y)<20&&
				global.wm.myNumber < 9 && global.wm.myNumber != 1&& global.wm.myNumber != 3&& global.wm.myNumber != 4){
				Angle ang1,ang2;
				ang1 = (Vector3(X(-100),0,0)-global.wm.ballPos).ang();
				ang2 = (global.wm.nextPos-global.wm.ballPos).ang();

				if(fabs(Normalize(ang1-ang2))<70){
					Line l = Line::makeLineFromPositionAndAngle(global.wm.ballPos, ang1);
					Vector3 o = l.getPointOnLineClosestTo(global.wm.nextPos);
#ifdef WIN32
					ShowLine(global.wm.ballPos,100,ang1,"255 255 128");
					ShowLine(global.wm.nextPos,o,"255 128 128");
#endif

					if((o - global.wm.nextPos).mod() / ((o - global.wm.ballPos).mod() + 0.0001) < 1.2){
						bool bFlag = true;
						for(int i=0;i<11;i++){
							if(i==global.wm.myNumber-1)
								continue;
							Vector3 oo = l.getPointOnLineClosestTo(global.wm.ourPos[i]);
							if((oo - global.wm.nextPos).mod() / ((oo - global.wm.ballPos).mod() + 0.0001) < 1.2 &&
								(oo - global.wm.ballPos).mod() < (o - global.wm.ballPos).mod()) {
								Angle ang3 = (global.wm.ourPos[i]-global.wm.ballPos).ang();
								if(fabs(Normalize(ang1-ang3))<70){
									bFlag = false;
									break;
								}
							}
						}

						if(bFlag){
							if(fabs(Normalize(ang1-ang2))<30) {
								pos = global.wm.ballPos;
							} else {
								pos = o;
							}
						}
					}
				}
			}
	
			bool revolve=false;
			if(global.wm.myNumber>=9&&(global.wm.myPos-pos).mod()<1.5){
				for(int k=0;k<11;k++){
					if((global.wm.oppPos[k]-global.wm.myPos).mod()>1.5) {
						continue;
					}
					revolve=true;			
				}
			}

			if(revolve) {
				as.revolve(cmds);
			} else {
				as.runTo(cmds,pos);
			}

			ActionSystem::AddCommandQueue(cmds);
		}
	}

}

////////////////////////
//class SCENE_pass_center
////////////////////////

SCENE_pass_center::SCENE_pass_center()
{
}

SCENE_pass_center::~SCENE_pass_center()
{
}

bool SCENE_pass_center::isValid()
{
	return false;
}

void SCENE_pass_center::Execute()
{
}

⌨️ 快捷键说明

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