[명품 웹프로그래밍] Open Challenge 08 겜블링 게임 웹 페이지 만들기

2021. 1. 19. 12:31Front-end/Javascript

728x90
반응형
<!DOCTYPE html>
<html lang="en">
<head>
    <meta charset="UTF-8">
    <meta name="viewport" content="width=device-width, initial-scale=1.0">
    <title>겜블링 게임</title>
    <style>
        #numberbox{
            font-size: 100px;
            border : 1px solid rosybrown;
            background-color: pink;
            display: flex;
            width: 250px;
            justify-content: space-around;
            color: blue;
        }
        #resultArea{
            margin-top: 20px;
            font: italic bold 20px consolas,sans-serif;
            color: magenta;

        }
    </style>
    <script>
        var clickNumberA=0;
        var clickNumberB=0;
        var clickNumberC=0;

        var n1 = Math.floor(Math.random()*3);
        var n2 = Math.floor(Math.random()*3);
        var n3 = Math.floor(Math.random()*3);

        function changeA(obj){
            if(clickNumberA == 0)
            {
                obj.innerHTML = n1;
                clickNumberA = 1;
                obj.style.color = "yellow";
            }else{
                alert("첫번째 숫자는 이미 클릭 되었습니다.");
            }
        };
        function changeB(obj){
            if(clickNumberA == 1){
                if(clickNumberB == 0)
                {
                    obj.innerHTML = n2;
                    clickNumberB = 1;
                    obj.style.color="yellow";
                }else{
                    alert("두번째 숫자는 이미 클릭 되었습니다.");
                }
            }else{
                alert("첫번째 숫자부터 클릭해주세요!");
            }
           
        }
        function changeC(obj){
            if(clickNumberA == 1 && clickNumberB == 1){
                if(clickNumberC == 0){
                    obj.innerHTML = n3;
                    clickNumberC = 1;
                    obj.style.color="yellow";
                }else{
                    alert("눌렀당꼐");
                }
                
                var resultText = document.getElementById("resultArea");
                if(n1 === n2 && n1 === n3){
                    resultText.innerHTML = "Success(click here to do again)";

                }
                else{
                    resultText.innerHTML = "fail(click here to do again)";
                }
            }else if(clickNumberA == 0){
                alert("첫번째 숫자부터 클릭해주세요!");
            }else if(clickNumberB == 0){
                alert("두번째 숫자부터 클릭해주세요!");
            }
            
        }
        function replay(){
            location.reload();
        }
    </script>
</head>
<body>
    <h3>겜블링 게임</h3>
    <p>각 숫자를 클릭하면 0에서 2사이의 난수로 바뀝니다. 모두 같은 수가 나오면 승리합니다.</p>
    <hr>
    <div id="numberbox">
        <div id="num1" onclick="changeA(this)">0</div>
        <div id="num2" onclick="changeB(this)">0</div>
        <div id="num3" onclick="changeC(this)">0</div>
    </div>
    <div id="resultArea" onclick="replay()"></div>
</body>
</html>

문제에 나와있는 기능말고  내가 직접 더 추가해보았다.

처음 숫자가 0으로 세팅되어 있는데 클릭을 했는데도 만약 0이면 이게 클릭이 된건지 아닌지 잘 모르겠어서

클릭이 안 된 숫자는 파란색, 이미 클릭된 숫자는 노란색으로 표시하게 했고

클릭 횟수를 나타내는 변수를 지정하여 한 숫자는 한 번만 클릭이 가능하도록 두번째 클릭부터는 alert 창이 뜨도록 했다.

 

그리고 각각의 숫자들은 나란히 정렬해야 하므로 div 안에 span으로 놓을 수도 있었지만,CSS에서 flex를 배웠던게 생각나서 한 번 사용해 보았는데 justify-content를 space-around를 통해 간격을 예쁘게 잘 줄 수 있었고 매우 편리했다.

 

책이나 강의에 나온 예제를 따라 치는 것은 쉬웠지만 문제를 직접 해결해보니 부족함이 많이 존재했다.

지역변수와 전역변수에 대한 학습이 제대로 되어있지 않은 것 같았다. 처음에는 n1,n2,n3 변수를 모르고 함수 안에다가 선언했었는데 changeC 함수에서 n1과 n2를 n3과 비교하려 하니 지역변수여서 안됐었다. 그래서 전역변수로 블록 바깥에 선언을 하고 나니 해결이 되었다. 그래도 비교적 빠른 시간 안에 왜 코드가 작동하지 않는지 스스로 문제점을 찾을 수 있어서 뿌듯했다.

 

+) 순서대로 눌러야 하는데 순서에 맞지 않게 눌렀을 경우 클릭이 적용이 되지 않고 경고창이 뜨도록 하는 코드를 추가했다.

(예를 들어 첫번째숫자-두번째숫자-세번째숫자 순으로 눌러야 하는데

처음부터 두번째숫자 혹은 세번째 숫자를 눌렀을 경우 "첫번째 숫자부터 눌러주세요"하는 코드가 실행되도록 하고,

첫번째 숫자를 누른 후 바로 세번째 숫자를 눌렀을 경우 "두번째 숫자부터 눌러주세요" 코드가 나오도록 함)

 

*** 위의 코드는 모범 답안이 아니라 개인이 직접 작성한 것으로 부족함이 존재할 수 있고

보다 더 깔끔하고 정확한 코드가 있을 수 있습니다.

728x90
반응형