java编写机器人_用JAVA编写自己的机器人一起“厮杀”

2023-11-14

什么是Robocode?

最近我在阅读一个关于极限编程(XP)的邮件列表,有人提议为对学习更多的XP方法学知识感兴趣的开发人员构建一个工作间。这位作者还建议,把一群人凑到一起,分成小组研究该方法学。 然后要有一个经验丰富的XP教练对工作间进行管理,帮助参加者理解其原理。

而建议各小组采用的项目就是创建Robocode机器人。

我停下来,把这段话重新看了一遍。 其实我对机器人一直很感兴趣。在我还是个孩子是时候,我记得Aplle Ⅱ上有一个程序,我们用它来编写简单的机器人程序,然后相互作战。

Robocode就是这样一个东西,但是更好一些。它是一个基于Java的机器人作战游戏。 其代码的编写和建模都不错,玩起来也很有趣。

如果你阅读这个时事通讯比较久的话,你可能会问你自己“他会Java吗?”。是的,我会。虽然我常常抱怨Java,但我并非真正讨厌Java这一语

言。我所讨厌的只是该语言与生俱来的平台和可升级性问题。

我总认为,作为一种语言,Java是目前最优越的轻量级的C++,这种想法直到我发现C#之后才改变,而这又是另外一个故事了。

Robocode的API

Robocode是由IBM的Alphaworks项目成员Matthew Nelson编写的。从第一个版本开始,Matthew

已对该软件的API做了相当多的改进,我以为该软件为机器人的编写提供了一套完美的框架。

用于创建机器人的基类称作Robot。你的机器人都继承自这个类。 Robot类提供了所有与游戏进行交互所需的方法函数。

在细究API之前,让我们先来了解一些术语。机器人基本上是一些小型的坦克。这些坦克可以旋转,向前或向后移动。它们的顶部有一个用于射击的火炮。

在火炮上面还有一个雷达系统,用于侦测其它机器人。机器人的底盘、火炮和雷达系统都可以独立运动,也可以相互“锁定”,一起移动。换句话说,如果将雷达向

下锁定,那么它将随火炮一起移动;如果火炮向下锁定,它将随机器人的底盘一起移动。有意思吧?

下面是一些你在编写机器人之初用的最多的方法函数:

ahead(), back() ——向前和向后移动

fire() ——开火

setAdjustGunForRobotTurn() —— 控制火炮是否向下锁定

setAdjustRadarForGunTurn() ——控制雷达是否向下锁定

turnRight(), turnLeft() —— 实现机器人的旋转

turnGunRight(), turnGunLeft() —— 旋转火炮

turnRadarLeft(), turnRadarRight() - 旋转雷达反射镜

当然,这并不是全部的API,但却是你创建第一个机器人所需的最重要的方法。到现在为止,我们仅仅讨论了你可以触发的动作而已。

我们还未讨论如何去发现你的机器人周围所发生的事。Robot类提供了多个事件,你可以利用这些事件来判断你的机器人是否用雷达扫描到了其它机器人,是否

被击中,是否与另外一个机器人向撞以及是否与墙向撞等。你可以覆盖下列任一方法函数来为你的机器人提供事件处理函数。

onHitByBullet() —— 当你的机器人被击中时

onHitRobot() ——当你的机器人与其它机器人向撞时

onHitWall() —— 当你的机器人撞到墙上时

onScannedRobot() ——当用雷达扫描到其它机器人时

通过上面谈到的简单的事件和动作,可以编写出我们的第一个机器人。(可从Robocode附带的文档中获得完整的API。)

编写你的第一个机器人

准备好了吗?启动Robocode,调出Robot编辑器。(实际上,我并不使用Robocode自带的编辑器,这里用只是为了解释起来容易一些。)

要创建机器人,你可以选择File菜单的New Robot命令。这时,系统会要求你输入机器人的名称。你可以输入SimpleRobot并点击OK按钮。然后,你需要输入一个package名,Robocode建议使用

姓名的首字母缩写,不过我们在这里使用“newsletter”。之后,会打开一个包含新机器人初始代码的窗口。

花一点时间阅读一下这些自动生成的代码。 这个机器人并非世界上最聪明的机器人,但是它却对如何组装一个Robocode机器人作了很好的演示。

我们的机器人中定义的第一个方法是public void run()。这是机器人的心脏所在。游戏引擎最初启动之时将调用这个方法。一般,你可以用一个无穷的While循环来定义机器人的动作。

