2017-08-08 31 views
1

我试图让我的程序在不同的持续时间播放音频列表。从音频列表元素4开始,持续时间将取决于用户的选择,并且播放第一轮的范围为4到8的每个元素。 (所以第一轮,节目将播放元素4,5,...,8)。如何将用户的选择设置到我的数组中并随机选择元素

另一个问题是随机选择元素4到8从音频列表中播放,但持续时间将是相同的来自用户的选择。

我的想法是使用if语句对i = 4,并执行for循环。如果我不使用循环,我可以存储用户输入并将其设置为元素的持续时间。但考虑到我需要从元素4播放音频到8,所以我认为我应该使用循环,但是如果我使用循环,我不能将用户输入存储到我的数组中。为什么是这样?以及如何随机制作代码以从元素4到元素8中选择数组列表。

感谢您的帮助。我很感激。

<select id="numFollowUp" name="numFollowUp" style=display:none> 
      <option value="">Number of follow-up questions</option> 
      <option value="4">4</option> 
      <option value="5">5</option> 
      <option value="6">6</option> 
      <option value="7">7</option> 
</select> 

<select id="secFollowUp" name="secFollowUp" style=display:none> 
      <option value="">Second between each question</option> 
      <option value="10">10</option> 
      <option value="11">11</option> 
      <option value="12">12</option> 
      <option value="13">13</option> 
      <option value="14">14</option> 
      <option value="15">15</option> 
</select> 

var intro_playList = [{ 
     "duration": 1000, 
     "key": "0_silence" 
    }, { 
     "duration": 500, 
     "key": "1_hello" 
    }, { 
     "duration": 1000, 
     "key": "2_how_old" 
    }, { 
     "duration": 1000, 
     "key": "3_what_did_you_make" 
    }, { 
     // story_playlist 
     "duration": 1000, 
     //"duration": document.getElementById("secFollowUp").value * 1000, 
     "key": "4_tell_me_a_story" 
    }, { 
     "duration": 1000, 
     //"duration": document.getElementById("secFollowUp").value * 1000, 
     "key": "5_and_then_what" 
    }, { 
     "duration": 1000, 
     "key": "6_why" 
    }, { 
     "duration": 1000, 
     "key": "7_tell_me_more" 
    }, { 
     "duration": 1000, 
     "key": "8_what_happened_next" 
    }]; 

    $(document).ready(function() { 
    var audioElement = document.createElement('audio'); 

     audioElement.addEventListener("ended", playAudio); 

     var i = 0; 
     $("#play").on("click", playAudio); 

     function playAudio() { 
      console.log(i); 
      var audioIndex = intro_playList[i++]; 
      console.log(audioIndex); 
      console.log("After " + audioIndex.duration + " seconds play next audio"); 

      audioElement.src = "sound/" + audioIndex.key + ".wav"; 
      audioElement.load(); 
      setTimeout(function() { audioElement.play()}, audioIndex.duration); 

      if(i === 4){ 

       while(i === 4) 
       { 
        intro_playList[i].duration = document.getElementById("secFollowUp").value * 1000 

       audioElement.src = "sound/" + audioIndex.key + ".wav"; 
       audioElement.load(); 
       setTimeout(function(){ audioElement.play()}, audioIndex.duration); 
       i++; 

       if(i === 8) break; 
     } 
    } 
}); 
+0

不能肯定什么要求? – guest271314

回答

0

可以使用费雪耶茨洗牌,以4-8创建如下改组(不重复)序列(伪代码):

for (let i = 4; i > 1; i--) { 
    let idx = Math.round(Math.random() * (i - 1)); 
    let t = songs[3 + i]; 
    songs[3 + i] = songs[3 + idx]; 
    songs[3 + idx] = t; 
} 
+0

谢谢你回复西华。但是你的伪代码对我来说很难理解。你介意多解释一下吗?或者有一个例子? – Johnny

+0

不客气。您可以从https://en.wikipedia.org/wiki/Fisher%E2%80%93Yates_shuffle了解有关Fisher-Yates shuffle shuffle的更多信息。其实,我的代码中最不自然的(不知何故)奇怪的部分是3 + x部分,目的是避免用户预先选择4首歌曲(索引#0-3)。顺便说一句,我的代码中的“歌曲”是数组包含您要播放的所有音乐。 – tibetty