【问题标题】:JAVA, Switch case takes two entries to workJAVA,Switch case需要两个条目才能工作
【发布时间】:2014-01-17 19:30:24
【问题描述】:

所以我现在正在用 JAVA 制作一个基于文本的冒险游戏。我的代码有一个小问题,这使得游戏的游戏玩法非常烦人。当玩家输入命令时,例如“向北走”,第一次就可以正常工作。但第二次,它不起作用。它不显示我的默认开关盒,因此它可以识别该命令。当我再次输入相同的命令时,例如“向北走”,它再次起作用。所以它第一次不起作用,但是再输入一次就可以了。有没有办法让它不需要两个输入就可以工作? 这是我的代码:

//// USER INPUT TIME ////

System.out.println(">_");
playerCommand = input.nextLine();
loop: while (loopInt > 0) {
    switch (input.nextLine()) {
    case "go north":
    case "n":
        alleywayGoNorth();
        break loop;
    case "go south":
    case "s":
        alleywayGoSouth();
        break loop;
    case "open door":
    case "o door":
        alleywayOpenDoorLocked();
        break loop;
    default:
        System.out.println("That command is not valid at the moment.");
        break;
    }
} 

////////

【问题讨论】:

  • 您正在读取输入两次。 playerCommand = input.nextLine(); 读取第一行。 switch (input.nextLine()) 读取下一行。我建议您将playerCommand = input.nextLine(); 移到while 循环中,然后将开关更改为switch (playerCommand)
  • 删除loop: 标签将导致while 循环继续执行(假设loopInt 大于0)。我猜这意味着在循环上使用带有标签的break 会导致您跳出整个循环,这看起来像是您不想要的。
  • @mdl ,这实际上是我想要的。没有循环:和中断循环;下次它不会再次要求用户输入。它只会运行我的默认情况。
  • @user3207994 我很清楚...您希望用户被一遍又一遍地提示命令,对吗?目前您的问题是第一次输入命令时没有任何反应?如果我理解正确,这是因为playerCommand = input.nextLine() 行。用户输入输入,存储在playerCommand,然后你什么也不用做;而是在switch 语句中再次提示。我建议你删除loop: 标签,并删除playerCommand 这一行。
  • @mdl 我没有事先按回车键,但我有一个更早的输入,要求输入具有额外系统输出的名称。摆脱它,输入有效! :) 谢谢你的帮助。我的代码按照现在应该的方式工作。

标签: java while-loop switch-statement


【解决方案1】:

你的 for 循环的逻辑是错误的。将switch (input.nextLine()) 更改为switch (playerCommand),然后在switch 语句的末尾添加playerCommand = input.nextLine()。此外,请删除 break 语句中对循环的所有引用。

【讨论】:

  • 此方法无效。当我这样做时,它会自动输出我的默认情况两次,甚至不等待输入。
  • 这是不可能的。 input.readLine() 是一个阻塞调用,因此在给出一些输入之前程序不会越过它。你的 loopInt 变量是什么?它来自哪里?
  • loopInt 只是我在 Variables.java 文件中设置的一个 int。这个 switch case 所在的主类扩展了变量。 loopInt 为 100,因此它始终大于 0。
【解决方案2】:

您的行“错开”了一个,因为您检索了两次输入。

变化:

switch (input.nextLine()) {

switch (playerCommand) {

【讨论】:

  • 不。这使我的默认案例无限期地打印到屏幕上:c
  • 我认为这是因为您的默认原因是 break 而不是 break loop
  • 我这样做是因为如果用户输入了无效的命令,我希望它返回到循环的开头,以便他们可以重试。那些有中断循环的工作,因此将它们从循环中发送到一个新的循环中。
【解决方案3】:

你得到了玩家的输入两次。一次是在初始化“playerCommand”时,一次是在创建 switch 语句时。去掉 playerCommand 初始化,替换成 switch 语句。

switch(playerCommand = input.nextLine()) {
    ...
}

如果你仍然不需要“playerCommand”变量,你可以使用:

switch(input.nextLine()) {
    ...
}

【讨论】:

  • 这些都不起作用。它们都导致我的 Switch 在不等待输入的情况下运行默认情况。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2011-03-15
  • 2020-12-07
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多