오늘은 JavaScript를 이용해 숫자야구게임을 구현해 보자!
처음부터 끝까지 혼자서 구현하기엔 아직 능력이 부족해 제로초님 강의의 도움을 받으면서 만들어 가기로 했다.
작업을 하기 전 가장 중요한 것은 순서도(알고리즘) 을 파악하는 것!! 그리고 동기와 비동기의 개념을 알게되었다. 간단하게는,,, 순서적 / 비순서적!
야구게임을 만들면서 배열 속성들을 몇개 더 알게 되었다.
- pop : 숫자를 마지막꺼부터 하나씩 뽑는다.
- shift : 숫자를 앞에서부터 하나씩 뽑는다.
- push : 뽑은순서대로 앞에서부터 나열한다.
- unshift : 뽑은 순서대로 뒤에서부터 나열한다.
예시) 만약 숫자후보가 1 ~ 9 이고 for문에 의해 4번 반복된다면
- 배열 속 숫자 중 a번째 자리부터 b개를 뽑는다. (a숫자 이후로 b개 선정)
예시
var 숫자후보 = [1,2,3,4,5,6,7,8,9]
var 뽑은것 - 숫자후보.splice(Math.floor(Math.random() * 9), 1);
- 문자.split(구분자) -> 배열
- 배열.join(구분자) -> 문자
>
var 숫자배열 [2,8,7,9];
String(숫자배열[0]) + String(숫자배열[1]) + String(숫자배열[2]) + String(숫자배열[3])
< 2879
근데 이런식으로 코드짜는건.. 옳지않아..!!!!!!!!!!!!!!!
이럴때 사용하는게 배열을 문자로 변환해주는 join
> var 숫자배열 [2,8,7,9];
> 숫자배열.join('')
< "2879"
> 숫자배열.join(',')
< "2,8,7,9"
join으로 배열 안의 것들을 특수기호로도 표현할 수 있다.
> var 답 = '9546'
> 답.split()
< ["9546"]
> 답.split('')
< ["9", "5", "4", "6"]
배열.indexOf(값) : 배열에 존재하는 값의 위치를 알 수 있다. (없으면 -1)
게임 예시) 제시된 숫자 : 2638
- 유저1 의 정답 : 2345
판정1 : 1 스트라이크, 1볼
- 유저2의 정답 : 2367
판정 : 1스트라이크 2볼
- 유저3의 정답 : 2638
판정 : 홈런
splice / Math.floor / pop / push / createElement / form / addEventListener / append / join / split / if ~ else / ceil
var 숫자후보 = [1,2,3,4,5,6,7,8,9];
var 숫자배열 = [];
for (var i = 0; i < 4; i += 1) {
var 뽑은것 = 숫자후보.splice(Math.floor(Math.random() * 9), 1)[0];
숫자배열.push(뽑은것);
}
에서 splice로 인해 지정된 숫자는 숫자후보 배열에서 사라지므로 숫자후보의 숫자 갯수가 한씩 줄어든다. 이런 중에 splice로 인해 8번째 숫자의 1개 숫자 를 고르면 존재하지 않는 (9번째에 존재하는 숫자) 숫자를 뽑아야 하므로 undefined가 출력된다!
이를 막기 위해 splice(a, b)에서 a의 값도 반복문이 진행될수록 가능한 범위가 하나씩 줄어들도록 해야한다!
for (var i = 0; i < 4; i += 1) {
var 뽑은것 = 숫자후보.splice(Math.floor(Math.random() * (9 - i)), 1)[0];
사칙연산 우선순위 계산 주의! 9-i를 괄호로 묶어야댐
if (답 === 숫자배열.join('')) {
결과.textContent = '홈런';
입력창.value='';
입력창.focus();
ㅠㅠ 정말 답을 알수가 없었다. 혹시나 해서 코드들을 그대로 복사하고 새로운 .js 파일을 만들어 붙여넣기하고, 그 파일을 html 파일과 연결시켜서 실행했더니 잘된다! 잉??????
알고리즘에 따라 맞췄을때의 경로보다, 맞추지 않았을때 단계별로 결과를 출력해야 하는게 까다로웠다.
조건이 너무 많아서,,, 게임할땐 단순하게 보였는데 역시 뜯어보니 복잡하다 ^^ 게임은 할때나 재밌지,,