开发者问题收集

Javascript 函数不断返回 null

2020-04-14
138

所以我一直在做一个游戏项目,如果玩家点击一个字母,并且该字母与短语相匹配,则它会显示该字母。如果玩家点击一个没有任何匹配项的字母(由 null 表示),则蓝色心形将变成丢失的心形,并且未命中计数器会增加。出于某种原因,即使玩家点击匹配的字母,我的代码仍然会显示丢失的心形。有人可以帮忙吗?这是整个项目的 github 链接: https://github.com/santanaquan/Techdegree-Project-6

这是 javascript 代码片段。

function checkLetter(button) {
    const getLetter = document.getElementsByClassName('letter');
    let letter;
    for (let i = 0; i < getLetter.length; i++) {
        if (button.textContent === getLetter[i].textContent) {
            getLetter[i].className += ' show';
            letter = getLetter[i].textContent;
        }
        else {
            letter = null;
        }
    } 
    return letter;
}
3个回答

由于您的代码会遍历 所有 字母,即使玩家猜对了字母,您的代码也会找到它,但之后会继续循环,这会使 letter 为空。

您只需删除 else 并将 letter 初始化为空。您 不应 在 if 中中断,因为那样您会错过重复的字母。

function checkLetter(button) {
    const getLetter = document.getElementsByClassName('letter');
    let letter = null;
    for (let i = 0; i < getLetter.length; i++) {
        if (button.textContent === getLetter[i].textContent) {
            getLetter[i].className += ' show';
            letter = getLetter[i].textContent;
        }
     }
     return letter;
 }
Nikola Dimitroff
2020-04-14

checkLetter 函数存在错误。我引用以下原文以供参考:

function checkLetter(button) {
    const getLetter =  document.getElementsByClassName('letter');
    let letter;
    for (let i = 0; i < getLetter.length; i++) {
        if (button.textContent === getLetter[i].textContent) {
            getLetter[i].className += ' show';
            letter = getLetter[i].textContent;
        }
        else {
            letter = null;
        }
    } 
    return letter;
}

这里的问题是 letter 每次循环都会更新。这意味着它以最后一次迭代获得的值结束,除非单击了最后一个字母,否则该值将始终为 null - 丢弃在途中找到的任何匹配项。

一个非常简单的修复方法是将 letter 初始化为 null ,然后仅在找到匹配项时更改它。这保证它在最后会有正确的值。所以这是一个有效的版本:

function checkLetter(button) {
    const getLetter =  document.getElementsByClassName('letter');
    let letter = null;
    for (let i = 0; i < getLetter.length; i++) {
        if (button.textContent === getLetter[i].textContent) {
            getLetter[i].className += ' show';
            letter = getLetter[i].textContent;
        }
    } 
    return letter;
}
Robin Zigmond
2020-04-14

正如其他人指出的那样,您的 checkLetter 函数已损坏。您必须在获得匹配后停止。如果进一步迭代,字母将不匹配,并且 letter 变量将设置为 null。将其修改为此。

function checkLetter(button) {
    const getLetter =  document.getElementsByClassName('letter');
    let letter = null;
    for (let i = 0; i < getLetter.length; i++) {
        if (button.textContent === getLetter[i].textContent) {
            getLetter[i].className += ' show';
            letter = getLetter[i].textContent;
            break;
        }
    } 
    return letter;
}

现在您还有另一个问题,即如果字母已经被正确猜出,则如果短语中有重复的字符,则循环将不起作用,因为第一个匹配将设置 letter 变量。因此,您必须在循环中添加检查以查看字母是否已匹配。

function checkLetter(button) {
    const getLetter =  document.getElementsByClassName('letter');
    let letter = null;
    for (let i = 0; i < getLetter.length; i++) {
        if (button.textContent === getLetter[i].textContent) {
           if(/*letter is not already guessed*/) {
              getLetter[i].className += ' show';
              letter = getLetter[i].textContent;
          }
        }
    } 
    return letter;
}
Deiknymi
2020-04-14