JavaScript: компьютер угадывает мою числовую игру, не может повторить неверно угаданный номер - PullRequest
0 голосов
/ 20 ноября 2019

Нужны отзывы.

Я очень новичок в программировании. И выполняя следующую задачу в течение последних нескольких дней: пользователь вводит число 0-5 (сколько пальцев я держу?), И компьютер случайным образом угадывает, что это за число, и сколько попыток требуется, чтобы его угадать. Мне удалось написать код, который выполнил это, однако иногда компьютеру требовалось более 20 попыток. Я полагал, что это должно занять не более 6 попыток, так как есть только 6 чисел.

document.getElementById("submitButton").onclick = function() {

    var chosenNumber = document.getElementById("myNumber").value;
    var gotIt = false;
    var howManyGuesses = 0;
    var cmpGuess = 0;
    var temp = "";
    var numbers = [0, 1, 2, 3, 4, 5];
    var ranNums = [];
    i = numbers.length

    console.log(numbers);
    console.log(ranNums);

    if (chosenNumber < 0 || chosenNumber > 5) {
        alert("Please choose a number between 0 and 5.")
        return;
    }

    while (gotIt == false) {

        cmpGuess = Math.floor(Math.random() * (i + 1));


        howManyGuesses = howManyGuesses + 1;



        if (cmpGuess == chosenNumber) {
            gotIt = true;
            alert("Got it! You number was " + chosenNumber + " and it took me " + howManyGuesses + " guesses to get it!")
        } else {
            numbers.splice(cmpGuess, 1);
            ranNums.push(cmpGuess);
            i--;
        }

    }


}

Я только что возился с информацией, полученной в Интернете, и не уверен, работают ли сплайс и пушправильно. До того, как я добавил i-- в конце, казалось, что компьютеру все еще нужно много попыток. Я добавил его, и теперь кажется, что оно всегда равно 6 или меньше, но мой браузер постоянно дает сбой.

Может кто-нибудь взглянуть на этот код, может быть, дать мне какой-нибудь отзыв?

Спасибо большоемного!

Ответы [ 2 ]

1 голос
/ 20 ноября 2019

Вы можете использовать этот подход, чтобы найти номер. Комментарии в коде:

//The variables you are given in the problem:
const choosen = 2;
const min = 0;
const max = 5;

//A function to simluate "computer guessing"
const guess = (min, max, target) => {
  //Iterate every value between min - max, incrementing i by 1 each time
  for (let i = min; i <= max; i += 1) {
    //Check if the value at the current index is the value we're looking for
    if (i === target) {
      return i;
    }
  }

  //If iterate all values between min - max and target isnt found, return null to indicate that
  return null;
}

const numberGuesses = guess(min, max, choosen);

//Function to generate little message based on results of guess()
const message = numberGuesses => Boolean(numberGuesses) ? `${choosen} found in ${numberGuesses} guesses` : `Couldn\'t find ${choosen}`;
console.log(message(numberGuesses));
1 голос
/ 20 ноября 2019

Ваша логика ошибочна. Код выбирает случайное число в диапазоне от 0 до i + 1, и если он не угадывается правильно, уменьшите i-- (и используйте сплайс для numbers, но массив никогда больше не используется в цикле, поэтому он бесполезен).

Давайте представим, что для первой итерации он выбирает 2. Это между диапазонами, так что все в порядке. Но это не правильно - пользователь поместил 5 в поле ввода - так что оно уменьшится на i на единицу. Затем на следующей итерации он может выбрать снова 2, поскольку он все еще находится в текущем диапазоне.

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

И вы были близки к этому, вам в основном нужно изменить:

if (cmpGuess == chosenNumber) {

до:

if (numbers[cmpGuess] == chosenNumber) {

На этом этапе ваш код должен работать (однако я не уверен ranNums.push(cmpGuess);, для чего используется).

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...