该方法是直线瞄准算法

使用Walls机器人以及下面算法的机器人

//战场类
package type.com.xalead;
public class Enemy {
//     public static void main(String[] args) {
//           Enemy e1 = new Enemy();
//           Enemy e2 = new Enemy();
//           Enemy e3 = new Enemy();
//           Enemy e4 = new Enemy();
//           
//           e1.PI = 3.14159265;
//           System.err.println(e2.PI);
//           Enemy.PI = 333;
//           Enemy.work();
//     }
//     static double PI = 3.14;
//     public static void work(){}
       //attribute
       private double bearing;
       private double distance = 3000;
       private double heading;
       private double speed;
       
       
       public double getSpeed() {
             return speed;
       }
       public void setSpeed(double speed) {
             this.speed = speed;
       }
       public double getDistance() {
             return distance;
       }
       public void setDistance(double distance) {
             this.distance = distance;
       }
       public double getHeading() {
             return heading;
       }
       
       //property
       public void setHeading(double heading) {
             if(!(heading < 0.0)){
                    this.heading = heading;
             }
       }
       
       /**
        * bearing锟斤拷锟斤拷锟斤拷锟�
        * @return
        */
       public double getBearing(){
             return this.bearing;
       }
       /**
        * bearing锟斤拷锟斤拷锟�
        * @param bearing
        */
       public void setBearing(double bearing){
             this.bearing = bearing;
       }
}
//测试机器人
package type.com.xalead;
import java.awt.geom.Point2D;
import robocode.AdvancedRobot;
import robocode.Rules;
import robocode.ScannedRobotEvent;
import robocode.util.Utils;
public class TestRobot extends AdvancedRobot {
       public static void main(String[] args) {
             // double a = Math.tan(Math.toRadians(135));
             // System.err.println(a);
             // double a = Math.toDegrees(Math.atan2(10, -10));
             // System.err.println(a);
             System.out.println(Math.random());
       }
       private double time1 = 0;
       private Enemy enemy = new Enemy();
       private boolean discover = false;
       private double heading = 0.0;
       private double radarHeading = 0.0;
       private double bPower = 3;
       private double time = 0;
       private double distance = 3000;
       @Override
       public void onScannedRobot(ScannedRobotEvent e) {
             discover = true;
             preTime = time1;
             time1 = getTime();
             enemy.setBearing(e.getBearingRadians());
             enemy.setSpeed(e.getVelocity());
             enemy.setDistance(e.getDistance());
             preHeading = enemy.getHeading();
             enemy.setHeading(e.getHeadingRadians());
             time = distance / Rules.getBulletSpeed(bPower);
       }
//装饰方法
       private void dressing() {
       }
//旋转方法
       private void severance() {
             setAdjustGunForRobotTurn(true);
             setAdjustRadarForGunTurn(true);
       }
//简单移动的方法
       private void simpleMove() {
             double increment = 0;
             if (enemy.getBearing() > 0) {
                    increment = Math.PI / 2 - enemy.getBearing();
                    setTurnLeftRadians(increment);
             } else {
                    increment = Math.PI / 2 + enemy.getBearing();
                    setTurnRightRadians(increment);
             }
             setAhead(1000);
       }
       private double safDis = 100;//安全距离
       //高级移动方法
       private void movement() {
             if (getDistanceRemaining() < 1) {
                    double nx = 0;
                    double ny = 0;
                    nx = Math.random() * (getBattleFieldWidth() - 2 * safDis) + safDis;
                    ny = Math.random() * (getBattleFieldHeight() - 2 * safDis) + safDis;
                    double headArg = 90 - Math.atan2(ny - getY(), nx - getX());
                    headArg = Utils.normalAbsoluteAngle(headArg);
                    double dis = Point2D.distance(getX(), getY(), nx, ny);
                    if (headArg - getHeadingRadians() > Math.PI / 2) {
                           setTurnRightRadians(headArg - getHeadingRadians() + Math.PI);
                           setAhead(-dis);
                    } else {
                           setTurnRightRadians(headArg - getHeadingRadians());
                           setAhead(dis);
                    }
             }
       }
       private void doScan() {
             if (discover) {
                    heading = this.getHeadingRadians();
                    radarHeading = this.getRadarHeadingRadians();
                    double temp = radarHeading - heading - enemy.getBearing();
                    temp = Utils.normalRelativeAngle(temp);
                    temp *= 1.2;
                    setTurnRadarLeftRadians(temp);
             }
       }
       private double firePower() {
             return bPower;
       }
       /**
        * 
        */
       private double immidate() {
             double increment = heading + enemy.getBearing()
                           - getGunHeadingRadians();
             increment %= 2 * Math.PI;
             increment = Utils.normalRelativeAngle(increment);
             return increment;
       }
       /**
        * 开枪
        */
       private void gun() {
             // double increment = immidate();
             double increment = line();
             setTurnGunRightRadians(increment);
       }
       
