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 (

Whack-a-Mole

Score: {score}
Time: {timeLeft}s
{!gameActive && !gameOver && (

Ready to play?

Click on the moles as they appear to score points!

)} {gameActive && (
{moles.map((active, index) => (
whackMole(index)} className={`h-24 rounded-lg flex items-center justify-center cursor-pointer transition-all duration-150 ${ active ? 'bg-amber-400 shadow-md transform scale-105' : 'bg-gray-200' }`} > {active && (
)}
))}
)} {gameOver && (

Game Over!

Your score: {score}

High score: {highScore}

)}
); }