Решение случайных чисел и случайных величин из array Javascript

#javascript #random #numbers #equation

#javascript #Случайный #числа #уравнение

Вопрос:

 window.onload = start;
var nr1 = Math.floor(Math.random()*50);
var nr2 = Math.floor(Math.random()*50);
var eq1 = nr1  " " nr2;
var eq2 = nr1   "-"  nr2;
var eq3 = nr1  "*"  nr2;
var eq4 = nr1  "/"  nr2;

var arr = [eq1,eq2,eq3,eq4];
var eq = arr[Math.floor(Math.random()*arr.length),Math.floor(Math.random()*arr.length)];
  

Я хочу кое-что попрактиковать, создав базовую математическую игру. Вот код, который я пытаюсь использовать для генерации случайных чисел и случайных уравнений, которые я хочу вывести из моего html. Причина, по которой у меня есть «» для операторов, заключается в том, что я хочу, чтобы все уравнение отображалось в виде текста, я пробовал это без знаков «», и я просто сразу получаю ответ.

 function start() {
document.getElementById("submit").onclick = submitans;
document.getElementById("question").innerHTML = eq;
}
  

это моя функция запуска, которая генерирует уравнение. Теперь это очень хорошо работает в html, если вы посмотрите на эту фотографию —
HTML. Моя проблема в том, что я не знаю, как я собираюсь связать уравнение с «if (statement)» из поля ввода. Потому что скрипт считывает команды как текст, поэтому он не работает, даже если я пишу

    function submitans() {

    var correct = "Correct!";
    var wrong = "Wrong";      
    var inn = parseInt(document.getElementById("answer").value);

    for (var i = 0; i < eq.length; i  ) {
       if(inn === eq[i])
        document.getElementById("input").innerHTML = "correct";
     }
  }
  

Могу ли я в любом случае достичь цели, которую я хочу, с помощью этого скрипта? Я придерживаюсь чистого javascript, поскольку я всего лишь новичок, и я действительно хочу его изучить. Поэтому я бы предпочел не использовать jquery.

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

Ответ №1:

в первом фрагменте кода вы можете добавить ответ для каждого уравнения

 var eq1 = nr1  " " nr2;
var eq2 = nr1   "-"  nr2;
var eq3 = nr1  "*"  nr2;
var eq4 = nr1  "/"  nr2;
//answers
var ans1 = nr1  " " nr2;
var ans2 = nr1   "-"  nr2;
var ans3 = nr1  "*"  nr2;
var ans4 = nr1  "/"  nr2;
  

и затем, когда вы получаете случайное уравнение, вы также получаете ответ на него

 var arr = [eq1,eq2,eq3,eq4];
var ansArr = [ans1, ans2, ans3, ans4];
var eqNumber = Math.floor(Math.random()*arr.length);
var eq = arr[eqNumber];
var ans = ansArr[eqNumber];
  

и отредактируйте последний фрагмент следующим образом

 function submitans() {
    var correct = "Correct!";
    var wrong = "Wrong";      
    var inn = parseInt(document.getElementById("answer").value);

    //for (var i = 0; i < eq.length; i  ) {//delete
       if(inn == ans)
        document.getElementById("input").innerHTML = correct;
       else
        document.getElementById("input").innerHTML = wrong;
    //}//delete
 }
  

———————————————————————————

или вместо всего этого вы также можете изменить только последний фрагмент кода следующим образом

 function submitans() {
    var correct = "Correct!";
    var wrong = "Wrong";      
    var inn = parseInt(document.getElementById("answer").value);

    //for (var i = 0; i < eq.length; i  ) {//delete
       if(inn == eval(eq))
        document.getElementById("input").innerHTML = correct;
       else
        document.getElementById("input").innerHTML = wrong;
    //}//delete
 }
  

eval запустит текст как javascript и вернет ответ уравнения.

Комментарии:

1. Тот, что с eval (eq), работал для моего кода. Но первый, о котором вы упомянули, этого не сделал, ответ всегда был неправильным. Спасибо за помощь!

2. Еще одна вещь, которую мне интересно узнать о разделении, как я могу использовать toFixed (2), чтобы ответить на него всего с 2 десятичными знаками?

