자바스크립트 숫자야구

banhogu·2023년 5월 18일
0
<!DOCTYPE html>
<html lang="en">

<head>
    <meta charset="UTF-8">
    <meta http-equiv="X-UA-Compatible" content="IE=edge">
    <meta name="viewport" content="width=device-width, initial-scale=1.0">
    <title>Document</title>
</head>

<body>
    <form id="form">
        <input type="text" id="input">
        <button>확인</button>
    </form>
    <div id="logs"></div>
</body>

<script>
    let $input = document.querySelector('#input')
    let $form = document.querySelector('#form')
    let $logs = document.querySelector('#logs')
    let numbers = [] //1~9까지 숫자
    let answer = [] //1~10까지 숫자에서 4자리를 뽑음 
    let tries = [] //사용자가 입력한 답들.

    //1~10 숫자 뽑기
    for (let i = 0; i < 9; i++) {
        numbers.push(i + 1)
    }
    //numbers에서 무작위 4자리 숫자 뽑기
    for (let i = 0; i < 4; i++) {
        let index = Math.floor(Math.random() * numbers.length) //0~8까지 뽑는데 +1을 해주지 않는 이유는 인덱스로 접근할거기 때문.
        answer.push(numbers[index])
        numbers.splice(index, 1)
    }

    //에러 체크 함수
    function checkerror(useranswer) {
        if (useranswer.length !== 4) {
            return alert('4자리 숫자를 입력해주세요')
        }
        else if (new Set(useranswer).size !== 4) {
            return alert('중복된 숫자는 입력하지 마십시오')
        }
        else if (tries.includes(useranswer)) {
            return alert('이미 입력한 값입니다')
        }
        else return true;
    }

    $form.addEventListener('submit', (event) => {
        event.preventDefault();
        let useranswer = $input.value; // 문자열으로 저장됨
        $input.value = ''

        if (!checkerror(useranswer)) {
            return //에러체크에 걸리면 그냥 끝내버림
        }

        if (answer.join('') === useranswer) {
            $logs.textContent = '홈런입니다'
            return
        }

        if (tries.length >= 9) {
            $logs.textContent = `패배했습니다 정답은 ${answer} 입니다`
            return
        }
        let strike = 0;
        let ball = 0;
        for (i = 0; i < 4; i++) {
            let index = answer.indexOf(useranswer[i])
            if (index > -1) {
                if (index === i) {
                    strike += 1
                }
                else {
                    ball += 1
                }
            }
        }
        $logs.textContent = `${useranswer} = ${strike}스트라이크 ${ball}볼 입니다 \n`
        tries.push(useranswer)
    })
</script>

</html>

숫자야구를 만들어봤다. 중요하다고 생각하는 코드는 Math.random() 으로 무작위 숫자를 만들고 숫자배열에서 뽑는것과 splice 하므로 정해진 길이가 아닌 .length로 접근한다는점. 또한 new Set과 preventdefault의 사용정도.

숫자야구 군대에서 근무 설 때 선후임이랑 하고 놀았는데, 사람 머릿속으로는 쉽게 쉽게 순서도와 연산이 되지만, 직접 코드를 짤 때는 일일이 작동방식을 세분화하고 그에 맞는 연산자를 써야 하니 귀찮더라도 순서도를 그리는게 낫겠다.

profile
@banhogu

0개의 댓글