Генерация нового случайного числа каждый раз, когда вызывается функция в Javascript - PullRequest
3 голосов
/ 13 января 2020

Я пытаюсь выучить javascript, я играю в игру, которая выбирает случайное число.

Я хотел бы иметь 2 функции: случайную и угадать. Random генерирует новое число от 1 до 10. Угадайте, где он проверяет, угадано ли число, если не перезапускает случайную функцию и генерирует новое число для попытки.

var x;
function random(){
    let x = Math.floor((Math.random() * 10) + 1);
    guess();
 }

function guess(x){
    if(x === 3){
        alert('you are correct!');
    }else{
        alert('try again');
        random();
    }
}

random();

Это просто предупреждает, попробуйте снова каждый раз, я думаю, потому что это не генерировать новое число каждый раз, когда вызывается функция?

Как создать случайную функцию, чтобы она генерировала новое число каждый раз, когда ее вызывали?

***** Исправление, это появляется, чтобы сгенерировать новое число, но x не определен в функции догадки **

Ответы [ 4 ]

3 голосов
/ 13 января 2020

x в guess() - это x, который передается ему в качестве параметра. Я бы удалил объявление var x; и передал бы значение при вызове как guess(x)

function random(){
    const x = Math.floor((Math.random() * 10) + 1);
    guess(x);
 }

function guess(x){
    if(x === 3){
        alert('you are correct!');
    }else{
        alert('try again');
        random();
    }
}

random();

2 голосов
/ 13 января 2020

Подпись функции guess говорит о том, что она принимает параметр x, но вы не передаете никакое значение функции при ее вызове, поэтому она присваивает undefined x при запуске guess , который никогда не будет равен 3. Вы можете принять 2 подхода, чтобы исправить это. Во-первых, вы можете сделать x глобальную переменную , избавившись от let, где вы определяете x в функции random и удалив x из сигнатуры функции guess вот так:

var x;

function random() {
  x = Math.floor((Math.random() * 10) + 1);
  guess();
}

function guess() {
  if (x === 3) {
    alert(x + '- you are correct!');
  }
  else {
    alert(x + '- try again');
    random();
  }
}

random();

Или вы можете использовать x в качестве параметра для функции предположения, удалив глобальное объявление var x; и передав x в guess когда вы вызываете его в функции random, вот так:

function random() {
  let x = Math.floor((Math.random() * 10) + 1);
  guess(x);
}

function guess(x) {
  if (x === 3) {
    alert(x + '- you are correct!');
  }
  else {
    alert(x + '- try again');
    random();
  }
}

random();

Лично у меня даже не было бы функции random. Я бы просто определил x в guess и позвонил бы guess из себя. И я бы использовал rando js .com , чтобы сделать случайность более читабельной. Вот как я это сделаю:

function guess() {
  let x = rando(1, 10);
  if (x === 3) return alert(x + '- you are correct!');
  alert(x + '- try again');
  guess();
}

guess();
<script src="https://randojs.com/1.0.0.js"></script>

Обратите внимание, что оператор return немедленно и тут же остановит выполнение функции, поэтому он не перейдет к предупреждению «повторить попытку» если номер был угадан правильно.

1 голос
/ 13 января 2020

Вот подробный код, который поможет вам понять, как запустить такую ​​игру в браузере.

См. Комментарии для объяснения того, как это работает (и для поиска информации по MDN , чтобы узнать больше о любой конкретной топи c.)

Удачного кодирования!

// Identifies HTML elements
const
  guessInput = document.getElementById("guessInput"),
  outputParagraph = document.getElementById("outputParagraph");

// Makes a global variable that all functions can access
let globalNum;

// Invokes the main function
playGame();


function playGame(){
  
  // Invokes the randomizer function and stores the result in the global variable
  globalNum = getRandomNumber();
  //console.log(globalNum);
  
  // Invokes the output function
  setOutput("Guess a number from 1 to 10");

  // Assigns a function that will be invoked whenever the user changes the input field
  guessInput.addEventListener("change", respondToGuess);  

  // Puts the focus in the input element
  guessInput.focus();
}


// Defines a listener function that can automatically see the triggering event
function respondToGuess(event){

  // Gets the `target` element of the event and stores it in a local variable
  const localReferenceToInputElement = event.target

  // The text of an `<input>` element lives in its "value" property
  const inputText = localReferenceToInputElement.value;

  // Tries to convert the text string to an integer (and store it locally as 'guess')
  let guess = parseInt(inputText);

  // If the conversion failed, changes the output accordingly
  if(!guess){ setOutput("Please enter a valid number"); }

  // If the number is out of range, changes the output
  else if(guess < 1 || guess > 10){ setOutput("Only numbers from 1 to 10 are allowed"); }

  // If the guess doesn't match the stored number, changes the output
  else if(guess !== globalNum){ setOutput("Try again..."); }

  // If we got this far, the guess was correct, so changes output and ends game
  else{
    setOutput("You guessed it!");
    reset();
  }
}


function getRandomNumber(){
  // Returns a random number into whatever function called this function
  const x = Math.floor((Math.random() * 10) + 1);
  return x;
}

function setOutput(outputText){
  // The text of a paragraph element lives in its `innerHTML` property
  outputParagraph.innerHTML = outputText;  
}

function reset(){
  // Clears the input and stops listening for changes
  guessInput.value = "";
  guessInput.removeEventListener("change", respondToGuess);
}
<input id="guessInput" />
<p id="outputParagraph"></p>
1 голос
/ 13 января 2020

Я сделал некоторые изменения в вашем коде. У вас есть проблема с концепцией вызова функции. В реальном коде это убьет вашу память. Ваша функция вызывает функцию, а не функцию закрытия, и вызывает функцию снова и снова ... и заполняет память.

var x;
// flag correct will close the loop when you have right umber 
var correct = false;
function random() {
    x = Math.floor((Math.random() * 10) + 1);
    guess(x);
}

function guess(x) {
    if (x === 3) {
        alert('you are correct!');
        // if number is right flag is up 
        correct = true;
    } else {
        alert('the number is ' + x + ' try again');
    }
}
// loop until the number is right
while (correct != true) {
    random();
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...