Robocode教程7——雷达锁定

article/2025/6/22 16:37:48

在这次教程中,我们要写这样一个代码,它将让敌人逃不出我们的眼睛。雷达锁定是一个高效战斗机器人的基础,因为robot只有执行onScannedRobot方法,我们才能够获取敌人的信息,而onScannedRobot方法只有在我们的雷达扫描到敌人之后才会被调用,当然,调用的过程是自动的。

雷达是以机器人为圆心的一条射线,为了更直观,我们最好打开雷达图形显示,方法是:

进入robocode,打开Options-> Preferences->viewoptions,勾选Visible Scan Arcs

 

还记得我们的Enemy类吗?它在我们的这个机器人中有着至关重要的作用。所以如果不太熟悉class Enemy的话还是先去看看吧。

Enemy类中有一个direction变量,它的值为:

directionbearingRadian+ me.getHeadingRadians();

如这张图所示,弄懂了direction变量,雷达锁定就很简单了。

雷达的扫描实际上是一条线,当扫描线扫描到目标时,触发onScannedRobot事件,更新当前数据,包括direction。当程序执行到onScannedRobot内的代码时,雷达扫描线的角度getRadarHeadingRadians()已经和direction有所偏离。为了锁定目标,我们可以把雷达往反方向扫描。因为雷达旋转很快,而且getRadarHeadingRadians()direction的偏移量不大,机器人是有一定大小的。于是扫描线在目标身上来回扫动,实现了雷达锁定。

 

public voidonScannedRobot(ScannedRobotEvent e) {

       enemy.update(e,this);

       doubleOffset = rectifyenemy.direction-getRadarHeadingRadians() );

     setTurnRadarRightRadians( Offset * 1.5);

}

这是我们的onScannedRobot方法,enemy.updata(e,this);是调用我们的enemy对象里面的方法,更新敌人信息,当然,忘了一点,在这之前,我们需要生成一个enemy对象,具体方法为:

Enemy enemy = new Enemy();

这里我们还要解释一下rectify方法,它的作用是对角度进行修正,因为direction减去我们雷达的朝向,有可能会大于180度或者小于-180度,比如当大于180度时,我们所需要转动的角度并不需要那么大,只需方向转一个角度就可以了。这个rectify方法很简单,当在后面应用很多。它的代码为:

   public  double rectify ( doubleangle )

   {

        if ( angle < -Math.PI )

            angle += 2*Math.PI;

        if ( angle > Math.PI )

            angle -= 2*Math.PI;

        return angle;

}

在代码中,enemy.direction -getRadarHeadingRadians()是雷达所要旋转的偏移量。假设之前雷达顺时针扫描,那么enemy.direction略小于getRadarHeadingRadians(),为负。经rectify()方法修正后即为需要转动的值。然后用setTurnRadarRightRadians旋转雷达,旋转度数为偏移的1.5倍,因为RadarOffset为负,故反方向扫描,保证无论目标

如何移动,扫描线始终在目标身上。上面的1.5可以改成23等数。当你在Options中打开了Visible Scan Arcs选项后,就可以看到绿色的扇形,倍数为1.5的时候,类似一条线,而倍数为23的时候就可以看到像是一个扇形。

另外我们还要说一下另外两段代码:

       setAdjustGunForRobotTurn( true );

       setAdjustRadarForGunTurn( true );

它们的作用是使雷达、大炮、车身运动独立,具体参考API手册。

 

到这里我们雷达扫描的代码就完成了,运行试试我们的“观察者号”吧!!

 

附:观察者号完整代码:

 

package cm;

import java.awt.*;

import robocode.*; 

 

public class ObserverRobo  extends AdvancedRobot

{

   Enemy enemynewEnemy();

   public static double PI = Math.PI;

       

   public void run()

   {

      setAdjustGunForRobotTurn(true);

        setAdjustRadarForGunTurn( true );

        this.setColors(Color.red, Color.blue, Color.yellow, Color.black, Color.green);

       

      while(true){

         if(enemy.name == null){

            setTurnRadarRightRadians(2*PI);

            execute();

         }

         else{

            execute();

         }

      }

   }

       

   public void onScannedRobot(ScannedRobotEvent e)

   {

      enemy.update(e,this);

        double Offset = rectify( enemy.direction -getRadarHeadingRadians() );

        setTurnRadarRightRadians( Offset *1.5);

   }

 //角度修正方法,重要

   public  double rectify ( doubleangle )

   {

        if ( angle < -Math.PI )

            angle += 2*Math.PI;

        if ( angle > Math.PI )

            angle -= 2*Math.PI;

        return angle;

   }

