整理策略
保留自己能解释、能测试、能稳定运行的代码。
Lecture 04 · Strategy, Tournament, and Reflection
整合前三堂课的移动、扫描、开火与避弹逻辑,完成最终版本并参加班级坦克大决赛。
最后一堂课不只是比赛。我们要练习如何用测试结果支持自己的判断,并把一段能运行的代码整理成可以展示的作品。
保留自己能解释、能测试、能稳定运行的代码。
用多回合结果判断改动是否有效,避免只看单次胜负。
说明自己的移动、扫描、火力与避弹设计。
把移动、扫描、开火、受击与撞墙反应整合成一辆完整 Bot(机器人)。
用多回合对战观察结果,依据证据做小步改进。
完成最终 commit(提交)与 push(推送),并向同学说明自己的设计。
回顾前三堂课,列出每辆坦克的主要弱点。
策略优化与教师巡回 Debug。
最终测试、命名、commit 与 push。
班级坦克大决赛、策略展示与课程总结。
Bot 可以被 Robocode Tank Royale 载入,并能完成多回合对战。
学员能说明至少三项代码改动及其行为效果。
代码已有最终 commit,并推送到自己的 GitHub repository(代码仓库)。
不要追求一次变强。先找出一个最明显的问题,改一处,测试,再决定下一步。
@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);
}
最终版本不需要很复杂,但要能说明每个机制存在的理由。
对战结束后,Robocode 会列出每辆坦克的得分,重点关注:
为不同距离设置三段火力,并比较是否比两段火力更稳定。
Prepare final battle bot。写给自己看的代码可以随意一点;要展示给别人看的代码,需要清楚、稳定、可解释。
每位学员的 Bot 都要能被 GUI 正常载入;载入失败通常是 JSON 配置或类名问题。
说出最重要的三项代码改动。
说明这些改动针对什么问题。
用测试结果或战场观察支持判断。
编程训练的核心不是记住某个语法,而是学会把问题拆小、验证假设、清楚表达,并持续改进。
继续学习 Class(类)、Object(对象)、Array(数组)与 Method(方法)拆分。
深入 Radar(雷达)、Targeting(瞄准)、Movement(移动)与 Energy(能量)管理。
学习 README、测试记录、版本管理与更清楚的代码命名。
想继续深入: The Book of Robocode 有完整的移动、瞄准与雷达策略;课程首页也整理了免费的 Java 自学资源。
把今天的最终版本保留下来。它是你从零开始完成的第一份可运行 Java 作品。
趣味 Java 编程启蒙班
© 2026 by
Eng Zer Jun
is licensed under
Creative Commons Attribution-NonCommercial-ShareAlike 4.0 International