Beispiel:Memo-Card-3.html
<!DOCTYPE html> <html lang="de"> <head>
<meta charset="utf-8"> <meta name="viewport" content="width=device-width, initial-scale=1.0"> <link rel="stylesheet" media="screen" href="./Beispiel:SELFHTML-Beispiel-Grundlayout.css"> <title>Memo-Quiz - fertig!</title> <style>
- gameboard {
display: grid; gap: 1em;
grid-template-columns: repeat(4, 1fr); width: 32em; }
- gameboard button {
width: 8em; aspect-ratio: 1 / 1; perspective: 500px; background: transparent; border: 0; padding: 0;
}
img {
max-width: 100%; display: block;
}
.flip-card-inner {
position: relative; width: 100%; height: 100%; text-align: center; transition: transform 0.6s; transform-style: preserve-3d;
}
ul {
text-align: start;
}
.flip-card[aria-selected="true"] .flip-card-inner {
transform: rotateY(180deg);
}
.flip-card-front, .flip-card-back {
position: absolute; top: 0; left: 0; width: 100%; height: 100%; border: thin solid black; backface-visibility: hidden;
}
.flip-card-front {
background-color: #e6f2f7; transform: rotateY(180deg);
}
.flip-card-front img {
width: 100%; height: auto; background-color: #fff; display: block;
}
.flip-card-back {
background: white url(https://wiki.selfhtml.org/images/4/45/SELF-Logo.svg); background-size: contain; background-repeat: no-repeat; background-position: center;
}
.error, .success { padding: 1rem 2rem; }
.error { background: #ffdddd; color: red; }
.success { background: #ddffdd; color: green; white-space: pre-wrap; }
</style>
</head>
<body>
Memo-Quiz
Wähle zwei Karten aus und prüfe, ob sie ein Set sind.
<img src="https://wiki.selfhtml.org/images/f/fd/Snowman.svg" alt="snowman"> <img src="https://wiki.selfhtml.org/images/9/90/Advent-candles-4.svg" alt="candles"> <img src="https://wiki.selfhtml.org/images/0/01/Selfhtml-logo-Weihnachten.png" alt="SELF-Logo mit Nikloausmütze, ca 2008"> <img src="https://wiki.selfhtml.org/images/5/59/Selfangel.jpg" alt="SELF-Mitglied als Weihnachtsengel, ca 2008"> <img src="https://wiki.selfhtml.org/images/4/47/Elf.svg" alt="ELF"> <img src="https://wiki.selfhtml.org/images/6/66/SELF-Logo-Nikolaus.svg" alt="logo">
Zum Tutorial: <a href="https://wiki.selfhtml.org/wiki/JavaScript/Tutorials/Spiele/Memo-Quiz">Memo-Quiz</a>.
<a href="https://forum.selfhtml.org/advent/2024">Zurück zum
Adventskalender 2024.
<script>
document.addEventListener("DOMContentLoaded", () => {
const gameboard = document.querySelector("#gameboard"); const hint = document.querySelector("#hint");
let selectedCards = []; let totalPairs; let matchedPairs = 0;
function alert(text, type) { if (text) { setTimeout(() => { hint.textContent = text; hint.className = type ? type : "error"; }, 50); } else { hint.textContent = ""; hint.className = ""; } }
function shuffle(array) { for (let i = array.length - 1; i > 0; i--) { const j = Math.floor(Math.random() * (i + 1)); [array[i], array[j]] = [array[j], array[i]]; } }
function initializeGame() { const images = Array.from(gameboard.querySelectorAll("img")); const cards = [];
images.forEach((img) => { cards.push({ src: img.src, alt: img.alt }); cards.push({ src: img.src, alt: img.alt }); });
shuffle(cards);
gameboard.innerHTML = ""; matchedPairs = 0; totalPairs = cards.length / 2;
cards.forEach(({ src, alt }) => { const button = createCard(src, alt); gameboard.appendChild(button); }); }
function createCard(src, alt) { const button = document.createElement("button"); button.classList.add("flip-card"); button.setAttribute("aria-selected", "false");
const flipCardInner = document.createElement("div"); flipCardInner.classList.add("flip-card-inner");
const flipCardFront = document.createElement("img"); flipCardFront.classList.add("flip-card-front"); flipCardFront.src = src; flipCardFront.alt = alt;
const flipCardBack = document.createElement("div"); flipCardBack.classList.add("flip-card-back");
flipCardInner.appendChild(flipCardFront); flipCardInner.appendChild(flipCardBack); button.appendChild(flipCardInner);
button.addEventListener("click", () => { handleCardClick(button, src); });
return button; }
function handleCardClick(card, src) { if (selectedCards.length >= 2 || card.getAttribute("aria-selected") === "true") { return; }
card.setAttribute("aria-selected", "true"); selectedCards.push({ card, src });
if (selectedCards.length === 2) { const [firstCard, secondCard] = selectedCards;
if (firstCard.src === secondCard.src) { matchedPairs++; selectedCards = []; if (matchedPairs === totalPairs) { alert("Herzlichen Glückwunsch!", "success"); } } else {
setTimeout(() => { firstCard.card.setAttribute("aria-selected", "false"); secondCard.card.setAttribute("aria-selected", "false"); selectedCards = []; }, 1000); } } }
initializeGame();
}); </script> </body> </html>