如何“编程”一个包含多种类型东西的包?

时间:2014-01-27 19:46:18

标签: java data-structures

我正在尝试使用java将棋盘游戏变成多人游戏,但我对如何实现我想要的东西有一些疑问。

在游戏中,有一个包含生物,建筑物和魔法的包。每个玩家从这个包中抽出来获得他们的游戏棋子。然后他们要么将这些碎片放在他们自己拥有的游戏板上的瓷砖上,要么他们抓住这些碎片并在以后播放它们。瓷砖可以容纳生物,魔法,建筑物,堡垒。

现在我有一个包含所有生物的ArrayList,每个tile都有一个可以容纳生物的ArrayList。

看起来像ArrayList不是我想要使用的,因为我必须让ArrayList属于Object类型(这很糟糕)。关于如何设计程序的任何想法,所以我不必转换为Object?我不确定我是否需要一个包装类,或者只需要多个数组列表,但令人困惑的是当玩家从包含许多不同内容的包中绘制时。我应该能够轻松地区分电路板周围的情况。

有什么建议吗?

3 个答案:

答案 0 :(得分:10)

生物,建筑物和魔法可以实现相同的界面还是扩展同一个类?然后你可以有一个包含该接口或类的ArrayList。或者,只需要一个包含三个ArrayLists的数据结构,并编写可在它们之间进行公平选择的代码。

答案 1 :(得分:2)

我建议每个对象实现一个接口:

interface Bagable {
    public String getType();
}

然后每个对象都可以这种方式完成:

class Creature implements Bagable {
    public String getType() {
        return "Creature";
    }
    // Normal Creature Class methods...
}
class Building implements Bagable {
    public String getType() {
        return "Buidling";
    }
    // Normal Building Class methods...
}
class Magic implements Bagable {
    public String getType() {
        return "Magic";
    }
    // Normal Magic Class methods...
}

public static void main(String args[]) {
    ArrayList<Bagable> bag = new ArrayList<Bagable>();

    bag.add(new Creature());
    bag.add(new Building());
    bag.add(new Magic());

    for (int i = 0; i < bag.size(); i++ ) {
        System.out.println(bag.get(i).getType());
    }
}

或者您可以将类型作为内置值

int ITEM_TYPE_MAGIC = 0;
int ITEM_TYPE_CREATURE = 1;
int ITEM_TYPE_BUILDING = 2;

并根据这些内置值检查它们

答案 2 :(得分:1)

一种解决方案是创建一个界面,例如BagItem(可以定义包中的项目预期要做的任何常见行为),并拥有生物,建筑,魔法等等。 ,实现这个接口。这意味着您可以拥有ArrayList<BagItem>(或其他集合)。

在我看来,对此的真正好处是可以在界面级别定义常见行为,而不仅仅是能够将随机内容填充到包中。如果将物品放入给定的包/收藏品之间没有任何共同的功能,那么如果可以选择,可以考虑让一个以上的包(或者包里的“口袋”?)。