Skip to content

๐ŸŽฎ ๋ ˆํŠธ๋กœ ๋ฏธ๋‹ˆ๊ฒŒ์ž„(์นด๋“œ ์ง ๋งž์ถ”๊ธฐ, ๊ฐ€์œ„๋ฐ”์œ„๋ณด)

Notifications You must be signed in to change notification settings

db-jay/minigame

Folders and files

NameName
Last commit message
Last commit date

Latest commit

ย 

History

12 Commits
ย 
ย 
ย 
ย 
ย 
ย 
ย 
ย 
ย 
ย 
ย 
ย 
ย 
ย 

Repository files navigation

minigame

1. ์นด๋“œ ์ง ๋งž์ถ”๊ธฐ ๊ฒŒ์ž„

์นด๋“œ๋ฅผ ๋’ค์ง‘์–ด ๊ฐ™์€ ๊ทธ๋ฆผ์˜ ์นด๋“œ๋ฅผ ์ฐพ๋Š” ๋ฉ”๋ชจ๋ฆฌ ์นด๋“œ ๊ฒŒ์ž„.

  • ๊ฒŒ์ž„์„ ์‹œ์ž‘ํ•˜๋ฉด ์นด๋“œ ์•ž๋ฉด์„ 2์ดˆ ๋™์•ˆ ๋ฏธ๋ฆฌ ๋ณผ ์ˆ˜ ์žˆ๋‹ค.
  • ์นด๋“œ๋Š” ์ด 12๊ฐœ๋กœ ๊ตฌ์„ฑ๋œ๋‹ค.
  • ๊ฐ™์€ ๊ทธ๋ฆผ์˜ ์นด๋“œ๋ฅผ ๋ชจ๋‘ ์ฐพ์€ ๊ฒฝ์šฐ ๊ฒŒ์ž„์„ clearํ•œ๋‹ค.
  • ๊ฒŒ์ž„์€ 30์ดˆ ๋™์•ˆ ์ง„ํ–‰๋˜๋ฉฐ ์‹œ๊ฐ„ ๋‚ด์— ๋ชจ๋“  ์นด๋“œ์˜ ์ง์„ ๋งž์ถ”์ง€ ๋ชปํ•˜๋ฉด ์ข…๋ฃŒ๋œ๋‹ค.


PREVIEW

Image



์นด๋“œ๋ฅผ ์ˆœํšŒํ•˜๋ฉด์„œ ํด๋ฆญ์ด๋ฒคํŠธ๊ฐ€ ๋ฐœ์ƒํ•˜๋ฉด ๋‘ ์นด๋“œ๋ฅผ ๋น„๊ต.

  • cardOne์˜ ๊ฐ’์ด ๋น„์–ด์žˆ๋Š” ์ƒํƒœ์ด๋ฉฐ, clickPause๊ฐ€ false์ผ ๋•Œ๋งŒ ๋น„๊ต ์‹คํ–‰ํ•œ๋‹ค.
  • ์นด๋“œ๋ฅผ 2๋ฒˆ ํด๋ฆญํ–ˆ์„ ๋•Œ๋งŒ cardOne์— ๊ฐ’์ด ๋“ค์–ด๊ฐ€๋„๋ก cardOne์ด ๋น„์–ด์žˆ๋Š”์ง€ ํ™•์ธ
  • cardOne, cardTwo์˜ data-idx ๊ฐ’์„ ๊ฐ€์ ธ์™€์„œ ๋น„๊ตํ•˜๋Š” matchCards() ํ•จ์ˆ˜ ์‹คํ–‰

const flipCard = (event) => {
  let clickedCard = event.target.closest('.card');

  if (cardOne !== clickedCard && !clickPause) {
    clickedCard.classList.add('show');

    if (!cardOne) {
      return (cardOne = clickedCard);
    }
    cardTwo = clickedCard;
    clickPause = true;

    matchCards(cardOne.dataset.idx, cardTwo.dataset.idx);
  }
};


