2013-09-23 2 views
0

Итак, я пишу программу, в которой кто-то рисует карты из колоды. Поэтому я написал цикл while, который проходит цикл и проверяет, есть ли более 4 случайно созданных карт, и если есть, измените карту.java while loop not break out

вот мой код:

String card = (int)Math.ceil(Math.random() * 13) + " "; 
String[] used2 = used.split(" "); 
//used is a String like "12 3 7 8 4 ... # etc" such that it is all the previously drawn cards. 
boolean checking = true; 
boolean isIn = false; 
int in = 0; 
int check = 0; 
while(checking){ 
    for(int q = 0; q < used2.length; q++){ 
     check += 1; 
     if(card.equals(used2[q] + " ")){ 
      in += 1; 
      if(in == 4){ 
       System.out.println(check); //debugging line 
       check += 1; 
       card = (int)Math.ceil(Math.random() * 13) + " "; 
       card_val = (int)Math.ceil(Math.random() * 13); 
       isIn = true; 
       in = 0; 
       break; 
      } 
     } 
    } 
    if(isIn){ 
     //will execute if there is 4 of the cards already drawn so the while loop continues with a different card 
     checking = true; 
    } 
    else{ 
     //breaks out of while loop because the card can be drawn 
     checking = false; 
    } 
} 
used += card; 

Теперь это работает, но когда я положил его внутри для цикла и установите его, чтобы работать как в 40 раз, примерно 2/3 времени он создает бесконечный цикл.

Я обнаружил, что бесконечный цикл создается только в том случае, если утверждение if(in == 4)1 является истинным.

Почему это? С прошлой ночи я отлаживался, и я не могу понять это.

+1

Более чистый способ написания оператора 'if-else':' check = isIn; ' – Bucket

+1

Поскольку вы устанавливаете' isIn' в 'true' в этом блоке, что означает, что' проверка' никогда не будет установлена ​​в 'false' , – GriffeyDog

+0

Также комментарий к '(int) Math.ceil (Math.random() * 13) +" "'. Я подозреваю, что ваша причина для '' '' заключается в том, чтобы преобразовать int в String, но вы можете делать только '+" ", что делает код более простым впоследствии. –

ответ

6

Как только вы установили isIn на номер true, вы никогда не устанавливали его на false. Итак, оператор if внизу будет устанавливать checking на true, что приведет к бесконечному циклу.

isIn до false в начале цикла while.

while(checking){ 
    isIn = false; // Add this line. 
    for(int q = 0; q < used2.length; q++){ 
+0

спасибо !!! Я соглашусь на это через 10 минут, когда мне разрешат –

0

Представляется сложным алгоритмом для простой задачи.

Почему бы не изменить реализацию, чтобы использовать простое вычитание? Первоначально выделяйте List из всех 52 значений, затем, когда вы «рисуете» карты из колоды, удалите их из списка.

Затем вы можете использовать Math.random() * list.size(), чтобы получить соответствующий показатель?

+0

. Я еще не изучил списки, это проблема hw, мы даже не изучили массивы, я только что узнал метод split, поэтому использовал его для манипулирования строка проще –