From 817a2e5336528b9b18bc905be09671e270f0d75b Mon Sep 17 00:00:00 2001 From: bingle625 Date: Sat, 5 Oct 2024 00:31:17 +0900 Subject: [PATCH 01/19] =?UTF-8?q?docs:=20README.md=EC=97=90=201=EB=8B=A8?= =?UTF-8?q?=EA=B3=84=20TODO=20=EC=9E=91=EC=84=B1?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit - 움직이는 자동차 TODO 리스트 작성 --- README.md | 0 1 file changed, 0 insertions(+), 0 deletions(-) create mode 100644 README.md diff --git a/README.md b/README.md new file mode 100644 index 00000000..e69de29b From 91ee0683c1657fac1b0318c0ee2315ca64b96e3a Mon Sep 17 00:00:00 2001 From: bingle625 Date: Sat, 5 Oct 2024 00:53:28 +0900 Subject: [PATCH 02/19] =?UTF-8?q?docs:=201=EB=8B=A8=EA=B3=84=20README=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 --- README.md | 17 +++++++++++++++++ 1 file changed, 17 insertions(+) diff --git a/README.md b/README.md index e69de29b..f725206b 100644 --- a/README.md +++ b/README.md @@ -0,0 +1,17 @@ + +- [ ] 자동차 구현 + - [] 이름 property 를 가짐 + - [] 좌표 property 를 가짐 + - [] 움직이는 기능 + - [] 0~9 무작위 숫자 4 이상 => 전진, 3 이하 => 전진 +- [ ] 코드 컨벤션 + - [ ] 인덴트 2를 넘지 않도록 구현 + - [ ] 3항 연산자 사용 X + - [ ] `else` 사용 X + - [ ] `switch/case` 사용 X + - [ ] 메서드의 길이 15라인을 넘지 않도록 + - [ ] 메서드는 하나의 일만 수행하도록 + - [ ] 메인 메서드는 생성 X +- [ ] 테스트 코드 + - [ ] 자동차 이름 확인 + - [ ] 자동차 움직임 기능 확인 \ No newline at end of file From 950db531aca313457ca233ccef18d136112509ad Mon Sep 17 00:00:00 2001 From: bingle625 Date: Sat, 5 Oct 2024 00:53:47 +0900 Subject: [PATCH 03/19] =?UTF-8?q?feat:=20=EC=9E=90=EB=8F=99=EC=B0=A8=20?= =?UTF-8?q?=EC=86=8D=EC=84=B1,=20=EC=9B=80=EC=A7=81=EC=9E=84=20=EA=B8=B0?= =?UTF-8?q?=EB=8A=A5=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/Car.java | 23 +++++++++++++++++++++ src/test/java/CarTest.java | 41 ++++++++++++++++++++++++++++++++++++++ 2 files changed, 64 insertions(+) create mode 100644 src/main/java/Car.java create mode 100644 src/test/java/CarTest.java diff --git a/src/main/java/Car.java b/src/main/java/Car.java new file mode 100644 index 00000000..55b922a5 --- /dev/null +++ b/src/main/java/Car.java @@ -0,0 +1,23 @@ +public class Car { + + int coordinateX; + String name; + + public Car(int coordinateX, String name) { + this.coordinateX = coordinateX; + this.name = name; + } + + /** + * + * @param randomNumber 랜덤 숫자 + */ + public void move(int randomNumber) { + if (randomNumber < 0 || randomNumber > 9) { + throw new IllegalArgumentException("랜덤 숫자가 0과 9 범위 사이가 아닙니다."); + } + if (randomNumber >= 4) { + this.coordinateX += 1; + } + } +} diff --git a/src/test/java/CarTest.java b/src/test/java/CarTest.java new file mode 100644 index 00000000..475f7db1 --- /dev/null +++ b/src/test/java/CarTest.java @@ -0,0 +1,41 @@ +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; + +@DisplayName("자동차 테스트") +public class CarTest { + + @Test + @DisplayName("숫자가 4이상일 때 자동차가 움직이는 지 테스트") + void testMove() { + Car car = new Car(0, "자동차1"); + int randomNumber = 4; + + car.move(randomNumber); + + assertThat(car.coordinateX).isEqualTo(1); + } + + @Test + @DisplayName("숫자가 3 이하일 때 자동차가 움직이지 않는 지 테스트") + void testNotMove() { + Car car = new Car(0, "자동차1"); + int randomNumber = 3; + + car.move(randomNumber); + + assertThat(car.coordinateX).isEqualTo(0); + } + + @Test + @DisplayName("예외확인: 랜덤 숫자가 0~9 범위가 아닐 경우 예외 확인") + void testIllegalArgument() { + Car car = new Car(0, "자동차1"); + int randomNumber = 10; + + assertThatThrownBy(() -> car.move(randomNumber)).isInstanceOf(IllegalArgumentException.class) + .hasMessage("랜덤 숫자가 0과 9 범위 사이가 아닙니다."); + } +} From 46df3ff0065ac60935bd48278da15c60eecbe694 Mon Sep 17 00:00:00 2001 From: bingle625 Date: Sat, 5 Oct 2024 01:19:40 +0900 Subject: [PATCH 04/19] =?UTF-8?q?refactor:=20=EC=9E=90=EB=8F=99=EC=B0=A8?= =?UTF-8?q?=20name,=20=EC=A2=8C=ED=91=9C=20=EC=86=8D=EC=84=B1=20private=20?= =?UTF-8?q?=ED=95=98=EA=B2=8C=20=EC=A0=84=ED=99=98=20=EB=B0=8F=20getter=20?= =?UTF-8?q?=EC=B6=94=EA=B0=80?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- src/main/java/Car.java | 12 ++++++++++-- src/test/java/CarTest.java | 4 ++-- 2 files changed, 12 insertions(+), 4 deletions(-) diff --git a/src/main/java/Car.java b/src/main/java/Car.java index 55b922a5..1cfde04f 100644 --- a/src/main/java/Car.java +++ b/src/main/java/Car.java @@ -1,7 +1,7 @@ public class Car { - int coordinateX; - String name; + private int coordinateX; + private final String name; public Car(int coordinateX, String name) { this.coordinateX = coordinateX; @@ -20,4 +20,12 @@ public void move(int randomNumber) { this.coordinateX += 1; } } + + public String getName() { + return name; + } + + public int getCoordinateX() { + return coordinateX; + } } diff --git a/src/test/java/CarTest.java b/src/test/java/CarTest.java index 475f7db1..2d9c33e6 100644 --- a/src/test/java/CarTest.java +++ b/src/test/java/CarTest.java @@ -15,7 +15,7 @@ void testMove() { car.move(randomNumber); - assertThat(car.coordinateX).isEqualTo(1); + assertThat(car.getCoordinateX()).isEqualTo(1); } @Test @@ -26,7 +26,7 @@ void testNotMove() { car.move(randomNumber); - assertThat(car.coordinateX).isEqualTo(0); + assertThat(car.getCoordinateX()).isEqualTo(0); } @Test From bda9c1c9925508f871d955ccf3290c8d55bd617b Mon Sep 17 00:00:00 2001 From: bingle625 Date: Sat, 5 Oct 2024 01:21:19 +0900 Subject: [PATCH 05/19] =?UTF-8?q?test:=20=EC=9E=90=EB=8F=99=EC=B0=A8=20?= =?UTF-8?q?=EC=9D=B4=EB=A6=84=20=EC=86=8D=EC=84=B1=20=ED=85=8C=EC=8A=A4?= =?UTF-8?q?=ED=8A=B8?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- src/test/java/CarTest.java | 10 ++++++++++ 1 file changed, 10 insertions(+) diff --git a/src/test/java/CarTest.java b/src/test/java/CarTest.java index 2d9c33e6..9e3b0621 100644 --- a/src/test/java/CarTest.java +++ b/src/test/java/CarTest.java @@ -7,6 +7,16 @@ @DisplayName("자동차 테스트") public class CarTest { + @Test + @DisplayName("이름 속성 확인") + void testName() { + Car car = new Car(0, "자동차1"); + + String name = car.getName(); + + assertThat(name).isEqualTo("자동차1"); + } + @Test @DisplayName("숫자가 4이상일 때 자동차가 움직이는 지 테스트") void testMove() { From d98d93a5850e71b296340aaac356b92ae0eb78ef Mon Sep 17 00:00:00 2001 From: bingle625 Date: Sat, 5 Oct 2024 01:21:34 +0900 Subject: [PATCH 06/19] =?UTF-8?q?docs:=20README=20=EB=A5=BC=20=ED=86=B5?= =?UTF-8?q?=ED=95=B4=20=EC=9E=90=EB=8F=99=EC=B0=A8=20=EA=B4=80=EB=A0=A8=20?= =?UTF-8?q?=EA=B5=AC=ED=98=84=EC=82=AC=ED=95=AD=20=ED=99=95=EC=9D=B8?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- README.md | 32 ++++++++++++++++---------------- 1 file changed, 16 insertions(+), 16 deletions(-) diff --git a/README.md b/README.md index f725206b..c0c37df7 100644 --- a/README.md +++ b/README.md @@ -1,17 +1,17 @@ -- [ ] 자동차 구현 - - [] 이름 property 를 가짐 - - [] 좌표 property 를 가짐 - - [] 움직이는 기능 - - [] 0~9 무작위 숫자 4 이상 => 전진, 3 이하 => 전진 -- [ ] 코드 컨벤션 - - [ ] 인덴트 2를 넘지 않도록 구현 - - [ ] 3항 연산자 사용 X - - [ ] `else` 사용 X - - [ ] `switch/case` 사용 X - - [ ] 메서드의 길이 15라인을 넘지 않도록 - - [ ] 메서드는 하나의 일만 수행하도록 - - [ ] 메인 메서드는 생성 X -- [ ] 테스트 코드 - - [ ] 자동차 이름 확인 - - [ ] 자동차 움직임 기능 확인 \ No newline at end of file +- [x] 자동차 구현 + - [x] 이름 property 를 가짐 + - [x] 좌표 property 를 가짐 + - [x] 움직이는 기능 + - [x] 0~9 무작위 숫자 4 이상 => 전진, 3 이하 => 전진 +- [x] 코드 컨벤션 + - [x] 인덴트 2를 넘지 않도록 구현 + - [x] 3항 연산자 사용 X + - [x] `else` 사용 X + - [x] `switch/case` 사용 X + - [x] 메서드의 길이 15라인을 넘지 않도록 + - [x] 메서드는 하나의 일만 수행하도록 + - [x] 메인 메서드는 생성 X +- [x] 테스트 코드 + - [x] 자동차 이름 확인 + - [x] 자동차 움직임 기능 확인 \ No newline at end of file From 04759fe6465bea2c1a5b331378812b66babfb87f Mon Sep 17 00:00:00 2001 From: bingle625 Date: Sun, 6 Oct 2024 11:46:06 +0900 Subject: [PATCH 07/19] =?UTF-8?q?feature:=20=EB=A0=88=EC=9D=B4=EC=8B=B1=20?= =?UTF-8?q?=EA=B2=8C=EC=9E=84=20=ED=81=B4=EB=9E=98=EC=8A=A4=20=EC=B6=94?= =?UTF-8?q?=EA=B0=80=20=EB=B0=8F=20=EC=B0=B8=EC=97=AC=20=EA=B8=B0=EB=8A=A5?= =?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 --- README.md | 21 ++++++++++++++++++++- src/main/java/RacingGame.java | 19 +++++++++++++++++++ src/test/java/RacingGameTest.java | 23 +++++++++++++++++++++++ 3 files changed, 62 insertions(+), 1 deletion(-) create mode 100644 src/main/java/RacingGame.java create mode 100644 src/test/java/RacingGameTest.java diff --git a/README.md b/README.md index c0c37df7..90f5f91a 100644 --- a/README.md +++ b/README.md @@ -1,4 +1,7 @@ +# 자동차 경주 + +## 1. 움직이는 자동차 구하기 - [x] 자동차 구현 - [x] 이름 property 를 가짐 - [x] 좌표 property 를 가짐 @@ -14,4 +17,20 @@ - [x] 메인 메서드는 생성 X - [x] 테스트 코드 - [x] 자동차 이름 확인 - - [x] 자동차 움직임 기능 확인 \ No newline at end of file + - [x] 자동차 움직임 기능 확인 + +## 2. 우승 자동차 구하기 +- [ ] 경주 게임 구현 + - [ ] n대의 자동차가 참여 가능 + - [ ] 횟수 x 번 동안 각 자동차 전진 혹은 정지 + - [ ] 경주 게임 완료 후 우승 자동차(중복 가능) 확인 가능 +- [ ] 코드 컨벤션 + - [ ] 인덴트 2를 넘지 않도록 구현 + - [ ] 3항 연산자 사용 X + - [ ] `else` 사용 X + - [ ] `switch/case` 사용 X + - [ ] 메서드의 길이 15라인을 넘지 않도록 + - [ ] 메서드는 하나의 일만 수행하도록 + - [ ] 메인 메서드는 생성 X +- [ ] 테스트 코드 + - [ ] 자동차 움직임 기능 확인 \ No newline at end of file diff --git a/src/main/java/RacingGame.java b/src/main/java/RacingGame.java new file mode 100644 index 00000000..a4157071 --- /dev/null +++ b/src/main/java/RacingGame.java @@ -0,0 +1,19 @@ +import java.util.ArrayList; +import java.util.List; + +public class RacingGame { + + private List cars; + + public RacingGame() { + this.cars = new ArrayList<>(); + } + + public void addCar(Car car) { + this.cars.add(car); + } + + public int getCurrentCarCount() { + return this.cars.size(); + } +} diff --git a/src/test/java/RacingGameTest.java b/src/test/java/RacingGameTest.java new file mode 100644 index 00000000..cf79b017 --- /dev/null +++ b/src/test/java/RacingGameTest.java @@ -0,0 +1,23 @@ +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; + +@DisplayName("레이싱 게임 테스트") +public class RacingGameTest { + + @Test + @DisplayName("자동차 참여 테스트") + void testCarJoin() { + Car car1 = new Car(0, "자동차1"); + Car car2 = new Car(0, "자동차2"); + + RacingGame game1 = new RacingGame(); + + game1.addCar(car1); + game1.addCar(car2); + + assertThat(game1.getCurrentCarCount()).isEqualTo(2); + } +} From 91488de9edb8d8b2cc7f97fe028103dc80af7462 Mon Sep 17 00:00:00 2001 From: bingle625 Date: Sun, 6 Oct 2024 12:04:44 +0900 Subject: [PATCH 08/19] =?UTF-8?q?feat:=20=EA=B2=8C=EC=9E=84=20=EC=A7=84?= =?UTF-8?q?=ED=96=89=20=EA=B8=B0=EB=8A=A5=20=EB=B0=8F=20=EC=8A=B9=EC=9E=90?= =?UTF-8?q?=20=ED=99=95=EC=9D=B8=20=EA=B8=B0=EB=8A=A5=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/RacingGame.java | 28 +++++++++++++++++++++++++++- 1 file changed, 27 insertions(+), 1 deletion(-) diff --git a/src/main/java/RacingGame.java b/src/main/java/RacingGame.java index a4157071..53140bd8 100644 --- a/src/main/java/RacingGame.java +++ b/src/main/java/RacingGame.java @@ -1,9 +1,10 @@ import java.util.ArrayList; import java.util.List; +import java.util.Random; public class RacingGame { - private List cars; + private final List cars; public RacingGame() { this.cars = new ArrayList<>(); @@ -13,6 +14,31 @@ public void addCar(Car car) { this.cars.add(car); } + public void proceedGame() { + Random random = new Random(); + this.cars.forEach((car) -> { + int randomNumber = random.nextInt(9); + car.move(randomNumber); + }); + } + + public List getWinners() { + int maxLocation = 0; + List winners = new ArrayList<>(); + + for (Car car : this.cars) { + if (maxLocation < car.getCoordinateX()) { + winners.clear(); + winners.add(car.getName()); + } + + if (maxLocation == car.getCoordinateX()) { + winners.add(car.getName()); + } + } + return winners; + } + public int getCurrentCarCount() { return this.cars.size(); } From 4d8890273b56981a66f8c476df2740291c85c472 Mon Sep 17 00:00:00 2001 From: bingle625 Date: Sat, 12 Oct 2024 09:39:32 +0900 Subject: [PATCH 09/19] =?UTF-8?q?feat:=20randomNumber=EB=A5=BC=20=EB=A7=8C?= =?UTF-8?q?=EB=93=9C=EB=8A=94=20NumberGenrator=20=EC=9D=B8=ED=84=B0?= =?UTF-8?q?=ED=8E=98=EC=9D=B4=EC=8A=A4=20=EB=B6=84=EB=A6=AC?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- src/main/java/Car.java | 15 ++++++--------- src/main/java/NumberGenerator.java | 4 ++++ src/main/java/RacingGame.java | 26 +++++++++++++++----------- src/test/java/CarTest.java | 22 +++++----------------- src/test/java/RacingGameTest.java | 4 ++-- src/test/java/TestNumberGenerator.java | 13 +++++++++++++ 6 files changed, 45 insertions(+), 39 deletions(-) create mode 100644 src/main/java/NumberGenerator.java create mode 100644 src/test/java/TestNumberGenerator.java diff --git a/src/main/java/Car.java b/src/main/java/Car.java index 1cfde04f..710eaaac 100644 --- a/src/main/java/Car.java +++ b/src/main/java/Car.java @@ -2,20 +2,17 @@ public class Car { private int coordinateX; private final String name; + private final NumberGenerator numberGenerator; - public Car(int coordinateX, String name) { + public Car(NumberGenerator numberGenerator, int coordinateX, String name) { + this.numberGenerator = numberGenerator; this.coordinateX = coordinateX; this.name = name; } - /** - * - * @param randomNumber 랜덤 숫자 - */ - public void move(int randomNumber) { - if (randomNumber < 0 || randomNumber > 9) { - throw new IllegalArgumentException("랜덤 숫자가 0과 9 범위 사이가 아닙니다."); - } + public void move() { + int randomNumber = this.numberGenerator.getNumber(); + if (randomNumber >= 4) { this.coordinateX += 1; } diff --git a/src/main/java/NumberGenerator.java b/src/main/java/NumberGenerator.java new file mode 100644 index 00000000..618259ae --- /dev/null +++ b/src/main/java/NumberGenerator.java @@ -0,0 +1,4 @@ +public interface NumberGenerator { + + public int getNumber(); +} diff --git a/src/main/java/RacingGame.java b/src/main/java/RacingGame.java index 53140bd8..89f63ed4 100644 --- a/src/main/java/RacingGame.java +++ b/src/main/java/RacingGame.java @@ -15,10 +15,8 @@ public void addCar(Car car) { } public void proceedGame() { - Random random = new Random(); this.cars.forEach((car) -> { - int randomNumber = random.nextInt(9); - car.move(randomNumber); + car.move(); }); } @@ -27,18 +25,24 @@ public List getWinners() { List winners = new ArrayList<>(); for (Car car : this.cars) { - if (maxLocation < car.getCoordinateX()) { - winners.clear(); - winners.add(car.getName()); - } - - if (maxLocation == car.getCoordinateX()) { - winners.add(car.getName()); - } + getCarWinner(car, maxLocation, winners); } + return winners; } + private static void getCarWinner(final Car car, final int maxLocation, + final List winners) { + if (maxLocation < car.getCoordinateX()) { + winners.clear(); + winners.add(car.getName()); + } + + if (maxLocation == car.getCoordinateX()) { + winners.add(car.getName()); + } + } + public int getCurrentCarCount() { return this.cars.size(); } diff --git a/src/test/java/CarTest.java b/src/test/java/CarTest.java index 9e3b0621..53c16c1e 100644 --- a/src/test/java/CarTest.java +++ b/src/test/java/CarTest.java @@ -10,7 +10,7 @@ public class CarTest { @Test @DisplayName("이름 속성 확인") void testName() { - Car car = new Car(0, "자동차1"); + Car car = new Car(new TestNumberGenerator(3), 0, "자동차1"); String name = car.getName(); @@ -20,10 +20,9 @@ void testName() { @Test @DisplayName("숫자가 4이상일 때 자동차가 움직이는 지 테스트") void testMove() { - Car car = new Car(0, "자동차1"); - int randomNumber = 4; + Car car = new Car(new TestNumberGenerator(4),0, "자동차1"); - car.move(randomNumber); + car.move(); assertThat(car.getCoordinateX()).isEqualTo(1); } @@ -31,21 +30,10 @@ void testMove() { @Test @DisplayName("숫자가 3 이하일 때 자동차가 움직이지 않는 지 테스트") void testNotMove() { - Car car = new Car(0, "자동차1"); - int randomNumber = 3; + Car car = new Car(new TestNumberGenerator(3), 0, "자동차1"); - car.move(randomNumber); + car.move(); assertThat(car.getCoordinateX()).isEqualTo(0); } - - @Test - @DisplayName("예외확인: 랜덤 숫자가 0~9 범위가 아닐 경우 예외 확인") - void testIllegalArgument() { - Car car = new Car(0, "자동차1"); - int randomNumber = 10; - - assertThatThrownBy(() -> car.move(randomNumber)).isInstanceOf(IllegalArgumentException.class) - .hasMessage("랜덤 숫자가 0과 9 범위 사이가 아닙니다."); - } } diff --git a/src/test/java/RacingGameTest.java b/src/test/java/RacingGameTest.java index cf79b017..01f36061 100644 --- a/src/test/java/RacingGameTest.java +++ b/src/test/java/RacingGameTest.java @@ -10,8 +10,8 @@ public class RacingGameTest { @Test @DisplayName("자동차 참여 테스트") void testCarJoin() { - Car car1 = new Car(0, "자동차1"); - Car car2 = new Car(0, "자동차2"); + Car car1 = new Car(new TestNumberGenerator(3), 0, "자동차1"); + Car car2 = new Car(new TestNumberGenerator(4), 0,"자동차2"); RacingGame game1 = new RacingGame(); diff --git a/src/test/java/TestNumberGenerator.java b/src/test/java/TestNumberGenerator.java new file mode 100644 index 00000000..77a56fbf --- /dev/null +++ b/src/test/java/TestNumberGenerator.java @@ -0,0 +1,13 @@ +public class TestNumberGenerator implements NumberGenerator{ + + private final int setNumber; + + public TestNumberGenerator(int number) { + this.setNumber = number; + } + + @Override + public int getNumber() { + return this.setNumber; + } +} From c3647b1047eeebbcad72a6ad1ee6634822861d14 Mon Sep 17 00:00:00 2001 From: bingle625 Date: Sat, 12 Oct 2024 09:48:15 +0900 Subject: [PATCH 10/19] =?UTF-8?q?test:=20=EC=A3=BC=EC=84=9D=20=EC=A0=95?= =?UTF-8?q?=EB=A6=AC=20=EB=B0=8F=20=EB=B3=B5=EC=88=98=20=EC=9A=B0=EC=8A=B9?= =?UTF-8?q?=EC=9E=90=20=ED=85=8C=EC=8A=A4=ED=8A=B8=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/RacingGame.java | 18 +++++++++++--- src/test/java/RacingGameTest.java | 41 ++++++++++++++++++++++++++++++- 2 files changed, 55 insertions(+), 4 deletions(-) diff --git a/src/main/java/RacingGame.java b/src/main/java/RacingGame.java index 89f63ed4..324d7c67 100644 --- a/src/main/java/RacingGame.java +++ b/src/main/java/RacingGame.java @@ -10,16 +10,23 @@ public RacingGame() { this.cars = new ArrayList<>(); } + /** + * @param car 게임 참여 차량 + */ public void addCar(Car car) { this.cars.add(car); } + /** + * 게임 진행 + */ public void proceedGame() { - this.cars.forEach((car) -> { - car.move(); - }); + this.cars.forEach(Car::move); } + /** + * @return winners 현재 우승자 이름 배열 + */ public List getWinners() { int maxLocation = 0; List winners = new ArrayList<>(); @@ -31,6 +38,11 @@ public List getWinners() { return winners; } + /** + * @param car 비교할 자동차 + * @param maxLocation 현재 최고 거리 + * @param winners 우승자 이름 배열 + */ private static void getCarWinner(final Car car, final int maxLocation, final List winners) { if (maxLocation < car.getCoordinateX()) { diff --git a/src/test/java/RacingGameTest.java b/src/test/java/RacingGameTest.java index 01f36061..76fb1b33 100644 --- a/src/test/java/RacingGameTest.java +++ b/src/test/java/RacingGameTest.java @@ -1,6 +1,7 @@ import static org.assertj.core.api.Assertions.assertThat; import static org.assertj.core.api.Assertions.assertThatThrownBy; +import java.util.List; import org.junit.jupiter.api.DisplayName; import org.junit.jupiter.api.Test; @@ -11,7 +12,7 @@ public class RacingGameTest { @DisplayName("자동차 참여 테스트") void testCarJoin() { Car car1 = new Car(new TestNumberGenerator(3), 0, "자동차1"); - Car car2 = new Car(new TestNumberGenerator(4), 0,"자동차2"); + Car car2 = new Car(new TestNumberGenerator(4), 0, "자동차2"); RacingGame game1 = new RacingGame(); @@ -20,4 +21,42 @@ void testCarJoin() { assertThat(game1.getCurrentCarCount()).isEqualTo(2); } + + @Test + @DisplayName("우승자 확인 테스트") + void testRacingWinner() { + Car car1 = new Car(new TestNumberGenerator(3), 0, "자동차1"); + Car car2 = new Car(new TestNumberGenerator(4), 0, "자동차2"); + + RacingGame game1 = new RacingGame(); + game1.addCar(car1); + game1.addCar(car2); + + game1.proceedGame(); + + List winnerNames = game1.getWinners(); + + assertThat(winnerNames).containsExactlyInAnyOrderElementsOf(List.of("자동차2")); + } + + @Test + @DisplayName("복수 우승자 확인 테스트") + void testMultipleWinner() { + Car car0 = new Car(new TestNumberGenerator(3), 0, "자동차0"); + Car car1 = new Car(new TestNumberGenerator(3), 0, "자동차1"); + Car car2 = new Car(new TestNumberGenerator(4), 0, "자동차2"); + Car car3 = new Car(new TestNumberGenerator(4), 0, "자동차3"); + + RacingGame game1 = new RacingGame(); + game1.addCar(car0); + game1.addCar(car1); + game1.addCar(car2); + game1.addCar(car3); + + game1.proceedGame(); + + List winnerNames = game1.getWinners(); + + assertThat(winnerNames).containsExactlyInAnyOrderElementsOf(List.of("자동차3","자동차2")); + } } From fe72b380503ade1ad91d830037db02daee160819 Mon Sep 17 00:00:00 2001 From: bingle625 Date: Sat, 12 Oct 2024 10:00:55 +0900 Subject: [PATCH 11/19] =?UTF-8?q?fix:=20=EC=9A=B0=EC=8A=B9=EC=9E=90=20?= =?UTF-8?q?=EA=B5=AC=ED=95=A0=20=EC=8B=9C=EC=97=90=20=EB=A1=9C=EC=A7=81=20?= =?UTF-8?q?=EC=83=81=20=EC=98=A4=EB=A5=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/RacingGame.java | 34 +++++++++++-------------------- src/test/java/RacingGameTest.java | 2 +- 2 files changed, 13 insertions(+), 23 deletions(-) diff --git a/src/main/java/RacingGame.java b/src/main/java/RacingGame.java index 324d7c67..4c7538ad 100644 --- a/src/main/java/RacingGame.java +++ b/src/main/java/RacingGame.java @@ -10,6 +10,10 @@ public RacingGame() { this.cars = new ArrayList<>(); } + public int getCurrentCarCount() { + return this.cars.size(); + } + /** * @param car 게임 참여 차량 */ @@ -32,30 +36,16 @@ public List getWinners() { List winners = new ArrayList<>(); for (Car car : this.cars) { - getCarWinner(car, maxLocation, winners); + int carLocation = car.getCoordinateX(); + if (maxLocation < carLocation) { + maxLocation = carLocation; + winners.clear(); + winners.add(car.getName()); + }else if (maxLocation == carLocation) { + winners.add(car.getName()); + } } return winners; } - - /** - * @param car 비교할 자동차 - * @param maxLocation 현재 최고 거리 - * @param winners 우승자 이름 배열 - */ - private static void getCarWinner(final Car car, final int maxLocation, - final List winners) { - if (maxLocation < car.getCoordinateX()) { - winners.clear(); - winners.add(car.getName()); - } - - if (maxLocation == car.getCoordinateX()) { - winners.add(car.getName()); - } - } - - public int getCurrentCarCount() { - return this.cars.size(); - } } diff --git a/src/test/java/RacingGameTest.java b/src/test/java/RacingGameTest.java index 76fb1b33..f16ece40 100644 --- a/src/test/java/RacingGameTest.java +++ b/src/test/java/RacingGameTest.java @@ -57,6 +57,6 @@ void testMultipleWinner() { List winnerNames = game1.getWinners(); - assertThat(winnerNames).containsExactlyInAnyOrderElementsOf(List.of("자동차3","자동차2")); + assertThat(winnerNames).containsExactlyInAnyOrderElementsOf(List.of("자동차3", "자동차2")); } } From 43c5f4c06e73d1c9e38e3025a0b41556329d1c0b Mon Sep 17 00:00:00 2001 From: bingle625 Date: Sat, 12 Oct 2024 10:48:59 +0900 Subject: [PATCH 12/19] =?UTF-8?q?feat:=20=EB=AC=B4=EC=9E=91=EC=9C=84=20num?= =?UTF-8?q?berGenerator=20=ED=81=B4=EB=9E=98=EC=8A=A4=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/RandomNumberGenerator.java | 16 ++++++++++++++++ 1 file changed, 16 insertions(+) create mode 100644 src/main/java/RandomNumberGenerator.java diff --git a/src/main/java/RandomNumberGenerator.java b/src/main/java/RandomNumberGenerator.java new file mode 100644 index 00000000..73ee6ba1 --- /dev/null +++ b/src/main/java/RandomNumberGenerator.java @@ -0,0 +1,16 @@ +import java.security.SecureRandom; +import java.util.Random; + +public class RandomNumberGenerator implements NumberGenerator{ + + private final SecureRandom secureRandom; + + public RandomNumberGenerator() { + this.secureRandom = new SecureRandom(); + } + + @Override + public int getNumber() { + return this.secureRandom.nextInt(9); + } +} From c74a2cdccc5886577c9a3ad4b5f9d83a6444a970 Mon Sep 17 00:00:00 2001 From: bingle625 Date: Sat, 12 Oct 2024 10:49:32 +0900 Subject: [PATCH 13/19] =?UTF-8?q?refactor:=20=EB=A9=94=EC=84=9C=EB=93=9C?= =?UTF-8?q?=EB=AA=85=20=EB=B3=80=EA=B2=BD?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit - winnerNames를 가져온다는 조금더 명시적인 이름으로 변경 --- src/main/java/RacingGame.java | 7 +++++-- src/test/java/RacingGameTest.java | 4 ++-- 2 files changed, 7 insertions(+), 4 deletions(-) diff --git a/src/main/java/RacingGame.java b/src/main/java/RacingGame.java index 4c7538ad..25950ee8 100644 --- a/src/main/java/RacingGame.java +++ b/src/main/java/RacingGame.java @@ -1,11 +1,14 @@ import java.util.ArrayList; import java.util.List; -import java.util.Random; public class RacingGame { private final List cars; + public List getCars() { + return this.cars; + } + public RacingGame() { this.cars = new ArrayList<>(); } @@ -31,7 +34,7 @@ public void proceedGame() { /** * @return winners 현재 우승자 이름 배열 */ - public List getWinners() { + public List getWinnerNames() { int maxLocation = 0; List winners = new ArrayList<>(); diff --git a/src/test/java/RacingGameTest.java b/src/test/java/RacingGameTest.java index f16ece40..d1590c20 100644 --- a/src/test/java/RacingGameTest.java +++ b/src/test/java/RacingGameTest.java @@ -34,7 +34,7 @@ void testRacingWinner() { game1.proceedGame(); - List winnerNames = game1.getWinners(); + List winnerNames = game1.getWinnerNames(); assertThat(winnerNames).containsExactlyInAnyOrderElementsOf(List.of("자동차2")); } @@ -55,7 +55,7 @@ void testMultipleWinner() { game1.proceedGame(); - List winnerNames = game1.getWinners(); + List winnerNames = game1.getWinnerNames(); assertThat(winnerNames).containsExactlyInAnyOrderElementsOf(List.of("자동차3", "자동차2")); } From ccf524ede6a6f3a24f457c78854caf6d43699d3f Mon Sep 17 00:00:00 2001 From: bingle625 Date: Sat, 12 Oct 2024 10:49:53 +0900 Subject: [PATCH 14/19] =?UTF-8?q?feat:=20=EC=9E=90=EB=8F=99=EC=B0=A8=20?= =?UTF-8?q?=EA=B2=BD=EC=A3=BC=20=EA=B2=8C=EC=9E=84=20=EB=A9=94=EC=9D=B8?= =?UTF-8?q?=EB=A9=94=EC=84=9C=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 --- README.md | 34 ++++++++++++++--------- src/main/java/RacingGameHost.java | 45 +++++++++++++++++++++++++++++++ 2 files changed, 66 insertions(+), 13 deletions(-) create mode 100644 src/main/java/RacingGameHost.java diff --git a/README.md b/README.md index 90f5f91a..aee219d8 100644 --- a/README.md +++ b/README.md @@ -20,17 +20,25 @@ - [x] 자동차 움직임 기능 확인 ## 2. 우승 자동차 구하기 -- [ ] 경주 게임 구현 - - [ ] n대의 자동차가 참여 가능 - - [ ] 횟수 x 번 동안 각 자동차 전진 혹은 정지 - - [ ] 경주 게임 완료 후 우승 자동차(중복 가능) 확인 가능 -- [ ] 코드 컨벤션 +- [x] 경주 게임 구현 + - [x] n대의 자동차가 참여 가능 + - [x] 횟수 x 번 동안 각 자동차 전진 혹은 정지 + - [x] 경주 게임 완료 후 우승 자동차(중복 가능) 확인 가능 +- [x] 코드 컨벤션 - [ ] 인덴트 2를 넘지 않도록 구현 - - [ ] 3항 연산자 사용 X - - [ ] `else` 사용 X - - [ ] `switch/case` 사용 X - - [ ] 메서드의 길이 15라인을 넘지 않도록 - - [ ] 메서드는 하나의 일만 수행하도록 - - [ ] 메인 메서드는 생성 X -- [ ] 테스트 코드 - - [ ] 자동차 움직임 기능 확인 \ No newline at end of file + - [x] 3항 연산자 사용 X + - [x] `else` 사용 X + - [x] `switch/case` 사용 X + - [x] 메서드의 길이 15라인을 넘지 않도록 + - [x] 메서드는 하나의 일만 수행하도록 + - [x] 메인 메서드는 생성 X +- [x] 테스트 코드 + - [x] 자동차 움직임 기능 확인 + +## 3. 게임 실행 +- [X] 주어진 횟수 동안 n대의 자동차는 전진 또는 멈출 수 있다. +- [X] 각 자동차에 이름을 부여할 수 있다. 전진하는 자동차를 출력할 때 자동차 이름을 같이 출력한다. +- [X] 자동차 이름은 쉼표(,)를 기준으로 구분하며 이름은 5자 이하만 가능하다. +- [X] 사용자는 몇 번의 이동을 할 것인지를 입력할 수 있어야 한다. +- [X] 전진하는 조건은 0에서 9 사이에서 random 값을 구한 후 random 값이 4 이상일 경우 전진하고, 3 이하의 값이면 멈춘다. +- [X] 자동차 경주 게임을 완료한 후 누가 우승했는지를 알려준다. 우승자는 한 명 이상일 수 있다. \ No newline at end of file diff --git a/src/main/java/RacingGameHost.java b/src/main/java/RacingGameHost.java new file mode 100644 index 00000000..b3a6abe4 --- /dev/null +++ b/src/main/java/RacingGameHost.java @@ -0,0 +1,45 @@ +import java.util.Arrays; +import java.util.List; +import java.util.Scanner; + +public class RacingGameHost { + + public static void main(String[] args) { + Scanner sc = new Scanner(System.in); + System.out.println("경주할 자동차 이름을 입력하세요(이름은 쉼표(,)를 기준으로 구분)."); + String nameInput = sc.nextLine(); + System.out.println("시도할 회수는 몇회인가요?"); + int count = sc.nextInt(); + + RacingGame game = new RacingGame(); + List names = Arrays.stream(nameInput.split(",")) + .map(String::strip) + .toList(); + + for (String name : names) { + game.addCar(new Car(new RandomNumberGenerator(), 0, name)); + } + + List cars = game.getCars(); + for (int i = 0; i < count; i++) { + game.proceedGame(); + projectCars(cars); + System.out.println(); + } + + projectWinners(game); + } + + private static void projectWinners(final RacingGame game) { + List winnerNames = game.getWinnerNames(); + System.out.println(String.join(",", winnerNames) + "가 최종우승했습니다."); + } + + private static void projectCars(List cars) { + cars.forEach((car) -> { + String progressBar = "-".repeat(car.getCoordinateX()); + System.out.println(car.getName() + " : " + progressBar); + }); + } + +} From 4d5d8f4c8723d3b55217783cc6b18a199587c018 Mon Sep 17 00:00:00 2001 From: bingle625 Date: Sat, 12 Oct 2024 15:17:36 +0900 Subject: [PATCH 15/19] =?UTF-8?q?refactor:=20RacingGameHost=20=ED=81=B4?= =?UTF-8?q?=EB=9E=98=EC=8A=A4=20=EC=99=80=20Application=20=ED=81=B4?= =?UTF-8?q?=EB=9E=98=EC=8A=A4=20=EB=B6=84=EB=A6=AC?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- src/main/java/Application.java | 33 +++++++++++++++++++++++++++++++ src/main/java/RacingGameHost.java | 30 ++-------------------------- 2 files changed, 35 insertions(+), 28 deletions(-) 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..e5918892 --- /dev/null +++ b/src/main/java/Application.java @@ -0,0 +1,33 @@ +import java.util.Arrays; +import java.util.List; +import java.util.Scanner; + +public class Application { + + public static void main(String[] args) { + Scanner sc = new Scanner(System.in); + System.out.println("경주할 자동차 이름을 입력하세요(이름은 쉼표(,)를 기준으로 구분)."); + String nameInput = sc.nextLine(); + System.out.println("시도할 회수는 몇회인가요?"); + int count = sc.nextInt(); + + RacingGame game = new RacingGame(); + List names = Arrays.stream(nameInput.split(",")) + .map(String::strip) + .toList(); + + for (String name : names) { + game.addCar(new Car(new RandomNumberGenerator(), 0, name)); + } + + List cars = game.getCars(); + for (int i = 0; i < count; i++) { + game.proceedGame(); + RacingGameHost.projectCars(cars); + System.out.println(); + } + + RacingGameHost.projectWinners(game); + } + +} diff --git a/src/main/java/RacingGameHost.java b/src/main/java/RacingGameHost.java index b3a6abe4..b894f52c 100644 --- a/src/main/java/RacingGameHost.java +++ b/src/main/java/RacingGameHost.java @@ -4,38 +4,12 @@ public class RacingGameHost { - public static void main(String[] args) { - Scanner sc = new Scanner(System.in); - System.out.println("경주할 자동차 이름을 입력하세요(이름은 쉼표(,)를 기준으로 구분)."); - String nameInput = sc.nextLine(); - System.out.println("시도할 회수는 몇회인가요?"); - int count = sc.nextInt(); - - RacingGame game = new RacingGame(); - List names = Arrays.stream(nameInput.split(",")) - .map(String::strip) - .toList(); - - for (String name : names) { - game.addCar(new Car(new RandomNumberGenerator(), 0, name)); - } - - List cars = game.getCars(); - for (int i = 0; i < count; i++) { - game.proceedGame(); - projectCars(cars); - System.out.println(); - } - - projectWinners(game); - } - - private static void projectWinners(final RacingGame game) { + public static void projectWinners(final RacingGame game) { List winnerNames = game.getWinnerNames(); System.out.println(String.join(",", winnerNames) + "가 최종우승했습니다."); } - private static void projectCars(List cars) { + public static void projectCars(List cars) { cars.forEach((car) -> { String progressBar = "-".repeat(car.getCoordinateX()); System.out.println(car.getName() + " : " + progressBar); From 44f8134034638e6756096a4dfe4bce154a952d73 Mon Sep 17 00:00:00 2001 From: bingle625 Date: Sat, 12 Oct 2024 15:28:43 +0900 Subject: [PATCH 16/19] =?UTF-8?q?refactor:=20Application=EC=97=90=EC=84=9C?= =?UTF-8?q?=20view=20=EC=BD=94=EB=93=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/java/Application.java | 22 ++++--------------- src/main/java/RacingGame.java | 36 ++++++++++++++++++++++++++++--- src/main/java/RacingGameHost.java | 22 ++++++++++++++++++- 3 files changed, 58 insertions(+), 22 deletions(-) diff --git a/src/main/java/Application.java b/src/main/java/Application.java index e5918892..216d6c25 100644 --- a/src/main/java/Application.java +++ b/src/main/java/Application.java @@ -6,28 +6,14 @@ public class Application { public static void main(String[] args) { Scanner sc = new Scanner(System.in); - System.out.println("경주할 자동차 이름을 입력하세요(이름은 쉼표(,)를 기준으로 구분)."); - String nameInput = sc.nextLine(); - System.out.println("시도할 회수는 몇회인가요?"); - int count = sc.nextInt(); - RacingGame game = new RacingGame(); - List names = Arrays.stream(nameInput.split(",")) - .map(String::strip) - .toList(); + String namesText = RacingGameHost.getCarNames(sc); + int round = RacingGameHost.getCount(sc); - for (String name : names) { - game.addCar(new Car(new RandomNumberGenerator(), 0, name)); - } + RacingGame game = new RacingGame(namesText, round); - List cars = game.getCars(); - for (int i = 0; i < count; i++) { - game.proceedGame(); - RacingGameHost.projectCars(cars); - System.out.println(); - } + RacingGameHost.playGame(game); RacingGameHost.projectWinners(game); } - } diff --git a/src/main/java/RacingGame.java b/src/main/java/RacingGame.java index 25950ee8..d595d3ed 100644 --- a/src/main/java/RacingGame.java +++ b/src/main/java/RacingGame.java @@ -1,16 +1,46 @@ import java.util.ArrayList; +import java.util.Arrays; import java.util.List; public class RacingGame { private final List cars; + private final int round; + + /** + * Constructor `self` + */ + public RacingGame() { + this.cars = new ArrayList<>(); + this.round = 0; + } + + /** + * Constructor `self` + * + * @param namesText 입력받은 차량 이름 텍스트 + * @param round 입력받은 게임 라운드 수 + */ + public RacingGame(String namesText, int round) { + this.round = round; + this.cars = new ArrayList<>(); + + List names = Arrays.stream(namesText.split(",")) + .map(String::strip) + .toList(); + + for (String name : names) { + this.addCar(new Car(new RandomNumberGenerator(), 0, name)); + } + } public List getCars() { return this.cars; } - public RacingGame() { - this.cars = new ArrayList<>(); + + public int getRound() { + return this.round; } public int getCurrentCarCount() { @@ -44,7 +74,7 @@ public List getWinnerNames() { maxLocation = carLocation; winners.clear(); winners.add(car.getName()); - }else if (maxLocation == carLocation) { + } else if (maxLocation == carLocation) { winners.add(car.getName()); } } diff --git a/src/main/java/RacingGameHost.java b/src/main/java/RacingGameHost.java index b894f52c..342b85de 100644 --- a/src/main/java/RacingGameHost.java +++ b/src/main/java/RacingGameHost.java @@ -1,9 +1,18 @@ -import java.util.Arrays; import java.util.List; import java.util.Scanner; public class RacingGameHost { + public static String getCarNames(final Scanner sc) { + System.out.println("경주할 자동차 이름을 입력하세요(이름은 쉼표(,)를 기준으로 구분)."); + return sc.nextLine(); + } + + public static int getCount(final Scanner sc) { + System.out.println("시도할 회수는 몇회인가요?"); + return sc.nextInt(); + } + public static void projectWinners(final RacingGame game) { List winnerNames = game.getWinnerNames(); System.out.println(String.join(",", winnerNames) + "가 최종우승했습니다."); @@ -16,4 +25,15 @@ public static void projectCars(List cars) { }); } + + public static void playGame(final RacingGame game) { + List cars = game.getCars(); + + for (int i = 0; i < game.getRound(); i++) { + game.proceedGame(); + RacingGameHost.projectCars(cars); + System.out.println(); + } + + } } From 0d474fd117a8b0edcaa8fb3ea73f353e410cf21d Mon Sep 17 00:00:00 2001 From: bingle625 Date: Sun, 13 Oct 2024 14:23:59 +0900 Subject: [PATCH 17/19] =?UTF-8?q?refactor:=20=EC=9E=90=EB=8F=99=EC=B0=A8?= =?UTF-8?q?=20names=20array=EB=A1=9C=20=EC=9E=85=EB=A0=A5=EB=B0=9B?= =?UTF-8?q?=EB=8A=94=20=EB=A1=9C=EC=A7=81=20RacingGameHost=EB=A1=9C=20?= =?UTF-8?q?=EC=9D=B4=EB=8F=99=20=EB=B0=8F=20exception=20=EC=B6=94=EA=B0=80?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit - 5자 이하 입력만 가능하도록 exception 추가 --- src/main/java/Application.java | 5 +-- .../InvalidCarNameLengthException.java | 6 ++++ src/main/java/Exceptions/RacingException.java | 5 +++ src/main/java/RacingGame.java | 8 ++--- src/main/java/RacingGameHost.java | 31 ++++++++++++++++--- 5 files changed, 43 insertions(+), 12 deletions(-) create mode 100644 src/main/java/Exceptions/InvalidCarNameLengthException.java create mode 100644 src/main/java/Exceptions/RacingException.java diff --git a/src/main/java/Application.java b/src/main/java/Application.java index 216d6c25..9bd76eca 100644 --- a/src/main/java/Application.java +++ b/src/main/java/Application.java @@ -1,3 +1,4 @@ +import Exceptions.InvalidCarNameLengthException; import java.util.Arrays; import java.util.List; import java.util.Scanner; @@ -7,10 +8,10 @@ public class Application { public static void main(String[] args) { Scanner sc = new Scanner(System.in); - String namesText = RacingGameHost.getCarNames(sc); + List names = RacingGameHost.getCarNames(sc); int round = RacingGameHost.getCount(sc); - RacingGame game = new RacingGame(namesText, round); + RacingGame game = new RacingGame(names, round); RacingGameHost.playGame(game); diff --git a/src/main/java/Exceptions/InvalidCarNameLengthException.java b/src/main/java/Exceptions/InvalidCarNameLengthException.java new file mode 100644 index 00000000..cb2f17fc --- /dev/null +++ b/src/main/java/Exceptions/InvalidCarNameLengthException.java @@ -0,0 +1,6 @@ +package Exceptions; + +public class InvalidCarNameLengthException extends IllegalArgumentException implements + RacingException { + +} diff --git a/src/main/java/Exceptions/RacingException.java b/src/main/java/Exceptions/RacingException.java new file mode 100644 index 00000000..b9dc94a5 --- /dev/null +++ b/src/main/java/Exceptions/RacingException.java @@ -0,0 +1,5 @@ +package Exceptions; + +public interface RacingException { + +} diff --git a/src/main/java/RacingGame.java b/src/main/java/RacingGame.java index d595d3ed..6c053cf5 100644 --- a/src/main/java/RacingGame.java +++ b/src/main/java/RacingGame.java @@ -18,17 +18,13 @@ public RacingGame() { /** * Constructor `self` * - * @param namesText 입력받은 차량 이름 텍스트 + * @param names 입력받은 차량 이름들 * @param round 입력받은 게임 라운드 수 */ - public RacingGame(String namesText, int round) { + public RacingGame(List names, int round) { this.round = round; this.cars = new ArrayList<>(); - List names = Arrays.stream(namesText.split(",")) - .map(String::strip) - .toList(); - for (String name : names) { this.addCar(new Car(new RandomNumberGenerator(), 0, name)); } diff --git a/src/main/java/RacingGameHost.java b/src/main/java/RacingGameHost.java index 342b85de..10a59643 100644 --- a/src/main/java/RacingGameHost.java +++ b/src/main/java/RacingGameHost.java @@ -1,11 +1,34 @@ +import Exceptions.InvalidCarNameLengthException; +import java.util.Arrays; import java.util.List; import java.util.Scanner; public class RacingGameHost { - public static String getCarNames(final Scanner sc) { - System.out.println("경주할 자동차 이름을 입력하세요(이름은 쉼표(,)를 기준으로 구분)."); - return sc.nextLine(); + public static List getCarNames(final Scanner sc) { + List result = null; + while (result == null) { + System.out.println("경주할 자동차 이름을 입력하세요(이름은 쉼표(,)를 기준으로 구분)."); + String namesText = sc.nextLine(); + + try { + result = Arrays.stream(namesText.split(",")) + .map(String::strip) + .peek(RacingGameHost::checkNameLength) + .toList(); + } catch (InvalidCarNameLengthException exception) { + System.out.println("이름은 5자 이하만 입력 가능합니다."); + } + + } + + return result; + } + + private static void checkNameLength(final String name) { + if (name.length() > 5) { + throw new InvalidCarNameLengthException(); + } } public static int getCount(final Scanner sc) { @@ -25,7 +48,7 @@ public static void projectCars(List cars) { }); } - + public static void playGame(final RacingGame game) { List cars = game.getCars(); From 95e3a35c7121ea6ed124ce3e3563a33dd0057aff Mon Sep 17 00:00:00 2001 From: bingle625 Date: Sun, 13 Oct 2024 14:31:54 +0900 Subject: [PATCH 18/19] =?UTF-8?q?refactor:=20=ED=94=84=EB=A1=9C=EB=8D=95?= =?UTF-8?q?=EC=85=98=EC=97=90=EC=84=9C=20Car=20=EC=83=9D=EC=84=B1=20?= =?UTF-8?q?=EB=A9=94=EC=84=9C=EB=93=9C=20=EC=B6=94=EA=B0=80?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit - Car의 static 메서드로 추가 --- src/main/java/Car.java | 4 ++++ src/main/java/RacingGame.java | 2 +- 2 files changed, 5 insertions(+), 1 deletion(-) diff --git a/src/main/java/Car.java b/src/main/java/Car.java index 710eaaac..103fcfad 100644 --- a/src/main/java/Car.java +++ b/src/main/java/Car.java @@ -4,6 +4,10 @@ public class Car { private final String name; private final NumberGenerator numberGenerator; + public static Car makeCar(String name) { + return new Car(new RandomNumberGenerator(), 0, name); + } + public Car(NumberGenerator numberGenerator, int coordinateX, String name) { this.numberGenerator = numberGenerator; this.coordinateX = coordinateX; diff --git a/src/main/java/RacingGame.java b/src/main/java/RacingGame.java index 6c053cf5..8a9878ea 100644 --- a/src/main/java/RacingGame.java +++ b/src/main/java/RacingGame.java @@ -26,7 +26,7 @@ public RacingGame(List names, int round) { this.cars = new ArrayList<>(); for (String name : names) { - this.addCar(new Car(new RandomNumberGenerator(), 0, name)); + this.addCar(Car.makeCar(name)); } } From e7257ab5ce1d188c9bd3a9d996c9a9b2b0faa3a9 Mon Sep 17 00:00:00 2001 From: bingle625 Date: Sun, 13 Oct 2024 14:33:40 +0900 Subject: [PATCH 19/19] =?UTF-8?q?refactor:=20=ED=95=84=EC=9A=94=20?= =?UTF-8?q?=EC=97=86=EB=8A=94=20=EB=A9=94=EC=84=9C=EB=93=9C=20=EC=82=AD?= =?UTF-8?q?=EC=A0=9C?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- src/main/java/RacingGame.java | 4 ---- src/test/java/RacingGameTest.java | 2 +- 2 files changed, 1 insertion(+), 5 deletions(-) diff --git a/src/main/java/RacingGame.java b/src/main/java/RacingGame.java index 8a9878ea..e25b6092 100644 --- a/src/main/java/RacingGame.java +++ b/src/main/java/RacingGame.java @@ -39,10 +39,6 @@ public int getRound() { return this.round; } - public int getCurrentCarCount() { - return this.cars.size(); - } - /** * @param car 게임 참여 차량 */ diff --git a/src/test/java/RacingGameTest.java b/src/test/java/RacingGameTest.java index d1590c20..6f56fd1f 100644 --- a/src/test/java/RacingGameTest.java +++ b/src/test/java/RacingGameTest.java @@ -19,7 +19,7 @@ void testCarJoin() { game1.addCar(car1); game1.addCar(car2); - assertThat(game1.getCurrentCarCount()).isEqualTo(2); + assertThat(game1.getCars().size()).isEqualTo(2); } @Test