【JavaScript】5分でできるもぐらたたき

神経衰弱よりも簡単に作れる
この記事は以下の動画の中に出てきたサンプルコードを載せたものです。コピペなどが必要なときに使ってください。





HTML

<html>
  <head>
    <meta charset="UTF-8">
    <meta name="viewport" content="width=device-width, initial-scale=1.0">
    <link rel="stylesheet" href="https://fonts.googleapis.com/css2?family=Material+Symbols+Outlined:opsz,wght,FILL,GRAD@24,400,0,0">
    <link rel="stylesheet" href="style.css">
  </head>
  <body>
    <div id="container">
      <div class="hole"><span class="material-symbols-outlined">mood</span></div>
      <div class="hole"><span class="material-symbols-outlined">mood</span></div>
      <div class="hole"><span class="material-symbols-outlined">mood</span></div>
      <div class="hole"><span class="material-symbols-outlined">mood</span></div>
      <div class="hole"><span class="material-symbols-outlined">mood</span></div>
      <div class="hole"><span class="material-symbols-outlined">mood</span></div>
      <div class="hole"><span class="material-symbols-outlined">mood</span></div>
      <div class="hole"><span class="material-symbols-outlined">mood</span></div>
      <div class="hole"><span class="material-symbols-outlined">mood</span></div>
    </div>
    <div id="count">
      <div id="score">0</div>
      <div id="time">0</div>
      <button id="start">START</button>
    </div>
  </body>
</html>



CSS

body { margin-top: 20px }  
#container {
  display: grid;
  place-content: center;
  grid-template-columns: repeat(3, 100px);
  grid-auto-rows: 100px;
  gap: 10px;
  margin: 20px;
}
#count {
  display: grid;
  place-content: center;
  grid-template-columns: repeat(3, 100px);
  grid-template-rows: 60px;
  gap: 10px;
  margin-bottom: 20px;
}
#count div {
  display: grid;
  place-content: center;
  border: solid 2px #444;
  font-size: 24px;
}
.hole {
  display: grid;
  place-content: center;
  cursor: pointer;
  border: solid 2px #444;
}
.material-symbols-outlined {
  font-size: 60px;
  color: #444;
  width: 60px;
  height: 60px;
}



JavaScript

const score = document.getElementById('score');
const time = document.getElementById('time');
const start = document.getElementById('start');
const holes = document.querySelectorAll('.material-symbols-outlined');

// モグラの出現処理
appearance = (hole) => {
  setTimeout(() => {
    // 残り時間が0秒だったら処理終了
    if(time.innerText == 0) {
      hole.innerText = '';
      return;
    }

    // アイコンのテキストを変える
    hole.innerText = 'mood';

    // 0.5〜3秒以内に自動で隠れる
    setTimeout(() => {
      if(hole.innerText == 'mood') {
        hole.innerText = '';

        // 次の出現処理
        appearance(hole);
      }
    }, Math.floor(Math.random() * 2500) + 500);
  }, Math.floor(Math.random() * 4000) + 1000);
}

// アイコンのクリックイベント
holes.forEach((hole) => {
  hole.onclick = () => {
    // 残り時間が0だったら処理終了
    if(time.innerText == 0) {
      return;
    }

    // アイコンがmoodだったらスコアを増やしてアイコンを変更
    if(hole.innerText == 'mood') {
      score.innerText++;
      hole.innerText = 'sentiment_very_dissatisfied';
      hole.style.color = '#f00';

      // 0.5秒後にアイコンを消す
      setTimeout(() => {
        hole.innerText = '';
        hole.style.color = '#444';

               // 次の出現処理
        appearance(hole);
      }, 500);
    }
  }
});

// スタートボタン
start.onclick = () => {
  score.innerText = 0;
  time.innerText = 30;

  // カウントダウンタイマー
  let timerID = setInterval(() => {
    if(time.innerText == 0) {
      clearInterval(timerID);
    } else {
      time.innerText--;            
    }          
  }, 1000);

  // アイコンを消して最初の出現処理をセット
  holes.forEach((hole) => {
    hole.innerText = '';
    appearance(hole);
  });
}
 もしかしたら何か関連しているかも? 
 質問や感想などお気軽にコメントしてください