   public class Enemy {

      public double x,y;

      public String name = null;

      public double headingRadian = 0.0D;

        public double bearingRadian = 0.0D;

        public double distance = 1000D;

        public double direction = 0.0D;

        public double velocity = 0.0D;

        public double prevHeadingRadian = 0.0D;

        public double energy = 100.0D;

       

       

        public void update(ScannedRobotEvent e,AdvancedRobotme){

          name = e.getName();

          headingRadian =e.getHeadingRadians();

          bearingRadian = e.getBearingRadians();

          this.energy = e.getEnergy();

          this.velocity = e.getVelocity();

          this.distance = e.getDistance();

          direction = bearingRadian +me.getHeadingRadians();

          x = me.getX() + Math.sindirection ) * distance;

          y=  me.getY() + Math.cosdirection ) * distance;     

        }

   }

}


http://chatgpt.dhexx.cn/article/aQwhOlKs.shtml

相关文章

robocode 安装 使用

记录一下 环境&#xff1a; Windows 7 64 JDK 1.8.0_131 一、安装 1、下载 https://robocode.sourceforge.io/ 当前最新版本&#xff1a;robocode-1.9.3.6-setup.jar 2、安装 双击 robocode-1.9.3.6-setup.jar 默认安装在C盘&#xff0c;并创建桌面快捷方式&#xff1b…

robocode java_IBM Robocode Java学习利器(1)Robocode 入门

编程肯定要学语言&#xff0c;相信很多人都会选java,无论什么书千篇一律都是从语法讲起&#xff0c;语法的枯燥反正我是深有体会的&#xff0c;但不先学语法还能学什么&#xff1f;编程的成就感来源于能做出什么东西&#xff0c;能实现什么&#xff0c;在没有做出实际的东西之前…

智能机器人编程游戏robocode的运行代码简析

智能机器人编程游戏robocode的运行代码简析金庆2007.6.1阅读robocode1.3的源代码&#xff0c;查看运行的原理。 &#xff08;转载请注明来源于 金庆的专栏&#xff09; 主线程Battle.run()-------------------主线程是Battle.run(), 循环进行多局的较量。每一局初始化后&…

Robocode

原文地址&#xff1a;Robocode 作者&#xff1a;麦麦和阿纳内 什么是Robocode? 其实我对机器人一直很感兴趣。我记得在我还是初中的时候&#xff0c;就知道 AplleⅡ上有一个程序&#xff0c;用它来编写简单的机器人程序&#xff0c;然后相互作战。当时自己还完全不懂编程&…

教你玩Robocode(1)

最近在上网时发现了一个叫做Robocode的游戏。最近我已经对它上瘾了。Robocode官方网站上对Robocode的介绍: Robocode is a programming game, where the goal is to develop a robot battle tank to battle against other tanks in Java or .NET. The robot battles are runni…

Robocode:基础知识及入门示例

文章目录 参考定义坐标系简单的API可Overwrite的方法一个简单示例 参考 百度文库-Robocode 定义 机器人&#xff1a;一些可以旋转、移动、射击、侦测的小型坦克。 机器人的底盘、火炮和雷达系统都可以独立运动&#xff0c;也可以相互“锁定”&#xff0c;一起移动。换句话说…

robocode 相关的总结

基础知识 1. heading 角度系 如图所示&#xff0c;所谓heading角&#xff0c;即从Y轴出发&#xff0c;然后顺时针绕回Y轴的这么个角度区间&#xff0c;取值范围&#xff1a; [0,360] 2. bearing角度系 所谓bearing 角&#xff0c;即从Y轴顺、逆时针出发&#xff0c;绕半圈回到…

世界robocode机器人的四大运动方式分析

摘要&#xff1a;前言Robocode在短短的时间内风靡全球,全世界的robocode爱好者设计出了大量的优秀智能机器人,他们都拥有各自的运动方式,有的很轻易被击中,有的却很难射击。设计一个好的运动方式是优秀robocode机器人取胜的要害。上届世界中级组冠军Fermat就是靠他让敌人难以琢…

Robocode教程1——安装、运行、配置

Robocode 的安装 系统安装最小环境要求&#xff1a; CPU:Pentium2/400MHz以上 内存:64MB以上 硬盘&#xff1a;10M以上 对硬件要求也不是完全绝对的&#xff0c;你用小的机器配置&#xff0c;带来的是比较慢的运行速度。当然具备以上硬件条件后&#xff0c;还要具有Java运行环…

笔记:Istio 组件 基础概念学习

