From 2dc7c58c9318c76509a2bd3037eb146f2b34bb79 Mon Sep 17 00:00:00 2001 From: Youngin Kim Date: Mon, 10 Jun 2024 04:41:16 +0900 Subject: [PATCH 01/45] =?UTF-8?q?docs(README.md)=20:=20=EA=B8=B0=EB=8A=A5?= =?UTF-8?q?=20=EC=9A=94=EA=B5=AC=EC=82=AC=ED=95=AD=20=EB=B6=84=EC=84=9D=20?= =?UTF-8?q?=EB=B0=8F=20=EA=B8=B0=EB=8A=A5=20=EB=AA=A9=EB=A1=9D=20=EC=A0=95?= =?UTF-8?q?=EB=A6=AC?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- README.md | 41 ++++++++++++++++++++++++++++++++++++++++- 1 file changed, 40 insertions(+), 1 deletion(-) diff --git a/README.md b/README.md index 491aece1..301ad6d5 100644 --- a/README.md +++ b/README.md @@ -1 +1,40 @@ -# java-racingcar-precourse \ No newline at end of file +# java-racingcar-precourse + +## 기능 요구 사항 +초간단 자동차 경주 게임을 구현한다. + +- 주어진 횟수 동안 n대의 자동차는 전진 또는 멈출 수 있다. +- 각 자동차에 이름을 부여할 수 있다. + - 전진하는 자동차를 출력할 때 자동차 이름을 같이 출력한다. +- 자동차 이름은 쉼표(,)를 기준으로 구분하며 이름은 5자 이하만 가능하다. +- 사용자는 몇 번의 이동을 할 것인지를 입력할 수 있어야 한다. +- 전진하는 조건은 0에서 9 사이에서 무작위 값을 구한 후 무작위 값이 4 이상일 경우이다. +- 자동차 경주 게임을 완료한 후 누가 우승했는지를 알려준다. 우승자는 한 명 이상일 수 있다. +- 우승자가 여러 명일 경우 쉼표(,)를 이용하여 구분한다. +- 사용자가 잘못된 값을 입력할 경우 `IllegalArgumentException`을 발생시킨 후 애플리케이션은 종료되어야 한다. + +## 자동차 경주 기능 목록 +- [ ] 게임을 시작하면, 경주할 자동차를 생성할 수 있어야 한다. + - [ ] 자동차는 쉼표(,)를 기준으로 구분하여 생성된다. + - [ ] 자동차 이름은 5자 이하만 가능하다. + - [ ] 자동차 이름은 중복으로 사용될 수 없다. + - [ ] 자동차경주를 하기위해서는, 자동차는 최소 2대 이상 생성해야한다. + + +- [ ] 사용자는 몇 번의 이동을 할 것인지 입력할 수 있다. + - [ ] 이동할 횟수는 0이상의 '자연수'이어야 한다. + + +- [ ] 자동차는 전진 또는 멈출 수 있다. + - [ ] 0에서 9사이에서 무작위한 값이 4이상인 경우 전진한다. + - [ ] 0에서 9사이의 무작위한 값이 3이하인 경우 멈춘다. + + +- [ ] 자동차 경주를 확인할 수 있다. + - [ ] 경주하는 자동차 이름을 확인할 수 있다. + - [ ] 라운드마다 자동차가 전진했다면 `-`로 이동 거리를 출력한다. + + +- [ ] 자동차 경주 게임의 우승자를 확인할 수 있다. + - [ ] 단독 우승자의 경우 우승한 자동차를 출력한다. + - [ ] 공동 우승자의 경우 우승한 자동차 이름을 `, `로 구분지어서 출력한다. From 48158405d7ac79068f19906adbe773facc84a08e Mon Sep 17 00:00:00 2001 From: young-in Date: Mon, 10 Jun 2024 04:45:18 +0900 Subject: [PATCH 02/45] =?UTF-8?q?feat(RacingCar.java)=20:=20=EA=B2=BD?= =?UTF-8?q?=EC=A3=BC=EC=9A=A9=20=EC=9E=90=EB=8F=99=EC=B0=A8=20domain=20?= =?UTF-8?q?=EC=9E=91=EC=84=B1?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- src/main/java/domain/RacingCar.java | 9 +++++++++ 1 file changed, 9 insertions(+) create mode 100644 src/main/java/domain/RacingCar.java diff --git a/src/main/java/domain/RacingCar.java b/src/main/java/domain/RacingCar.java new file mode 100644 index 00000000..c797e3a8 --- /dev/null +++ b/src/main/java/domain/RacingCar.java @@ -0,0 +1,9 @@ +package domain; + +public class RacingCar { + private String name; + + public RacingCar(String name) { + this.name = name; + } +} From 00c4eae4a81479766140131fb0f095f2432d85ef Mon Sep 17 00:00:00 2001 From: young-in Date: Mon, 10 Jun 2024 04:49:30 +0900 Subject: [PATCH 03/45] =?UTF-8?q?feat(RacingCarName.java)=20:=20=EA=B2=BD?= =?UTF-8?q?=EC=A3=BC=EC=9A=A9=20=EC=9E=90=EB=8F=99=EC=B0=A8=20=EC=9D=B4?= =?UTF-8?q?=EB=A6=84=20=EA=B8=B8=EC=9D=B4=20=EC=A0=9C=ED=95=9C?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- src/main/java/domain/RacingCar.java | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/src/main/java/domain/RacingCar.java b/src/main/java/domain/RacingCar.java index c797e3a8..a43ac5ea 100644 --- a/src/main/java/domain/RacingCar.java +++ b/src/main/java/domain/RacingCar.java @@ -1,9 +1,9 @@ package domain; public class RacingCar { - private String name; + private RacingCarName racingCarName; - public RacingCar(String name) { - this.name = name; + public RacingCar(final String name) { + this.racingCarName = new RacingCarName(name); } } From d63737400aa0c5e08fe070556a93a3cc0bb4f68c Mon Sep 17 00:00:00 2001 From: young-in Date: Mon, 10 Jun 2024 04:49:35 +0900 Subject: [PATCH 04/45] =?UTF-8?q?feat(RacingCarName.java)=20:=20=EA=B2=BD?= =?UTF-8?q?=EC=A3=BC=EC=9A=A9=20=EC=9E=90=EB=8F=99=EC=B0=A8=20=EC=9D=B4?= =?UTF-8?q?=EB=A6=84=20=EA=B8=B8=EC=9D=B4=20=EC=A0=9C=ED=95=9C?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- src/main/java/domain/RacingCarName.java | 15 +++++++++++++++ 1 file changed, 15 insertions(+) create mode 100644 src/main/java/domain/RacingCarName.java diff --git a/src/main/java/domain/RacingCarName.java b/src/main/java/domain/RacingCarName.java new file mode 100644 index 00000000..b763ebfb --- /dev/null +++ b/src/main/java/domain/RacingCarName.java @@ -0,0 +1,15 @@ +package domain; + +public record RacingCarName(String carName){ + private static final int CAR_NAME_LENGTH_MAX = 5; + + public RacingCarName { + isCarNameLengthValidate(carName); + } + + private void isCarNameLengthValidate(final String carName){ + if (carName.isEmpty() || carName.length() > CAR_NAME_LENGTH_MAX){ + throw new IllegalArgumentException("racing car 이름은 1자리이상 5자 이하만 가능합니다."); + } + } +} From 29a6a03af4c0c3567eb719af4319e1b5e0a17cda Mon Sep 17 00:00:00 2001 From: young-in Date: Mon, 10 Jun 2024 04:54:47 +0900 Subject: [PATCH 05/45] =?UTF-8?q?feat(RacingCars.java)=20:=20=EA=B2=BD?= =?UTF-8?q?=EC=A3=BC=EC=9A=A9=20=EC=9E=90=EB=8F=99=EC=B0=A8=20=EC=A4=91?= =?UTF-8?q?=EB=B3=B5=20=EC=9D=B4=EB=A6=84=20=EC=82=AC=EC=9A=A9=20=EA=B8=88?= =?UTF-8?q?=EC=A7=80?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- src/main/java/domain/RacingCar.java | 4 ++++ src/main/java/domain/RacingCars.java | 26 ++++++++++++++++++++++++++ 2 files changed, 30 insertions(+) create mode 100644 src/main/java/domain/RacingCars.java diff --git a/src/main/java/domain/RacingCar.java b/src/main/java/domain/RacingCar.java index a43ac5ea..221c8f96 100644 --- a/src/main/java/domain/RacingCar.java +++ b/src/main/java/domain/RacingCar.java @@ -6,4 +6,8 @@ public class RacingCar { public RacingCar(final String name) { this.racingCarName = new RacingCarName(name); } + + public RacingCarName getRacingCarName() { + return racingCarName; + } } diff --git a/src/main/java/domain/RacingCars.java b/src/main/java/domain/RacingCars.java new file mode 100644 index 00000000..ebd73c53 --- /dev/null +++ b/src/main/java/domain/RacingCars.java @@ -0,0 +1,26 @@ +package domain; + +import java.util.HashSet; +import java.util.List; +import java.util.stream.Collectors; + +public class RacingCars { + private final List cars; + + public RacingCars(List cars) { + isDifferentCarName(cars); + this.cars = cars; + } + + private void isDifferentCarName(List cars) { + List carName = cars.stream() + .map(idx -> idx.getRacingCarName()) + .collect(Collectors.toList()); + + HashSet carNameDuplicateSet = new HashSet<>(carName); + + if (carNameDuplicateSet.size() != carName.size()) { + throw new IllegalArgumentException("자동차 이름을 중복으로 사용할 수 없습니다."); + } + } +} From ab9a3f8f24049b518ad44dcf570d24d4db8ece72 Mon Sep 17 00:00:00 2001 From: young-in Date: Mon, 10 Jun 2024 04:57:41 +0900 Subject: [PATCH 06/45] =?UTF-8?q?feat(RacingCars.java)=20:=20=EA=B2=BD?= =?UTF-8?q?=EC=A3=BC=EC=9A=A9=20=EC=9E=90=EB=8F=99=EC=B0=A8=202=EA=B0=9C?= =?UTF-8?q?=20=EC=9D=B4=EC=83=81=20=EC=83=9D=EC=84=B1=EC=9D=84=20=EC=9C=84?= =?UTF-8?q?=ED=95=9C=20=EC=98=88=EC=99=B8=20=EC=83=9D=EC=84=B1?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- src/main/java/domain/RacingCars.java | 8 ++++++++ 1 file changed, 8 insertions(+) diff --git a/src/main/java/domain/RacingCars.java b/src/main/java/domain/RacingCars.java index ebd73c53..9c83a877 100644 --- a/src/main/java/domain/RacingCars.java +++ b/src/main/java/domain/RacingCars.java @@ -5,10 +5,12 @@ import java.util.stream.Collectors; public class RacingCars { + private static final int MINIMUM_CAR_COUNT = 2; private final List cars; public RacingCars(List cars) { isDifferentCarName(cars); + minimumNumofCars(cars.size()); this.cars = cars; } @@ -23,4 +25,10 @@ private void isDifferentCarName(List cars) { throw new IllegalArgumentException("자동차 이름을 중복으로 사용할 수 없습니다."); } } + + private void minimumNumofCars(int size) { + if (size < MINIMUM_CAR_COUNT) { + throw new IllegalArgumentException("자동차 경주를 위해서는 최소 2대 이상의 자동차를 만들어야 합니다."); + } + } } From 107bc0a66620d7d7395b0f33c92609f9319fa1e3 Mon Sep 17 00:00:00 2001 From: young-in Date: Mon, 10 Jun 2024 05:00:55 +0900 Subject: [PATCH 07/45] =?UTF-8?q?feat(SplitingCarName.java)=20:=20?= =?UTF-8?q?=EA=B2=BD=EC=A3=BC=EC=9A=A9=20=EC=9E=90=EB=8F=99=EC=B0=A8?= =?UTF-8?q?=EB=93=A4=EC=9D=98=20=EC=9D=B4=EB=A6=84=EC=9D=84=20=EB=B6=84?= =?UTF-8?q?=EB=A6=AC=ED=95=98=EA=B8=B0=20=EC=9C=84=ED=95=9C=20method?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- src/main/java/util/SplitingCarName.java | 9 +++++++++ 1 file changed, 9 insertions(+) create mode 100644 src/main/java/util/SplitingCarName.java diff --git a/src/main/java/util/SplitingCarName.java b/src/main/java/util/SplitingCarName.java new file mode 100644 index 00000000..8d4b25bd --- /dev/null +++ b/src/main/java/util/SplitingCarName.java @@ -0,0 +1,9 @@ +package util; + +public class SplitingCarName { + private static final String STRING_SPLITTER = ","; + + public static String[] splitCarName(String carNames) { + return carNames.split(STRING_SPLITTER); + } +} From 08a8ee80217f7dc4c798845ad2f17f8edc97ea89 Mon Sep 17 00:00:00 2001 From: young-in Date: Mon, 10 Jun 2024 05:06:03 +0900 Subject: [PATCH 08/45] =?UTF-8?q?feat(InputView.java)=20:=20=EA=B2=BD?= =?UTF-8?q?=EC=A3=BC=EC=9A=A9=20=EC=9E=90=EB=8F=99=EC=B0=A8=EB=93=A4?= =?UTF-8?q?=EC=9D=98=20=EC=9D=B4=EB=A6=84=20=EC=9E=85=EB=A0=A5=EB=B0=9B?= =?UTF-8?q?=EA=B8=B0=20=EC=9C=84=ED=95=9C=20view=20=EA=B5=AC=ED=98=84?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- src/main/java/view/InputView.java | 19 +++++++++++++++++++ 1 file changed, 19 insertions(+) create mode 100644 src/main/java/view/InputView.java diff --git a/src/main/java/view/InputView.java b/src/main/java/view/InputView.java new file mode 100644 index 00000000..cb68aeff --- /dev/null +++ b/src/main/java/view/InputView.java @@ -0,0 +1,19 @@ +package view; + +import util.SplitingCarName; + +import java.util.Scanner; + +public class InputView { + private Scanner scanner; + + public InputView() { + this.scanner = new Scanner(System.in); + } + + public String[] inputCarNames(){ + System.out.print("경주할 자동차 이름을 입력하세요.(이름은 쉼표(,) 기준으로 구분)"); + String carNames = scanner.nextLine(); + return SplitingCarName.splitCarName(carNames); + } +} From 6c6c83f572325fadb9bba73e110f7ce4ad07035d Mon Sep 17 00:00:00 2001 From: young-in Date: Mon, 10 Jun 2024 05:10:09 +0900 Subject: [PATCH 09/45] =?UTF-8?q?feat(OutputView.java)=20:=20=EA=B2=BD?= =?UTF-8?q?=EC=A3=BC=EC=9A=A9=20=EC=9E=90=EB=8F=99=EC=B0=A8=EB=93=A4?= =?UTF-8?q?=EC=9D=98=20=EC=9D=B4=EB=A6=84=20=EC=9E=85=EB=A0=A5=EC=9D=84=20?= =?UTF-8?q?=EC=9C=84=ED=95=9C=20=EC=95=88=EB=82=B4=EC=82=AC=ED=95=AD=20?= =?UTF-8?q?=EC=B6=9C=EB=A0=A5=20view=20=EC=9E=91=EC=84=B1?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- src/main/java/view/InputView.java | 1 - src/main/java/view/OutputView.java | 10 ++++++++++ 2 files changed, 10 insertions(+), 1 deletion(-) create mode 100644 src/main/java/view/OutputView.java diff --git a/src/main/java/view/InputView.java b/src/main/java/view/InputView.java index cb68aeff..486d46fe 100644 --- a/src/main/java/view/InputView.java +++ b/src/main/java/view/InputView.java @@ -12,7 +12,6 @@ public InputView() { } public String[] inputCarNames(){ - System.out.print("경주할 자동차 이름을 입력하세요.(이름은 쉼표(,) 기준으로 구분)"); String carNames = scanner.nextLine(); return SplitingCarName.splitCarName(carNames); } diff --git a/src/main/java/view/OutputView.java b/src/main/java/view/OutputView.java new file mode 100644 index 00000000..e678d71d --- /dev/null +++ b/src/main/java/view/OutputView.java @@ -0,0 +1,10 @@ +package view; + +public class OutputView { + + private static final String INPUT_CAR_NAMES = "경주할 자동차 이름을 입력하세요.(이름은 쉼표(,) 기준으로 구분)"; + + public void printRequestCarNames(){ + System.out.println(INPUT_CAR_NAMES); + } +} From 626f088e9365e99798ff99bc73507ced055d66f1 Mon Sep 17 00:00:00 2001 From: young-in Date: Mon, 10 Jun 2024 05:16:16 +0900 Subject: [PATCH 10/45] =?UTF-8?q?feat(MovingNum.java)=20:=20=EA=B2=BD?= =?UTF-8?q?=EC=A3=BC=EC=9A=A9=20=EC=9E=90=EB=8F=99=EC=B0=A8=EB=93=A4?= =?UTF-8?q?=EC=9D=98=20=EC=9D=B4=EB=8F=99=20=ED=9A=9F=EC=88=98=EB=A5=BC=20?= =?UTF-8?q?=EC=9C=84=ED=95=9C=20domain=20=EC=9E=91=EC=84=B1?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- src/main/java/domain/MovingNum.java | 25 +++++++++++++++++++++++++ 1 file changed, 25 insertions(+) create mode 100644 src/main/java/domain/MovingNum.java diff --git a/src/main/java/domain/MovingNum.java b/src/main/java/domain/MovingNum.java new file mode 100644 index 00000000..ba1a5a8b --- /dev/null +++ b/src/main/java/domain/MovingNum.java @@ -0,0 +1,25 @@ +package domain; + +public class MovingNum { + + private final int movingNum; + + public MovingNum(final String movingNum) { + isNaturalNumberValidate(movingNum); + this.movingNum = convertStringToInt(movingNum); + } + + private void isNaturalNumberValidate(String movingNum) { + if (!movingNum.matches("^[1-9]\\d*$")){ + throw new IllegalArgumentException("이동할 횟수는 자연수여야 한다."); + } + } + + private int convertStringToInt(String input) { + return Integer.parseInt(input); + } + + public int getMovingNum() { + return movingNum; + } +} From c185d3ec31b12ca1308acb17441dd7d9fdef62cb Mon Sep 17 00:00:00 2001 From: young-in Date: Mon, 10 Jun 2024 05:28:04 +0900 Subject: [PATCH 11/45] =?UTF-8?q?feat(RandomGenerator.java)=20:=200=20~=20?= =?UTF-8?q?9=20=EC=82=AC=EC=9D=B4=EC=9D=98=20=EB=82=9C=EC=88=98=20?= =?UTF-8?q?=EC=83=9D=EC=84=B1=20util=20=EA=B5=AC=ED=98=84?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- src/main/java/domain/MovingNum.java | 25 -------------------- src/main/java/domain/TryialNum.java | 25 ++++++++++++++++++++ src/main/java/util/RandomGeneratingMove.java | 20 ++++++++++++++++ src/main/java/util/RandomGenerator.java | 5 ++++ 4 files changed, 50 insertions(+), 25 deletions(-) delete mode 100644 src/main/java/domain/MovingNum.java create mode 100644 src/main/java/domain/TryialNum.java create mode 100644 src/main/java/util/RandomGeneratingMove.java create mode 100644 src/main/java/util/RandomGenerator.java diff --git a/src/main/java/domain/MovingNum.java b/src/main/java/domain/MovingNum.java deleted file mode 100644 index ba1a5a8b..00000000 --- a/src/main/java/domain/MovingNum.java +++ /dev/null @@ -1,25 +0,0 @@ -package domain; - -public class MovingNum { - - private final int movingNum; - - public MovingNum(final String movingNum) { - isNaturalNumberValidate(movingNum); - this.movingNum = convertStringToInt(movingNum); - } - - private void isNaturalNumberValidate(String movingNum) { - if (!movingNum.matches("^[1-9]\\d*$")){ - throw new IllegalArgumentException("이동할 횟수는 자연수여야 한다."); - } - } - - private int convertStringToInt(String input) { - return Integer.parseInt(input); - } - - public int getMovingNum() { - return movingNum; - } -} diff --git a/src/main/java/domain/TryialNum.java b/src/main/java/domain/TryialNum.java new file mode 100644 index 00000000..82db56b1 --- /dev/null +++ b/src/main/java/domain/TryialNum.java @@ -0,0 +1,25 @@ +package domain; + +public class TryialNum { + + private final int trialNum; + + public TryialNum(final String trialNum) { + isNaturalNumberValidate(trialNum); + this.trialNum = convertStringToInt(trialNum); + } + + private void isNaturalNumberValidate(String trialNum) { + if (!trialNum.matches("^[1-9]\\d*$")){ + throw new IllegalArgumentException("이동할 횟수는 자연수여야 한다."); + } + } + + private int convertStringToInt(String input) { + return Integer.parseInt(input); + } + + public int getTrialNum() { + return trialNum; + } +} diff --git a/src/main/java/util/RandomGeneratingMove.java b/src/main/java/util/RandomGeneratingMove.java new file mode 100644 index 00000000..833d29ac --- /dev/null +++ b/src/main/java/util/RandomGeneratingMove.java @@ -0,0 +1,20 @@ +package util; + +import java.util.Random; + +public class RandomGeneratingMove implements RandomGenerator { + + private static final int MIN_RANDOM_NUMBER = 0; + private static final int MAX_RANDOM_NUMBER = 9; + private Random random; + + public RandomGeneratingMove() { + this.random = new Random(); + } + + @Override + public int generateRandomInt() { + return random.nextInt((MAX_RANDOM_NUMBER - MIN_RANDOM_NUMBER + 1)) + MIN_RANDOM_NUMBER; + } +} + diff --git a/src/main/java/util/RandomGenerator.java b/src/main/java/util/RandomGenerator.java new file mode 100644 index 00000000..034f39d9 --- /dev/null +++ b/src/main/java/util/RandomGenerator.java @@ -0,0 +1,5 @@ +package util; + +public interface RandomGenerator { + int generateRandomInt(); +} From 874b8e3cb72b625f7f256d2d1029365688daac33 Mon Sep 17 00:00:00 2001 From: young-in Date: Mon, 10 Jun 2024 05:32:04 +0900 Subject: [PATCH 12/45] =?UTF-8?q?feat(Distance.java)=20:=20racingCar?= =?UTF-8?q?=EC=9D=98=20=EC=9C=84=EC=B9=98=EB=A5=BC=20=EB=B0=94=EA=BE=B8?= =?UTF-8?q?=EA=B8=B0=20=EC=9C=84=ED=95=9C=20record=20class=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/java/domain/Distance.java | 9 +++++++++ 1 file changed, 9 insertions(+) create mode 100644 src/main/java/domain/Distance.java diff --git a/src/main/java/domain/Distance.java b/src/main/java/domain/Distance.java new file mode 100644 index 00000000..c1d28916 --- /dev/null +++ b/src/main/java/domain/Distance.java @@ -0,0 +1,9 @@ +package domain; + +public record Distance(int location) { + private static final int MOVE_VALUE = 1; + + public Distance increase(){ + return new Distance(location + MOVE_VALUE); + } +} From 3c543dd09a8554ebd0fe79ee046864bf4030136b Mon Sep 17 00:00:00 2001 From: young-in Date: Mon, 10 Jun 2024 05:32:33 +0900 Subject: [PATCH 13/45] =?UTF-8?q?feat(RacingCar.java)=20:=20racingCar?= =?UTF-8?q?=EC=9D=98=20=EC=9C=84=EC=B9=98=20=EB=82=98=ED=83=80=EB=82=B4?= =?UTF-8?q?=EA=B8=B0=20=EC=9C=84=ED=95=9C=20distance=20=EB=B3=80=EC=88=98?= =?UTF-8?q?=20=EC=B6=94=EA=B0=80?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- src/main/java/domain/RacingCar.java | 4 +++- 1 file changed, 3 insertions(+), 1 deletion(-) diff --git a/src/main/java/domain/RacingCar.java b/src/main/java/domain/RacingCar.java index 221c8f96..30176fb4 100644 --- a/src/main/java/domain/RacingCar.java +++ b/src/main/java/domain/RacingCar.java @@ -2,9 +2,11 @@ public class RacingCar { private RacingCarName racingCarName; + private Distance distance; - public RacingCar(final String name) { + public RacingCar(final String name, final int distance) { this.racingCarName = new RacingCarName(name); + this.distance = new Distance(distance); } public RacingCarName getRacingCarName() { From 42a1ae66f7f0503590b4729df491b9dbbbce396b Mon Sep 17 00:00:00 2001 From: young-in Date: Mon, 10 Jun 2024 05:34:52 +0900 Subject: [PATCH 14/45] =?UTF-8?q?feat(RacingCar.java)=20:=20racingCar?= =?UTF-8?q?=EC=9D=98=20=EC=A0=84=EC=A7=84=EC=A1=B0=EA=B1=B4=20=EC=B6=94?= =?UTF-8?q?=EA=B0=80?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- src/main/java/domain/RacingCar.java | 12 ++++++++++++ 1 file changed, 12 insertions(+) diff --git a/src/main/java/domain/RacingCar.java b/src/main/java/domain/RacingCar.java index 30176fb4..b276da7d 100644 --- a/src/main/java/domain/RacingCar.java +++ b/src/main/java/domain/RacingCar.java @@ -1,6 +1,8 @@ package domain; public class RacingCar { + private static final int MOVE_CONDITION = 4; + private RacingCarName racingCarName; private Distance distance; @@ -9,7 +11,17 @@ public RacingCar(final String name, final int distance) { this.distance = new Distance(distance); } + public void move(final int num){ + if(num >= MOVE_CONDITION){ + this.distance = distance.increase(); + } + } + public RacingCarName getRacingCarName() { return racingCarName; } + + public Distance getDistance() { + return distance; + } } From 4a4c86d426564bb7f0c5b5806f0d42e34440cf40 Mon Sep 17 00:00:00 2001 From: young-in Date: Mon, 10 Jun 2024 05:37:02 +0900 Subject: [PATCH 15/45] =?UTF-8?q?feat(OutputView.java)=20:=20racingCar?= =?UTF-8?q?=EC=9D=98=20=EC=9D=B4=EB=8F=99=20=ED=9A=9F=EC=88=98=EC=9E=85?= =?UTF-8?q?=EB=A0=A5=EC=9D=84=20=EC=9C=84=ED=95=9C=20=EC=B6=9C=EB=A0=A5=20?= =?UTF-8?q?=EB=B7=B0=20=EA=B5=AC=ED=98=84?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- src/main/java/view/OutputView.java | 5 +++++ 1 file changed, 5 insertions(+) diff --git a/src/main/java/view/OutputView.java b/src/main/java/view/OutputView.java index e678d71d..eb8d1592 100644 --- a/src/main/java/view/OutputView.java +++ b/src/main/java/view/OutputView.java @@ -3,8 +3,13 @@ public class OutputView { private static final String INPUT_CAR_NAMES = "경주할 자동차 이름을 입력하세요.(이름은 쉼표(,) 기준으로 구분)"; + private static final String INPUT_TRY_COUNT = "시도할 회수는 몇회인가요?"; public void printRequestCarNames(){ System.out.println(INPUT_CAR_NAMES); } + + public void printRequestTryCount(){ + System.out.println(INPUT_TRY_COUNT); + } } From 892fd3805c4edd8b57d22eddfd15896d549963f2 Mon Sep 17 00:00:00 2001 From: young-in Date: Mon, 10 Jun 2024 05:42:21 +0900 Subject: [PATCH 16/45] =?UTF-8?q?refactor=20(RacingCar.java)=20:=20racingC?= =?UTF-8?q?ar=20getter=20method=EB=93=A4=20=EB=B3=80=EC=88=98=20=EC=88=98?= =?UTF-8?q?=EC=A0=95?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- src/main/java/domain/RacingCar.java | 8 ++++---- 1 file changed, 4 insertions(+), 4 deletions(-) diff --git a/src/main/java/domain/RacingCar.java b/src/main/java/domain/RacingCar.java index b276da7d..76c0e8b0 100644 --- a/src/main/java/domain/RacingCar.java +++ b/src/main/java/domain/RacingCar.java @@ -17,11 +17,11 @@ public void move(final int num){ } } - public RacingCarName getRacingCarName() { - return racingCarName; + public String getRacingCarName() { + return racingCarName.carName(); } - public Distance getDistance() { - return distance; + public Integer getDistance() { + return distance.location(); } } From a86a83f40cbb76452455c1182d75c9e0d5bacac7 Mon Sep 17 00:00:00 2001 From: young-in Date: Mon, 10 Jun 2024 05:42:52 +0900 Subject: [PATCH 17/45] =?UTF-8?q?refactor=20(RacingCars.java)=20:=20racing?= =?UTF-8?q?Cars=20=EC=9D=B4=EB=A6=84=20getter=20method=20=EB=B3=80?= =?UTF-8?q?=EC=88=98=20=EC=88=98=EC=A0=95?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- src/main/java/domain/RacingCars.java | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/src/main/java/domain/RacingCars.java b/src/main/java/domain/RacingCars.java index 9c83a877..0406251f 100644 --- a/src/main/java/domain/RacingCars.java +++ b/src/main/java/domain/RacingCars.java @@ -15,11 +15,11 @@ public RacingCars(List cars) { } private void isDifferentCarName(List cars) { - List carName = cars.stream() + List carName = cars.stream() .map(idx -> idx.getRacingCarName()) .collect(Collectors.toList()); - HashSet carNameDuplicateSet = new HashSet<>(carName); + HashSet carNameDuplicateSet = new HashSet<>(carName); if (carNameDuplicateSet.size() != carName.size()) { throw new IllegalArgumentException("자동차 이름을 중복으로 사용할 수 없습니다."); From 12a35a2390c690bf80aee2504494ac90a03bf0b6 Mon Sep 17 00:00:00 2001 From: young-in Date: Mon, 10 Jun 2024 05:45:33 +0900 Subject: [PATCH 18/45] =?UTF-8?q?feat=20(InputView.java)=20:=20=EC=8B=9C?= =?UTF-8?q?=EB=8F=84=20=ED=9A=9F=EC=88=98=20=EC=9E=85=EB=A0=A5=20=EB=B7=B0?= =?UTF-8?q?=20=EA=B5=AC=ED=98=84=20=EC=99=84=EB=A3=8C?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- src/main/java/view/InputView.java | 4 ++++ 1 file changed, 4 insertions(+) diff --git a/src/main/java/view/InputView.java b/src/main/java/view/InputView.java index 486d46fe..a1eec378 100644 --- a/src/main/java/view/InputView.java +++ b/src/main/java/view/InputView.java @@ -15,4 +15,8 @@ public String[] inputCarNames(){ String carNames = scanner.nextLine(); return SplitingCarName.splitCarName(carNames); } + + public String inputTryCount(){ + return scanner.nextLine(); + } } From d07703057de2ce91ba4f8026d6f3a26cb21ae382 Mon Sep 17 00:00:00 2001 From: young-in Date: Mon, 10 Jun 2024 05:46:53 +0900 Subject: [PATCH 19/45] =?UTF-8?q?feat=20(OutputView.java)=20:=20=EC=8B=A4?= =?UTF-8?q?=ED=96=89=EA=B2=B0=EA=B3=BC=20=EC=B6=9C=EB=A0=A5=EB=B7=B0=20?= =?UTF-8?q?=EA=B5=AC=ED=98=84?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- src/main/java/view/OutputView.java | 6 ++++++ 1 file changed, 6 insertions(+) diff --git a/src/main/java/view/OutputView.java b/src/main/java/view/OutputView.java index eb8d1592..70768d8b 100644 --- a/src/main/java/view/OutputView.java +++ b/src/main/java/view/OutputView.java @@ -4,6 +4,8 @@ public class OutputView { private static final String INPUT_CAR_NAMES = "경주할 자동차 이름을 입력하세요.(이름은 쉼표(,) 기준으로 구분)"; private static final String INPUT_TRY_COUNT = "시도할 회수는 몇회인가요?"; + private static final String NEW_LINE = "\n"; + private static final String EXECUTION_RESULT = "실행 결과"; public void printRequestCarNames(){ System.out.println(INPUT_CAR_NAMES); @@ -12,4 +14,8 @@ public void printRequestCarNames(){ public void printRequestTryCount(){ System.out.println(INPUT_TRY_COUNT); } + + public void printExecutionResult(){ + System.out.println(NEW_LINE + EXECUTION_RESULT); + } } From bf31d21219aeabda432ee6c24b3bec7fb1fce642 Mon Sep 17 00:00:00 2001 From: young-in Date: Mon, 10 Jun 2024 05:50:56 +0900 Subject: [PATCH 20/45] =?UTF-8?q?feat=20(OutputView.java)=20:=20racing=20g?= =?UTF-8?q?ame=20controller=20=EA=B5=AC=ED=98=84?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- src/main/java/controller/RacingGameController.java | 11 +++++++++++ 1 file changed, 11 insertions(+) create mode 100644 src/main/java/controller/RacingGameController.java diff --git a/src/main/java/controller/RacingGameController.java b/src/main/java/controller/RacingGameController.java new file mode 100644 index 00000000..83692d2c --- /dev/null +++ b/src/main/java/controller/RacingGameController.java @@ -0,0 +1,11 @@ +package controller; + +import view.InputView; +import view.OutputView; + +public class RacingGameController { + private InputView inputView = new InputView(); + private OutputView outputView = new OutputView(); + public void startGame(){ + } +} From 81eee2aa20261b8fd40d72bf033db7e4ab052111 Mon Sep 17 00:00:00 2001 From: young-in Date: Mon, 10 Jun 2024 05:51:35 +0900 Subject: [PATCH 21/45] =?UTF-8?q?feat=20(Application.java)=20:=20=ED=94=84?= =?UTF-8?q?=EB=A1=9C=EA=B7=B8=EB=9E=A8=20=EC=8B=A4=ED=96=89=EC=9D=98=20?= =?UTF-8?q?=EC=8B=9C=EC=9E=91=EC=A0=90=20=EA=B5=AC=ED=98=84?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- src/main/java/Application.java | 2 ++ 1 file changed, 2 insertions(+) create mode 100644 src/main/java/Application.java diff --git a/src/main/java/Application.java b/src/main/java/Application.java new file mode 100644 index 00000000..31b27e66 --- /dev/null +++ b/src/main/java/Application.java @@ -0,0 +1,2 @@ +public class Application { +} From 0fb1fc2a24924417ff74fca4852e669b190e79d3 Mon Sep 17 00:00:00 2001 From: young-in Date: Mon, 10 Jun 2024 05:54:09 +0900 Subject: [PATCH 22/45] =?UTF-8?q?feat=20(Application.java)=20:=20racing=20?= =?UTF-8?q?game=20=EC=8B=9C=EC=9E=91=20=EA=B5=AC=ED=98=84?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- src/main/java/Application.java | 7 +++++++ 1 file changed, 7 insertions(+) diff --git a/src/main/java/Application.java b/src/main/java/Application.java index 31b27e66..43155e90 100644 --- a/src/main/java/Application.java +++ b/src/main/java/Application.java @@ -1,2 +1,9 @@ +import controller.RacingGameController; + public class Application { + public static void main(String[] args) { + RacingGameController racingGameController = new RacingGameController(); + racingGameController.startGame(); + } } + From ff75dda1673d84e6df5f3433dbd7d056bb60e4d9 Mon Sep 17 00:00:00 2001 From: young-in Date: Mon, 10 Jun 2024 06:01:21 +0900 Subject: [PATCH 23/45] =?UTF-8?q?feat=20(CreatingCar.java)=20:=20racing=20?= =?UTF-8?q?game=EC=9D=84=20=EC=9C=84=ED=95=9C=20racing=20car=20=EC=83=9D?= =?UTF-8?q?=EC=84=B1=20util?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- src/main/java/util/CreatingCar.java | 26 ++++++++++++++++++++++++++ 1 file changed, 26 insertions(+) create mode 100644 src/main/java/util/CreatingCar.java diff --git a/src/main/java/util/CreatingCar.java b/src/main/java/util/CreatingCar.java new file mode 100644 index 00000000..9046961f --- /dev/null +++ b/src/main/java/util/CreatingCar.java @@ -0,0 +1,26 @@ +package util; + +import domain.RacingCar; +import domain.RacingCars; +import java.util.stream.Collectors; +import java.util.Arrays; +import java.util.List; + +public class CreatingCar { + private static final int START_LOCATION = 0; + + public static RacingCars createCars(final String[] carNames) { + List cars = makeCars(carNames); + return new RacingCars(cars); + } + + private static List makeCars(final String[] carNames) { + return Arrays.stream(carNames) + .map(CreatingCar::makeCar) + .collect(Collectors.toList()); + } + + private static RacingCar makeCar(final String carName) { + return new RacingCar(carName, START_LOCATION); + } +} From 0b0ad514aad6b4c67b9f7756ff8bf5eb1ec4223d Mon Sep 17 00:00:00 2001 From: young-in Date: Mon, 10 Jun 2024 06:02:02 +0900 Subject: [PATCH 24/45] =?UTF-8?q?feat=20(RacingCameController.java)=20:=20?= =?UTF-8?q?racing=20game=EC=9D=84=20=EC=9C=84=ED=95=9C=20racing=20car=20?= =?UTF-8?q?=EC=83=9D=EC=84=B1=EC=9D=84=20=EC=9C=84=ED=95=9C=20=ED=95=A8?= =?UTF-8?q?=EC=88=98=20=EC=83=9D=EC=84=B1?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- src/main/java/controller/RacingGameController.java | 8 ++++++++ 1 file changed, 8 insertions(+) diff --git a/src/main/java/controller/RacingGameController.java b/src/main/java/controller/RacingGameController.java index 83692d2c..4dd05cbf 100644 --- a/src/main/java/controller/RacingGameController.java +++ b/src/main/java/controller/RacingGameController.java @@ -1,5 +1,7 @@ package controller; +import domain.RacingCars; +import util.CreatingCar; import view.InputView; import view.OutputView; @@ -7,5 +9,11 @@ public class RacingGameController { private InputView inputView = new InputView(); private OutputView outputView = new OutputView(); public void startGame(){ + RacingCars racingCar = createRacingCar(); + } + private RacingCars createRacingCar(){ + outputView.printRequestCarNames(); + String[] carNames = inputView.inputCarNames(); + return CreatingCar.createCars(carNames); } } From 141b6962dcced093198e51fce27345dafcced6af Mon Sep 17 00:00:00 2001 From: young-in Date: Mon, 10 Jun 2024 06:03:50 +0900 Subject: [PATCH 25/45] =?UTF-8?q?refactor=20(RacingCameController.java)=20?= =?UTF-8?q?:=20=EC=83=9D=EC=84=B1=EC=9E=90=20=EB=8B=A8=EC=88=98=ED=98=95?= =?UTF-8?q?=20->=20=EB=B3=B5=EC=88=98=ED=98=95=EC=9C=BC=EB=A1=9C=20?= =?UTF-8?q?=EC=88=98=EC=A0=95?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit 복수의 객체를 만드는데 단수형으로 표현해서 이를 수정함 --- src/main/java/controller/RacingGameController.java | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/src/main/java/controller/RacingGameController.java b/src/main/java/controller/RacingGameController.java index 4dd05cbf..6d0cddb7 100644 --- a/src/main/java/controller/RacingGameController.java +++ b/src/main/java/controller/RacingGameController.java @@ -9,9 +9,9 @@ public class RacingGameController { private InputView inputView = new InputView(); private OutputView outputView = new OutputView(); public void startGame(){ - RacingCars racingCar = createRacingCar(); + RacingCars racingCars = createRacingCars(); } - private RacingCars createRacingCar(){ + private RacingCars createRacingCars(){ outputView.printRequestCarNames(); String[] carNames = inputView.inputCarNames(); return CreatingCar.createCars(carNames); From 106693057119ba9b20e9f12d9b7421468ed0ea86 Mon Sep 17 00:00:00 2001 From: young-in Date: Mon, 10 Jun 2024 06:07:06 +0900 Subject: [PATCH 26/45] =?UTF-8?q?feat=20(RacingCameController.java)=20:=20?= =?UTF-8?q?=EA=B2=8C=EC=9E=84=20=EC=8B=9C=EC=9E=91=20=EC=8B=9C,=20?= =?UTF-8?q?=EB=AA=87=20=EB=B2=88=20=EC=9D=B4=EB=8F=99=ED=95=A0=20=EC=A7=80?= =?UTF-8?q?=20=EC=84=A0=ED=83=9D=ED=95=98=EB=8A=94=20method=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/java/controller/RacingGameController.java | 9 +++++++++ 1 file changed, 9 insertions(+) diff --git a/src/main/java/controller/RacingGameController.java b/src/main/java/controller/RacingGameController.java index 6d0cddb7..cec7cf5e 100644 --- a/src/main/java/controller/RacingGameController.java +++ b/src/main/java/controller/RacingGameController.java @@ -1,6 +1,7 @@ package controller; import domain.RacingCars; +import domain.TryialNum; import util.CreatingCar; import view.InputView; import view.OutputView; @@ -10,10 +11,18 @@ public class RacingGameController { private OutputView outputView = new OutputView(); public void startGame(){ RacingCars racingCars = createRacingCars(); + TryialNum tryialNum = getTryCount(); } + private RacingCars createRacingCars(){ outputView.printRequestCarNames(); String[] carNames = inputView.inputCarNames(); return CreatingCar.createCars(carNames); } + + private TryialNum getTryCount(){ + outputView.printRequestTryCount(); + String inputTryCount = inputView.inputTryCount(); + return new TryialNum(inputTryCount); + } } From 933ab081e7c9e0adc684c4ecf31015881a615a92 Mon Sep 17 00:00:00 2001 From: young-in Date: Mon, 10 Jun 2024 06:10:21 +0900 Subject: [PATCH 27/45] =?UTF-8?q?feat=20(RacingCars.java)=20:=20racing=20C?= =?UTF-8?q?ar=20=EA=B0=9D=EC=B2=B4=20=EB=B6=88=EB=9F=AC=EC=98=A4=EB=8A=94?= =?UTF-8?q?=20method=20=EA=B5=AC=ED=98=84?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- src/main/java/domain/RacingCars.java | 4 ++++ 1 file changed, 4 insertions(+) diff --git a/src/main/java/domain/RacingCars.java b/src/main/java/domain/RacingCars.java index 0406251f..ba9a4a3b 100644 --- a/src/main/java/domain/RacingCars.java +++ b/src/main/java/domain/RacingCars.java @@ -31,4 +31,8 @@ private void minimumNumofCars(int size) { throw new IllegalArgumentException("자동차 경주를 위해서는 최소 2대 이상의 자동차를 만들어야 합니다."); } } + + public List getCars() { + return cars; + } } From 035988126ac5a3049cffe36796f0bc61c8b215d8 Mon Sep 17 00:00:00 2001 From: young-in Date: Mon, 10 Jun 2024 06:10:54 +0900 Subject: [PATCH 28/45] =?UTF-8?q?feat=20(Output.java)=20:=20=EA=B0=81=20?= =?UTF-8?q?=EB=9D=BC=EC=9A=B4=EB=93=9C=20=EB=B3=84,=20=EC=9E=90=EB=8F=99?= =?UTF-8?q?=EC=B0=A8=EB=93=A4=EC=9D=98=20=EC=9D=B4=EB=A6=84,=20=EC=A0=84?= =?UTF-8?q?=EC=A7=84=ED=95=9C=20=EA=B1=B0=EB=A6=AC=EB=A5=BC=20=EC=B6=9C?= =?UTF-8?q?=EB=A0=A5=ED=95=98=EA=B8=B0=20=EC=9C=84=ED=95=9C=20view=20?= =?UTF-8?q?=EA=B5=AC=ED=98=84?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- src/main/java/view/OutputView.java | 16 ++++++++++++++++ 1 file changed, 16 insertions(+) diff --git a/src/main/java/view/OutputView.java b/src/main/java/view/OutputView.java index 70768d8b..2d84694d 100644 --- a/src/main/java/view/OutputView.java +++ b/src/main/java/view/OutputView.java @@ -1,11 +1,16 @@ package view; +import domain.RacingCar; +import domain.RacingCars; + public class OutputView { private static final String INPUT_CAR_NAMES = "경주할 자동차 이름을 입력하세요.(이름은 쉼표(,) 기준으로 구분)"; private static final String INPUT_TRY_COUNT = "시도할 회수는 몇회인가요?"; private static final String NEW_LINE = "\n"; private static final String EXECUTION_RESULT = "실행 결과"; + private static final String COLON_SIGN = " : "; + private static final String MOVE_SIGN = "-"; public void printRequestCarNames(){ System.out.println(INPUT_CAR_NAMES); @@ -18,4 +23,15 @@ public void printRequestTryCount(){ public void printExecutionResult(){ System.out.println(NEW_LINE + EXECUTION_RESULT); } + + public void printRoundByExecutionResults(final RacingCars cars){ + StringBuilder resultByRound = new StringBuilder(); + for (RacingCar car : cars.getCars()) { + resultByRound.append(car.getRacingCarName()) + .append(COLON_SIGN) + .append(MOVE_SIGN.repeat(car.getDistance())) + .append(NEW_LINE); + } + System.out.println(resultByRound); + } } From e7051b13d89de1fc9b44f86f3445cc32f07f81e6 Mon Sep 17 00:00:00 2001 From: young-in Date: Mon, 10 Jun 2024 06:22:50 +0900 Subject: [PATCH 29/45] =?UTF-8?q?feat=20(RacingCars.java)=20:=20racing=20c?= =?UTF-8?q?ar=20=EC=9D=B4=EB=8F=99=EC=9D=84=20=EC=9C=84=ED=95=9C=20method?= =?UTF-8?q?=20=EA=B5=AC=ED=98=84?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- src/main/java/domain/RacingCars.java | 9 +++++++++ 1 file changed, 9 insertions(+) diff --git a/src/main/java/domain/RacingCars.java b/src/main/java/domain/RacingCars.java index ba9a4a3b..74ef3371 100644 --- a/src/main/java/domain/RacingCars.java +++ b/src/main/java/domain/RacingCars.java @@ -1,5 +1,7 @@ package domain; +import util.RandomGeneratingMove; + import java.util.HashSet; import java.util.List; import java.util.stream.Collectors; @@ -14,6 +16,13 @@ public RacingCars(List cars) { this.cars = cars; } + public void moveAll(final RandomGeneratingMove randomGeneratingMove) { + for (final RacingCar car : cars) { + int engine = randomGeneratingMove.generateRandomInt(); + car.move(engine); + } + } + private void isDifferentCarName(List cars) { List carName = cars.stream() .map(idx -> idx.getRacingCarName()) From f54e8f4e65b8182f2c103a4b417a49ed0fc24311 Mon Sep 17 00:00:00 2001 From: young-in Date: Mon, 10 Jun 2024 06:24:16 +0900 Subject: [PATCH 30/45] =?UTF-8?q?feat=20(RacingGameController.java)=20:=20?= =?UTF-8?q?racing=20car=20=EC=9D=B4=EB=8F=99=ED=95=9C=20=EA=B1=B0=EB=A6=AC?= =?UTF-8?q?=EB=A5=BC=20=EC=B6=9C=EB=A0=A5=ED=95=98=EB=8A=94=20View=20?= =?UTF-8?q?=EC=97=B0=EA=B2=B0?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- src/main/java/controller/RacingGameController.java | 14 ++++++++++++++ 1 file changed, 14 insertions(+) diff --git a/src/main/java/controller/RacingGameController.java b/src/main/java/controller/RacingGameController.java index cec7cf5e..e50e8a2d 100644 --- a/src/main/java/controller/RacingGameController.java +++ b/src/main/java/controller/RacingGameController.java @@ -3,15 +3,19 @@ import domain.RacingCars; import domain.TryialNum; import util.CreatingCar; +import util.RandomGeneratingMove; import view.InputView; import view.OutputView; public class RacingGameController { private InputView inputView = new InputView(); private OutputView outputView = new OutputView(); + private final RandomGeneratingMove randomGeneratingMove = new RandomGeneratingMove(); public void startGame(){ RacingCars racingCars = createRacingCars(); TryialNum tryialNum = getTryCount(); + + racing(racingCars, tryialNum); } private RacingCars createRacingCars(){ @@ -25,4 +29,14 @@ private TryialNum getTryCount(){ String inputTryCount = inputView.inputTryCount(); return new TryialNum(inputTryCount); } + + private void racing(RacingCars cars, TryialNum tryialNum) { + outputView.printExecutionResult(); + + for (int i = 0; i < tryialNum.getTrialNum(); i++) { + cars.moveAll(randomGeneratingMove); + outputView.printRoundByExecutionResults(cars); + } + } + } From afbcb0745d8499810871929580477e8bfb31d047 Mon Sep 17 00:00:00 2001 From: young-in Date: Mon, 10 Jun 2024 06:26:02 +0900 Subject: [PATCH 31/45] =?UTF-8?q?feat=20(RacingCar.java)=20:=20racing=20ca?= =?UTF-8?q?r=20=EA=B0=9D=EC=B2=B4=EC=97=90=EC=84=9C=20=EA=B1=B0=EB=A6=AC?= =?UTF-8?q?=20=EB=B9=84=EA=B5=90=EA=B0=80=20=EA=B0=80=EB=8A=A5=ED=95=98?= =?UTF-8?q?=EB=8F=84=EB=A1=9D=20=EA=B5=AC=ED=98=84?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- src/main/java/domain/RacingCar.java | 7 ++++++- 1 file changed, 6 insertions(+), 1 deletion(-) diff --git a/src/main/java/domain/RacingCar.java b/src/main/java/domain/RacingCar.java index 76c0e8b0..b6f66c68 100644 --- a/src/main/java/domain/RacingCar.java +++ b/src/main/java/domain/RacingCar.java @@ -1,6 +1,6 @@ package domain; -public class RacingCar { +public class RacingCar implements Comparable { private static final int MOVE_CONDITION = 4; private RacingCarName racingCarName; @@ -24,4 +24,9 @@ public String getRacingCarName() { public Integer getDistance() { return distance.location(); } + + @Override + public int compareTo(RacingCar competeCar) { + return this.distance.location() - competeCar.distance.location(); + } } From 368508af42137047085cba65a616f8391e1b8d76 Mon Sep 17 00:00:00 2001 From: young-in Date: Mon, 10 Jun 2024 06:27:37 +0900 Subject: [PATCH 32/45] =?UTF-8?q?feat=20(RacingCar.java)=20:=20racing=20ca?= =?UTF-8?q?r=EB=93=A4=20=EC=A4=91=20,=20=EB=8F=99=EC=9D=BC=ED=95=9C=20?= =?UTF-8?q?=EA=B1=B0=EB=A6=AC=EB=A5=BC=20=EC=9D=B4=EB=8F=99=ED=95=9C=20?= =?UTF-8?q?=EC=B0=A8=20=ED=99=95=EC=9D=B8=ED=95=98=EB=8A=94=20=EB=A9=94?= =?UTF-8?q?=EC=86=8C=EB=93=9C=20=EA=B5=AC=ED=98=84?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- src/main/java/domain/RacingCar.java | 4 ++++ 1 file changed, 4 insertions(+) diff --git a/src/main/java/domain/RacingCar.java b/src/main/java/domain/RacingCar.java index b6f66c68..e91d90e5 100644 --- a/src/main/java/domain/RacingCar.java +++ b/src/main/java/domain/RacingCar.java @@ -25,6 +25,10 @@ public Integer getDistance() { return distance.location(); } + public boolean isSameDistance(RacingCar competeCar) { + return this.distance.location() == competeCar.distance.location(); + } + @Override public int compareTo(RacingCar competeCar) { return this.distance.location() - competeCar.distance.location(); From 2d568431e18c8e3cdc17b7dc7710406a039a54bf Mon Sep 17 00:00:00 2001 From: young-in Date: Mon, 10 Jun 2024 06:30:13 +0900 Subject: [PATCH 33/45] =?UTF-8?q?feat=20(RacingCars.java)=20:=20=EC=9A=B0?= =?UTF-8?q?=EC=8A=B9=ED=95=9C=20racing=20car(s)=EC=9D=84=20=EC=B0=BE?= =?UTF-8?q?=EB=8A=94=20=EB=A9=94=EC=86=8C=EB=93=9C=20=EA=B5=AC=ED=98=84?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- src/main/java/domain/RacingCars.java | 19 +++++++++++++++++++ 1 file changed, 19 insertions(+) diff --git a/src/main/java/domain/RacingCars.java b/src/main/java/domain/RacingCars.java index 74ef3371..8199fe87 100644 --- a/src/main/java/domain/RacingCars.java +++ b/src/main/java/domain/RacingCars.java @@ -44,4 +44,23 @@ private void minimumNumofCars(int size) { public List getCars() { return cars; } + + public List findWinners(){ + RacingCar maxDistanceCar = findMaxDistanceCar(); + List winnerCarNameList = findSameDistanceList(maxDistanceCar); + return winnerCarNameList; + } + + private RacingCar findMaxDistanceCar() { + return cars.stream() + .max(RacingCar::compareTo) + .orElseThrow(() -> new IllegalArgumentException("차량 리스트가 비었습니다.")); + } + + private List findSameDistanceList(RacingCar maxDistanceCar) { + return cars.stream() + .filter(maxDistanceCar::isSameDistance) + .map(RacingCar::getRacingCarName) + .collect(Collectors.toList()); + } } From 99ce937e5ebbfbb044778115ea943b653d693931 Mon Sep 17 00:00:00 2001 From: young-in Date: Mon, 10 Jun 2024 06:33:31 +0900 Subject: [PATCH 34/45] =?UTF-8?q?feat=20(OutputView.java)=20:=20=EC=9A=B0?= =?UTF-8?q?=EC=8A=B9=ED=95=9C=20racing=20car(s)=EC=9D=84=20=EC=B6=9C?= =?UTF-8?q?=EB=A0=A5=ED=95=98=EB=8A=94=20view=20=EA=B5=AC=ED=98=84?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../java/controller/RacingGameController.java | 1 + src/main/java/view/OutputView.java | 23 +++++++++++++++++++ 2 files changed, 24 insertions(+) diff --git a/src/main/java/controller/RacingGameController.java b/src/main/java/controller/RacingGameController.java index e50e8a2d..d9621b4e 100644 --- a/src/main/java/controller/RacingGameController.java +++ b/src/main/java/controller/RacingGameController.java @@ -37,6 +37,7 @@ private void racing(RacingCars cars, TryialNum tryialNum) { cars.moveAll(randomGeneratingMove); outputView.printRoundByExecutionResults(cars); } + outputView.printRacingCarWinnerResult(cars); } } diff --git a/src/main/java/view/OutputView.java b/src/main/java/view/OutputView.java index 2d84694d..95b0a6a6 100644 --- a/src/main/java/view/OutputView.java +++ b/src/main/java/view/OutputView.java @@ -3,6 +3,8 @@ import domain.RacingCar; import domain.RacingCars; +import java.util.List; + public class OutputView { private static final String INPUT_CAR_NAMES = "경주할 자동차 이름을 입력하세요.(이름은 쉼표(,) 기준으로 구분)"; @@ -11,6 +13,8 @@ public class OutputView { private static final String EXECUTION_RESULT = "실행 결과"; private static final String COLON_SIGN = " : "; private static final String MOVE_SIGN = "-"; + private static final String FINAL_WINNER = "최종 우승자"; + private static final String COMMA_SIGN = ", "; public void printRequestCarNames(){ System.out.println(INPUT_CAR_NAMES); @@ -34,4 +38,23 @@ public void printRoundByExecutionResults(final RacingCars cars){ } System.out.println(resultByRound); } + + public void printRacingCarWinnerResult(final RacingCars cars){ + List winners = cars.findWinners(); + StringBuilder winnerRacingCar = new StringBuilder(); + winnerRacingCar.append(FINAL_WINNER) + .append(COLON_SIGN); + + for (int i = 0; i < winners.size(); i++) { + winnerRacingCar.append(winners.get(i)); + if (isJointWinner(i, winners)){ + winnerRacingCar.append(COMMA_SIGN); + } + } + System.out.println(winnerRacingCar); + } + + private boolean isJointWinner(int idx, List winners) { + return idx < (winners.size() - 1); + } } From 95f956e58f3614738af829bbb8371ad8b28c4ae4 Mon Sep 17 00:00:00 2001 From: young-in Date: Mon, 10 Jun 2024 10:04:05 +0900 Subject: [PATCH 35/45] =?UTF-8?q?feat=20(RacingCarNameTest.java)=20:=20rac?= =?UTF-8?q?ing=20Car=20naem=20List=EC=9D=98=20=EA=B0=81=20=EA=B0=92?= =?UTF-8?q?=EC=9D=B4=201=EC=9D=B4=EC=83=81=205=EC=9D=B4=ED=95=98=EC=9D=98?= =?UTF-8?q?=20=EA=B8=B8=EC=9D=B4=EC=9D=98=20=EC=9D=B4=EB=A6=84=EC=9D=84=20?= =?UTF-8?q?=EA=B0=80=EC=A7=80=EB=8A=94=EC=A7=80=20test=ED=95=98=EB=8A=94?= =?UTF-8?q?=20=EC=BD=94=EB=93=9C=20=EC=9E=91=EC=84=B1?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- src/test/java/domain/RacingCarNameTest.java | 36 +++++++++++++++++++++ 1 file changed, 36 insertions(+) create mode 100644 src/test/java/domain/RacingCarNameTest.java diff --git a/src/test/java/domain/RacingCarNameTest.java b/src/test/java/domain/RacingCarNameTest.java new file mode 100644 index 00000000..bf43c4ed --- /dev/null +++ b/src/test/java/domain/RacingCarNameTest.java @@ -0,0 +1,36 @@ +package domain; + +import static org.assertj.core.api.Assertions.assertThat; +import static org.assertj.core.api.Assertions.assertThatThrownBy; + +import org.junit.jupiter.api.DisplayName; +import org.junit.jupiter.api.Test; +import org.junit.jupiter.params.ParameterizedTest; +import org.junit.jupiter.params.provider.ValueSource; + +class RacingCarNameTest { + + @ParameterizedTest + @ValueSource(strings = {"pobi", "woni", "jun", "cobi"}) + @DisplayName("racing car 생성 test") + void test_name_constructor_success(String input) { + // when + RacingCarName racingCarName = new RacingCarName(input); + + // then + assertThat(racingCarName.carName()).isEqualTo(input); + } + + @ParameterizedTest + @ValueSource(strings = {"","avante", "sonata"}) + @DisplayName("경주할 자동차 이름은 유효한 범위(1이상 5이하)를 가져야한다. ") + void test_name_constructor_fail_over_length_name(String carName) { + // given + String expectedMessage = "자동차이름은 1자리이상 5자 이하만 가능합니다."; + + // when & then + assertThatThrownBy(() -> new RacingCarName(carName)) + .isInstanceOf(IllegalArgumentException.class) + .hasMessageContaining(expectedMessage); + } +} From 5c22bd2e9f32ebf63316d509db5ca26358bfd01c Mon Sep 17 00:00:00 2001 From: young-in Date: Mon, 10 Jun 2024 10:09:13 +0900 Subject: [PATCH 36/45] =?UTF-8?q?feat=20(RacingCarTest.java)=20:=20racing?= =?UTF-8?q?=20car=EB=93=A4=20=EB=81=BC=EB=A6=AC=20=EC=A4=91=EB=B3=B5?= =?UTF-8?q?=EB=90=9C=20=EC=9D=B4=EB=A6=84=20=EC=82=AC=EC=9A=A9=EC=9D=B4=20?= =?UTF-8?q?=EB=B6=88=EA=B0=80=EB=8A=A5=ED=95=9C=20=EA=B2=83=EC=9D=84=20?= =?UTF-8?q?=ED=85=8C=EC=8A=A4=ED=8A=B8=20=ED=95=98=EB=8A=94=20=EA=B8=B0?= =?UTF-8?q?=EB=8A=A5?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- src/test/java/domain/RacingCarNameTest.java | 4 ++-- src/test/java/domain/RacingCarsTest.java | 22 +++++++++++++++++++++ 2 files changed, 24 insertions(+), 2 deletions(-) create mode 100644 src/test/java/domain/RacingCarsTest.java diff --git a/src/test/java/domain/RacingCarNameTest.java b/src/test/java/domain/RacingCarNameTest.java index bf43c4ed..f4d11a98 100644 --- a/src/test/java/domain/RacingCarNameTest.java +++ b/src/test/java/domain/RacingCarNameTest.java @@ -11,7 +11,7 @@ class RacingCarNameTest { @ParameterizedTest - @ValueSource(strings = {"pobi", "woni", "jun", "cobi"}) + @ValueSource(strings = {"yoni", "ini", "nini", "zzang"}) @DisplayName("racing car 생성 test") void test_name_constructor_success(String input) { // when @@ -22,7 +22,7 @@ void test_name_constructor_success(String input) { } @ParameterizedTest - @ValueSource(strings = {"","avante", "sonata"}) + @ValueSource(strings = {"","doggang", "lovelove"}) @DisplayName("경주할 자동차 이름은 유효한 범위(1이상 5이하)를 가져야한다. ") void test_name_constructor_fail_over_length_name(String carName) { // given diff --git a/src/test/java/domain/RacingCarsTest.java b/src/test/java/domain/RacingCarsTest.java new file mode 100644 index 00000000..12283236 --- /dev/null +++ b/src/test/java/domain/RacingCarsTest.java @@ -0,0 +1,22 @@ +package domain; + +import java.util.List; +import org.assertj.core.api.Assertions; +import org.junit.jupiter.api.DisplayName; +import org.junit.jupiter.api.Test; +public class RacingCarsTest { + @DisplayName("자동차 이름은 중복으로 사용될 수 없다.") + @Test + void isDifferentCarName() throws Exception{ + //given + String racingCarName = "yoni"; + RacingCar car = new RacingCar(racingCarName, 1); + + List cars = List.of(car, car); + + //when //then + Assertions.assertThatThrownBy(() -> new RacingCars(cars)) + .isInstanceOf(IllegalArgumentException.class) + .hasMessage("자동차 이름은 중복으로 사용될 수 없습니다."); + } +} From 09b5a700ea6d0aa9b9ceb3c4e18c2df307538cc9 Mon Sep 17 00:00:00 2001 From: young-in Date: Mon, 10 Jun 2024 10:13:21 +0900 Subject: [PATCH 37/45] =?UTF-8?q?feat=20(RacingCarTest.java)=20:=20racing?= =?UTF-8?q?=20game=EC=9D=84=20=ED=95=98=EA=B8=B0=20=EC=9C=84=ED=95=B4?= =?UTF-8?q?=EC=84=9C=EB=8A=94=20racing=20car=20=EC=A0=81=EC=96=B4=EB=8F=84?= =?UTF-8?q?=202=EB=8C=80=20=ED=95=84=EC=9A=94?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- src/test/java/domain/RacingCarTest.java | 37 ++++++++++++++++++++++++ src/test/java/domain/RacingCarsTest.java | 22 -------------- 2 files changed, 37 insertions(+), 22 deletions(-) create mode 100644 src/test/java/domain/RacingCarTest.java delete mode 100644 src/test/java/domain/RacingCarsTest.java diff --git a/src/test/java/domain/RacingCarTest.java b/src/test/java/domain/RacingCarTest.java new file mode 100644 index 00000000..51c8156a --- /dev/null +++ b/src/test/java/domain/RacingCarTest.java @@ -0,0 +1,37 @@ +package domain; + +import java.util.List; +import org.assertj.core.api.Assertions; +import org.junit.jupiter.api.DisplayName; +import org.junit.jupiter.api.Test; +public class RacingCarTest { + @DisplayName("자동차 이름은 중복 불가") + @Test + void isDifferentCarName() throws Exception{ + //given + String racingCarName = "yoni"; + RacingCar car = new RacingCar(racingCarName, 1); + + List cars = List.of(car, car); + + //when //then + Assertions.assertThatThrownBy(() -> new RacingCars(cars)) + .isInstanceOf(IllegalArgumentException.class) + .hasMessage("자동차 이름은 중복으로 사용 불가"); + } + + @DisplayName("자동차 경주를 하기위해 자동차는 최소 2대이상 생성해야 함") + @Test + void minimumCountOfCars() throws Exception{ + //given + String racingCarName = "pobi"; + RacingCar car = new RacingCar(racingCarName, 1); + + List cars = List.of(car); + + //when //then + Assertions.assertThatThrownBy(() -> new RacingCars(cars)) + .isInstanceOf(IllegalArgumentException.class) + .hasMessage("자동차는 최소 2대 이상 생성해야 함"); + } +} diff --git a/src/test/java/domain/RacingCarsTest.java b/src/test/java/domain/RacingCarsTest.java deleted file mode 100644 index 12283236..00000000 --- a/src/test/java/domain/RacingCarsTest.java +++ /dev/null @@ -1,22 +0,0 @@ -package domain; - -import java.util.List; -import org.assertj.core.api.Assertions; -import org.junit.jupiter.api.DisplayName; -import org.junit.jupiter.api.Test; -public class RacingCarsTest { - @DisplayName("자동차 이름은 중복으로 사용될 수 없다.") - @Test - void isDifferentCarName() throws Exception{ - //given - String racingCarName = "yoni"; - RacingCar car = new RacingCar(racingCarName, 1); - - List cars = List.of(car, car); - - //when //then - Assertions.assertThatThrownBy(() -> new RacingCars(cars)) - .isInstanceOf(IllegalArgumentException.class) - .hasMessage("자동차 이름은 중복으로 사용될 수 없습니다."); - } -} From 2a1714bd561eb67b1093d0f09b410df87dfb0859 Mon Sep 17 00:00:00 2001 From: young-in Date: Mon, 10 Jun 2024 10:20:26 +0900 Subject: [PATCH 38/45] =?UTF-8?q?feat=20(SplitingCarNameTest.java)=20:=20r?= =?UTF-8?q?acingCar=20name=EB=93=A4=EC=9D=84=20=EC=89=BC=ED=91=9C=20?= =?UTF-8?q?=EA=B8=B0=EC=A4=80=EC=9C=BC=EB=A1=9C=20=EC=9E=98=20=EA=B5=AC?= =?UTF-8?q?=EB=B6=84=ED=95=98=EB=8A=94=20=EC=A7=80=20=ED=99=95=EC=9D=B8?= =?UTF-8?q?=ED=95=98=EB=8A=94=20test=20=EC=9E=91=EC=84=B1?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- src/test/java/domain/RacingCarTest.java | 2 +- src/test/java/util/SplitingCarNameTest.java | 20 ++++++++++++++++++++ 2 files changed, 21 insertions(+), 1 deletion(-) create mode 100644 src/test/java/util/SplitingCarNameTest.java diff --git a/src/test/java/domain/RacingCarTest.java b/src/test/java/domain/RacingCarTest.java index 51c8156a..36ecd2c3 100644 --- a/src/test/java/domain/RacingCarTest.java +++ b/src/test/java/domain/RacingCarTest.java @@ -24,7 +24,7 @@ void isDifferentCarName() throws Exception{ @Test void minimumCountOfCars() throws Exception{ //given - String racingCarName = "pobi"; + String racingCarName = "ini"; RacingCar car = new RacingCar(racingCarName, 1); List cars = List.of(car); diff --git a/src/test/java/util/SplitingCarNameTest.java b/src/test/java/util/SplitingCarNameTest.java new file mode 100644 index 00000000..c0f7e5e6 --- /dev/null +++ b/src/test/java/util/SplitingCarNameTest.java @@ -0,0 +1,20 @@ +package util; + +import static org.assertj.core.api.Assertions.assertThat; +import org.junit.jupiter.api.DisplayName; +import org.junit.jupiter.api.Test; + +public class SplitingCarNameTest { + @DisplayName("자동차는 쉼표(,)를 기준으로 구분하여 생성된다.") + @Test + void splitCarName() throws Exception{ + //given + String playerInput = "ini,yoni,nini,bye"; + SplitingCarName splitingCarName = new SplitingCarName(); + String[] strings = splitingCarName.splitCarName(playerInput); + + //when //then + assertThat(strings).hasSize(4) + .containsExactly(new String[]{"ini","yoni","nini","bye"}); + } +} From b2be1563eea1cb6e4c25bad4ab1252c3f0346f55 Mon Sep 17 00:00:00 2001 From: young-in Date: Mon, 10 Jun 2024 10:28:32 +0900 Subject: [PATCH 39/45] =?UTF-8?q?feat=20(TrialNumTest.java)=20:=20?= =?UTF-8?q?=EC=82=AC=EC=9A=A9=EC=9E=90=EA=B0=80=20=EC=9E=85=EB=A0=A5?= =?UTF-8?q?=ED=95=98=EB=8A=94=20=EC=9D=B4=EB=8F=99=20=ED=9A=9F=EC=88=98?= =?UTF-8?q?=EA=B0=80=20=EC=88=AB=EC=9E=90=EC=9D=B8=EC=A7=80=20=EC=95=84?= =?UTF-8?q?=EB=8B=8C=EC=A7=80=20=EC=98=A4=EB=A5=98=20=EA=B2=80=EC=A6=9D?= =?UTF-8?q?=ED=95=98=EB=8A=94=20test=20=EC=9E=91=EC=84=B1=20=EC=99=84?= =?UTF-8?q?=EB=A3=8C?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../java/controller/RacingGameController.java | 14 ++++----- .../domain/{TryialNum.java => TrialNum.java} | 4 +-- src/test/java/domain/RacingCarTest.java | 8 ++--- src/test/java/domain/TrialNumTest.java | 29 +++++++++++++++++++ 4 files changed, 42 insertions(+), 13 deletions(-) rename src/main/java/domain/{TryialNum.java => TrialNum.java} (88%) create mode 100644 src/test/java/domain/TrialNumTest.java diff --git a/src/main/java/controller/RacingGameController.java b/src/main/java/controller/RacingGameController.java index d9621b4e..0fcac56e 100644 --- a/src/main/java/controller/RacingGameController.java +++ b/src/main/java/controller/RacingGameController.java @@ -1,7 +1,7 @@ package controller; import domain.RacingCars; -import domain.TryialNum; +import domain.TrialNum; import util.CreatingCar; import util.RandomGeneratingMove; import view.InputView; @@ -13,9 +13,9 @@ public class RacingGameController { private final RandomGeneratingMove randomGeneratingMove = new RandomGeneratingMove(); public void startGame(){ RacingCars racingCars = createRacingCars(); - TryialNum tryialNum = getTryCount(); + TrialNum trialNum = getTryCount(); - racing(racingCars, tryialNum); + racing(racingCars, trialNum); } private RacingCars createRacingCars(){ @@ -24,16 +24,16 @@ private RacingCars createRacingCars(){ return CreatingCar.createCars(carNames); } - private TryialNum getTryCount(){ + private TrialNum getTryCount(){ outputView.printRequestTryCount(); String inputTryCount = inputView.inputTryCount(); - return new TryialNum(inputTryCount); + return new TrialNum(inputTryCount); } - private void racing(RacingCars cars, TryialNum tryialNum) { + private void racing(RacingCars cars, TrialNum trialNum) { outputView.printExecutionResult(); - for (int i = 0; i < tryialNum.getTrialNum(); i++) { + for (int i = 0; i < trialNum.getTrialNum(); i++) { cars.moveAll(randomGeneratingMove); outputView.printRoundByExecutionResults(cars); } diff --git a/src/main/java/domain/TryialNum.java b/src/main/java/domain/TrialNum.java similarity index 88% rename from src/main/java/domain/TryialNum.java rename to src/main/java/domain/TrialNum.java index 82db56b1..e5afa08b 100644 --- a/src/main/java/domain/TryialNum.java +++ b/src/main/java/domain/TrialNum.java @@ -1,10 +1,10 @@ package domain; -public class TryialNum { +public class TrialNum { private final int trialNum; - public TryialNum(final String trialNum) { + public TrialNum(final String trialNum) { isNaturalNumberValidate(trialNum); this.trialNum = convertStringToInt(trialNum); } diff --git a/src/test/java/domain/RacingCarTest.java b/src/test/java/domain/RacingCarTest.java index 36ecd2c3..1debaf31 100644 --- a/src/test/java/domain/RacingCarTest.java +++ b/src/test/java/domain/RacingCarTest.java @@ -5,7 +5,7 @@ import org.junit.jupiter.api.DisplayName; import org.junit.jupiter.api.Test; public class RacingCarTest { - @DisplayName("자동차 이름은 중복 불가") + @DisplayName("자동차 이름을 중복으로 사용할 수 없습니다.") @Test void isDifferentCarName() throws Exception{ //given @@ -17,10 +17,10 @@ void isDifferentCarName() throws Exception{ //when //then Assertions.assertThatThrownBy(() -> new RacingCars(cars)) .isInstanceOf(IllegalArgumentException.class) - .hasMessage("자동차 이름은 중복으로 사용 불가"); + .hasMessage("자동차 이름을 중복으로 사용할 수 없습니다."); } - @DisplayName("자동차 경주를 하기위해 자동차는 최소 2대이상 생성해야 함") + @DisplayName("자동차 경주를 위해서는 최소 2대 이상의 자동차를 만들어야 합니다.") @Test void minimumCountOfCars() throws Exception{ //given @@ -32,6 +32,6 @@ void minimumCountOfCars() throws Exception{ //when //then Assertions.assertThatThrownBy(() -> new RacingCars(cars)) .isInstanceOf(IllegalArgumentException.class) - .hasMessage("자동차는 최소 2대 이상 생성해야 함"); + .hasMessage("자동차 경주를 위해서는 최소 2대 이상의 자동차를 만들어야 합니다."); } } diff --git a/src/test/java/domain/TrialNumTest.java b/src/test/java/domain/TrialNumTest.java new file mode 100644 index 00000000..b29a9bcb --- /dev/null +++ b/src/test/java/domain/TrialNumTest.java @@ -0,0 +1,29 @@ +package domain; + +import org.assertj.core.api.Assertions; +import org.junit.jupiter.api.DisplayName; +import org.junit.jupiter.api.Test; +import org.junit.jupiter.params.ParameterizedTest; +import org.junit.jupiter.params.provider.ValueSource; + +public class TrialNumTest { + @DisplayName("사용자는 몇 번의 이동을 할 것인지 입력할 수 있다.") + @Test + void inputUserTryCount() throws Exception{ + + String userInput = "5"; + TrialNum tryCount = new TrialNum(userInput); + + Assertions.assertThat(tryCount.getTrialNum()).isEqualTo(5); + } + + @DisplayName("이동할 횟수는 자연수여야 한다.") + @ParameterizedTest + @ValueSource(strings = {"0","ㄷㄷ","!@","-1","은"}) + void isNaturalNumberValidate(String input) throws Exception{ + + Assertions.assertThatThrownBy(() -> new TrialNum(input)) + .isInstanceOf(IllegalArgumentException.class) + .hasMessage("이동할 횟수는 자연수여야 한다."); + } +} From 536ffcab30cee0b4fbf2349a44792dcbb88e2e35 Mon Sep 17 00:00:00 2001 From: young-in Date: Mon, 10 Jun 2024 10:40:29 +0900 Subject: [PATCH 40/45] =?UTF-8?q?feat=20(DistanceTest.java)=20:=20?= =?UTF-8?q?=EC=9E=90=EB=8F=99=EC=B0=A8=EA=B0=80=20=EC=A0=84=EC=A7=84?= =?UTF-8?q?=ED=96=88=EB=8B=A4=EB=8A=94=20=EA=B0=80=EC=A0=95=20=ED=95=98?= =?UTF-8?q?=EC=97=90=20=EC=9C=84=EC=B9=98=20=EB=B3=80=EA=B2=BD=EC=9D=84=20?= =?UTF-8?q?test=20=ED=95=9C=EB=8B=A4.?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- src/test/java/domain/DistanceTest.java | 22 ++++++++++++++++++++++ 1 file changed, 22 insertions(+) create mode 100644 src/test/java/domain/DistanceTest.java diff --git a/src/test/java/domain/DistanceTest.java b/src/test/java/domain/DistanceTest.java new file mode 100644 index 00000000..93144d6c --- /dev/null +++ b/src/test/java/domain/DistanceTest.java @@ -0,0 +1,22 @@ +package domain; + +import org.junit.jupiter.api.DisplayName; +import org.junit.jupiter.api.Test; + +import static org.assertj.core.api.Assertions.assertThat; + +public class DistanceTest { + @DisplayName("자동차가 전진했다면, 위치를 변경(1증가)") + @Test + void carMoveSuccess() throws Exception{ + //given + int startLocation = 0; + Distance init = new Distance(startLocation); + + //when + Distance move = init.increase(); + + //then + assertThat(move.location()).isEqualTo(1); + } +} From 6471c068be4abb78f787734a6dfced93ae177a01 Mon Sep 17 00:00:00 2001 From: young-in Date: Mon, 10 Jun 2024 10:47:35 +0900 Subject: [PATCH 41/45] =?UTF-8?q?feat=20(RacingCarTest.java)=20:=20?= =?UTF-8?q?=EB=9E=9C=EB=8D=A4=EA=B0=92=EC=9D=B4=204=EB=AF=B8=EB=A7=8C?= =?UTF-8?q?=EC=9D=B4=EB=A9=B4=20=EC=A0=95=EC=A7=80,=204=EC=9D=B4=EC=83=81?= =?UTF-8?q?=EC=9D=B4=EB=A9=B4=201=20=EC=9D=B4=EB=8F=99=ED=95=98=EB=8A=94?= =?UTF-8?q?=EA=B2=8C=20=EB=A7=9E=EB=8A=94=EC=A7=80=20=ED=99=95=EC=9D=B8?= =?UTF-8?q?=ED=95=98=EB=8A=94=20test?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- src/test/java/domain/RacingCarTest.java | 46 +++++++++--------------- src/test/java/domain/RacingCarsTest.java | 37 +++++++++++++++++++ 2 files changed, 54 insertions(+), 29 deletions(-) create mode 100644 src/test/java/domain/RacingCarsTest.java diff --git a/src/test/java/domain/RacingCarTest.java b/src/test/java/domain/RacingCarTest.java index 1debaf31..9f14eb97 100644 --- a/src/test/java/domain/RacingCarTest.java +++ b/src/test/java/domain/RacingCarTest.java @@ -1,37 +1,25 @@ package domain; -import java.util.List; -import org.assertj.core.api.Assertions; import org.junit.jupiter.api.DisplayName; -import org.junit.jupiter.api.Test; -public class RacingCarTest { - @DisplayName("자동차 이름을 중복으로 사용할 수 없습니다.") - @Test - void isDifferentCarName() throws Exception{ - //given - String racingCarName = "yoni"; - RacingCar car = new RacingCar(racingCarName, 1); - - List cars = List.of(car, car); +import org.junit.jupiter.params.ParameterizedTest; +import org.junit.jupiter.params.provider.CsvSource; +import static org.assertj.core.api.Assertions.assertThat; +import static org.assertj.core.api.Assertions.assertThatThrownBy; - //when //then - Assertions.assertThatThrownBy(() -> new RacingCars(cars)) - .isInstanceOf(IllegalArgumentException.class) - .hasMessage("자동차 이름을 중복으로 사용할 수 없습니다."); - } - - @DisplayName("자동차 경주를 위해서는 최소 2대 이상의 자동차를 만들어야 합니다.") - @Test - void minimumCountOfCars() throws Exception{ - //given - String racingCarName = "ini"; - RacingCar car = new RacingCar(racingCarName, 1); +public class RacingCarTest { + @DisplayName("자동차는 전진 또는 멈출 수 있다.") + @ParameterizedTest + @CsvSource({"4,1", "5,1", "6,1", + "0,0", "1,0", "3,0"}) + void carMoveOrStopByRandomNumber(int givenPower, int curLocation) { + // given + int startLocation = 0; + RacingCar car = new RacingCar("ini", startLocation); - List cars = List.of(car); + // when + car.move(givenPower); - //when //then - Assertions.assertThatThrownBy(() -> new RacingCars(cars)) - .isInstanceOf(IllegalArgumentException.class) - .hasMessage("자동차 경주를 위해서는 최소 2대 이상의 자동차를 만들어야 합니다."); + // then + assertThat(car.getDistance()).isEqualTo(curLocation); } } diff --git a/src/test/java/domain/RacingCarsTest.java b/src/test/java/domain/RacingCarsTest.java new file mode 100644 index 00000000..7ce81e0e --- /dev/null +++ b/src/test/java/domain/RacingCarsTest.java @@ -0,0 +1,37 @@ +package domain; + +import java.util.List; +import org.assertj.core.api.Assertions; +import org.junit.jupiter.api.DisplayName; +import org.junit.jupiter.api.Test; +public class RacingCarsTest { + @DisplayName("자동차 이름을 중복으로 사용할 수 없습니다.") + @Test + void isDifferentCarName() throws Exception{ + //given + String racingCarName = "yoni"; + RacingCar car = new RacingCar(racingCarName, 1); + + List cars = List.of(car, car); + + //when //then + Assertions.assertThatThrownBy(() -> new RacingCars(cars)) + .isInstanceOf(IllegalArgumentException.class) + .hasMessage("자동차 이름을 중복으로 사용할 수 없습니다."); + } + + @DisplayName("자동차 경주를 위해서는 최소 2대 이상의 자동차를 만들어야 합니다.") + @Test + void minimumCountOfCars() throws Exception{ + //given + String racingCarName = "ini"; + RacingCar car = new RacingCar(racingCarName, 1); + + List cars = List.of(car); + + //when //then + Assertions.assertThatThrownBy(() -> new RacingCars(cars)) + .isInstanceOf(IllegalArgumentException.class) + .hasMessage("자동차 경주를 위해서는 최소 2대 이상의 자동차를 만들어야 합니다."); + } +} From 8b89d45fb22eaa8ba4127675831e8e795445fd33 Mon Sep 17 00:00:00 2001 From: young-in Date: Mon, 10 Jun 2024 10:51:48 +0900 Subject: [PATCH 42/45] =?UTF-8?q?feat=20(RacingCarTest.java)=20:=20?= =?UTF-8?q?=EA=B0=99=EC=9D=80=20=EC=9C=84=EC=B9=98=EC=9D=98=20=EC=9E=90?= =?UTF-8?q?=EB=8F=99=EC=B0=A8=EA=B0=80=20=EC=9E=88=EB=8A=94=20=EA=B2=BD?= =?UTF-8?q?=EC=9A=B0=20=EC=B6=9C=EB=A0=A5=EC=9D=B4=20=EC=9E=98=20=EB=90=98?= =?UTF-8?q?=EB=8A=94=20=EC=A7=80=20=ED=99=95=EC=9D=B8=ED=95=98=EB=8A=94=20?= =?UTF-8?q?test?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- src/test/java/domain/RacingCarTest.java | 17 +++++++++++++++++ 1 file changed, 17 insertions(+) diff --git a/src/test/java/domain/RacingCarTest.java b/src/test/java/domain/RacingCarTest.java index 9f14eb97..4486c3c4 100644 --- a/src/test/java/domain/RacingCarTest.java +++ b/src/test/java/domain/RacingCarTest.java @@ -22,4 +22,21 @@ void carMoveOrStopByRandomNumber(int givenPower, int curLocation) { // then assertThat(car.getDistance()).isEqualTo(curLocation); } + + @DisplayName("같은 위치의 자동차가 존재하는지 확인할 수 있다.") + @ParameterizedTest + @CsvSource({"2,2,true","2,1,false"}) + void isSameDistanceOfCar(int myCarLocation, + int competeCarLocation, + boolean sameDistanceCheck) throws Exception{ + //given + RacingCar myCar = new RacingCar("ini", myCarLocation); + RacingCar competeCar = new RacingCar("yoni", competeCarLocation); + + //when + boolean sameDistance = myCar.isSameDistance(competeCar); + + //then + assertThat(sameDistance).isEqualTo(sameDistanceCheck); + } } From a2272b14e4960d84e6e285ca896b26d24f599615 Mon Sep 17 00:00:00 2001 From: young-in Date: Mon, 10 Jun 2024 10:54:47 +0900 Subject: [PATCH 43/45] =?UTF-8?q?feat=20(RacingCarTest.java)=20:=20?= =?UTF-8?q?=EA=B0=81=20=EC=9E=90=EB=8F=99=EC=B0=A8=EB=93=A4=EC=9D=98=20?= =?UTF-8?q?=EC=9C=84=EC=B9=98=20=EB=B9=84=EA=B5=90=ED=95=98=EB=8A=94=20tes?= =?UTF-8?q?t?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- src/test/java/domain/RacingCarTest.java | 19 +++++++++++++++++++ 1 file changed, 19 insertions(+) diff --git a/src/test/java/domain/RacingCarTest.java b/src/test/java/domain/RacingCarTest.java index 4486c3c4..4e4dbce7 100644 --- a/src/test/java/domain/RacingCarTest.java +++ b/src/test/java/domain/RacingCarTest.java @@ -1,6 +1,7 @@ package domain; import org.junit.jupiter.api.DisplayName; +import org.junit.jupiter.api.Test; import org.junit.jupiter.params.ParameterizedTest; import org.junit.jupiter.params.provider.CsvSource; import static org.assertj.core.api.Assertions.assertThat; @@ -39,4 +40,22 @@ void isSameDistanceOfCar(int myCarLocation, //then assertThat(sameDistance).isEqualTo(sameDistanceCheck); } + + @DisplayName("전진한 자동차들을 비교할 수 있다.") + @Test + void compareDistanceToCar() throws Exception{ + + //given + String myCarName = "ini"; + String competeCarName= "yoni"; + RacingCar myCar = new RacingCar(myCarName, 4); + RacingCar competeCar = new RacingCar(competeCarName, 2); + + //when + int compare = myCar.compareTo(competeCar); + + //then + assertThat(compare).isGreaterThan(0); + } + } From 801b9e5747d474f7309186691d41fb8cf3653c72 Mon Sep 17 00:00:00 2001 From: young-in Date: Mon, 10 Jun 2024 11:01:24 +0900 Subject: [PATCH 44/45] =?UTF-8?q?feat=20(RacingCarTest.java)=20:=20?= =?UTF-8?q?=EC=9A=B0=EC=8A=B9=EC=9E=90=20=ED=99=95=EC=9D=B8=20test=20code?= =?UTF-8?q?=20=EC=9E=91=EC=84=B1=20=EC=99=84=EB=A3=8C?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- src/test/java/domain/RacingCarTest.java | 42 +++++++++++++++++++------ 1 file changed, 33 insertions(+), 9 deletions(-) diff --git a/src/test/java/domain/RacingCarTest.java b/src/test/java/domain/RacingCarTest.java index 4e4dbce7..278d2276 100644 --- a/src/test/java/domain/RacingCarTest.java +++ b/src/test/java/domain/RacingCarTest.java @@ -1,9 +1,13 @@ package domain; +import org.assertj.core.api.Assertions; import org.junit.jupiter.api.DisplayName; import org.junit.jupiter.api.Test; import org.junit.jupiter.params.ParameterizedTest; import org.junit.jupiter.params.provider.CsvSource; + +import java.util.List; + import static org.assertj.core.api.Assertions.assertThat; import static org.assertj.core.api.Assertions.assertThatThrownBy; @@ -15,7 +19,7 @@ public class RacingCarTest { void carMoveOrStopByRandomNumber(int givenPower, int curLocation) { // given int startLocation = 0; - RacingCar car = new RacingCar("ini", startLocation); + RacingCar car = createCar("ini", startLocation); // when car.move(givenPower); @@ -26,13 +30,13 @@ void carMoveOrStopByRandomNumber(int givenPower, int curLocation) { @DisplayName("같은 위치의 자동차가 존재하는지 확인할 수 있다.") @ParameterizedTest - @CsvSource({"2,2,true","2,1,false"}) + @CsvSource({"2,2,true", "2,1,false"}) void isSameDistanceOfCar(int myCarLocation, int competeCarLocation, - boolean sameDistanceCheck) throws Exception{ + boolean sameDistanceCheck) throws Exception { //given - RacingCar myCar = new RacingCar("ini", myCarLocation); - RacingCar competeCar = new RacingCar("yoni", competeCarLocation); + RacingCar myCar = createCar("ini", myCarLocation); + RacingCar competeCar = createCar("yoni", competeCarLocation); //when boolean sameDistance = myCar.isSameDistance(competeCar); @@ -43,13 +47,13 @@ void isSameDistanceOfCar(int myCarLocation, @DisplayName("전진한 자동차들을 비교할 수 있다.") @Test - void compareDistanceToCar() throws Exception{ + void compareDistanceToCar() throws Exception { //given String myCarName = "ini"; - String competeCarName= "yoni"; - RacingCar myCar = new RacingCar(myCarName, 4); - RacingCar competeCar = new RacingCar(competeCarName, 2); + String competeCarName = "yoni"; + RacingCar myCar = createCar(myCarName, 4); + RacingCar competeCar = createCar(competeCarName, 2); //when int compare = myCar.compareTo(competeCar); @@ -58,4 +62,24 @@ void compareDistanceToCar() throws Exception{ assertThat(compare).isGreaterThan(0); } + @DisplayName("자동차 경주 게임의 우승자를 확인할 수 있다.") + @Test + void findWinners() throws Exception { + //given + RacingCar myCar = createCar("ini", 3); + RacingCar competeCar1 = createCar("yoni", 2); + RacingCar competeCar2 = createCar("yuni", 3); + RacingCars cars = new RacingCars(List.of(myCar, competeCar1, competeCar2)); + + //when + List winners = cars.findWinners(); + + //then + Assertions.assertThat(winners).hasSize(2) + .containsExactly("ini", "yuni"); + } + + private static RacingCar createCar(String carName, int location) { + return new RacingCar(carName, location); + } } From 8c3c1689a639feeced669c01f3b4ed7256eebee6 Mon Sep 17 00:00:00 2001 From: young-in Date: Mon, 10 Jun 2024 11:14:12 +0900 Subject: [PATCH 45/45] =?UTF-8?q?refactor=20(RacingCarName.java)=20:=20?= =?UTF-8?q?=EC=98=88=EC=99=B8=20=EC=B2=98=EB=A6=AC=20=EC=98=A4=EB=A5=98=20?= =?UTF-8?q?=EC=88=98=EC=A0=95=20(=EC=98=A4=EB=A5=98=20=EC=98=A4=ED=88=AC?= =?UTF-8?q?=20=EC=88=98=EC=A0=95)?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- src/main/java/domain/RacingCarName.java | 2 +- src/test/java/domain/RacingCarNameTest.java | 4 ++-- 2 files changed, 3 insertions(+), 3 deletions(-) diff --git a/src/main/java/domain/RacingCarName.java b/src/main/java/domain/RacingCarName.java index b763ebfb..a5c21031 100644 --- a/src/main/java/domain/RacingCarName.java +++ b/src/main/java/domain/RacingCarName.java @@ -9,7 +9,7 @@ public record RacingCarName(String carName){ private void isCarNameLengthValidate(final String carName){ if (carName.isEmpty() || carName.length() > CAR_NAME_LENGTH_MAX){ - throw new IllegalArgumentException("racing car 이름은 1자리이상 5자 이하만 가능합니다."); + throw new IllegalArgumentException("자동차이름은 1자리이상 5자 이하만 가능합니다."); } } } diff --git a/src/test/java/domain/RacingCarNameTest.java b/src/test/java/domain/RacingCarNameTest.java index f4d11a98..7109933e 100644 --- a/src/test/java/domain/RacingCarNameTest.java +++ b/src/test/java/domain/RacingCarNameTest.java @@ -22,9 +22,9 @@ void test_name_constructor_success(String input) { } @ParameterizedTest - @ValueSource(strings = {"","doggang", "lovelove"}) + @ValueSource(strings = {"", "avante", "sonata"}) @DisplayName("경주할 자동차 이름은 유효한 범위(1이상 5이하)를 가져야한다. ") - void test_name_constructor_fail_over_length_name(String carName) { + void setRacingCarNameLengthCorrect(String carName) { // given String expectedMessage = "자동차이름은 1자리이상 5자 이하만 가능합니다.";