whatisthis?
javaScript. 숫자야구게임 - (1) 본문
Bulls and Cows (숫자야구)
- Rule -
- 숫자 제시 횟수 : 10회 이내
- 4자리의 숫자를 임의로 정함.
- 0에서 9까지의 다른 숫자로 구성됨.
숫자는 맞지만 위치가 틀림 = B(볼)
숫자와 위치가 맞음 = S(스트라이크)
숫자와 위치가 전부 틀리면 = O(아웃)
예>
3 | 5 | 9 |
< 상대가 정한 숫자 >
2 | 5 | 3 |
= 1S 1B
코드 작성 전에 의사코드를 먼저 작성해보자.
1. 먼저 컴퓨터가 랜덤한 4자리 숫자를 짠다.
- 단, 이때 0부터 9까지 중복되지 않도록 해야한다.
1-(1). 0부터 9까지 랜덤 숫자가 나오게 하려면
Math.random() // 0부터 1까지중 랜덤으로 실수 출력함
Math.floor(Math.random()*10) // 0부터 9까지 랜덤 정수 출력
** 주의 : Math.random()은 0<=x<=1이 아니라 1 미만.
즉, 0부터 N까지 랜덤 정수를 뽑으려면 (0, 1, 2, .. , N)
Math.floor(Math.random() * N+1)
을 해야한다. (N+1 미만)
+) 1부터 N까지의 랜덤 정수를 뽑으려면 (1, 2, .. , N)
Math.floor(Math.random() * N) + 1
을 해야한다.
❗❗ 주의
- Math.random()은 암호학적으로 안전한 난수를 제공하지 않는다.
- 따라서, 보안과 관련된 어떠한 것에도 이 함수를 사용해선 X.
+) Python과 같이 randint나 randrange등이 존재하지는 않는다.
1-(2). 중복되지 않게 총 4개의 수를 랜덤으로 (차례로) 뽑는다.
방법 1. for문 사용
- 첫 숫자 뽑음
- 두번째 숫자를 뽑을때, 첫 숫자와 같으면 다시 뽑음 *조건
- 세번째 숫자를 뽑을때, 첫번째,두번째와 같으면 다시 뽑음
- 네번째 숫자를 뽑을때, 첫번째,두번째,세번째와 같으면 다시 뽑음.
>> 매우 비효율적. 중복 검사를 어떻게 할지?
방법 2. 배열(Array) 사용
- 배열에 0부터 9까지의 숫자를 넣고, 하나씩 뽑음.
- 숫자를 뽑을 때마다 사라지므로 겹칠 수 X.
📌 do-while문 이용 - 코드가 복잡함.
let number = [];
number[0] = Math.floor(Math.random()*10);
do {
number[1] = Math.floor(Math.random()*10);
} while(number[1] === number[0]) // 같을때는 계속 다시 뽑으므로 === 이다.
do {
number[2] = Math.floor(Math.random()*10);
} while(number[2] === number[0] || number[2] === number[1])
do {
number[3] = Math.floor(Math.random()*10);
} while(number[3] === number[0] || number[3] === number[1] || number[3] === number[2])
>> 여기서는 우선 동작을 먼저 하고나서 검사를 하기 위해서 do-while 루프를 사용했다.
❕ do - while문
- while에 비해 내용을 먼저 실행 후 조건 비교.
while | 조건 검사 -> 내용 실행 |
do while | 내용 실행 -> 조건 검사 (최소 한번은 실행된다.) |
여기서 이해가 안되는데
📌for문 이용 - 심화 ver.
let list = [0,1,2,3,4,5,6,7,8,9];
let number = [];
for(let i=0; i<4; i++) {
let select = Math.floor(Math.random() * list.length);
number[i] = list.splice(select, 1)[0];
}
💡 Array.splice(시작위치, 길이)
- 시작위치부터 주어진 길이만큼 잘라서 원래 배열에서 빼냄.
- 빼낸 배열을 반환(return)함.
즉,
number[i] = list.splice(select, 1)[0];
위 코드에서
select는 0-9중 랜덤으로 뽑은 수이다.
만약 select = 4가 나왔다면
list = [0, 1, 2, 3, 4, 5, 6, 7, 8, 9]에서
4부터 시작해서 1만큼 잘라서 빼라는 의미. (즉, 4를 배열에서 빼버림)
❗❗ 이때, 4라는 값(value)의 형태로 빠지지 않고
[4]와 같이 배열의 형태로 빠지게 된다.
따라서, 배열이 아닌 값(value)만 추출하기 위해서
[4]라는 배열의 첫번째 요소 [0]을 적어준다.
REFERENCE
www.zerocho.com
이 포스팅은 zerocho님의 javascript 강의와 책을 보고 작성한 글입니다.
공부+기록 용으로 작성한 것입니다.
'PRACTICE > SELF' 카테고리의 다른 글
javaScript. 자동 텍스트 RPG 게임 (0) | 2022.01.27 |
---|---|
javaScript. 숫자야구게임 - (2) (0) | 2022.01.19 |
<PROJECT> Importance Of Planning-2(3) 개요 정리 (0) | 2021.10.16 |
practice. 백준 알고리즘 단계별 챌린지 / 프로그래머스 실력체크 (0) | 2021.08.24 |
CSS 박스모델 실습 예제 (0) | 2021.08.24 |