2017-01-05 2 views
2

Этот цикл работает иногда, а иногда и нет. может ли кто-нибудь понять, почему? Я чувствую, что он должен начинать цикл и продолжать цикл, пока сумма дилеров больше 17 и не ударит по блоку else. как только он переходит в блок else, он должен обновить значение результата. однако иногда он перескакивает в блок else, а затем переходит прямо к console.log(outcome) и говорит мне, что он не определен. иногда он вернет правильный результат. например он выдает «выигрыш дилера»! Я чувствую, что я встретил все условия? Я даже положил в console.logs, и строка dealersTotal = total обновилась правильно. почему это не непрерывный цикл?while loop дает странные результаты

dealerTwisted =() => { 
    let dealersTotal = this.state.dealersOverallTotal; 
    let playersTotal = this.state.playersOverallTotal; 
    let looping = true; 
    let outcome = ''; 
    while(looping){ 
     if(dealersTotal < 17){ 
     this.deal2Dealer(); 
     let dealersDeck = this.state.dealersDeck; 
     let newDealersDeckTotal = []; 
     for (var i=0; i < dealersDeck.length; i++){ 
      newDealersDeckTotal.push(dealersDeck[i].rankValue) 
     } 
     let total = newDealersDeckTotal.reduce(function(a, b) { 
      return a + b; 
     }, 
     0); 
     dealersTotal = total; 
     } 
     else { 
     if(dealersTotal > 21){ 
      outcome = 'player wins!'; 
      break; 
     } 
     else if(playersTotal > dealersTotal){ 
      outcome = 'player wins!'; 
      break; 
     } 
     else if (playersTotal == dealersTotal){ 
      outcome = 'tie!'; 
      break; 
     } 
     else if (dealersTotal > playersTotal){ 
      outcome = 'dealer wins!'; 
      break; 
     } 
     else { 
      console.log('got here'); 
      break; 
     } 
     } 
     console.log(outcome); 
     this.setState({resultOutcome: outcome}) 
     break; 
    } 
    }; 

EDIT: Думаю, я понял это. Он должен войти в первый, если и затем он попадает в перерыв в конце большого другого. ОДНАКО, проблема по-прежнему в том, что мне нужно, чтобы она зацикливалась и только ломалась, когда все условия были покрыты. решение?

+0

Если я правильно читать это, ваш цикл всегда будет иметь только один итерацию из безусловного 'break' в конце. –

+0

@NikolaNovak, вы правы, так как я могу изменить это, чтобы достичь того, чего хочу? –

ответ

0

Вы устанавливаете looping на false в любом месте? Я не вижу этого. Если нет, попробуйте установить looping на false в конце большого блока else.

Пример:

else { 
     if(dealersTotal > 21){ 
      outcome = 'player wins!'; 
     } 
     else if(playersTotal > dealersTotal){ 
      outcome = 'player wins!'; 
     } 
     else if (playersTotal == dealersTotal){ 
      outcome = 'tie!'; 
     } 
     else if (dealersTotal > playersTotal){ 
      outcome = 'dealer wins!'; 
     } 
     else { 
      console.log('got here'); 
     } 
     console.log(outcome); 
     this.setState({resultOutcome: outcome}); 
     looping = false; 
    } 
+0

. Поломка не делать тот же предмет? –

+0

Вы должны удалить все перерывы на большом другом, как Al. G. предлагает, а вместо этого устанавливает цикл в false, как только программа должна закончиться. (В конце большого else) –

+1

@Theworm, 'break' немедленно выходит из первого замкнутого цикла, тогда как установка' looping = false' завершит текущую итерацию, а затем закончит цикл, потому что условие цикла будет 'false' , Условие петли проверяется только в начале итерации в этом случае. –

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