机器人SimpleRobot中的while循环做四件事情:

ahead(100); 向前移动100个象素

turnGunRight(360); 将火炮向右旋转360度

back(100); 向后移动100个象素

turnGunRight(360); 将火炮向右旋转360度

这些命令简单的说就是“向前移动100个象素并四周查看一番,再后退100象素,四周查看一番。然后,不断重复”。

注意我们从未明确执行一个雷达扫描动作。那是因为默认情况下,雷达反射镜与火炮一起移动,一直处于扫描状态中。所以,转动火炮可以实现雷达的扫描。

当雷达侦测到目标后,会调用我们的机器人中定义的第二个方法函数public void onSannedRobot(...)。

这个事件处理函数也不做什么事情。只执行“射击”动作。 由于雷达与火炮的方向始终保持一致,所以这个函数被调用时,我们应该正好瞄准了目标。

唯一的另一个方法是onHitByBullet事件处理函数。这个函数在我们被其它机器人击中时调用。代码的作用是旋转机器人与子弹来向成90度角,这样,当我们前后移动时,就可避开子弹第二次射来的方向。

保存并选择compile命令编译你的机器人。因为我们没有对代码做任何改动,所以应该不会有任何错误。

同其它机器人决斗

你的第一场战役

你的机器人已经准备就绪,是开战的时候了!Robocode附带了大量可用来举行战斗的样本机器人,Target是其中最简单的一个。

假设你想在Target和我们刚才创建的机器人之间开展一场战斗。 那么关闭Robot编辑器,在主窗口中选择Battle菜单的New命令。

在New

Battle对话框中找到“newsletter.SimpleRobot”并点击Add按钮。然后找到“sample.Target”,再一次点击

Add按钮。对话框里还有其它选项,不过我们先不管。点击finish开始战斗。

几秒钟后,你将会看到两个机器人出现在屏幕上。等待的时间主要取决于电脑的速度。很快,战斗开始了。首先,我们的机器人向前移动一小段距离,然后将

火炮旋转一周。当它发现Target时,就会向其射击。几次被击中后,Target就会避开。

我们的机器人向后移动并进行扫描,直到发现Target为止。然后继续射击。

Target不会射击,所以我们将最终获得这场战斗的胜利(输给不会射击的机器人会让我很懊恼)。也因此,我们的onHitByBullet事件应该永远不会被调用。战斗结束后,可以再试试与其它样本机器人作战。 不过别指望用这个简单机器人把它们都打败。

比赛

我不推荐一开始就加入比赛,但是最终你会认为,你的机器人足够的好了,可以加入比赛了。

有大量不同的团体组织比赛。你可以在网上找到他们。如果你不喜欢参加公开的比赛,也可以找几个朋友组织自己的比赛。

比赛的形式主要有两种。混合比赛是两个以上的机器人进行战斗;一对一比赛就是一个机器人对付另一个机器人,就象马上枪术比赛一样。

通常,混合比赛战斗多并且赢家通吃,而一对一的比赛战斗较少,要么一方胜出,要么两败俱伤。

高级机器人

Robocode

API还定义了另一个称做AdvancedRobot的基类。AdvancedRobot与Robot的不同表现在许多方面。首先,你可以选择调用无阻碍

(non-blocking)运动。当你调用ahead(100)时,机器人就立即移动100个象素。该动作完成后才执行下一行代码。这样一来就无法实现

曲线运动了。不过现在有了ahead()和back()函数的无阻碍版本——即setAhead()和setBack(),能够立即返回执行。可以把它们

想象成向堆栈里加入一条指令,而堆栈里的指令将不会被执行,除非你进行一个类似fire()的函数调用

——这将引起堆栈中的指令的执行。另外有一个叫做execute()方法函数可以明确的运行堆栈指令。

基于AdvanceRobot的机器人具有更加高级的智商。不再是简单的“移动,扫描,再移动,再扫描”。 你做出的机器人可以对整个战场进行侦察,会思考下一步行动,然后执行合适的指令。这种“侦察、思考、行动”的模式能够使你的机器人具有适应性和学习性。

举个例子来说,如果你的机器人能连续不断的侦察整个战场并记录其它机器人的位置和方向,那么你就可以通过模式分析来获得某个特定机器人的移动方式。