       private double  preHeading = 0.0;//锟斤拷锟斤拷
       private double preTime = 0.0;//前一锟斤拷时锟斤拷
       
       /*
       *曲线射击
       */
       private double circle(){
             double t = 0.0;
             double ea = Utils.normalAbsoluteAngle(getHeadingRadians() + enemy.getBearing());
             double ex = getX() + enemy.getDistance() * Math.sin(ea);
             double ey = getY() + enemy.getDistance() * Math.cos(ea);
             double offsetHeading = enemy.getHeading() - preHeading;
             double dv = offsetHeading /(time1 - preTime);
             if(Math.abs(dv)<0.00001){
                    dv+=0.00001;
             }
             double r = enemy.getSpeed()/dv;
             double preDistance= enemy.getDistance();
             for(int i = 0; i<8;i++){
             double bulletTime = preDistance / Rules.getBulletSpeed(bPower);
             double nextHeading = enemy.getHeading()+dv*bulletTime;
             double nextx = ex + r * Math.cos(enemy.getHeading())- r * Math.cos(nextHeading);
             double nexty = ey + r * Math.sin(nextHeading)- r * Math.cos(enemy.getHeading());
             preDistance = Point2D.distance(getX(), getY(),nextx, nexty);
             t = Math.atan2(nexty - getY(), nextx - getX());
       }
             return Utils.normalRelativeAngle((Math.PI / 2 - t - getGunHeadingRadians())
                           % (2 * Math.PI));   
       }
       /**
        * 直线射击
        *
        * @return
        */
       private double line() {
             double ea = Utils.normalAbsoluteAngle(getHeadingRadians() + enemy.getBearing());
             double ex = getX() + enemy.getDistance() * Math.sin(ea);
             double ey = getY() + enemy.getDistance() * Math.cos(ea);
             double s = 0;
             if (enemy.getSpeed() >= Rules.MAX_VELOCITY - 0.1) {
                    s = enemy.getSpeed() * time;
             } else if (enemy.getSpeed() > 0.0) {
                    double as = (Math.pow(Rules.MAX_VELOCITY, 2) - Math.pow(
                                 enemy.getSpeed(), 2))
                                 / 2 * Rules.ACCELERATION;
                    double vs = (time - (Rules.MAX_VELOCITY - enemy.getSpeed())
                                 / Rules.ACCELERATION)
                                 * Rules.MAX_VELOCITY;
                    s = as + vs;
             } else {
                    s = 0.0;
             }
             double nextx = ex + s * Math.sin(enemy.getHeading());
             double nexty = ey + s * Math.cos(enemy.getHeading());
             distance = Point2D.distance(getX(), getY(), nextx, nexty);
             double t = Math.atan2(nexty - getY(), nextx - getX());
             return Utils.normalRelativeAngle((Math.PI / 2 - t - getGunHeadingRadians())
                           % (2 * Math.PI));
       }
       public void run() {
       
             dressing();
       
             severance();
             
             // setTurnRadarLeft(400);
             // execute();
             while (true) {
                    if (!discover) {
                           setTurnRadarLeftRadians(Math.PI * 2.1);
                           execute();
                    } else {
                           
                           movement();
                           
                           double fire = firePower();
                    
                           doScan();
                           
                           gun();
                           // if (getGunTurnRemaining() <= 0) {
                    
                           setFire(fire);
                           execute();
                           // }
                           
                           loseTarget();
                           execute();
                    }
             }
       }
       private void loseTarget() {
             if ((getTime() - time1) >= 4)
                    discover = false;
       }
}

运行界面:

运行结果:

