whatisthis?

javaScript. 숫자야구게임 - (1) 본문

PRACTICE/SELF

javaScript. 숫자야구게임 - (1)

thisisyjin 2022. 1. 19. 10:50

 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 강의와 책을 보고 작성한 글입니다.
공부+기록 용으로 작성한 것입니다.