`

Robocode中一个高效雷达的学习记录

阅读更多

Robocode中一个高效雷达的学习记录

还记的刚接触到Robocode的兴奋,为Robocode比赛准备的艰辛,为写出的第一个机器人而高兴万分,为这个丰富的Robocode世界而震撼不已

Robocode入门的门槛很低,但是要提高着实难度不小,这是我研究Robocode以来的一个不错的收获,作为告别Robocode的献礼,也为纪念我研究Robocode的日日夜夜留下点什么东西。

本雷达代码,提取自中国Robocode第一人,Wave技术的创始人iiley所写的Cigaret机器人中。

http://www.robochina.org,进入了解Robocode

http://sourceforge.net/projects/robocode/files/ 下载Robocode

首先我们来复习Robocode世界中两个很重要的角度系统

注意,我的描述是用度为单位,代码中全使用弧度为单位。

第一,   heading 角度系

 

如图所示,所谓heading角,即从Y轴出发,然后顺时针绕回Y轴的这么个角度区间,取值范围: [0,360]

第二,   bearing角度系

 

所谓bearing 角,即从Y轴顺、逆时针出发,绕半圈回到Y轴所形成的两个角度区间,取值范围:顺时针[0,180 ;逆时针[0,-180]

 

好的,我们已近复习了两角度系,下面我们来学习这个非常高效的雷达。

首先给出代码:

    public void onScannedRobot(ScannedRobotEvent e) {

       //注意 这里的计算都以弧度为单位

       double absBearing=0d;

       //雷达转动角度

       double radarTurnAngle=0d;

       //得到绝对角度差

    absBearing=robocode.util.Utils.normalRelativeAngle(e.getBearingRadians()+getHeadingRadians());

       //根据absBearing角算出Radar要调整的角度

       radarTurnAngle=Math.sin(absBearing - getRadarHeadingRadians());

       //转动雷达,注意是向右

       setTurnRadarRightRadians(radarTurnAngle);

    }

分析实例

 

 

//得到绝对角度差

    absBearing=robocode.util.Utils.normalRelativeAngle(e.getBearingRadians()+getHeadingRadians());

 

说明:

e.getBearingRadians(),如图中的∠FBC所示

是敌机(Enemy)与自己车头方向(你使用setAhead(正值)前进的方向即为车头方向,如BC箭头所示)所成的角,因为是以BCY轴的bearing角,所以这个角在这个例子中是个负值。

 

getHeadingRadians(),如图中∠ABC所示

是以自己的车头方向与屏幕垂直正上方为Y轴所成的heaing

 

absBearing=robocode.util.Utils.normalRelativeAngle(e.getBearingRadians()+getHeadingRadians());

所以absBearing即为FBA,即自己与敌机的连线,与Y轴所成的bearing角,取值范围为[-180,180)

 

//根据absBearing角算出Radar要调整的角度,进过sin运算,这个已经是个修正后的角度了radarTurnAngle=Math.sin(absBearing - getRadarHeadingRadians());

 

 

FBE=absBearing - getRadarHeadingRadians(),在这里计算出来为负值。即雷达需要转动的角度。

最后通过Math.sin(absBearing - getRadarHeadingRadians())进行角度修正得到最终值radarTurnAngle。这个修正很关键,原理可以参照sin曲线图

 

因为setTurnRadarRightRadians(radarTurnAngle)是向右旋转,所以若radarTurnAngle为负则雷达向左旋转。

 

总结

   有以上分析,我们不难得出雷达锁定目标所要转动的角度,由absBearinge.getRadarHeading()(雷达的heading角)来决定.

radarTurnAngle=Math.sin(absBearing-getRadarHeadingRadians());

所以类似的,我们如果想让炮管、车身对准敌机,那么我们就就只要将e.getRadarHeading替换成e.getGunHeading()e.getHeading()即可。

代码如下:

gunTurnAngle=Math.sin(absBearing-getGunHeadingRadians());

bodyTurnAngle=Math.sin(absBearing-getHeadingRadians());

 

 

应用实例:

所以我们可以写成这这样的一个机器人,你可以用它来对付Walls机器人

对,正如它的名字一样,它很疯!

 

 

import robocode.AdvancedRobot;

import robocode.ScannedRobotEvent;

/**

 * CrazyDog

 * @author lhx

 *

 */

public class CrazyDog extends AdvancedRobot {

    public void run(){

       setAdjustGunForRobotTurn(true);

        setAdjustRadarForGunTurn(true);

        while(true){

          turnRadarRightRadians(5); 

        }

    }

    @Override

    public void onScannedRobot(ScannedRobotEvent e) {

       //注意 这里的计算都以弧度为单位

       double absBearing=0d;

       //雷达转动角度

       double radarTurnAngle=0d;

       double gunTurnAngle=0d;

       double bodyTurnAngle=0d;

       //得到绝对角度差

    absBearing=robocode.util.Utils.normalRelativeAngle(e.getBearingRadians()+getHeadingRadians());

       //根据absBearing角算出Radar要调整的角度

       radarTurnAngle=Math.sin(absBearing - getRadarHeadingRadians());

       gunTurnAngle=Math.sin(absBearing - getGunHeadingRadians());

       bodyTurnAngle=Math.sin(absBearing - getHeadingRadians());

       //转动雷达,注意是向右

       setTurnRadarRightRadians(radarTurnAngle);

       //转动炮管

       setTurnGunRightRadians(gunTurnAngle);

       //转动身体

       setTurnRightRadians(bodyTurnAngle);

       //前进

        setAhead(e.getDistance());

       if(getGunHeat()<0.1)setFire(2);

    }

}

分享到:
评论

相关推荐

    robocode 经典学习笔记

    ### Robocode经典学习笔记知识点详解 #### 一、Robocode简介与环境搭建 **Robocode**是一款基于Java的编程游戏,玩家通过编写机器人程序来进行战斗。这款游戏不仅能够帮助程序员提高编程技能,还能够锻炼策略思维...

    robocode雷达锁定代码

    robocode坦克机器人编程雷达锁定原代码,即时可用

    robocode智能坦克代码

    Robocode 是一个基于Java的开源项目,它提供了一个平台,让用户可以编写自己的智能机器人进行对战,其中"智能坦克"是这个环境中的主要参赛者。这个压缩包文件名为"Fremat",很可能包含了作者用于2002年Robocode ...

    robocode用游戏学习java编程

    Robocode,全称为“Robot Battle Coding Game”,是一个基于Java编程的学习平台,专为教育和娱乐设计。通过Robocode,初学者可以学习到基础的编程概念,如控制结构、变量、函数,以及更高级的编程技巧,如多线程、...

    用游戏来学习C++技术(Robocode For C++)

    这个平台最初是用Java编写的,但随着技术的发展,C++版本的Robocode也逐渐被引入,为开发者提供了一个新的学习和实践C++技术的途径。在本篇中,我们将深入探讨如何使用C++版本的Robocode进行学习和开发。 首先,...

    基于Jess和机器学习的Robocode策略研究与实现

    基于Jess和机器学习的Robocode策略研究与实现

    robocode_the1990

    10. **学习价值**:Robocode 不仅是一个娱乐工具,也是学习编程、算法和策略思考的好平台。通过实际的编程和对抗,开发者可以提升编程技能,理解实时系统和多线程处理,以及锻炼问题解决能力。 总的来说,"robocode...

    robocode.rar 机器人游戏 java

    总的来说,Robocode不仅是一个娱乐性强的游戏,更是一个学习和实践编程技巧的理想平台。无论你是初学者还是经验丰富的程序员,都可以在Robocode的世界中找到挑战和乐趣。通过参与Robocode,你将深化对Java编程的理解...

    Robocode各种文档+1.8.3最新安装包

    这个压缩包包含了Robocode的各种文档和1.8.3版本的最新安装包,是学习和参与Robocode的理想资源集合。 首先,让我们详细了解一下Robocode的核心概念: 1. **Robocode环境**:Robocode提供了一个模拟战场,玩家通过...

    Robocode 基础坦克胜率还可以

    Robocode 是一个基于Java开发的开源机器人战斗模拟平台,它为初学者和高级开发者提供了一个有趣的方式来学习编程、算法和人工智能。在这个环境中,你可以编写自己的机器人,并让它们在虚拟战场上进行对战。"基础坦克...

    robocode攻略与源码

    Robocode是一种有趣的竞赛性编程,使用几行简单的代码,就能够让你创建一个活生生的机器人,一个真正的在屏幕上与其他机器人互相对抗的机器人。你可以看到它在屏幕上四处疾驰,碾碎一切挡道的东西。机器人配有雷达与...

    蓝杰IBM-robocode平台资料

    IBM-robocode是一个开源项目,它为开发者提供了一个教育性的编程环境,旨在教授基础的编程概念、算法设计和策略制定,同时也是一种有趣的方式来学习和实践计算机科学。 在压缩包中,我们看到几个关键文件和目录: ...

    Robocode最新API参考文档

    设计出高效的Robocode机器人需要理解战场动态、敌人行为模式、能量管理和战术策略。开发者可以通过参加在线比赛,与其他玩家的机器人对战,不断优化和调整自己的策略。同时,Robocode社区也提供了大量的示例代码和...

    Robocode

    游戏的核心是策略、算法优化以及对机器人行为的控制,这使得Robocode不仅是一种娱乐方式,也是一种学习编程、算法和人工智能的工具。 ### Robocode入门知识点详解 #### 1. 基础概念 - **Heading**:指机器人的...

    Robocode 深度剖析--作者:周磊

    Robocode提供了一个平台,让开发者通过编写机器人程序来进行虚拟战斗,借此学习编程、算法和策略设计。本文将主要围绕Robocode的包与类的特性、AI战术战略思想以及其实现代码展开详细讨论。 首先,我们要理解...

    坦克机器人战斗仿真引擎 Robocode源码

    总的来说,"坦克机器人战斗仿真引擎 Robocode源码"是一个寓教于乐的项目,既适合初学者了解和学习Java编程,也适合有经验的程序员探索人工智能和策略优化。通过参与Robocode,你可以提升编程技巧,锻炼逻辑思维,并...

    robocode-1.9.2.3

    Robocode是一种有趣的竞赛性编程,使用几行简单的代码,就能够让你创建一个活生生的机器人,一个真正的在屏幕上与其 他机器人互相对抗的机器人。你可以看到它在屏幕上四处疾驰,碾碎一切挡道的东西。机器人配有雷达...

    robocode平台(最新版)

    Robocode是一种有趣的竞赛性编程,使用几行简单的代码,就能够让你创建一个活生生的机器人,一个真正的在屏幕上与其他机器人互相对抗的机器人。你可以看到它在屏幕上四处疾驰,碾碎一切挡道的东西。机器人配有雷达与...

    robocode-1.8.1.0-src.zip

    这个"robocode-1.8.1.0-src.zip"压缩包包含了Robocode的源代码,为那些想要深入理解其内部机制、进行自定义扩展或者教学目的的用户提供了一个宝贵的学习资源。 首先,让我们了解一下Robocode的基本概念。Robocode是...

Global site tag (gtag.js) - Google Analytics