Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

[숫자 야구 게임] 장은영 미션 제출합니다. #228

Open
wants to merge 22 commits into
base: main
Choose a base branch
from
Open
Show file tree
Hide file tree
Changes from all commits
Commits
Show all changes
22 commits
Select commit Hold shift + click to select a range
68fe5a5
docs: 기능 명세서
feijoazoa Oct 22, 2023
2c4dce7
라이브러리 import하기
feijoazoa Oct 22, 2023
69c0e0a
feat: 사용자가 맞춰야하는 1~9까지 서로 다른 임의의 수로 이루어진 3자리 숫자 생성
feijoazoa Oct 22, 2023
d87543d
사용자 입력값 받기
feijoazoa Oct 23, 2023
6fd78c9
feat: Strike와 Ball 확인하기
feijoazoa Oct 23, 2023
c840134
feat : 기능명세서 수정
feijoazoa Oct 23, 2023
f565746
자료형 문제로 인한 Error 해결
feijoazoa Oct 23, 2023
d157e29
feat: 사용자입력값과 컴퓨터값 비교하여 ball 과 strike 수 세기
feijoazoa Oct 23, 2023
58a1d22
feat: 중복되는 숫자 IllegalArgumentException 처리
feijoazoa Oct 23, 2023
ba926b2
feat: 게임종료한 후 게임을 다시 시작하거나 완전히 종료하는 기능
feijoazoa Oct 23, 2023
02ee8bb
feat: 메인함수에서 게임 실행
feijoazoa Oct 24, 2023
3bfd8c8
feat: gameStart함수 만들고 메인함수에서 실행
feijoazoa Oct 24, 2023
d67c7aa
feat: strike와 ball을 세는 함수 분리
feijoazoa Oct 24, 2023
3d4b931
strike와 ball 변수를 compareNumber함수에서도 쓰기 위해 전역 변수로 바꾸기
feijoazoa Oct 24, 2023
87023b3
feat: gameOver함수에 parameter 값 지정해주기
feijoazoa Oct 24, 2023
9c537fe
출력 2번씩 되는것 수정
feijoazoa Oct 24, 2023
3ccea4a
compareNumber함수 기능 수정
feijoazoa Oct 25, 2023
ef2ffc8
game함수에서 strike갯수와 ball갯수가 3이 안 넘어가도록 수정
feijoazoa Oct 25, 2023
b2fe5bf
strike 와 ball 세는 기능 수정
feijoazoa Oct 25, 2023
a807399
fix: error 난 부분 수정
feijoazoa Oct 25, 2023
dd0f3ca
출력방식 수정
feijoazoa Oct 25, 2023
3b1f4d4
오류 수정
feijoazoa Oct 25, 2023
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
36 changes: 36 additions & 0 deletions docs/README.md
Original file line number Diff line number Diff line change
@@ -0,0 +1,36 @@
#기능 목록

##Computer
+숫자 야구 게임을 시작합니다. 가 콘솔창에 출력되며 게임 시작
+컴퓨터는 사용자가 맞춰야 하는 1부터 9까지 서로 다른 임의의 수로 이루어진 3자리 숫자 생성
-1~9까지의 숫자
-서로 다른 수로 이루어짐
-3자리 숫자

+사용자로 부터 숫자 입력 받기
+같은 수가 같은 자리에 있으면 스트라이크
-스트라이크 수 세기
+같은 수가 다른 자리에 있으면 볼
-볼 수 세기
+같은 수가 전혀 없으면 낫싱
+결과 출력
+맞는 답(3스트라이크)인지 확인

+과정 반복
+맞는 답 이면 게임 종료
+그에 따른 재시작/종료를 구분 하는 입력 받기


##User
+숫자를 입력해주세요 : 가 콘솔 창에 표시
+숫자로 입력 받기
-1부터 9까지의 수인지 확인
-서로 다른 수로 이루어 졌는지 확인
-3자리 수인지 확인
+숫자가 아닌 입력인 경우 IllegalArgumentException 발생 시킨 후 종료

+게임이 끝난 경우 재시작/종료를 구분 하는 입력 받기
-1일 경우 재시작
-2일 경우 종료
+그 외의 경우 입력 예외

8 changes: 8 additions & 0 deletions local.properties
Original file line number Diff line number Diff line change
@@ -0,0 +1,8 @@
## This file must *NOT* be checked into Version Control Systems,
# as it contains information specific to your local configuration.
#
# Location of the SDK. This is only used by Gradle.
# For customization when using a Version Control System, please read the
# header note.
#Mon Oct 23 00:09:44 KST 2023
sdk.dir=C\:\\Users\\User\\AppData\\Local\\Android\\Sdk
117 changes: 116 additions & 1 deletion src/main/kotlin/baseball/Application.kt

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

기본적으로 변수명과 클래스명은 명사로, 함수명은 동사로 지어주어야 합니다!
코틀린 컨벤션 가이드를 참고하시면 좋을 것 같아요.

코틀린 네이밍 규칙

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

그리고 자동 정렬을 습관화하시면, 더 쉽게 코틀린 컨벤션을 지킬 수 있답니다!
코드를 읽어보니 : 띄어쓰기가 잘 안 되어 있는 것 같더라고요.

