์๋ฐ์คํฌ๋ฆฝํธ : ๊ฒ์ ํจ๊ณผ : ๋ฉ๋ชจ๋ฆฌ ๊ฒ์
์ด๋ฒ์๋ ๊ฐ์ ๊ทธ๋ฆผ ์ฐพ๊ธฐ ๋ฉ๋ชจ๋ฆฌ ๊ฒ์์ ๋ง๋ค์ด ๋ณด๋๋ก ํ๊ฒ ์ต๋๋ค.
0. HTML
HTML ์์ค๋ ์๋๋ฅผ ์ฐธ๊ณ ํด ์ฃผ์ธ์.
HTML ์์ค ๋ณด๊ธฐ
<div class="memory__wrap">
<div class="memory__inner"><span class="memory-close"></span>
<div class="memory__main">
<h3>Memory Game</h3>
<p class="memory__start">START</p>
</div>
<div class="memory__card">
<h3>Memory Game</h3>
<div class="memory__card__info">
<p>์ ์ : <span class="memory__card__score">0</span> / 16</p>
<p>๋จ์ ๊ธฐํ : <span class="memory__card__opp">3</span></p>
</div>
<ul class="cards">
<li>
<div class="view front">
<img src="../assets/img/card.png" alt="card__front" />
</div>
<div class="view back">
<img src="../assets/img/memory-1.svg" alt="img1" />
</div>
</li>
<li>
<div class="view front">
<img src="../assets/img/card.png" alt="card__front" />
</div>
<div class="view back">
<img src="../assets/img/memory-2.svg" alt="img2" />
</div>
</li>
<li>
<div class="view front">
<img src="../assets/img/card.png" alt="card__front" />
</div>
<div class="view back">
<img src="../assets/img/memory-3.svg" alt="img3" />
</div>
</li>
<li>
<div class="view front">
<img src="../assets/img/card.png" alt="card__front" />
</div>
<div class="view back">
<img src="../assets/img/memory-4.svg" alt="img4" />
</div>
</li>
<li>
<div class="view front">
<img src="../assets/img/card.png" alt="card__front" />
</div>
<div class="view back">
<img src="../assets/img/memory-5.svg" alt="img5" />
</div>
</li>
<li>
<div class="view front">
<img src="../assets/img/card.png" alt="card__front" />
</div>
<div class="view back">
<img src="../assets/img/memory-6.svg" alt="img6" />
</div>
</li>
<li>
<div class="view front">
<img src="../assets/img/card.png" alt="card__front" />
</div>
<div class="view back">
<img src="../assets/img/memory-7.svg" alt="img7" />
</div>
</li>
<li>
<div class="view front">
<img src="../assets/img/card.png" alt="card__front" />
</div>
<div class="view back">
<img src="../assets/img/memory-8.svg" alt="img8" />
</div>
</li>
<li>
<div class="view front">
<img src="../assets/img/card.png" alt="card__front" />
</div>
<div class="view back">
<img src="../assets/img/memory-1.svg" alt="img1" />
</div>
</li>
<li>
<div class="view front">
<img src="../assets/img/card.png" alt="card__front" />
</div>
<div class="view back">
<img src="../assets/img/memory-2.svg" alt="img2" />
</div>
</li>
<li>
<div class="view front">
<img src="../assets/img/card.png" alt="card__front" />
</div>
<div class="view back">
<img src="../assets/img/memory-3.svg" alt="img3" />
</div>
</li>
<li>
<div class="view front">
<img src="../assets/img/card.png" alt="card__front" />
</div>
<div class="view back">
<img src="../assets/img/memory-4.svg" alt="img4" />
</div>
</li>
<li>
<div class="view front">
<img src="../assets/img/card.png" alt="card__front" />
</div>
<div class="view back">
<img src="../assets/img/memory-5.svg" alt="img5" />
</div>
</li>
<li>
<div class="view front">
<img src="../assets/img/card.png" alt="card__front" />
</div>
<div class="view back">
<img src="../assets/img/memory-6.svg" alt="img6" />
</div>
</li>
<li>
<div class="view front">
<img src="../assets/img/card.png" alt="card__front" />
</div>
<div class="view back">
<img src="../assets/img/memory-7.svg" alt="img7" />
</div>
</li>
<li>
<div class="view front">
<img src="../assets/img/card.png" alt="card__front" />
</div>
<div class="view back">
<img src="../assets/img/memory-8.svg" alt="img8" />
</div>
</li>
</ul>
<!-- memory__card -->
</div>
<div class="memoryGameRestart">๋ค์ํ๊ธฐ</div>
</div>
</div>
1. ์ ํ์ ์์ ํ๊ธฐ
const memoryWrap = document.querySelector(".memory__wrap");
const memoryCard = memoryWrap.querySelectorAll(".cards li");
let cardOne, cardTwo; // ๋ค์ง๋ ์นด๋
let disableDeck = false;
let matchedCard = 0; // ์ ์
let endCardGame = 3; // ๊ธฐํ
let sound = [
"../assets/audio/search_good.m4a",
"../assets/audio/search_bad.m4a",
"../assets/audio/up.mp3",
"../assets/audio/over.mp3",
"../assets/audio/gamebg.mp3"
];
let soundMatch = new Audio(sound[0]); // ์ ๋ต ์ฌ์ด๋
let soundUnMatch = new Audio(sound[1]); // ์ค๋ต ์ฌ์ด๋
let soundSuccess = new Audio(sound[2]); // ์น๋ฆฌ ์ฌ์ด๋
let memoryGameOver = new Audio(sound[3]); // ํจ๋ฐฐ ์ฌ์ด๋
let memoryGameBg = new Audio(sound[4]); // ๋ฐฐ๊ฒฝ์์
HTML๊ณผ CSS๋ก ๋์์ธ ์์ ์ ๋ง์ณค๋ค๋ฉด, ์ ํ์๋ฅผ ๋ง๋ค์ด ์ค๋๋ค.
2. ์นด๋๋ฅผ ๋ค์ง์์ ๋์ ํจ์ ์์ ํ๊ธฐ
function flipCard(e) {
let clickedCard = e.target;
// && !disableDeck : ๋ค์งํ ์นด๋๊ฐ ์ค๋ต์ผ ๋, ํ๋ค๋ฆด ๋ ๋ค๋ฅธ ์นด๋ ๋๋ฅด๋ ๊ฒ ๋ฐฉ์ง
if (clickedCard !== cardOne && !disableDeck) {
clickedCard.classList.add("flip");
if (!cardOne) {
return (cardOne = clickedCard);
}
cardTwo = clickedCard;
disableDeck = true;
let cardOneImg = cardOne.querySelector(".back img").src;
let cardTwoImg = cardTwo.querySelector(".back img").src;
matchCards(cardOneImg, cardTwoImg);
}
}
memoryCard.forEach((card) => {
card.addEventListener("click", flipCard);
});
target์ ํจ์ ์์์ ์ด๋ฒคํธ๊ฐ ๋ฐ์ํ ๋์์ ๊ฐ๋ฆฌํต๋๋ค.
flip ํด๋์ค๊ฐ ์ถ๊ฐ๋๋ฉด, ์ฌ์ ์ ์์
ํ ์นด๋ ๋ค์ง๊ธฐ ์ ๋๋ฉ์ด์
์ด ์๋ํ์ฌ ์นด๋์ ์๋ฉด์ด ๋ณด์ด๊ฒ ๋ฉ๋๋ค.
์ด ๊ฒ์์์๋ ํ ํด์ ์นด๋๋ฅผ ๋ ์ฅ์ฉ ๋ค์ง๊ธฐ ๋๋ฌธ์,
if๋ฌธ์ ์ฌ์ฉํ์ฌ ์ฒซ ๋ฒ์งธ ํด๋ฆญ๋ ์นด๋๋ cardOne, ๋ ๋ฒ์งธ ํด๋ฆญ๋ ์นด๋๋ cardTwo๋ก ๊ตฌ๋ถํด ์ฃผ์์ต๋๋ค.
๋ค์์ ๊ตฌ๋ถํ ์นด๋๋ค์ img ์ฃผ์๋ฅผ ํ์ธํ์ฌ ์ด๋ฏธ์ง ์ผ์น ์ฌ๋ถ๋ฅผ ํ์ธํ ์ ์๋ matchCards ํจ์๋ฅผ ๋ง๋ค์ด ๋ณด๊ฒ ์ต๋๋ค.
3. ๋ ๊ฐ์ ์นด๋๋ฅผ ๋น๊ตํ๋ ํจ์ ์์ ํ๊ธฐ
function matchCards(img1, img2) {
if (img1 == img2) { // ์ผ์นํ๋ ๊ฒฝ์ฐ
matchedCard++;
matchedCard++;
soundMatch.play();
document.querySelector(".memory__card__score").innerHTML = matchedCard;
cardOne.removeEventListener("click", flipCard);
cardTwo.removeEventListener("click", flipCard);
cardOne = cardTwo = "";
disableDeck = false;
if (matchedCard == 16) {
soundSuccess.play();
memoryGameBg.pause();
setTimeout(() => {
document.querySelector(".memoryGameRestart").style.transform = "scale(1)";
}, 3000);
}
}
img1, img2๋ ์์ flipCard() ํจ์ ๋ด์์ ๋งค๊ฐ๋ณ์๋ก ์ ์กํ ์ด๋ฏธ์ง ์ฃผ์๋ฅผ ์๋ฏธํฉ๋๋ค.
๋จผ์ img1 == img2, ์ฆ ๋ ๊ฐ์ ์ด๋ฏธ์ง๊ฐ ์ผ์นํ ๋์๋, ์ ์๋ฅผ ์ถ๊ฐํด ์ฃผ๊ณ , ์ ๋ต ์ฌ์ด๋๋ฅผ ์ฌ์์ํต๋๋ค.
์ฑ๊ณตํ ์นด๋๋ ๋ค์ ๋ค์ง์ด์ง์ง ์๋๋ก removeEventListener๋ฅผ ์ฌ์ฉํ์ฌ ์์ ์์
ํ๋ ํด๋ฆญ ์ด๋ฒคํธ๋ฅผ ์ ๊ฑฐํด ์ฃผ์์ต๋๋ค.
๋, ์ด ๊ฒ์์์ ์น๋ฆฌํ ์ ์๋ ์ ์๋ 16์ ์ด๋ฏ๋ก, ์ ์๊ฐ 16์ ์ ๋ค๋ค๋ฅด๋ฉด ์น๋ฆฌ ์ฌ์ด๋๊ฐ ์ฌ์๋๊ณ , ๊ฒ์์ ๋ค์ ์์ํ ์ ์๋
๋ฒํผ์ด ๋ํ๋๋๋ก ์์
ํด ์ฃผ์์ต๋๋ค.
else { // ์ผ์นํ์ง ์๋ ๊ฒฝ์ฐ
soundUnMatch.play();
setTimeout(() => {
cardOne.classList.add("shakeX");
cardTwo.classList.add("shakeX");
}, 400);
setTimeout(() => {
cardOne.classList.remove("shakeX", "flip");
cardTwo.classList.remove("shakeX", "flip");
cardOne = cardTwo = "";
disableDeck = false;
}, 1000);
endCardGame--;
document.querySelector(".memory__card__opp").innerHTML = endCardGame;
if (endCardGame == 0) {
setTimeout(() => {
memoryGameOver.play();
memoryGameBg.pause();
memoryCard.forEach((card) => {
card.classList.add("flip");
card.removeEventListener("click", flipCard);
});
}, 1000);
setTimeout(() => {
document.querySelector(".memoryGameRestart").style.transform = "scale(1)";
}, 4000);
}
}
}
์ด๋ฏธ์ง๊ฐ ์ผ์นํ์ง ์๋ ๊ฒฝ์ฐ์๋ ์ค๋ต ์ฌ์ด๋๋ฅผ ์ฌ์์ํค๊ณ , ์ค๋ต ์นด๋๋ค์ด ์ข์ฐ๋ก ํ๋ค๋ฆฌ๋
์ ๋๋ฉ์ด์
์ด ๋ํ๋ฌ๋ค๊ฐ, ๋ค์ ๋ค์ง์ด์ง๊ฒ๋ ์์
ํด ์ฃผ์์ต๋๋ค.
๋, ์ด ๊ฒ์์ 3ํ ์ค๋ต์ ์ ์ํ ๊ฒฝ์ฐ, ๊ฒ์์ด ์ข
๋ฃ๋ฉ๋๋ค. ๊ฒ์ ์ค๋ฒ๊ฐ ๋์์ ๋๋
๊ฒ์ ์ค๋ฒ ์ฌ์ด๋๊ฐ ์ฌ์๋๊ณ , ๋ชจ๋ ์นด๋๋ค์ ์๋ฉด์ ๋ณด์ฌ์ฃผ๊ณ , ๋ค์ํ๊ธฐ ๋ฒํผ์ด ๋ํ๋๋๋ก ์์
ํด ์ฃผ์์ต๋๋ค.
4. ์นด๋ ์๊ธฐ ํจ์ ์์ ํ๊ธฐ
function shuffledCard() {
cardOne = cardTwo = "";
disableDeck = false;
matchedCard = 0;
let arr = [1, 2, 3, 4, 5, 6, 7, 8, 1, 2, 3, 4, 5, 6, 7, 8];
let result = arr.sort(() => (Math.random() > 0.5 ? 1 : -1));
memoryCard.forEach((card, index) => {
card.classList.remove("flip");
setTimeout(() => {
card.classList.add("flip");
}, 200 * index);
setTimeout(() => {
card.classList.remove("flip");
}, 4000);
let imgTag = card.querySelector(".back img");
imgTag.src = `../assets/img/memory-${arr[index]}.svg`;
});
}
๊ฐ๊ฐ์ ์นด๋๋ค์ด ํญ์ ๊ฐ์ ์๋ฆฌ์ ์๋ค๋ฉด ๊ฒ์์ด ๋๋ฌด ์ฌ์์ง๊ธฐ ๋๋ฌธ์, ๊ฒ์์ ์์ํ๊ธฐ ์ ์นด๋๋ฅผ ์๋ ๊ณผ์ ์ด ํ์ํฉ๋๋ค. ์นด๋์ ์ด ๊ฐ์์ ํด๋นํ๋ ๊ธธ์ด๋ฅผ ๊ฐ์ง ๋ฐฐ์ด์ ๋ง๋ค๊ณ , Math.random() ๋ฉ์๋๋ฅผ ์ฌ์ฉํ์ฌ ์นด๋๋ค์ ๋๋ค์ผ๋ก ์ฌ๋ฐฐ์นํด ์ฃผ๋ฉด ๋ฉ๋ชจ๋ฆฌ ๊ฒ์ ์์ฑ์ ๋๋ค.
๊ฒฐ๊ณผ
์ธ ๋ฒ์งธ ๋ถํ์ ํด๋๋ฅผ ํด๋ฆญํ๋ฉด ๋ฉ๋ชจ๋ฆฌ ๊ฒ์์ ์์ํ ์ ์์ต๋๋ค. ๋์์ธ์ ๋ํ ํํด์ ๋ฐ์ง ์๊ฒ ์ต๋๋ค.
'Javascript Effect' ์นดํ ๊ณ ๋ฆฌ์ ๋ค๋ฅธ ๊ธ
์๋ฐ์คํฌ๋ฆฝํธ : ๊ฒ์ ํจ๊ณผ : ๊ฒ์ ๊ฒ์ (1) | 2022.10.24 |
---|---|
์๋ฐ์คํฌ๋ฆฝํธ : ์ฌ๋ผ์ด๋ ํจ๊ณผ : ๋ฒํผ, ๋ท๋ฉ๋ด (1) | 2022.10.18 |
์๋ฐ์คํฌ๋ฆฝํธ : ๊ฒ์ ํจ๊ณผ : ๋ฎค์ง ํ๋ ์ด์ด (1) | 2022.10.18 |
์๋ฐ์คํฌ๋ฆฝํธ : ๊ฒ์ ํจ๊ณผ : sort(), reverse() (0) | 2022.10.18 |
์๋ฐ์คํฌ๋ฆฝํธ ํจ๋ด๋์ค ํจ๊ณผ : ๋ฆฌ๋น ํจ๊ณผ (4) | 2022.10.09 |
๋๊ธ