import { useState, useEffect, useCallback } from 'react'; import { X } from 'lucide-react'; export default function WhackAMoleGame() { const [gameActive, setGameActive] = useState(false); const [score, setScore] = useState(0); const [timeLeft, setTimeLeft] = useState(30); const [moles, setMoles] = useState(Array(9).fill(false)); const [gameOver, setGameOver] = useState(false); const [highScore, setHighScore] = useState(0); // Generate a new mole const generateMole = useCallback(() => { if (!gameActive) return; const newMoles = [...moles]; // Hide all moles first newMoles.fill(false); // Show 1-3 moles randomly const numberOfMoles = Math.floor(Math.random() * 3) + 1; for (let i = 0; i < numberOfMoles; i++) { const randomIndex = Math.floor(Math.random() * 9); newMoles[randomIndex] = true; } setMoles(newMoles); }, [moles, gameActive]); // Handle whacking a mole const whackMole = (index) => { if (!gameActive || !moles[index]) return; // Update score setScore(prevScore => prevScore + 1); // Hide the mole const newMoles = [...moles]; newMoles[index] = false; setMoles(newMoles); }; // Start the game const startGame = () => { setGameActive(true); setScore(0); setTimeLeft(30); setMoles(Array(9).fill(false)); setGameOver(false); }; // Timer effect useEffect(() => { if (!gameActive) return; const timer = setInterval(() => { setTimeLeft(prevTime => { if (prevTime <= 1) { clearInterval(timer); setGameActive(false); setGameOver(true); setHighScore(prevHighScore => Math.max(prevHighScore, score)); return 0; } return prevTime - 1; }); }, 1000); return () => clearInterval(timer); }, [gameActive, score]); // Mole generation effect useEffect(() => { if (!gameActive) return; const moleInterval = setInterval(generateMole, 1000); return () => clearInterval(moleInterval); }, [gameActive, generateMole]); return (
Click on the moles as they appear to score points!
Your score: {score}
High score: {highScore}