2014-11-05 6 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' включительно. Я ничего не вижу в вашем коде, чтобы это не было. –

+0

Вопрос мне до сих пор неясно --- хотите ли вы заставить свой 'default' в операторе switch запускать? Если вопрос таков, тогда это невозможно ... –

+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) для получения дополнительной информации о том, что вы должны сделать перед публикацией здесь. –

ответ

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 не будет входить в картину!

The (Int N) Метод nextInt используется, чтобы получить псевдослучайный, равномерно распределенную значения INT от 0 (включительно) и указанного значение (исключительного), составленного из последовательности этого случайного числа генератора.

0

Random.nextInt(8) производит значения в диапазоне 0-7, потому что параметр является эксклюзивным.

Ваш код, который добавляет 1 к этому, никогда не может производить больше, чем число 8.

Все ведет себя, как ожидалось.

+0

Итак, мне все же нужен способ вырваться из моего оператора switch и while, когда он доходит до 'default.'? –

+0

@ ChristopherSpencer-Он никогда не будет запускать по умолчанию, сколько раз вы запускаете, если вы не измените код! –

+0

Не имеет значения по умолчанию - нет необходимости. Все, что вы потеряете, это println. – Bohemian

0

Random.nextInt (Int N): Возвращает псевдослучайный, равномерно распределенное значение INT от 0 (включительно) и указанного значения (исключительный), составленное из последовательности этого случайного числа генератора.

Ваша переменная randomMove варьируется от 1 до 8. default Корпус будет выполняться только в том случае, если randomMove < 1 или randomMove > 8, который никогда не используется.

Предложение изменить ваш пока условно к, если я понимаю ваш код правильно:

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

где hasValidMoves возвращает истину, если и только если существуют действительные ходы, которые все движется в пределах рыцаря, не имеющие уже были посещены.

1

В этом случае, как и в случае с оператором switch, default имеет , а не.

Вместо этого я бы сосредоточился на состоянии в вашем заявлении while. В настоящее время, это следующее:

while (knight != 64) { 

Вы также можете использовать break заявление, чтобы вырваться из вашего времени цикла

, если бы я был догадаться, значение knight, сколько квадратов это было на, идя что это, как я мог бы структурировать while петлю

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

    //logic for moving 
} 

Ваш код будет идти только к default case, если randomMove не соответствует ни одному из случаев.

Однако способ определения randomMove

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

Это никогда не будет в случае

+0

Есть ли у вас какие-либо предложения по устранению этого? –

+0

Как я могу реализовать '/ * у вас больше нет ходов * /' part? Я хотел сделать что-то подобное, но я не мог понять, как это сделать. –

Смежные вопросы