Java OOP中AntiqueCar子类实现每3秒停止后继续行驶的解决方案求助
解决AntiqueCar行驶3秒后暂停再恢复的问题
嘿,作为Java OOP新手遇到这个问题很正常~你的思路没错,确实需要在AntiqueCar里重写drive方法来实现这个周期性启停的逻辑。问题的核心在于你需要跟踪当前车辆的状态(行驶中/暂停中),以及记录状态开始的时间,这样才能判断什么时候切换状态。
下面是具体的解决方案:
首先,我们需要在AntiqueCar类中添加几个状态变量来跟踪时间和当前状态:
- 记录行驶/暂停阶段的开始时间
- 标记当前是否处于暂停状态
- 定义行驶和暂停的时长常量(你可以根据需求调整)
然后重写drive方法,在每次调用时根据当前状态和已流逝的时间来决定是继续行驶、切换到暂停,还是结束暂停恢复行驶。
完整的AntiqueCar代码如下:
import java.awt.geom.Dimension2D; public class AntiqueCar extends Car { private static final String ANTIQUE_CAR_IMAGE_FILE = "antiquecar.gif"; private static final int MIN_SPEED_FAST_CAR = 2; private static final int MAX_SPEED_FAST_CAR = 7; // 定义行驶和暂停的时长(毫秒) private static final long DRIVE_DURATION_MS = 3000; // 3秒行驶 private static final long PAUSE_DURATION_MS = 1000; // 1秒暂停(可按需调整) // 状态跟踪变量 private long phaseStartTime; private boolean isPaused; public AntiqueCar(Dimension2D gameBoardSize) { super(gameBoardSize); setMinSpeed(MIN_SPEED_FAST_CAR); setMaxSpeed(MAX_SPEED_FAST_CAR); setRandomSpeed(); setIconLocation(ANTIQUE_CAR_IMAGE_FILE); // 初始化状态:默认开始行驶,记录当前时间 this.phaseStartTime = System.currentTimeMillis(); this.isPaused = false; } @Override public void drive(Dimension2D gameBoardSize) { if (this.crunched) { return; } long currentTime = System.currentTimeMillis(); long elapsedTime = currentTime - this.phaseStartTime; if (!isPaused) { // 行驶状态:检查是否已达到3秒行驶时长 if (elapsedTime >= DRIVE_DURATION_MS) { // 切换到暂停状态,更新阶段开始时间 this.isPaused = true; this.phaseStartTime = currentTime; } else { // 未到行驶时长上限,执行父类的移动逻辑 super.drive(gameBoardSize); } } else { // 暂停状态:检查是否已达到暂停时长 if (elapsedTime >= PAUSE_DURATION_MS) { // 切换回行驶状态,更新阶段开始时间 this.isPaused = false; this.phaseStartTime = currentTime; // 恢复行驶时立即执行一次移动(可选,根据游戏逻辑调整) super.drive(gameBoardSize); } // 暂停期间不执行移动逻辑,车辆保持静止 } } }
代码解释:
- 状态变量:
phaseStartTime记录当前状态(行驶/暂停)的起始时间,isPaused标记车辆当前是否处于暂停状态。 - 构造方法初始化:车辆启动时默认处于行驶状态,所以初始化时记录当前系统时间,设置
isPaused为false。 - 重写的
drive方法:- 先判断车辆是否已损坏(
crunched),如果是直接返回,不执行任何操作。 - 计算当前状态已经持续的时长
elapsedTime。 - 行驶状态下:若已行驶满3秒,则切换到暂停状态并更新计时起点;否则调用父类的
super.drive()执行移动逻辑。 - 暂停状态下:若已暂停满设定时长,则切换回行驶状态并更新计时起点,同时可选择立即执行一次移动让车辆恢复行驶;暂停期间不执行移动逻辑。
- 先判断车辆是否已损坏(
注意事项:
- 你可以根据游戏需求自由调整
PAUSE_DURATION_MS的值,比如改成2秒暂停。 - 确保游戏循环是持续调用
drive方法的(比如每帧调用一次),这样状态判断和计时才能正常工作。 - 如果你的游戏使用帧计数而非系统时间计时,可以把
System.currentTimeMillis()换成对应的帧计数逻辑,核心思路还是跟踪状态时长和切换状态。
内容的提问来源于stack exchange,提问作者B. Selin Zaza
相关产品推荐
相关产品推荐

