liujijiang

robocode 一个简单有趣的java编程游戏

2020.04.23

简介

robocode是一个java编写的类似自动机器人软件,你可以编写你的自己的坦克,然后跟机器的坦克对战,或者跟别人的坦克对战,有1对1模式和混战模式,谁能待到最后谁就胜利

iShot2020-04-30上午07.22.42-fc9acd9962a24df791c819eb41fb6446

iShot2020-04-30上午07.23.06-92679041a2524cc7afc8efb8f5b648c4

官网地址:点击下载就可以了

安装和开始

运行下载的jar

java -jar robocode-1.9.3.9-setup.jar

然后会告诉你robocode.sh文件的地址
在robocode.sh所在的目录下

./robocode.sh

组成

每个坦克有三个部件:坦克本身,炮塔,雷达
可以设置使得三个部件可以独立转动和工作

坦克本身可以转动以及前后移动
炮塔可以开炮
雷达会扫描到敌方炮塔的能量,相对位置,以及敌方和我方之间的距离等

雷达是非常重要的一个组件,他为我们提供了敌方的信息,使我们可以做出决策

坦克有一个重要的属性:能量
所有的坦克开始时的能量是一样的,当能量降到0时,坦克爆炸
开炮会降低能量,炮的威力为0-3之间,相应的降低能量的数值也是0-3之间
炮击中敌方坦克时,自己的坦克就会增加能量,增加的能量也跟炮的威力有关
坦克撞墙会减少能量
坦克装上敌方坦克会减少能量

制作一个坦克很简单,只要继承Robot类就行了
然后就可以重写Robot的一些事件以及调用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(true):坦克和炮转动的转动互不影响
  • setAdjustRadarForRobotTurn(true):坦克和炮的转动和雷达的转动互不影响
  • setAdjustRadarForGunTurn(true):坦克,炮,雷达全部转动互不影响

获取信息:

界面看成一个坐标轴,左下角是原点,使用绝对位置时正上方角度为0

  • getX():获取自己坦克的X轴距离
  • getY():获取自己坦克的Y轴距离
  • getHeading(),getGunHeading(),getRadarHeading():获取坦克,炮,雷达的角度,这个角度是绝对的,使用绝对位置时正上方角度为0,所以如果方向指向右面,返回就是90,如果指向左面,返回就是270
  • getBattleFieldWidth(),getBattleFieldHeight():获取场地的宽度和高度,每一场比赛的宽度和高度是可以设置的,不是固定的,所以就需要这两个方法得到场地的宽度和高度
  • fire(double power):射击,参数是射击的火力,可以是0-3,同时每一发炮弹自己也消耗一样的能量

事件:

继承Robot后主要重写三个方法:

  • ScannedRobotEvent(ScannedRobotEvent e):这个方法会在雷达扫描到敌方坦克时调用,只要扫描到敌方坦克就会调用这个方法,所以这是你可以控制炮向敌方开火,可以调用e的一些方法获取扫描到的敌方坦克的一些信息,e.getBearing:返回敌方坦克的方位,这个返回的角度是相对的,如果敌方坦克在自己的右面,那么返回的数值就是0-180,这个返回的数值是敌方坦克和己方坦克的头的方向的角度,如果是左面就是-180 – 0,
    e.getDistance:返回敌方坦克到自己坦克的距离
  • onHitByBullet(HitByBulletEvent e):当自己的坦克中弹时自动调用这个方法,这时候应该赶紧移动自己的坦克,别让自己的坦克一直被打,可以低啊用e.getHeading()返回敌方坦克的头的方向
    (一直强调头的方向是因为一个坦克有三个方向,坦克的方向,炮的方向,雷达的方向,默认情况这三个方向是相同的,但是前面说了可以设置成三个互不干涉)
    onHitWall(HitWallEvent e):当自己的坦克撞到墙或者敌方坦克时自动调用这个方法,这个时候可以调整方向
  • HitRobotEvent():这个方法在自己的炮弹击中敌方的坦克时被自动调用

这个程序写一个自己的坦克很简单,要让自己的坦克动起来开炮也很简单,但是要让自己的坦克变动聪明就难了

看了一个YouTube的视频,人家的坦克追着别人打。。。