【问题标题】:create array of NPCs in a game在游戏中创建 NPC 数组
【发布时间】:2015-06-29 17:57:24
【问题描述】:

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

也就是说,我们现在正在处理数组/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());
        }
    }
}

【问题讨论】:

  • 您的船员是否被定义为他们自己的班级?如果你只是存储他们的名字。然后,您的两个 ArrayList 都将使用 String 作为它们的泛型类型。您可能想要做的是控制您的循环以允许它迭代并仅根据需要多次提示您。 ArrayList 没有最大大小的概念。所以你需要告诉你的程序什么时候停止添加新的工作人员。
  • 机组成员在他们自己的类(字符)中定义。该类存储他们的健康、描述、坐标、名称和研究规范。问题我正在弄清楚如何将角色的名称和研究规格(游戏开始后添加的信息)与其余信息一起放在角色文件中。至于控制一定数量的字符的循环,如果机组人员的数量可以根据用户输入进行更改,我不完全确定如何做到这一点。

标签: java arrays list


【解决方案1】:

当您有一组少量预定义的可能值时,enum 通常是表示这些值的理想选择。

public enum Specialization {
    PHYSICS,
    CHEMISTRY,
    BIOLOGY
}

现在,您可以定义Specialization 类型的变量和List&lt;Specialization&gt; 类型的列表,并将值称为Specialization.PHYSICS 等。这比使用String 更好,因为您没有运行例如的风险在代码中的某处拼写错误,例如将"Pysics" 添加到列表中的某个位置并想知道为什么if (specialization.equals("Physics")) 永远不起作用。

但是,您仍然需要一些 ifs、switchMap 用于从字母到专业的映射 - 除非您喜欢枚举。枚举实际上是一个类,但您不能在其上使用 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());
}

【讨论】:

  • 我可以在上面的代码中包含这些内容吗?以及如何从枚举中选择一个字母?枚举和数组概念非常新,我不确定一切都在点击我。
  • 啊,您在我回复问题时编辑了您的帖子 :)。感谢您澄清这一点。
  • for (Specialization s : Specialization.values()) 之间的冒号是什么意思?我尝试在枚举中使用它,它希望我创建一个值类。 . .也说非法启动类型。 . .所以很明显我做错了什么。
  • @Hiattech:这是一个enhanced for loop。如果Specialization 被正确定义为枚举,Specialization.values() 将为您提供枚举值的数组,您可以对其进行循环。 “在枚举中使用它”是什么意思?该循环应该在您的 main() 方法中。此外,枚举必须在自己的文件中;它本质上是一个类定义。
  • 在我回去看到你更新了你的帖子之前,我已经回复了你。我浏览了您更新的帖子,并能够回答我自己的问题。我仍然在让增强的 for 循环工作时遇到一些小问题,但我仍在继续阅读。
【解决方案2】:

根据选择创建一个数组然后填充它,如下所示:

NPC[] npcs;

if (amount > maximum) {// both values prompted
    System.our.println("Too much crew members.");
    return;
}

npcs = new NPC[amount];

for (int i = 0; i < npcs.length; i++) {
    String name = // prompt name
    Specialization s = // prompt that somehow -> enum solution by Aasmund Eldhuset
    npcs[i] = new NPC(name, s);
}

NPC 类如下所示:

public class NPC {
    public (final?) String name;
    public (final?) Specialization spc;

    public NPC(String name, Specialization s) {
        this.name = name;
        this.spc = s;
    }
}

【讨论】:

  • 运气不好。 'code' 公共类 ChooseCrewNamesView { Character[] Character; public Character[] getCharacter() { return Character; } public void setCharacter(Character[] Character) { this.Character = Character; } 字符 = 新字符 [ChooseCrewSizeView.crewSize] for (int i = 0; i
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2011-06-15
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多