题目要求
//拿球后行为,利用已有 Worldmodel(21)
(1)在 playOn 模式下,拿到球以后朝前方快速带球。
(2)在 PlayOn 模式下,拿到球以后朝球门方向慢速带球。
(3)在 playOn 模式下,拿到球以后把球围绕自己身体逆时针转。
(4)在 playOn 模式下,拿到球后,有人逼抢(自身周围 7 米范围有至少 1 名对方
球员),则把球踢到距离对手的另外一侧,安全带球(如对手在右侧,把球踢
到左侧,如对手仔左侧,把球踢到右侧)。
(5)在 playOn 模式下,拿到球以后,有人逼抢,传球给最近的队友;否则向球门
方向快速带球。
(6)在 playOn 模式下,如果有人逼抢(自身周围 7 米范围有至少 1 名对方球员), 则安全带球;否则向球门方向快速带球。
(7)在 PlayOn 模式下,若前方没有对方球员,则直接以最大速度向对方球门射门
(周期数为偶数,球门的右侧射门,周期为奇数,向球门的左侧射门)。
(8)在 playOn 模式下,拿到球后,在本方半场踢到球场中心点;过了半场,快速
带球到对方球门。
(9)在 PlayOn 模式下,拿到球后,把传给最近的周围没人防守的队友(没有人防
守以其周围 5 米范围是否有对方球员为准)脚下。
(10) 在 playOn 模式下,拿到球后,把球传给最靠近自己的前方的没人防守的
队友(判断队友身边 5 米范围是否有对方防守队员)。
(11) 在 playOn 模式下,拿到球后以后,在本方半场传给次近的队友;在对方
半场,非 10 号球员传球给 10 号球员,10 号球员则快速向球门方向带球。
(12) 在 playOn 模式下,如果在本方半场,则朝前方慢速带球,如果在对方半
场,则朝球门快速带球。
(13) 在 playOn 模式下,拿到球后,如果是 2 号,则把球踢到左侧边线,如果
是 5 号,则把球踢到右侧边线,并把脖子方向转向球;其他球员则向前带球。
(14) 在 playOn 模式下,拿到球后,如果 4 号,则传球给 7 号; 否则的话,传
球给最近的队友;到对方禁区后以最大速度射向空隙大的球门一侧。
(15) 在 playOn 模式下,拿球后垂直带球。
(16) 在 playOn 模式下,拿到球后带球到达球场中心;在球场中心附近位置(中 心位置周围 2 米半径范围内)传给最近的球员。
(17) 在 playOn 模式下,如果 10 号控球,则其带球前进,然后 5 号跟着 10
号一起前进,两球员在同一水平线上,且距离为 5。
(18) 在 playon 模式下,如果是 10 号球员,在可踢球的状态下,如果自身的
x 轴坐标大于 30,则直接朝着离对方球员远的球门点射门。
(19) 在 playOn 模式下,如果是 9 号拿到球,则令 9 号和 10 号同时冲至敌方
球门处,在球门前,9 号传给 10 号,由 10 号进行射门
(20) 在 playOn 模式下,如果我是 4 号球员并且拿到了球,则传给 7 号球员,
同时 7 号球员再传给 9 号球员,9 号球员继续以最大速度冲到球门处射门。
(21) 在 playOn 模式下,如果在我方半场拿到球,则向中场线以最大的速度踢,
如果在敌方半场拿到球,则向敌方球门处以最大的速度踢
//拿球以后,需要自己添加 WorldModel 函数(12)
(22) 在 playOn 模式下,拿球后传球给更靠近对方球门的最近队友。
(23) 在 playOn 模式下,拿球后,搜索前方-30~30 之间距离自己 20 米内是否
有队友,如果有则传给该队友,否则自己带球。
(24) 在 playon 模式下,求出 y 轴等于 0 的两侧的对方球员数量,将球传向对
手少的一方,并且 x 轴值最大的队友。
(25) 在 playon 模式下,如果自身 7 米范围内有两个或两个以上的对手的话,
则传球到 x 轴值最大的队友。
(26) 在 playon 模式下,求出己方的越位线,存在可以踢球的队友的话,如果
自身是 10 号。那么 10 球员垂直跑向越位线的 x 轴值-2 米,y 轴不变的点。
(27) 在 playon 的模式下,求出球运动方向(即求出其对应的直线方程),并
且求出自己到该直线的距离,如果距离小于 4 的话,那么就垂直跑向该条直
线。
(28) 在 playon 的模式下,如果是自己可以踢球的状态下,如果自身 7 米内没
有对方球员的话,则快速带球,带球方向是朝着点(53,0)方向。
(29) 在 playon 的模式下,如果距离球最近的是我方队友的话,如果我的 x
坐标小于 30 的话,并且我是 10 号,那么我跑向球的坐标加上(0,10)的坐
标位置。
(30) 在 playon 的模式下,发现前方没有队友的时候,如果自身 5 米内有两个
及两个以上的对手的话,那么将球传给最近的队友。
(31) 在 playon 的模式下,发现前方没有对方球员的时候,则快速向球门放向
带球,距离守门员 5-10 米时向空隙较大的一侧射门。
(32) 在 playon 的模式下,发现前方没有对方球员的时候,则快速向球门放向
带球,距离守门员 5-10 米时向空隙较大的一侧射门。
(33) 在 playon 的模式下,(8,9,10,11)前方没有对方球员的时候,则快 速向球门放向带球,距离守门员 5-10 米时向空隙较大的一侧射门。
//其他比赛模式下,进攻行为(8)
(34) 在本方角球模式下,如果自己是 10 号球员,则跑向角球点,并开球(球
可踢,则踢球给 9 号);如果自己是 9 号球员,则跑向距离角球点附近(随
机选一点),准备接应球,其他球员跑本位点.
(35) 在本方边线球模式下,如果自己是距离球最近的队员,跑向球;并开球
(球在自己脚下则把球传给最近的队友)。
(36) 在本方边线球模式下,在本方半场左侧,则由 2 号去发;如果是本方半
场右侧,则由 5 号去发;球在 2 号或者 5 号脚下,则踢向距离自己最近的队
友。
(37) 在本方边线球的模式下,如果我是距离第二近的队友的话,那么我也跑
朝着球的位置跑,直到距离球 7 米的范围。
(38) 在本方边线球的模式下,如果我是 4 号的话,并且距离球最近的队友不
是我,那么我将跑向球的坐标加上(5,0)的位置上去。
(39) 在本方边线球的模式下,如果我是距离球第二近的队友,那么我跑向距
离球 12 米的范围内,并且距离对方球门点(53,0)最近的点。
(40) 在本方边线球的模式下,距离球最近的队友跑向球并开球,如果我不是
距离球第二近的队友,那么我向自身向量(5,0)的方向跑去。
(41) 在本方边线球的模式下,距离球最近的队友跑向球并开球。如果我不是
距离球第二近的队友,那么求出距离球第二近的队友的坐标加上(10,5)的
点;如果该点在球场内,则跑向该点,如果该点在场外,则计算距离该点最 近的边界点。
//playOn 模式下,防守行为(8)
(42) 在 playOn 模式下,5 号球员与拿球的对方球员的距离始终为 5。
(43) 在 playOn 模式下,2 号和 4 号一起去盯防对方拿球队员。
(44) 在 playOn 模式下,如果对方 10 号拿球,如果我是 2、3、4 号,则去盯
防 10 号。
(45) 在 playOn 模式下,如对方 9 号拿球,我方 2、3、4 号距离球最近的球员
去盯防 9 号,其他队员盯防距离自己最近的对方球员
(46) 在 playOn 模式下,如果对方比我先接近球,则离球最近的队员去盯球,
其他球员盯防距离自己最近的对方球员。
(47) 在 playOn 模式下,如果对方 11 号拿到球,则 7 号球员从左边去断球,8 号球员从右边去断球。
(48) 在 playOn 模式下,防守模式下(即球不在我方球员脚下),我方 6 号球
员始终跟着敌方 9 号,我方 7 号始终跟着敌方 10 号,8 号球员始终跟着敌方
11 号球员。
(49) 在 playOn 模式下,防守模式下(即球不在我方球员脚下),我方距离球
最近的 2 名队员负责去盯防对方离球最近的球员,其他球员其他球员采用人 球都盯的方式盯防防距离自己最近的对方球员(即跑到距离自己最近的对方
球员的可能接球路线的前面位置点) //其他比赛模式下,防守行为(7)
(50) 在对方边线球的模式下,如果我是 4 号,那么我就跑向距离球最近的对
方球员处。
(51) 在对方边线球的模式下,如果我是距离球第二近的队员的话,那么我跑
向距离球第二近的对方球员的位置。
(52) 在对方角球模式情况下,如果球在我方左侧,则 2,3,6,7 号平均分布
在以球的位置为圆心,半径 10 米的圆弧上(其中 2 号的初始位置可以自行设
定,间距也可以自行设定,但是需要保证 2,3,6,7 都在场内);如果球在
我方右侧,则 4,5,7,8 号平均分布在以球的位置为圆心,半径 10 米的圆 弧上(其中 4 号的初始位置可以自行设定,间距也可以自行设定,但是需要
保证 4,5,7,8 都在场内)。
(53) 在对方边线球的模式下,如果我不是距离球最近的队友,并且我的 x 轴
坐标大于 0 的话,那么我跑向自身位置加(-10,0)的点的位置去。
(54) 在对方边线球的模式下,如果我身边 5 米内有对方球员的话,那么我跑
向身边对方球员的位置,并且我的 x 轴坐标的值要比该对方的大 2。
(55) 在对方边线球的模式下,如果球的位置的 x 轴小于 0,如果我是 4 号或 5
号的话,一起跑向距离球第二近的对方球员的位置。
(56) 在对方角球模式情况下,如果球在我方左侧,则 2,3 号负责盯防对方距 离球第二近的对方球员;如果球在我方右侧,则 4,5 号负责盯防对方距离球
第二近的对方球员。
注:本代码中的fabs(),sqrt()函数,由于使用的时候编译器报错,添加了文件还是报错,所以使用这两个函数的时候注意。
本代码未经测试,仅供参考,如有错误,欢迎指正!如有更好地思路,欢迎交流!
添加函数
WorldModel.h
/*************************add***************************/
/*----------------start---------------------*/
ObjectT getTeammateClosestToGoalAndAgent();
ObjectT getTeammateAtAngleDist( AngDeg ang1, AngDeg ang2, double dist );
int getOpponentNumSideY( int mark );
ObjectT getXMaxTeammateBySide( int mark );
ObjectT getClosestFlagToPos( VecPosition pos );
bool isTeammateAtAngle( AngDeg ang1, AngDeg ang2 );
double getAgentDistFromGoalie();
ObjectT getNearestBallObj( ObjectT obj1, ObjectT obj2);
ObjectT getOppByDistAndPos( double dist, double x, double y );
/*----------------end----------------------*/
WorldModel.cpp
/****************************add***************************/
/*----------------------start-------------------------------*/
ObjectT WorldModel::getTeammateClosestToGoalAndAgent()
{
int iIndex;
ObjectT closeAgent = OBJECT_ILLEGAL;
ObjectT closeBoth = OBJECT_ILLEGAL;
VecPosition posGoal( 52.5, 0 );
VecPosition posAgent = getGlobalPosition( getAgentObjectType() );
for( ObjectT o = iterateObjectStart(iIndex, OBJECT_SET_TEAMMATES);
o == OBJECT_ILLEGAL;
o = iterateObjectNext(iIndex, OBJECT_SET_TEAMMATES))
{
if( closeAgent==OBJECT_ILLEGAL || posAgent.getDistanceTo( o )<posAgent.getDistanceTo( closeAgent ))
{
closeAgent = o;
if( closeBoth==OBJECT_ILLEGAL || posGoal.getDistanceTo( closeAgent )<posGoal.getDistanceTo( closeBoth ))
closeBoth = closeAgent;
}
}
iterateObjectDone( iIndex );
return closeBoth;
}
ObjectT WorldModel::getTeammateAtAngleDist( AngDeg ang1, AngDeg ang2, double dist)
{
VecPosition posAgent = getAgentGlobalPosition();
VecPosition posTeammate;
AngDeg ang;
int iIndex;
for( ObjectT o = iterateObjectStart(iIndex, OBJECT_SET_TEAMMATES);
o == OBJECT_ILLEGAL;
o = iterateObjectNext(iIndex, OBJECT_SET_TEAMMATES))
{
posTeammate = getGlobalPosition( o );
ang = (posTeammate - posAgent).getDirection();
if( (ang>=ang1 && ang<=ang2) && (posAgent.getDistanceTo(posTeammate) < dist))
return o;
}
iterateObjectDone(iIndex);
return OBJECT_UNKNOWN;
}
int WorldModel::getOpponentNumSideY( int mark )// mark<0获得 Y<0半场 对方球员 数
{
VecPosition posOpp;
int iIndex;
int oppNumT;
int oppNumB;
for( ObjectT o = iterateObjectStart(iIndex, OBJECT_SET_OPPONENTS);
o == OBJECT_ILLEGAL;
o = iterateObjectNext(iIndex, OBJECT_SET_OPPONENTS))
{
posOpp = getGlobalPosition( o );
if( posOpp.getY() < 0 )
oppNumT++;
else if( posOpp.getY() > 0)
oppNumB++;
}
iterateObjectDone(iIndex);
if( mark < 0)
return oppNumT;
else if( mark > 0)
return oppNumB;
else
return 65001;
}
ObjectT WorldModel::getXMaxTeammateBySide( int mark )// mark<0获得 Y<0半场
{
int iIndex;
ObjectT maxTeammate = OBJECT_ILLEGAL;
for( ObjectT o = iterateObjectStart(iIndex, OBJECT_SET_TEAMMATES);
o == OBJECT_ILLEGAL;
o = iterateObjectNext(iIndex, OBJECT_SET_TEAMMATES))
{
VecPosition pos = getGlobalPosition( o );
if( (pos.getY()<0 && mark<0) || (pos.getY()>0 && mark>0) )
{
if( maxTeammate==OBJECT_ILLEGAL || pos.getX()>getGlobalPosition( maxTeammate ).getX() )
maxTeammate = o;
}
}
iterateObjectDone( iIndex );
return maxTeammate;
}
ObjectT WorldModel::getClosestFlagToPos( VecPosition pos )
{
int iIndex;
double dist = 65001;
ObjectT flag = OBJECT_ILLEGAL;
for( ObjectT o = iterateObjectStart(iIndex, OBJECT_SET_FLAGS);
o == OBJECT_ILLEGAL;
o = iterateObjectNext(iIndex, OBJECT_SET_FLAGS))
{
if( pos.getDistanceTo( o ) < dist )
{
dist = pos.getDistanceTo( o );
flag = o;
}
}
iterateObjectDone( iIndex );
return flag;
}
bool WorldModel::isTeammateAtAngle( AngDeg ang1, AngDeg ang2 )
{
VecPosition posAgent = getAgentGlobalPosition();
VecPosition posTeammate;
AngDeg ang;
int iIndex;
for( ObjectT o = iterateObjectStart(iIndex, OBJECT_SET_TEAMMATES);
o == OBJECT_ILLEGAL;
o = iterateObjectNext(iIndex, OBJECT_SET_TEAMMATES))
{
posTeammate = getGlobalPosition( o );
ang = (posTeammate - posAgent).getDirection();
if( ang>=ang1 && ang<=ang2 )
return true;
}
iterateObjectDone(iIndex);
return false;
}
double WorldModel::getAgentDistFromGoalie()
{
VecPosition posAgent = getAgentGlobalPosition();
VecPosition posGoalie = getGlobalPosition( getOppGoalieType() );
return posAgent.getDistanceTo( posGoalie );
}
ObjectT WorldModel::getNearestBallObj( ObjectT obj1, ObjectT obj2)
{
VecPosition pos1 = getGlobalPosition( obj1 );
VecPosition pos2 = getGlobalPosition( obj2 );
VecPosition posBall = getGlobalPosition( OBJECT_BALL );
double dist1 = posBall.getDistanceTo( pos1 );
double dist2 = posBall.getDistanceTo( pos2 );
if( dist1 >= dist2 )
return obj1;
else
return obj2;
}
//获得与我距离dist,x轴坐标值相差x,y轴坐标值相差y的对方球员
ObjectT WorldModel::getOppByDistAndPos( const double dist, const double x, const double y )
{

本文详细介绍了一种足球机器人比赛中的具体行为策略,包括不同比赛模式下的进攻与防守行为,以及特定情境下的战术配合。通过实现这些策略,机器人能够更加智能地应对比赛中的各种情况。
最低0.47元/天 解锁文章
3242

被折叠的 条评论
为什么被折叠?



