JavaScript Бинарный поиск без массива - PullRequest
0 голосов
/ 04 мая 2018

Я пытаюсь создать игру с угадыванием чисел, используя JavaScript для проверки кода, и я очень новичок в этом языке и мне нужна помощь.

Предпосылка игры состоит в том, чтобы компьютер угадал, какой номер пользователя находится между 0 и 100. Параметры должны использовать операторы if-else и подтверждать функции в цикле while. Было предложено использовать бинарный поиск (без использования массива), который будет перемещаться по циклу; сузить догадки компьютера, спросив пользователя, больше ли оно, меньше или равно текущему предположению компьютера.

Как вы можете видеть ниже, я смог запустить оператор if и выдать результат, если пользователь подтвердит, что утверждение истинно. Но теперь я застрял в том, как продолжить с оператором else if, продолжить цикл и успешно реализовать бинарный поиск. Я начал утверждение else if, но я знаю, что это, скорее всего, не тот путь. Я пытался искать через стек-переполнение и другие сайты о том, как использовать бинарный поиск, однако все результаты возвращались с использованием его через массив, который я не могу сделать. Буду признателен за любую помощь и предложения.

var guessNumGame = function () {
	'use strict';
	var low = 0;
	var high = 100;
	var number;

	alert("Think of a number betwwen 0 and 100");
	while (low <= high) {
		number = Math.round((low + high) / 2);

		if (window.confirm("Is your number " + number + " ? Click OK for 
        Yes, CANCEL for No.") == true ) {

			 alert("You got it! Thanks for playing!");

		} //this is where I'm stuck on how to proceed and below is unfinished

        else if (window.confirm("Is your number higher or lower? Click OK 
        for higher, CANCEL for lower. ") < true) {

			 window.confirm("Is your number " + number / 2 + " ? Click OK 
             for Yes, CANCEL for No.") == true;

		}else {

			return guess;
		}

		 return; // this return is here just to avoid and infinite loop
	}

};

window.onload = guessNumGame;
<!DOCTYPE HTML>
<html lang="en">
  <head>
    <meta charset="utf-8">
    <meta http-equiv="X-UA-Compatible" content="IE=edge,chrome=1">
    <title>Pick a Number</title>
    <meta name="description" content="">
    <meta name="viewport" content="width=device-width, initial-scale=1">
  </head>
  <body>
    <h1>Pick a number for me to guess</h1>
    <script src="js/pick_number.js"></script>
  </body>
</html>

Ответы [ 2 ]

0 голосов
/ 04 мая 2018

Этот код реализует вашу идею, то, что вы пытаетесь достичь, очень интересно! Но идея его достижения не кажется удобной.

var guessNumGame = function () {
	'use strict';
	var low = 0;
	var high = 100;
	var number;

	alert("Think of a number betwwen 0 and 100");
	while (low <= high) {
    	number = Math.floor((Math.random() * (high - low + 1))) + low;
		if (window.confirm("Is your number " + number + " ? Click OK for Yes, CANCEL for No."))
			 return alert("YAAAY! I WON");
     	if (window.confirm("Is your number higher or lower? Click OK for higher, CANCEL for lower. ")) {
			low = number + 1;
		} else {
			high = number - 1;
		}
	}

};

guessNumGame();
0 голосов
/ 04 мая 2018

Вы можете использовать циклы while в сочетании с вашими операторами подтверждения, чтобы создать это простым способом.

Примечания:

  1. Я завернул подтверждения в вспомогательную функцию для улучшения читабельности кода.
  2. Я пропустил запрос, чтобы проверить, не ниже ли он, после того, как спросил, не выше ли он, потому что он избыточен.

Пример

function guessNumber(number) {
  return confirm('Is ' + number + ' your number?');
}

function askIfHigher(number) {
  return confirm('Is your number greater than ' + number + '?');
}

function startGame() {
  // Initialise variables
  var low = 0,
    high = 100,
    mid,
    complete = false;

  // Repeat while we have not guessed the answer or binary search fails
  while (!complete && (low <= high)) {
    // Guess number
    mid = Math.floor((low + high) / 2);
    complete = guessNumber(mid);
    if(complete){
      // Guess is correct, exit while loop
      break;
    }
    // Guess is incorrect adjust binary search parameters as needed
    if (askIfHigher(mid)) {
      low = mid + 1;
    } else {
      high = mid - 1;
    }
  }
  if(!complete){
    // Binary search terminated without getting a result
    alert('You must have picked a number outisde of 0-100');
  }else{
    alert('Congratulations! your number was: '+mid);
  }

}

startGame();
...