📄 main.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 + -