【问题标题】:Hangman Game Javascript: Word completes if last character in word is guessedHangman Game Javascript:如果猜到单词中的最后一个字符,则单词完成
【发布时间】:2020-01-10 13:00:27
【问题描述】:

我正在为课堂作业编写一个刽子手游戏。将单词字符索引与空格索引进行比较的wordcheck() 函数无法正常工作。如果用户猜到单词中间的一个字母,该字母将按应有的方式填充 _ 空间。但是,如果用户猜到单词的最后一个字母,即使前面的空格不匹配,它也会自动进入获胜屏幕并显示完整的单词。我很肯定问题出在这个功能上。我相信这是因为无论字符列表有多长(或单词有多长),循环都会运行,并且如果最后一个值返回等于空格列表中的最后一个值,即使之前的值返回,它也会返回为真作为不平等。不过,即使这是问题所在,我也不知道如何解决。

谢谢!

function wordCheck() {
    var wordComplete = false;
    for (var i = 0; i < letters.length; i++) {
        if (letters[i] !== blanks[i]) {
            wordComplete = false;
        }
        else {
            wordComplete = true;
        }
    }
    if (wordCompleted == true) {
        gameWon();
    }
}

【问题讨论】:

    标签: javascript


    【解决方案1】:

    问题是,只有在 true 的条件存在时才需要设置 true 的值(在这种情况下,您只知道在评估了所有字符和空格之后的事实)。在您的代码中,您每次评估字符/空格匹配时都设置为 true 或 false(这意味着您可以取消设置您正在寻找的结果)。这个小小的逻辑陷阱一直都在吸引程序员。

    这样想:我可以问你的名字五次,我只需要猜对一次就可以获胜,但我总是要猜五次(之后你会告诉我我的猜测是否是正确的)。如果您每次都评估我的答案,而最后一个答案是错误的,那么我是否正确都无关紧要。只有最后的猜测是正确的,它才会起作用。因此,一旦我猜对了,您要么停止评估答案,要么等待所有五个猜测,然后确定我是否赢/输。

    在您的情况下,您需要在确定输赢之前做出所有“猜测”。因此,您只需跟踪他们,然后再做出输赢决定。

    所以你会做这样的事情:

    function wordCheck(){
        // track the matches
        var matches = 0;
        for ( var i = 0; i < spaces.length; i++ ) { 
           // If there's a match, increment matches. Else, leave it alone.
           matches = ( characters [ i ] === spaces [ i ] ? matches + 1 : matches );
        }
        // Now that you have evaluated ALL matches, you can make the decision.
        // If matches === your spaces length, all matches were found, return true, else false
        return ( matches === spaces.length );
    }
    

    【讨论】:

      【解决方案2】:
      function wordCheck() {
          wordCompleted = true; //set it to true first,
          for (var i = 0; i < characters.length; i++) {
              if (characters[i] !== spaces[i]) {
                  wordCompleted = false; //then, if a single char is false, set it to false
              }
          }
          if (wordCompleted == true) {
              gameWon();
          }
      }
      

      您的问题是,如果字母正确,您将 wordCompleted 设置为 true。这意味着如果只有最后一个字母是正确的,它仍然会被设置为真(设置为假之后没有假字母)

      【讨论】:

      • 不是,我的其实有解释,你的也不是很难。
      【解决方案3】:

      是的,确实您的函数在每次迭代中都会更改wordCompleted 的值。如果最后一个字符匹配,则wordCompletedtrue,您调用gameWon()。我认为预期的行为是如果在猜测整个单词时只调用gameWon(),对吗?我认为这个版本的函数可以满足你的需求。

      function wordCheck(){
          let i = 0;
          while(i < characters.length && characters[i] === spaces[i]){
              i++; 
          }
      
          const wordCompleted = i === characters.length;
          if (wordCompleted == true) {
              gameWon();
          }
      }
      

      现在使用这个函数,我们将迭代字符和空格数组,直到它们的元素不同或整个数组都被迭代。然后我们只检查是否到达最后一个元素,如果是,则游戏获胜。

      【讨论】:

        【解决方案4】:

        您部分正确,问题在于您继续循环到最后 - 问题是,您设置函数的方式意味着 只有 最后一个字符很重要。

        不过,您真正关心的是整个单词中有多少个字符匹配。

        看看这个函数:

        function wordCheck(){
          var correctCharacters = 0;
          for (var i = 0; i < characters.length; i++) {
            if (characters[i] === spaces[i]) {
              correctCharacters ++;
            }
          }
          if (correctCharacters === characters.length) {
            gameWon();
          }
        }
        

        【讨论】:

          【解决方案5】:

          如果在一个坏信之后有一个正确的字母,你的脚本会说你的所有单词都是正确的,因为你将为每个字母设置布尔值,从而覆盖坏信检查。

          所以只需在开头定义一个布尔值true,如果字母错误则将其设置为false,但如果字母正确则不要将其设置回true。最后如果你的布尔值是false,这意味着你的一个字母是错误的。

          function wordCheck(){
            var wordCompleted = true;
            for (var i = 0; i < characters.length; i++) {
              if (characters[i] !== spaces[i]) {
                wordCompleted = false;
              }
            }
            if (wordCompleted == true) {
              gameWon();
            }
          }
          

          【讨论】:

          • 它可能是正确的,但你的格式不好,而且没有任何解释
          • 我保留了他的格式,是的,我已经正确缩进并且有解释
          • @Cid 我使用了他的代码,但在我正确缩进之前他们投了反对票
          • 可以通过编辑而不是通过投票来修复错误的格式。可以要求用 cmets 添加解释,而不是 downvotes。
          • 如果可以的话,答案似乎很匆忙(标点符号和基本语法问题),并且没有详细解释逻辑问题,这实际上是OP需要帮助的事情。所以确实答案是正确的,但只有当您能够自己回答问题(OP 不是)时,您才会明白为什么它是正确的。显然没有花费时间/精力来明确和完整的答案(通常是在运行中通过手机完成的情况......)可能成为“低质量”删除的候选者。
          猜你喜欢
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 2014-01-19
          • 2017-11-14
          • 1970-01-01
          • 2021-09-09
          • 1970-01-01
          相关资源
          最近更新 更多