본문 바로가기
자바스크립트(Java Script)/자바스크립트(Java Script) 강의 정리

제로초 JS 입문 강의 8강 정리 (반응 속도 게임)

by 인생즐겜러 2024. 8. 16.
728x90
반응형

 

 

 

 

 

8 - 1~2 클래스로 태그 선택하기

태그 내의 클래스 이름이 길다면

아래의 방법으로 태그를 선택할 수 있다.

 

<div id="screen" class="waiting for you">

div.classList.contains('클래스');
div.classList.contains('for');	// true
div.classList.contains('me');	// false

 

 

 

태그.classList.add('클래스');						// 태그에 클래스 추가
태그.classList.replace('기존 클래스 이름', '새로 바꿀 클래스 이름');	// 태그에 클래스 수정
태그.classList.remove('클래스');						// 태그에 클래스 제거

 

 

 

 

 

8 - 5 reduce 함수 ( 배열 쪽 만능 함수)

 

배열.reduce(계산 함수 , 초기값);

// a는 누적값, c는 계산 시 들어갈 변수값
const a = [1,2,3,4];
a.reduce((a, c) => a + c , 0);

 

 

 

 

 

8 - 6 debugger (실행 당시의 변수 확인)

 

아래처럼 중간에 debugger 라는 함수를 쓰면

실행 중간에 해당 함수가 있는 부분까지 진행 후 멈춘다.

 

          alert('끝났다 게임. 한글도 모르는 멍청아');
        }
      } else if (event.target.classList.contains('now')) {        // 초록 화면
        $trial.textContent--;   // 정상 클릭 시 시도 횟수 차감
        end = new Date();   // 클릭 시각
        diff = end - start; // 반응 시간
        record.push(diff);
        $result.textContent = `${diff / 1000} s`;     // 현재 반응 시간
        // 평균 반응 시간
        $resultAvr.textContent = `${(record.reduce((a, c) => a + c / record.length)) / 1000} s`;
        // 최고 반응 시간
        $resultBest.textContent = `${(record.sort((a, c) => a - c).at(0) ) / 1000} s`;
        debugger;
        $screen.classList.replace('now', 'waiting');
        $screen.textContent = '화면을 클릭하면 게임 시작';

 

 

 

크롬의 개발자 창으로 들어가게 되면

디버그까지 실행 후 각각의 함수 값들을 전부 확인할 수 있다.

 

 

 

 

 

 


 

 

 

 

 

완성본

 

 

 

반응 시간 테스트
선생님의 반응 시간을 확인해보겠어~요
드루와 드루와~
<총 10번 기준>

화면을 클릭하면 게임 시작

너님의 지금 반응 시간이다요 :
너님의 평균 반응 시간이다요 :
너님의 최고 반응 시간이다요 :
남은 시도 횟수 : 10
남은 목숨 : 3

 

 

 

 

<html>

<head>
  <meta charset="UTF-8">
  <title>반응 시간 테스트</title>
  <style>
    #title {
      width: 400px;
      height: 30px;
      text-align: center;
    }

    #screen {
      width: 400px;
      height: 200px;
      text-align: center;
      user-select: none;
    }

    #screen.waiting {
      background-color: aquamarine;
    }

    #screen.ready {
      background-color: red;
      color: white;
      font-weight: bold;
    }

    #screen.now {
      background-color: greenyellow;
      font-weight: bold;
    }
  </style>
</head>

<body>
  <div id="title">선생님의 반응 시간을 확인해보겠어~요</div>
  <div id="title">드루와 드루와~</div>
  <div id="title"><총 10번 기준></div>
  <br>
  <div id="screen" class="waiting">화면을 클릭하면 게임 시작</div>
  <br>
  <div>너님의 지금 반응 시간이다요 : <span id="result"></span></div>
  <div>너님의 평균 반응 시간이다요 : <span id="resultAvr"></span></div>
  <div>너님의 최고 반응 시간이다요 : <span id="resultBest"></span></div>
  <div> 남은 시도 횟수 : <span id="trial">10</span></div>
  <div> 남은 목숨 : <span id="life">3</span></div>

  <script>
    const $screen = document.querySelector('#screen');
    const $result = document.querySelector('#result');
    const $resultAvr = document.querySelector('#resultAvr');
    const $resultBest = document.querySelector('#resultBest');
    const $trial = document.querySelector('#trial');
    const $life = document.querySelector('#life');
    const record = [];
    let diff = 0;
    let timerVar;
    let start;
    let end;



    // 화면이 바뀌는 함수
    function timer() {
      $screen.classList.replace('ready', 'now');
      start = new Date();    // 게임 시작 시간
      $screen.textContent = '눌러!!!빨리!!!!!!!빨리!!!!!';
    }



    $screen.addEventListener('click', (event) => {
      if (event.target.classList.contains('waiting')) {           // 하늘 화면
        clearTimeout(timerVar);
        $screen.classList.replace('waiting', 'ready');
        $screen.textContent = '초록색이 되자마자 ㄹㅇ 바로 눌러야 됨';
        // 0~5초 사이에서 바뀜, 아래처럼 말고 변수에 미리 넣고 변수만 실행 시키면 뭔가 에러남
        timerVar = setTimeout(timer, Math.floor(Math.random() * 3500));
      } else if (event.target.classList.contains('ready')) {      // 빨강 화면
        --$life.textContent;    // 목숨 차감
        clearTimeout(timerVar);
        $screen.classList.replace('ready', 'waiting');
        $screen.textContent = '화면을 클릭하면 게임 시작';
        if ($life.textContent <= 0) {
          alert('끝났다 게임. 한글도 모르는 멍청아');
        }
      } else if (event.target.classList.contains('now')) {        // 초록 화면
        $trial.textContent--;   // 정상 클릭 시 시도 횟수 차감
        end = new Date();   // 클릭 시각
        diff = end - start; // 반응 시간
        record.push(diff);
        $result.textContent = `${diff / 1000} s`;     // 현재 반응 시간
        // 평균 반응 시간
        $resultAvr.textContent = `${(record.reduce((a, c) => a + c / record.length)) / 1000} s`;
        // 최고 반응 시간
        $resultBest.textContent = `${(record.sort((a, c) => a - c).at(0) ) / 1000} s`;
        $screen.classList.replace('now', 'waiting');
        $screen.textContent = '화면을 클릭하면 게임 시작';
      }
    })

  </script>

</body>

</html>

 

 

 

 

 

728x90
반응형

댓글