From 41e8e25e1bddb71d3ad56b893bc1f99a4e738752 Mon Sep 17 00:00:00 2001 From: riyenas0925 Date: Sun, 20 Nov 2022 19:44:17 +0900 Subject: [PATCH 01/10] =?UTF-8?q?refactor:=20step3=20=EC=BD=94=EB=93=9C=20?= =?UTF-8?q?=EB=A6=AC=EB=B7=B0=20=EB=82=B4=EC=9A=A9=20=EB=B0=98=EC=98=81?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- src/main/kotlin/racingcar/Application.kt | 6 ++-- src/main/kotlin/racingcar/Car.kt | 17 +++++------ src/main/kotlin/racingcar/InputView.kt | 30 ++++++++------------ src/main/kotlin/racingcar/MovingJudgeRule.kt | 10 ++----- src/main/kotlin/racingcar/NumberGenerator.kt | 7 ++++- src/main/kotlin/racingcar/ResultView.kt | 14 ++++----- src/test/kotlin/racingcar/CarTest.kt | 6 ++-- 7 files changed, 40 insertions(+), 50 deletions(-) diff --git a/src/main/kotlin/racingcar/Application.kt b/src/main/kotlin/racingcar/Application.kt index 8688f7f131..8fcf1c56ba 100644 --- a/src/main/kotlin/racingcar/Application.kt +++ b/src/main/kotlin/racingcar/Application.kt @@ -1,9 +1,9 @@ package racingcar -class Application - fun main() { - val (cars, roundCount) = InputView() + val roundCount = InputView.readRoundCount() + val cars = InputView.readCars() + val racingGame = RacingGame( cars = cars, numberGenerator = RacingCarNumberGenerator() diff --git a/src/main/kotlin/racingcar/Car.kt b/src/main/kotlin/racingcar/Car.kt index 15c3a5de51..a893c22045 100644 --- a/src/main/kotlin/racingcar/Car.kt +++ b/src/main/kotlin/racingcar/Car.kt @@ -1,16 +1,13 @@ package racingcar class Car( - private var location: Int = 0, + private var _location: Int = 0, ) { - fun move(randNumber: Int) { - val rule = MovingJudgeRule.judge(randNumber) - val strategy = rule.strategy() - - location = strategy.move(location) - } - - fun currentLocation(): Int { - return location + val location + get() = _location + fun move(number: Int) { + val rule = MovingJudgeRule.judge(number) + val strategy = rule.strategy + _location = strategy.move(location) } } diff --git a/src/main/kotlin/racingcar/InputView.kt b/src/main/kotlin/racingcar/InputView.kt index 7260d25cc0..2b7f68cba4 100644 --- a/src/main/kotlin/racingcar/InputView.kt +++ b/src/main/kotlin/racingcar/InputView.kt @@ -1,24 +1,18 @@ package racingcar +object InputView { + fun readCars(): List { + println("자동차 대수는 몇 대인가요?") -data class InputView( - val cars: List = readCars("자동차 대수는 몇 대인가요?"), - val roundCount: Int = readRoundCount("시도할 횟수는 몇 회인가요?"), -) { - companion object { - private fun readCars(message: String): List { - println(message) - - val list = mutableListOf() - repeat(readln().toInt()) { - list.add(Car()) - } - - return list + val list = mutableListOf() + repeat(readln().toInt()) { + list.add(Car()) } - private fun readRoundCount(message: String): Int { - println(message) - return readln().toInt() - } + return list + } + + fun readRoundCount(): Int { + println("시도할 횟수는 몇 회인가요?") + return readln().toInt() } } diff --git a/src/main/kotlin/racingcar/MovingJudgeRule.kt b/src/main/kotlin/racingcar/MovingJudgeRule.kt index 4063cbf1be..2b8bfe00a2 100644 --- a/src/main/kotlin/racingcar/MovingJudgeRule.kt +++ b/src/main/kotlin/racingcar/MovingJudgeRule.kt @@ -2,15 +2,15 @@ package racingcar enum class MovingJudgeRule( private val expression: (Int) -> (Boolean), - private val strategy: MovingStrategy + val strategy: MovingStrategy ) { ADVANCE_RULE( - expression = { number -> number >= FORWARD_STRATEGY_BOUND }, + expression = { it >= FORWARD_STRATEGY_BOUND }, strategy = MovingStrategy.ADVANCE, ), STOP_RULE( - expression = { false }, + expression = { it < FORWARD_STRATEGY_BOUND }, strategy = MovingStrategy.STOP, ), ; @@ -19,10 +19,6 @@ enum class MovingJudgeRule( return expression(number) } - fun strategy(): MovingStrategy { - return strategy - } - companion object { private const val FORWARD_STRATEGY_BOUND = 4 diff --git a/src/main/kotlin/racingcar/NumberGenerator.kt b/src/main/kotlin/racingcar/NumberGenerator.kt index 97ce114911..98bfdedce6 100644 --- a/src/main/kotlin/racingcar/NumberGenerator.kt +++ b/src/main/kotlin/racingcar/NumberGenerator.kt @@ -6,6 +6,11 @@ interface NumberGenerator { class RacingCarNumberGenerator : NumberGenerator { override fun rand(): Int { - return (0..9).random() + return (RAND_NUMBER_START_BOUND..RAND_NUMBER_END_BOUND).random() + } + + companion object { + private const val RAND_NUMBER_START_BOUND = 0 + private const val RAND_NUMBER_END_BOUND = 0 } } diff --git a/src/main/kotlin/racingcar/ResultView.kt b/src/main/kotlin/racingcar/ResultView.kt index 74ff59a772..db57b55818 100644 --- a/src/main/kotlin/racingcar/ResultView.kt +++ b/src/main/kotlin/racingcar/ResultView.kt @@ -1,14 +1,12 @@ package racingcar -class ResultView { - companion object { - fun print(cars: List) { - for (car in cars) { - val location = car.currentLocation() - repeat(location) { print("-") } - println() - } +object ResultView { + fun print(cars: List) { + for (car in cars) { + val location = car.location + repeat(location) { print("-") } println() } + println() } } diff --git a/src/test/kotlin/racingcar/CarTest.kt b/src/test/kotlin/racingcar/CarTest.kt index 244a0c15e3..ba395c0de4 100644 --- a/src/test/kotlin/racingcar/CarTest.kt +++ b/src/test/kotlin/racingcar/CarTest.kt @@ -7,7 +7,7 @@ class CarTest : StringSpec({ "자동차의 처음 위치는 0이에요" { val car = Car() - car.currentLocation() shouldBe 0 + car.location shouldBe 0 } "자동차는 4 ~ 9의 숫자일 때 1 만큼 이동해요" { @@ -15,7 +15,7 @@ class CarTest : StringSpec({ val car = Car() car.move(number) - car.currentLocation() shouldBe 1 + car.location shouldBe 1 } } @@ -24,7 +24,7 @@ class CarTest : StringSpec({ val car = Car() car.move(number) - car.currentLocation() shouldBe 0 + car.location shouldBe 0 } } }) From d0bed0ac48d5a0cca77839733c526ab95dd8ee60 Mon Sep 17 00:00:00 2001 From: riyenas0925 Date: Sun, 20 Nov 2022 19:51:45 +0900 Subject: [PATCH 02/10] =?UTF-8?q?chore:=20=ED=8C=A8=ED=82=A4=EC=A7=80=20?= =?UTF-8?q?=EA=B5=AC=EC=A1=B0=EB=A5=BC=20view=EC=99=80=20domain=EC=9C=BC?= =?UTF-8?q?=EB=A1=9C=20=EB=B6=84=EB=A6=AC?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- src/main/kotlin/racingcar/Application.kt | 7 ++++++- src/main/kotlin/racingcar/{ => domain}/Car.kt | 2 +- src/main/kotlin/racingcar/{ => domain}/MovingJudgeRule.kt | 2 +- src/main/kotlin/racingcar/{ => domain}/MovingStrategy.kt | 2 +- src/main/kotlin/racingcar/{ => domain}/NumberGenerator.kt | 2 +- src/main/kotlin/racingcar/{ => domain}/RacingGame.kt | 2 +- src/main/kotlin/racingcar/{ => view}/InputView.kt | 5 ++++- src/main/kotlin/racingcar/{ => view}/ResultView.kt | 4 +++- src/test/kotlin/racingcar/CarTest.kt | 1 + src/test/kotlin/racingcar/MovingJudgeRuleTest.kt | 1 + src/test/kotlin/racingcar/MovingStrategyTest.kt | 1 + src/test/kotlin/racingcar/RacingGameTest.kt | 3 +++ 12 files changed, 24 insertions(+), 8 deletions(-) rename src/main/kotlin/racingcar/{ => domain}/Car.kt (91%) rename src/main/kotlin/racingcar/{ => domain}/MovingJudgeRule.kt (96%) rename src/main/kotlin/racingcar/{ => domain}/MovingStrategy.kt (92%) rename src/main/kotlin/racingcar/{ => domain}/NumberGenerator.kt (93%) rename src/main/kotlin/racingcar/{ => domain}/RacingGame.kt (91%) rename src/main/kotlin/racingcar/{ => view}/InputView.kt (87%) rename src/main/kotlin/racingcar/{ => view}/ResultView.kt (81%) diff --git a/src/main/kotlin/racingcar/Application.kt b/src/main/kotlin/racingcar/Application.kt index 8fcf1c56ba..09699db74c 100644 --- a/src/main/kotlin/racingcar/Application.kt +++ b/src/main/kotlin/racingcar/Application.kt @@ -1,8 +1,13 @@ package racingcar +import racingcar.domain.RacingCarNumberGenerator +import racingcar.domain.RacingGame +import racingcar.view.InputView +import racingcar.view.ResultView + fun main() { - val roundCount = InputView.readRoundCount() val cars = InputView.readCars() + val roundCount = InputView.readRoundCount() val racingGame = RacingGame( cars = cars, diff --git a/src/main/kotlin/racingcar/Car.kt b/src/main/kotlin/racingcar/domain/Car.kt similarity index 91% rename from src/main/kotlin/racingcar/Car.kt rename to src/main/kotlin/racingcar/domain/Car.kt index a893c22045..2235bc4ca7 100644 --- a/src/main/kotlin/racingcar/Car.kt +++ b/src/main/kotlin/racingcar/domain/Car.kt @@ -1,4 +1,4 @@ -package racingcar +package racingcar.domain class Car( private var _location: Int = 0, diff --git a/src/main/kotlin/racingcar/MovingJudgeRule.kt b/src/main/kotlin/racingcar/domain/MovingJudgeRule.kt similarity index 96% rename from src/main/kotlin/racingcar/MovingJudgeRule.kt rename to src/main/kotlin/racingcar/domain/MovingJudgeRule.kt index 2b8bfe00a2..c52aa2bc79 100644 --- a/src/main/kotlin/racingcar/MovingJudgeRule.kt +++ b/src/main/kotlin/racingcar/domain/MovingJudgeRule.kt @@ -1,4 +1,4 @@ -package racingcar +package racingcar.domain enum class MovingJudgeRule( private val expression: (Int) -> (Boolean), diff --git a/src/main/kotlin/racingcar/MovingStrategy.kt b/src/main/kotlin/racingcar/domain/MovingStrategy.kt similarity index 92% rename from src/main/kotlin/racingcar/MovingStrategy.kt rename to src/main/kotlin/racingcar/domain/MovingStrategy.kt index c6ee9a8eb3..1aa22acaaf 100644 --- a/src/main/kotlin/racingcar/MovingStrategy.kt +++ b/src/main/kotlin/racingcar/domain/MovingStrategy.kt @@ -1,4 +1,4 @@ -package racingcar +package racingcar.domain enum class MovingStrategy( private val expression: (Int) -> (Int) diff --git a/src/main/kotlin/racingcar/NumberGenerator.kt b/src/main/kotlin/racingcar/domain/NumberGenerator.kt similarity index 93% rename from src/main/kotlin/racingcar/NumberGenerator.kt rename to src/main/kotlin/racingcar/domain/NumberGenerator.kt index 98bfdedce6..cda24acc74 100644 --- a/src/main/kotlin/racingcar/NumberGenerator.kt +++ b/src/main/kotlin/racingcar/domain/NumberGenerator.kt @@ -1,4 +1,4 @@ -package racingcar +package racingcar.domain interface NumberGenerator { fun rand(): Int diff --git a/src/main/kotlin/racingcar/RacingGame.kt b/src/main/kotlin/racingcar/domain/RacingGame.kt similarity index 91% rename from src/main/kotlin/racingcar/RacingGame.kt rename to src/main/kotlin/racingcar/domain/RacingGame.kt index a2cebbf422..9e990bbe3e 100644 --- a/src/main/kotlin/racingcar/RacingGame.kt +++ b/src/main/kotlin/racingcar/domain/RacingGame.kt @@ -1,4 +1,4 @@ -package racingcar +package racingcar.domain class RacingGame( private val cars: List, diff --git a/src/main/kotlin/racingcar/InputView.kt b/src/main/kotlin/racingcar/view/InputView.kt similarity index 87% rename from src/main/kotlin/racingcar/InputView.kt rename to src/main/kotlin/racingcar/view/InputView.kt index 2b7f68cba4..dcab2c483f 100644 --- a/src/main/kotlin/racingcar/InputView.kt +++ b/src/main/kotlin/racingcar/view/InputView.kt @@ -1,4 +1,7 @@ -package racingcar +package racingcar.view + +import racingcar.domain.Car + object InputView { fun readCars(): List { println("자동차 대수는 몇 대인가요?") diff --git a/src/main/kotlin/racingcar/ResultView.kt b/src/main/kotlin/racingcar/view/ResultView.kt similarity index 81% rename from src/main/kotlin/racingcar/ResultView.kt rename to src/main/kotlin/racingcar/view/ResultView.kt index db57b55818..75e8b848d7 100644 --- a/src/main/kotlin/racingcar/ResultView.kt +++ b/src/main/kotlin/racingcar/view/ResultView.kt @@ -1,4 +1,6 @@ -package racingcar +package racingcar.view + +import racingcar.domain.Car object ResultView { fun print(cars: List) { diff --git a/src/test/kotlin/racingcar/CarTest.kt b/src/test/kotlin/racingcar/CarTest.kt index ba395c0de4..6e5f86a203 100644 --- a/src/test/kotlin/racingcar/CarTest.kt +++ b/src/test/kotlin/racingcar/CarTest.kt @@ -2,6 +2,7 @@ package racingcar import io.kotest.core.spec.style.StringSpec import io.kotest.matchers.shouldBe +import racingcar.domain.Car class CarTest : StringSpec({ diff --git a/src/test/kotlin/racingcar/MovingJudgeRuleTest.kt b/src/test/kotlin/racingcar/MovingJudgeRuleTest.kt index b0a9a8d292..2498c72104 100644 --- a/src/test/kotlin/racingcar/MovingJudgeRuleTest.kt +++ b/src/test/kotlin/racingcar/MovingJudgeRuleTest.kt @@ -2,6 +2,7 @@ package racingcar import io.kotest.core.spec.style.BehaviorSpec import io.kotest.matchers.shouldBe +import racingcar.domain.MovingJudgeRule class MovingJudgeRuleTest : BehaviorSpec({ diff --git a/src/test/kotlin/racingcar/MovingStrategyTest.kt b/src/test/kotlin/racingcar/MovingStrategyTest.kt index 3e8cbcd0fa..67f9e27558 100644 --- a/src/test/kotlin/racingcar/MovingStrategyTest.kt +++ b/src/test/kotlin/racingcar/MovingStrategyTest.kt @@ -2,6 +2,7 @@ package racingcar import io.kotest.core.spec.style.BehaviorSpec import io.kotest.matchers.shouldBe +import racingcar.domain.MovingStrategy class MovingStrategyTest : BehaviorSpec({ diff --git a/src/test/kotlin/racingcar/RacingGameTest.kt b/src/test/kotlin/racingcar/RacingGameTest.kt index 3edc4447ab..1476d35b5f 100644 --- a/src/test/kotlin/racingcar/RacingGameTest.kt +++ b/src/test/kotlin/racingcar/RacingGameTest.kt @@ -4,6 +4,9 @@ import io.kotest.core.spec.style.StringSpec import io.kotest.matchers.shouldBe import io.mockk.every import io.mockk.mockk +import racingcar.domain.Car +import racingcar.domain.NumberGenerator +import racingcar.domain.RacingGame class RacingGameTest : StringSpec({ "레이싱 게임은 매 횟수마다 자동차의 현재 위치를 보여줘요" { From 0a9c80e7c19e69f10a2b8659cd81bf65f2c818a9 Mon Sep 17 00:00:00 2001 From: riyenas0925 Date: Sun, 20 Nov 2022 19:52:06 +0900 Subject: [PATCH 03/10] =?UTF-8?q?docs:=20step4=20=EC=9A=94=EA=B5=AC?= =?UTF-8?q?=EC=82=AC=ED=95=AD=20=EB=B0=98=EC=98=81?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- src/main/kotlin/racingcar/README.md | 5 ++++- 1 file changed, 4 insertions(+), 1 deletion(-) diff --git a/src/main/kotlin/racingcar/README.md b/src/main/kotlin/racingcar/README.md index 7b9fcf814a..6f73bf2fde 100644 --- a/src/main/kotlin/racingcar/README.md +++ b/src/main/kotlin/racingcar/README.md @@ -12,10 +12,13 @@ ### 레이싱 게임 (Racing Game) - [x] 레이싱 게임은 자동차의 대수와 시도할 횟수를 입력할 수 있어요. -- [x] 레이싱 게임은 매 횟수마다 자동차의 현재 위치를 보여줘요. +- [ ] 레이싱 게임은 자동차의 이름을 쉽표로 구분해요. +- [ ] 레이싱 게임은 매 횟수마다 자동차의 이름과 현재 위치를 보여줘요. #### 자동차 (Car) - [x] 자동차는 입력한 숫자에 따라 이동해요. - [x] 0~3의 숫자를 입력하면 자동차는 멈춰요. - [x] 4 이상의 숫자를 입력하면 자동차는 1만큼 전진해요. +- [ ] 자동차는 이름을 가질 수 있어요. + - [ ] 자동차의 이름은 5자를 초과할 수 없어요. - [x] 자동차는 자신이 이동한 거리를 알 수 있어요. \ No newline at end of file From 530906b55d7585a611fbbe01e311f45dff259b3b Mon Sep 17 00:00:00 2001 From: riyenas0925 Date: Sun, 20 Nov 2022 20:05:30 +0900 Subject: [PATCH 04/10] =?UTF-8?q?feat:=20=EC=9E=90=EB=8F=99=EC=B0=A8?= =?UTF-8?q?=EB=8A=94=20=EC=9D=B4=EB=A6=84=EC=9D=84=20=EA=B0=80=EC=A7=88=20?= =?UTF-8?q?=EC=88=98=20=EC=9E=88=EC=96=B4=EC=9A=94.?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- src/main/kotlin/racingcar/README.md | 2 +- src/main/kotlin/racingcar/domain/Car.kt | 3 ++- src/main/kotlin/racingcar/domain/NumberGenerator.kt | 2 +- src/test/kotlin/racingcar/CarTest.kt | 6 +++--- src/test/kotlin/racingcar/RacingGameTest.kt | 4 ++-- 5 files changed, 9 insertions(+), 8 deletions(-) diff --git a/src/main/kotlin/racingcar/README.md b/src/main/kotlin/racingcar/README.md index 6f73bf2fde..5b92a4564f 100644 --- a/src/main/kotlin/racingcar/README.md +++ b/src/main/kotlin/racingcar/README.md @@ -19,6 +19,6 @@ - [x] 자동차는 입력한 숫자에 따라 이동해요. - [x] 0~3의 숫자를 입력하면 자동차는 멈춰요. - [x] 4 이상의 숫자를 입력하면 자동차는 1만큼 전진해요. -- [ ] 자동차는 이름을 가질 수 있어요. +- [x] 자동차는 이름을 가질 수 있어요. - [ ] 자동차의 이름은 5자를 초과할 수 없어요. - [x] 자동차는 자신이 이동한 거리를 알 수 있어요. \ No newline at end of file diff --git a/src/main/kotlin/racingcar/domain/Car.kt b/src/main/kotlin/racingcar/domain/Car.kt index 2235bc4ca7..42de4c774d 100644 --- a/src/main/kotlin/racingcar/domain/Car.kt +++ b/src/main/kotlin/racingcar/domain/Car.kt @@ -2,12 +2,13 @@ package racingcar.domain class Car( private var _location: Int = 0, + val name: String, ) { val location get() = _location fun move(number: Int) { val rule = MovingJudgeRule.judge(number) val strategy = rule.strategy - _location = strategy.move(location) + _location = strategy.move(_location) } } diff --git a/src/main/kotlin/racingcar/domain/NumberGenerator.kt b/src/main/kotlin/racingcar/domain/NumberGenerator.kt index cda24acc74..19d8f11577 100644 --- a/src/main/kotlin/racingcar/domain/NumberGenerator.kt +++ b/src/main/kotlin/racingcar/domain/NumberGenerator.kt @@ -11,6 +11,6 @@ class RacingCarNumberGenerator : NumberGenerator { companion object { private const val RAND_NUMBER_START_BOUND = 0 - private const val RAND_NUMBER_END_BOUND = 0 + private const val RAND_NUMBER_END_BOUND = 9 } } diff --git a/src/test/kotlin/racingcar/CarTest.kt b/src/test/kotlin/racingcar/CarTest.kt index 6e5f86a203..b2bf0366e6 100644 --- a/src/test/kotlin/racingcar/CarTest.kt +++ b/src/test/kotlin/racingcar/CarTest.kt @@ -7,13 +7,13 @@ import racingcar.domain.Car class CarTest : StringSpec({ "자동차의 처음 위치는 0이에요" { - val car = Car() + val car = Car(name = "car") car.location shouldBe 0 } "자동차는 4 ~ 9의 숫자일 때 1 만큼 이동해요" { (4..9).forEach { number -> - val car = Car() + val car = Car(name = "car") car.move(number) car.location shouldBe 1 @@ -22,7 +22,7 @@ class CarTest : StringSpec({ "자동차는 0~3의 숫자일 때 이동하지 않아요" { (0..3).forEach { number -> - val car = Car() + val car = Car(name = "car") car.move(number) car.location shouldBe 0 diff --git a/src/test/kotlin/racingcar/RacingGameTest.kt b/src/test/kotlin/racingcar/RacingGameTest.kt index 1476d35b5f..6a5f08253d 100644 --- a/src/test/kotlin/racingcar/RacingGameTest.kt +++ b/src/test/kotlin/racingcar/RacingGameTest.kt @@ -14,12 +14,12 @@ class RacingGameTest : StringSpec({ every { mockNumberGenerator.rand() } returns 0 val racingGame = RacingGame( - cars = listOf(Car(0)), + cars = listOf(Car(0, "car")), numberGenerator = mockNumberGenerator ) val car = racingGame.round()[0] - car.currentLocation() shouldBe 0 + car.location shouldBe 0 } }) From 57b1c77a25d94b098db5718a636f9aea8ae52569 Mon Sep 17 00:00:00 2001 From: riyenas0925 Date: Sun, 20 Nov 2022 20:11:48 +0900 Subject: [PATCH 05/10] =?UTF-8?q?feat:=20=EB=A0=88=EC=9D=B4=EC=8B=B1=20?= =?UTF-8?q?=EA=B2=8C=EC=9E=84=EC=9D=80=20=EC=9E=90=EB=8F=99=EC=B0=A8?= =?UTF-8?q?=EC=9D=98=20=EC=9D=B4=EB=A6=84=EC=9D=84=20=EC=89=BD=ED=91=9C?= =?UTF-8?q?=EB=A1=9C=20=EA=B5=AC=EB=B6=84=ED=95=B4=EC=9A=94.?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- src/main/kotlin/racingcar/README.md | 6 +++--- src/main/kotlin/racingcar/view/InputView.kt | 21 +++++++++++++++++--- src/main/kotlin/racingcar/view/ResultView.kt | 1 + 3 files changed, 22 insertions(+), 6 deletions(-) diff --git a/src/main/kotlin/racingcar/README.md b/src/main/kotlin/racingcar/README.md index 5b92a4564f..eb3ba9eb45 100644 --- a/src/main/kotlin/racingcar/README.md +++ b/src/main/kotlin/racingcar/README.md @@ -12,13 +12,13 @@ ### 레이싱 게임 (Racing Game) - [x] 레이싱 게임은 자동차의 대수와 시도할 횟수를 입력할 수 있어요. -- [ ] 레이싱 게임은 자동차의 이름을 쉽표로 구분해요. -- [ ] 레이싱 게임은 매 횟수마다 자동차의 이름과 현재 위치를 보여줘요. +- [x] 레이싱 게임은 자동차의 이름을 쉽표로 구분해요. +- [x] 레이싱 게임은 매 횟수마다 자동차의 이름과 현재 위치를 보여줘요. #### 자동차 (Car) - [x] 자동차는 입력한 숫자에 따라 이동해요. - [x] 0~3의 숫자를 입력하면 자동차는 멈춰요. - [x] 4 이상의 숫자를 입력하면 자동차는 1만큼 전진해요. - [x] 자동차는 이름을 가질 수 있어요. - - [ ] 자동차의 이름은 5자를 초과할 수 없어요. + - [x] 자동차의 이름은 5자를 초과할 수 없어요. - [x] 자동차는 자신이 이동한 거리를 알 수 있어요. \ No newline at end of file diff --git a/src/main/kotlin/racingcar/view/InputView.kt b/src/main/kotlin/racingcar/view/InputView.kt index dcab2c483f..41d0295d2b 100644 --- a/src/main/kotlin/racingcar/view/InputView.kt +++ b/src/main/kotlin/racingcar/view/InputView.kt @@ -2,13 +2,20 @@ package racingcar.view import racingcar.domain.Car +private const val VALID_CAR_NAME_LENGTH = 5 + object InputView { fun readCars(): List { - println("자동차 대수는 몇 대인가요?") + println("경주할 자동차 이름을 입력하세요(이름은 쉼표(,)를 기준으로 구분).") + val names = parseCarName(readln()) val list = mutableListOf() - repeat(readln().toInt()) { - list.add(Car()) + for(name in names) { + require(isValidLength(name)) { "글자수는 5자를 넘을 수 없어요" } + + list.add( + Car(name = name) + ) } return list @@ -18,4 +25,12 @@ object InputView { println("시도할 횟수는 몇 회인가요?") return readln().toInt() } + + private fun isValidLength(name: String): Boolean { + return name.length <= VALID_CAR_NAME_LENGTH + } + + private fun parseCarName(input :String): List { + return input.split(",") + } } diff --git a/src/main/kotlin/racingcar/view/ResultView.kt b/src/main/kotlin/racingcar/view/ResultView.kt index 75e8b848d7..ba793830ee 100644 --- a/src/main/kotlin/racingcar/view/ResultView.kt +++ b/src/main/kotlin/racingcar/view/ResultView.kt @@ -6,6 +6,7 @@ object ResultView { fun print(cars: List) { for (car in cars) { val location = car.location + print(car.name + " : ") repeat(location) { print("-") } println() } From 79f0885768878b02e20331021acb648d8a9e356b Mon Sep 17 00:00:00 2001 From: riyenas0925 Date: Sun, 20 Nov 2022 20:15:34 +0900 Subject: [PATCH 06/10] =?UTF-8?q?refactor:=20=ED=8C=A8=ED=82=A4=EC=A7=80?= =?UTF-8?q?=20=EC=9C=84=EC=B9=98=20=EC=9B=90=EB=9E=98=EB=8C=80=EB=A1=9C=20?= =?UTF-8?q?=EB=B3=80=EA=B2=BD?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- src/main/kotlin/racingcar/Application.kt | 5 ----- src/main/kotlin/racingcar/{domain => }/Car.kt | 2 +- src/main/kotlin/racingcar/{view => }/InputView.kt | 8 +++----- src/main/kotlin/racingcar/{domain => }/MovingJudgeRule.kt | 2 +- src/main/kotlin/racingcar/{domain => }/MovingStrategy.kt | 2 +- src/main/kotlin/racingcar/{domain => }/NumberGenerator.kt | 2 +- src/main/kotlin/racingcar/{domain => }/RacingGame.kt | 2 +- src/main/kotlin/racingcar/{view => }/ResultView.kt | 4 +--- src/test/kotlin/racingcar/CarTest.kt | 1 - src/test/kotlin/racingcar/MovingJudgeRuleTest.kt | 1 - src/test/kotlin/racingcar/MovingStrategyTest.kt | 1 - src/test/kotlin/racingcar/RacingGameTest.kt | 3 --- 12 files changed, 9 insertions(+), 24 deletions(-) rename src/main/kotlin/racingcar/{domain => }/Car.kt (91%) rename src/main/kotlin/racingcar/{view => }/InputView.kt (84%) rename src/main/kotlin/racingcar/{domain => }/MovingJudgeRule.kt (96%) rename src/main/kotlin/racingcar/{domain => }/MovingStrategy.kt (92%) rename src/main/kotlin/racingcar/{domain => }/NumberGenerator.kt (93%) rename src/main/kotlin/racingcar/{domain => }/RacingGame.kt (91%) rename src/main/kotlin/racingcar/{view => }/ResultView.kt (83%) diff --git a/src/main/kotlin/racingcar/Application.kt b/src/main/kotlin/racingcar/Application.kt index 09699db74c..591506b07f 100644 --- a/src/main/kotlin/racingcar/Application.kt +++ b/src/main/kotlin/racingcar/Application.kt @@ -1,10 +1,5 @@ package racingcar -import racingcar.domain.RacingCarNumberGenerator -import racingcar.domain.RacingGame -import racingcar.view.InputView -import racingcar.view.ResultView - fun main() { val cars = InputView.readCars() val roundCount = InputView.readRoundCount() diff --git a/src/main/kotlin/racingcar/domain/Car.kt b/src/main/kotlin/racingcar/Car.kt similarity index 91% rename from src/main/kotlin/racingcar/domain/Car.kt rename to src/main/kotlin/racingcar/Car.kt index 42de4c774d..8e34b6770a 100644 --- a/src/main/kotlin/racingcar/domain/Car.kt +++ b/src/main/kotlin/racingcar/Car.kt @@ -1,4 +1,4 @@ -package racingcar.domain +package racingcar class Car( private var _location: Int = 0, diff --git a/src/main/kotlin/racingcar/view/InputView.kt b/src/main/kotlin/racingcar/InputView.kt similarity index 84% rename from src/main/kotlin/racingcar/view/InputView.kt rename to src/main/kotlin/racingcar/InputView.kt index 41d0295d2b..97d6373295 100644 --- a/src/main/kotlin/racingcar/view/InputView.kt +++ b/src/main/kotlin/racingcar/InputView.kt @@ -1,6 +1,4 @@ -package racingcar.view - -import racingcar.domain.Car +package racingcar private const val VALID_CAR_NAME_LENGTH = 5 @@ -10,7 +8,7 @@ object InputView { val names = parseCarName(readln()) val list = mutableListOf() - for(name in names) { + for (name in names) { require(isValidLength(name)) { "글자수는 5자를 넘을 수 없어요" } list.add( @@ -30,7 +28,7 @@ object InputView { return name.length <= VALID_CAR_NAME_LENGTH } - private fun parseCarName(input :String): List { + private fun parseCarName(input: String): List { return input.split(",") } } diff --git a/src/main/kotlin/racingcar/domain/MovingJudgeRule.kt b/src/main/kotlin/racingcar/MovingJudgeRule.kt similarity index 96% rename from src/main/kotlin/racingcar/domain/MovingJudgeRule.kt rename to src/main/kotlin/racingcar/MovingJudgeRule.kt index c52aa2bc79..2b8bfe00a2 100644 --- a/src/main/kotlin/racingcar/domain/MovingJudgeRule.kt +++ b/src/main/kotlin/racingcar/MovingJudgeRule.kt @@ -1,4 +1,4 @@ -package racingcar.domain +package racingcar enum class MovingJudgeRule( private val expression: (Int) -> (Boolean), diff --git a/src/main/kotlin/racingcar/domain/MovingStrategy.kt b/src/main/kotlin/racingcar/MovingStrategy.kt similarity index 92% rename from src/main/kotlin/racingcar/domain/MovingStrategy.kt rename to src/main/kotlin/racingcar/MovingStrategy.kt index 1aa22acaaf..c6ee9a8eb3 100644 --- a/src/main/kotlin/racingcar/domain/MovingStrategy.kt +++ b/src/main/kotlin/racingcar/MovingStrategy.kt @@ -1,4 +1,4 @@ -package racingcar.domain +package racingcar enum class MovingStrategy( private val expression: (Int) -> (Int) diff --git a/src/main/kotlin/racingcar/domain/NumberGenerator.kt b/src/main/kotlin/racingcar/NumberGenerator.kt similarity index 93% rename from src/main/kotlin/racingcar/domain/NumberGenerator.kt rename to src/main/kotlin/racingcar/NumberGenerator.kt index 19d8f11577..80a1b470e4 100644 --- a/src/main/kotlin/racingcar/domain/NumberGenerator.kt +++ b/src/main/kotlin/racingcar/NumberGenerator.kt @@ -1,4 +1,4 @@ -package racingcar.domain +package racingcar interface NumberGenerator { fun rand(): Int diff --git a/src/main/kotlin/racingcar/domain/RacingGame.kt b/src/main/kotlin/racingcar/RacingGame.kt similarity index 91% rename from src/main/kotlin/racingcar/domain/RacingGame.kt rename to src/main/kotlin/racingcar/RacingGame.kt index 9e990bbe3e..a2cebbf422 100644 --- a/src/main/kotlin/racingcar/domain/RacingGame.kt +++ b/src/main/kotlin/racingcar/RacingGame.kt @@ -1,4 +1,4 @@ -package racingcar.domain +package racingcar class RacingGame( private val cars: List, diff --git a/src/main/kotlin/racingcar/view/ResultView.kt b/src/main/kotlin/racingcar/ResultView.kt similarity index 83% rename from src/main/kotlin/racingcar/view/ResultView.kt rename to src/main/kotlin/racingcar/ResultView.kt index ba793830ee..192c8c42ec 100644 --- a/src/main/kotlin/racingcar/view/ResultView.kt +++ b/src/main/kotlin/racingcar/ResultView.kt @@ -1,6 +1,4 @@ -package racingcar.view - -import racingcar.domain.Car +package racingcar object ResultView { fun print(cars: List) { diff --git a/src/test/kotlin/racingcar/CarTest.kt b/src/test/kotlin/racingcar/CarTest.kt index b2bf0366e6..31736c1e08 100644 --- a/src/test/kotlin/racingcar/CarTest.kt +++ b/src/test/kotlin/racingcar/CarTest.kt @@ -2,7 +2,6 @@ package racingcar import io.kotest.core.spec.style.StringSpec import io.kotest.matchers.shouldBe -import racingcar.domain.Car class CarTest : StringSpec({ diff --git a/src/test/kotlin/racingcar/MovingJudgeRuleTest.kt b/src/test/kotlin/racingcar/MovingJudgeRuleTest.kt index 2498c72104..b0a9a8d292 100644 --- a/src/test/kotlin/racingcar/MovingJudgeRuleTest.kt +++ b/src/test/kotlin/racingcar/MovingJudgeRuleTest.kt @@ -2,7 +2,6 @@ package racingcar import io.kotest.core.spec.style.BehaviorSpec import io.kotest.matchers.shouldBe -import racingcar.domain.MovingJudgeRule class MovingJudgeRuleTest : BehaviorSpec({ diff --git a/src/test/kotlin/racingcar/MovingStrategyTest.kt b/src/test/kotlin/racingcar/MovingStrategyTest.kt index 67f9e27558..3e8cbcd0fa 100644 --- a/src/test/kotlin/racingcar/MovingStrategyTest.kt +++ b/src/test/kotlin/racingcar/MovingStrategyTest.kt @@ -2,7 +2,6 @@ package racingcar import io.kotest.core.spec.style.BehaviorSpec import io.kotest.matchers.shouldBe -import racingcar.domain.MovingStrategy class MovingStrategyTest : BehaviorSpec({ diff --git a/src/test/kotlin/racingcar/RacingGameTest.kt b/src/test/kotlin/racingcar/RacingGameTest.kt index 6a5f08253d..e90f399d1b 100644 --- a/src/test/kotlin/racingcar/RacingGameTest.kt +++ b/src/test/kotlin/racingcar/RacingGameTest.kt @@ -4,9 +4,6 @@ import io.kotest.core.spec.style.StringSpec import io.kotest.matchers.shouldBe import io.mockk.every import io.mockk.mockk -import racingcar.domain.Car -import racingcar.domain.NumberGenerator -import racingcar.domain.RacingGame class RacingGameTest : StringSpec({ "레이싱 게임은 매 횟수마다 자동차의 현재 위치를 보여줘요" { From 9ab2acd2bd20aaaefc432a76a6758c7ffd198827 Mon Sep 17 00:00:00 2001 From: riyenas0925 Date: Sun, 20 Nov 2022 21:39:56 +0900 Subject: [PATCH 07/10] =?UTF-8?q?refactor:=20=EC=9E=90=EB=8F=99=EC=B0=A8?= =?UTF-8?q?=20=EC=9D=B4=EB=A6=84=20=EA=B8=B8=EC=9D=B4=20=EA=B2=80=EC=A6=9D?= =?UTF-8?q?=EC=9D=84=20Car=20=ED=81=B4=EB=9E=98=EC=8A=A4=EB=A1=9C=20?= =?UTF-8?q?=EB=B3=80=EA=B2=BD?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- src/main/kotlin/racingcar/Car.kt | 12 ++++++++++++ src/main/kotlin/racingcar/InputView.kt | 8 -------- 2 files changed, 12 insertions(+), 8 deletions(-) diff --git a/src/main/kotlin/racingcar/Car.kt b/src/main/kotlin/racingcar/Car.kt index 8e34b6770a..4f00ff249e 100644 --- a/src/main/kotlin/racingcar/Car.kt +++ b/src/main/kotlin/racingcar/Car.kt @@ -4,6 +4,10 @@ class Car( private var _location: Int = 0, val name: String, ) { + init { + require(isValidLength(name)) { "글자수는 5자를 넘을 수 없어요" } + } + val location get() = _location fun move(number: Int) { @@ -11,4 +15,12 @@ class Car( val strategy = rule.strategy _location = strategy.move(_location) } + + private fun isValidLength(name: String): Boolean { + return name.length <= VALID_CAR_NAME_LENGTH + } + + companion object { + private const val VALID_CAR_NAME_LENGTH = 5 + } } diff --git a/src/main/kotlin/racingcar/InputView.kt b/src/main/kotlin/racingcar/InputView.kt index 97d6373295..bcd8a80f39 100644 --- a/src/main/kotlin/racingcar/InputView.kt +++ b/src/main/kotlin/racingcar/InputView.kt @@ -1,7 +1,5 @@ package racingcar -private const val VALID_CAR_NAME_LENGTH = 5 - object InputView { fun readCars(): List { println("경주할 자동차 이름을 입력하세요(이름은 쉼표(,)를 기준으로 구분).") @@ -9,8 +7,6 @@ object InputView { val list = mutableListOf() for (name in names) { - require(isValidLength(name)) { "글자수는 5자를 넘을 수 없어요" } - list.add( Car(name = name) ) @@ -24,10 +20,6 @@ object InputView { return readln().toInt() } - private fun isValidLength(name: String): Boolean { - return name.length <= VALID_CAR_NAME_LENGTH - } - private fun parseCarName(input: String): List { return input.split(",") } From 3dcd8df6580539857a62c29aab61bc198ee2d6c1 Mon Sep 17 00:00:00 2001 From: riyenas0925 Date: Sun, 20 Nov 2022 22:19:06 +0900 Subject: [PATCH 08/10] =?UTF-8?q?feat:=20=20=EB=A0=88=EC=9D=B4=EC=8B=B1=20?= =?UTF-8?q?=EA=B2=8C=EC=9E=84=EC=97=90=EC=84=9C=20=EC=B0=B8=EC=97=AC?= =?UTF-8?q?=ED=95=98=EB=8A=94=20=EC=9E=90=EB=8F=99=EC=B0=A8=EB=8A=94=201?= =?UTF-8?q?=EB=8C=80=20=EC=9D=B4=EC=83=81=EC=9D=B4=EC=96=B4=EC=95=BC=20?= =?UTF-8?q?=ED=95=A9=EB=8B=88=EB=8B=A4.?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- src/main/kotlin/racingcar/README.md | 1 + src/main/kotlin/racingcar/RacingGame.kt | 8 ++++++++ src/test/kotlin/racingcar/RacingGameTest.kt | 14 ++++++++++++++ 3 files changed, 23 insertions(+) diff --git a/src/main/kotlin/racingcar/README.md b/src/main/kotlin/racingcar/README.md index eb3ba9eb45..40391cc747 100644 --- a/src/main/kotlin/racingcar/README.md +++ b/src/main/kotlin/racingcar/README.md @@ -11,6 +11,7 @@ - [x] 숫자 생성기 0 ~ 9 사이의 무작위한 값을 생성해요. ### 레이싱 게임 (Racing Game) +- [x] 레이싱 게임에서 참여하는 자동차는 1대 이상이어야 합니다. - [x] 레이싱 게임은 자동차의 대수와 시도할 횟수를 입력할 수 있어요. - [x] 레이싱 게임은 자동차의 이름을 쉽표로 구분해요. - [x] 레이싱 게임은 매 횟수마다 자동차의 이름과 현재 위치를 보여줘요. diff --git a/src/main/kotlin/racingcar/RacingGame.kt b/src/main/kotlin/racingcar/RacingGame.kt index a2cebbf422..e045454787 100644 --- a/src/main/kotlin/racingcar/RacingGame.kt +++ b/src/main/kotlin/racingcar/RacingGame.kt @@ -4,6 +4,11 @@ class RacingGame( private val cars: List, private val numberGenerator: NumberGenerator, ) { + + init { + requireCarExist(cars) + } + fun round(): List { for (car in cars) { val randNumber = numberGenerator.rand() @@ -12,4 +17,7 @@ class RacingGame( return cars } + private fun requireCarExist(cars: List) { + require(cars.isNotEmpty()) { "레이싱 게임에서 참여하는 자동차는 1대 이상이어야 합니다." } + } } diff --git a/src/test/kotlin/racingcar/RacingGameTest.kt b/src/test/kotlin/racingcar/RacingGameTest.kt index e90f399d1b..534251dcc5 100644 --- a/src/test/kotlin/racingcar/RacingGameTest.kt +++ b/src/test/kotlin/racingcar/RacingGameTest.kt @@ -4,6 +4,8 @@ import io.kotest.core.spec.style.StringSpec import io.kotest.matchers.shouldBe import io.mockk.every import io.mockk.mockk +import org.junit.jupiter.api.assertThrows +import java.lang.IllegalArgumentException class RacingGameTest : StringSpec({ "레이싱 게임은 매 횟수마다 자동차의 현재 위치를 보여줘요" { @@ -19,4 +21,16 @@ class RacingGameTest : StringSpec({ car.location shouldBe 0 } + + "레이싱 게임에 참여하는 자동차는 1대 이상이어야 합니다." { + assertThrows { + val mockNumberGenerator = mockk() + every { mockNumberGenerator.rand() } returns 0 + + val racingGame = RacingGame( + cars = listOf(), + numberGenerator = mockNumberGenerator + ) + } + } }) From 82e4a62d737f4e501a247332d234db2dffaec2f7 Mon Sep 17 00:00:00 2001 From: riyenas0925 Date: Sun, 20 Nov 2022 22:25:15 +0900 Subject: [PATCH 09/10] =?UTF-8?q?chore:=20=EC=9E=90=EB=8F=99=EC=B0=A8=20?= =?UTF-8?q?=EA=B8=B0=EB=B3=B8=20=EC=9C=84=EC=B9=98=EB=A5=BC=20=EC=83=81?= =?UTF-8?q?=EC=88=98=EB=A1=9C=20=EB=B3=80=EA=B2=BD?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- src/main/kotlin/racingcar/Car.kt | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/src/main/kotlin/racingcar/Car.kt b/src/main/kotlin/racingcar/Car.kt index 4f00ff249e..295c0c3a10 100644 --- a/src/main/kotlin/racingcar/Car.kt +++ b/src/main/kotlin/racingcar/Car.kt @@ -1,7 +1,7 @@ package racingcar class Car( - private var _location: Int = 0, + private var _location: Int = DEFAULT_CAR_LOCATION, val name: String, ) { init { @@ -21,6 +21,7 @@ class Car( } companion object { + private const val DEFAULT_CAR_LOCATION = 0 private const val VALID_CAR_NAME_LENGTH = 5 } } From 7c6de4924ae41b6f2347e0ddf374c83a98345ea0 Mon Sep 17 00:00:00 2001 From: riyenas0925 Date: Sun, 20 Nov 2022 22:37:28 +0900 Subject: [PATCH 10/10] =?UTF-8?q?feat:=20=EB=A0=88=EC=9D=B4=EC=8B=B1=20?= =?UTF-8?q?=EA=B2=8C=EC=9E=84=20=EC=9A=B0=EC=8A=B9=EC=9E=90=20=EA=B5=AC?= =?UTF-8?q?=ED=98=84?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- src/main/kotlin/racingcar/Application.kt | 5 ++++- src/main/kotlin/racingcar/RacingGame.kt | 8 ++++++++ src/main/kotlin/racingcar/ResultView.kt | 6 +++++- 3 files changed, 17 insertions(+), 2 deletions(-) diff --git a/src/main/kotlin/racingcar/Application.kt b/src/main/kotlin/racingcar/Application.kt index 591506b07f..64d2036264 100644 --- a/src/main/kotlin/racingcar/Application.kt +++ b/src/main/kotlin/racingcar/Application.kt @@ -11,6 +11,9 @@ fun main() { repeat(roundCount) { val drivingCars = racingGame.round() - ResultView.print(drivingCars) + ResultView.printLocation(drivingCars) } + + val winners = racingGame.judge() + ResultView.printWinner(winners) } diff --git a/src/main/kotlin/racingcar/RacingGame.kt b/src/main/kotlin/racingcar/RacingGame.kt index e045454787..20b0446a6f 100644 --- a/src/main/kotlin/racingcar/RacingGame.kt +++ b/src/main/kotlin/racingcar/RacingGame.kt @@ -17,6 +17,14 @@ class RacingGame( return cars } + + fun judge(): List { + val maxLocation = cars.maxOf { it.location } + return cars.filter { + it.location == maxLocation + } + } + private fun requireCarExist(cars: List) { require(cars.isNotEmpty()) { "레이싱 게임에서 참여하는 자동차는 1대 이상이어야 합니다." } } diff --git a/src/main/kotlin/racingcar/ResultView.kt b/src/main/kotlin/racingcar/ResultView.kt index 192c8c42ec..0e2dd93046 100644 --- a/src/main/kotlin/racingcar/ResultView.kt +++ b/src/main/kotlin/racingcar/ResultView.kt @@ -1,7 +1,7 @@ package racingcar object ResultView { - fun print(cars: List) { + fun printLocation(cars: List) { for (car in cars) { val location = car.location print(car.name + " : ") @@ -10,4 +10,8 @@ object ResultView { } println() } + + fun printWinner(cars: List) { + println("${cars.joinToString { it.name }}가 최종 우승했습니다.") + } }