0

我正在为课堂作业编写一个刽子手游戏。该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();
    }
}
4

5 回答 5

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 );
}
于 2020-01-10T13:11:34.187 回答
0

是的,确实你的函数wordCompleted在每次迭代中都会改变 的值。如果最后一个字符匹配,则wordCompletedis true,然后您调用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();
    }
}

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

于 2020-01-10T13:12:33.747 回答
0
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。这意味着如果只有最后一个字母是正确的,它仍然会被设置为真(设置为假之后没有假字母)

于 2020-01-10T13:05:12.133 回答
-1

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

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

看看这个函数:

function wordCheck(){
  var correctCharacters = 0;
  for (var i = 0; i < characters.length; i++) {
    if (characters[i] === spaces[i]) {
      correctCharacters ++;
    }
  }
  if (correctCharacters === characters.length) {
    gameWon();
  }
}
于 2020-01-10T13:08:42.937 回答
-1

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

因此,只需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();
  }
}
于 2020-01-10T13:03:20.723 回答