直线提前量瞄准

import org.robochina.airobot.tank.*;
import org.robochina.math.*;
import java.awt.geom.*;
import java.util.*;

public class FireFirst extends SimpleRobot
{
	private double opponentVelocity;//对手的速度
	private double power = 1;//炮弹的能量
	private double bulletVelocity;//炮弹的速度
	private double headingAB;//连线AB的方向
	private double headingAC;//连线AC的方向
	private double bearingCAB;//求出<CAB
	private double sinCAB;//cab的正弦值
	private double angleACB;//acb的值
	private double headingCB;//CB连线的方向角
	/**
	 * 每个单位时间都会触发
	 */
	public void onTick(TickAction action){

		//得到对手的信息
		Bot opponent = this.getFirstOpponent();
		//如果对手不存在就返回
		if (opponent == null) {
			return;
		}
		//得到对手的速度
		opponentVelocity = opponent.getVelocity();
		//求炮弹的速度
		bulletVelocity = 20-3*power;
		//求连线AB的方向角
		headingAB = opponent.getHeading();
		//求AC连线的方向角
		headingAC = MathUtils.heading(opponent.getLocation(),getLocation());
		//求角cab
		bearingCAB = MathUtils.bearing(headingAB,headingAC);
		//求角cab的正弦值
		sinCAB = Math.sin(bearingCAB);
		//求角acb的值
		angleACB = Math.asin(opponentVelocity*sinCAB/bulletVelocity);
		//cb连线的方向角
		headingCB = headingAC+Math.PI-angleACB;
		fire(headingCB,1);
	}

	/**
	 * 当开始一轮新的比赛时触发
	 */
	public void onRoundBegin(RoundBeginAction action){}

	/**
	 * 当一轮比赛结束时触发
	 */
	public void onRoundFinish(RoundFinishAction action){}

	/**
	 * 当开始一场新的比赛时触发
	 */
	public void onMatchBegin(MatchBeginAction action){}

	/**
	 * 当整场比赛结束时触发
	 */
	public void onMatchFinish(MatchFinishAction action){}

	/**
	 * 当有队友向自己发送消息时触发
	 */
	public void onMessageReceived(MessageReceivedAction action){}

	/**
	 * 当撞到其它机器人时触发
	 */
	public void onHitRobot(HitRobotAction action){}

	/**
	 * 当撞到墙时触发
	 */
	public void onHitWall(HitWallAction action){}

	/**
	 * 当任意一个机器人开火时触发
	 */
	public void onFire(FireAction action){}

	/**
	 * 当有机器人死亡时触发
	 */
	public void onRobotDeath(RobotDeathAction action){}

	/**
	 * 当自己的子弹击中敌人时触发
	 */
	public void onBulletHit(BulletHitAction action){}

	/**
	 * 当被别人的子弹击中时触发
	 */
	public void onHitedByBullet(HitedByBulletAction action){}

	/**
	 * 机器人程序入口
	 * @param args
	 */
	public static void main(String[] args)
	{
		startup(args, new FireFirst());
	}
}

    在这个算法中我们运用的是三角函数的算法来实现,这个也可以用迭代子弹的方法来实现瞄准的算法

    比如现在你在C点,敌人在A点,运动事件为t的情况下走到B点。这个时候我们需要朝着bc连线的方向打击敌人。

是不是一个图就搞定了。嗯是的有时候一直在那想不如自己画画,画画就出来了。



直线提前量瞄准

时间: 2024-09-14 07:38:14

直线提前量瞄准的相关文章

游戏的物理和数学:弹道和移动目标提前量计算

弹道计算是游戏里常见的问题,其中关于击中移动目标的自动计算提前量的话题,看似简单,其实还是挺复杂的数学.网上这方面的资料还真不多,而且都是写的含含糊糊.抽空总结一下自己的方法.讨论的前提是,假设目标是在3D空间里以匀速直线方式运动.1.直线弹道在不考虑重力和空气阻力影响的情况下,子弹的弹道呈直线运动.这种情况下,其实是个纯平面几何空间的问题,不需要微积分和线代知识.分析的情况如下图:         虽然在3D空间飞行,但火炮命中时,命中点和火炮位置.飞机初始位置处于一个三角形上,只需要平面几何

游戏的物理和数学:Unity中的弹道和移动目标提前量计算

