服务热线:13616026886

技术文档 欢迎使用技术文档,我们为你提供从新手到专业开发者的所有资源,你也可以通过它日益精进

位置:首页 > 技术文档 > JAVA > 新手入门 > 基础入门 > 查看文档

战斗仿真引擎学习 java 编程比以往更有趣


  有可能在闪躲炮弹和执行精确攻击的演练中学会继承、多态性、事件处理以及内部类这些内容吗?robocode 这个游戏即将为全世界的 java 开发者实现这个愿望,它把游戏风潮变成了教学工具,人们对它的上瘾程度令人吃惊。请跟随 sing li 一起拆解 robocode,同时着手建造属于自己的、定制的、小而精悍的战斗机器。
  robocode 是一个很容易使用的机器人战斗仿真器,可以在所有支持 java 2 的平台上运行。您创建一个机器人,把它放到战场上,然后让它同其他开发者们创建的机器人对手拼死战斗到底。robocode 里有一些预先做好的机器人对手让你入门,但一旦您不再需要它们,就可以把您自己创建的机器人加入到正在世界范围内形成的某个联盟里去和世界最强手对阵。
  
  每个 robocode 参加者都要利用 java 语言元素创建他或她的机器人,这样就使从初学者到高级黑客的广大开发者都可以参与这一娱乐活动。初级的 java 的开发者们可以学习一些基础知识:调用 api 代码、阅读 javadoc、继承、内部类、事件处理等等。高级开发者们可以在构建“最优品种”的软件机器人全球竞赛中提高他们的编程技巧。在本文中,我们将介绍 robocode,并指导您从构建您平生第一个 robocode 机器人开始征服世界。我们还将看一下迷人的“后台”机制,正是它使得 robocode 起作用。
  
  下载并安装 robocode
  robocode 是 mathew nelson 的智慧之作,他是 ibm internet 部门 advanced technology 的软件工程师。请首先访问 ibm alphaworks robocode 页面。在这个页面上,您可以找到 robocode 系统最新的可执行文件。这个分发包是一个自包含的安装文件,在下载该分发包之后,您就可以使用下面的命令行在您的系统上安装这个软件包(当然,我们假定您的机器上已经预安装了 java vm(jdk 1.3.x)):
  
  java -jar robocode-setup.jar
  
  在安装过程中,robocode 将问您是否要使用这个外部的 java vm 来编译机器人。您也可以选择使用作为 robocode 分发包一部分而提供的 jikes 编译器。
  
  安装完成后,您可以通过 shell 脚本(robocode.sh)、批处理文件(robocode.bat)或桌面上的图标来启动 robocode 系统。此时,战场将会出现。在此,您可以通过菜单调用 robot editor 和 compiler。
  
  robocode 系统组件
  当您激活 robocode 时,将看到两个相关的 gui 窗口,这两个窗口构成了 robocode 的 ide:
  
  战场
  robot editor
  图 1 展示了处于工作状态的战场和 robot editor。
  
  
图 1. robocode ide

  
 战斗仿真引擎学习 java 编程比以往更有趣(图一)

  战场是机器人之间进行战斗直至分出胜负的场地。主要的仿真引擎被置于其中,并且允许您在这里创建战斗、保存战斗以及打开新建的或现有的战斗。通过界面区域内的控件,您可以暂停或继续战斗、终止战斗、消灭任何机器人个体或获取任何机器人的统计数据。此外,您可以在此屏幕上激活 robot editor。
  
  robot editor 是一个定制的文本编辑器,它可以用于编辑生成机器人的 java 源文件。在它的菜单里集成了 java 编译器(用于编译机器人代码)以及定制的 robot 打包器。由 robot editor 创建并成功编译的所有机器人都会处于战场上一个部署就绪的位置。
  
  robocode 里的每个机器人都由一个或多个 java 类构成。这些类可以被压缩成一个 jar 包。为此,robocode 的最新版本提供了一个可以在战场 gui 窗口中激活的“robot packager”。
  
  对 robocode 机器人的详细分析
  在写这篇文章时,robocode 机器人是一个图形化的坦克。图 2 是一个典型的 robocode 机器人的图解。
  
  