文章目录 1. Istio是什么&#xff1f;1.1 读音1.2 简介1.3 服务网格是什么&#xff1f;1.4 为什么使用Isito&#xff1f;1.5 Istio 是如何诞生的?1.6 为什么我想用 ISTIO&#xff1f;1.7 目前Istio支持哪些部署环境&#xff1f;1.8 架构1.8.1 组件1.8.1.1 Envoy1.8.1.2 Pilot1…

Notes Sixth day-渗透攻击-红队-打入内网

** Notes Sixth day-渗透攻击-红队-打入内网(dayu) ** 作者&#xff1a;大余 时间&#xff1a;2020-09-22 请注意&#xff1a;对于所有笔记中复现的这些终端或者服务器&#xff0c;都是自行搭建的环境进行渗透的。我将使用Kali Linux作为此次学习的攻击者机器。这里使用的技…

Notes Ninth Day-渗透攻击-红队-打入内网

** Notes Ninth Day-渗透攻击-红队-打入内网(dayu) ** 作者&#xff1a;大余 时间&#xff1a;2020-09-25 请注意&#xff1a;对于所有笔记中复现的这些终端或者服务器&#xff0c;都是自行搭建的环境进行渗透的。我将使用Kali Linux作为此次学习的攻击者机器。这里使用的技…

Notes Fifth Day-渗透攻击-红队-信息收集

** Notes first day-渗透攻击-红队-信息收集(dayu) ** 作者&#xff1a;大余 时间&#xff1a;2020-09-20 请注意&#xff1a;对于所有笔记中复现的这些终端或者服务器&#xff0c;都是自行搭建的环境进行渗透的。我将使用Kali Linux作为此次学习的攻击者机器。这里使用的技…

Notes Fifteenth Day-渗透攻击-红队-内部信息搜集

** Notes Fifteenth Day-渗透攻击-红队-内部信息搜集(dayu) ** 作者&#xff1a;大余 时间&#xff1a;2020-10-1 请注意&#xff1a;对于所有笔记中复现的这些终端或者服务器&#xff0c;都是自行搭建的环境进行渗透的。我将使用Kali Linux作为此次学习的攻击者机器。这里…

多个容器一起打包_容器快速入门完全指南

介 绍 容器&#xff0c;以及Docker和Kubernetes之类的容器技术已经日益成为许多开发人员工具包中常见的工具。容器化的核心目标是提供一种更好的方式&#xff0c;以可预测和便于管理的方式在不同的环境中创建、打包以及部署软件。 在本文中&#xff0c;我们将一窥什么是容器&am…

项目经验123

DDDRPC架构 DDD分层架构介绍 DDD&#xff08;Domain-Driven Design 领域驱动设计&#xff09;&#xff0c;目的是对软件所涉及到的领域进行建模&#xff0c;以应对系统规模过大时引起的软件复杂性的问题。开发团队和领域专家一起通过 通用语言(Ubiquitous Language)去理解和消…

区块链详解

一、比特币简介 区块链&#xff08;Blockchain&#xff09;技术源于比特币。在比特币中&#xff0c;为了保证每笔交易可信并不可篡改&#xff0c;中本聪发明了区块链&#xff0c;它通过后一个区块对前一个区块的引用&#xff0c;并以加密技术保证了区块链不可修改。 随着比特…

网络安全面试题目及详解

获取目标站点的绝对路径 如果是iis系统,尝试对参数进行恶意传值,使其出现报错页面对目标网站进行js代码审计,查看是否存在信息泄露出站点的绝对路径使用字典猜解目标站点的绝对路径如果目标是thinkphp框架,尝试访问无效的路径,或者对参数进行而已传值使其报错phpinfo页面泄露站…

云计算基础教程(第2版)笔记——基础篇与技术篇介绍

文章目录 前言 第一篇 基础篇 一 绪论 1.1 云计算的概念以及特征 1.1.1云计算的基本概念 1.1.2云计算的基本特征 1.2 云计算发展简史 1.3 三种业务模式介绍 1. 基础设施即服务&#xff08;IaaS&#xff09; 2. 平台即服务&#xff08;PaaS&#xff09; 3. 软…

2023年网络安全面试题(渗透测试):详细答案解析与最佳实践分享

如果在数据来源和网络分享方面存在侵权问题&#xff0c;请立即联系我以删除相关内容。 一、一句话木马 1、基本原理 通过利用存在文件上传漏洞的目标网站&#xff0c;将恶意的一行代码或脚本&#xff08;通常是PHP语言&#xff09;上传到目标服务器上&#xff0c;从而实现对…