cardOne, cardTwo์˜ data-id ๊ฐ’์ด ๊ฐ™์œผ๋ฉด equals() ํ•จ์ˆ˜ ์‹คํ–‰, ๋‹ค๋ฅด๋ฉด differs() ํ•จ์ˆ˜ ์‹คํ–‰.

  • Match๋˜๋ฉด ํด๋ฆญ์ด๋ฒคํŠธ๋ฅผ ์ œ๊ฑฐํ•˜๊ณ  MatchedCount๋ฅผ 1 ์ฆ๊ฐ€์‹œํ‚จ ํ›„ ์ดˆ๊ธฐํ™”ํ•œ๋‹ค
  • Match๋˜์ง€ ์•Š์œผ๋ฉด shake Css Animation์„ 0.4์ดˆ ๋™์•ˆ ์‹คํ–‰ํ•œ ๋’ค 1์ดˆ ํ›„ ๋’ค์ง‘ํžŒ ์นด๋“œ ์›์ƒ๋ณต๊ท€ํ•œ๋‹ค.
  • Match๋œ ์นด๋“œ๊ฐ€ 6๊ฐœ๊ฐ€ ๋˜๋ฉด ๊ฒŒ์ž„ ์ข…๋ฃŒ ํ›„ cardOne, cardTwo๋ฅผ ์ดˆ๊ธฐํ™”ํ•œ๋‹ค.

function equals() {
  cardOne.removeEventListener('click', flipCard);
  cardTwo.removeEventListener('click', flipCard);
  matchedCount++;

  if (matchedCount === 6) {
    endGame(cleared);
  }

  cardOne = cardTwo = '';
  return (clickPause = false);
}

function differs() {
  setTimeout(() => {
    cardOne.classList.add('shake');
    cardTwo.classList.add('shake');
  }, 400);

  setTimeout(() => {
    cardOne.classList.remove('shake', 'show');
    cardTwo.classList.remove('shake', 'show');

    cardOne = cardTwo = '';
    return (clickPause = false);
  }, 1000);
}


Match๋œ ์นด๋“œ๊ฐ€ 6๊ฐœ๊ฐ€ ๋˜๊ฑฐ๋‚˜, ๊ฒŒ์ž„ ์‹œ์ž‘์œผ๋กœ๋ถ€ํ„ฐ 30์ดˆ๊ฐ€ ์ง€๋‚˜๋ฉด ๊ฒŒ์ž„ ์ข…๋ฃŒ.

  • ๊ฒŒ์ž„์ด ์ข…๋ฃŒ๋˜๋ฉด clearInterval() ๋ฉ”์„œ๋“œ๋กœ ํƒ€์ด๋จธ ์ œ๊ฑฐ ํ›„ ๊ฒŒ์ž„ ์žฌ์‹œ์ž‘ ํŒ์—…์ฐฝ์„ ๋„์šด๋‹ค.
  • ๊ฒŒ์ž„ ๊ฒฐ๊ณผ์— ๋”ฐ๋ผ ํŒ์—…์ฐฝ์˜ ๋ฉ”์‹œ์ง€์™€ ์ด๋ฏธ์ง€๋ฅผ ๋ณ€๊ฒฝํ•˜๊ณ , ๊ฒŒ์ž„ ๊ฒฐ๊ณผ์— ๋”ฐ๋ฅธ ์Œ์•…์„ ์žฌ์ƒํ•œ๋‹ค.
const endGame = (result) => {
  let resultMsg = $dialog.querySelector('h3 span');
  let resultImg = $dialog.querySelector('h3 img');
  resultImg.setAttribute('src', `../asset/img/${result.img}`);
  resultMsg.innerText = `Game ${result.msg}!`;
  result.sound.play();
  clearInterval(time);
  $dialog.showModal();
};


2. ๊ฐ€์œ„๋ฐ”์œ„๋ณด ๊ฒŒ์ž„

