"use client" import { useState, useEffect } from "react" import { Button } from "@/components/ui/button" import { Input } from "@/components/ui/input" import { Label } from "@/components/ui/label" import { RadioGroup, RadioGroupItem } from "@/components/ui/radio-group" import { Slider } from "@/components/ui/slider" import { Switch } from "@/components/ui/switch" import { Tabs, TabsContent, TabsList, TabsTrigger } from "@/components/ui/tabs" type Operation = "+" | "-" | "*" | "/" | "^" | "√" | "log" | "sin" | "cos" | "tan" | "P" | "C" type Difficulty = "easy" | "medium" | "hard" | "olympiad" interface Question { question: string answer: number } const operations: Operation[] = ["+", "-", "*", "/", "^", "√", "log", "sin", "cos", "tan", "P", "C"] function generateQuestion( difficulty: Difficulty, allowedOperations: Operation[], useNegatives: boolean, useDecimals: boolean ): Question { const operation = allowedOperations[Math.floor(Math.random() * allowedOperations.length)] let num1: number, num2: number, answer: number, question: string const getNumber = (max: number): number => { let num = Math.floor(Math.random() * max) + 1 if (useNegatives && Math.random() < 0.5) num *= -1 if (useDecimals) num += Math.random() return Number(num.toFixed(2)) } switch (difficulty) { case "easy": num1 = getNumber(10) num2 = getNumber(10) break case "medium": num1 = getNumber(50) num2 = getNumber(50) break case "hard": num1 = getNumber(100) num2 = getNumber(100) break case "olympiad": num1 = getNumber(1000) num2 = getNumber(1000) break } switch (operation) { case "+": answer = num1 + num2 question = `${num1} + ${num2}` break case "-": answer = num1 - num2 question = `${num1} - ${num2}` break case "*": answer = num1 * num2 question = `${num1} × ${num2}` break case "/": answer = num1 num2 = Math.floor(Math.random() * 10) + 1 question = `${answer * num2} ÷ ${num2}` break case "^": num2 = Math.floor(Math.random() * 5) + 2 // Random power between 2 and 6 answer = Math.pow(num1, num2) question = `${num1}^${num2}` break case "√": answer = Math.sqrt(num1) question = `√${num1}` break case "log": answer = Math.log(num1) / Math.log(num2) question = `log${num2}(${num1})` break case "sin": answer = Math.sin((num1 * Math.PI) / 180) question = `sin(${num1}°)` break case "cos": answer = Math.cos((num1 * Math.PI) / 180) question = `cos(${num1}°)` break case "tan": answer = Math.tan((num1 * Math.PI) / 180) question = `tan(${num1}°)` break case "P": num2 = Math.min(num2, num1) answer = factorial(num1) / factorial(num1 - num2) question = `P(${num1}, ${num2})` break case "C": num2 = Math.min(num2, num1) answer = factorial(num1) / (factorial(num2) * factorial(num1 - num2)) question = `C(${num1}, ${num2})` break } return { question, answer: Number(answer.toFixed(4)) } } function factorial(n: number): number { if (n === 0 || n === 1) return 1 return n * factorial(n - 1) } export function MindMathComponent() { const [gameState, setGameState] = useState<"setup" | "playing" | "finished">("setup") const [difficulty, setDifficulty] = useState("medium") const [questionCount, setQuestionCount] = useState(10) const [timeLimit, setTimeLimit] = useState(60) const [selectedOperations, setSelectedOperations] = useState(["+", "-", "*", "/"]) const [currentQuestion, setCurrentQuestion] = useState(null) const [userAnswer, setUserAnswer] = useState("") const [score, setScore] = useState(0) const [questionsAnswered, setQuestionsAnswered] = useState(0) const [timeRemaining, setTimeRemaining] = useState(timeLimit) const [useNegatives, setUseNegatives] = useState(false) const [useDecimals, setUseDecimals] = useState(false) const [speedRound, setSpeedRound] = useState(false) const [customTemplate, setCustomTemplate] = useState("") useEffect(() => { let timer: NodeJS.Timeout if (gameState === "playing" && timeRemaining > 0) { timer = setTimeout(() => setTimeRemaining(timeRemaining - 1), 1000) } else if (timeRemaining === 0) { endGame() } return () => clearTimeout(timer) }, [gameState, timeRemaining]) const startGame = () => { setGameState("playing") setScore(0) setQuestionsAnswered(0) setTimeRemaining(timeLimit) nextQuestion() } const nextQuestion = () => { if (questionsAnswered < questionCount) { if (customTemplate) { setCurrentQuestion(generateCustomQuestion(customTemplate)) } else { setCurrentQuestion(generateQuestion(difficulty, selectedOperations, useNegatives, useDecimals)) } setUserAnswer("") if (speedRound) { setTimeout(() => { submitAnswer() }, 5000) // 5 seconds for speed round } } else { endGame() } } const submitAnswer = () => { if (currentQuestion && Math.abs(parseFloat(userAnswer) - currentQuestion.answer) < 0.01) { setScore(score + 1) } setQuestionsAnswered(questionsAnswered + 1) nextQuestion() } const endGame = () => { setGameState("finished") } const resetGame = () => { setGameState("setup") } const quitGame = () => { setGameState("finished") } const generateCustomQuestion = (template: string): Question => { // Implement custom question generation based on the template // This is a placeholder implementation return { question: template, answer: 0 } } const handleKeyPress = (event: React.KeyboardEvent) => { if (event.key === 'Enter') { submitAnswer(); } }; return (

MindMath

{gameState === "setup" && ( Basic Settings Advanced Settings
setDifficulty(value)} className="flex flex-wrap gap-4 mt-2" > {["easy", "medium", "hard", "olympiad"].map((level) => (
))}
setQuestionCount(value[0])} className="mt-2" />
setTimeLimit(value[0])} className="mt-2" />
{operations.map((op) => (
setSelectedOperations( checked ? [...selectedOperations, op] : selectedOperations.filter((o) => o !== op) ) } />
))}
setCustomTemplate(e.target.value)} placeholder="e.g., {x} + {y} where x is [1-100] and y is [1-50]" className="mt-2" />
)} {gameState === "setup" && ( )} {gameState === "playing" && currentQuestion && (
{currentQuestion.question}
Question {questionsAnswered + 1} of {questionCount}
setUserAnswer(e.target.value)} onKeyPress={handleKeyPress} placeholder="Enter your answer" className="text-center text-xl" />
Time Remaining: {timeRemaining} seconds
)} {gameState === "finished" && (

Game Over!

Your Score: {score} / {questionsAnswered}

Accuracy: {((score / questionsAnswered) * 100).toFixed(2)}%

)}
) }