匹配或同步两个数组以在 JavaScript 中制作拼写游戏

Posted

技术标签:

【中文标题】匹配或同步两个数组以在 JavaScript 中制作拼写游戏【英文标题】:Match or synchronize two arrays to make a spelling game in JavaScript 【发布时间】:2022-01-22 05:43:55 【问题描述】:

我是编码新手,目前正在学习使用 javascript 制作拼写游戏。我正在尝试制作一个就像 Youtube 上的 Coding With Kenny's 一样。这是他的代码和我的一些编辑:

<body>
    <h1 id="heading">Spelling App</h1>
    <div id="container">
      <input id="input">
        <div id="buttons">
          <button id="checkButton">Check</button>
          <button id="getWordButton">get word</button>
          <button id="resetButton">next word</button>
        </div>
        <p id="correct"></p>
        <p id="incorrect"></p>
    </div>
    <script>
      var words = ["easy","apple","idea","key","awesome",
                  "spelling","eligible","cat","dog","firefly"];
      var randomWord = words[Math.floor(Math.random()*words.length)];
      var guessbtn = document.getElementById("checkButton");
      var getwordbtn = document.getElementById("getWordButton");
      var resetbtn = document.getElementById("resetButton");

      var correct = document.getElementById("correct");
      var incorrect = document.getElementById("incorrect");

      resetbtn.addEventListener("click", function() 
        location.reload();
      )

      var speech = new SpeechSynthesisUtterance();

      guessbtn.addEventListener("click", function() 
        var input = document.getElementById("input").value;

        if(input==randomWord) 
          correct.innerhtml = "correct!"
        
        else if (input!==randomWord) 
          incorrect.innerHTML = "incorrect!"
        
      )

      getwordbtn.addEventListener("click", function() 
        var input = document.getElementById("input").value;
        speech.text = randomWord;
        speechSynthesis.speak(speech);
      )
    </script>
  </body>

问题是我想为getWordButton 使用外部音频文件而不是speech.text。我尝试制作 2 个数组:1 个用于音频文件,另一个用于答案,但它不起作用,因为它们在随机选择时无法同步。 这是我尝试添加的数组:

var Sounds= ["easy.mp3","apple.mp3","idea.mp3","key.mp3","awesome.mp3",
                  "spelling.mp3","eligible.mp3","cat.mp3","dog.mp3","firefly.mp3"];
oldSounds = [];
var index = Math.floor(Math.random() * (sounds.length)),
    thisSound = sounds[index];

我希望在单击“获取单词”按钮(要拼写的单词)和另一个数组时播放音频:

var words = ["easy","apple","idea","key","awesome",
                  "spelling","eligible","cat","dog","firefly"];
      var randomWord = words[Math.floor(Math.random()*words.length)];

成为答案的关键。

有什么建议吗?

【问题讨论】:

我不清楚你的意思。您在显示的代码中的哪个位置尝试使用音频文件? “他们无法同步”是什么意思?您能否澄清您在测试显示的代码时观察到的具体问题? 抱歉,我刚刚编辑了我的问题。现在够清楚了吗? 你要不要随机化? 是的,我希望它选择随机音频。 【参考方案1】:

因为您是从两个数组中的每一个中随机选择的。您会在两个数组中获得相同索引的随机非零概率,但几率非常低。

如果你能保证数组总是相同的长度和相同的顺序,只需选择一个随机值并在两个数组中使用它:

var index = Math.floor(Math.random() * sounds.length);
var randomWord = words[index];
var randomSound = sounds[index];

理想的下一步是根本没有两个数组,而是一个对象数组。例如:

var words = [
   word: 'easy', sound: 'easy.mp3' ,
   word: 'apple', sound: 'apple.mp3' ,
  // etc.
];

然后从该数组中随机选择一个对象:

var randomWord = words[Math.floor(Math.random() * words.length)];

您可以使用该对象的.word.sound 属性。例如,比较用户输入时:

if (input == randomWord.word)

因此,与其手动维护多个值数组(它们需要相同的长度、相同的顺序等),您可以只拥有 一个 对象数组,其中相关值是保持在一起。

【讨论】:

我从没想过使用那些更清晰的方法..谢谢!尽管如此,仍然试图掌握这些新事物。另一个快速的问题:如何从对象数组中调用声音?是..words.sound @Kate: words 是一个数组,它没有 sound 属性。但是此特定数组中的任何给定 元素确实 具有sound 属性。在此示例中,randomWord 是对数组中元素的引用。所以randomWord.word 是那个元素的“词”,randomWord.sound 是那个元素的“声音”。 好的,知道了。但是它是否需要其他东西才能播放音频?这是我之前提到的 getWordBtn:getwordbtn.addEventListener("click", function() randomWord.sound; ) 我错过了什么吗? @Kate:如何真正播放音频听起来完全是一个单独的问题,并不真正属于上述问题的范围。问题特别是关于为什么代码从两个数组中选择不匹配的元素。您可以尝试在 Google 上搜索如何在 JavaScript 中播放音频文件。

以上是关于匹配或同步两个数组以在 JavaScript 中制作拼写游戏的主要内容,如果未能解决你的问题,请参考以下文章

Powershell 问题 - 寻找最快的方法来遍历 500k 个对象以在另一个 500k 对象数组中寻找匹配项

比较 2 个对象以在 javascript 中创建一个新的对象数组

如何使用 Node.js/JavaScript 合并两个按键值匹配的数组值

javascript [相同]用于匹配数组#vanilla #script中的两个字符串的脚本

如何在 JavaScript 中同步播放音频文件?

对 Web 服务的 jQuery Ajax 调用似乎是同步的