📄 brain.cpp
字号:
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 + -