JavaScript говорит, что 10 ниже, чем 9 - PullRequest
0 голосов
/ 31 августа 2018

Я пытаюсь выучить JavaScript, и когда я запустил учебник по MDN, я попытался выполнить первое упражнение в одиночку, которое до сих пор работало нормально. Но есть одна действительно странная ситуация.

Игра генерирует случайное число от 1 до 100, и у пользователя есть 10 догадок, чтобы узнать это число.

Для этой цели я упростил игру до 1 - 10.

Когда случайное число равно 9, и я предполагаю, 10, код говорит, что мой ввод был слишком низким. Я не понимаю, почему это так. В любой другой ситуации он работает точно так, как ожидалось.

По причинам отладки случайное число будет отображаться в диалоговом окне после первого предположения.

Это мой код:

var number = 0;
var turns = 0;
var guess = 0;
var won = false;

playGame();

function playGame() {
    won = false;
    number = (Math.random() * 10).toFixed(0);
    guess = prompt("Guess a number from 1 to 10");
    turns = 0;

    while(turns < 10) {
        console.log(number + " " + guess);
        if(guess < number) {
            turns++;
            guess = prompt("Number is " + number + ".\n\nYou guessed " + turns + " Times already.\n\nYour guess was to low! Guess again:");
            won = false;
        } else if(guess > number) {
            turns++;
            guess = prompt("Number is " + number + ".\n\nYou guessed " + turns + " Times already.\n\nYour guess was to high! Guess again:");
            won = false;
        } else if(guess === number) {
            alert("You got it!");
            won = true;
            break;
        }
    }
    if(confirm("Wanna play again?")){
        playGame()
    } else {
        alert("kkbye!");
    }   
}

Спасибо заранее. Если вы видите в моем коде что-то, что хотите прокомментировать, я бы хотел услышать отзывы и стать лучше, даже если это не имеет к этому никакого отношения;)

Ответы [ 2 ]

0 голосов
/ 31 августа 2018

Подсказка Javascript возвращает строку. Фактически, текстовое поле ввода всегда возвращает строку. Поэтому, когда вы вводите 10, он возвращает «10» и toFixed () также возвращает строку.

Так что вам нужно исправить две строки из вашего кода

number = parseInt((Math.random() * 10).toFixed(0));
guess = prompt("Guess a number from 1 to 10");
guess = parseInt(guess);

Также вам нужно проверить, чтобы условия NAN были на более безопасной стороне.

0 голосов
/ 31 августа 2018

Проблема в том, что вы работаете со строками, если вы сравниваете две строки с <, он будет сравнивать только столько символов, сколько нужно, пока не найдет символ, который меньше (меньше, если его целочисленное представление), чем другой:

console.log("10" < "9");

Здесь сравниваются только "1" с "9", что означает код символа 49 с кодом символа 57.

49 меньше 57, что означает, что все выражение равно true. Вы можете узнать больше о кодировках ASCII здесь .

Вместо этого вы должны использовать числа:

console.log(Number("10") < Number("9"));

Вы имеете дело только со строками, так как prompt() и Number.toFixed() возвращают строки. Если вы инкапсулируете их в Number() звонки, ваша игра работает:

var number = 0;
var turns = 0;
var guess = 0;
var won = false;

playGame();

function playGame() {
    won = false;
    number = Number((Math.random() * 10).toFixed(0));
    guess = Number(prompt("Guess a number from 1 to 10"));
    turns = 0;

    while(turns < 10) {
        console.log(number + " " + guess);
        if(guess < number) {
            turns++;
            guess = prompt("Number is " + number + ".\n\nYou guessed " + turns + " Times already.\n\nYour guess was too low! Guess again:");
            won = false;
        } else if(guess > number) {
            turns++;
            guess = prompt("Number is " + number + ".\n\nYou guessed " + turns + " Times already.\n\nYour guess was too high! Guess again:");
            won = false;
        } else if(guess === number) {
            alert("You got it!");
            won = true;
            break;
        }
    }
    if(confirm("Wanna play again?")){
        playGame()
    } else {
        alert("kkbye!");
    }   
}
...