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

Java中如何遍历执行方法调用列表?RobotCode机器人开发

需求实现方案

完全可以实现将Robot类的动作方法存入集合并依次执行的需求,下面提供两种实用的实现方式:

方式一:用Runnable+Lambda表达式快速封装

这种方式代码简洁,适合固定动作序列的场景:

修改你的代码,将存储动作的集合改为List<Runnable>,把每个动作封装成Lambda表达式存入集合,最后遍历集合执行即可:

import java.awt.*;
import java.util.ArrayList;
import java.util.List;

public class NeuBot extends Robot
{
    int rapidFire = 2;
    public String name;
    boolean firing = false;
    int trigger;
    int turnDirection = 2;
    final int MOVES = 5;
    boolean wasHit = true;
    int moveOne = 1;
    int moveTwo = 2;
    int moveThree = 3;

    // 用List<Runnable>存储每个动作
    List<Runnable> actionList = new ArrayList<>();

    public void run()
    {
        // 初始化动作序列,将每个操作封装为Runnable
        actionList.add(() -> ahead(100));
        actionList.add(() -> back(200));
        actionList.add(() -> turnLeft(180));
        actionList.add(() -> turnRight(180));
        actionList.add(() -> onScannedRobot(null));
        actionList.add(() -> onHitRobot(null));

        while (true)
        {
            // 依次执行集合中的所有动作
            for (Runnable action : actionList)
            {
                action.run();
            }
        }
    }

    // 原有方法保持不变
    public void onScannedRobot(ScannedRobotEvent e)
    {
        for (int i = 0; i < MOVES; ++i)
        {
            firing = true;
            fire(rapidFire);
            if (firing == true)
            {
                back(50);
                out.println("Moved Back"); //TestX
            }
        }
        turnRight(10);
        ahead(20);
    }

    public void onHitRobot(HitRobotEvent e)
    {
        out.println("Hit");
        wasHit = true;
        if (wasHit == true)
        {
            ahead(20);
            fire(rapidFire);
            out.print("Fired Again!");
        }
    }
}

方式二:自定义动作类(更灵活扩展)

如果需要动态调整动作参数、扩展动作类型,建议用自定义类来封装动作信息:

import java.awt.*;
import java.util.ArrayList;
import java.util.List;

public class NeuBot extends Robot
{
    int rapidFire = 2;
    public String name;
    boolean firing = false;
    int trigger;
    int turnDirection = 2;
    final int MOVES = 5;
    boolean wasHit = true;
    int moveOne = 1;
    int moveTwo = 2;
    int moveThree = 3;

    // 自定义动作类,记录动作类型和参数
    static class RobotAction {
        enum ActionType { AHEAD, BACK, TURN_LEFT, TURN_RIGHT, SCANNED_ROBOT, HIT_ROBOT }
        ActionType type;
        int param;

        // 带参数的动作构造方法
        public RobotAction(ActionType type, int param) {
            this.type = type;
            this.param = param;
        }
        // 无参数的动作构造方法
        public RobotAction(ActionType type) {
            this.type = type;
            this.param = 0;
        }
    }

    // 存储自定义动作的集合
    List<RobotAction> actionList = new ArrayList<>();

    public void run()
    {
        // 初始化动作序列
        actionList.add(new RobotAction(RobotAction.ActionType.AHEAD, 100));
        actionList.add(new RobotAction(RobotAction.ActionType.BACK, 200));
        actionList.add(new RobotAction(RobotAction.ActionType.TURN_LEFT, 180));
        actionList.add(new RobotAction(RobotAction.ActionType.TURN_RIGHT, 180));
        actionList.add(new RobotAction(RobotAction.ActionType.SCANNED_ROBOT));
        actionList.add(new RobotAction(RobotAction.ActionType.HIT_ROBOT));

        while (true)
        {
            // 遍历执行每个动作
            for (RobotAction action : actionList) {
                switch (action.type) {
                    case AHEAD:
                        ahead(action.param);
                        break;
                    case BACK:
                        back(action.param);
                        break;
                    case TURN_LEFT:
                        turnLeft(action.param);
                        break;
                    case TURN_RIGHT:
                        turnRight(action.param);
                        break;
                    case SCANNED_ROBOT:
                        onScannedRobot(null);
                        break;
                    case HIT_ROBOT:
                        onHitRobot(null);
                        break;
                }
            }
        }
    }

    // 原有方法保持不变
    public void onScannedRobot(ScannedRobotEvent e)
    {
        for (int i = 0; i < MOVES; ++i)
        {
            firing = true;
            fire(rapidFire);
            if (firing == true)
            {
                back(50);
                out.println("Moved Back"); //TestX
            }
        }
        turnRight(10);
        ahead(20);
    }

    public void onHitRobot(HitRobotEvent e)
    {
        out.println("Hit");
        wasHit = true;
        if (wasHit == true)
        {
            ahead(20);
            fire(rapidFire);
            out.print("Fired Again!");
        }
    }
}

两种方式都能实现你的需求:第一种代码更简洁,适合快速实现固定动作;第二种扩展性更强,后续可以轻松添加新动作类型或动态修改动作参数。

内容的提问来源于stack exchange,提问作者smouvfox805

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.03 16:27:53