From 62eb682d0c0a1046df46106bfb28e92c6c461706 Mon Sep 17 00:00:00 2001 From: prathoseraaj Date: Sat, 30 Aug 2025 09:30:41 +0530 Subject: [PATCH] feat: memory game --- memory-game/app/globals.css | 4 +- memory-game/app/page.js | 107 ++----------------- memory-game/components/MemoryGame.jsx | 147 ++++++++++++++++++++++++++ 3 files changed, 157 insertions(+), 101 deletions(-) create mode 100644 memory-game/components/MemoryGame.jsx diff --git a/memory-game/app/globals.css b/memory-game/app/globals.css index a2dc41ec..14aac09a 100644 --- a/memory-game/app/globals.css +++ b/memory-game/app/globals.css @@ -12,7 +12,7 @@ --font-mono: var(--font-geist-mono); } -@media (prefers-color-scheme: dark) { +@media (prefers-color-scheme: light) { :root { --background: #0a0a0a; --foreground: #ededed; @@ -23,4 +23,4 @@ body { background: var(--background); color: var(--foreground); font-family: Arial, Helvetica, sans-serif; -} +} \ No newline at end of file diff --git a/memory-game/app/page.js b/memory-game/app/page.js index 8d04cec6..7f7733a9 100644 --- a/memory-game/app/page.js +++ b/memory-game/app/page.js @@ -1,103 +1,12 @@ -import Image from "next/image"; +import MemoryGame from '@/components/MemoryGame' +import React from 'react' -export default function Home() { +const page = () => { return ( -
-
- Next.js logo -
    -
  1. - Get started by editing{" "} - - app/page.js - - . -
  2. -
  3. - Save and see your changes instantly. -
  4. -
- -
- - Vercel logomark - Deploy now - - - Read our docs - -
-
- +
+
- ); + ) } + +export default page \ No newline at end of file diff --git a/memory-game/components/MemoryGame.jsx b/memory-game/components/MemoryGame.jsx new file mode 100644 index 00000000..1c791ac0 --- /dev/null +++ b/memory-game/components/MemoryGame.jsx @@ -0,0 +1,147 @@ +"use client"; + +import React, { useEffect, useState } from "react"; + +const MemoryGame = () => { + const [gridSize, setGridSize] = useState(2); + + const [array, setArray] = useState([]); + const [flipped, setFlipped] = useState([]); + const [slectedPairs, setSelectedPairs] = useState([]); + const [disabled, setDisabled] = useState(false); + + const [won, setWon] = useState(false); + + const handleGridSize = (e) => { + const size = parseInt(e.target.value); + //console.log(size) + if (2 <= size && size <= 10) { + setGridSize(size); + } + }; + + const initalizeGame = () => { + const totalCards = gridSize * gridSize; + const pairCount = Math.floor(totalCards / 2); + + const numbers = [...Array(pairCount).keys()].map((n) => n + 1); + const suffledCards = [...numbers, ...numbers] + .sort(() => Math.random() - 0.5) + .map((number, index) => ({ + id: index, + number, + })); + + setArray(suffledCards); + setFlipped([]); + setSelectedPairs([]); + setDisabled(false); + setWon(false); + }; + + const handleMatch = (secondId) => { + const [firstId] = flipped; + + if (array[firstId].number == array[secondId].number) { + setSelectedPairs([...slectedPairs, firstId, secondId]); + setFlipped([]); + setDisabled(false); + } else { + setTimeout(() => { + setDisabled(false); + setFlipped([]); + }, 1000); + } + }; + + useEffect(() => { + initalizeGame(); + }, [gridSize]); + + const handleClick = (id) => { + if (disabled || won) return; + + if (flipped.length === 0) { + setFlipped([id]); + return; + } + + if (flipped.length === 1) { + setDisabled(true); //so we cant choose another one + if (id !== flipped[0]) { + setFlipped([...flipped, id]); + //check match logic + handleMatch(id); + } else { + setFlipped([]); + setDisabled(false); + } + } + }; + + const isFlipped = (id) => flipped.includes(id) || slectedPairs.includes(id); + const isselectedpairs = (id) => slectedPairs.includes(id); + + useEffect(() => { + if (slectedPairs.length === array.length && array.length > 0) { + setWon(true); + } + }, [slectedPairs, array]); + + return ( +
+ {/* Heading */} +

Memory Game

+ {/* Grid Size */} +
+ + +
+ {/* Cards */} +
+ {array.map((array) => ( +
handleClick(array.id)} + className={`aspect-square flex items-center justify-center text-xl transition-all duration-300 font-bold rounded-lg cursor-pointer ${ + isFlipped(array.id) + ? isselectedpairs(array.id) + ? "bg-green-500 text-white" + : "bg-blue-500 text-white" + : "bg-gray-300 text-gray-400 " + }`} + > + {isFlipped(array.id) ? array.number : "?"} +
+ ))} +
+ {/* Result */} +
+ {won ? "You Won!" : ""} +
+ + {/* Rest Button */} + +
+ ); +}; + +export default MemoryGame; \ No newline at end of file