You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

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方法:
    1. 先判断车辆是否已损坏(crunched),如果是直接返回,不执行任何操作。
    2. 计算当前状态已经持续的时长elapsedTime。
    3. 行驶状态下:若已行驶满3秒,则切换到暂停状态并更新计时起点;否则调用父类的super.drive()执行移动逻辑。
    4. 暂停状态下:若已暂停满设定时长,则切换回行驶状态并更新计时起点,同时可选择立即执行一次移动让车辆恢复行驶;暂停期间不执行移动逻辑。

注意事项:

  • 你可以根据游戏需求自由调整PAUSE_DURATION_MS的值,比如改成2秒暂停。
  • 确保游戏循环是持续调用drive方法的(比如每帧调用一次),这样状态判断和计时才能正常工作。
  • 如果你的游戏使用帧计数而非系统时间计时,可以把System.currentTimeMillis()换成对应的帧计数逻辑,核心思路还是跟踪状态时长和切换状态。

内容的提问来源于stack exchange,提问作者B. Selin Zaza

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.04.28 20:57:50