2015-05-22 3 views
0

Я решил сделать математическую игру в JavaScript, и я очень знаком с JS. Я хочу, чтобы он выбирал случайную операцию из массива и оценивал ее с помощью двух случайных чисел, но он не работает. Любая помощь приветствуется. Благодаря!Как сделать JavaScript оценивать строку и многое другое

КОД:

var mathGame = function() { 
    var operators = ["+", "-", "*", "/"]; 
    var operatorChoice = Math.floor((Math.random() * 4) + 1); 
    var points = 1; 
    var numberOfQuestions = prompt("How many questions would you like?"); 
    var highestNumber = prompt("What is the highest number you would like to be quizzed on?"); 
    for (var i = 0; i < numberOfQuestions; i++) { 
     var x = Math.floor((Math.random() * highestNumber) + 1); 
     var y = Math.floor((Math.random() * highestNumber) + 1); 
     var answer = (x operators[operatorChoice] y); 
     var user_answer = prompt(x + operators[operatorChoice] + y); 
     if (user_answer == answer) { 
      alert("Yes!"); 
      points = points + 2; 
     } else { 
      if (points > 0) { 
       points = points - 2; 
      } 
      alert("Sorry, that was incorrect, the answer is " + answer); 
     } 
    } 
    alert("Your total points were " + points); 
}; 
+2

Вы можете использовать 'eval', если вы действительно хотите хранить операторы в виде строк. Лучшим подходом может быть создание массива функций и выбор функции (а не оператора) наугад. – fzzfzzfzz

+0

Что именно «не работает»? Любая ошибка на консоли? – NemoStein

ответ

2

Вы можете использовать Eval:

var answer = eval(x + operators[operatorChoice] + y); 

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

Лучшим и более общим способом справиться с этим было бы определение функций для каждой операции и их вызов.

var mathGame = function() { 
 
    function add(x, y) { return x + y; } 
 
    function subtract(x, y) { return x - y; } 
 
    function multiply(x, y) { return x * y; } 
 
    function divide(x, y) { return x/y; } 
 
    var operators = ["+", "-", "*", "/"]; 
 
    var operations = [add, subtract, multiply, divide]; 
 
    var operatorChoice = Math.floor(Math.random() * operators.length); 
 
    var points = 1; 
 
    var numberOfQuestions = prompt("How many questions would you like?"); 
 
    var highestNumber = prompt("What is the highest number you would like to be quizzed on?"); 
 
    for (var i = 0; i < numberOfQuestions; i++) { 
 
     var x = Math.floor((Math.random() * highestNumber) + 1); 
 
     var y = Math.floor((Math.random() * highestNumber) + 1); 
 
     var answer = operations[operatorChoice](x, y); 
 
     var user_answer = prompt(x + operators[operatorChoice] + y); 
 
     if (user_answer == answer) { 
 
      alert("Yes!"); 
 
      points = points + 2; 
 
     } else { 
 
      if (points > 0) { 
 
       points = points - 2; 
 
      } 
 
      alert("Sorry, that was incorrect, the answer is " + answer); 
 
     } 
 
    } 
 
    alert("Your total points were " + points); 
 
}; 
 
mathGame();

ЮО была также другая ошибка в коде. Вы не должны добавлять 1 к случайному числу, когда вы устанавливаете operatorChoice. Это дает число от 1 до 4, но индексы operators составляют 0 до 3.

+0

Я не думаю, что введение 'eval' новому пользователю JS является хорошим советом ... – NemoStein

+0

Это правильный ответ, он отвечает на заданный вопрос, и ему дается предупреждение о том, что' eval' является считается плохой практикой. 'eval' не является преступлением, это просто не очень хороший инструмент в производственном кодексе. – fzzfzzfzz

+0

Чтобы быть ясным, почему так плохо? – vkumar

Смежные вопросы