加载中...

03.Robocode事件指令说明

Robocode事件指令说明

在 Robocode 中,事件(Events)是机器人对外部环境变化的响应机制。以下是一些常见的 Robocode 事件及其说明:

1.常用事件函数

1.1 onScannedRobot(ScannedRobotEvent e)

  • 触发条件: 当你的机器人扫描到另一个机器人时触发。
  • 常用方法:
    • e.getName(): 获取扫描到的机器人的名字。
    • e.getBearing(): 获取扫描到的机器人相对于你的机器人的角度。
    • e.getDistance(): 获取扫描到的机器人与你的机器人之间的距离。
    • e.getEnergy(): 获取扫描到的机器人的能量值。
    • e.getHeading(): 获取扫描到的机器人的朝向角度。
    • e.getVelocity(): 获取扫描到的机器人的速度。

1.2 onHitByBullet(HitByBulletEvent e)

  • 触发条件: 当你的机器人被子弹击中时触发。
  • 常用方法:
    • e.getBearing(): 获取子弹相对于你的机器人的角度。
    • e.getPower(): 获取子弹的能量(威力)。
    • e.getName(): 获取发射子弹的机器人的名字。

1.3 onHitWall(HitWallEvent e)

  • 触发条件: 当你的机器人撞到墙时触发。
  • 常用方法:
    • e.getBearing(): 获取撞墙时相对于你的机器人的角度。

1.4 onHitRobot(HitRobotEvent e)

  • 触发条件: 当你的机器人撞到另一个机器人时触发。
  • 常用方法:
    • e.getBearing(): 获取撞到的机器人相对于你的机器人的角度。
    • e.getName(): 获取撞到的机器人的名字。
    • e.getEnergy(): 获取撞到的机器人的能量值。

1.5 onBulletHit(BulletHitEvent e)

  • 触发条件: 当你的子弹击中另一个机器人时触发。
  • 常用方法:
    • e.getName(): 获取被击中的机器人的名字。
    • e.getEnergy(): 获取被击中的机器人的能量值。
    • e.getBullet().getPower(): 获取子弹的能量(威力)。

1.6 onBulletMissed(BulletMissedEvent e)

  • 触发条件: 当你的子弹未击中任何目标时触发。
  • 常用方法:
    • e.getBullet().getPower(): 获取子弹的能量(威力)。

1.7 onDeath(DeathEvent e)

  • 触发条件: 当你的机器人被摧毁时触发。
  • 常用方法:
    • e.getName(): 获取摧毁你的机器人的名字。

1.8 onWin(WinEvent e)

  • 触发条件: 当你的机器人赢得比赛时触发。
  • 常用方法:
    • e.getName(): 获取你的机器人的名字。

1.9 onRoundEnded(RoundEndedEvent e)

  • 触发条件: 当一轮比赛结束时触发。
  • 常用方法:
    • e.getRound(): 获取当前回合的编号。
    • e.getTotalRounds(): 获取总回合数。

1.10 onBattleEnded(BattleEndedEvent e)

  • 触发条件: 当整个比赛结束时触发。
  • 常用方法:
    • e.getResults(): 获取比赛结果。

1.11 onRobotDeath(RobotDeathEvent e)

  • 触发条件: 当另一个机器人被摧毁时触发。
  • 常用方法:
    • e.getName(): 获取被摧毁的机器人的名字。

1.12 onStatus(StatusEvent e)

  • 触发条件: 定期触发,用于更新机器人的状态。
  • 常用方法:
    • e.getStatus(): 获取当前机器人的状态信息。

1.13 onSkippedTurn(SkippedTurnEvent e)

  • 触发条件: 当你的机器人跳过了一个回合时触发(通常是因为代码执行时间过长)。
  • 常用方法:
    • e.getTime(): 获取跳过的回合时间。

1.14 onPaint(PaintEvent e)

  • 触发条件: 当需要绘制自定义图形时触发。
  • 常用方法:
    • e.getGraphics(): 获取用于绘制的图形对象。

1.15 onCustomEvent(CustomEvent e)

  • 触发条件: 当自定义事件被触发时触发。
  • 常用方法:
    • e.getCondition(): 获取触发事件的条件。

1.16 onMessageReceived(MessageEvent e)

  • 触发条件: 当你的机器人接收到其他机器人发送的消息时触发。
  • 常用方法:
    • e.getMessage(): 获取接收到的消息内容。
    • e.getSender(): 获取发送消息的机器人名字。

1.17 onKeyPressed(KeyEvent e)

  • 触发条件: 当按下键盘上的某个键时触发。
  • 常用方法:
    • e.getKeyCode(): 获取按下的键的代码。
    • e.getKeyChar(): 获取按下的键的字符。

1.18 onKeyReleased(KeyEvent e)

  • 触发条件: 当释放键盘上的某个键时触发。
  • 常用方法:
    • e.getKeyCode(): 获取释放的键的代码。
    • e.getKeyChar(): 获取释放的键的字符。

1.19 onMouseClicked(MouseEvent e)

  • 触发条件: 当鼠标点击时触发。
  • 常用方法:
    • e.getX(): 获取鼠标点击的 X 坐标。
    • e.getY(): 获取鼠标点击的 Y 坐标。
    • e.getButton(): 获取点击的鼠标按钮。

1.20 onMouseMoved(MouseEvent e)

  • 触发条件: 当鼠标移动时触发。
  • 常用方法:
    • e.getX(): 获取鼠标的 X 坐标。
    • e.getY(): 获取鼠标的 Y 坐标。

