创建一个猜谜游戏,计算机猜测用户输入的数字

问题描述 投票:0回答:2

鉴于用户输入应介于1和1000之间,我正在尝试使用1-1000的(已排序)整数数组的二进制搜索来输出以下内容:

enter image description here

我只想要输出 - 忽略格式。现在,代码:

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,enter link description here

我在运行它时没有收到任何控制台错误,但它似乎是一个无限循环,因为我的浏览器挂起。我看过类似的问题,我能找到的最相似的是:enter link description here但是它使用的是Java,我还没有学过Java(一般来说编程还很新),所以它有点令人困惑,但我相信它是类似的概念。

提前感谢您提供的任何帮助!

javascript binary-search
2个回答
0
投票

我更新了JSfiddle https://jsfiddle.net/y4ta13es/

无限循环是因为while条件永远不会退出,因为条件总是被评估为真。

大多数代码都是正确的,有一些小的逻辑缺陷,比如你在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>`;
      }
    }

1
投票

在while循环中,每次都重置为启动条件。所以基本上它每次都在不断地猜测500。

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

每次while循环执行时,最后两行将其重置为初始条件(所以你是对的,它处于无限循环中)。它将其设置为根据猜测更改最大值或最小值,然后在下次执行时将其重置(为1和1000)。

© www.soinside.com 2019 - 2024. All rights reserved.