我现在正在上Java类,我们应该做一个基于文本的游戏。我们游戏中的选项之一是允许该人在3种船只类型之间进行选择;小,中和大。根据他们的选择,他们将能够选择有多少人乘船旅行。小允许最多3个,中允许最多6个,大允许最多9个。一旦做出选择,他们就可以为每个机组成员输入名称并选择研究专业。以前,我们将这些设置为单独的菜单(选择“舰船”,“船员人数”,“研究规格”和“名称”),但我开始认为在同一菜单中选择船员人数,姓名和研究规格会更容易。

也就是说,我们现在正在处理array / ArrayLists,我们应该使用数组列出游戏中的角色(NPC)。因此,我需要弄清楚如何根据选择的机组人员数(1至9之间)创建一个数组,然后让其提示输入名称,然后允许他们从研究规格列表中​​进行选择。他们将输入一个字母以供选择,但阵列应在其中输入研究规格的全名。我在另一篇文章中找到了一些代码,我认为在这种情况下可能会有所帮助,但这几乎没有触及到我的想法。任何帮助将不胜感激。

 public class Name {
    public static void main(String[] args) {
        ArrayList<String> name = new ArrayList<String>();
        ArrayList<(how do I tell it to select a character option here?)> researchSpec = new ArrayList<(selected option)>();
        Scanner sc = new Scanner(System.in);
        while (true) {
            System.err.println("Please enter the name of your crew member: ");
            name.add(sc.next());
            System.out.println("Please select a Science Specialization for your crew member");
            researchSpec.add(sc.next());
        }
    }
}

最佳答案

当您为某个事物准备了少量的预定义的可能值时,enum通常是表示这些值的理想选择。

public enum Specialization {
    PHYSICS,
    CHEMISTRY,
    BIOLOGY
}


现在,您可以定义类型为Specialization的变量和类型为List<Specialization>的列表,并将值引用为Specialization.PHYSICS等。这比使用String更好,因为您不会冒以下风险:例如在代码中的某个地方拼写了一个特殊化的拼写错误,例如将"Pysics"添加到列表中的某个位置,并想知道为什么if (specialization.equals("Physics"))永远无法工作。

但是,从字母到专业化的映射仍然需要一些ifswitchMap-除非您喜欢枚举。枚举实际上是一个类,但是您不能在其上使用new-而是,每个标识符自动有一个实例(在这种情况下,PHYSICSCHEMISTRYBIOLOGY是仅有的三个实例) 。您可以将字段,构造函数和方法添加到枚举类,以便可以为每个值赋予不同的属性:

public enum Specialization {
    PHYSICS('p', "Physics"),
    CHEMISTRY('c', "Chemistry"),
    BIOLOGY('b', "Biology");

    private char menuLetter;
    private String displayName;

    private Specialization(char menuLetter, String displayName) {
        this.menuLetter = menuLetter;
        this.displayName = displayName;
    }

    public char getMenuLetter() { return menuLetter; }

    public String getDisplayName() { return displayName; }
}


您可以使用values()来获取所有值的列表。例如,这将生成菜单选项(我将把选择内容留给您作为练习):

for (Specialization s : Specialization.values()) {
    System.out.println(s.getMenuLetter() + ": " + s.getDisplayName());
}


编辑:或定期循环:

Specialization[] specializations = Specializations.values();
for (int i = 0; i < specializations.length; i++) {
    System.out.println(specializations[i].getMenuLetter() + ": " + specializations[i].getDisplayName());
}

10-07 21:05