오늘은 코틀린 기본 문법 심화과제가 주어져서 과제를 수행하는데 많은 시간을 할애했다.
숫자 야구 게임을 만드는 과제였는데 구현 과정에서 필요했던 부분들에 대해 정리해본다.
1. 야구 게임 만들기
1-1. 서로 다른 임의의 3개의 숫자 만들기
숫자 야구게임을 구현하려면 먼저 서로 다른 임의의 3개의 숫자로 이루어진 답을 하나 만들어야한다. 그 다음 사용자로부터 입력을 받아 답과 비교해 결과를 사용자에게 알려주어야한다.
그래서 먼저 서로 다른 임의의 숫자 3개를 만드는 방법부터 생각해보았다. 단순히 숫자 3개를 고르는 것이 아니라 순서 역시 중요하기 때문에 문자열, 배열, 리스트 같은 것들을 활용할 수 있을 것 같았다.
내가 택한 방법은 1,2,3,4,5,6,7,8,9가 들어간 IntArray를 만든 뒤 랜덤으로 정렬해주고 앞에서 3개만 잘라서 3개의 숫자로 된 IntArray를 얻는 것이었다. 이렇게 한 이유는 문자열이나 리스트를 활용하는 것 보다 원시타입으로 이루어진 IntArray가 더 효율적일 것이라고 생각했기 때문이다.
아래는 위를 바탕으로 작성한 임의의 서로 다른 3개의 숫자가 들어간 IntArray를 반환받는 함수이다.
fun getRandomThreeNumbArray(): IntArray {
val numberArray = intArrayOf(1, 2, 3, 4, 5, 6, 7, 8, 9)
// 배열을 무작위로 정렬한다
numberArray.shuffle()
// 배열을 잘라 반환한다. 인덱스의 범위는 크기가 3이면 0~2가 아니어도 상관없다.
return numberArray.sliceArray(0..2)
}
1-2. 사용자에게 서로 다른 임의의 숫자 3개 입력받기
그 다음으로는 사용자에게 서로 다른 3개의 임의의 숫자 입력받는 부분을 작성해보았다. 중간 과정에서 여러번 수정을 거친 부분이기도 하다.
입력받은 문자열을 Int 타입으로 변환시켜서 해보기도 하고 여러가지 시도를 해보았는데 결국 그냥 문자열 상태에서 모든 것을 해결했다.
1~9의 숫자 3개가 들어왔는지를 확인하는 부분은 정규 표현식으로 처리했고, 중복된 숫자가 들어왔는가에 대해서는 입력받은 문자열에 인덱싱을 활용해 문자들을 서로 비교해 같으면 경고문을 출력하고 다시 입력받는 식으로 처리했다.
정상적으로 입력받은 문자열에 map 함수를 이용하면 문자열에 있는 문자 하나하나를 Int 타입으로 변환한 값들을 요소로 가지는 리스트를 얻을 수 있다. 그것을 IntArray로 바꿔 반환하도록 만들었다.
fun getThreeNumbInputArray(): IntArray {
while (true) {
val inputString = readln()
when {
Regex("[1-9][1-9][1-9]") matches inputString -> {
if (inputString[0] == inputString[1] || inputString[0] == inputString[2]
|| inputString[1] == inputString[2]
) {
println("0을 제외한 서로 다른 3개의 숫자를 입력해야합니다. 다시 입력해주세요.")
} else {
return inputString.map { it.digitToInt() }.toIntArray()
}
}
else -> println("3개의 숫자만 입력 가능합니다. 다시 입력해주세요")
}
}
}
1-3. 스트라이크와 볼 카운트하기
그 다음으로는 두 IntArray를 비교해 스트라이크와 볼을 카운트하여 결과를 출력하면 된다. 3 스트라이크가 되면 더 이상 입력받는 것을 중지하게 된다.
for문을 이용해 3개의 입력받은 숫자 배열과 답안 숫자 배열을 비교해 스트라이크와 볼을 카운트 하면 된다.
숫자가 3개이기 때문에 인덱스는 0~2만 반복하면 된다. 반복을 돌며 두 배열의 인덱스에 해당하는 값이 같다면 스트라이크의 숫자가 하나 올라간다. 그렇지 않은 경우 답안 배열 어딘가에 입력받은 숫자 배열의 인덱스에 해당하는 값이 존재한다면 볼의 숫자가 하나 올라가도록 만들었다.
아래가 해당 코드이다.
// answerNumbArray는 답이 들어있는 배열, inputArray는 입력받은 숫자 배열
var strike = 0
var ball = 0
for (i in 0..2) {
if (answerNumbArray[i] == inputArray[i]) {
strike++
} else if (answerNumbArray.any { it == inputArray[i] }) {
ball++
}
}
스트라이크와 볼의 값을 구했으니 출력하는 것은 경우를 when문으로 나누어 출력하면 된다.
여기까지 오늘 만들어본 숫자 야구 게임을 만들며 적어본 코드들을 정리해보았다.
2. 오늘 배운 것
- 숫자 야구 게임을 만들며 코틀린에 익숙해지는 연습을 하면서 조금 더 알아보기 쉬운 코드로 작성하려고 노력해보았다.
- JVM에서 코틀린이 어떻게 구동되는지에 대해 조금 공부해보았다.
'오늘 배운 것' 카테고리의 다른 글
24-05-01 Kotlin 객체(인스턴스)가 생성, 저장, 호출되는 방식 (0) | 2024.05.01 |
---|---|
24-04-30 Kotlin 숫자 야구 게임 만들기 (2) (0) | 2024.04.30 |
24-04-28 Kotlin 가변길이 인자(vararg) (0) | 2024.04.28 |
24-04-27 Kotlin 기본 매개변수(Default Parameter) (0) | 2024.04.27 |
24-04-26 Kotlin 인터페이스와 추상 클래스 (0) | 2024.04.26 |