Switch语句不会默认

时间:2014-11-05 19:06:53

标签: java switch-statement

我一直致力于骑士旅行问题的实施,并且在我的代码中遇到了一个小问题。

我遇到的问题是我的switch语句。我很困惑为什么在它经历了所有可能的移动之后,并且没有更多的工作,它不会像我想要的那样违约。相反,它打印出最后一块板,但保持正常运行,所以我必须取消构建。

任何帮助将不胜感激!

我的目标是让它显示“不再有可能的动作”。当它无法在其他任何地方移动时,而不是永远运行。

以下是输出的示例:它在左下角的53处停止。

1  0  41  34  3  38  23  36  
42  33  2  39  44  35  46  21  
7  40  43  4  19  22  37  24  
32  11  6  0  26  45  20  47  
0  8  0  18  5  16  25  0  
10  31  12  51  14  27  48  0  
53  0  9  30  17  50  15  28  
0  0  52  13  0  29  0  49  
BUILD STOPPED (total time: 0 seconds)

这是我的开关代码:

public class MoveKnight extends Moves {

public int[][] moveTheKnight() {

    Moves switchBetweenMoves = new Moves();
    switchBetweenMoves.startingLocation();

    while (knight != 64) {
        int randomMove = 1 + new Random().nextInt(8);
        switch (randomMove) {
            case 1:
                switchBetweenMoves.firstMoveChoice();
                break;

            case 2:
                switchBetweenMoves.secondMoveChoice();
                break;

            case 3:
                switchBetweenMoves.thirdMoveChoice();
                break;

            case 4:
                switchBetweenMoves.forthMoveChoice();
                break;

            case 5:
                switchBetweenMoves.fifthMoveChoice();
                break;

            case 6:
                switchBetweenMoves.sixthMoveChoice();
                break;

            case 7:
                switchBetweenMoves.seventhMoveChoice();
                break;

            case 8:
                switchBetweenMoves.eighthMoveChoice();
                break;

            default:
                System.out.println("No more possible moves.");
                break;
        }
    }
    return board;
}
}

4 个答案:

答案 0 :(得分:2)

由于int randomMove = 1 + new Random().nextInt(8); ...

,永远不会执行默认情况

此处new Random().nextInt(8)的输出始终为0到7,因为8是独占的,因此1+new Random().nextInt(8)总是从1到8不等!

仅当要匹配的参数与任何情况都不匹配时才执行默认情况,在这种情况下它将传递给默认值。但是,你已明确提到1到8的情况---因此,default将不会出现!

  

nextInt(int n)方法用于统一获取伪随机数   在0(包括)和指定值之间分配int值   (独占),从这个随机数生成器的序列中提取。

答案 1 :(得分:1)

在这种情况下,您的switch语句中的default案例似乎 是检查完成情况的正确位置。

相反,我会专注于你的while语句中的条件。目前,它是以下内容:

while (knight != 64) {

您还可以使用break语句来突破您的while循环

如果我猜测,knight的值是它所经过的平方数,顺便说一句,这就是我构建while循环的方式

while(knight < 64)
{
    if(/*you have no more moves*/)
    {
        System.out.println("No more possible moves.");
        break;
    }

    //logic for moving
}

default与任何案例都不匹配时,您的代码只会转到randomMove案例。

但是,您定义randomMove

的方式
int randomMove = 1 + new Random().nextInt(8);

情况永远不会是这样

答案 2 :(得分:0)

Random.nextInt(8)生成0-7范围内的值,因为参数是 exclusive

你的代码加1,永远不会产生大于8的数字。

一切都按预期行事。

答案 3 :(得分:0)

Random.nextInt(int n):从这个随机数生成器的序列中返回一个伪随机,均匀分布的int值介于0(含)和指定值(不包括)之间

您的randomMove变量在1到8之间变化。default大小写只会在randomMove < 1randomMove > 8时执行。

如果我理解你的代码,建议你改变你的条件:

while (knight != 64 && switchBetweenMoves.hasValidMoves())

当且仅当存在有效移动时,hasValidMoves才返回true,这些移动都是骑士范围内尚未被访问的移动。