web-tech/tasks/math-game/script.js
2025-11-23 14:00:44 +03:00

195 lines
No EOL
6.6 KiB
JavaScript
Raw Permalink Blame History

This file contains ambiguous Unicode characters

This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.

let currentLevel = 1;
let correctAnswers = 0;
let wrongAnswers = 0;
let questionsOnLevel = 0;
let currentQuestion = null;
let usedQuestions = [];
let timerInterval = null;
let timeLeft = 300;
const levelNames = {
1: 'Начальный',
2: 'Средний',
3: 'Продвинутый'
};
function startTimer() {
if (timerInterval) {
clearInterval(timerInterval);
}
timeLeft = 300;
updateTimerDisplay();
timerInterval = setInterval(function() {
timeLeft--;
updateTimerDisplay();
if (timeLeft <= 0) {
clearInterval(timerInterval);
showResult('Время вышло! Вы не успели завершить уровень.');
}
}, 1000);
}
function updateTimerDisplay() {
let minutes = Math.floor(timeLeft / 60);
let seconds = timeLeft % 60;
let display = minutes + ':' + (seconds < 10 ? '0' : '') + seconds;
document.getElementById('timer').textContent = display;
}
function generateQuestion() {
let question, answer;
let questionText;
do {
if (currentLevel === 1) {
let num1 = Math.floor(Math.random() * 20) + 1;
let num2 = Math.floor(Math.random() * 20) + 1;
let operators = ['+', '-', '*'];
let operator = operators[Math.floor(Math.random() * operators.length)];
questionText = num1 + ' ' + operator + ' ' + num2;
answer = eval(questionText);
} else if (currentLevel === 2) {
let num1 = Math.floor(Math.random() * 20) + 1;
let num2 = Math.floor(Math.random() * 20) + 1;
let operators = ['>', '<', '=='];
let operator = operators[Math.floor(Math.random() * operators.length)];
questionText = num1 + ' ' + operator + ' ' + num2;
answer = eval(questionText) ? 'true' : 'false';
} else {
let types = ['logical', 'binary'];
let type = types[Math.floor(Math.random() * types.length)];
if (type === 'logical') {
let bool1 = Math.random() > 0.5;
let bool2 = Math.random() > 0.5;
let operators = ['&&', '||'];
let operator = operators[Math.floor(Math.random() * operators.length)];
questionText = bool1 + ' ' + operator + ' ' + bool2;
answer = eval(questionText) ? 'true' : 'false';
} else {
let num = Math.floor(Math.random() * 16);
questionText = 'Двоичное представление числа ' + num;
answer = num.toString(2);
}
}
} while (usedQuestions.includes(questionText));
usedQuestions.push(questionText);
currentQuestion = { text: questionText, answer: String(answer) };
document.getElementById('question').textContent = questionText;
document.getElementById('answer').value = '';
document.getElementById('feedback').textContent = '';
document.getElementById('answer').focus();
}
function checkAnswer() {
let userAnswer = document.getElementById('answer').value.trim();
if (userAnswer === '') {
alert('Пожалуйста, введите ответ');
return;
}
if (userAnswer === currentQuestion.answer) {
correctAnswers++;
document.getElementById('feedback').textContent = 'Правильно!';
document.getElementById('feedback').style.color = '#4CAF50';
} else {
wrongAnswers++;
document.getElementById('feedback').textContent = 'Неправильно! Правильный ответ: ' + currentQuestion.answer;
document.getElementById('feedback').style.color = '#f44336';
}
questionsOnLevel++;
updateDisplay();
if (questionsOnLevel >= 10) {
clearInterval(timerInterval);
checkLevelProgress();
} else {
setTimeout(generateQuestion, 1500);
}
}
function updateDisplay() {
document.getElementById('correct').textContent = correctAnswers;
document.getElementById('wrong').textContent = wrongAnswers;
document.getElementById('remaining').textContent = 10 - questionsOnLevel;
document.getElementById('level').textContent = levelNames[currentLevel];
}
function checkLevelProgress() {
let percentage = (correctAnswers / (correctAnswers + wrongAnswers)) * 100;
if (currentLevel < 3 && percentage >= 80) {
setTimeout(() => {
alert('Поздравляем! Вы переходите на следующий уровень!');
currentLevel++;
questionsOnLevel = 0;
correctAnswers = 0;
wrongAnswers = 0;
usedQuestions = [];
updateDisplay();
startTimer();
generateQuestion();
}, 1500);
} else if (currentLevel === 3 && percentage >= 80) {
setTimeout(() => {
showResult('Поздравляем! Вы успешно завершили все уровни игры!');
}, 1500);
} else {
setTimeout(() => {
showResult('К сожалению, вы не смогли перейти на следующий уровень. Попробуйте еще раз!');
}, 1500);
}
}
function showResult(message) {
clearInterval(timerInterval);
document.getElementById('question-container').style.display = 'none';
document.getElementById('feedback').style.display = 'none';
document.getElementById('result-container').style.display = 'block';
document.getElementById('result-message').textContent = message;
}
function restartGame() {
currentLevel = 1;
correctAnswers = 0;
wrongAnswers = 0;
questionsOnLevel = 0;
usedQuestions = [];
document.getElementById('question-container').style.display = 'block';
document.getElementById('feedback').style.display = 'block';
document.getElementById('result-container').style.display = 'none';
updateDisplay();
startTimer();
generateQuestion();
}
function exitGame() {
if (confirm('Вы уверены, что хотите выйти из игры?')) {
clearInterval(timerInterval);
window.close();
}
}
document.getElementById('answer').addEventListener('keypress', function(event) {
if (event.key === 'Enter') {
checkAnswer();
}
});
window.onload = function() {
updateDisplay();
startTimer();
generateQuestion();
};