Java 如何";计划;能装多种物品的袋子?

Java 如何";计划;能装多种物品的袋子?,java,data-structures,Java,Data Structures,我正在尝试使用java将棋盘游戏转变为多人游戏,但对于如何实现我的目标,我有几个问题 在游戏中,有一个袋子,里面装着生物、建筑物和魔法。每个玩家都从这个袋子里抽牌来获得他们的棋子。然后,他们要么把棋子放在他们马上拥有的游戏板上的瓷砖上,要么抓住棋子在以后玩。瓷砖可以容纳生物、魔法、建筑、堡垒 现在我有一个ArrayList,它保存了所有的生物,每个磁贴都有一个ArrayList,它可以保存生物 看起来ArrayList不是我想要使用的,因为我必须让ArrayList为Object类型(这很糟糕)

我正在尝试使用java将棋盘游戏转变为多人游戏,但对于如何实现我的目标,我有几个问题

在游戏中,有一个袋子,里面装着生物、建筑物和魔法。每个玩家都从这个袋子里抽牌来获得他们的棋子。然后,他们要么把棋子放在他们马上拥有的游戏板上的瓷砖上,要么抓住棋子在以后玩。瓷砖可以容纳生物、魔法、建筑、堡垒

现在我有一个ArrayList,它保存了所有的生物,每个磁贴都有一个ArrayList,它可以保存生物


看起来ArrayList不是我想要使用的,因为我必须让ArrayList为Object类型(这很糟糕)。关于如何设计我的程序,使我不必强制转换到对象,有什么想法吗?我不确定我是否需要一个包装类,或者只是多个数组列表,但令人困惑的是,当一个玩家从包含一堆不同东西的包中绘图时。我应该能够很容易地分辨出棋盘上移动的东西


有什么建议吗?

生物、建筑和魔法都能实现相同的接口或扩展相同的类吗?然后您可以拥有一个包含该接口或类的ArrayList。或者,只需要有一个包含三个ArrayList的数据结构,并编写在它们之间公平选择的代码。

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

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());
    }
}

并对照这些内置值检查它们

一个解决方案是创建一个接口,例如
BagItem
(它可以定义袋子中的物品将要执行的任何常见行为),并让每个生物、建筑、魔法等实现该接口。这意味着您可以拥有一个
ArrayList
(或其他集合)

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

在我看来,这样做的真正好处是可以在接口级别定义常见的行为,而不仅仅是能够将随机的东西塞进包中。如果在一个给定的袋子/集合中的物品之间没有任何共同的功能,那么如果有选择的话,也许会考虑有一个以上的袋子(或者袋子里的口袋)。创建一个超类并将所有字符扩展到该类为什么
ArrayList
的类型是
Object
不好?“我必须让ArrayList的类型是Object(不好)”-为什么这样不好?这就是多态性(),它是面向对象编程最强大的功能之一。听起来你需要一个“Tile”接口/类。如果你想让玩家把他们放在棋盘上,那你就需要一个共享的超类了。看起来你有一个共同的超类型。不管你想叫它什么:游戏对象,BagItem,随便什么。有很多游戏都有这种类型的东西。例如,像魔术和口袋妖怪这样的交易纸牌游戏,有着截然不同的目的,但却被扔在一副牌里。基本上,任何一款游戏都有一个目录,玩家可以在里面放任何东西,然后移动东西。我认为后者实际上是个坏主意,因为它使代码更加复杂,而多态性可以更干净地解决问题。
ArrayList
@CmdrMoozy没有什么错拥有一个对象的ArrayList唯一的“坏”地方是它破坏了泛型的全部意义-是什么阻止了某人向包中添加非法类型?然后还必须使用instanceof来计算返回的内容,这比3个列表的小复杂性更难闻。不过这都是主观的,所以OP应该做最适合他头脑的事情。当然,一个定制的通用超类是正确的答案。然而,有合理的论据可以证明,泛型根本不是一种必要的语言特性,而多态性本身就实现了泛型的大部分功能(请参阅)。我想这主要是一个风格问题。扩展和拥有接口有什么区别?据我所知,接口迫使您实现某些函数,而扩展就是继承。我不知道在我的情况下哪一个更好。生物都是可玩的角色,可以互相战斗。建筑物提供收入,塔楼提供防御和收入。生物和建筑物都在袋子里,塔是用现金购买的,所以它们被分开存放,直到放在瓷砖上。我能看到他们唯一的共同点就是他们被放在板上后的瓷砖。我想这肯定符合我的需要。感谢您的洞察力和帮助!