首页 > 解决方案 > Hangman Game Javascript:如果猜到单词中的最后一个字符,则单词完成

问题描述

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

解决方案


问题是,只有在 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 );
}

推荐阅读