본문 바로가기
STUDY/Kotlin

Kotlin / 숫자 야구 게임

by HR_J 2024. 4. 30.

숫자 야구 게임, 좋아하세요? 저는 야구라면 환장을 하는 나머지 게임으로도 만들어 보았습니다.

요구사항

프로그램 실행시 아래의 메뉴를 출력한다.

환영합니다! 원하시는 번호를 입력해주세요
1. 게임 시작하기 2. 게임 기록 보기 3. 종료하기

1번 선택 -> 숫자 야구 게임을 실행합니다.

2번 선택 -> 프로그램이 최초 실행된 이후의 게임 기록을 보여줍니다.

3번 선택 -> 프로그램이 종료됩니다.

1번 - 게임 시작하기

  • 게임 시작하기 기능을 실행하면, 숫자 야구 게임을 실행합니다.
  • 서로 다른 숫자 3개를 입력하면 힌트를 제공합니다.
  • 같은 자리에 같은 숫자가 있는 경우 스트라이크(S), 다른 자리에 숫자가 있는 경우 볼(B)입니다.
  • 3S가 나오면 게임을 종료합니다.
  • 입력한 숫자가 정답에 하나도 없다면 OUT을 나타냅니다.

2번 - 게임 기록 보기

  • 게임 기록 보기 기능을 실행하면, 사용자가 프로그램을 실행한 이후 모든 게임들에 대한 기록을 보여줍니다.

3번 - 게임 종료하기

  • 프로그램이 종료됩니다.

 

코드

BullsAndCows.kt

class BullsAndCows(size: Int) {
    private val scoreList = mutableListOf<Int>()

    init {
        println("환영합니다! 원하시는 번호를 입력해주세요")

        while (true) {
            println("1. 게임 시작하기 2. 게임 기록 보기 3. 종료하기")
            val num = readln().toInt()

            when (num) {
                1 -> {
                    println("< 게임을 시작합니다 >")
                    val answer = makeAnswer(size)
                    scoreList.add(runGame(size, answer))
                }

                2 -> {
                    printScore(scoreList)
                }

                3 -> {
                    println("< 숫자 야구 게임을 종료합니다 >")
                    break
                }

                else -> {
                    println("< 올바른 숫자를 입력해주세요! >")
                }
            }
        }
    }

    private fun makeAnswer(size: Int): IntArray {
        while (true) {
            val answer = (1..9).toList().shuffled().take(size).toIntArray()
            if (answer[0] != 0) return answer
        }
    }

    private fun hasDuplicates(arr: IntArray): Boolean {
        return arr.size != arr.distinct().size
    }

    private fun checkGuess(answer: IntArray, guess: IntArray): String {
        var strikes = 0
        var balls = 0

        for (i in answer.indices) {
            if (answer[i] == guess[i]) {
                strikes++
            } else if (answer.contains(guess[i])) {
                balls++
            }
        }

        return when {
            strikes == 3 -> "3S"
            strikes > 0 && balls > 0 -> "${strikes}S ${balls}B"
            strikes > 0 -> "${strikes}S"
            balls > 0 -> "${balls}B"
            else -> "OUT"
        }
    }

    private fun runGame(size: Int, answer: IntArray): Int {
        var cnt = 0
        while (true) {
            println("숫자를 입력하세요")
            val numberSheet = readln().map { it.toString().toInt() }.toIntArray()

            if (numberSheet.size != size) {
                println("범위 외 입력입니다.")
                continue
            } else if (hasDuplicates(numberSheet)) {
                println("중복된 숫자가 있습니다.")
                continue
            } else if (numberSheet[0] == 0) {
                println("숫자는 0으로 시작할 수 없습니다.")
                continue
            } else {
                val result = checkGuess(answer, numberSheet)
                println(result)
                if (result == "3S") {
                    println("정답!")
                    return cnt
                }
                cnt++
            }
        }
    }

    private fun printScore(scoreList: MutableList<Int>) {
        println("< 게임 기록 보기 >")
        scoreList.forEachIndexed { index, score ->
            println("${index + 1}번째 게임 : 시도 횟수 - $score")
        }
    }

}

Main.kt

fun main() {
    BullsAndCows(3)
}

출력 결과

환영합니다! 원하시는 번호를 입력해주세요
1. 게임 시작하기 2. 게임 기록 보기 3. 종료하기
1
< 게임을 시작합니다 >
숫자를 입력하세요
111
중복된 숫자가 있습니다.
숫자를 입력하세요
1234
범위 외 입력입니다.
숫자를 입력하세요
123
2B
숫자를 입력하세요
314
1S 1B
숫자를 입력하세요
351
2S
숫자를 입력하세요
381
2S
숫자를 입력하세요
391
2S
숫자를 입력하세요
371
3S
정답!
1. 게임 시작하기 2. 게임 기록 보기 3. 종료하기
1
< 게임을 시작합니다 >
숫자를 입력하세요
123
1S
숫자를 입력하세요
234
1B
숫자를 입력하세요
613
1S
숫자를 입력하세요
723
2S
숫자를 입력하세요
743
2S
숫자를 입력하세요
753
2S
숫자를 입력하세요
763
2S
숫자를 입력하세요
783
2S
숫자를 입력하세요
793
3S
정답!
1. 게임 시작하기 2. 게임 기록 보기 3. 종료하기
2
< 게임 기록 보기 >
1번째 게임 : 시도 횟수 - 5
2번째 게임 : 시도 횟수 - 8
1. 게임 시작하기 2. 게임 기록 보기 3. 종료하기
3
< 숫자 야구 게임을 종료합니다 >

 

GitHubLink : https://github.com/DEVxMOON/Bulls-and-Cows

 

GitHub - DEVxMOON/Bulls-and-Cows

Contribute to DEVxMOON/Bulls-and-Cows development by creating an account on GitHub.

github.com

 

 

이번 글의 핵심은... 깃 레포의 커밋 메시지 입니다. 제가 마참내,, 커밋 메시지  컨벤션을 지정했거든요.. 여러분들은,, 꼭 git pull 한 후에 push하도록 하세요.. ~

'STUDY > Kotlin' 카테고리의 다른 글

Kotlin / Scope Function - 범위 지정 함수  (0) 2024.05.31
Kotlin / Conditions and Loops (If, When, For, While)  (0) 2024.04.30
Kotlin / 고차함수와 람다  (0) 2024.04.25
Kotlin / 고차함수  (0) 2024.04.24
Kotlin / 계산기 만들기  (0) 2024.04.22