2017-01-05 5 views
2

このwhileループは時々動作しますが、時には動作しません。なぜ誰かが見ることができますか? 私はそれがループを開始する必要があり、ディーラーの合計が17以上になるまでループを維持し、elseブロックをヒットするように感じる。 elseブロックに入ると、結果値を更新するはずです。しかし、時々、それはelseブロックにジャンプし、次にconsole.log(outcome)にまっすぐジャンプし、それが未定義であると私に伝えます。正しい結果を返すこともあります。例えばそれは「ディーラー勝利! 私はすべての条件を満たすように感じますか? console.logsに入れても、dealersTotal = totalという行は正しく更新されます。なぜそれは連続的にループしていないのですか?whileループで奇妙な結果が出る

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

ループをどこでもfalseに設定していますか?私はそれを見ることができません。そうでない場合は、大きなelseブロックの最後にループをfalseに設定してみてください。

例:私はこれを正しく読んでいる場合

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

大きなelseのブレークをすべてAlとして削除する必要があります。 G.示唆し、代わりにプログラムが終了すると、ループをfalseに設定します。 (ループの最後に) –

+1

@Theworm、 'break'は最初の囲みループからすぐに抜け出しますが、' looping = false'を設定すると現在の反復が終了し、ループ条件が 'false'になるのでループを終了します。 。ループ条件はこの場合反復の開始時にのみチェックされます。 –