Robocode 直线瞄准机器人相关推荐

  1. 发那科冲压直线搬运机器人_行业应用 | 直线七轴软件配置

    1. 直线七轴简介 发那科的标准产品直线七轴主要用于热冲压行业,安装后外观如下图所示,其常用机型为M-900iA/200P,本文将以该型号机器人为例介绍直线七轴的软件配置,其余机型配置请详询上海发那科 ...

  2. 各大电商纷纷瞄准机器人领域,备战双十一各显神功

    随着2017年天猫双11临近,9月20日,在国家邮政局的支持下,中国快递协会.菜鸟网络与各大快递企业在上海举行双11物流动员会,全行业共同筹划天猫双11物流准备事宜,迎接全新的世界纪录. 国家邮政局相 ...

  3. 发那科冲压直线搬运机器人_FANUC 交流伺服电机βis 系列

    特 征: β i系列是高可靠.高性价比的AC伺服系统,其性能非常适合用于机床的进给轴和主轴.通过电机代码信息和电机温度信息可进行方便的诊断维护,具有和ai同样的特征: 伺服电机旋转平稳.尺寸紧凑 高分 ...

  4. 机器人带陀螺仪走钢丝_走直线很难吗?陀螺仪表示,少了它机器人连直线都走不了...

    原标题:走直线很难吗?陀螺仪表示,少了它机器人连直线都走不了 机器人要想完成特定任务,就一定要有所动作,这个时候,必须掌握如何控制机器人走直线.曲线,从而使机器人移动到我们想做任务的地方. 机器人走直 ...

  5. robocode 机器人编码

    robocode 机器人编码 robocode robot code 机器人编码 battle 战斗 warning:the battle you are about to start is vrey ...

  6. robocode(1)

    摘自:http://www.iplaysoft.com/robocode.html Robocode(用游戏来学习Java技术还是用Java来玩游戏?) 用你的JAVA编程技术来玩游戏吧!不会JAVA ...

  7. 工业机器人电柜布线_协作并联,重新注解并联机器人

    加入高工机器人专业行业群(高工机器人CEO圈,高工机器人产业4群,移动机器人产业链群),加微信:13590381326,出示名片,仅限机器人及智能制造产业链上的核心零部件供应商.本体厂家.系统集成商. ...

  8. 机器人运动规划调研(pending)

    文章目录 前言 发展历程 通用运动规划方法 基于自由空间 Cfree几何构造的规划方法 可视图法 前言 阅读移动机器人运动规划研究综述心得 总结一下,机器人运动规划的发展历程,算法和思路. 搜索策略和 ...

  9. 特斯拉造人、小鹏骑马、小米遛狗,准车企们为何集体盯上了机器人生意?

    来源/雷锋网 ID/leiphone-sz 作者/卢洁萍 模仿特斯拉机器人的舞者 这是玩家们"不务正业"的营销巧合吗?还是确实暗指了行业的未来发展方向? 无人驾驶汽车还未真正上路, ...

  10. Robocode教程4——Robocode的游戏物理

    摘自:http://site.douban.com/widget/notes/7736245/note/210261658/ Robocode/游戏物理 现在我们来了解Robocode的一些物理参数. ...

最新文章

  1. 为什么对高斯分布的方差的极大似然估计是有偏的?
  2. 【怎样写代码】小技巧 -- 关于方法中修饰形参的关键词
  3. SVN Git 设置忽略目录 大全
  4. android data binding jetpack III 绑定一个方法
  5. Python字典:字典操作
  6. MySQL调优(四):MySQL索引优化实现细节
  7. 安卓开发之探秘蓝牙隐藏API
  8. spring(5)构建 spring web 应用程序
  9. Android Studio如何减小APK体积
  10. python 3d绘图库_python – 用于科学3d绘图的Mayavi的替代品
  11. CAS项目部署和基础操作
  12. redis aof和rdb区别
  13. java数据类型之间的转换_Java基本类型之间的转换
  14. 工具栏(UIToolbar)
  15. Windows Embedded Standard 7 帮零售业快速抢占市场
  16. 教你如何使用for循环来做一些小图案
  17. Java实现简易四则运算器
  18. 兼容性和浏览器hack
  19. 计算机专业考研难度排名?
  20. agv系统介绍_智能自动化物流系统AGV基础知识(完整介绍)

热门文章

  1. 【Axure】Axure RP 9 下载、短期试用破解安装和汉化步骤 —— 可供安装参考,短期试用,目前授权码已逐渐失效
  2. vue json 编辑组件_内置为Vue组件的Visual JSON编辑器
  3. 近世代数——Part1 整数和等价关系
  4. JS 校验车牌号码(全)
  5. 如何将桌面上的计算机图表隐藏,怎么把电脑桌面隐藏图标弄出来怎么办
  6. CentOS配置国内(阿里云)镜像加速器
  7. Go语言实战抽奖系统
  8. vivado linux使用教程,Vivado2017.4下载|Xilinx Vivado 2017.4 最新版(含使用教程)下载...
  9. 谷歌浏览器一直显示弹框登陆代理解决方法
  10. 锤子手机T2发布会PPT模板