Ответ №2:

вы также можете использовать функцию eval для получения ответа. var answer = eval(document.getElementById("question").innerHTML) чтобы получить правильный ответ

Ответ №3:

Я бы изменил способ управления уравнениями… Может быть, что-то подобное могло бы быть полезным :

 function eq(x, y, op){
    // Find the result depending on the operation
    var res;
    switch (op){
        case: ' ':
            res = x   y;
            break;
        case: '-':
            res = x - y;
            break;
        case: '*':
            res = x * y;
            break;
        case: '/':
            res = x / y;
            break;
        default:
            throw "Error";
    }
    // Or something like is more compact
    var res2 = op == ' ' ? x y : op == '-' ? x-y : op == '*' ? x*y : op == '/' ? x/y : null;

    return {
        text: x   op   y,
        res: res
    }
}

// ...
var eq1 = eq(nr1, nr2, ' ');
var eq2 = eq(nr1, nr2, '-');
var eq3 = eq(nr1, nr2, '*');
var eq4 = eq(nr1, nr2, '/');
  

Затем вам просто нужно отобразить eq.text в HTML и проверить eq.res , чтобы сравнить с ответом… Может быть, вы можете сделать что-то более приятное, но это должно сработать

Ответ №4:

eval() должно сработать хорошо, попробуйте это:

 function submitans() {
    var correct = "Correct!";
    var wrong = "Wrong";      
    var inn = parseInt(document.getElementById("answer").value);

    if(inn === eval(document.getElementById("question").innerHTML))
        document.getElementById("input").innerHTML = correct;
    else 
        document.getElementById("input").innerHTML = wrong;     
}
  

Ответ №5:

существует разница между parseInt и Number

 var inn = parseInt(document.getElementById("answer").value);
var inn = Number(document.getElementById("input").value);
  

========================

с eval() нужно быть осторожным. в большей степени из-за того, как javascript будет интерпретировать заданную строку

 var ans1 = eval( 4-3/2*39 3)
  

добавление скобок гарантирует, что вы получите правильный результат в том, как вы хотите, чтобы evel () возвращал ответ.

 var ans2 = eval( (4-((3/2)*39)) 3 );

var ans3 = eval(document.getElementById("equation").value);
  

скорее всего, вернется как ans1, будьте осторожны!

чтобы обойти проблему выше…

 var eq1a = nr1  " " nr2;
var eq1b = nr1   nr2
var eq2a = nr1   "-"  nr2; 
var eq2b = nr1 - nr2
var eq3a = nr1  "*"  nr2;
var eq3b = nr1 * nr2
var eq4a = nr1  "/"  nr2;
var eq4b = nr1 / nr2
  

достаточно просто описано выше…..

делаем следующий шаг

 var eq1 = "nr1   nr2"
var eq2 = "nr1 - nr2"
var eq3 = "nr1 * nr2"
var eq4 = "nr1 / nr2"
  

выше приведена строка, которую вы можете выполнить…

 var nr1 = Math.floor(Math.random()*50);
var nr2 = Math.floor(Math.random()*50);
var eq1 = "nr1   nr2"
document.getElementById("equation").innerHTML = eq1;
//and it will show correctly.
var ans = eval(eq1); 
// and it will give you the answer
  

и делаем еще один шаг вперед….

 var eq1 = "((nr1   nr2) * 4 / 4)"
document.getElementById("equation").innerHTML = eq1.regex();
var ans = eval(eq1);
  

я забыл, что нужно поместить в скобки regex (), чтобы убрать скобки (и). таким образом, он не выводит их в html-элемент equation.

====================

просто будьте осторожны с eval(), если приложение является критическим приложением. ваше приложение может быть быстро взломано.

Комментарии:

1. www.moodle.org php LMS (система обучения mangament), в которую, когда я проверял в прошлый раз, встроено несколько различных игр, hangman, scrabble, и вроде довольно дешевых маленьких игр. может быть, это что-то и для вас kongregate.com внутри есть несколько «обучающих» html5-игр для набора текста / правописания и пара математических игр.