2017-10-03 7 views
1

私はコンピュータのランダムな色の選択とユーザーのクリックの反応を追跡するFreecodeCamp用の "Simon Says"プロジェクトをコーディングしています。"Simon Says"コンピュータのランダムな選択が正しく表示されない

しかし、私は問題に遭遇しています。 。 。私の色は、コンピュータがランダムに選択肢を実行したときに不透明度を不透明に戻すことはありません。

setTimeoutを色を不透明に戻すために、速くて遅い時間(たとえば10または1000ミリ秒)に変更しようとしましたが、うまくいきませんでした。

これは私の現在のコードです:

$(document).ready(function(){ 
 
var colors = [".red",".blue",".yellow",".green"]; 
 
var classVariable = []; 
 

 
$(".grass").click(function(){ 
 
    $(this).toggleClass(".grass").css("opacity",0.23); 
 
    if($(this).is('.red')){ 
 
\t var myAudio = new Audio('https://s3.amazonaws.com/freecodecamp/simonSound1.mp3'); 
 
       myAudio.play(); 
 
    }else if($(this).is('.blue')){ 
 
\t var myAudio = new Audio('https://s3.amazonaws.com/freecodecamp/simonSound2.mp3'); 
 
       myAudio.play(); 
 
    }else if($(this).is('.yellow')){ 
 
\t var myAudio = new Audio('https://s3.amazonaws.com/freecodecamp/simonSound3.mp3'); 
 
       myAudio.play(); 
 
    }else if($(this).is('.green')){ 
 
\t var myAudio = new Audio('https://s3.amazonaws.com/freecodecamp/simonSound4.mp3'); 
 
       myAudio.play(); 
 
    } 
 
    setTimeout(function(){ 
 
    $(".grass").css("opacity", 1); 
 
}, 100); 
 
}); 
 

 
function computerDisplay(){ 
 
for(var i = 0;i< colors.length;i++){ 
 
\t let ranSelect = colors[Math.floor(Math.random() * 4 /*colors.length*/)];console.log(ranSelect); 
 
    classVariable.push(ranSelect);console.log(classVariable); 
 
\t $(ranSelect).toggleClass(".grass").css("opacity",0.23); 
 
\t if($(ranSelect).is('.red')){ 
 
    setTimeout(function(){ 
 
var myAudio = new Audio('https://s3.amazonaws.com/freecodecamp/simonSound1.mp3'); 
 
       myAudio.play(); 
 
     },1000); 
 
\t }else if($(ranSelect).is('.blue')){ 
 
    setTimeout(function(){ 
 
\t var myAudio = new Audio('https://s3.amazonaws.com/freecodecamp/simonSound2.mp3'); 
 
       myAudio.play(); 
 
     },1000); 
 
    }else if($(ranSelect).is('.yellow')){ 
 
    setTimeout(function(){ 
 
\t var myAudio = new Audio('https://s3.amazonaws.com/freecodecamp/simonSound3.mp3'); 
 
       myAudio.play(); 
 
     },1000); 
 
    }else if($(ranSelect).is('.green')){ 
 
    setTimeout(function(){ 
 
\t var myAudio = new Audio('https://s3.amazonaws.com/freecodecamp/simonSound4.mp3'); 
 
       myAudio.play(); 
 
     },1000); 
 
    } 
 
var myAudio = new Audio('https://s3.amazonaws.com/freecodecamp/simonSound1.mp3'); 
 
       myAudio.play(); 
 
setTimeout(function(){ 
 
    $(ranSelect).css("opacity", 1); 
 
},500); 
 
} 
 
} 
 

 

 
$(".start").click(function(){ 
 
setTimeout(function(){ 
 
\t computerDisplay(); 
 
},1000); 
 
}); 
 

 
});
div{ 
 
    margin:0 auto; 
 
} 
 

 
.red{ 
 
\t width:100px; 
 
\t height:100px; 
 
\t background-color:red; 
 
} 
 

 

 
.blue{ 
 
\t width:100px; 
 
\t height:100px; 
 
\t background-color:blue; 
 
} 
 

 
.green{ 
 
\t width:100px; 
 
\t height:100px; 
 
\t background-color:green; 
 
} 
 

 
.yellow{ 
 
\t width:100px; 
 
\t height:100px; 
 
\t background-color:yellow; 
 
}
<html> 
 
    <head> 
 
    <script src = "https://ajax.googleapis.com/ajax/libs/jquery/1.12.4/jquery.min.js"></script> 
 
    <link href="https://maxcdn.bootstrapcdn.com/bootstrap/3.3.7/css/bootstrap.min.css" rel="stylesheet" integrity="sha384-BVYiiSIFeK1dGmJRAkycuHAHRg32OmUcww7on3RYdg4Va+PmSTsz/K68vbdEjh4u" crossorigin="anonymous"> 
 
    <link rel="stylesheet" href="fsp.css" type="text/css" /> 
 
    <script src="fsp.js"></script> 
 
    <body> 
 
    <div class="container text-center"> 
 
    <div class="row"> 
 
    <div class="red col-xs-6 grass"></div> 
 
    <div class="blue col-xs-6 grass"></div> 
 
    </div> 
 
    <div class="row"> 
 
    <div class="green col-xs-6 grass"></div> 
 
    <div class="yellow col-xs-6 grass"></div> 
 
    </div> 
 
    </div> 
 
    <div class="start"> 
 
    <button>start</button> 
 
    </div> 
 
    </body> 
 
    </head> 
 
