숫자 야구게임을 만들었다... 뚝딱 만들 수 있을 줄 알았는데 조금 고민을 하면서 만들었다.
⚾️ [숫자 야구게임 규칙] ⚾️
- 컴퓨터는 0과 9 사이의 서로 다른 숫자 3개를 무작위로 뽑는다.
예시) 569, 284- 사용자는 컴퓨터가 뽑은 숫자를 맞히기 위해 수를 입력한다.
- 컴퓨터는 사용자가 입력한 세자리 숫자에 대해서, 스트라이크(S)와 볼(B)를 알려준다.
- 숫자의 값과 위치가 모두 일치하면 S
- 숫자의 값은 일치하지만 위치가 틀렸으면 B
- 기회는 무제한이며, 몇 번의 시도 후에 맞혔는지 기록한다.
- 숫자 3개를 모두 맞힌 경우, 게임을 종료한다.
먼저 컴퓨터가 무작위로 수를 뽑기 위해서 난수를 만들어야 했다.
난수를 만드는 것은 어려운 것이 아니었지만 서로 다른 난수를 뽑아야 하는 과정에서 어려움을 겪었다.
머리 속으로는 생각이 됐지만 코드로 풀어내는 것이 어려웠다.
for (int i = 0; i < 3; i++) {
computerNumber[i] = random.nextInt(10);
}
random.nextInt(10)
으로 10 미만인 한 자리 수 정수를 무작위로 뽑았다.
하지만 계속 실행하면서 중복되는 수가 나왔다.
if(조건문)을 사용해 중복되는 수가 나오면 다시 한번 정수를 뽑으면 되겠다고 생각을 했다.
처음엔 이런 식으로 코드를 짰다.
for (int i = 0; i < 3; i++) {
computerNumber[i] = random.nextInt(10);
for (int j = 0; j < 3; j++) {
if (computerNumber[i] == computerNumber[j]) computerNumber[i] = random.nextInt(10);
}
}
결과적으론 중복된 수가 계속 발생했다... 엄청 고민을 했다.. 나는 바보일까 라는 생각을 계속했다
바보였다...
① 내가 만든 for 문은 이렇게 돌 것이다.
② 하지만 같은 인덱스는 당연히 같을 것이고 비교할 필요가 없다. 인덱스가 같지 않은 부분만 비교를 해야했다.
③ 9개 순서쌍 중에 6개만 비교하면 된다.
④ 또 생각해보니 순서쌍처럼 생각을 할 필요가 없었다. 왜냐하면 비교해봤자 같은 computerNumber
이기 때문에 값도 같을 것이다.
⑤ 최종적으로 3개의 경우의 수만 남았고 for 문을 다시 고쳐썼다..........
for (int i = 0; i < 3; i++) {
computerNumber[i] = random.nextInt(10);
for (int j = 0; j < i; j++) {
if (computerNumber[i] == computerNumber[j]) i--;
}
}
for 안에 있는 또 다른 for 문의 조건을 j < i
로 바꾸었고, i--
를 해서 만약 같을 경우 다시 난수를 생성하도록 하였다......
중복되는 난수를 해결하고
사용자 숫자를 입력받은 후, 세 자리수를 배열에 저장을 했다. ex) 349 ➡️ [3, 4, 9]
예전 코딩테스트에서 자릿수 더하기가 생각이 났고, 그것을 이용해 배열로 저장할 수 있었다.
또 다시 문제가 발생했다...
스트라이크와 볼을 판별하는 과정에서 스트라이트와 볼 카운트가 계속 더해지고 있었다..
이것도 정말 바보같은 실수였다....
코드를 다시 살펴보니
while (true) {
(...)
for (int i = 0; i < 3; i++) {
for (int j = 0; j < 3; j++) {
if(userNumber[i] == computerNumber[j] && i == j) countStrike++;
else if(userNumber[i] == computerNumber[j]) countBall++;
}
}
(...)
}
초기화를 하지 않아
계속 돌면서 사용자가 새로운 숫자를 입력해도 그 수에 맞는 스트라이크와 볼 카운트가 나오는 것이 아니라 이전에 입력했던 숫자의 카운트에 더해져서 나왔다.
아래에
countStrike = 0;
countBall = 0;
를 추가하여 새로운 숫자를 입력할 때는 다시 0으로 시작할 수 있도록 하였다.
마지막으로 countStrike == 3
일 때 while
문을 빠져나올 수 있도록 break
를 해주어 완성을 하였다.
가장 많이 시간을 소요한 부분은 중복된 난수를 뽑지 않는 부분이었다.
역시 종이에 끄적이면서 해야 잘 된다....
종이에 for 문이 어떻게 돌아갈지 적어보면서 생각을 하니까 해결할 수 있었다.
Random 클래스를 사용해 난수를 생성하는 법을 알게 되었다.
randomNumber = random.nextInt() // (): bound;
중복된 난수를 제거하기 위해 for문의 조건을 어떻게 작성을 해야하는지 알게되었다.
반복문과 좀 더 친해진 것 같다.
아자아자 화이팅 !
오늘은 좀 새롭게 게시물을 써봤다.
지금까지 내가 써온 것이 TIL 인 줄 알았다.
Today I Learned. 말 그대로 내가 오늘 뭘 배웠는가 ? 이니까
지금까지 쓴 게시물은 강의를 들으면서 배운 내용을 정리하고 나중에 필요할 때, 갑자기 생각이 안날 때 찾아볼 수 있도록 내가 이해하기 쉽게 작성을 했다..
하지만 TIL은 이렇게 작성하는 것이 아니라는 것을 알게 됐다
다 지울 뻔 했지만 아까워서 그냥 둔다.
TIL의 모범답안
이렇게 써야한다고 했다
앞으로 발전하는 나. 성장하는 나. 잘 지켜보세요.