Создайте игру в догадки, где компьютер угадывает число, которое вводит пользователь - PullRequest
0 голосов
/ 15 сентября 2018

Учитывая, что пользовательский ввод должен быть между 1 и 1000, я пытаюсь использовать двоичный поиск (отсортированный) целочисленного массива 1-1000 для вывода следующего:

введите изображениеописание здесь

Я просто хочу вывод - игнорируйте форматирование.Теперь код:

const testButton = document.getElementById("test");

testButton.addEventListener('click', () => {
  myArray = new Array(1000);
  for (i = 0; i < 1000; i++) {
    myArray[i] = i + 1;
    //just for visual aid, not to be actual part of final output
    document.getElementById("boop").innerHTML = myArray;
    document.getElementById("boop").innerHTML += `<p>${myArray[myArray.length -1]}</p>`;
  }


  var userInput = parseInt(document.getElementById("input").value);
  let min = myArray[0];
  let max = myArray[myArray.length - 1];

  if (userInput < 1 || userInput > 1000) {
    document.getElementById("boop").innerHTML += "That's not between 1 and 1000.";
  } else {

    while (min < max) {

      userInput = parseInt(document.getElementById("input").value);
      let min = myArray[0];
      let max = myArray[myArray.length - 1];


      let mid = myArray[myArray.length - 1];

      mid = parseInt(Math.floor(mid / 2));
      let count = 0;

      if (userInput == mid) {
        count++;
        document.getElementById("boop").innerHTML += `<p>Guessed ${mid} and got it. Took me ${count} tries.</p>`;
      } else if (userInput > mid) {
        count++;
        document.getElementById("boop").innerHTML += `<p>Guessed ${mid}. Too low.</p>`;
        min = mid + 1;
        mid = parseInt(Math.floor(mid + (mid / 2)));
      } else {
        count++;
        document.getElementById("boop").innerHTML += `<p>Guessed ${mid}. Too high.</p>`;
        max = mid - 1;
        mid = parseInt(Math.floor(mid / 2));
      }
    }

  }


});
<html>

<head>
</head>

<body>
  <input type="text" id="input">
  <button id="test">
Start Game
</button>
  <p id="boop">
  </p>
</body>

</html>

Если вы хотите связываться с моим JSfiddle, введите описание ссылки здесь

Я не получаюлюбые ошибки консоли при запуске, но кажется, что это бесконечный цикл, потому что мой браузер зависает.Я просмотрел похожие вопросы, и самое похожее, что я могу найти: введите описание ссылки здесь , но он использует Java, и я не изучил Java (все еще довольно плохо знакомый с программированием в целом), поэтомуэто немного сбивает с толку, но я считаю, что это похожая концепция.

Заранее благодарю за любую помощь, которую вы можете предложить!

Ответы [ 2 ]

0 голосов
/ 15 сентября 2018

Я обновил JSfiddle https://jsfiddle.net/y4ta13es/

Бесконечный цикл произошел из-за того, что условие while никогда не завершалось, поскольку условие всегда оценивалось как true.

Большая часть вашего кода была правильной с некоторыми незначительными недостатками логики, например, вы определяете переменные внутри цикла while. Вы должны объявить их вне, иначе значения никогда не будут обновлены.

Вот фрагмент

 while (min < max) {
    index = parseInt((max+min)/2);
      let mid = myArray[index];
      if (userInput == mid) {
        count++;
        document.getElementById("boop").innerHTML += `<p>Guessed ${mid} and got it. Took me ${count} tries.</p>`;
        break;
      } else if (userInput > mid) {
      min = index;
        count++;
        document.getElementById("boop").innerHTML += `<p>Guessed ${mid}. Too low.</p>`;
      } else {
         max = index;
        count++;
        document.getElementById("boop").innerHTML += `<p>Guessed ${mid}. Too high.</p>`;
      }
    }
0 голосов
/ 15 сентября 2018

В вашем цикле while вы каждый раз возвращаетесь в исходное состояние. По сути, каждый раз он постоянно угадывает 500.

 while (min < max) {
   userInput = parseInt(document.getElementById("input").value);
   let min = myArray[0];
   let max = myArray[myArray.length - 1];

Последние две строки сбрасывают его в исходное состояние каждый раз, когда выполняется цикл while (так что вы были правы, это было в бесконечном цикле). Он настраивает его на изменение макс или мин на основе предположения, но затем они сбрасываются при следующем запуске (до 1 и 1000).

...