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

📄 main.c

📁 以AIROBOT为平台构建的一个智能机器人。主源码见main.c。其余为使用的函数接口定义
💻 C
字号:
/*
 这是一个 c 机器人模板.
 以下列出的函数是用户必须定义的函数。
 你可以根据需要在下面列出的执行函数和事件处理函数中加入代码,定义自己的机器人。
*/
#include "Robot.h"
#include "Utils.h"
#include "Math.h"
/////////////////////////////////////////////////////////////
void doMove(double withangle);
void doMoveTo(double a,double b,double c);
void doRadar(void);
void doCheckBiten(void);
void doGun(void);
void fireTo(double);
void doMoveTo1(void);
int hasbiten=0;
int teeth=55;
int longteeth=80;
/**
 * 执行函数
 */
void work()
{
	doRadar();
	doCheckBiten();
	if (hasbiten==0)
		doMove(PI/2);
	else if(hasbiten==1)
		doMove(0);
	else doMoveTo1();
	doGun();
}
//////////////////////////////////////////////////////////////
//事件处理函数,相应事件发生时被调用一次

/*
 * 当开始一轮新的战斗时触发
 */
void onBegin()
{
 scannedRobotEvent.time = -5;

}

/*
* 当雷达扫描到敌人时触发
*/
void onScannedRobot()
{
 
}
	
/*
* 当打中某个敌人时触发
*/
void onBulletHit()
{
 
}
	
/*
 * 当被敌人打中时触发
 */
void onHitByBullet()
{
 
}
	
/*
 * 当撞到其它敌人时触发
 */
void onHitRobot()
{
 fireTo(-100);
 fire(3);
 hasbiten=1;
}
	
/*
 * 当撞到墙时触发
 */
void onHitWall()
{
 
}
	
/*
 * 当某个敌人死时触发
 */
void onRobotDeath()
{
 
}
	
/*
 * 当一轮战斗结束时触发
 */
void onFinish()
{
 
}

/*
 * 当机器人执行操作超时时触发
 */
void onOvertime()
{
 
}
//normal move
void doMove(double withangle)
{
	if(getBodyTurnRemaining()==0)
		doMoveTo(scannedRobotEvent.x,scannedRobotEvent.y,withangle);
	moveBody(8);
}

//move to
void doMoveTo(double x,double y,double a)
{
	double h=heading(getBodyX(),getBodyY(),x,y);
	double angle=turnAngle(getBodyHeading(),h);
	if (angle>0)
		angle+=a;
	else
		angle-=a;
	turnBody(angle);
}

//控制雷达单元
void doRadar()
{
	//雷达锁定
	if( getTime()- scannedRobotEvent.time > 3 )turnRadar(PI);
	else
	{
		//雷达转向敌人,以实现锁定
		double h = heading( getBodyX(),getBodyY(),
			 scannedRobotEvent.x, scannedRobotEvent.y
	    );
		double angle = turnAngle(getRadarHeading(),h);
		turnRadar(angle);
	}
}
//chose move mode
void doCheckBiten()
{
	if (distance(getBodyX(),getBodyY(),scannedRobotEvent.x,scannedRobotEvent.y)<teeth)
		hasbiten=1;
	else if (distance(getBodyX(),getBodyY(),scannedRobotEvent.x,scannedRobotEvent.y)<longteeth)
		hasbiten=2;
	else 
		hasbiten=0;
}
// chose fire mode
void doGun()
{ 
	if (hasbiten==1)
	{
		fireTo(3);
		fire(3);
	}
	else if(distance(getBodyX(),getBodyY(),scannedRobotEvent.x, scannedRobotEvent.y)<90&&hasbiten==0)
  {
	  fireTo(3);
	  fire(3);
  }
	else if(distance(getBodyX(),getBodyY(),scannedRobotEvent.x, scannedRobotEvent.y)<150&&hasbiten==0)
  {
	  fireTo(2);
	  fire(2);
  }
	else if(distance(getBodyX(),getBodyY(),scannedRobotEvent.x, scannedRobotEvent.y)<180&&hasbiten==0)
  {
	  fireTo(1);
	  fire(1);
  }
	else fireTo(-100);
}

//fire
void fireTo(double p)
{
	double angle,h,pv,gunangle,v;
 	v=scannedRobotEvent.velocity;//敌人运动速度
	h=heading(scannedRobotEvent.x, scannedRobotEvent.y,getBodyX(),getBodyY());//敌人和自己连线的方向(自己的x,y,敌人的x,y)
	angle=turnAngle(scannedRobotEvent.heading,h);//需要转过的角度
	pv=20-3*p+2.*p/3;//子弹速度
	gunangle=asin(v*sin(angle)/pv);
	gunangle=gunangle+(h-PI);//提前射击的方向
	angle=turnAngle(getGunHeading(),gunangle);//提前射击炮口需要转过的角度
	turnGun(angle);//转炮口
}

void doMoveTo1()
{
	double angle,h,gunangle,v;
 	v=scannedRobotEvent.velocity;//敌人运动速度
	h=heading(scannedRobotEvent.x, scannedRobotEvent.y,getBodyX(),getBodyY());//敌人和自己连线的方向(自己的x,y,敌人的x,y)
	angle=turnAngle(scannedRobotEvent.heading,h);//需要转过的角度
    gunangle=asin(v*sin(angle)/8);
	if (angle<0)
		gunangle-=(h-PI);
	else
	gunangle=gunangle+(h-PI);//提前射击的方向
	angle=turnAngle(getGunHeading(),gunangle);//提前射击炮口需要转过的角度
	turnBody(angle);//转body
}

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -