Java Arraylist中的每个对象都知道Arraylist中的其他对象

Java Arraylist中的每个对象都知道Arraylist中的其他对象,java,arraylist,Java,Arraylist,我正在写一个小游戏,里面有一条会感染其他鱼类的僵尸鱼。我已经完成了这一部分,但我希望这条鱼能够感染其他鱼,但要做到这一点,我需要arrayList中的每条鱼都知道其他鱼能够感染它们。这是创建arrayList的面板的主要部分 基本布局: 我有一个面板,可以处理游戏中的所有对象。 然后该面板调用fish类来创建fish 面板包含鱼的数组列表。 我将其作为副水传递给僵尸鱼,并在其中处理最初感染的阵列 我想在那之后发生的是,所有被它们感染的鱼也能感染其他鱼。我需要一种方法,允许ArrayList中的鱼

我正在写一个小游戏,里面有一条会感染其他鱼类的僵尸鱼。我已经完成了这一部分,但我希望这条鱼能够感染其他鱼,但要做到这一点,我需要arrayList中的每条鱼都知道其他鱼能够感染它们。这是创建arrayList的面板的主要部分

基本布局: 我有一个面板,可以处理游戏中的所有对象。 然后该面板调用fish类来创建fish 面板包含鱼的数组列表。 我将其作为副水传递给僵尸鱼,并在其中处理最初感染的阵列


我想在那之后发生的是,所有被它们感染的鱼也能感染其他鱼。我需要一种方法,允许ArrayList中的鱼在父类中相互了解,以便能够编写代码让它们感染。

感染其他鱼。
在这种情况下,也可以创建ZFish的ArrayList,每次您感染鱼类时,都会将其从鱼类的ArrayList中删除,并在感染鱼类的位置创建新的ZFish实例。例如:

private ArrayList<Fish> _fish; 
private ArrayList<ZFish> _zfish; 

fishInfectedMethod(int indexOfCaughtFish){
    int x = _fish.get(indexOfCaughtFish).getX();
    int y = _fish.get(indexOfCaughtFish).getY();
    _fish.remove(indexOfCaughtFish);
    _zfish.add(new ZFish(new Color(0, 179, 60),_tank, _fish));
    _zfish.setLocation(x, y);
}
private ArrayList\u fish;
私人Arraylistu zfish;
鱼类感染方法(int indexOfCaughtFish){
int x=_fish.get(indexOfCaughtFish.getX();
int y=_fish.get(indexOfCaughtFish.getY();
_鱼。移除(indexOfCaughtFish);
_添加(新zfish(新颜色(0,179,60),_坦克,_鱼));
_zfish.setLocation(x,y);
}

假设您有fish location的getter。

您必须为fish类指定您当前的类才能实现这一点。我会这样做:

public int _numFish = 100;  //CHANGE IT TO PUBLIC its important
public ArrayList<Fish> _fish; 

_fish = new ArrayList<Fish>();
for(int i=0;i<_numFish;i++)
    _fish.add(new Fish(setRandColor(), _tank, this));

for(int i=0;i<_numFish;i++)
    _fish.add(new MotleyFish(setRandColor(),setRandColor(),_tank,this));

for(Fish f: _fish)
    f.setLocation((int)(Math.random() *(TANK_WIDTH - TANK_X + 1)+TANK_X), 
              (int)(Math.random() *(TANK_HEIGHT - TANK_Y + 1)+ TANK_Y));

_shark = new ZFish(new Color(0, 179, 60),_tank, _fish,this);
_shark.setLocation((int)(Math.random() *(TANK_WIDTH - TANK_X + 1)+TANK_X), 
              (int)(Math.random() *(TANK_HEIGHT - TANK_Y + 1)+ TANK_Y));

一种方法是重新组织fish类,使它们都实现一个接口,比如说
fish
,然后调用类
GenericFish
MotleyFish
,和
ZFish

然后,不要为位置设置常量并将它们包含在每个
Fish
实例中,而是使用一个
Grid
类,该类包含
Fish
引用的二维数组。2D数组的作用类似于您的坐标,
Grid
类包含该数组以及其他实用方法。您可以将
move
方法放在
Fish
实现中,该实现将引用传递给网格,或者将其放在
grid
类中,该类将鱼四处移动


然后,您可以在
网格
类上找到一个方法,该方法接收网格位置,并通过检查包含
实例的附近坐标返回附近鱼的列表。

没有足够的详细信息来获得适当的答案。请澄清您的具体问题或添加其他详细信息,以突出显示您所需的内容。正如目前所写的,很难准确地说出你在问什么。我已经完成了这一部分,但我想更进一步,使正常的鱼在感染后能够感染其他鱼。我不太理解你,我更新了答案。谢谢你,这很有效!如果它创建第一条鱼,将类传递到该鱼中,然后在该鱼之后创建另一条鱼,该鱼知道第一条鱼,但之后不知道,因为该鱼是在传递类之后创建的,那么这会起作用吗?它只是对面板类的引用,因此它可以从那里读取数据。类。_fish只是main方法中对_fish数组的引用,您可以在构造函数中访问它。要全面使用它,您必须创建一个类范围的YourMainClassName类变量,然后在构造函数中调用:this.class=class。然后您可以在Fish类的每个函数中使用它,并且它将始终具有与Panel类相同的状态。注意,您必须用类名更改MainClassName^^
public Fish(Color color,Tank _tank, YourMainClassName class ){
   //now you can access _fish with class._fish
   //and _numFish with class._numFish
}