Lecture 04 · Strategy, Tournament, and Reflection

巅峰对决

整合前三堂课的移动、扫描、开火与避弹逻辑,完成最终版本并参加班级坦克大决赛。

Strategy(策略) Testing(测试) Commit(提交) Presentation(展示)

从“能运行”到“能展示”

最后一堂课不只是比赛。我们要练习如何用测试结果支持自己的判断,并把一段能运行的代码整理成可以展示的作品。

整理策略

保留自己能解释、能测试、能稳定运行的代码。

依据证据

用多回合结果判断改动是否有效,避免只看单次胜负。

清楚表达

说明自己的移动、扫描、火力与避弹设计。

今天的学习目标

整合策略

把移动、扫描、开火、受击与撞墙反应整合成一辆完整 Bot(机器人)。

测试优化

用多回合对战观察结果,依据证据做小步改进。

展示成果

完成最终 commit(提交)与 push(推送),并向同学说明自己的设计。

2 小时课堂节奏

0:00 - 0:20

回顾前三堂课,列出每辆坦克的主要弱点。

0:20 - 0:55

策略优化与教师巡回 Debug。

0:55 - 1:25

最终测试、命名、commit 与 push。

1:25 - 2:00

班级坦克大决赛、策略展示与课程总结。

最终作品需要具备什么?

能运行

Bot 可以被 Robocode Tank Royale 载入,并能完成多回合对战。

能解释

学员能说明至少三项代码改动及其行为效果。

能保存

代码已有最终 commit,并推送到自己的 GitHub repository(代码仓库)。

策略优化清单

  • 移动:路线是否太固定?是否常撞墙?
  • 扫描:雷达是否持续转动?是否经常失去目标?
  • 开火:是否根据距离调整 firepower(火力)?
  • 避弹:被击中后是否会换方向?
  • 能量:是否过度开火导致能量太快下降?

优化原则

不要追求一次变强。先找出一个最明显的问题,改一处,测试,再决定下一步。

整合示例:平衡型策略

@Override
public void run() {
    while (isRunning()) {
        if (Math.random() < 0.5) {
            turnLeft(30);
        } else {
            turnRight(30);
        }

        forward(120);
        turnGunLeft(360);
    }
}

@Override
public void onScannedBot(ScannedBotEvent e) {
    turnGunLeft(gunBearingTo(e.getX(), e.getY()));

    double distance = distanceTo(e.getX(), e.getY());
    double firepower = distance < 250 ? 3 : 1;
    if (getGunHeat() == 0) {
        fire(firepower);
    }
}

这不是唯一答案;模板仓库的 SampleBattleBot 是一份可对照阅读的完整示例。

再补上防守事件

@Override
public void onHitByBullet(HitByBulletEvent e) {
    double bearing = calcBearing(e.getBullet().getDirection());
    turnRight(90 - bearing); // 转到与子弹垂直,向侧面闪避
    forward(120);
}

@Override
public void onHitWall(HitWallEvent e) {
    back(80);
    turnRight(90);
}

最终版本不需要很复杂,但要能说明每个机制存在的理由。

如何做多回合测试?

  1. 不要只看一回合。设定至少 5 到 10 回合再看结果。
  2. 每次测试后只做一个小改动,才能判断变化来自哪里。
  3. 换不同对手测试,避免只对某一辆坦克有效。

看战斗结果 (Results)

对战结束后,Robocode 会列出每辆坦克的得分,重点关注:

  • Total Score(总分):综合表现。
  • Survival(生存分):活得久不久。
  • Bullet Damage(子弹伤害):打中了多少。

学生实作:最终优化 Sprint

基础任务

  • 选择一个优先问题:移动、扫描、开火、避弹或撞墙。
  • 做一个小改动,运行至少三场测试。
  • 写下改动前后的观察结果。
  • 确认最终版本能从 Robocode GUI 正常启动。

进阶挑战

为不同距离设置三段火力,并比较是否比两段火力更稳定。

命名与最终提交

  1. 给 Bot 一个正式名称。
  2. 更新 JSON config file(JSON 配置文件)的作者与描述。
  3. 确认代码没有临时注释或无用实验片段。
  4. commit message(提交信息):Prepare final battle bot
  5. push(推送)到 GitHub。

作品意识

写给自己看的代码可以随意一点;要展示给别人看的代码,需要清楚、稳定、可解释。

班级坦克大决赛规则

  • 每位学员提交一辆最终 Bot。
  • 对战采用多回合,避免单回合运气影响太大。
  • 每位学员用 1 分钟说明自己的策略:移动、扫描、开火、避弹。

在 Robocode 里办一场对战

  1. 启动 Robocode Tank Royale 的战场 GUI(图形界面)。
  2. 选择 Start Battle(开始对战),把所有学员的 Bot 加入参赛名单 (Selected bots)。
  3. 设定回合数 (Number of rounds),例如 10 回合,减少运气影响。
  4. 开始对战,结束后查看 Results(结果)记分板。

每位学员的 Bot 都要能被 GUI 正常载入;载入失败通常是 JSON 配置或类名问题。

展示问题引导

我做了什么?

说出最重要的三项代码改动。

为什么这样做?

说明这些改动针对什么问题。

效果如何?

用测试结果或战场观察支持判断。

常见收尾问题

  • 最终版本跑不起来:先回到上一版能运行的 commit,再重新套用关键改动。
  • 只在一场表现好:增加回合数,不要过度相信单次结果。
  • 代码太复杂:删除不能解释的实验片段,保留稳定机制。
  • 忘记 push:本地 commit 只是电脑里的存档,push 才会到 GitHub。

四堂课学到的不只是 Java

  • Class(类)与 Method(方法):把行为组织成代码。
  • Variable(变量)与 If-Else(条件判断):让程序根据资料做决定。
  • Event(事件):让程序回应外界变化。
  • Debugging(调试):用证据定位问题。
  • Git:保存每个阶段的学习成果。

长期价值

编程训练的核心不是记住某个语法,而是学会把问题拆小、验证假设、清楚表达,并持续改进。

后续学习路线

Java 基础

继续学习 Class(类)、Object(对象)、Array(数组)与 Method(方法)拆分。

Robocode 策略

深入 Radar(雷达)、Targeting(瞄准)、Movement(移动)与 Energy(能量)管理。

工程习惯

学习 README、测试记录、版本管理与更清楚的代码命名。

想继续深入: The Book of Robocode 有完整的移动、瞄准与雷达策略;课程首页也整理了免费的 Java 自学资源。

课程结束前的反思

  • 你现在是否能看懂一段 Java 程序大概在做什么?
  • 遇到错误时,你是否知道先读错误信息、找行数、做小步修改?
  • 你最想继续改进自己的坦克哪一个部分?为什么?

把今天的最终版本保留下来。它是你从零开始完成的第一份可运行 Java 作品。

授权

趣味 Java 编程启蒙班 © 2026 by Eng Zer Jun is licensed under Creative Commons Attribution-NonCommercial-ShareAlike 4.0 International