#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-игр для набора текста / правописания и пара математических игр.