合肥工大机器人足球仿真D考试复习题目及答案.docx
《合肥工大机器人足球仿真D考试复习题目及答案.docx》由会员分享,可在线阅读,更多相关《合肥工大机器人足球仿真D考试复习题目及答案.docx(21页珍藏版)》请在冰点文库上搜索。
合肥工大机器人足球仿真D考试复习题目及答案
笔记:
大概从第五章开始p95球员自身属性/射门p98获得其他球员属性/传球动作p100其他函数p113返回当前环境信息函数p116我最近我去抢球p117球员原子动作p1193种带球速度p120没人防守快速带球有人防守慢速p122踢球/传给最近队友p123移动到某点转身体p124截球p132综合策略(根本看不懂~)p199附录linux基本操作p203踢向某点p204带球p206射向球门/带球+传球p207一些射门传球时需要的函数参考
P208实验内容截球/要更改p209左有人向右45度带球反之
课本5个实验代码:
etDirection();
..新建文件夹?
?
touch?
....新建空文件?
..上层目录
mv?
..?
?
..?
?
把..移动到...?
?
rm删除?
rmdir?
删除目录
tar?
-cvf?
?
aaa?
创建tar压缩文件?
chmod?
777?
*提升权限
etDirection();
soc=dribble(ang,DRIBBLE_SLOW);
}
(1)在playOn模式下,拿到球以后把球围绕自己身体逆时针转。
{
soc=kickBallCloseToBody(-120);
}
(4)在playOn模式下,拿到球后,有人逼抢(自身周围7米范围有至少1名对方球员),则把球踢到距离对手的另外一侧,安全带球(如对手在右侧,把球踢到左侧,如对手仔左侧,把球踢到右侧)。
{
Circlecir(posAgent,7);
intnum=WM->getNrInSetInCircle(OBJECT_SET_OPPONENTS,cir)
AngDegang=0;
if(num>0)
{
if((WM->getGlobalPosition(WM->getClosestInSetTo)-posAgent).getDirection()>=0)
{
ang+=45;
soc=dribble(ang,DRIBBLE_WITHBALL);}
else
{
ang-=45;
soc=dribble(ang,DRIBBLE_WITHBALL);}
}
else
{
AngDegang=(VecPosition,0)-posAgent).getDirection();
soc=dribble(ang,DRIBBLE_WITHBALL);}
}
(5)在playOn模式下,拿到球以后,有人逼抢,传球给最近的队友;否则向球门方向快速带球。
{
Circlecir(posAgent,7);
intnum=WM->getNrInSetInCircle(OBJECT_SET_OPPONENTS,cir)
if(num>0)
{
soc=leadingPass(WM->getClosestInSetTo(OBJECT_SET_TEAMMATES,posAgent),1);
}
else
{
AngDegang=(VecPosition,0)-posAgent).getDirection();
soc=dribble(ang,DRIBBLE_FAST);}
}
(6)在playOn模式下,如果有人逼抢(自身周围7米范围有至少1名对方球员),则安全带球;否则向球门方向快速带球。
{
Circlecir(posAgent,7);
intnum=WM->getNrInSetInCircle(OBJECT_SET_OPPONENTS,cir)
AngDegang=(VecPositoin,0)-posAgent).getDirection();
if(num>0)
soc=dribble(0,DRIBBLE_WITHBALL);
else
soc=dribble(ang,DRIBBLE_FAST);
}
(7)在PlayOn模式下,若前方没有对方球员,则直接以最大速度向对方球员方射门(周期数为偶数,球门的右侧射门,周期为奇数,向球门方向左侧射门)。
if(WM->isOpponentAtAngle(30,30)==false)
{VecPositionposGoal(PITCH_LENGTH/,
(-1+2*(WM->getCurrentCircle()%2))**SS->getGoalWidth());
soc=kickTo(posGoal,SS->getBallSpeedMax());
}
(8)在playOn模式下,拿到球后,在本方半场踢到球场中心点;过了半场,快速带球到对方球门。
if(WM->getBallPos().getX()<0)
soc=kickTo(VecPosition(0,0),;
else
{
AngDegang=(VecPositoin,0)-posAgent).getDirection();
soc=dribble(ang,DRIBBLE_FAST);
}
(9)在PlayOn模式下,拿到球后,把传给最近的周围没人防守的队友(没有人防守以其周围5米范围是否有对方球员为准)脚下。
Circlecir(WM->getClosestInSetTo(OBJECT_SET_TEAMMATES,posAgent),5);
intnum=WM->getNrInSetInCircle(OBJECT_SET_OPPONENTS,cir);
if(num=0)
soc=leadingPass(WM->getClosestInSetTo(OBJECT_SET_TEAMMATES,
posAgent),;
else
soc=dribble(0,DRIBBLE_WITHBALL);
returnsoc;
(10)在playOn模式下,拿到球后,把球传给最靠近自己的前方的没人防守的队友(判断队友身边5米范围是否有对方防守队员)。
{
Circlecir(WM->getClosestInSetTo(OBJECT_SET_TEAMMATES,posAgent),5);
intnum=WM->getNrInSetInCircle(OBJECT_SET_OPPONENTS,cir);
VecPositiondiff=WM->getGlobalPosition(WM->getClosestInSetTo(
OBJECT_SET_TEAMMATES,posAgent));
AngDegang=(diff-posAgent).getDirection();
if(num=0&&ang>=-90&&ang<=90)
soc=leadingPass(
WM->getClosestInSetTo(OBJECT_SET_TEAMMATES,posAgent),;
}
(11)在playOn模式下,拿到球后以后,在本方半场传给次近的队友;在对方半场,非10号球员传球给10号球员,10号球员则快速向球门方向带球。
if(WM->getBallPos().getX()<0)
{
soc=leadingPass(WM->getSecondClosestInSetTo(OBJECT_SET_TEAMMATES,posAgent)
;
}
if(WM->getBallPos().getX()>=0)
{
if(WM->getAgentObjectType()!
=OBJECT_TEANMATE_10)
{
soc=leadingPass(OBJECT_TEANMATE_10,
}
if(WM->getAgentObjectType()==OBJECT_TEANMATE_10)
{
AngDegang=(VecPositoin,0)-posAgent).getDirection();
soc=dribble(ang,DRIBBLE_FAST);
}
}
(12)在playOn模式下,如果在本方半场,则朝前方慢速带球,如果在对方半场,则朝球门快速带球。
if(WM->getBallPos().getX()<0)
soc=dribble(0,DRIBBLE_SLOW);
if(WM->getBallPos().getX()>=0)
{
AngDegang=(VecPositoin,0)-posAgent).getDirection();
soc=dribble(ang,DRIBBLE_FAST);
}
(13)在playOn模式下,拿到球后,如果是2号,则把球踢到左侧边线,如果是5号,则把球踢到右侧边线,并把脖子方向转向球;其他球员则向前带球。
if(WM->getAgentObjectType()==OBJECT_TEAMMATE_2)
{
soc=kickTo(VecPosition(WM->getBallPos().getX(),-34),;
ACT->putCommandInQueue(turnNeckToObject(OBJECT_BALL,soc));}
elseif(WM->getPlayerNumber()==5)
{
soc=kickTo(VecPosition(WM->getBallPos().getX(),34),;
ACT->putCommandInQueue(turnNeckToObject(OBJECT_BALL,soc));}
else
soc=dribble(0,DRIBBLE_WITHBALL);
(14)在playOn模式下,拿到球后,如果我是4号,则传球给7号;否则的话,传球给最近的队友;到对方禁区后以最大速度射向空隙大的球门一侧。
if(WM->getAgentObjectType()==OBJECT_TEANMATE_4)
{
soc=leadingPass(OBJECT_TEAMMATE_7,;
}
else
soc=leadingPass(
WM->getClosestInSetTo(OBJECT_SET_TEAMMATES,posAgent),
AngDegang=(VecPositoin,0)-posAgent).getDirection();
soc=dribble(ang,DRIBBLE_FAST);
if(WM->isInTheirPenaltyArea(WM->getBallPos()))
{
if(WM->getGlobalPosition(WM->getOppGoalieType()).getY()<=0)
soc=kickTo(VecPosition,,SS->getBallSpeedMax());
else
soc=kickTo(VecPosition,,SS->getBallSpeedMax());
}
(15)在playOn模式下,垂直带球。
{
if(WM->getBallPos().getY()<=0)
soc=dribble(90,DRIBBLE_WITHBALL);
else
soc=dribble(-90,DRIBBLE_WITHBALL);
}
(16)在playOn模式下,拿到球后带球到达球场中心,然后传给最近的球员。
{
AngDegang=(VecPosition(0,0)-posAgent).getDirection();
soc=dribble(ang,DRIBBLE_WITHBALL);
soc=leadingPass(
WM->getClosestInSetTo(OBJECT_SET_TEAMMATES,posAgent),
}
(17)在playOn模式下,10号带球前进,然后5号跟着10号一起前进,两球员在同一水平线上,且距离为5。
{etX()-5,WM->getBallPos().getY())
soc=moveToPos(pos,20);}
}
(18)在playOn模式下,5号球员与拿球的对方球员的距离始终为5。
etX()-5,WM->getBallPos().getY())
soc=moveToPos(pos,20);}
}
(19)在playOn模式下,2号和4号一起去盯防对方拿球队员
etX()-5,WM->getBallPos().getY())
soc=moveToPos(pos,20);}
}
if(WM->getAgentObjectType()==OBJECT_TEAMMATE_4)
{
VecPositionpos(WM->getBallPos().getX(),WM->getBallPos().getY()-5)
soc=moveToPos(pos,20);}
}
(20)在playon模式下,如果是10号球员,在可踢球的状态下,如果自身的x轴坐标大于30,则直接朝着里对方球员远的球门点射门。
if(WM->getAgentObjectType()!
=OBJECT_TEAMMATE_10)
soc=leadingPass(OBJECT_TEAMMATE_10,;
if(WM->getAgentObjectType()==OBJECT_TEAMMATE_10&&()>30)
{
soc=kickTo(VecPosition,0),PS->getPlayerWhenToTurnAngle());
}
ACT->putCommandInQueue(soc);
ACT->putCommandInQueue(turnNeckToObject(OBJECT_BALL,soc));
returnsoc;
playOn模式下,如果在我方半场拿到球,则向中场线以最大的速度踢,如果在敌方半场拿到球,则向敌方球门处以最大的速度踢
if(WM->getBallPos().getX()<=0
{
VecPositionpos(0,WM->grtBallPos().getY());
soc=kickTo(pos,SS->getBallSpeedMax());
}
if(WM->getBallPos().getX()<=0=
{
soc=kickTo(VecPosition(,0),SS->
getBallSpeedMax());
}
}
(24).在playOn模式下,如果是9号拿到球,则令9号和10号同时冲至敌方球门处,在球门前,9号传给10号,由10号进行射门
{getDirection();
soc=dribble(ang,DRIBBLE_FAST);
}
if(WM->isInTheirPenaltyArea(WM->getBallPos()))
{
soc=leadingPass(OBJECT_TEAMMATE_10,;
}
if(WM->getAgentObjectType()==OBJECT_TEANMATE_10)
{
soc=kickTo(VecPosition(,0),SS->getBallSpeedMax());
}
}
playOn模式下,如果我是4号球员并且拿到了球,则传给7号球员,同时7号球员再传给9号球员,9号球员继续以最大速度冲到球门处射门。
if(WM->getPlayerNumber()==4&&WM->isBallKickable())
{
soc=leadingPass(OBJECT_TEAMMATE_7,1);
if(WM->getPlayerNumber()==7&&WM->isBallKickable())
soc=leadingPass(OBJECT_TEAMMATE_9,1);
if(WM->getPlayerNumber()==9&&WM->isBallKickable())
soc=moveToPos(VecPosition(40,0),1);
soc=ShootToGoalex(OBJECT_GOAL_L);
ACT->putCommandInQueue(soc);
ACT->putCommandInQueue(turnNeckToObject(OBJECT_BALL,soc));
}
(26)在playon模式下,求出y轴等于0的两侧的对方球员数量,将球传向对手少的一方,并且x轴值最大的队友。
twopart
Rect*p1,*p2;
ObjectTpret;
p1->setRectanglePoints(WM->getGlobalPosition(OBJECT_FLAG_L_T),WM->getGlobalPosition(OBJECT_FLAG_R_0));
p2->setRectanglePoints(WM->getGlobalPosition(OBJECT_FLAG_L_B),WM->getGlobalPosition(OBJECT_FLAG_R_0));
if(WM->getNrInSetInRectangle(OBJECT_SET_OPPONENTS,p1)>WM->getNrInSetInRectangle(OBJECT_SET_OPPONENTS,p2))
if(WM->getAgentGlobalPosition().getY()>0)
if(WM->getAgentObjectType()==WM->getClosestInSetTo(OBJECT_SET_TEAMMATES,OBJECT_LINE_R))
pret=WM->getAgentObjectType();
(27)在playon模式下,如果自身7米范围内有两个或两个以上的对手的话,则传球到x轴值最大的队友。
if(WM->isBallKickable()){
Circlecir(posAgent,7);
intnum=WM->getNrInSetInCircle(OBJECT_SET_OPPONENTS,cir);
if(num>=2){
ObjectTClosestG;
ClosestG=WM->getClosestInSetTo(OBJECT_SET_TEAMMATES,VecPosition,0));
soc=leadingPass(ClosestG,1);
ACT->putCommandInQueue(soc);
ACT->putCommandInQueue(turnNeckToObject(OBJECT_BALL,soc));
}
}
(28)在playon模式下,求出己方的越位线,存在可以踢球的队友的话,如果自身是10号。
那么10球员垂直跑向越位线的x轴值-2米,y轴不变的点。
(29)在playon的模式下,求出球运动方向的直线方程,并且求出自己到该直线的距离,如果距离小于4的话,那么就垂直跑向该条直线。
(30)在playon的模式下,如果是自己可以踢球的状态下,如果自身7米内没有对方球员的话,则快熟带球,带球方向是朝着点(53,0)方向。
if(WM->isBallKickable()){
Circlecir(posAgent,7);
intnum=WM->getNrInSetInCircle(OBJECT_SET_OPPONENTS,cir);
if(num==0){
AngDegangDribble=(VecPosition,0)-posAgent).getDirection();
soc=dribble(angDribble,DRIBBLE_FAST);
ACT->putCommandInQueue(soc);
ACT->putCommandInQueue(turnNeckToObject(OBJECT_BALL,soc));
}
}
(31)在playon的模式下,如果距离球最近的是我方队友的话,如
果我的x坐标小于30的话,并且我是10号,那么我跑向球的坐标加上(0,10)的坐标位置。
(32)在playon的模式下,发现前方没有队友的时候,如果自身5米内有两个及两个以上的对手的话,那么将球传给最近的队友。
elseif(WM->isCornerKickUs())
{
if(WM->getPlayerNumber()==10)
soc=moveToPos(posBall,PS->getPlayerWhenToTurnAngle());
kickTo(OBJECT_TEAMMATE_9,1);
if(WM->getPlayerNumber()==9)
{
soc=moveToPos(posBall+VecPosition(3,-3),PS->getPlayerWhenToTurnAngle());
}
elseif(WM->getPlayerNumber()!
=10||WM->getPlayerNumber()!
=9)
{
soc=moveToPos(posAgent,PS->getPlayerWhenToTurnAngle());
}
ACT->putCommandInQueue(soc);
ACT->putCommandInQueue(turnNeckToObject(OBJECT_BALL,soc));
returnsoc;
}
34在本方边线球模式下,如果自己是距离球最近的队员,跑向球;并开球(球在自己脚下则把球传给最近的队友)。
elseif(WM->isOffsideUs()){
if((WM->getClosestInSetTo(OBJECT_SET_TEAMMATES,posBall))==WM->getAgentObjectType())
soc=moveToPos(posBall,1);
if(WM->isBallKickable())
soc=kickTo(WM->getClosestInSetTo(OBJECT_SET_TEAMMATES,posAgent),SS->getBallSpeedMax());
ACT->putCommandInQueue(soc);
ACT->putCommandInQueue(turnNeckToObject(OBJECT_BALL,soc));
returnsoc;
}
35在本方边线球模式下,在本方半场左侧,则由2号去发;如果是本方半场右侧,则由5号去发;球在2号或者5号脚下,则踢向距离自己最近的队友。
elseif(WM->isOffsideUs()){
Circlecir(posBall,20);
doubledist;
Object