图 2. 对 robocode 机器人的详细分析

  
 战斗仿真引擎学习 java 编程比以往更有趣(图二)

  请注意,机器人有一门可以旋转的炮,炮上面的雷达也是可以旋转的。机器人坦克车(vehicle)、炮(gun)以及雷达(radar)都可以单独旋转,也就是说,在任何时刻,机器人坦克车、炮以及雷达都可以转向不同的方向。缺省情况下,这些方向是一致的,都指向坦克车运动的方向。
  
  robot 命令
  robocode 机器人的命令集都收录在 robocode api javadoc 中。您将会发现这些命令都是 robocode.robot 类的公共方法。在这一部分,我们将分类讨论每个可用的命令。
  
  移动机器人、炮和雷达
  让我们从移动机器人及其装备的基本命令开始:
  
  turnright(double degree) 和 turnleft(double degree) 使机器人转过一个指定的角度。
  
  ahead(double distance) 和 back(double distance) 使机器人移动指定的像素点距离;这两个方法在机器人碰到墙或另外一个机器人时即告完成。
  
  turngunright(double degree) 和 turngunleft(double degree) 使炮可以独立于坦克车的方向转动。
  
  turnradarright(double degree) 和 turnradarleft(double degree) 使炮上面的雷达转动,转动的方向也独立于炮的方向(以及坦克车的方向)。
  这些命令都是在执行完毕后才把控制权交还给程序。此外,转动坦克车的时候,除非通过调用下列方法分别指明炮(和雷达)的方向,否则炮(和雷达)的指向也将移动。
  
  setadjustgunforrobotturn(boolean flag):如果 flag 被设置成 true,那么坦克车转动时,炮保持原来的方向。
  
  setadjustradarforrobotturn(boolean flag):如果 flag 被设置成 true,那么坦克车(和炮)转动时,雷达会保持原来的方向。
  
  setadjustradarforgunturn(boolean flag):如果 flag 被设置成 true,那么炮转动时,雷达会保持原来的方向。而且,它执行的动作如同调用了 setadjustradarforrobotturn(true)。
  获取关于机器人的信息
  有许多方法可以得到关于机器人的信息。下面简单列举了常用的方法调用:
  
  getx() 和 gety() 可以捕捉到机器人当前的坐标。
  
  getheading()、getgunheading() 和 getradarheading() 可以得出坦克车、炮或雷达当前的方向,该方向是以角度表示的。
  
  getbattlefieldwidth() 和 getbattlefieldheight() 可以得到当前这一回合的战场尺寸。
  射击命令
  一旦您掌握了移动机器人以及相关的武器装备的方法,您就该考虑射击和控制损害的任务了。每个机器人在开始时都有一个缺省的“能量级别”,当它的能量级别减小到零的时候,我们就认为这个机器人已经被消灭了。射击的时候,机器人最多可以用掉三个能量单位。提供给炮弹的能量越多,对目标机器人所造成的损害也就越大。 fire(double power) 和 firebullet(double power) 用来发射指定能量(火力)的炮弹。调用的 firebullet() 版本返回 robocode.bullet 对象的一个引用,该引用可以用于高级机器人。
  
  事件
  每当机器人在移动或转动时,雷达一直处于激活状态,如果雷达检测到有机器人在它的范围内,就会触发一个事件。作为机器人创建者,您有权选择处理可能在战斗中发生的各类事件。基本的 robot 类中包括了所有这些事件的缺省处理程序。但是,您可以覆盖其中任何一个“什么也不做的”缺省处理程序,然后实现您自己的定制行为。下面是一些较为常用的事件:
  
  scannedrobotevent。通过覆盖 onscannedrobot() 方法来处理 scannedrobotevent;当雷达检测到机器人时,就调用该方法。
  
  hitbybulletevent。通过覆盖 onhitbybullet() 方法来处理 hitbybulletevent;当机器人被炮弹击中时,就调用该方法。
  
  hitrobotevent。通过覆盖 onhitrobot() 方法来处理 hitrobotevent;当您的机器人击中另外一个机器人时,就调用该方法。
  
  hitwallevent。通过覆盖 onhitwall() 方法来处理 hitwallevent;当您的机器人撞到墙时,就调用该方法。
  我们只需要知道这些就可以创建一些相当复杂的机器人了。您可以通过战场的帮助菜单或 robot editor 的帮助菜单访问 javadoc 中其余的 robocode api。
  
  现在,我们该把学到的知识付诸实践了。
  
  创建机器人
  要创建一个新的机器人,请启动 robot editor 并选择 file->new->robot。系统将会提示您输入机器人的名称,这个名称将成为 java 类名。请您在提示符处输入 dwstraight。接下来,系统还会提示您输入一个独一无二的包前缀,它将用作存放机器人(还可能有相关的 java 文件)的包的名称。请在该提示符处输入 dw。
  
  robot editor 就会显示您要控制这个机器人需要编写的 java 代码。清单 1 是您将会看到的代码的一个示例:
  
  清单 1. robocode 生成的 robot 代码 package dw;
  import robocode.*;
  
  /**
  * dwstraight - a robot by (developerworks)
  */
  public class dwstraight extends robot
  {
  ... // <>
  /**
  * run: dwstraight's default behavior
  */
  public void run() {
  ... // <>
  while(true) {
  ... // <>
  }
  }
  ... // <>
  public void onscannedrobot(scannedrobotevent e) {
  fire(1);
  }
  }
  
  突出显示的区域就是我们添加控制机器人的代码的地方:
  
  area 1
  我们可以在这片空白里声明类作用域变量并设置这些变量的值。这些变量可以在机器人的 run() 方法内以及其他一些您可能创建的助手方法内使用。
  
  are

扫描关注微信公众号