Przejdź do głównej zawartości

19. Gra Memory

Klasyczna gra Memory — plansza z zakrytymi kartami, klikanie par, animacja obrotu, licznik ruchów i czasu.

function useMemoryGame(cardCount) {
const [cards, setCards] = useState(() => createShuffledCards(cardCount));
const [flipped, setFlipped] = useState([]);
const [matched, setMatched] = useState([]);
const [moves, setMoves] = useState(0);
function flipCard(id) {
if (flipped.length === 2) return;
if (flipped.includes(id) || matched.includes(id)) return;
const newFlipped = [...flipped, id];
setFlipped(newFlipped);
setMoves((m) => m + 1);
if (newFlipped.length === 2) {
const [a, b] = newFlipped.map((i) => cards.find((c) => c.id === i));
if (a.symbol === b.symbol) {
setMatched((m) => [...m, a.id, b.id]);
setFlipped([]);
} else {
setTimeout(() => setFlipped([]), 1000);
}
}
}
const isComplete = matched.length === cards.length;
return { cards, flipped, matched, moves, flipCard, isComplete };
}
function createShuffledCards(count) {
const emojis = ['🐶','🐱','🐭','🐹','🐰','🦊','🐻','🐼','🐨','🐯'];
const pairs = emojis.slice(0, count / 2).flatMap((e, i) => [
{ id: i * 2, symbol: e },
{ id: i * 2 + 1, symbol: e },
]);
return pairs.sort(() => Math.random() - 0.5);
}
  • Plansza 4×4 (16 kart / 8 par) z emoji
  • Klikanie odkrywa kartę, 2. kliknięcie sprawdza parę
  • Animacja obrotu karty (CSS)
  • Licznik ruchów
  • Ekran wygranej z wynikiem
Ocena: 3.0

Powodzenia!

Gra Memory to projekt, który łączy logikę gry, zarządzanie stanem i animacje CSS. Ważny niuans: po odkryciu 2 kart (które nie pasują) musisz poczekać chwilę zanim je schowasz — setTimeout(() => setFlipped([]), 1000). Bez tego gracz nie ma czasu zobaczyć kart!