| <!DOCTYPE html> |
| <html lang="en"> |
| <head> |
| <meta charset="UTF-8"> |
| <meta name="viewport" content="width=device-width, initial-scale=1.0"> |
| <title>Fun Math Game</title> |
| <style> |
| * { |
| margin: 0; |
| padding: 0; |
| box-sizing: border-box; |
| font-family: 'Segoe UI', Tahoma, Geneva, Verdana, sans-serif; |
| } |
| |
| body { |
| min-height: 100vh; |
| display: flex; |
| justify-content: center; |
| align-items: center; |
| background: linear-gradient(45deg, #6ab1e7, #4377c4); |
| padding: 20px; |
| } |
| |
| .container { |
| background: white; |
| padding: 2rem; |
| border-radius: 20px; |
| box-shadow: 0 10px 30px rgba(0,0,0,0.2); |
| max-width: 500px; |
| width: 90%; |
| text-align: center; |
| } |
| |
| .header { |
| margin-bottom: 2rem; |
| } |
| |
| .title { |
| font-size: 2rem; |
| color: #4377c4; |
| margin-bottom: 1rem; |
| } |
| |
| .stats { |
| display: flex; |
| justify-content: space-around; |
| margin-bottom: 1rem; |
| } |
| |
| .stat-item { |
| background: #f0f8ff; |
| padding: 0.5rem 1rem; |
| border-radius: 10px; |
| font-weight: bold; |
| } |
| |
| .question { |
| font-size: 2.5rem; |
| margin: 1.5rem 0; |
| color: #333; |
| animation: fadeIn 0.5s ease; |
| } |
| |
| .options { |
| display: grid; |
| grid-template-columns: repeat(2, 1fr); |
| gap: 1rem; |
| margin: 2rem 0; |
| } |
| |
| .option { |
| padding: 1rem; |
| border: 2px solid #4377c4; |
| border-radius: 15px; |
| cursor: pointer; |
| transition: all 0.3s ease; |
| font-size: 1.2rem; |
| background: white; |
| } |
| |
| .option:hover { |
| background: #4377c4; |
| color: white; |
| transform: translateY(-2px); |
| box-shadow: 0 5px 15px rgba(67, 119, 196, 0.3); |
| } |
| |
| .feedback { |
| margin: 1rem 0; |
| font-size: 1.3rem; |
| min-height: 1.5em; |
| font-weight: bold; |
| } |
| |
| .correct { |
| color: #2ecc71; |
| animation: bounce 0.5s ease; |
| } |
| |
| .wrong { |
| color: #e74c3c; |
| animation: shake 0.5s ease; |
| } |
| |
| .next-btn { |
| background: #4377c4; |
| color: white; |
| border: none; |
| padding: 1rem 2.5rem; |
| border-radius: 10px; |
| cursor: pointer; |
| font-size: 1.1rem; |
| transition: all 0.3s ease; |
| font-weight: bold; |
| } |
| |
| .next-btn:hover { |
| transform: scale(1.05); |
| box-shadow: 0 5px 15px rgba(67, 119, 196, 0.3); |
| } |
| |
| .timer { |
| width: 100%; |
| height: 5px; |
| background: #eee; |
| margin-bottom: 1rem; |
| border-radius: 5px; |
| overflow: hidden; |
| } |
| |
| .timer-bar { |
| height: 100%; |
| background: #4377c4; |
| width: 100%; |
| transition: width 1s linear; |
| } |
| |
| @keyframes fadeIn { |
| from { opacity: 0; transform: translateY(-10px); } |
| to { opacity: 1; transform: translateY(0); } |
| } |
| |
| @keyframes bounce { |
| 0%, 100% { transform: scale(1); } |
| 50% { transform: scale(1.1); } |
| } |
| |
| @keyframes shake { |
| 0%, 100% { transform: translateX(0); } |
| 25% { transform: translateX(-5px); } |
| 75% { transform: translateX(5px); } |
| } |
| |
| @media (max-width: 480px) { |
| .container { |
| padding: 1rem; |
| } |
| |
| .question { |
| font-size: 1.8rem; |
| } |
| |
| .option { |
| font-size: 1rem; |
| padding: 0.8rem; |
| } |
| } |
| </style> |
| </head> |
| <body> |
| <div class="container"> |
| <div class="header"> |
| <h1 class="title">Fun Math Game 🎮</h1> |
| <div class="timer"> |
| <div class="timer-bar" id="timer-bar"></div> |
| </div> |
| <div class="stats"> |
| <div class="stat-item">Score: <span id="score">0</span></div> |
| <div class="stat-item">Level: <span id="level">1</span></div> |
| <div class="stat-item">Streak: <span id="streak">0</span></div> |
| </div> |
| </div> |
| <div class="question" id="question"></div> |
| <div class="options" id="options"></div> |
| <div class="feedback" id="feedback"></div> |
| <button class="next-btn" onclick="nextQuestion()">Next Question ➡️</button> |
| </div> |
|
|
| <script> |
| let score = 0; |
| let level = 1; |
| let streak = 0; |
| let correctAnswer; |
| let timerInterval; |
| |
| function startTimer() { |
| clearInterval(timerInterval); |
| const timerBar = document.getElementById('timer-bar'); |
| timerBar.style.width = '100%'; |
| |
| let timeLeft = 100; |
| timerInterval = setInterval(() => { |
| timeLeft -= 1; |
| timerBar.style.width = timeLeft + '%'; |
| |
| if (timeLeft <= 0) { |
| clearInterval(timerInterval); |
| checkAnswer(null); |
| } |
| }, 100); |
| } |
| |
| function generateQuestion() { |
| const operations = ['+', '-', '*', '/']; |
| const operation = operations[Math.floor(Math.random() * operations.length)]; |
| let num1, num2; |
| const maxNum = 10 + (level * 5); |
| |
| switch(operation) { |
| case '+': |
| num1 = Math.floor(Math.random() * maxNum); |
| num2 = Math.floor(Math.random() * maxNum); |
| correctAnswer = num1 + num2; |
| break; |
| case '-': |
| num1 = Math.floor(Math.random() * maxNum); |
| num2 = Math.floor(Math.random() * num1); |
| correctAnswer = num1 - num2; |
| break; |
| case '*': |
| num1 = Math.floor(Math.random() * (level + 5)); |
| num2 = Math.floor(Math.random() * (level + 5)); |
| correctAnswer = num1 * num2; |
| break; |
| case '/': |
| num2 = Math.floor(Math.random() * (level + 3)) + 1; |
| correctAnswer = Math.floor(Math.random() * (level + 3)); |
| num1 = correctAnswer * num2; |
| break; |
| } |
| |
| document.getElementById('question').textContent = `${num1} ${operation} ${num2} = ?`; |
| generateOptions(correctAnswer); |
| startTimer(); |
| } |
| |
| function generateOptions(correct) { |
| const options = [correct]; |
| const range = Math.max(10, correct * 0.5); |
| |
| while(options.length < 4) { |
| const randomOption = correct + Math.floor(Math.random() * range) - (range/2); |
| if(!options.includes(randomOption) && randomOption >= 0) { |
| options.push(randomOption); |
| } |
| } |
| |
| options.sort(() => Math.random() - 0.5); |
| |
| const optionsContainer = document.getElementById('options'); |
| optionsContainer.innerHTML = ''; |
| |
| options.forEach(option => { |
| const button = document.createElement('div'); |
| button.className = 'option'; |
| button.textContent = option; |
| button.onclick = () => checkAnswer(option); |
| optionsContainer.appendChild(button); |
| }); |
| } |
| |
| function checkAnswer(selected) { |
| clearInterval(timerInterval); |
| const feedback = document.getElementById('feedback'); |
| |
| if(selected === correctAnswer) { |
| score += (level * 10); |
| streak++; |
| if(streak % 3 === 0) level++; |
| |
| document.getElementById('score').textContent = score; |
| document.getElementById('level').textContent = level; |
| document.getElementById('streak').textContent = streak; |
| |
| feedback.textContent = "Awesome! 🎉"; |
| feedback.className = 'feedback correct'; |
| } else { |
| streak = 0; |
| document.getElementById('streak').textContent = streak; |
| feedback.textContent = selected === null ? "Time's up! ⏰" : "Wrong! Try again! 😢"; |
| feedback.className = 'feedback wrong'; |
| } |
| |
| document.querySelectorAll('.option').forEach(option => { |
| option.style.pointerEvents = 'none'; |
| if(parseInt(option.textContent) === correctAnswer) { |
| option.style.background = '#2ecc71'; |
| option.style.color = 'white'; |
| } else if(parseInt(option.textContent) === selected && selected !== correctAnswer) { |
| option.style.background = '#e74c3c'; |
| option.style.color = 'white'; |
| } |
| }); |
| } |
| |
| function nextQuestion() { |
| document.getElementById('feedback').textContent = ''; |
| generateQuestion(); |
| } |
| |
| |
| generateQuestion(); |
| </script> |
| </body> |
| </html> |