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

[자동차 경주] 윤지우 미션 제출합니다. #90

Open
wants to merge 9 commits into
base: main
Choose a base branch
from
31 changes: 31 additions & 0 deletions README.md
Original file line number Diff line number Diff line change
@@ -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대 이상인 경우, 쉼표(,)로 분리하여 출력
13 changes: 12 additions & 1 deletion src/main/kotlin/racingcar/Application.kt
Original file line number Diff line number Diff line change
@@ -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<Int>(carname.size, { 0 })

raceoutput(carname, racenum, carscore)
winnerprint(carscore, carname)
}
11 changes: 11 additions & 0 deletions src/main/kotlin/racingcar/carrandomvalue/carRandomvalue.kt
Original file line number Diff line number Diff line change
@@ -0,0 +1,11 @@
package racingcar.carrandomvalue

import camp.nextstep.edu.missionutils.Randoms

fun carrandomgo(carname: List<String>, carscore: Array<Int>) {
for (randomgo: Int in carname.indices) {
if (Randoms.pickNumberInRange(0, 9) >= 4) {
carscore[randomgo] += 1
}
}
}
31 changes: 31 additions & 0 deletions src/main/kotlin/racingcar/view/inputview.kt
Original file line number Diff line number Diff line change
@@ -0,0 +1,31 @@
package racingcar.view

import camp.nextstep.edu.missionutils.Console

fun carnameinputview(): List<String> {
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
}
42 changes: 42 additions & 0 deletions src/main/kotlin/racingcar/view/outputview.kt
Original file line number Diff line number Diff line change
@@ -0,0 +1,42 @@
package racingcar.view

import racingcar.carrandomvalue.carrandomgo
import racingcar.winner.maxpointfind

fun raceoutput(carname: List<String>, racenum: Int, carscore: Array<Int>) {
println("\n실행 결과")
for (race: Int in 0..<racenum) {
carrandomgo(carname, carscore)
raceprint(carname, carscore)
}
}

fun raceprint(carname: List<String>, carscore: Array<Int>) {
for (scoreindex: Int in carname.indices) {
val car = carname[scoreindex]
print("$car : ")
println("-".repeat(carscore[scoreindex]))
}
println()
}

fun winnerprint(carscore: Array<Int>, carname: List<String>) {
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(", ")
}
}
11 changes: 11 additions & 0 deletions src/main/kotlin/racingcar/winner/winnerpoint.kt
Original file line number Diff line number Diff line change
@@ -0,0 +1,11 @@
package racingcar.winner

fun maxpointfind(carscore: Array<Int>): Int {
var scoremax = 0
for (maxval in carscore) {
if (maxval > scoremax) {
scoremax = maxval
}
}
return scoremax
}