《合肥工大机器人足球仿真2D考试复习题目及答案(8页).doc》由会员分享,可在线阅读,更多相关《合肥工大机器人足球仿真2D考试复习题目及答案(8页).doc(8页珍藏版)》请在taowenge.com淘文阁网|工程机械CAD图纸|机械工程制图|CAD装配图下载|SolidWorks_CaTia_CAD_UG_PROE_设计图分享下载上搜索。
1、- 笔记:大概从第五章开始 p95球员自身属性/射门 p98获得其他球员属性/传球动作 p100其他函数 p113返回当前环境信息函数 p116我最近我去抢球 p117球员原子动作 p119 3种带球速度 p120没人防守快速带球有人防守慢速 p122踢球/传给最近队友 p123移动到某点转身体 p124截球 p132综合策略(根本看不懂) p199 附录linux基本操作 p203踢向某点 p204带球 p206射向球门 /带球+传球 p207 一些射门传球时需要的函数参考P208 实验内容截球/要更改worldmodel.h p209左有人向右45度带球反之课本5个实验代码:/ 1/Vec
2、Position posGoal(0,0);/踢到场中间/ 2/VecPosition posGoal =WM- getPosOpponentGoal();/3/VecPosition posGoal=WM-getPosOpponentGoal();/向球门方向慢速带球/AngDeg ang=(posGoal-posAgent).getDirection(); /soc=dribble(ang,DRIBBLE_SLOW);/ 4/soc=kickTo(WM-getClosestInSetTo(OBJECT_SET_TEAMMATES,posAgent), SS-getBallSpeedMax(
3、)+200);/最大速踢给最近球员/5/ soc=leadingPass(OBJECT_TEAMMATE_9,1);/踢给9号,误差范围1-第 8 页-/ 6/else if(posBall.getY()0) VecPosition pos(40,20); double speed=1.0; soc=kickTo(pos,speed);else VecPosition pos(40,-20); double speed=1.0; soc=kickTo(pos,speed); ACT-putCommandInQueue(soc);ACT-putCommandInQueue( turnNeckTo
4、Object( OBJECT_BALL, soc ) );/球员在左踢到右反之。考试题目:/拿球后行为,利用已有Worldmodel(20) (playerteams.cpp大约130行位置改)(1) 在playOn模式下,拿到球以后朝前方快速带球。 (p204中间)(2) 在PlayOn模式下,拿到球以后朝球门方向慢速带球。 (参考p204中间要加kickto函数,快速带球改为慢速)(3) 在playOn模式下,拿到球以后把球围绕自己身体逆时针转。 (p206中间)(4) 在playOn模式下,拿到球后,有人逼抢(自身周围7米范围有至少1名对方球员),则把球踢到距离对手的另外一侧,安全带球(
5、如对手在右侧,把球踢到左侧,如对手仔左侧,把球踢到右侧)。 (5) playOn模式下,拿到球以后,有人逼抢,传球给最近的队友;否则向球门方向快速带球。(if判断+p122传队友)(6) 在playOn模式下,如果有人逼抢(自身周围7米范围有至少1名对方球员),则安全带球;否则向球门方向快速带球。 (p120下面)(7) 在PlayOn模式下,若前方没有对方球员,则直接以最大速度向对方球员方射门(周期数为偶数,球门的右侧射门,周期为奇数,向球门方向左侧射门)。 (p96下面按周期射门+if判断对手)(8) 在playOn模式下,拿到球后,在本方半场踢到球场中心点;过了半场,快速带球到对方球门。
6、 (9) 在PlayOn模式下,拿到球后,传给最近的周围没人防守的队友(没有人防守以其周围5米范围是否有对方球员为准)脚下。(p122上+一条if判断防守队员)(10) 在playOn模式下,拿到球后,传给最靠近自己的前方的没人防守的队友(判断队友身边5米范围是否有对方防守队员)。 (p122中+一条if判断防守队员)(11) 在playOn模式下,拿到球后以后,在本方半场传给次近的队友;在对方半场,非10号球员传球给10号球员,10号球员则快速向球门方向带球。 (12) 在playOn模式下,如果在本方场,则朝前方慢速带球,如果在对方半场,则朝球门快速带球。(P96 上)获得坐标,if判断球
7、员位置 + p119 上 带球) (13) 在playOn模式下,拿到球后,如果是2号,则把球踢到左侧边线,如果是5号,则把球踢到右侧边线,并把脖子方向转向球;其他球员则向前带球。(球可踢+判断球号是否为2,获得球员号码(p95 中)+绝对坐标,踢+)(14) 在playOn模式下,拿到球后,如果我是4号,则传球给7号; 否则的话,传球给最近的队友;到对方禁区后以最大速度射向空隙大的球门一侧。(判断号码,传球,P209下 看不太懂,自求多福吧)(15) 在playOn模式下,垂直带球。 (16) 在playOn模式下,拿到球后带球到达球场中心,然后传给最近的球员。(见顶部) (17) 在pla
8、yOn模式下,10号带球前进,然后5号跟着10号一起前进,两球员在同一水平线 上,且距离为5。 (18) 在playOn模式下,5号球员与拿球的对方球员的距离始终为5。 (19) 在playOn模式下,2号和4号一起去盯防对方拿球队员 (20) 在playon模式下,如果是10号球员,在可踢球的状态下,如果自身的x轴坐标大于30,则直接朝着里对方球员远的球门点射门。(获取坐标,两个球门柱的周边找人,人少踢哪边)/拿球以后,需要自己添加WorldModel函数(12) (下面在三部分修改WorldModel.h 264行左右加类成员,WorldModel.cpp加声明,playerteams.c
9、pp加应用)defaltlscdkdeveloppwd当前目录cd主目录rcsssmonitormkdir.新建文件夹touch.新建空文件.上层目录mv.把.移动到.rm删除rmdir删除目录tar-cvfa.taraaa创建tar压缩文件chmod777*提升权限/拿球后行为,利用已有 Worldmodel(20) (1) 在 playOn 模式下,拿到球以后朝前方快速带球。 AngDeg ang=0.0;soc=dribble(ang, DRIBBLE_FAST);(2) 在 PlayOn 模式下,拿到球以后朝球门方向慢速带球。 AngDeg ang=(VecPosition(52.5,
10、0)-posAgent).getDirection(); soc=dribble(ang, DRIBBLE_SLOW);(3) 在 playOn 模式下,拿到球以后把球围绕自己身体逆时针转。 soc=kickBallCloseToBody(-120); (4) 在 playOn 模式下,拿到球后,有人逼抢(自身周围 7 米范围有至少1名对方球员),则把球踢到距离对手的另外一侧,安全带球(如对手在右侧,把球踢到左侧,如对手仔左侧,把球踢到右侧)。 Circle cir(posAgent,7); int num=WM-getNrInSetInCircle(OBJECT_SET_OPPONENTS,
11、cir) AngDeg ang=0;if(num0) if(WM-getGlobalPosition(WM-getClosestInSetTo(OBJECT_SET_OPPONENTS.posAgent)-posAgent).getDirection()=0) ang+=45; soc=dribble(ang, DRIBBLE_WITHBALL); else ang-=45; soc=dribble(ang, DRIBBLE_WITHBALL); elseAngDeg ang=(VecPosition(52.5,0)-posAgent).getDirection(); soc=dribble(
12、ang, DRIBBLE_WITHBALL); (5) 在 playOn 模式下,拿到球以后,有人逼抢,传球给最近的队友;否则向球门方向快速带球。 Circle cir(posAgent,7); int num=WM-getNrInSetInCircle(OBJECT_SET_OPPONENTS,cir) if(num0) soc=leadingPass(WM-getClosestInSetTo(OBJECT_SET_TEAMMATES,posAgent) ,1); elseAngDeg ang=(VecPosition(52.5,0)-posAgent).getDirection(); so
13、c=dribble(ang, DRIBBLE_FAST); (6) 在 playOn 模式下,如果有人逼抢(自身周围 7 米范围有至少 1名对方球员),则安全带球;否则向球门方向快速带球。 Circle cir(posAgent,7); int num=WM-getNrInSetInCircle(OBJECT_SET_OPPONENTS,cir) AngDeg ang=(VecPositoin(52.5,0)-posAgent).getDirection();if(num0) soc=dribble(0,DRIBBLE_WITHBALL); else soc=dribble(ang,DRIBB
14、LE_FAST); (7) 在 PlayOn 模式下,若前方没有对方球员,则直接以最大速度向对方球员方射门(周期数为偶数,球门的右侧射门,周期为奇数,向球门方向左侧射门)。 if(WM-isOpponentAtAngle(30,30)=false) VecPosition posGoal(PITCH_LENGTH/2.0, (-1+2*(WM-getCurrentCircle()%2)*0.4*SS-getGoalWidth(); soc=kickTo(posGoal,SS-getBallSpeedMax(); (8) 在 playOn 模式下,拿到球后,在本方半场踢到球场中心点;过了半场,快
15、速带球到对方球门。 if(WM-getBallPos().getX()getClosestInSetTo(OBJECT_SET_TEAMMATES,posAgent),5); int num=WM-getNrInSetInCircle(OBJECT_SET_OPPONENTS,cir); if(num=0) soc=leadingPass(WM-getClosestInSetTo(OBJECT_SET_TEAMMATES, posAgent) ,1.0) ;else soc=dribble(0,DRIBBLE_WITHBALL); return soc;(10) 在 playOn 模式下,拿到
16、球后,把球传给最靠近自己的前方的没人防守的队友(判断队友身边 5 米范围是否有对方防守队员)。 Circle cir(WM-getClosestInSetTo(OBJECT_SET_TEAMMATES,posAgent),5); int num=WM-getNrInSetInCircle(OBJECT_SET_OPPONENTS,cir);VecPosition diff=WM-getGlobalPosition(WM-getClosestInSetTo(OBJECT_SET_TEAMMATES,posAgent);AngDeg ang=(diff-posAgent).getDirection
17、();if(num=0&ang=-90&anggetClosestInSetTo(OBJECT_SET_TEAMMATES,posAgent) ,1.0); (11) 在 playOn 模式下,拿到球后以后,在本方半场传给次近的队友;在对方半场,非 10 号球员传球给 10 号球员,10 号球员则快速向球门方向带球。 if(WM-getBallPos().getX()getSecondClosestInSetTo(OBJECT_SET_TEAMMATES,posAgent),1.0);if(WM-getBallPos().getX()=0) if(WM-getAgentObjectType()
18、!=OBJECT_TEANMATE_10) soc=leadingPass(OBJECT_TEANMATE_10 ,1.0)if(WM-getAgentObjectType()=OBJECT_TEANMATE_10) AngDeg ang=(VecPositoin(52.5,0)-posAgent).getDirection(); soc=dribble(ang,DRIBBLE_FAST); (12) 在 playOn 模式下,如果在本方半场,则朝前方慢速带球,如果在对方半场,则朝球门快速带球。 if(WM-getBallPos().getX()getBallPos().getX()=0) A
19、ngDeg ang=(VecPositoin(52.5,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),1.0);ACT-putCommandInQueue(turnNeck
20、ToObject(OBJECT_BALL,soc);else if(WM-getPlayerNumber()=5) soc=kickTo(VecPosition(WM-getBallPos().getX(),34),1.0);ACT-putCommandInQueue(turnNeckToObject(OBJECT_BALL,soc);else soc=dribble(0,DRIBBLE_WITHBALL); (14) 在 playOn 模式下,拿到球后,如果我是 4 号,则传球给 7 号; 否则的话,传球给最近的队友;到对方禁区后以最大速度射向空 隙大的球门一侧。if(WM-getAgent
21、ObjectType()=OBJECT_TEANMATE_4) soc=leadingPass(OBJECT_TEAMMATE_7,1.0); elsesoc=leadingPass(WM-getClosestInSetTo(OBJECT_SET_TEAMMATES,posAgent) ,1.0) AngDeg ang=(VecPositoin(52.5,0)-posAgent).getDirection(); soc=dribble(ang,DRIBBLE_FAST);if(WM-isInTheirPenaltyArea(WM-getBallPos() if(WM-getGlobalPosi
22、tion(WM-getOppGoalieType().getY()getBallSpeedMax();else soc=kickTo(VecPosition(52.5,-6.0),SS-getBallSpeedMax(); (15) 在 playOn 模式下,垂直带球。 if(WM-getBallPos().getY()getClosestInSetTo(OBJECT_SET_TEAMMATES,posAgent) ,1.0) (17) 在 playOn 模式下,10 号带球前进,然后 5 号跟着 10 号一起前进,两球员在同一水平线 上,且距离为 5。 /把球给10号,(134行)if(WM
23、-getAgentObjectType()!=OBJECT_TEANMATE_10) soc=leadingPass(OBJECT_TEAMMATE_10,1.0);soc=dribble(0,DRIBBLE_SLOW);/180行if(WM-getAgentObjectType()=OBJECT_TEAMMATE_5) VecPosition pos(WM-getBallPos().getX()-5,WM-getBallPos().getY()soc=moveToPos(pos,20); (18) 在playOn模式下, 5号球员与拿球的对方球员的距离始终为5。/180行 if(WM-get
24、AgentObjectType()=OBJECTTEAMMATE5)VecPosition pos(WM-getBallPos().getX()-5,WM-getBallPos().getY()soc=moveToPos(pos,20); (19) 在 playOn 模式下,2 号和 4 号一起去盯防对方拿球队员 /180行 if(WM-getAgentObjectType()=OBJECTTEAMMATE2)VecPosition pos(WM-getBallPos().getX()-5,WM-getBallPos().getY()soc=moveToPos(pos,20);if(WM-ge
25、tAgentObjectType()=OBJECTTEAMMATE4)VecPosition pos(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,1.0);if(WM-getAgentObj
26、ectType()=OBJECT_TEAMMATE_10&posAgent.getX()30) soc=kickTo(VecPosition(52.5,0),PS-getPlayerWhenToTurnAngle(); ACT-putCommandInQueue( soc ); ACT-putCommandInQueue( turnNeckToObject( OBJECT_BALL, soc ) ); return soc;/拿球以后,需要自己添加 WorldModel 函数(12) (21) 在 playOn 模式下,拿球后传球给更靠近对方球门的最近队友。 soc=leadPass(WM-g
27、etClosestInSetTo (OBJECTSETTEAMMATES, WM-getPosOpponentGoal(),1.0) (22) 在 playOn 模式下,拿球后,搜索前方-3030 之间距离自己 20 米内是否有队友,如果有则传给该队友,否则自己带球。 Page 209;(23).在 playOn 模式下,如果在我方半场拿到球,则向中场线以最大的速度踢,如果在敌方半场拿到球,则向敌方球门处以最大的速度踢 if(WM-getBallPos().getX()0VecPosition pos(0,WM-grtBallPos().getY());soc=kickTo(pos,SS-ge
28、tBallSpeedMax();if(WM-getBallPos().getX()=0 soc=kickTo(VecPosition(52.5,0),SS- getBallSpeedMax();(24).在 playOn 模式下,如果是 9 号拿到球,则令 9 号和 10 号同时冲至敌方球门处,在球门前,9 号传给 10 号,由 10 号进行射门 /把球给9号,(134行)if(WM-getAgentObjectType()!=OBJECT_TEANMATE_9) soc=leadingPass(OBJECT_TEAMMATE_9,1.0); AngDeg ang=(VecPositoin(5
29、2.5,0)-posAgent). getDirection(); soc=dribble(ang,DRIBBLE_FAST);if(WM-isInTheirPenaltyArea(WM-getBallPos() soc=leadingPass(OBJECT_TEAMMATE_10,1.0);if(WM-getAgentObjectType()=OBJECT_TEANMATE_10) soc=kickTo(VecPosition(52.5,0),SS-getBallSpeedMax(); /180行if(WM-getAgentObjectType()=OBJECT_TEANMATE_10)so
30、c=kickTo(VecPosition(52.5,0),SS-getBallSpeedMax();(25).在 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);
31、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; ObjectT
32、pret; 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
33、,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() Circle cir(posAgent,7); int num=WM-getNrInSetInCircle(OBJECT_
34、SET_OPPONENTS,cir); if(num=2) ObjectT ClosestG; ClosestG=WM-getClosestInSetTo(OBJECT_SET_TEAMMATES,VecPosition(52.5,0); soc=leadingPass(ClosestG,1); ACT-putCommandInQueue(soc); ACT-putCommandInQueue( turnNeckToObject( OBJECT_BALL, soc ) ); (28)在 playon 模式下,求出己方的越位线,存在可以踢球的队友的话,如果自身是 10 号。那么 10 球员垂直跑
35、向越位线的 x 轴值-2米,y 轴不变的点。 (29)在 playon 的模式下,求出球运动方向的直线方程,并且求出自己到该直线的距离,如果距离小于 4 的话,那么就垂直跑向该条直线。 (30)在 playon 的模式下,如果是自己可以踢球的状态下,如果自身 7 米内没有对方球员的话,则快熟带球,带球方向是朝着点(53,0)方向。if(WM-isBallKickable() Circle cir(posAgent,7); int num=WM-getNrInSetInCircle(OBJECT_SET_OPPONENTS,cir); if(num=0) AngDeg angDribble=(V
36、ecPosition(53.0,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米内有两
37、个及两个以上的对手的话,那么将球传给最近的队友。 /其他比赛模式下,进攻行为(8) 33 在本方角球模式下,如果自己是 10 号球员,则跑向角球点,并开球(球可踢,则踢球给 9 号);如果自己是 9 号球员,则跑向距离角球点附近(随机选一点),准备接应球,其他球员跑本位点. else if(WM-isCornerKickUs() if(WM-getPlayerNumber()=10) soc=moveToPos(posBall,PS-getPlayerWhenToTurnAngle(); kickTo(OBJECT_TEAMMATE_9,1); if(WM-getPlayerNumber()=
38、9) soc=moveToPos(posBall+VecPosition(3,-3),PS-getPlayerWhenToTurnAngle(); else if(WM-getPlayerNumber()!=10|WM-getPlayerNumber()!=9) soc=moveToPos(posAgent,PS-getPlayerWhenToTurnAngle(); ACT-putCommandInQueue( soc ); ACT-putCommandInQueue( turnNeckToObject( OBJECT_BALL, soc ) ); return soc; 34 在本方边线球
39、模式下,如果自己是距离球最近的队员,跑向球;并开球(球在自己脚下则把球传给最近的队友)。else if(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-putCommandInQue
40、ue( soc ); ACT-putCommandInQueue( turnNeckToObject( OBJECT_BALL, soc ) ); return soc; 35 在本方边线球模式下,在本方半场左侧,则由 2 号去发;如果是本方半场右侧,则由 5 号去发;球在 2 号或者 5 号脚下,则踢向距离自己最近的队友。else if(WM-isOffsideUs() Circle cir(posBall,20); double dist; ObjectT obj=WM-getClosestInSetTo(OBJECT_SET_TEAMMATES,WM-getAgentObjectType(),&dist); VecPosition posTea=WM-getGlobalPosition(obj); if(WM-getBallPos().getY()0) if(WM-getPlayerNumber()=2) soc=moveToPos(posBall,PS-getPlayerWhenToTurnAngl