📄 worm.cpp
字号:
#include <airobot/cpp/SimpleRobot.hpp>
/**
* 这个类对应一个机器人,根据需要实现相应的Action处理函数,
* 就可以订制自己的机器人。
*/
class Worm: public SimpleRobot{
private:
const int MAX_SPARROWS = 100; /*最多对付100个麻雀*/
/*记录麻雀x坐标的数组*/
double ex[] = new double[MAX_SPARROWS];
/*记录麻雀y坐标的数组*/
double ey[] = new double[MAX_SPARROWS];
public:
/**
* 每个单位时间都会触发
*/
void onTick(TickAction* action){
setMove();/*调用运动模块*/
}
/**
* 计算并返回指定距离下的麻雀味道大小,留到后面来实现
*/
double getSparrowSapor(double dist){
return 1/dist;
}
/**
* 计算指定坐标点的总的麻雀味道大小
*/
double getSparrowSaporTotal(double x, double y){
double sparrowSaporTotal = 0;
/* 计算并累加每个麻雀在这点上的味道大小 */
int i;
for(i=0; i<(getOpponents().size()) && i<MAX_SPARROWS; i++){
double dist = MathUtils::distance(x, y, ex[i], ey[i]);
sparrowSaporTotal += getSparrowSapor(dist);
}
return sparrowSaporTotal;
}
/**
* 记录所有麻雀的坐标
*/
void recordSparrowSapor(){
int i;
for(i=0; i<(getOpponents().size()) && i<MAX_SPARROWS; i++){
Bot* bot = (Bot)getOpponents[i];
/*记录此麻雀的坐标*/
ex[i] = bot->getLocation()->getX();
ey[i] = bot->getLocation()->getY();
}
}
/**
* 远离麻雀的运动模块函数,必须是一个设置函数
*/
void setMove(){
recordSparrowSapor();
double mx = getX();
double my = getY();
double angle = 0; /* 搜索角度 */
/* 搜索角度跨度,以达成36个搜索点的目标 */
double step = Math::toRadians(10);
double radius = 40; /* 搜索半径 */
//下面代码找出以自己为圆心,指定半径的圆上若干个点上麻雀味道最小的点
double minSparrowSapor = 10000; /*一个非常大的值*/
double minSparrowSaporX = 0;
double minSparrowSaporY = 0;
for(angle=0; angle<Math::PI*2; angle+=step){
/* 算出搜索点 */
double nx = mx + Math::cos(angle)*radius;
double ny = my + Math::sin(angle)*radius;
/* 得到搜索点的麻雀味道大小 */
double sparrowSapor = getSparrowSaporTotal(nx, ny);
/* 是否比目前最小的还要小,如果是,记录坐标并更新最小值*/
if(sparrowSapor < minSparrowSapor){
minSparrowSapor = sparrowSapor;
minSparrowSaporX = nx;
minSparrowSaporY = ny;
}
}
/* 下面代码让自己往目标点方向移动 */
double myHeading = getHeading();
/* 目标点相对自己的方向 */
double moveToHeading =
MathUtils::heading(mx, my, minSparrowSaporX, minSparrowSaporY);
/* 需要转动的角度值 */
double needTurn = MathUtils::bearing(moveToHeading, myHeading); turn(needTurn);
move(8); /*保持向前运动*/
}
//启动机器人程序
int main(int argC, char* argV[])
{
Robot* robot = new Worm();
return startup(argC, argV, robot);
}
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -