티스토리 뷰

Javascript

카드게임

gwni0214 2022. 4. 14. 16:53

 

 

 

이번 스크립트 예제는 카드게임 만들기 입니다. 

//01. html/css 디자인 구성
        //02. 클릭한 카드 뒤집기
        //03. 두개의 카드 뒤집기 확인하기(첫번째, 두번째)
        //04. 클릭한 카드 두개의 이미지 가져오기
        //05. 두개의 이미지 비교하기
        //06. 틀린 이미지 애니메이션 효과주기 (shake)
        //07. 빨리 클릭하면 버그 발생 고치기

        const cards = document.querySelectorAll(".cards li");

        let cardOne, cardTwo;
        let disableDeck = false;

        function flipCard(e){            
            let clickedCard = e.target;
            if(clickedCard !== cardOne && !disableDeck){
                clickedCard.classList.add("flip");

                //cardOne의 데이터가 없으면 리턴으로 바로 넣어주기
                if(!cardOne){
                    return cardOne = clickedCard;
                }
                
                cardTwo = clickedCard;
                disableDeck = true;

                let cardOneImg = cardOne.querySelector(".back img").src;    //태그안에 있는 src 가져오기 (문자열)
                let cardTwoImg = cardTwo.querySelector(".back img").src;
                

                // console.log(cardOneImg,cardTwoImg);

                matchCards(cardOneImg, cardTwoImg);
            }
            
        }

        function matchCards(img1, img2){
            //두 이미지의 src 문자열 값을 비교
             if(img1 == img2){
                cardOne.removeEventListener("click", flipCard);
                cardTwo.removeEventListener("click", flipCard);
                cardOne = cardTwo = "";
                disableDeck = false;
             } else {                 
                setTimeout(function(){
                    cardOne.classList.add("shake");
                    cardTwo.classList.add("shake");
                },400);

                setTimeout(function(){
                    cardOne.classList.remove("shake", "flip");
                    cardTwo.classList.remove("shake", "flip");
                    cardOne = cardTwo = "";
                    disableDeck = false;
                },1200);
             }
        }
        cards.forEach(card => {
            card.addEventListener("click", flipCard);
            
        })

처음으로 디자인 구성은 CSS의 perspective  원근점 설정을 통해서  클릭했을때 X축으로 회전하며 카드가 뒤집어 지는듯한 애니메이션을 적용하였습니다. 

 

그 후 스크립트를 이용하여 구현합니다. 

첫번째 클릭하는 카드를 뒤집은 후  다음에 클릭하는 카드를 뒤집습니다.  두개의 카드가 일치하면 그대로. 

 

일치하지 않으면 카드를 다시 뒤집습니다.  두 카드를 비교하는 과정에서 .src 를 이용해서 이미지의 파일 이름을 가져와서 비교합니다.

 

일치하지 않을때에 shake 애니메이션을 주어서 흔들린 뒤 setTimeout을 이용해서 다시 뒤집습니다.

 

여기까지 순조롭게 진행 후 버그를 찾아서 수정합니다. 

 

카드를 빠르게 누르면 엉키는 버그가 있어서  카드가 일치하지 않는동안 일어나는 애니메이션( shake 와 flip) 이 일어나는 동안 다른 카드들을 클릭하지 못하게 막아줍니다.

'Javascript' 카테고리의 다른 글

javascript 자바스크립트 for() 예제  (0) 2022.04.15
This 란?  (0) 2022.04.14
jQuery / javascript 비교. getAttribute와 attr  (0) 2022.04.14
javascript - 콜백함수  (0) 2022.04.13
javascript - 내부함수  (0) 2022.04.13
댓글
© 2018 webstoryboy