3주차 개인 과제는 숫자야구 게임을 구현해보는 것이다.
코드를 무작정 치자니 다소 막막해서 구현해야 하는 내용과 순서, 필요한 문법들을 정리 후 금일 필수 구현기능들을 구현해 보았다.
https://github.com/JinkownHong/NumberBaseballGame_JinKwon.git
GitHub - JinkownHong/NumberBaseballGame_JinKwon
Contribute to JinkownHong/NumberBaseballGame_JinKwon development by creating an account on GitHub.
github.com
과제 소개
필수 구현 기능
- 요구사항별로 상세 기능을 생각해요 / 사용하면서 발생할 수 있는 예외 사항들을 고려해봅니다.
1.입력과 출력
[입력]
- 서로 다른 3자리 수
- 게임 시작, 기록 보기, 종료를 구분하는 수 입력
- 필수 구현에서는 실행 시, 바로 게임 시작
- 선택 구현에서 시작, 기록, 종료 구분
[출력]
- 입력한 수에 대한 결과값을 “볼, 스트라이크, Nothing”으로 표시
2. 요구사항
- 1에서 9까지의 서로 다른 임의의 수 3개를 정하고 맞추는 게임
- 정답은 랜덤으로 만듭니다.(1에서 9까지의 서로 다른 임의의 수 3자리)
- 상세
- 정답을 맞추기 위해 3자리수를 입력하고 힌트를 받습니다
- 힌트는 야구용어인 볼과 스트라이크입니다.
- 같은 자리에 같은 숫자가 있는 경우 스트라이크, 다른 자리에 숫자가 있는 경우 볼입니다.
- EX. 정답이 456 인 경우 435를 입력 시 → 1스트라이크 1볼
- 만약 올바르지 않은 입력값에 대해서는 오류 문구를 보여주세요.
- 3자리 숫자가 정답과 같은 경우 게임이 종료됩니다.
- 정답을 맞추기 위해 3자리수를 입력하고 힌트를 받습니다
아래는 코드를 작성하기 전 다시 한번 정리해 본 내용이다.
1. 서로 다른 세자리 수를 입력받아야 한다
(숫자는 1 - 9 사이 수이며, 정답은 랜덥으로 출력한다)
2. 출력값은 Strike, Ball, Nothing 이며, 일치 여부에 따라 적절한 문구를 출력해서 사용자에게 보여줘야 한다.
3. 만약 숫자에 0 이 들어갈 경우 / 동일한 숫자가 반복해서 들어갈 경우 / 문자를 입력할 경우 catch 하여 오류문구를 출력,
다시 한번 동작이 반복되도록 설정한다.
* git commit 내역이나, 추후 작성 될 Readme 를 통해 어떤 의도로 다음과 같이 코드를 작성했는지 참고할 수 있다.
위 코드를 작성 중 막히는 부분이 하나 있었는데
동일한 숫자를 입력 시 오류를 캐치하여 "동일한 숫자를 입력할 수 없습니다" 문구를 출력하고 다시 한번 수를 입력할 수 있도록 설정하는 부분이었다.
전체 동작을 반복하는 while 문 안, while 문을 추가로 사용하여 오류를 캐치해 보려 했으나
무한 루프를 탈출하기 위한 break 시 하단 for 문 when 문이 출력하는 문제가 발생했다. (같은 while 문 안에 묶여 있는 점 참고!)
while (true) {
val inputList = readln().map { it.digitToInt() }
if (inputList[0] == inputList[1] || inputList[0] == inputList[2] || inputList[1] == inputList[2]) {
print("동일한 숫자를 입력했습니다. 다시 입력해주세요 :")
continue
}
for(..) {
.
.
}
when(..) {
.
.
}
}
그래서 어떻게 해결했냐면 튜터님께 찾아갔고 continue 기능을 설명해 주셨다.
코드로 풀어보면 if문 사용 if 문의 조건과 부합할 시 "동일한 숫자를 입력했습니다. 다시 입력해주세요 :" 를 출력하고,
continue 기능으로 아래 다른 when 문이나 for문을 돌지않고, 바로 위 inputList로 돌아갈 수 있다.
기능을 배웠으니, If continue 관련 더 자세히 알아보자!
Break & Continue
break : 반복문 안의 구문이 실행되는 중 break 구문을 만나면 반복문을 빠져 나간다.
continue : 반복문 안의 구문이 실행되는 중, continue 구문을 만나면 해당 반복문의 처음으로 다시 돌아간다.
숫자게임으로 break 를 적용해보면,
while (true) {
when {
strike == 3 -> {
println("정답입니다!"); break
}
strike != 0 && ball != 0 -> println("${strike}스트라이크 ${ball}볼 입니다.")
strike != 0 && ball == 0 -> println("${strike}스트라이크입니다.")
strike == 0 && ball != 0 -> println("${ball}볼입니다.")
else -> println("일치하는 숫자가 없습니다.")
}
}
스트라이크가 3개가 되기 전까지는 다음과 같은 문구를 출력하며 while 문을 지속적으로 돌다가,
3 strike가 되는 순가 정답 문구를 출력하고, while 문을 빠져나옵니다.
while (true) {
val inputList = readln().map { it.digitToInt() }
if (inputList[0] == inputList[1] || inputList[0] == inputList[2] || inputList[1] == inputList[2]) {
print("동일한 숫자를 입력했습니다. 다시 입력해주세요 :")
continue
}
for(..) {
.
.
}
when(..) {
.
.
}
}
그리고 위 코드 블럭을 다시 보면,
동일한 숫자가 입력될 때 마다 다음과 같은 문구를 출력하며 while 문의 처음으로 다시 돌아오는 것을 확인할 수 있습니다.
내일은 선택 구현기능을 실습해보고,
성공한다면 객체 지향방식으로 다음 과제를 어떻게 풀어나갈 수 있을지 (** 효율적으로, 역할과 책임을 분명히하여) 그려봐야겠다.
너무너무 재밌고 어렵다. 화이팅 ..