From 8f3cf4aefe628cfb0d112eef7d7527769842f7b4 Mon Sep 17 00:00:00 2001 From: hyowon6 Date: Wed, 25 Oct 2023 04:18:04 +0900 Subject: [PATCH 1/4] =?UTF-8?q?readme=20=EC=9E=91=EC=84=B1?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- README.md | 178 +++++++++++------------------------------------------- 1 file changed, 34 insertions(+), 144 deletions(-) diff --git a/README.md b/README.md index 4f55778fe..620592e23 100644 --- a/README.md +++ b/README.md @@ -1,144 +1,34 @@ -# 미션 - 숫자 야구 - -## 🔍 진행 방식 - -- 미션은 **기능 요구 사항, 프로그래밍 요구 사항, 과제 진행 요구 사항** 세 가지로 구성되어 있다. -- 세 개의 요구 사항을 만족하기 위해 노력한다. 특히 기능을 구현하기 전에 기능 목록을 만들고, 기능 단위로 커밋 하는 방식으로 진행한다. -- 기능 요구 사항에 기재되지 않은 내용은 스스로 판단하여 구현한다. - -## 📮 미션 제출 방법 - -- 미션 구현을 완료한 후 GitHub을 통해 제출해야 한다. - - GitHub을 활용한 제출 방법은 [프리코스 과제 제출](https://github.com/woowacourse/woowacourse-docs/tree/master/precourse) 문서를 참고해 - 제출한다. -- GitHub에 미션을 제출한 후 [우아한테크코스 지원](https://apply.techcourse.co.kr) 사이트에 접속하여 프리코스 과제를 제출한다. - - 자세한 방법은 [제출 가이드](https://github.com/woowacourse/woowacourse-docs/tree/master/precourse#제출-가이드) 참고 - - **Pull Request만 보내고 지원 플랫폼에서 과제를 제출하지 않으면 최종 제출하지 않은 것으로 처리되니 주의한다.** - -## 🚨 과제 제출 전 체크 리스트 - 0점 방지 - -- 기능 구현을 모두 정상적으로 했더라도 **요구 사항에 명시된 출력값 형식을 지키지 않을 경우 0점으로 처리**한다. -- 기능 구현을 완료한 뒤 아래 가이드에 따라 테스트를 실행했을 때 모든 테스트가 성공하는지 확인한다. -- **테스트가 실패할 경우 0점으로 처리**되므로, 반드시 확인 후 제출한다. - -### 테스트 실행 가이드 - -- 터미널에서 Mac 또는 Linux 사용자의 경우 `./gradlew clean test` 명령을 실행하고, - Windows 사용자의 경우 `gradlew.bat clean test` 또는 `./gradlew.bat clean test` 명령을 실행할 때 모든 테스트가 아래와 같이 통과하는지 확인한다. - -``` -BUILD SUCCESSFUL in 0s -``` - ---- - -## 🚀 기능 요구 사항 - -기본적으로 1부터 9까지 서로 다른 수로 이루어진 3자리의 수를 맞추는 게임이다. - -- 같은 수가 같은 자리에 있으면 스트라이크, 다른 자리에 있으면 볼, 같은 수가 전혀 없으면 낫싱이란 힌트를 얻고, 그 힌트를 이용해서 먼저 상대방(컴퓨터)의 수를 맞추면 승리한다. - - 예) 상대방(컴퓨터)의 수가 425일 때 - - 123을 제시한 경우 : 1스트라이크 - - 456을 제시한 경우 : 1볼 1스트라이크 - - 789를 제시한 경우 : 낫싱 -- 위 숫자 야구 게임에서 상대방의 역할을 컴퓨터가 한다. 컴퓨터는 1에서 9까지 서로 다른 임의의 수 3개를 선택한다. 게임 플레이어는 컴퓨터가 생각하고 있는 서로 다른 3개의 숫자를 입력하고, 컴퓨터는 입력한 - 숫자에 대한 - 결과를 출력한다. -- 이 같은 과정을 반복해 컴퓨터가 선택한 3개의 숫자를 모두 맞히면 게임이 종료된다. -- 게임을 종료한 후 게임을 다시 시작하거나 완전히 종료할 수 있다. -- 사용자가 잘못된 값을 입력할 경우 `IllegalArgumentException`을 발생시킨 후 애플리케이션은 종료되어야 한다. - -### 입출력 요구 사항 - -#### 입력 - -- 서로 다른 3자리의 수 -- 게임이 끝난 경우 재시작/종료를 구분하는 1과 2 중 하나의 수 - -#### 출력 - -- 입력한 수에 대한 결과를 볼, 스트라이크 개수로 표시 - -``` -1볼 1스트라이크 -``` - -- 하나도 없는 경우 - -``` -낫싱 -``` - -- 3개의 숫자를 모두 맞힐 경우 - -``` -3스트라이크 -3개의 숫자를 모두 맞히셨습니다! 게임 종료 -``` - -- 게임 시작 문구 출력 - -``` -숫자 야구 게임을 시작합니다. -``` - -#### 실행 결과 예시 - -``` -숫자 야구 게임을 시작합니다. -숫자를 입력해주세요 : 123 -1볼 1스트라이크 -숫자를 입력해주세요 : 145 -1볼 -숫자를 입력해주세요 : 671 -2볼 -숫자를 입력해주세요 : 216 -1스트라이크 -숫자를 입력해주세요 : 713 -3스트라이크 -3개의 숫자를 모두 맞히셨습니다! 게임 종료 -게임을 새로 시작하려면 1, 종료하려면 2를 입력하세요. -1 -숫자를 입력해주세요 : 123 -1볼 -... -``` - ---- - -## 🎯 프로그래밍 요구 사항 - -- Kotlin 1.9.0에서 실행 가능해야 한다. **Kotlin 1.9.0에서 정상적으로 동작하지 않을 경우 0점 처리한다.** -- **Java 코드가 아닌 Kotlin 코드로만 구현해야 한다.** -- 프로그램 실행의 시작점은 `Application`의 `main()`이다. -- `build.gradle(.kts)`을 변경할 수 없고, 외부 라이브러리를 사용하지 않는다. -- [Kotlin 코드 컨벤션](https://github.com/woowacourse/woowacourse-docs/tree/main/styleguide/kotlin) 가이드를 준수하며 프로그래밍한다. -- 프로그램 종료 시 `System.exit()`를 호출하지 않는다. -- 프로그램 구현이 완료되면 `ApplicationTest`의 모든 테스트가 성공해야 한다. **테스트가 실패할 경우 0점 처리한다.** -- 프로그래밍 요구 사항에서 달리 명시하지 않는 한 파일, 패키지 이름을 수정하거나 이동하지 않는다. - -### 라이브러리 - -- `camp.nextstep.edu.missionutils`에서 제공하는 `Randoms` 및 `Console` API를 사용하여 구현해야 한다. - - Random 값 추출은 `camp.nextstep.edu.missionutils.Randoms`의 `pickNumberInRange()`를 활용한다. - - 사용자가 입력하는 값은 `camp.nextstep.edu.missionutils.Console`의 `readLine()`을 활용한다. - -#### 사용 예시 - -```kotlin -val computer = mutableListOf() -while (computer.size() < 3) { - val randomNumber = Randoms.pickNumberInRange(1, 9) - if (!computer.contains(randomNumber)) { - computer.add(randomNumber) - } -} -``` - ---- - -## ✏️ 과제 진행 요구 사항 - -- 미션은 [kotlin-baseball](https://github.com/woowacourse-precourse/kotlin-baseball-6) 저장소를 Fork & Clone해 시작한다. -- **기능을 구현하기 전 `docs/README.md`에 구현할 기능 목록을 정리**해 추가한다. -- 과제 진행 및 제출 방법은 [프리코스 과제 제출](https://github.com/woowacourse/woowacourse-docs/tree/master/precourse) 문서를 참고한다. +## 기능 요구 사항 +1) 1부터 9까지 서로 다른 수로 이루어진 3자리 수를 랜덤으로 생성 +- 상대방의 수를 맞추면 승리 +2) 플레이어가 예상한 상대방의 서로 다른 3개의 숫자를 입력받고 +3) 입력한 숫자에 대한 힌트 출력 +- 같은 수가 같은 자리에 있으면 스트라이크, 다른 자리에 있으면 볼 +- 같은 수가 전혀 없으면 낫싱 +4) 2번과 3번 과정 반복 후 숫자를 모두 맞히면 게임 종료 + +## 입출력 요구 사항 +- 입력 + - 서로 다른 3자리 수 + - 게임이 끝난 경우 재시작/종료를 구분하는 1과 2 중 하나의 수 +- 출력 + - 입력한 수에 대한 결과를 볼, 스트라이크 개수로 표시 + - 기능 요구사항 3번 참고 + - 모두 맞힐 경우 + - ```3스트라이크3개의 숫자를 모두 맞히셨습니다! ``` + - ```게임 종료``` + + - 게임 시작 문구 출력 + - ```숫자 야구 게임을 시작합니다.``` + +## 프로그래밍 요구 사항 +- 프로그램 실행의 시작점은 Application의 main() +- build.gradle(.kts)을 변경 X, 외부 라이브러리를 사용하지 X +- 프로그램 종료 시 System.exit()를 호출 X +- 프로그램 구현이 완료되면 ApplicationTest의 모든 테스트가 성공 +- 프로그래밍 요구 사항에서 달리 명시하지 않는 한 파일, 패키지 이름을 수정하거나 이동 X +- +- 라이브러리 + - camp.nextstep.edu.missionutils에서 제공하는 Randoms 및 Console API를 사용하여 구현 + - Random 값 추출은 camp.nextstep.edu.missionutils.Randoms의 pickNumberInRange()를 활용 + - 사용자가 입력하는 값은 camp.nextstep.edu.missionutils.Console의 readLine()을 활용 \ No newline at end of file From 1afdca015ef9d1138a018a6319dd2945f3a28d53 Mon Sep 17 00:00:00 2001 From: hyowon6 Date: Wed, 25 Oct 2023 23:39:52 +0900 Subject: [PATCH 2/4] =?UTF-8?q?=EC=88=AB=EC=9E=90=EC=95=BC=EA=B5=AC=20?= =?UTF-8?q?=EC=99=84=EC=84=B1?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- src/main/kotlin/baseball/Application.kt | 66 ++++++++++++++++++++++++- 1 file changed, 65 insertions(+), 1 deletion(-) diff --git a/src/main/kotlin/baseball/Application.kt b/src/main/kotlin/baseball/Application.kt index 148d75cc3..7287299c4 100644 --- a/src/main/kotlin/baseball/Application.kt +++ b/src/main/kotlin/baseball/Application.kt @@ -1,5 +1,69 @@ package baseball fun main() { - TODO("프로그램 구현") + println("숫자 야구 게임을 시작합니다") + var restart = true + + while (restart) { + val differentThreeNum = generateDifferentThreeNum() + var trial = 1 + + while (true) { + val userInput = getUserInput(trial) + val result = numberHint(userInput, differentThreeNum) + println(result) + + if (result == "3스트라이크") { + println("3개의 숫자를 맞히셨습니다! 게임 종료") + break + } + trial ++ + } + println("게임을 새로 시작하려면 1, 종료하려면 2를 입력하세요.") + restart = readLine()?.trim() == "1" + } +} + + + +fun generateDifferentThreeNum(): String { + val shuffledNumbers = (1..9).toList().shuffled().take(3) + return shuffledNumbers.joinToString("") +} + +fun getUserInput(trial: Int): String { + while(true) { + print("숫자를 입력해주세요: ") + val input = readLine()?.trim() + + if(input != null && input.length == 3 && input.all{it.isDigit()}) { + return input + } + println("잘못된 값입니다. 3자리 숫자를 입력하세요.") + } +} + +fun numberHint(userInput: String, differentThreeNum: String): String{ + var ball = 0 + var strike = 0 + + for (i in userInput.indices) { + if (userInput[i] == differentThreeNum[i]) { + strike++ + } else if (userInput[i] in differentThreeNum) { + ball++ + } + } + + if(strike == 3) { + return "3스트라이크" + } else if( ball != 0 && strike != 0 ) { + return "${ball}볼 ${strike}스크라이크" + } else if( ball != 0 && strike == 0 ) { + return "${ball}볼" + } else if( ball == 0 && strike != 0 ) { + return "${strike}스트라이크" + } else { + return "낫싱" + } } From 97262bb876da2a0e6b93418aaeb7aef3ff4e915e Mon Sep 17 00:00:00 2001 From: hyowon6 Date: Wed, 25 Oct 2023 23:46:09 +0900 Subject: [PATCH 3/4] =?UTF-8?q?=EC=A3=BC=EC=84=9D=20=EC=B2=98=EB=A6=AC?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- src/main/kotlin/baseball/Application.kt | 6 +++++- 1 file changed, 5 insertions(+), 1 deletion(-) diff --git a/src/main/kotlin/baseball/Application.kt b/src/main/kotlin/baseball/Application.kt index 7287299c4..f40053683 100644 --- a/src/main/kotlin/baseball/Application.kt +++ b/src/main/kotlin/baseball/Application.kt @@ -20,17 +20,19 @@ fun main() { trial ++ } println("게임을 새로 시작하려면 1, 종료하려면 2를 입력하세요.") + // 1 입력 시 새로 시작 restart = readLine()?.trim() == "1" } } - +// 1부터 9까지 서로 다른 수로 이루어진 3자리의 수 생성 함수 fun generateDifferentThreeNum(): String { val shuffledNumbers = (1..9).toList().shuffled().take(3) return shuffledNumbers.joinToString("") } +// 사용자로부터 세 자리 숫자를 입력받는 함수 fun getUserInput(trial: Int): String { while(true) { print("숫자를 입력해주세요: ") @@ -43,6 +45,7 @@ fun getUserInput(trial: Int): String { } } +// 입력한 수에 대한 힌트 제공 함수 fun numberHint(userInput: String, differentThreeNum: String): String{ var ball = 0 var strike = 0 @@ -55,6 +58,7 @@ fun numberHint(userInput: String, differentThreeNum: String): String{ } } + if(strike == 3) { return "3스트라이크" } else if( ball != 0 && strike != 0 ) { From 4805643073f34286faf62aa122aa1953e6b7ee7c Mon Sep 17 00:00:00 2001 From: hyowon6 Date: Sat, 28 Oct 2023 13:15:12 +0900 Subject: [PATCH 4/4] =?UTF-8?q?trial=20=ED=95=84=EC=9A=94=EC=97=86?= =?UTF-8?q?=EB=8A=94=20=ED=95=A8=EC=88=98?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- src/main/kotlin/baseball/Application.kt | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/main/kotlin/baseball/Application.kt b/src/main/kotlin/baseball/Application.kt index f40053683..4032cfdd0 100644 --- a/src/main/kotlin/baseball/Application.kt +++ b/src/main/kotlin/baseball/Application.kt @@ -33,7 +33,7 @@ fun generateDifferentThreeNum(): String { } // 사용자로부터 세 자리 숫자를 입력받는 함수 -fun getUserInput(trial: Int): String { +fun getUserInput(): String { while(true) { print("숫자를 입력해주세요: ") val input = readLine()?.trim()