【问题标题】:Can't Get Variable to Add Properly无法正确添加变量
【发布时间】:2015-01-28 23:36:23
【问题描述】:

我有一个变量++;在 if/else 语句中(它在 else 部分)。它应该在一个人有多少错误猜测的分数上加 1。 出于某种原因,它永远不会只添加一个,每当我提交“猜测”时,它也会添加从 3 到 7 的数字。你们能告诉我是我循环错误还是什么吗?请尽量详细解释。

编辑:我意识到部分问题。尝试++;实际上是为每个字母 [var]choice 不匹配或相等循环一次。例如,如果我为“apple”输入“a”,就会尝试++;由于其他四个字符,将循环四次。那么如何让它只循环一次,而不是为每个错过的字符添加一个呢?

这是我的代码。

// JavaScript Document
var words = new Array("apple","orange","banana","lime","mango","lemon","avacado","pineapple","kiwi","plum","watermelon","peach");
var randomNum;
var word;
var tries = 0;

$('#guess').prop('disabled', true);

$(function(){
$('#start').click(function(){
    $('#guess').prop('disabled', false);
    word = "";
    randomNum = Math.floor(Math.random() * words.length)
    for (var i =0; i < words[randomNum].length; i++) {
        word += "*";
    }
    console.log(words[randomNum]);
    $('#word').html(word);
});

$('#guess').click(function guess(){
    var choice = $('#letter').val().toLowerCase();
    for (var i =0; i < word.length; i++) {
        if (words[randomNum].charAt(i) == choice) {
            word = word.substr(0, i) + choice + word.substr(i + 1);
        } 
        if (words[randomNum].charAt(i) !== choice) {
            tries++;
        }
    }

    if (tries < 7) {
        $('#tries').html(tries)
    } else if (tries >= 7)
        $('#tries').html("YOU LOSE");

    $('#word').html(word);

    $('#' + choice).css("background-color", "red");
});

});

【问题讨论】:

  • 哪个变量有问题?
  • @CaseyRule:可能是唯一一个在任何地方都增加的,更不用说在 if/else 语句中了。
  • @Sarah:我可以向你保证,tries永远不会从中减去。你能否更清楚地了解你的实际精确观察而不是你的[不正确]结论?当您在调试器中有条不紊地单步执行代码时,您看到了什么?
  • tries++ 行在这个里面:for (var i =0; i &lt; word.length; i++) - 也绝对没有理由写一个与if 条件相反的else if,因为这是普通@ 的默认行为987654327@.
  • 另请注意,因为您在那个“点击”处理程序中声明了tries,并将其初始化为零,所以每次“点击”都从零开始。

标签: javascript jquery loops variables conditional


【解决方案1】:

试试这个:

像这样修改guess点击处理程序:

$('#guess').click(function guess(){
    var choice = $('#letter').val().toLowerCase(),
     found = false;
    for (var i =0; i < word.length; i++) {
        if (words[randomNum].charAt(i) == choice) {
            word = word.substr(0, i) + choice + word.substr(i + 1);
            found = true
        }           
    }
    if(!found){
        tries++;
    }

    if (tries < 7) {
        $('#tries').html(tries)
    } else if (tries >= 7){
        $('#tries').html("YOU LOSE");
    }

    $('#word').html(word);

    $('#' + choice).css("background-color", "red");
});

同样在start重置tries

