从 arraylist 调用方法

Calling a method from arraylist

对于回合制游戏,我想为一个星球制作一个建造队列。用户将要构建的项目放入队列中,然后,当轮到生成时,队列中的所有内容都将被构建。

现在我有一个 Planet class,它有一个 ArrayList。为玩家拥有的每个行星创建一个 Planet 类型的对象。数组列表包含用户命令这个星球建造的所有东西。它还包含 3 个存储当前存在于地球上的资源的变量和 3 个存储当前存在于地球上的建筑物总数的变量。

每个建筑类型也是一个class(因为建筑类型成本不同),我打算把相应类型的物体放入行星队列。我想每个建筑 class 应该有自己的建筑方法 .build();

我想循环遍历星球队列中的每个项目并启动类似 .buld() 的方法。 建造一个物体意味着从行星资源变量中减去一些资源,并将建造的建筑物数量添加到行星上的建筑物总数。 麻烦的是我不明白主要思想,如何实现这一点。

星球class:

public class Planet extends WorldObject implements Serializable {

    private int defenses;
    private int mines;
    private int factories;
    //it also has 3 variables from WorldObject class:
    int iron;
    int bor;
    int ger;

    ArrayList<Installation> queue;

    private void build(){
        for ( int i = 0; i < queue.size()-1; i++ )
        {
            queue.get(i).build();
        }
    }
}

建筑物之一 classes:

 public class Factory extends Installation {
        int costIron = 10;
        int costGer = 50;

        public build(int amt) {                
            //build itself, remove res from planet, add number built to planet factory list
        }    
    }

如果我做的完全错了,如果你说我应该在哪个 "direction" 寻找信息,我将不胜感激。

您需要将 Planet 对象作为参数传递给 build,以便它可以访问资源,或者,在 [=12] 中执行 "building" =] 代码本身,并且只需要 getCost 在建筑物上,你会打电话给你找出要减去多少资源。

就个人而言,我知道有点喜欢后一种方法,但如果品味比其他任何东西都更重要。

听起来 Planet 应该有一个封装资源的 Resources 对象,并且可以传递给 Installation.build()。然后 Installation.build() 可以 return 一个描述构建内容的对象。

编辑:这是一个例子:

public class MineFactory extends Installation {
    private final Resources cost;

    public MineFactory(Resources cost) {
      this.cost = cost.clone();
    }

    @Override
    public Result build(Resources availableResources) {    
      if (!availableResources.remove(cost)) {
        return Result.empty();
      }
      return Result.mines(2);    
    }    
}