1.21 onMouseDragged(MouseEvent e)

  • 触发条件: 当鼠标拖动时触发。
  • 常用方法:
    • e.getX(): 获取鼠标的 X 坐标。
    • e.getY(): 获取鼠标的 Y 坐标。

1.22 onMousePressed(MouseEvent e)

  • 触发条件: 当鼠标按下时触发。
  • 常用方法:
    • e.getX(): 获取鼠标的 X 坐标。
    • e.getY(): 获取鼠标的 Y 坐标。
    • e.getButton(): 获取按下的鼠标按钮。

1.23 onMouseReleased(MouseEvent e)

  • 触发条件: 当鼠标释放时触发。
  • 常用方法:
    • e.getX(): 获取鼠标的 X 坐标。
    • e.getY(): 获取鼠标的 Y 坐标。
    • e.getButton(): 获取释放的鼠标按钮。

1.24 onMouseEntered(MouseEvent e)

  • 触发条件: 当鼠标进入机器人区域时触发。
  • 常用方法:
    • e.getX(): 获取鼠标的 X 坐标。
    • e.getY(): 获取鼠标的 Y 坐标。

1.25 onMouseExited(MouseEvent e)

  • 触发条件: 当鼠标离开机器人区域时触发。
  • 常用方法:
    • e.getX(): 获取鼠标的 X 坐标。
    • e.getY(): 获取鼠标的 Y 坐标。

1.26 onMouseWheelMoved(MouseWheelEvent e)

  • 触发条件: 当鼠标滚轮滚动时触发。
  • 常用方法:
    • e.getWheelRotation(): 获取滚轮的滚动方向。

1.27 onPaint(Graphics2D g)

  • 触发条件: 当需要绘制自定义图形时触发。
  • 常用方法:
    • g.drawLine(): 绘制直线。
    • g.drawRect(): 绘制矩形。
    • g.drawOval(): 绘制椭圆。
    • g.drawString(): 绘制字符串。

1.28 onPaint(Graphics g)

  • 触发条件: 当需要绘制自定义图形时触发。
  • 常用方法:
    • g.drawLine(): 绘制直线。
    • g.drawRect(): 绘制矩形。
    • g.drawOval(): 绘制椭圆。
    • g.drawString(): 绘制字符串。

1.29 onPaint(PaintEvent e)

  • 触发条件: 当需要绘制自定义图形时触发。
  • 常用方法:
    • e.getGraphics(): 获取用于绘制的图形对象。

1.30 onPaint(Graphics2D g)

  • 触发条件: 当需要绘制自定义图形时触发。
  • 常用方法:
    • g.drawLine(): 绘制直线。
    • g.drawRect(): 绘制矩形。
    • g.drawOval(): 绘制椭圆。
    • g.drawString(): 绘制字符串。

2.事件参数对象说明

事件命令是当某事件发生时自动执行的命令。如当自己的雷达扫描到敌人时,会自动调用到onScannedRobot命令。

public void onScannedRobot(ScannedRobotEvent e){

System.out.println("发现敌人了");

}

上面这个命令是在我们的机器人的雷达扫描到敌人时自动被调用的。

3.命令案例实战入门

在 Robocode 中,编写一个机器人使其走三角形的路径,可以通过控制机器人的移动和转向来实现。以下是一个简单的示例代码,机器人会按照三角形的路径移动:

import robocode.HitByBulletEvent;
import robocode.HitWallEvent;
import robocode.Robot;
import robocode.ScannedRobotEvent;

import java.awt.*;

/**
 * 类描述: 机器人走三角形路径
 *
 * @author fxr
 * @version 1.0.0
 * @date 2025/2/18 9:02
 */
public class TriangleBot extends Robot{

    // 定义三角形的边长
    private static final int SIDE_LENGTH = 100;

    // 定义三角形的角度(120度,因为三角形内角和为180度)
    private static final int TURN_ANGLE = 120;

    @Override
    public void run() {
        // 设置机器人颜色
        setBodyColor(Color.blue);
        setGunColor(Color.red);
        setRadarColor(Color.green);

        // 无限循环,机器人会一直走三角形
        while (true) {
            // 走三角形的三条边
            for (int i = 0; i < 3; i++) {
                // 向前移动
                ahead(SIDE_LENGTH);
                // 转向120度
                turnRight(TURN_ANGLE);
            }
        }
    }

    @Override
    public void onScannedRobot(ScannedRobotEvent event) {
        // 如果扫描到其他机器人,开火
        fire(1);
    }

    @Override
    public void onHitByBullet(HitByBulletEvent event) {
        // 如果被子弹击中,转向
        turnRight(90);
    }

    @Override
    public void onHitWall(HitWallEvent event) {
        // 如果撞到墙,转向
        turnRight(180);
    }

}

代码说明:

  • SIDE_LENGTH: 定义三角形的边长,这里设置为 100 像素。
  • TURN_ANGLE: 定义机器人转向的角度,因为三角形内角和为 180 度,所以每次转向 120 度。
  • run(): 机器人的主循环,控制机器人按照三角形的路径移动。
  • onScannedRobot(): 当机器人扫描到其他机器人时,开火。
  • onHitByBullet(): 当机器人被子弹击中时,转向 90 度。
  • onHitWall(): 当机器人撞到墙时,转向 180 度。

运行效果:

  • 机器人会按照三角形的路径移动,每次移动 100 像素后转向 120 度,形成一个等边三角形。
  • 如果扫描到其他机器人,机器人会开火。
  • 如果被子弹击中或撞到墙,机器人会转向以避免危险。

你可以将这段代码复制到 Robocode 的机器人编辑器中,编译并运行,观察机器人的行为。