2014-11-05 106 views
-1

我一直在努力實現騎士的巡視問題,並且在我的代碼中遇到了一個小問題。Switch語句不會默認

我的問題是我的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; 
} 
} 
+0

就會去默認情況下'randomMove'不是'1'和'8'(含)之間。我在代碼中沒有看到任何可以防止出現這種情況的東西 – 2014-11-05 19:11:08

+0

問題仍然不清楚---你是否想讓switch語句中的'default'運行?如果問題是這樣的,那麼這是不可能的... – 2014-11-05 19:11:12

+0

而不是[反覆提問這些問題](http://stackoverflow.com/questions/26762449/knights-tour-random-move-picker-not-working) ,請查看關於[控制流程語句](http://docs.oracle.com/javase/tutorial/java/nutsandbolts/flow.html)的官方教程以及['Random'](http:/ /docs.oracle.com/javase/7/docs/api/java/util/Random.html)。請參閱[本文](http://meta.stackoverflow.com/a/261593/616460)以獲取更多關於在發佈之前應該執行的操作的信息。 – 2014-11-06 04:16:07

回答

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值和指定值 (不含),從該隨機數生成器的序列繪製。

0

Random.nextInt(8)產生的值的範圍是0-7,因爲該參數是獨家

您的代碼,它增加了1到,不能產生數比8 ​​

更大一切如預期的那樣表現。

+0

好吧,所以我仍然需要一種方法來打破我的switch語句,而當語句到達'default.'時? – 2014-11-05 19:15:43

+0

@ ChristopherSpencer-除非您更改代碼,否則它不會運行默認運行次數! – 2014-11-05 19:16:54

+0

沒有默認值 - 沒有必要。所有你會失去的是println。 – Bohemian 2014-11-05 19:18:46

0

Random.nextInt(INT N):返回一個僞隨機,介於0(含)均勻分佈的int值和指定值(不含),從該隨機數生成器的序列繪製。

您的randomMove變量介於1和8之間。default僅在randomMove < 1randomMove > 8這個情況下才會執行。

建議更改而有條件要上,如果我理解正確你的代碼:

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

當且僅當存在有效的行動,這是在騎士的範圍哪些還沒有全部上移動時,hasValidMoves返回true已經被訪問過。

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); 

這將永遠是這樣

+0

你有什麼建議如何解決這個問題? – 2014-11-05 19:19:01

+0

我將如何實現'/ *你沒有更多動作* /'部分?我想要做這樣的事情,但我無法弄清楚。 – 2014-11-05 19:31:14