下载地址:http://yunpan.cn/cK6pCrpdhfbTd  提取码 5472 弹道计算是游戏里常见的问题,其中关于击中移动目标的自动计算提前量的话题,看似简单,其实还是挺复杂的数学.网上这方面的资料还真不多,而且都是写的含含糊糊.抽空总结一下自己的方法. 讨论的前提是,假设目标是在3D空间里以匀速直线方式运动. 1.直线弹道在不考虑重力和空气阻力影响的情况下,子弹的弹道呈直线运动.这种情况下,其实是个纯平面几何空间的问题,不需要微积分和线代知识.分析的情况如下图:        

稍微复杂一点的瞄准算法-直线瞄准算法

package jiaqi; import java.awt.geom.Point2D; import robocode.AdvancedRobot; import robocode.Rules; import robocode.ScannedRobotEvent; public class MyDemoRobot extends AdvancedRobot{ /** * 扫描到敌人的时间 */ private double time1 = 0; private Enemy enemy = ne

6.基本瞄准与函数

之前我们讨论了如何移动,下面我们就研究一下如何瞄准 定点瞄准: 直线瞄准: 曲线瞄准: 相关事件: 知己知彼能够随时了解敌人的动态,是瞄准中第一要素.通过getBot(int id)和getFirstOppoent()这两个函数就是搜集机器人的信息. Bot是一个机器人的接口,里面定义了各种必要的信息.如对手机器人的坐标,生命能量,机器人的方向等有用的信息. Bot double getEnergy()得到机器人的能量 long getFirePrepareTime()返回机器人的开火准备时间

光栅图形学(一):直线段的扫描转换算法

前言 在数学上,理想的直线是没有宽度的,它是由无数个点构成的集合.对直线进行光栅化时,只能在显示器说给定的有限个像素组成的矩阵中,确定最佳逼近于该直线的一组像素,并且按扫描线顺序. 本节介绍绘制线宽为一个像素的直线的三个常用算法:数值微分,中点画线和Bresenham算法. 数值微分法 已知过端点 P0(x0, y0),P1(x1, y1) 的直线段 L(P0, P1):直线斜率为 k = (y1 - y0) / (x1 - x0). 于是 yi+1 = kxi+1 + b. 于是,x每增加1,

封装 用canvas绘制直线的函数--面向对象

1 <!DOCTYPE html> 2 <html lang="en"> 3 <head> 4 <meta charset="UTF-8"> 5 <title>用面向对象的思想 封装 在canvas绘制直线的函数</title> 6 </head> 7 <body> 8 <canvas id="cv"></canvas> 9 &

BZOJ-1007-水平可见直线-HN2008

描述 在xoy直角坐标平面上有n条直线L1,L2,-Ln,若在y值为正无穷大处往下看,能见到Li的某个子线段,则称Li为可见的,否则Li为被覆盖的. 例如,对于直线: L1:y=x; L2:y=-x; L3:y=0 则L1和L2是可见的,L3是被覆盖的. 给出n条直线,表示成y=Ax+B的形式(|A|,|B|<=500000),且n条直线两两不重合.求出所有可见的直线. 分析 可以用半平面交, 但是看了题解发现可以用栈来做. 先按照斜率从小到大排序, 向栈中添加直线L时, 如果L与栈顶直线的交点

挨踢观察:勒索病毒又要瞄准移动端了?移动支付安全该怎么办?

5月12日至今,肆虐全球的WannaCry勒索病毒让全球网民度过了灰暗恐慌的一周,也让诸多普通网民真正意识到,网络安全并非只是网络公司或安全公司的事了,自己也是网络安全中的一员.据了解,WannaCry勒索病毒是黑客组织"影子经纪人"外泄的黑客工具,而该组织日前再次发出警告,将于今年6月披露更多的黑客工具,主要瞄准路由器.浏览器.Windows 10.或者手机!这就是说,第一波的勒索病毒主要针对Windows系统,而接下来的将会涉及到我们每个人的手机! 在写文章前,我想先问一个问题:你

Vs自定义控件设计第一例(直线控件的设计)

目录 一. 杨老师是个热情的人 二. 开始喽 三. 还需要些解释什么吗 四. OK了吗 五.最终代码 一.杨老师是个热情的人 我们的项目开源有一段时间了,我一直以为我有一个很不错的胸怀把自己花了很多精力做出来的项目贡献出来了,我以为同学们会很开心,会像“一个饥饿的人看到面包”一样的扑到了我的项目代码上面快乐的研究起来,但是事实上我们的群里面却异常的冷清.我想应该是大家都还在研究代码来不及说话或者是不爱说话吧,直到今天杨老师给我打电话,说了一些情况,似乎是说大家还不太懂数据库等等,我才知道是我错了