【问题标题】:Calling a specific member of an object array from another class-method从另一个类方法调用对象数组的特定成员
【发布时间】:2013-05-31 01:47:03
【问题描述】:

我现在正在研究我项目的 AI 部分。我正在从我的 AI 类中调用一个方法,该方法旨在计算我绘制的 Gladiator 对象实际需要结束的位置。我向该方法传递了一个包含我想要放置的所有对象的列表。 AI 类的先前方法已经确定了他们希望彼此的距离,我将其存储为gladiator[0..1..2..etc].movementGoal。

虽然该项目不是实时的,即我希望最终只是“逐步”通过它,但我确实希望同时发生运动。这意味着我遍历列表的标准方法将不起作用,因为我需要有关其他角斗士的移动决策的信息,以便在这些决策相互作用时找出任何一个角斗士的实际移动。

当我在课堂外并且只有列表形式时,如何访问另一个特定角斗士的变量?

编辑:

我想我可以迭代并测试一个变量gladiatorNumber 是否正确,然后它何时提取该信息?这将是相当迂回的,但这是我能想到的。

编辑2:

根据要求,一些代码。我在 Ai 类中的方法是这样的:

public void moveAI(List<Gladiator> gladiators) {

我的角斗士是这样定义的:

public class Gladiator {

Gladiator 类被创建为一个数组,然后添加到一个单独的主类中的列表中。我真的不想包含比这更多的代码,因为它有很多。基本上它归结为我如何从 AI 类中调用角斗士 [0],即使我在主类中创建了所述对象并且仅在 AI 类中以列表形式存在它们。假设 Gladiator 中的所有变量都是公开的。我得到的错误是找不到引用角斗士[0...1...2...等]的符号。

【问题讨论】:

  • 您能发布一些代码供我们使用吗?如果您想访问非本机类的变量,则需要将它们声明为publicprivate。在给定时刻停止将需要实现timer
  • 你有玩家等级吗?还是只是角斗士 vs 角斗士?
  • @tdorno 停止不应该需要计时器,因为我计划事先计算所有相对运动,然后一次将所有东西移动到最终的位置。我不是在寻找流畅,我在寻找几乎回合制。但同时移动。
  • @aryaq Gladiator vs Gladiator,没有输入,但空格键“逐步通过”
  • @tdorno 需要注意的是,我确实有一个计时器,但它是让 AI 处理数据并决定,然后重新绘制。

标签: java arrays list methods


【解决方案1】:

我认为您的问题归结为想要将角斗士数组传递给另一个班级。这应该很容易。如果你的主班有这两个定义(注意你只需要一个,我推荐这个列表,因为它更通用,数组有固定长度)。

你想要这样的东西:

public class Main {
// ....stuff
// This is the main class that keeps the list of gladiators
private List<Gladiator> gladiatorsList;
private Gladiator[] gladiatorsArray;
private MovementAI movementAI;

public Main() {
    // You initialize gladiatorsList and gladiatorsArray as before
    // gladiatorsList = ...
    // gladiatorsArrray = ...
    // Now you want to pass this list/array to another class (the AI), you
    // can do this in the constructor of that class like so:
    movementAI = new MovementAI(gladiatorsList);
}

// ...stuff as before

}

人工智能

public class MovementAI {

private List<Gladiator> gladiators;

// Giving the class the list-reference, this list will be the same as the
// list in main, when main-list changes so does this one, they point to the
// same list-object, so the reference is only needed once.
public MovementAI(List<Gladiator> gladiatorsList) {
    this.gladiators = gladiatorsList;
}

// The class already has a reference to the list from its constructor so it
// doesn't need the list again as a parameter
public void moveAI() {

}

// If you don't want to keep a reference to the list in this class but only
// use it in a method (I would not recommend this)
public MovementAI() {

}

// You need to pass it gladiatorsList everytime you call this method.
public void moveAI(List<Gladiator> gladiators) {

}

}

我在您的上一条评论中看到,您已决定让 AI 决定在符合标准时重新绘制,这是不推荐的,您应该在类中保持职责分离,减少出错并更好地开发。建议让 AI 更改角斗士列表(移动、杀死它们等),并且渲染器类只需绘制每个角斗士。

您似乎还希望每个角斗士都能够将另一个角斗士作为目标,最好让他们将目标作为对象,这样您就不必搜索整个列表来找出角斗士编号指的是哪个角斗士,您不必考虑在列表中排序。像这样的:

public class Gladiator {
// ..other stuff

private Gladiator target;
public Gladiator getTarget() {
    return target;
}

public void setTarget(Gladiator target) {
    this.target = target;
}
}

【讨论】:

  • 这似乎是比每次都通过列表更好的选择,我会采用它。话虽如此,我仍然会被一个必须遍历的列表所困,无法从特定角斗士那里提取数据,不是吗?
  • 举个例子,每个 Gladiator 对象都有一个 target,它指的是他们所针对的角斗士编号。我要做的第一件事是弄清楚是否每个人都配对或是否正在进行多路战斗,因为我必须以不同的方式处理这些事件。我如何使用角斗士编号来查看他们是否已经在进行战斗,或者他们是否也在针对第一个角斗士?
  • 您将能够从角斗士列表中提取角斗士对象中可用的任何数据,它只是一个容器。如果声明了目标,它应该很容易访问,请参阅我的编辑。
  • 我想你可能误会了。或者我误解了你的理解。我在渲染器中创建了我的计时器和我的 ai 对象,然后在我的 actionPerformed 中为计时器一一调用我的 AI 方法,然后我重新绘制。将我的目标存储为角斗士对象的这一点听起来非常有用。我一定会这样做的。
  • 最好在actionperformed中只调用一个AI方法,而在一个AI方法内部调用其他(私有方法),比如aiManager.update()。这样您就可以更改 AI 的逻辑,而无需更改 actionlistener。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2013-12-21
  • 2014-07-19
  • 1970-01-01
  • 2012-03-31
  • 2020-07-17
相关资源
最近更新 更多