</html>

+2

をあなたが問題を明確にもらえますか? 「開始」をクリックすると、ランダムに四角形を選択してサウンドを再生し、四角形が短く透明になり、次に不透明に戻ります。期待される行動や発散する場所を説明できますか? – ryachza

+0

コンピュータによってランダムな四角形が選択されている場合、サウンドファイルの再生以上の問題が発生しています。色は一度に1つずつ点灯しません。代わりに3色または2色が一度に点灯します。返信ありがとうございます。 – AJAX101

+0

その動作を複製できません。私は 'classVariable'が一度だけ追加されているので、複数の正方形のライトが見えることはありません。繰り返しはありません。質問のコードは最新のものですか? 'classVariable'を反復して一度に1つずつ点灯させたい場合は、タイムアウト後に後続の各インデックスを処理する必要があります。 – ryachza

答えて

0

あなたのコードでは、色を反復処理し、ランダムな色を選択それぞれについて、それをトリガーするので、1-4 [異なっていましたランダムに選択されたものが一度にトリガされます。代わりに、私はstartをクリックするたびにランダムな色をclassVariableにプッシュし、それらを繰り返すと思います。しかし、ループを繰り返すだけでは、ループを繰り返すことはできません。それぞれの間に遅延が必要なためです。したがって、次の反復のためにそれ自身setTimeout自身を使用する関数を使用します。

はこのJavaScriptを試してみてください:

$(document).ready(function(){ 
    var colors = ['.red','.blue','.yellow','.green']; 
    var classVariable = []; 

    $(".grass").click(function(){ 
    $(this).toggleClass(".grass").css("opacity",0.23); 
    if($(this).is('.red')) 
    { 
     var myAudio = new Audio('https://s3.amazonaws.com/freecodecamp/simonSound1.mp3'); 
     myAudio.play(); 
    } 
    else if($(this).is('.blue')) 
    { 
     var myAudio = new Audio('https://s3.amazonaws.com/freecodecamp/simonSound2.mp3'); 
     myAudio.play(); 
    } 
    else if($(this).is('.yellow')) 
    { 
     var myAudio = new Audio('https://s3.amazonaws.com/freecodecamp/simonSound3.mp3'); 
     myAudio.play(); 
    } 
    else if($(this).is('.green')) 
    { 
     var myAudio = new Audio('https://s3.amazonaws.com/freecodecamp/simonSound4.mp3'); 
     myAudio.play(); 
    } 
    setTimeout(function(){ 
     $(".grass").css("opacity", 1); 
    },100); 
    }); 

    function doTheThing(index) 
    { 
    if(index < classVariable.length) 
    { 
     var target = $(classVariable[index]); 
     var myAudio = new Audio('https://s3.amazonaws.com/freecodecamp/simonSound1.mp3'); 

     if(target.is('.red')) 
     { 
     myAudio = new Audio('https://s3.amazonaws.com/freecodecamp/simonSound1.mp3'); 
     } 
     else if(target.is('.blue')) 
     { 
     myAudio = new Audio('https://s3.amazonaws.com/freecodecamp/simonSound2.mp3'); 
     } 
     else if(target.is('.yellow')) 
     { 
     myAudio = new Audio('https://s3.amazonaws.com/freecodecamp/simonSound3.mp3'); 
     } 
     else if(target.is('.green')) 
     { 
     myAudio = new Audio('https://s3.amazonaws.com/freecodecamp/simonSound4.mp3'); 
     } 

     target.toggleClass(".grass").css("opacity",0.23); 
     setTimeout(function(){ 
     myAudio.play(); 
     },250); 
     setTimeout(function(){ 
     $(target).css("opacity",1); 
     doTheThing(index + 1); 
     },500); 
    } 
    } 

    function computerDisplay() 
    { 
    classVariable.push(colors[Math.floor(Math.random() * colors.length)]); 
    console.log(classVariable); 

    doTheThing(0); 
    } 


    $(".start").click(function(){ 
    setTimeout(function(){ 
     computerDisplay(); 
    },1000); 
    }); 
}); 
+0

ありがとうございましたこの問題は私に大きなストレスを引き起こしていました。 forループが色の照明を遅らせることはないとは思わなかった。 – AJAX101

+0

@ AJAX101ほとんどの環境では、 'for'ループ本体の中で' sleep 'のようにして遅延させることができます。私の知る限りでは、JavaScriptはそのオプションをサポートしておらず、代わりに 'setTimeout'を使って継続スタイルを使う必要があります:"これは将来のX時間に実行される計算の残りの部分です "。 – ryachza

+0

@ AJAX101また、これで問題が解決した場合は、その回答を受け入れることができますか? – ryachza

関連する問題