JAVA,Switch case需要两个条目才能工作

JAVA,Switch case需要两个条目才能工作,java,while-loop,switch-statement,Java,While Loop,Switch Statement,所以我现在正在用JAVA制作一个基于文本的冒险游戏。我的代码有一个小问题,这使得游戏的游戏性非常烦人。当玩家输入一个命令时,比如“向北”,第一次就可以正常工作。但是第二次,它不起作用。它不显示我的默认开关盒,因此它可以识别该命令。当我输入相同的命令时,例如“向北”,同样有效。所以它第一次不起作用,但只要再输入一次,它就会起作用。有没有办法让它不需要两个输入就可以工作? 这是我的密码: //// USER INPUT TIME //// System.out.println(">_");

所以我现在正在用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;
    }
} 

////////

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

行被“交错”了一行,因为您检索了两次输入

更改:

switch (input.nextLine()) {


您将获得玩家的两次输入。在初始化“playerCommand”和创建switch语句时各一次。删除playerCommand初始化,并将其替换为switch语句

switch(playerCommand = input.nextLine()) {
    ...
}
如果您不再需要“playerCommand”变量,可以使用:

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

您正在读取输入两次<代码>playerCommand=input.nextLine()读取第一行<代码>开关(input.nextLine())读取下一行。我建议您移动
playerCommand=input.nextLine()进入while循环,然后将开关更改为
开关(playerCommand)
删除
循环:
标签将导致
while
循环继续执行(假设
loopInt
大于0)。我想这意味着在循环上使用带有标签的
break
,会导致您中断整个循环,这看起来是您不想要的。@mdl,这正是我想要的。没有循环:和中断循环;下次它将不再要求用户输入。它将只运行我的默认情况。@user3207994,这样我就清楚了。。。您希望反复提示用户输入命令,对吗?现在你的问题是,第一次输入命令时,什么都没有发生?如果我理解正确的话,这是因为playerCommand=input.nextLine()
行。用户输入存储在
playerCommand
中的输入,然后您不使用它做任何事情;而是在
开关
语句处再次提示。我建议您删除
循环:
标签,并删除
playerCommand
行。@mdl我事先没有按enter键,但我有一个更早的输入,要求输入包含额外sysout的名称。去掉这些,输入就起作用了!:)谢谢你的帮助。我的代码现在应该是这样工作的。这个方法不起作用。当我这样做时,它会自动输出我的默认案例两次,甚至不等待输入。这是不可能的。readLine()是一个阻塞调用,因此在给出某些输入之前,程序不会通过它。什么是loopInt变量?它来自哪里?loopInt只是我在Variables.java文件中设置的一个int。这个开关案例所在的主类扩展了变量。loopInt是100,所以从现在起它总是大于0。不。这使得我的默认案例无限期地打印到屏幕上:cI假设这是因为您的默认原因是
中断
,而不是
中断循环
。我这样做是因为如果用户输入无效命令,我希望它返回循环的开始,以便他们可以重试。那些中断了循环的会工作,因此会将它们从循环中发送到新的循环中。这两种方法都不起作用。这两种情况都会导致我的交换机在不等待输入的情况下运行默认情况。
switch(input.nextLine()) {
    ...
}