본문 바로가기

javascript/JS웹게임

DOM객체 다루기-끝말잇기 게임(1)

HTML 화면 + 값 입력 받기

<!DOCTYPE html>
<html>
<head>
  <meta charset="utf-8">
  <title>끝말잇기</title>
</head>

<body>
  <div><span id="order">1</span>번째 참가자</div>
  <div>제시어: <span id="word"></span></div>
  <input type="text">
  <button>입력</button>
  <script>
  </script>
</body>
</html>

기본적인 HTML로 간단한 화면을 만드는 것으로 시작해보자.

실행 결과 이런 간단한 화면이 출력된다. 이제 순서도를 따라 프로그램을 작성해보자. 

<script>
  const number = prompt('몇 명이 참가하나요?');
  const realNumber = Number(number);
  //const number = Number(prompt('몇 명이 참가하나요?'));
</script>

첫번째 절차는  '몇명이 참가할지 선택한다.' 이다. prompt 함수를 사용하여 직접 프로그램에 값을 전달할 수 있다. 

자바스크립트에서 실행되는 함수이므로 script 태그 내부만 수정하면 된다. 

입력한 값을 프로그램이 전달 받는다. 하지만 이것만으로는 아무런 기능을 하지 않는다. 

 

이렇게 입력 받은 prompt 함수의 값은 String이다. 이 문자열을 숫자로 활용하기 위해 Number 함수를 이용하자. 

 

HTML태그 선택하고 이벤트 달기

이제 다음 절차인 '첫번째 사람이 어떤 단어를 말한다'를 프로그래밍 해 보자. 입력창을 이용해 입력 받도록 하겠다. 입력창은 HTML태그이므로 이 입력창을 자바스크립트에서 가져와야한다. 이를 선택한다고 표현하는데, 이를 위해 특별한 함수와 방법을 사용한다. 

document.querySelector('선택자')
document.querySelectorAll('선택자')

여기서 선택자란 HTML 태그를 선택할 수 있게 도와준다.

//선택자
<button class="btn" id="a">버튼1</button>
<button class="btn" id="b">버튼2</button>
<button class="btn" id="c">버튼3</button>

<script>
document.querySelector('button.btn'); // document.querySelector('.btn');
document.querySelectorAll('button.btn');
document.querySelector('button#a'); // document.querySelector('#a');

</script>

querySelectorAll을 통해 class가 btn 인 버튼을 모두 선택할 수 있는데 반해 querySelector을 이용하면 첫번째 버튼만 선택할 수 있다. 

또한 id는 고유의 값이다.  

 

이렇게 태그를 선택하고 사용자가 태그와 상호작용을 할 때 이벤트가 발생한다. 예를 들어 input태그에 글자를 입력하면 input이라는 이벤트가, 버튼을 클릭하면 click 이라는 이벤트가 발생한다. 이를 이벤트리스터라는 것을 추가하여 자바스크립트가 HTML에서 발생하는 이벤트를 감지할 수 있게 만들어야한다.   

document.querySelector('button').addEventListener('click', function());

첫 단어를 입력한 사람인지 판단하기 

<script>
  const number = Number(prompt('몇 명이 참가하나요?'));
  const $button = document.querySelector('button');
  const $input = document.querySelector('input');

  const onClickButton = () => {
  };
  const onInput = (event) => {
  };

  $button.addEventListener('click', onClickButton);
  $input.addEventListener('input', onInput);
</script>

number변수로 사람의 수를 저장했기 때문에 순서를 부여하는 절차에 대한 코딩은 따로 할 필요가 없다. 이제 어떤 단어를 입력한 사람이 첫 단어를 입력한 참가자인지 아닌지를 판단해야한다. 여기서, 참가자의 입력이 없이는 프로그램이 재개되지 않는다. 사용자가 이벤트를 발생시키지 않으면 다음 절차로 넘어가지 않으므로  중간에 순서도를 끊어주는 것이 좋다. 

입력버튼 클릭이라는 이벤트가 발생하면 첫 단어를 입력한 참가자인지를 판단해야 한다. 그러므로 첫 번째 타원을 마름모로 수정해야한다. 

 

첫번째 참가자인가?  

  • 예 -> 입력된 단어가 제시어가 된다
  • 아니오 -> 입력한 단어가 올바른가? -> 입력한 단어가 제시어가 된다

이제 입력 버튼을 클릭한 사람이 첫 단어를 입력한 참가자인지 코드로 판단해야한다. 첫단어를 저장하고, 그 다음 단어와도 비교해서 올바른 단어인지 판단하기 위해 첫 단어를 저장할변수가 필요하다. 기존 코드를 보면 #word 태그가 제시어가 들어갈 자리이지만 제시어가 없으므로 빈값으로 있다. 이 값을 가져와서 변수에 넣으면 된다. #word 태그에 들어간느 제시어가 비어 있다면 아직 아무도 단어를 말하지 않았다는 뜻이므로 첫 번째 참가자인가? 라는 판단을 제시어가 비어있는가?로 바꿔도 무방할 것이다. 

 

<script>
  const number = Number(prompt('몇 명이 참가하나요?'));
  const $button = document.querySelector('button');
  const $input = document.querySelector('input');
  const $word = document.querySelector('#word');
  let word; // 제시어
  let newWord; // 현재 단어

  const onClickButton = () => {
    if (!word) { // 제시어가 비어 있는가?
      word = newWord; // 입력한 단어가 제시어가 된다.
      $word.textContent = word; // 화면에 제시어 표시
    } else {
      // 비어있지않다.
    }
  };
  const onInput = (event) => {
    newWord = event.target.value; // 입력하는 단어를 현재 단어로
  };

  $button.addEventListener('click', onClickButton);
  $input.addEventListener('input', onInput);
</script>

버튼을 클릭하는 이벤트에 대해 제시어가 비어있는지, 즉 첫번 째 사람인지 판단해보자 .

word 라는 제시어 변수를 선언하고 이가 비어있다면(word가 undefined)라면 입력한 단어가 제시어가 되도록, 아니라면 다른 처리를 하도록 했다. newWord로 현재 입력 중인 변수를 저장해서 word에 대입하는 과정이 필요하다. 

 

그다음 줄에 $word.textContent가 나오는데 이는 태그 내부의  값을 얻거나 수정할 때 사용한다. 처음에는 #word는 빈 값이므로 $word.textContent를 이용해 ''를 얻을 수 있다. textContent는 문자열을 반환하므로 null이나 undefined가 아닌 ''을 반환한다. 반대로 

$word.textContent에 특정 값을 대입하면 이 값이 화면에 설정된다.