枚举是否是在roguelike游戏中生成生物的正确工具?

时间:2015-12-15 20:03:37

标签: java enums roguelike

我正在开发一个roguelike游戏作为编程/数据库练习和爱好(因为我想拥有自己的" Dwarf Fortress"项目主宰我所喜欢的)。在尝试编写一个足够强大的系统来生成游戏中的各种生物时,我很早就陷入了困境。我开始很简单;假设我希望游戏能在某处吐出一只狼(FXML,所以控制器):

public class Controller {
    Creature pooch = new Creature(Species.WOLF);
}

现在,我希望能够通过仅指定它们的物种来产生这些普通动物,以便列举的是什么,不是吗?我想说明狼只吃肉,它们可能的体型(它们毕竟不是克隆,还有其他指定尺寸的地方?),以及它们的体型:

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;

    }

我想为狗,豺等重复使用相同的模式,所以我只传递体型,在另一个枚举中定义。

enum BodyPattern {

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

    LinkedList<BodyPart> bodyPartsList;

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

这是我真正迷失的地方(我实际上没有定义任何身体部位,因为我不确定如何继续)。这是我到目前为止BodyPart所拥有的:

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

组织层是构成身体部位的东西,并且分别为每个方向指定,以便例如对头部前方的攻击损坏面部,而从背部的攻击抵抗颈部/上部脊柱第一。我希望他们的厚度只能用相对的术语来定义,在生成时乘以生物的大小来生成实际大小,但正如我所说,我有点迷失,那我从哪里来这里?我应该将BodyPart重新分配为枚举吗?我应该完全制作另一个枚举吗?我完全不在赛道上,我应该使用一些不同的工具吗?

1 个答案:

答案 0 :(得分:3)

  

现在,我希望能够只产生这些普通动物   指定他们的物种,以便列举的是什么,不是吗?

我不敢,不。

枚举的最佳用例是枚举一组常量的对象,并且所有这些对象的编号在编译时都是已知的。枚举是理想的数据的一个例子是扑克牌或太阳系的行星。扑克牌套装和号码是固定的,不变的,并且事先已知。同样,太阳系中的行星也不会(经常)改变。

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