| | <!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> |