⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 worm.cpp

📁 AI-CODE坦克机器人 《C++语言学习利器 —AI-CODE坦克机器人》-杜飞雪-源代码
💻 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 + -