diff --git a/README.md b/README.md index 62fa463c..32ccb49f 100644 --- a/README.md +++ b/README.md @@ -1 +1,32 @@ # kotlin-racingcar-precourse + +자동차 경주 미션을 진행하는 저장소 + +### 자동차 경주 설명 +초간단 자동차 경주 + +경주할 자동차의 이름과 시도 횟수를 입력받아 자동차 경주를 진행하고 그 결과를 출력하는 프로그램 + +### 기능 요구사항 +1. 주어진 횟수동안 자동차는 전진 혹은 정지 가능 +2. 자동차 이름을 부여하고 경기를 출력할 때, 자동차 이름 함께 출력 +3. 입력받은 자동차 이름은 쉼표(,)로 구분 +4. 자동차 이름은 5자 이하만 가능 +5. 이동 횟수 입력 +6. 전진 조건: 0~9 사이의 랜덤 값을 입력받아 무작위 값이 4이상일 경우 전진 +7. 자동차 경주 완효 후, 우승자 출력 +8. 우승자는 다수 가능 +9. 우승자가 여러 명일 경우, 쉼표(,)로 구분 +10. 입력값이 잘못된 경우, IllegalArgumentException 발생 후 종료 + +### 자동차 경주 기능 및 순서 정리 +1. 사용자에게 자동차 이름 입력 받기 +2. 자동차 이름을 쉼표를 기준으로 분리. 5자 이하일 경우, IllegalArgumentException 발생 +4. 사용자에게 시도 횟수 입력 받기. 횟수가 정수가 아닌 잘못된 값일 경우, IllegalArgumentException 발생 +6. 자동차 경주 점수판 생성 및 자동차 경주 시작 +7. 각 자동차마다 랜덤값을 불러와 기준에 부합하면 전진 및 정지 +8. 1회마다 경기 내용 출력 +9. 입력받은 시도횟수만큼 진행 후, 경기 종료 +10. 가장 멀리 전진한 자동차의 이동거리 저장 +11. 가장 멀리 전진한 이동거리를 가진 자동차 전체를 출력 +12. 우승자가 1대 이상인 경우, 쉼표(,)로 분리하여 출력 \ No newline at end of file diff --git a/src/main/kotlin/racingcar/Application.kt b/src/main/kotlin/racingcar/Application.kt index 0d8f3a79..42143a26 100644 --- a/src/main/kotlin/racingcar/Application.kt +++ b/src/main/kotlin/racingcar/Application.kt @@ -1,5 +1,16 @@ package racingcar +import racingcar.view.carnameinputview +import racingcar.view.racenuminputview +import racingcar.view.raceoutput +import racingcar.view.winnerprint + fun main() { - // TODO: 프로그램 구현 + val carname = carnameinputview() + val racenum = racenuminputview() + + val carscore = Array(carname.size, { 0 }) + + raceoutput(carname, racenum, carscore) + winnerprint(carscore, carname) } diff --git a/src/main/kotlin/racingcar/carrandomvalue/carRandomvalue.kt b/src/main/kotlin/racingcar/carrandomvalue/carRandomvalue.kt new file mode 100644 index 00000000..b3dfe606 --- /dev/null +++ b/src/main/kotlin/racingcar/carrandomvalue/carRandomvalue.kt @@ -0,0 +1,11 @@ +package racingcar.carrandomvalue + +import camp.nextstep.edu.missionutils.Randoms + +fun carrandomgo(carname: List, carscore: Array) { + for (randomgo: Int in carname.indices) { + if (Randoms.pickNumberInRange(0, 9) >= 4) { + carscore[randomgo] += 1 + } + } +} \ No newline at end of file diff --git a/src/main/kotlin/racingcar/view/inputview.kt b/src/main/kotlin/racingcar/view/inputview.kt new file mode 100644 index 00000000..ad878bf2 --- /dev/null +++ b/src/main/kotlin/racingcar/view/inputview.kt @@ -0,0 +1,31 @@ +package racingcar.view + +import camp.nextstep.edu.missionutils.Console + +fun carnameinputview(): List { + val carname_print = "경주할 자동차 이름을 입력하세요.(이름은 쉼표(,) 기준으로 구분)" + println(carname_print) + + val carname = readLine()?.split(",") ?: throw IllegalArgumentException() + + for (car in carname) { + if (car.length > 5 || car == "") { + throw IllegalArgumentException() + } + } + return carname +} + +fun racenuminputview(): Int { + val racenum_print = "시도할 횟수는 몇 회인가요?" + val racenum: Int + + println(racenum_print) + + try { + racenum = readLine()?.toInt() ?: throw IllegalArgumentException() + } catch (e: NumberFormatException) { + throw IllegalArgumentException() + } + return racenum +} \ No newline at end of file diff --git a/src/main/kotlin/racingcar/view/outputview.kt b/src/main/kotlin/racingcar/view/outputview.kt new file mode 100644 index 00000000..94c80650 --- /dev/null +++ b/src/main/kotlin/racingcar/view/outputview.kt @@ -0,0 +1,42 @@ +package racingcar.view + +import racingcar.carrandomvalue.carrandomgo +import racingcar.winner.maxpointfind + +fun raceoutput(carname: List, racenum: Int, carscore: Array) { + println("\n실행 결과") + for (race: Int in 0.., carscore: Array) { + for (scoreindex: Int in carname.indices) { + val car = carname[scoreindex] + print("$car : ") + println("-".repeat(carscore[scoreindex])) + } + println() +} + +fun winnerprint(carscore: Array, carname: List) { + var scoremax = 0 + var winnersep = 0 + + print("최종 우승자 : ") + scoremax = maxpointfind(carscore) + for (win: Int in carname.indices) { + if (scoremax == carscore[win]) { + winnerseperate(winnersep) + print(carname[win]) + winnersep++ + } + } +} + +fun winnerseperate(winnersep: Int) { + if (winnersep > 0) { + print(", ") + } +} \ No newline at end of file diff --git a/src/main/kotlin/racingcar/winner/winnerpoint.kt b/src/main/kotlin/racingcar/winner/winnerpoint.kt new file mode 100644 index 00000000..99e0eff2 --- /dev/null +++ b/src/main/kotlin/racingcar/winner/winnerpoint.kt @@ -0,0 +1,11 @@ +package racingcar.winner + +fun maxpointfind(carscore: Array): Int { + var scoremax = 0 + for (maxval in carscore) { + if (maxval > scoremax) { + scoremax = maxval + } + } + return scoremax +} \ No newline at end of file