자동 정렬 단축키
윈도우: ctrl+shift+alt+L
맥: command+option+L

Trailing Commas

Copy link

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

좋은 정보 감사합니다 @sseung416 님!

Copy link
Author

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

좋은 정보 감사합니다 !

Original file line number Diff line number Diff line change
@@ -1,5 +1,120 @@
package baseball

import camp.nextstep.edu.missionutils.Randoms
import camp.nextstep.edu.missionutils.Console
import java.lang.IllegalArgumentException

const val START_MESSAGE = "숫자 야구 게임을 시작합니다."
const val INPUT_NUMBER_MESSAGE = "숫자를 입력해주세요 : "
const val THREE_STRIKE_MESSAGE = "3개의 숫자를 모두 맞히셨습니다! 게임 종료"
const val RESTART_MESSAGE = "게임을 새로 시작하려면 1, 종료하려면 2를 입력하세요."
Comment on lines +7 to +10
Copy link

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

상수화 시켜주셨는데 enum class 를 활용해보셔도 좋을 것 같습니다!

Copy link
Author

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

enum class 생각도 못했네요,,..! 좋은 의견 감사합니다 !

Comment on lines +7 to +10
Copy link

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

🥰




fun main() {
TODO("프로그램 구현")
var computer: List<Int> = listOf()
var user: List<Int>
var areUReady = true
Copy link

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

이거 귀엽네요 areUReady ㅎㅎ
그래두 승연님 말씀대로 바꾸시면 더 좋을 것 같아요!

var gameRestart = true

println(START_MESSAGE)
while(areUReady or gameRestart){
if(gameRestart) {
computer = generateRandomNumber()
}
user = userInput()
areUReady = game(computer,user)
gameRestart = gameOver(areUReady)
}
}

fun generateRandomNumber(): List<Int> {

val computer = mutableListOf<Int>()
while (computer.size < 3) {
val randomNumber = Randoms.pickNumberInRange(1, 9)
if (!computer.contains(randomNumber)) {
computer.add(randomNumber)
}
}
println(computer)

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

디버그용으로 작성하신 출력문인 것 같은데, 커밋 전에는 꼭 지워주세요!

return computer
}

fun userInput(): List<Int> {
print(INPUT_NUMBER_MESSAGE)
val user = Console.readLine().map {it.digitToInt()}

if(user.contains(0)) {
throw IllegalArgumentException("1~9 사이의 값을 입력해주세요")
}
if(user.size != 3) {
throw IllegalArgumentException("3자리 수를 입력해주세요")
}
if(user.toSet().size != 3) {
throw IllegalArgumentException("중복 되지 않는 숫자를 입력해주세요")
}
if(user.isEmpty()){
throw IllegalArgumentException("값을 넣어주세요")
}
Comment on lines +48 to +59
Copy link

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

if 문이 3개 이상 사용된다면 when 사용을 고려해보시는건 어떨까요?

코틀린 컨벤션

return user
}

fun game(computer: List<Int>, user: List<Int>):Boolean {
var ball = 0
var strike = 0

for (i in computer.indices) {
Copy link

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

저도 지영님께 배웠는데, forEachIndexed 사용해도 좋을 것 같아요!

Copy link
Author

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

다음번엔 forEachIndexed 활용해보겠습니다 👍 감사합니다!

if(user[i] !in computer){
continue
}
Comment on lines +68 to +70
Copy link

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

이 조건문은 user[i] 가 computer 에 속하지 않는다면 -> continue 인 것 같아요.
그렇다면 if (user[i] in computer)에 대한 처리도 필요할 것 같아보입니다!

Copy link
Author

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

고려하지 못했던 부분이네요,,감사합니다 👍

if (computer[i] == user[i]) {
strike++
continue
}
else {
ball++
}
}
println(compareNumber(ball, strike))

if (strike == 3) {
println(THREE_STRIKE_MESSAGE)
return false
}
return true
}



fun compareNumber(ball:Int, strike: Int): String {

var str = ""
if (ball == 0 && strike == 0) {
print("낫싱")
}
else if (ball == 0 && strike > 0) {
print("${strike}스트라이크")
}
else if (strike == 0 && ball > 0) {
print("${ball}볼")
}else{
print("${ball}볼 ${strike}스트라이크")}
return str
}
Comment on lines +90 to +104

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

str을 선언한 이유가 있으신가요? 분기문에서는 str의 값을 변경하는 작업이 보이지 않아서 여쭙니다!
그리고 코틀린 컨벤션에서는 다중 if문보다는 when을 권장하기 때문에 when 사용 고려해보시면 좋을 것 같습니다!

Copy link

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

승연님 말씀대로 val str = when() 해서 분기하면 더 좋을 것 같아요!

Copy link
Author

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

return 값으로 돌려줘야해서 구현에 급급해서 그렇게 짰었네요..! 다음번엔 when() 사용 해봐야겠습니다 !



fun gameOver(areUDone:Boolean): Boolean {
val userReply : Int

if(!areUDone){
println(RESTART_MESSAGE)
userReply = Console.readLine().toInt()
return when (userReply) {
1 -> true
2 -> false
else -> throw IllegalArgumentException("1 또는 2를 선택해주세요")
}
}
return false
}