📖
Архітектура гри та HTML структура
Розберемо як влаштована гра і напишемо HTML скелет
🎓
Це твій фінальний проект!
Ти пройшов курс JavaScript і курс HTML/CSS. Тепер час зібрати всі знання разом і написати справжню гру. Memory Game — це класична гра де є 16 карток (8 пар), всі перевернуті. Ти відкриваєш дві — якщо вони однакові, залишаються відкритими. Якщо ні — перевертаються назад. Мета — відкрити всі пари якнайшвидше.
Що ми будемо використовувати
JavaScript:
- Масиви — зберігати картки
- Функції — shuffle, flipCard, checkMatch
- if/else — перевірка пар
- Цикли — рендер карток
- DOM — document.createElement, classList
- setInterval — таймер
HTML:
- Семантична структура (header, main)
- div для карток і сітки
- id і class атрибути
CSS:
- CSS Grid для сітки карток
- transition + transform для flip анімації
- backface-visibility для 3D ефекту
HTML структура гри
html
<!DOCTYPE html>
<html lang="uk">
<head>
<meta charset="UTF-8">
<meta name="viewport" content="width=device-width, initial-scale=1.0">
<title>Memory Game</title>
<link rel="stylesheet" href="style.css">
</head>
<body>
<div class="game-wrapper">
<!-- Шапка з рахунком та таймером -->
<header class="game-header">
<h1>🃏 Memory Game</h1>
<div class="stats">
<div class="stat">
<span class="stat-label">Ходів:</span>
<span class="stat-value" id="moves">0</span>
</div>
<div class="stat">
<span class="stat-label">Час:</span>
<span class="stat-value" id="timer">0s</span>
</div>
</div>
<button id="restart-btn">🔄 Почати знову</button>
</header>
<!-- Ігрова сітка (4×4 = 16 карток) -->
<main class="game-board" id="game-board">
<!-- Картки генеруються через JavaScript -->
</main>
<!-- Повідомлення про перемогу (приховане) -->
<div class="win-screen" id="win-screen" hidden>
<h2>🎉 Молодець!</h2>
<p id="win-message"></p>
<button id="play-again-btn">Зіграти ще раз</button>
</div>
</div>
<script src="game.js"></script>
</body>
</html>CSS для гри
Скопіюй цей CSS в файл style.css — він вже готовий, весь фокус буде на JavaScript:
css
* { box-sizing: border-box; margin: 0; padding: 0; }
body {
min-height: 100vh;
display: flex;
align-items: center;
justify-content: center;
background: linear-gradient(135deg, #667eea 0%, #764ba2 100%);
font-family: 'Inter', system-ui, sans-serif;
}
.game-wrapper {
background: white;
border-radius: 20px;
padding: 32px;
box-shadow: 0 20px 60px rgba(0,0,0,0.3);
max-width: 600px;
width: 100%;
}
.game-header {
display: flex;
justify-content: space-between;
align-items: center;
margin-bottom: 24px;
flex-wrap: wrap;
gap: 12px;
}
.game-header h1 { font-size: 1.5rem; color: #1e293b; }
.stats { display: flex; gap: 16px; }
.stat { text-align: center; }
.stat-label { font-size: 0.75rem; color: #64748b; display: block; }
.stat-value { font-size: 1.5rem; font-weight: 700; color: #6070f7; }
#restart-btn {
background: #f1f5f9;
border: none;
border-radius: 8px;
padding: 8px 16px;
cursor: pointer;
font-size: 0.875rem;
transition: background 0.2s;
}
#restart-btn:hover { background: #e2e8f0; }
/* Ігрова сітка */
.game-board {
display: grid;
grid-template-columns: repeat(4, 1fr);
gap: 12px;
}
/* Картка */
.card {
aspect-ratio: 3/4;
cursor: pointer;
perspective: 600px;
}
.card-inner {
width: 100%;
height: 100%;
position: relative;
transform-style: preserve-3d;
transition: transform 0.4s ease;
border-radius: 10px;
}
.card.flipped .card-inner,
.card.matched .card-inner {
transform: rotateY(180deg);
}
.card-front,
.card-back {
position: absolute;
width: 100%;
height: 100%;
border-radius: 10px;
display: flex;
align-items: center;
justify-content: center;
backface-visibility: hidden;
font-size: 2rem;
}
.card-front {
background: linear-gradient(135deg, #667eea, #764ba2);
color: white;
font-size: 1.5rem;
font-weight: 700;
}
.card-back {
background: white;
border: 2px solid #e2e8f0;
transform: rotateY(180deg);
}
.card.matched .card-back { border-color: #22c55e; background: #f0fdf4; }
.card.matched { pointer-events: none; }
/* Екран перемоги */
.win-screen {
position: fixed;
inset: 0;
background: rgba(0,0,0,0.7);
display: flex;
flex-direction: column;
align-items: center;
justify-content: center;
gap: 16px;
color: white;
font-size: 1.25rem;
}
.win-screen h2 { font-size: 3rem; }
#play-again-btn {
background: #6070f7;
color: white;
border: none;
padding: 12px 32px;
border-radius: 12px;
font-size: 1rem;
cursor: pointer;
margin-top: 8px;
}Не треба розуміти кожен рядок CSS зразу! Головне — ти вже знаєш grid, flexbox, transition, backface-visibility з курсу. Скопіюй CSS і зосередься на JavaScript логіці — саме її ми будемо писати в завданнях.