home
자바
home

셀프 체크 - 아웃 만들기

<!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>숫자 야구</title> </head> <body> <form id="form"> <input type="text" id="input"> <button>확인</button> </form> <div id="logs"></div> <script> const $input = document.querySelector('#input'); const $form = document.querySelector('#form'); const $logs = document.querySelector('#logs'); const numbers = []; // [1, 2, 3, 4, 5, 6, 7, 8, 9] for (let n = 0; n < 9; n += 1) { numbers.push(n + 1); } const answer = []; // [4] for (let n = 0; n < 4; n += 1) { // 네 번 반복 const index = Math.floor(Math.random() * (numbers.length - n)); // 0~ 8의 정수 answer.push(numbers[index]); numbers.splice(index, 1); } // numbers [2, 5, 6, 7, 8, 9] // answer [3, 1, 4, undefined] // numbers의 길이가 줄었음에도 불구하고 계속 탐색 => undefined 반환 // 끝 값으로 검증해보기(예외 발견) console.log(answer); const tries = []; function checkInput(input) { if (input.length !== 4) { // 길이가 4가 아닌가 return alert('4자리 숫자를 입력해 주세요.'); } if (new Set(input).size !== 4) { // 중복된 숫자가 있는가 return alert('중복되지 않게 입력해 주세요.'); } // new Set -> 중복이 없는 배열, size로 크기를 표현 if (tries.includes(input)) { // 이미 시도한 값은 아닌가 return alert('이미 시도한 값입니다.'); } return true; } // 검사하는 코드 // 패배 메세지 (중복제거) function defeated() { const message = document.createTextNode(`패배! 정답은 ${answer.join('')}`); $logs.appendChild(message); } let out = 0; $form.addEventListener('submit', (event) => { event.preventDefault(); // 기본 동작 막기 (submit의 기본 동작을 막으면 새로고침을 막는다.) const value = $input.value; $input.value = ''; if (!checkInput(value)) { return; } // 입력값 문제없음 if (answer.join('') === value) { $logs.textContent = '홈런!'; return; } if (tries.length >= 9) { defeated(); return; } // 몇 스트라이크 몇 볼인지 검사 let strike = 0; let ball = 0; // answer: 3146, value: 1234 for(let i=0; i<answer.length; i++) { const index = value.indexOf(answer[i]); if (index > -1) { // 일치하는 숫자 발견 if (index === i) { // 자릿수도 같음 strike += 1; } else { // 숫자만 같음 ball += 1; } } } if (strike === 0 && ball === 0) { out++; $logs.append(`${value}아웃`, document.createElement('br')); } else { $logs.append(`${value}: ${strike} 스트라이크 ${ball}`, document.createElement('br')); } if (out === 3) { defeated(); return; } tries.push(value); }); </script> </body> </html>
JavaScript
복사
중복된 코드는 함수로 빼서 중복 제거!