์ปดํ“จํ„ฐ์˜ ๋žœ๋ค ์ผ€์ด์Šค์™€ ์œ ์ €๊ฐ€ ๋Œ€๊ฒฐํ•˜๋Š” ๊ฐ€์œ„๋ฐ”์œ„๋ณด ๊ฒŒ์ž„.

  • PC๋Š” ๊ฐ€์œ„,๋ฐ”์œ„,๋ณด ์ค‘ ๋žœ๋ค์ผ€์ด์Šค๋ฅผ ์ถœ๋ ฅํ•œ๋‹ค.
  • ์‚ฌ์šฉ์ž๊ฐ€ ๊ฐ€์œ„,๋ฐ”์œ„,๋ณด ๋ฒ„ํŠผ ์ค‘ ํ•˜๋‚˜๋ฅผ ์„ ํƒํ•˜๋Š” ์ˆœ๊ฐ„ ์ปดํ“จํ„ฐ๊ฐ€ ์„ ํƒํ•œ ๋žœ๋ค ๊ฐ’๊ณผ ๋น„๊ตํ•˜์—ฌ ๊ฒฐ๊ณผ๋ฅผ ์‚ฐ์ •ํ•œ๋‹ค.
  • ๊ฒŒ์ž„์˜ ์ŠนํŒจ ๊ฒฐ๊ณผ๋ฅผ ํ™”๋ฉด์— ์ถœ๋ ฅํ•œ๋‹ค.
  • ์‚ฌ์šฉ์ž๊ฐ€ ์ด๊ธธ ๊ฒฝ์šฐ ์ ์ˆ˜๊ฐ€ 1์”ฉ ์ฆ๊ฐ€ํ•œ๋‹ค.

PREVIEW

Image



pc๊ฐ€ ๋žœ๋ค์œผ๋กœ ๊ฐ€์œ„๋ฐ”์œ„๋ณด ์„ ํƒ.

  • Math.random() ํ•จ์ˆ˜๋กœ 0~2 ์‚ฌ์ด์˜ ๋žœ๋ค ์ˆซ์ž๋ฅผ ์ƒ์„ฑํ•œ๋‹ค.
  • setInterval() ํ•จ์ˆ˜๋กœ ๋žœ๋ค index์— ํ•ด๋‹นํ•˜๋Š” ๋žœ๋ค ๋ฐฐ์—ด ๊ฐ’์„ ํ™”๋ฉด์— textContents๋กœ ๋„ฃ์–ด์ค€๋‹ค.

const startGame = () => {
  const pcSelect = () => {
    let randomCase = casesArr[parseInt(Math.random() * casesArr.length)];
    $pc.textContent = randomCase;
    replaceEmoji($pc);
  };
  // pcSelect ํ•จ์ˆ˜๋ฅผ 0.1์ดˆ๋งˆ๋‹ค ์‹คํ–‰
  interval = setInterval(pcSelect, 100);
};


์‚ฌ์šฉ์ž์˜ ๋ฒ„ํŠผํด๋ฆญ ์ด๋ฒคํŠธ ๋ฐœ์ƒ์‹œ switch๋ฌธ์œผ๋กœ ์ŠนํŒจ ๊ฒฐ์ •.

  • pc์™€ user์˜ textContent๋ฅผ ๋น„๊ตํ•˜๊ณ  switch๋ฌธ์œผ๋กœ ์กฐ๊ฑด์„ ๊ฑธ์–ด ์ŠนํŒจ๋ฅผ ๋…ธ์ถœ์‹œํ‚ค๊ณ , ์ ์ˆ˜๋ฅผ ์ฆ๊ฐ€์‹œํ‚จ๋‹ค.
  • ์ŠนํŒจ ๊ฒฐ๊ณผ์— ๋”ฐ๋ผ Message์™€ Sound๋ฅผ ์ถœ๋ ฅํ•œ๋‹ค.

const playGame = (pc, user) => {
  if (pc === user) {
    resultMessage(0);
    draw.play();
  } else {
    switch (pc + user) {
      case '๋ณด๋ฐ”์œ„':
      case '๋ฐ”์œ„๊ฐ€์œ„':
      case '๊ฐ€์œ„๋ณด':
        addScore($pcScore);
        lose.play();
        resultMessage(1);
        break;
      default:
        addScore($userScore);
        win.play();
        resultMessage(2);
    }
  }
};

About

๐ŸŽฎ ๋ ˆํŠธ๋กœ ๋ฏธ๋‹ˆ๊ฒŒ์ž„(์นด๋“œ ์ง ๋งž์ถ”๊ธฐ, ๊ฐ€์œ„๋ฐ”์œ„๋ณด)

Topics

Resources

Stars

Watchers

Forks

Releases

No releases published

Packages

No packages published