1

我必须编写一个程序来制作一个二维数组并将其打印出来。然后我应该引导一个“角色”穿过这个迷宫。所以我想让它向上/向下/向左/向右移动。用户将被允许输入 u/U/d/D/l/L/r/R。

我输入是为了如果其中一个没有输入,它会给我一个错误。但是,如果它输入正确,它仍然会给我一个错误。

char move;                                          
    System.out.println("Which way do you want to move?  U/D/L/R");
    move=stdin.nextLine().charAt(0);
    while(move != 'u' || move !='U') {
        while( move != 'd' || move != 'D'){ 
            while( move != 'l' || move != 'L'){
                while(move != 'r' || move != 'R'){
                    System.out.println("Invalid input. Try again.");
                    move = stdin.nextLine().charAt(0);
        }}}}
4

3 回答 3

2

尝试这个:

Scanner stdin; 
stdin = new Scanner(System.in);

move = stdin.nextLine().charAt(0);;
move  = Character.toUpperCase(move);

    while(move !='U' && move != 'D' && move != 'L' && move != 'R' ) 
    {
                    System.out.println("Invalid input. Try again.");
                    move = stdin.nextLine().charAt(0);
                    move  = Character.toUpperCase(move);
    }

您当前的代码没有意义。如果我键入 R(例如),这将使程序进入无限循环。因为,上面的所有条件都将评估为真。因此,没有达到要求另一个输入(stdin.nextLine())的指令。

于 2013-02-11T04:32:42.203 回答
1

您也可以尝试以下方法(以不同的方式做同样的事情)。

连同其他字段声明:

private static final String keySet = "uUdDlLrR";

在方法内部:

char move = stdin.nextLine().charAt(0);
while (keySet.indexOf(move) == -1) {
    System.out.println("Invalid input. Try again.");
    move = stdin.nextLine().charAt(0);
}

它只是更具可读性,并且在您希望修改允许的键集的情况下几乎不需要更改。

于 2013-02-11T05:15:26.857 回答
0

语法有点奇怪(为什么是“while”而不是“if”?......以及为什么嵌套?)......但基本上你想用'&&'而不是'||'进行测试。

用英语:如果输入不是A 并且输入不是B,那么你想要错误。如果你做“或”,那么它总是会出错,因为其中一个不是总是正确的。

编辑:很容易犯错误——为了风格/清晰度,我建议:

switch (move) {
case 'u': case 'U':  
  /*up code*/    
  break;
case 'd'' case 'D':  
  /*down code*/  
  break;
case 'l'' case 'L':  
  /*left code*/  
  break;
case 'r'' case 'R':  
  /*right code*/ 
  break;
default: 
  System.out.println("Invalid input. Try again.");
  break;
}
于 2013-02-11T04:33:08.633 回答