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 (
-
-
-
-
- -
- Get started by editing{" "}
-
- app/page.js
-
- .
-
- -
- Save and see your changes instantly.
-
-
-
-
-
-
+
+
- );
+ )
}
+
+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