2016-11-28 5 views
0

roll()という関数を作成しました。これはダイスのロールを扱います。私はロールの値を読んで、ロールが6回連続して2回連続してヒットするようにして、プレイヤーのターンを中断して次のプレイヤーに回すことを試みます。2つの連続した値がJavaScriptの変数の値と一致しているかどうかを調べる

私はダイス値を正しく読み取ることができますが、6行を2回チェックする方法を見つけようとしています。

これは私の関数である:

このようなボタンによってトリガーされる
roll = function(){ 
    if (gamePlaying){ 
     // 1. Get a random number 
     //var dice = Math.floor(Math.random() * 6) + 1; //1 to 6 randomly 
     var dice = 6; 

     //2. Display the result 
     var diceDOM = document.querySelector('.dice'); 
     diceDOM.style.display = 'block'; 
     diceDOM.src = 'images/' + 'dice-' + dice + '.png'; 

     //3. Update the roundScore IF the rolled number is not 1 

     // for type coersion, we need to use !== and not != 
     if(dice !== 1) { 
      //add score 
      roundScore += dice; // same as roundScore = roundScore + dice 
      //it outputs to a div of ID = #myId 
      document.querySelector('#current-' + activePlayer).textContent = roundScore; 
     } else { 
      alert('Next Player') 
      nextPlayer(); 
     } 

     // Is this right? 
     for(var i = 1; i >= 2; i++){ 
      if (dice == 6){ 
       console.log('sixes'); 
      } 
     } 

    } 
} 

document.querySelector('.btn-roll').addEventListener('click', function(){ 
    roll(); 

}); 

私はこのCODEPEN

P.S.にゲームをロードランダムな関数の下にdice = 6;を置くので、2つの6つを得るまでゲームをプレイする必要はありません。それをコメント解除し、ダイス=数学関数をコメントアウトすると、6つだけを得ることになります。

「これは正しいのですか? forループの先頭にコメントする。つまり、これは正しいアプローチですか?私はループを試し続けなければならないのでしょうか、すでに私は離れていますか? score[]に渡されている。しかし、私はそれを行うことができます

ところで

、2シックスが出てくる行う場合、全体のスコアが削除されては...私は笑

多くのおかげだと思います。

+1

1つのロールよりも長く持続する必要がある値(スコアといくつのロールが数えられたかについてのカウンター)は、関数よりも高いスコープを持つ変数に格納する必要があります。そうすれば、あなたの関数は、新しいロールが起こったときにこれらの値をチェックし、それに応じて機能することができます。 –

+0

'for(var i = 1; i> = 2; i ++){' =>何をしようとしていますか?これは決して真実ではない – Fefux

+0

@Fefux私は努力している。 – LOTUSMS

答えて

1

roll()を自己呼び出し関数にすることができます。そうすれば、あなたは6回巻かれた回数を保存することができます。

roll = (function(){ 

    var count = 0; 
    var lastRoll = 0; 

    return function() { 

    if (gamePlaying){ 

      // 1. Get a random number 
      var dice  = Math.floor(Math.random() * 6) + 1; //1 to 6 randomly 
      var thisRoll = dice; 

      if(dice === 6) { 
       lastRoll = 6; 
       count += 1; 
      } else { 
       lastRoll = 0; 
       count = 0; 
      } 

      if(thisRoll === 6 && lastRoll === 6 && count === 2) { 
      alert('You rolled a six twice!'); 
      lastRoll = 0; 
      count = 0; 
      // do your stuff for 2 sixes in a row here! 
      return; 
      } 

     //2. Display the result 
     var diceDOM = document.querySelector('.dice'); 
     diceDOM.style.display = 'block'; 
     diceDOM.src = 'http://sitedev.online/repo/' + 'dice-' + dice + '.png'; 

     //3. Update the roundScore IF the rolled number is not 1 

     // for type coersion, we need to use !== and not != 
     if(dice !== 1) { 
      //add score 
      roundScore += dice; // same as roundScore = roundScore + dice 
      //it outputs to a div of ID = #myId 
      document.querySelector('#current-' + activePlayer).textContent = roundScore; 
      console.log(dice); 
     } else { 
      alert('Next Player') 
      nextPlayer(); 
     } 
    } 

    } 

})(); 
+0

これは非常に良いですが、何かが間違っていると思います。サイズ変数に渡されたランダム関数を使って試してみると、散発的に2 6個分の警告が出るようです。時にはワンクリックで。最初の6人を救って次の人を待っていて、それから2人の6人に警告することができますか?警告は、6人が連続しているときにのみ起こるはずです。 – LOTUSMS

+0

コードをコードに追加します – LOTUSMS

+0

問題点を知りました。それは6が2回転がっているかどうかをチェックしていますが、それが連続していない場合にもチェックします! – user2085143

1

ちょうどそれのために、これを行うにはグローバルまたは外部のヴァーサーは必要ありません。トリックは、関数がオブジェクトであることを覚えています。プロパティを読み書きできます。関数内から関数を完全に変更することもできます(これはトリックであり、古いJSシングルトンパターンになります)。

例を示します。あなたが "真"にフィードしていると言うならば、それは "最後の"参照値を更新し、2つのランダムなダイスロールを返します。もしそれを "偽"にすると、あなたは再び真を渡すまで(それでも新しいロールを返す)前の参照値を更新しません。そうすれば、ローリングを維持し、初期値を保持し、それを新しい2番目の値と比較することができます。

<html> 
<head> 
</head> 
<body> 

<script> 
    var rollfunc = function (updateLast) { 
     var d1 = Math.floor((Math.random() * 6) + 1); 
     var d2 = Math.floor((Math.random() * 6) + 1); 
     if (updateLast) { 
      rollfunc.d1 = d1; 
      rollfunc.d2 = d2; 
     } 

     return { 
      dice1 : d1, 
      dice2 : d2, 
      bothsixes : ((d1 + d2 === 6) && (rollfunc.d1 + rollfunc.d2 === 6)) 
     }; 
    } 

    var result = rollfunc (true); 
    // If you pass in true then d1, d2, and rollfunc.d1, rollfunc.d2 will always be the same 
    console.log ("Reference updated: ", result, "d1 = " + rollfunc.d1, ", d2 = " + rollfunc.d2); 
    var result = rollfunc (false); 
    // If you pass in false, the reference won't change, but the new roll will, you can compare the two 
    console.log ("Reference left alone: ", result, "d1 = " + rollfunc.d1, ", d2 = " + rollfunc.d2); 
</script> 
</body> 
</html> 

私はこれが過度に学業的かもしれないが、JSがこれを行うことができることを知ることは有用である。

+0

Tim、ありがとうございます。それが過度に学問的なことを心配しないでください。それは「大学」のことではありません。 udemy.comのオンラインチュートリアルです。私はそれが動作するかどうかを確認するためにこれをテストしていないが、私はそれを通過します。プラス1つのバディ – LOTUSMS

関連する問題