如果敌方以可预知的方式向左或向右躲避的话,那么你就可以对此进行预测,向敌人将要出现的地方射击。这样威力会更加强大,当然也更加复杂。

结论

这篇文章还运不足以成为如何编写最优机器人的完全指南,但是应该能帮助你入门。当你写了几个简单的机器人后,就会找到一些新的感觉。也许你会参加比赛,或者从互联网上下载其它的机器人。这样,你就有机会看到别人是如何编写机器人的。

Robocode不仅是一个游戏,也是一个有趣的磨练编程技巧的方法。你可以实验不同的设计和模式,可以用JUnit创建测试包。实际上,这个游戏的限制只在于你的想象力。

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

java编写机器人_用JAVA编写自己的机器人一起“厮杀” 的相关文章

  • Leetcode 124. 二叉树中的最大路径和

    题目内容 给定一个非空二叉树 返回其最大路径和 本题中 路径被定义为一条从树中任意节点出发 沿父节点 子节点连接 达到任意节点的序列 该路径至少包含一个节点 且不一定经过根节点 示例 1 输入 1 2 3 1 2 3 输出 6 示例 2 输
  • 使用 js 实现 贷款计算器功能

    table tr th Enter Loan Data th td td th Loan Balance Interest Payments th tr tr td Amount of Loan td tr table
  • Java NIO介绍(二)————无堵塞io和Selector简单介绍

    无堵塞IO介绍 既然NIO相比于原来的IO在读取速度上其实并没有太大区别 因为NIO出来后 IO的低层已经以NIO为基础重新实现了 那么NIO的优点是什么呢 NIO是一种同步非阻塞的I O模型 也是I O多路复用的基础 而且已经被越来越多地
  • 【我的Java笔记】List集合中set()方法的使用

    方法 E set int index E element 首先看一下API里对List集合中的set 方法的描述 例 使用List集合中的set 方法进行冒泡排序 import java util ArrayList public clas
  • WebDriverException unexpectedly exited. Status code was: 2

    raise WebDriverException selenium common exceptions WebDriverException Message Service D Projects test geckodriver exe u
  • 计数器实现七分频

    七分频 即将输入信号的频率变为原来的七分之一 本文用计数器实现输入信号的七分频 一 画出七分频的时序逻辑 实现原理 图中用到了两个计数器 一个上升沿触发一个下降沿触发 且每当计数器从0计数到6时 复位 中间信号sig1 sig2分别在cnt
  • xhtml2pdf如何支持中文

    这段时间在做一个图片PDF的项目 需要把网页转换成PDF 找到了python的xhtml2pdf这个库 个方面都满意 只是对中文的支持不好 html上的中文转换成PDF后都成了乱码 貌似中文网站都没有找到合适的解决办法 只能求助于万能的go
  • 传统语音增强——基本的维纳滤波语音降噪算法

    一 维纳滤波的基本原理 基本维纳滤波就是用来解决从噪声中提取信号问题的一种过滤 或滤波 方法 它基于平稳随机过程模型 且假设退化模型为线性空间不变系统的 实际上这种线性滤波问题 可以看成是一种估计问题或一种线性估计问题 基本的维纳滤波是根据
  • error LNK2001: 无法解析的外部符号 “void __cdecl cv::cvtColor

    c 调用opencv时报错了 error LNK2001 无法解析的外部符号 void cdecl cv cvtColor 现在发现有两个可能的原因 原因1 没有添加lib库 需要添加lib库 VC 目录 包含目录 VC 目录 库目录 链接
  • 网络安全入门学习练手——CS伪装钓鱼网站

    文章目录 一 实验环境 二 使用工具和目标 三 开始复现 1 启动Cobalt Strike服务器端 打开Cobalt Strike客户端 2 设置监听器 3 网站克隆 4 在受害者端输入克隆网站对应的ip 5 测试 四 拓展 让钓鱼网址挂
  • 记录一次mac电脑安装git并在idea中使用的问题

    一 安装Git 下载地址 https sourceforge net projects git osx installer 点击下载最新版就可以了 下载速度很快的 下载完直接打开 默认安装即可 安装完成直接在命令行用root用户执行 git
  • L1-020 帅到没朋友(java)

    1 题目详情 当芸芸众生忙着在朋友圈中发照片的时候 总有一些人因为太帅而没有朋友 本题就要求你找出那些帅到没有朋友的人 输入格式 输入第一行给出一个正整数N 100 是已知朋友圈的个数 随后N行 每行首先给出一个正整数K 1000 为朋友圈
  • gcc make makefile 的基本介绍

    一 gcc 1 在window操作系统下 编译工具用集成开发环境 在Linux操作系统下没有很好的集成环境 用的编译器是gcc 2 程序的编译分为四个阶段 由 c到可执行程序 1 预编译 2 编译 3 汇编 4 链接 3 编译程序 1 一步
  • PTAMM阅读笔记之SLAM概述(五)

    1 同时定位与地图创建允许机器人在未知环境中 依靠自身所带的传感器递增式地创建环境地图 并同时给出机器人所在位置 2 移动机器人的定位有两种类型 全局定位 绝对定位 Global Absolute Localization 和位置跟踪 Po
  • Mybatis3快速上手(详细)

    因为编辑器不互通 所以可以直接打开有道云看 有道云链接 Mybatis的初入 创建Maven项目工程 因为Mybatis属于数据访问层的操作 我们需要引入相关依赖 mysql mysql connector java 8 0 29 org
  • HashMap实现原理及扩容机制详解

    文章目录 一 HashMap基础 二 红黑树基础 三 HashMap实现原理 1 Node和Node链 2 拉链法 3 关于Node数组 table 4 散列算法 5 HashMap和红黑树 6 关于TreeNode 转自 这篇更详细 ht
  • UNext:基于 MLP 的快速医学图像分割网络

    UNext 会议分析 摘要 贡献 方法 整体框架 1 Shifted MLP 2 Tokenized MLP Stage 实验 1 对比实验 2 消融实验 2 1 模块的消融实验 2 2 通道数的探索 可借鉴参考 会议分析 期刊 会议 名
  • 前端常见难点面试题

    1 跨域 同源策略 同源策略 同源策略是浏览器的一个安全功能 不同源的客户端脚本在没有明确授权的情况下 不能读写对方资源 同源 就是协议 域名和端口号相同 降域 document domain 同源策略认为域和子域属于不同的域 如 chil
  • 《代码走查》杂记

    代码走查 一 定义 1 代码走查 code walkthrough 是一个开发人员与架构师集中与讨论代码的过程 代码走查的目的交换有关代码是如何书写的思路 并建立一个对代码的标准集体阐述 在代码走查的过程中 开发人员都应该有机会向其他人来阐

