Java 枚举是在类似盗贼的游戏中生成生物的正确工具吗?

Java 枚举是在类似盗贼的游戏中生成生物的正确工具吗?,java,enums,roguelike,Java,Enums,Roguelike,我正在开发一款类似流氓的游戏,作为编程/数据库练习和业余爱好(因为我想拥有自己的“矮人堡垒”项目,任我支配)。我很早就被卡住了,当时我正试图编写一个足够强大的系统来生成游戏中的各种生物。我开始很简单;假设我想让游戏在某处吐出一只狼(FXML,so Controller): 现在,我想通过指定这些普通动物的物种来繁殖它们,所以这就是枚举的目的,不是吗?我想具体说明狼只吃肉,它们可能的体型(它们毕竟不是克隆体,还有哪里可以指定体型?),以及它们的体型: public enum Species {

我正在开发一款类似流氓的游戏,作为编程/数据库练习和业余爱好(因为我想拥有自己的“矮人堡垒”项目,任我支配)。我很早就被卡住了,当时我正试图编写一个足够强大的系统来生成游戏中的各种生物。我开始很简单;假设我想让游戏在某处吐出一只狼(FXML,so Controller):

现在,我想通过指定这些普通动物的物种来繁殖它们,所以这就是枚举的目的,不是吗?我想具体说明狼只吃肉,它们可能的体型(它们毕竟不是克隆体,还有哪里可以指定体型?),以及它们的体型:

public enum Species {
    // Canines
    WOLF(Diet.CARNIVORE, 1050, 1325, 1600, CANINE.BodyPattern);

    // Canine constructor
    Species(Diet diet, double bodySizeMultiplierMin, double bodySizeMultiplierAvg, double bodySizeMultiplierMax,
            BodyPattern bodyPattern) {
        this.diet = diet;
        this.bodySizeMultiplierMin = bodySizeMultiplierMin;
        this.bodySizeMultiplierAvg = bodySizeMultiplierAvg;
        this.bodySizeMultiplierMax = bodySizeMultiplierMax;

    }
我想对狗、豺狼等重复使用相同的模式,所以我只传递要在另一个枚举中定义的body类型

enum BodyPattern {

    CANINE(furryUpperBody, furryLowerBody, canineHead, canineMaw, canineLegs, furryTail);

    LinkedList<BodyPart> bodyPartsList;

    BodyPattern(BodyPart... args) {
        for (BodyPart  part : args) {
            bodyPartsList.add(part);
        }
    }
}
组织层是构成身体各部分的材料,并且分别为每个方向指定,例如,头部前部受到的攻击会损坏面部,而背部受到的攻击会首先攻击颈部/上脊柱。我只想用相对的术语来定义它们的厚度,一代一代地乘以生物的大小来生成实际的大小,但是正如我所说的,我有点迷失了,那么我该从这里走到哪里呢?是否应将BodyPart重新指定为枚举?我应该完全再做一次枚举吗?我是否完全偏离了轨道,是否应该使用其他工具

现在,我想只需要几分钟就可以繁殖这些普通的动物 指定它们的种类,这就是枚举的目的,不是吗

恐怕不行

枚举的最佳使用情形是枚举一组对象,这些对象是常量,所有这些对象的标识在编译时都是已知的。枚举是理想的一个数据示例是扑克牌或太阳系的行星。扑克牌套装和号码是固定的、不变的,并且是预先知道的。同样,太阳系中的行星也不会(频繁)变化

因为您希望能够在需要时动态创建对象,所以您希望在程序需要时使用普通类和构造函数来创建新对象(例如动物)。很难想象一个游戏事先知道它需要的所有动物(及其所有属性)

现在,我想只需要几分钟就可以繁殖这些普通的动物 指定它们的种类,这就是枚举的目的,不是吗

恐怕不行

枚举的最佳使用情形是枚举一组对象,这些对象是常量,所有这些对象的标识在编译时都是已知的。枚举是理想的一个数据示例是扑克牌或太阳系的行星。扑克牌套装和号码是固定的、不变的,并且是预先知道的。同样,太阳系中的行星也不会(频繁)变化


因为您希望能够在需要时动态创建对象,所以您希望在程序需要时使用普通类和构造函数来创建新对象(例如动物)。很难想象一个游戏预先知道它需要的所有动物(及其所有属性)。

我强烈建议使用指定
身体部位。此外,还可以复制阵列的防御性副本。为什么要使用枚举而不是类?我强烈建议使用来指定
BodyPart
。此外,还要对数组进行防御性复制。为什么要使用枚举而不是类?
enum BodyPattern {

    CANINE(furryUpperBody, furryLowerBody, canineHead, canineMaw, canineLegs, furryTail);

    LinkedList<BodyPart> bodyPartsList;

    BodyPattern(BodyPart... args) {
        for (BodyPart  part : args) {
            bodyPartsList.add(part);
        }
    }
}
public class BodyPart {

    public String name;

    private TissueLayer[] tissueLayersUp;
    private TissueLayer[] tissueLayersDown;
    private TissueLayer[] tissueLayersFront;
    private TissueLayer[] tissueLayersBack;
    private TissueLayer[] tissueLayersLeft;
    private TissueLayer[] tissueLayersRight;

    public BodyPart(String name, BodyPart[] appendages, int height, int width, int length, TissueLayer[] tissueLayersUp,
                    TissueLayer[] tissueLayersDown, TissueLayer[] tissueLayersFront, TissueLayer[] tissueLayersBack,
                    TissueLayer[] tissueLayersLeft, TissueLayer[] tissueLayersRight) {
        this.name = name;
        this.appendages = appendages;
        this.height = height;
        this.width = width;
        this.length = length;
        this.tissueLayersUp = tissueLayersUp;
        this.tissueLayersDown = tissueLayersDown;
        this.tissueLayersFront = tissueLayersFront;
        this.tissueLayersBack = tissueLayersBack;
        this.tissueLayersLeft = tissueLayersLeft;
        this.tissueLayersRight = tissueLayersRight;
    }
}