$('#start').click(function(){
    $('#guess').prop('disabled', false);
    word = ""; tries = 0;

【讨论】:

    【解决方案2】:

    搞定了!

    问题与for 循环内的tries 变量有关(每个字母)。为了看到奇怪的行为,在你的代码中添加一个console.log(tries);,在循环内你会看到。第一次它会在1 中增加,然后值会完全改变(我会建议在这里进行一些调试以更准确地了解发生了什么,因为我做得很快)。解决方案是从for 循环上下文中增加变量以使其工作(我在底部提供的示例中这样做了)

    顺便说一句,您似乎正在尝试实施“刽子手”游戏,老实说,在实施这些事情时,您需要真正有条理。

    我解决了您的问题,对代码进行了很多改进,还考虑了其​​他可能的游戏场景,例如:

    • 再玩一次
    • 游戏结束
    • 返回

    请看一看。请注意,HTML 和 CSS 只是针对本示例的即兴创作,还需要一些改进,因此请作为参考。


    更新:您在帖子的 EDIT 部分中输入的内容是正确的。


    你可以在底部运行这个脚本。

    // Game variables
    var GAME_WORDS = [ // List of words available when playing
            'apple', 
            'orange', 
            'banana', 
            'lime', 
            'mango', 
            'lemon', 
            'avacado', 
            'pineapple', 
            'kiwi', 
            'plum', 
            'watermelon', 
            'peach'
        ], 
        GAME_MASKED_WORD = '', // Stores the masked word to be discovered
        GAME_SELECTED_WORD = '', // Stores the readable word
        GAME_PLAYER_ATTEMPTS = 0, // Stores player attempts when failing
        GAME_RANDOM_NUMBER = 0, // Random number to pick a word
        GAME_MAX_ATTEMPTS = 7, // Max. player attempts before a game over
        GAME_UI_COMPONENTS = { // UI components declaration
            start: $('#start'), 
            reset: $('#reset'), 
            back: $('#back'), 
            guess: $('#guess'), 
            msg: $('#msg'), 
            word: $('#word'), 
            letter: $('#letter')
        }, 
        GAME_UI_SECTIONS = { // UI sections declaration
            menu: $('#menu'), 
            game: $('#game')
        };
    
    $(function() {;
        var ui = GAME_UI_COMPONENTS;
        
        // Initialize game
        init();
        
        // Start button handler
        ui.start.on('click', function(e) {
            start();
        });
    
        // Guess button handler
        ui.guess.on('click', function(e) {
            guess();
        });
        
        // Play Again button handler
        ui.reset.on('click', function(e) {
            reset();
            start();
        });
        
        // Go Back button handler
        ui.back.on('click', function(e) {
            init();
        });
    });
    
    /**
     * Used to initialize the game for first time
     */
    function init() {
        var sections = GAME_UI_SECTIONS;
        sections.menu.show();
        sections.game.hide();
        reset();
    };
    
    /**
     * Used to start the game
     */
    function start() {
        var ui = GAME_UI_COMPONENTS, 
            sections = GAME_UI_SECTIONS, 
            words = GAME_WORDS;
        
        sections.menu.hide();
        sections.game.show();
        
        GAME_RANDOM_NUMBER = Math.floor(Math.random() * words.length);
        
        for (var i = 0; i < words[GAME_RANDOM_NUMBER].length; ++i) {
            GAME_MASKED_WORD += '*';
        }
        
        GAME_SELECTED_WORD = words[GAME_RANDOM_NUMBER];
    
        ui.word.html(GAME_MASKED_WORD);
        ui.letter.focus();
    };
    
    /**
     * Guess button handler
     */
    function guess() {
        var ui = GAME_UI_COMPONENTS, 
            words = GAME_WORDS, 
            matches = false, 
            choice;
    
        // Clean messages each time player do a guess
        showMsg('');
        
        if (ui.letter && ui.letter.val()) {
            choice = $.trim(ui.letter.val().toLowerCase());
        }
        
        if (choice) {
            for (var i = 0; i < GAME_MASKED_WORD.length; ++i) {
                if (words[GAME_RANDOM_NUMBER].charAt(i) === choice) {
                    GAME_MASKED_WORD = GAME_MASKED_WORD.substr(0, i) + choice + 
                        GAME_MASKED_WORD.substr(i + 1);
                    matches = true;
                }
            }
            
            if (!matches) {
                ++GAME_PLAYER_ATTEMPTS;
            }
        } else {
            showMsg('Please type a letter.');
        }
        
        // Show attempts left if more than zero
        if (GAME_PLAYER_ATTEMPTS > 0) {
            showMsg('You have ' + 
                    (GAME_MAX_ATTEMPTS - GAME_PLAYER_ATTEMPTS) + 
                    ' attempt(s) left.');
        }
        
        // Check game status each time doing a guess
        if (isGameOver()) {
            lose();
        } else if (isGameWin()) {
            win();
        } else {
            ui.word.html(GAME_MASKED_WORD);
        }
        
        ui.letter.focus();
    };
    
    /**
     * Used to set all game variables from the scratch
     */
    function reset() {
        var ui = GAME_UI_COMPONENTS;
        GAME_MASKED_WORD = '';
        GAME_PLAYER_ATTEMPTS = 0; 
        GAME_RANDOM_NUMBER = 0;
        showMsg('');
        ui.guess.show();
        ui.letter.val('');
        ui.word.html('');
    };
    
    /**
     * Handler when player lose the game
     */
    function lose() {
        var ui = GAME_UI_COMPONENTS;
        showMsg('You Lose!');
        ui.word.html(GAME_SELECTED_WORD);
        ui.guess.hide();
    };
    
    /**
     * Handler when player win the game
     */
    function win() {
        var ui = GAME_UI_COMPONENTS;
        showMsg('You Win!');
        ui.word.html(GAME_SELECTED_WORD);
        ui.guess.hide();
    };
    
    /**
     * Use to print UI messages for the player
     */
    function showMsg(msg) {
        var ui = GAME_UI_COMPONENTS;
        ui.msg.html(msg);
    };
    
    /**
     * Check game status, if player is going to lose the game
     * @returns Boolean
     */
    function isGameOver() {
        return (GAME_PLAYER_ATTEMPTS >= GAME_MAX_ATTEMPTS);
    };
    
    /**
     * Check game status, if player is going to win the game
     * @returns Boolean
     */
    function isGameWin() {
        return (GAME_MASKED_WORD === GAME_SELECTED_WORD);
    };
    .btn {
        cursor: pointer;
    }
    
    span#msg {
        color: red;
        font-weight: bold;
    }
    
    .text {
        font-size: 3em;
    }
    
    input#letter {
        width: 30px;
    }
    <script src="https://ajax.googleapis.com/ajax/libs/jquery/2.1.0/jquery.min.js"></script>
    <div id="wrapper">
        <div id="menu">
            <span class="text">Hangman!</span>
            <br><br>
            <img src="http://img3.wikia.nocookie.net/__cb20130207191137/scribblenauts/images/0/01/Hangman.png" height="200" width="120"/>
            <br><br>
            <input type="button" class="btn" id="start" value="Start Game"/>
        </div>
        <div id="game">
            <span id="msg"></span>
            <br><br>
            Letter: <input type="text" id="letter" value="" maxlength="1"/>
            <br><br>
            <input type="button" class="btn" id="guess" value="Guess"/>
            <input type="button" class="btn" id="reset" value="Play Again"/>
            <input type="button" class="btn" id="back" value="Go Back"/>
            <br><br>
            Word: <div id="word" class="text"></div>
        </div>
    </div>

    希望这会有所帮助。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2021-08-08
      • 2017-03-20
      • 2020-07-21
      • 1970-01-01
      • 2012-09-03
      • 2015-03-09
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多