随机推荐

  • OpenGL: 视图矩阵的推导

    OpenGL 视图矩阵的推导 2014年03月04日 11 08 45 阅读数 6525 把物体从世界坐标系转化到视点坐标系的矩阵称为视图矩阵 下面我们先看下opengl视图矩阵的推导过程 假设视点或camera的局部坐标系为UVN UVN
  • webpack中的代码分离

    Tip 本指南继续沿用 起步 中的示例代码 请确保你已熟悉这些指南中提供的示例以及输出管理章节 代码分离是 webpack 中最引人注目的特性之一 此特性能够把代码分离到不同的 bundle 中 然后可以按需加载或并行加载这些文件 代码分离
  • Python 九九乘法表的7种实现方式

    Python 九九乘法表的7种实现方式 九九乘法表是初学者学习编程的必要练手题目之一 因此各种语言都有对应的实现方式 而 Python 也不例外 在 Python 中 我们可以使用多种方式来生成一个简单的九九乘法表 实现方式一 双重循环 f
  • 远程debug java_远程Debug Java进程的方法

    远程debug的意思是启动一个Java进程 启动一个debugger进程 将两者连接起来 利用debugger来debug Java进程 事实上目前所有的IDE的debug功能都是通过远程debug方式来实现的 它们都利用了一个叫做JDPA
  • 【行人重识别】Unsupervised Salience Learning for Person Re-identification

    Abstract 人眼可以基于 一些较小的显着区域来识别人的身份 然而 当使用现有方法计算图像的相似度时 通常会隐藏这种有价值的显着信息 此外 许多现有的方法学习区别性特征并以监督的方式处理急剧的视点变化 并要求为不同的摄像机视图对标注新的
  • QSqlQueryModle使用过滤器来完成数据库数据筛选

    原型 void QSqlTableModel setFilter const QString filter 注意 如果模型已从数据库中填充数据 则模型将其与新滤波器重新选择 否则 将在调用下一次select 中应用过滤器 model的sel
  • 15.服务数据的定义与使用

    学习视频 https www bilibili com video BV1zt411G7Vn p 15 目标 服务数据的自定义 客户端发布显示个人信息的请求 服务端处理请求及反馈应答 一 自定义服务数据 1 定义srv文件 mkdir ca
  • Python 判断None的三种方法

    1 if x is None 2 if not x 3 if not x is None 在Python 中 None False 空字符串 空列表 空元组 其实都相当于False 如果x为空列表 y为None 如果你做x is None的
  • 社区版pycharm官网下载安装教程

    1 官网下载安装包 官网地址 https www jetbrains com pycharm 选择所需版本 2 安装 安装前确认已完成python软件安装 建议不要安装到C盘 路径不要出现中文 直接install 等待安装 3 配置 点击桌
  • PyQt中的多线程使用方法(以PySide6为例)

    在Qt中 开启多线程的方法有多种 总体分成QThread QObject QRunnable QtConcurrent三大类方法 而放到PyQt和PySide具体的使用中 使用方法可以说十分类似 一 继承QThread类及run方法 此方法
  • while it seems to fit format ‘yyyy-MM-dd‘T‘HH:mm:ss.SSSX‘

    一 报错信息如下 2023 04 11 18 52 47 534 WARN 21608 nio 9090 exec 1 w s m s DefaultHandlerExceptionResolver Resolved org springf
  • 浅析CV下的无人驾驶技术

    报告题目 浅析CV下的无人驾驶技术 1 概述 2006年 Geoffrey Hinton老爷子针对传统的神经网络算法训练速度慢 面对多层Hidden Layer严重出现过拟合的现状 提出了无监督预训练对权值进行初始化 有监督训练微调的解决方
  • 三国群英传霸业之王服务器维护,《三国群英传2网络版》掌上助手APP曝光,三国群英传霸业之王...

    列位从公能否还为本人错过逛戏勾当而感应懊末路 能否曾身正在外但始末心系三国 又能否苦于只能侃侃而谈却无法展现本人的 宏图霸业 为了让大师可以或许随时随地查看逛戏情况 领会逛戏资讯 我们将正在逛戏上线后推出掌上帮手 列位从公能否还为本人错过逛
  • 【C/C++】日常学习7

    1 输入 输出流操作 2 构造函数参数参数列表初始化 3 C 中类的前向声明以及和 include的区别 4 在函数后加const的意义 1 输入 输出流操作 读取字符串的不同操作 cin 遇到空格 回车符就停止读取 空格 回车符是分隔符
  • ❓“想要创业项目,但又不知道互联网上有哪些好的项目?”

    想创业 但不知道从哪里入手 5大互联网创业项目 一起来了解一下吧 在互联网时代 创业项目不再局限于传统的实体店铺 下面介绍的是互联网创业项目 希望可以给想要创业的你提供一些启示 1 电商平台 电商平台是最为常见的互联网创业项目 可以选择开设
  • 实现Vue高德地图多边形编辑器吸附功能

    前言 之前做的高德地图多边形编辑器吸附功能 最近出现不能编辑 在修改的过程中顺便记录一下 实现效果 安装 npm i amap amap jsapi loader save 核心代码
  • windows7 搭建 Spark 详细图解

    第一步 下载Spark exe 可执行程序 程序的下载地址 http www igniterealtime org downloads index jsp openfire 如果遇到spark 无法正在安装的情况 可以参考该文章 安装Spa
  • TensorFlow2.X结合OpenCV 实现手势识别

    TensorFlow2 X结合OpenCV 实现手势识别 使用Tensorflow 构建卷积神经网络 训练手势识别模型 使用opencv DNN 模块加载模型实时手势识别 效果如下 先显示下部分数据集图片 0到9的表示 感觉很怪 构建模型进
  • java List集合转Excel表格文档

    前阵子有朋友问我java将excel转成文档的方法 用此方法需要引入jxl包 而最近公司刚好有个需求需要将数据转成excel文档 所以我就写了一个工具类 将数据对象转成excel文档 考虑到可能要传入不同类型的对象集合 为了能配合我那个朋友
  • java编写机器人_用JAVA编写自己的机器人一起“厮杀”

    什么是Robocode 最近我在阅读一个关于极限编程 XP 的邮件列表 有人提议为对学习更多的XP方法学知识感兴趣的开发人员构建一个工作间 这位作者还建议 把一群人凑到一起 分成小组研究该方法学 然后要有一个经验丰富的XP教练对工作间进行管