From 35a2bdc34708884eabd711d7db987de5c085d500 Mon Sep 17 00:00:00 2001 From: heehun Date: Tue, 10 Sep 2024 18:21:36 +0900 Subject: [PATCH 1/7] =?UTF-8?q?feat=20:=20=EC=9E=90=EB=8F=99=EC=B0=A8=5F?= =?UTF-8?q?=EC=9D=B4=EB=A6=84=5F=EC=9C=A0=ED=9A=A8=EC=84=B1?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- README.md | 29 +++---------------- .../racingcarGameTest/utils/Validation.java | 7 +++++ .../ValidationUtilsTest.java | 16 ++++++++++ 3 files changed, 27 insertions(+), 25 deletions(-) create mode 100644 src/main/java/racingcarGameTest/utils/Validation.java create mode 100644 src/test/java/racingcarGameTest/ValidationUtilsTest.java diff --git a/README.md b/README.md index 8fe711203..9036163bb 100644 --- a/README.md +++ b/README.md @@ -1,26 +1,5 @@ -## [NEXTSTEP 플레이그라운드의 미션 진행 과정](https://github.com/next-step/nextstep-docs/blob/master/playground/README.md) +자동차 클래스, +---- +## 1. 자동차 이름 유효성 ---- -## 학습 효과를 높이기 위해 추천하는 미션 진행 방법 - ---- -1. 피드백 강의 전까지 미션 진행 -> 피드백 강의 전까지 혼자 힘으로 미션 진행. 미션을 진행하면서 하나의 작업이 끝날 때 마다 add, commit -> 예를 들어 다음 숫자 야구 게임의 경우 0, 1, 2단계까지 구현을 완료한 후 push - -![mission baseball](https://raw.githubusercontent.com/next-step/nextstep-docs/master/playground/images/mission_baseball.png) - ---- -2. 피드백 앞 단계까지 미션 구현을 완료한 후 피드백 강의를 학습한다. - ---- -3. Git 브랜치를 master 또는 main으로 변경한 후 피드백을 반영하기 위한 새로운 브랜치를 생성한 후 처음부터 다시 미션 구현을 도전한다. - -``` -git branch -a // 모든 로컬 브랜치 확인 -git checkout master // 기본 브랜치가 master인 경우 -git checkout main // 기본 브랜치가 main인 경우 - -git checkout -b 브랜치이름 -ex) git checkout -b apply-feedback -``` +## 2. diff --git a/src/main/java/racingcarGameTest/utils/Validation.java b/src/main/java/racingcarGameTest/utils/Validation.java new file mode 100644 index 000000000..34909b3d9 --- /dev/null +++ b/src/main/java/racingcarGameTest/utils/Validation.java @@ -0,0 +1,7 @@ +package racingcarGameTest.utils; + +public class Validation { + public static boolean carNameValidator(String carName) { + return carName.length() <= 5; + } +} diff --git a/src/test/java/racingcarGameTest/ValidationUtilsTest.java b/src/test/java/racingcarGameTest/ValidationUtilsTest.java new file mode 100644 index 000000000..3d5eb71c5 --- /dev/null +++ b/src/test/java/racingcarGameTest/ValidationUtilsTest.java @@ -0,0 +1,16 @@ +package racingcarGameTest; + +import org.assertj.core.api.Assertions; +import org.junit.jupiter.api.Test; +import racingcarGameTest.utils.Validation; + +public class ValidationUtilsTest { + + @Test + void 자동차_이름_유효성() { + String name = "carname"; + Assertions.assertThat(Validation.carNameValidator(name)) + .isEqualTo(false); + } + +} From bc9cd19579f7e889020419ce7f08df221ebd0d27 Mon Sep 17 00:00:00 2001 From: heehun Date: Tue, 10 Sep 2024 18:44:44 +0900 Subject: [PATCH 2/7] =?UTF-8?q?feat:=20=EC=9E=90=EB=8F=99=EC=B0=A8=5F1?= =?UTF-8?q?=EA=B0=9C=5F=ED=81=B4=EB=9E=98=EC=8A=A4?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- README.md | 6 ++++- src/main/java/racingcarGame/Car.java | 22 ++++++++++++++++ .../utils/Validation.java | 2 +- src/test/java/racingcarGame/CarTest.java | 25 +++++++++++++++++++ src/test/java/racingcarGame/MoveTest.java | 4 +++ .../ValidationUtilsTest.java | 6 +++-- 6 files changed, 61 insertions(+), 4 deletions(-) create mode 100644 src/main/java/racingcarGame/Car.java rename src/main/java/{racingcarGameTest => racingcarGame}/utils/Validation.java (80%) create mode 100644 src/test/java/racingcarGame/CarTest.java create mode 100644 src/test/java/racingcarGame/MoveTest.java rename src/test/java/{racingcarGameTest => racingcarGame}/ValidationUtilsTest.java (81%) diff --git a/README.md b/README.md index 9036163bb..f2e117321 100644 --- a/README.md +++ b/README.md @@ -2,4 +2,8 @@ ---- ## 1. 자동차 이름 유효성 -## 2. +## 2. 자동차 1개 클래스 + +## 3. 자동차 클래스에 race 메소드 or Race 메소드 +동작과 데이터를 완전 분리 + 일급 컬렉션 List -> Cars +후자로 해보자. diff --git a/src/main/java/racingcarGame/Car.java b/src/main/java/racingcarGame/Car.java new file mode 100644 index 000000000..aba99fae3 --- /dev/null +++ b/src/main/java/racingcarGame/Car.java @@ -0,0 +1,22 @@ +package racingcarGame; + +public class Car { + public String getName() { + return name; + } + + public int getLocation() { + return location; + } + + String name; + int location; + + Car(String name) { + if (name.length() > 5) { + throw new IllegalArgumentException(); + } + this.name = name; + this.location = 0; + } +} diff --git a/src/main/java/racingcarGameTest/utils/Validation.java b/src/main/java/racingcarGame/utils/Validation.java similarity index 80% rename from src/main/java/racingcarGameTest/utils/Validation.java rename to src/main/java/racingcarGame/utils/Validation.java index 34909b3d9..3ef14a13c 100644 --- a/src/main/java/racingcarGameTest/utils/Validation.java +++ b/src/main/java/racingcarGame/utils/Validation.java @@ -1,4 +1,4 @@ -package racingcarGameTest.utils; +package racingcarGame.utils; public class Validation { public static boolean carNameValidator(String carName) { diff --git a/src/test/java/racingcarGame/CarTest.java b/src/test/java/racingcarGame/CarTest.java new file mode 100644 index 000000000..975d69fa1 --- /dev/null +++ b/src/test/java/racingcarGame/CarTest.java @@ -0,0 +1,25 @@ +package racingcarGame; + +import org.junit.jupiter.api.Test; + +import static org.assertj.core.api.Assertions.*; + +public class CarTest { + + @Test + void 차_1개_생성_테스트() throws Exception { + Car car1 = new Car("hhj12"); + assertThat(car1).isNotEqualTo(null); + assertThat(car1.getLocation()).isEqualTo(0); + assertThat(car1.getName()).isEqualTo("hhj12"); + } + + @Test + void 차_1개_생성_이름_유효성_테스트() throws Exception { + assertThatThrownBy(()->{ + Car car2 = new Car("heehun"); + }).isInstanceOf(IllegalArgumentException.class); + } + + +} diff --git a/src/test/java/racingcarGame/MoveTest.java b/src/test/java/racingcarGame/MoveTest.java new file mode 100644 index 000000000..ddcb9a28a --- /dev/null +++ b/src/test/java/racingcarGame/MoveTest.java @@ -0,0 +1,4 @@ +package racingcarGame; + +public class MoveTest { +} diff --git a/src/test/java/racingcarGameTest/ValidationUtilsTest.java b/src/test/java/racingcarGame/ValidationUtilsTest.java similarity index 81% rename from src/test/java/racingcarGameTest/ValidationUtilsTest.java rename to src/test/java/racingcarGame/ValidationUtilsTest.java index 3d5eb71c5..f6b50df67 100644 --- a/src/test/java/racingcarGameTest/ValidationUtilsTest.java +++ b/src/test/java/racingcarGame/ValidationUtilsTest.java @@ -1,8 +1,8 @@ -package racingcarGameTest; +package racingcarGame; import org.assertj.core.api.Assertions; import org.junit.jupiter.api.Test; -import racingcarGameTest.utils.Validation; +import racingcarGame.utils.Validation; public class ValidationUtilsTest { @@ -13,4 +13,6 @@ public class ValidationUtilsTest { .isEqualTo(false); } + + } From c104374baaaf4a783de13612421db788700073aa Mon Sep 17 00:00:00 2001 From: heehun Date: Tue, 10 Sep 2024 19:12:52 +0900 Subject: [PATCH 3/7] feat: input split --- README.md | 5 ++++- src/main/java/racingcarGame/Race.java | 22 +++++++++++++++++++ .../java/racingcarGame/utils/SplitNames.java | 7 ++++++ src/test/java/racingcarGame/MoveTest.java | 4 ---- src/test/java/racingcarGame/RaceTest.java | 17 ++++++++++++++ .../java/racingcarGame/splitUtilsTest.java | 18 +++++++++++++++ 6 files changed, 68 insertions(+), 5 deletions(-) create mode 100644 src/main/java/racingcarGame/Race.java create mode 100644 src/main/java/racingcarGame/utils/SplitNames.java delete mode 100644 src/test/java/racingcarGame/MoveTest.java create mode 100644 src/test/java/racingcarGame/RaceTest.java create mode 100644 src/test/java/racingcarGame/splitUtilsTest.java diff --git a/README.md b/README.md index f2e117321..ef4b412e9 100644 --- a/README.md +++ b/README.md @@ -5,5 +5,8 @@ ## 2. 자동차 1개 클래스 ## 3. 자동차 클래스에 race 메소드 or Race 메소드 -동작과 데이터를 완전 분리 + 일급 컬렉션 List -> Cars +작과 데이터를 완전 분리 + 일급 컬렉션 List -> Cars 후자로 해보자. +3-1. race 메소드 할 때 Race 클래스의 멤버 변수인 Car에 접근해야하는데, +해당 메소드가 public 이면 setter써서 하는게 좋나 ? + diff --git a/src/main/java/racingcarGame/Race.java b/src/main/java/racingcarGame/Race.java new file mode 100644 index 000000000..a912ed495 --- /dev/null +++ b/src/main/java/racingcarGame/Race.java @@ -0,0 +1,22 @@ +package racingcarGame; + +public class Race { + + public Car getCar() { + return car; + } + + private final Car car; + + public Race(Car car) { + this.car = car; + } + + public Car race() { + Car car = getCar(); + car.location += 1; + return car; + } + + +} diff --git a/src/main/java/racingcarGame/utils/SplitNames.java b/src/main/java/racingcarGame/utils/SplitNames.java new file mode 100644 index 000000000..15f9b5c4c --- /dev/null +++ b/src/main/java/racingcarGame/utils/SplitNames.java @@ -0,0 +1,7 @@ +package racingcarGame.utils; + +public class SplitNames { + public static String[] splitName(String input) { + return input.split(","); + } +} diff --git a/src/test/java/racingcarGame/MoveTest.java b/src/test/java/racingcarGame/MoveTest.java deleted file mode 100644 index ddcb9a28a..000000000 --- a/src/test/java/racingcarGame/MoveTest.java +++ /dev/null @@ -1,4 +0,0 @@ -package racingcarGame; - -public class MoveTest { -} diff --git a/src/test/java/racingcarGame/RaceTest.java b/src/test/java/racingcarGame/RaceTest.java new file mode 100644 index 000000000..1ecdb2346 --- /dev/null +++ b/src/test/java/racingcarGame/RaceTest.java @@ -0,0 +1,17 @@ +package racingcarGame; + +import org.assertj.core.api.Assertions; +import org.junit.jupiter.api.Test; + +import static org.assertj.core.api.Assertions.assertThat; + +public class RaceTest { + + @Test + void 차_1대_move_테스트() { + Car car1 = new Car("hhj"); + Race race = new Race(car1); + race.race(); + assertThat(car1.getLocation()).isEqualTo(1); + } +} diff --git a/src/test/java/racingcarGame/splitUtilsTest.java b/src/test/java/racingcarGame/splitUtilsTest.java new file mode 100644 index 000000000..4250f40bf --- /dev/null +++ b/src/test/java/racingcarGame/splitUtilsTest.java @@ -0,0 +1,18 @@ +package racingcarGame; + +import org.assertj.core.api.Assertions; +import org.junit.jupiter.api.Test; +import racingcarGame.utils.SplitNames; + +import java.util.Arrays; + +import static org.assertj.core.api.Assertions.assertThat; + +public class splitUtilsTest { + + @Test + void 입력_쉼표_구분자() { + String input = "hhj,hhj2,hhj3"; + assertThat(SplitNames.splitName(input)).isEqualTo(new String[] { "hhj", "hhj2", "hhj3" }); + } +} From 85da880d783b7ed5dadc0863877b95b14a2397cc Mon Sep 17 00:00:00 2001 From: heehun Date: Tue, 10 Sep 2024 21:12:06 +0900 Subject: [PATCH 4/7] =?UTF-8?q?feat:=20=EA=B8=B0=EB=8A=A5=20=EA=B5=AC?= =?UTF-8?q?=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 --- README.md | 3 + src/main/java/racingcarGame/Application.java | 43 ++++++++++++++ src/main/java/racingcarGame/Car.java | 11 +++- src/main/java/racingcarGame/Cars.java | 24 ++++++++ src/main/java/racingcarGame/Race.java | 56 +++++++++++++++---- src/main/java/racingcarGame/UserInput.java | 18 ++++++ .../racingcarGame/utils/GenerateNumber.java | 10 ++++ .../java/racingcarGame/utils/Validation.java | 2 + .../java/racingcarGame/views/InputView.java | 18 ++++++ .../java/racingcarGame/views/ResultView.java | 40 +++++++++++++ src/test/java/racingcarGame/CarTest.java | 6 ++ src/test/java/racingcarGame/CarsTest.java | 24 ++++++++ src/test/java/racingcarGame/RaceTest.java | 25 ++++++++- .../java/racingcarGame/splitUtilsTest.java | 4 +- 14 files changed, 266 insertions(+), 18 deletions(-) create mode 100644 src/main/java/racingcarGame/Application.java create mode 100644 src/main/java/racingcarGame/Cars.java create mode 100644 src/main/java/racingcarGame/UserInput.java create mode 100644 src/main/java/racingcarGame/utils/GenerateNumber.java create mode 100644 src/main/java/racingcarGame/views/InputView.java create mode 100644 src/main/java/racingcarGame/views/ResultView.java create mode 100644 src/test/java/racingcarGame/CarsTest.java diff --git a/README.md b/README.md index ef4b412e9..7cc439196 100644 --- a/README.md +++ b/README.md @@ -10,3 +10,6 @@ 3-1. race 메소드 할 때 Race 클래스의 멤버 변수인 Car에 접근해야하는데, 해당 메소드가 public 이면 setter써서 하는게 좋나 ? +## 4. 자동차 여러대 클래스 + +## 5. 사용자 input 문자열 포장 \ No newline at end of file diff --git a/src/main/java/racingcarGame/Application.java b/src/main/java/racingcarGame/Application.java new file mode 100644 index 000000000..4c5474f5f --- /dev/null +++ b/src/main/java/racingcarGame/Application.java @@ -0,0 +1,43 @@ +package racingcarGame; + +import racingcarGame.views.InputView; +import racingcarGame.views.ResultView; + +import java.util.ArrayList; +import java.util.List; +import java.util.Scanner; + +import static racingcarGame.utils.SplitNames.splitName; + +public class Application { + public static void main(String[] args) { + Scanner scanner = new Scanner(System.in); + String input = InputView.name(scanner); + int times = InputView.number(scanner); + + UserInput userInput = new UserInput(input, times); + + String[] carNames = splitName(input); + List carList = new ArrayList<>(); + + for (String carName : carNames) { + Car car = new Car(carName); + carList.add(car); + } + + Cars cars = new Cars(carList); + Race race = new Race(cars); + + ResultView.result(); + + for (int i = 0; i < userInput.getTimes(); i++) { + race.race(); + ResultView.racingResult(cars); + System.out.println(); + } + + int farLocation = race.farLocation(); + Cars winner = race.winner(farLocation); + ResultView.winner(winner); + } +} diff --git a/src/main/java/racingcarGame/Car.java b/src/main/java/racingcarGame/Car.java index aba99fae3..e6c4da01c 100644 --- a/src/main/java/racingcarGame/Car.java +++ b/src/main/java/racingcarGame/Car.java @@ -1,6 +1,9 @@ package racingcarGame; public class Car { + private final String name; + private int location; + public String getName() { return name; } @@ -9,9 +12,6 @@ public int getLocation() { return location; } - String name; - int location; - Car(String name) { if (name.length() > 5) { throw new IllegalArgumentException(); @@ -19,4 +19,9 @@ public int getLocation() { this.name = name; this.location = 0; } + + public void move(int rand) { + if (rand >= 4 ) + this.location += 1; + } } diff --git a/src/main/java/racingcarGame/Cars.java b/src/main/java/racingcarGame/Cars.java new file mode 100644 index 000000000..f5059313c --- /dev/null +++ b/src/main/java/racingcarGame/Cars.java @@ -0,0 +1,24 @@ +package racingcarGame; + +import java.util.ArrayList; +import java.util.List; + +public class Cars { + + private final List cars; + + public List getCars() { + return cars; + } + public Cars(List carList) { + this.cars = carList; + } + public List getLocations() { + List carList = getCars(); + List locations = new ArrayList<>(); + for (Car car : carList) { + locations.add(car.getLocation()); + } + return locations; + } +} diff --git a/src/main/java/racingcarGame/Race.java b/src/main/java/racingcarGame/Race.java index a912ed495..26bf9d5f9 100644 --- a/src/main/java/racingcarGame/Race.java +++ b/src/main/java/racingcarGame/Race.java @@ -1,22 +1,58 @@ package racingcarGame; +import java.util.ArrayList; +import java.util.List; +import java.util.Optional; + +import static racingcarGame.utils.GenerateNumber.generateNumber; + public class Race { - public Car getCar() { - return car; - } + private final Cars cars; - private final Car car; + public Race(Cars car) { + this.cars = car; + } - public Race(Car car) { - this.car = car; + public void race() { + Cars cars = getCars(); + for(Car car: cars.getCars()){ + int rand = generateNumber(); + car.move(rand); + } } - public Car race() { - Car car = getCar(); - car.location += 1; - return car; + public Cars winner(int farLocation) { + Cars cars = getCars(); + List carsList = new ArrayList<>(); + for(Car car: cars.getCars()){ + Optional result = Optional.ofNullable(compareFarLocation(farLocation, car)); + result.ifPresent(carsList::add); + } + return new Cars(carsList); } + + public int farLocation() { + int far = 0; + for(Car car: cars.getCars()){ + far = compareLocation(far, car); + } + return far; + } + + private static int compareLocation(int location,Car car){ + return Math.max(car.getLocation(), location); + } + private static Car compareFarLocation(int farLocation,Car car){ + if(car.getLocation() == farLocation){ + return car; + } + return null; + } + public Cars getCars() { + return cars; + } } + diff --git a/src/main/java/racingcarGame/UserInput.java b/src/main/java/racingcarGame/UserInput.java new file mode 100644 index 000000000..0acfa8b59 --- /dev/null +++ b/src/main/java/racingcarGame/UserInput.java @@ -0,0 +1,18 @@ +package racingcarGame; + +public class UserInput { + private final String inputName; + private final int times; + + UserInput(String inputName,int times) { + this.inputName = inputName; + this.times = times; + } + + public String getInput() { + return inputName; + } + public int getTimes() { + return times; + } +} diff --git a/src/main/java/racingcarGame/utils/GenerateNumber.java b/src/main/java/racingcarGame/utils/GenerateNumber.java new file mode 100644 index 000000000..7b8aea1ee --- /dev/null +++ b/src/main/java/racingcarGame/utils/GenerateNumber.java @@ -0,0 +1,10 @@ +package racingcarGame.utils; + +import java.util.Random; + +public class GenerateNumber { + public static int generateNumber() { + Random rand = new Random(); + return rand.nextInt(10); + } +} diff --git a/src/main/java/racingcarGame/utils/Validation.java b/src/main/java/racingcarGame/utils/Validation.java index 3ef14a13c..02bf9941b 100644 --- a/src/main/java/racingcarGame/utils/Validation.java +++ b/src/main/java/racingcarGame/utils/Validation.java @@ -1,5 +1,7 @@ package racingcarGame.utils; + +// Car 객체 생성자 만들면서 필요 없어짐 public class Validation { public static boolean carNameValidator(String carName) { return carName.length() <= 5; diff --git a/src/main/java/racingcarGame/views/InputView.java b/src/main/java/racingcarGame/views/InputView.java new file mode 100644 index 000000000..4a6e5c6f0 --- /dev/null +++ b/src/main/java/racingcarGame/views/InputView.java @@ -0,0 +1,18 @@ +package racingcarGame.views; + +import java.util.Scanner; + +public class InputView { + static String nameInput = "경주할 자동차 이름을 입력하세요(이름은 쉼표(,)를 기준으로 구분)"; + static String timesInput = "시도할 회수는 몇회인가요?"; + + public static String name(Scanner scanner) { + System.out.println(nameInput); + return scanner.nextLine(); + } + + public static int number(Scanner scanner) { + System.out.println(timesInput); + return scanner.nextInt(); + } +} diff --git a/src/main/java/racingcarGame/views/ResultView.java b/src/main/java/racingcarGame/views/ResultView.java new file mode 100644 index 000000000..04bb47011 --- /dev/null +++ b/src/main/java/racingcarGame/views/ResultView.java @@ -0,0 +1,40 @@ +package racingcarGame.views; + +import racingcarGame.Car; +import racingcarGame.Cars; + +import java.util.List; + +public class ResultView { + static String resultView = "실행결과"; + static String winningMention = "가 최종 우승했습니다."; + + public static void result() { + System.out.println(resultView); + } + + public static void racingResult(Cars cars){ + for (Car car : cars.getCars()) { + System.out.print(car.getName()+" : "); + locationResult(car); + System.out.println(); + } + } + + private static void locationResult(Car car) { + int location = car.getLocation(); + for (int i = 0 ; i < location ; i++){ + System.out.print("-"); + } + } + + public static void winner(Cars cars) { + List carList = cars.getCars(); + System.out.print(carList.get(0).getName()); + int size = carList.size(); + for (int i = 1; i < size; i++){ + System.out.print(", "+carList.get(i).getName()); + } + System.out.println(winningMention); + } +} diff --git a/src/test/java/racingcarGame/CarTest.java b/src/test/java/racingcarGame/CarTest.java index 975d69fa1..4b59057b7 100644 --- a/src/test/java/racingcarGame/CarTest.java +++ b/src/test/java/racingcarGame/CarTest.java @@ -21,5 +21,11 @@ public class CarTest { }).isInstanceOf(IllegalArgumentException.class); } + @Test + void 차_1대_이동(){ + Car car1 = new Car("hhj12"); + car1.move(5); + assertThat(car1.getLocation()).isEqualTo(1); + } } diff --git a/src/test/java/racingcarGame/CarsTest.java b/src/test/java/racingcarGame/CarsTest.java new file mode 100644 index 000000000..d3b554fc3 --- /dev/null +++ b/src/test/java/racingcarGame/CarsTest.java @@ -0,0 +1,24 @@ +package racingcarGame; + +import org.assertj.core.api.Assertions; +import org.junit.jupiter.api.Test; + +import java.util.Arrays; +import java.util.List; + +public class CarsTest { + + @Test + void 차_여러대_생성(){ + Car car1 = new Car("hhj"); + Car car2 = new Car("hhj2"); + Car car3 = new Car("hhj3"); + Car car4 = new Car("hhj4"); + + List car_list = Arrays.asList(car1,car2,car3,car4); + + Cars cars = new Cars(car_list); + + Assertions.assertThat(cars).isNotEqualTo(null); + } +} diff --git a/src/test/java/racingcarGame/RaceTest.java b/src/test/java/racingcarGame/RaceTest.java index 1ecdb2346..2fce4fa50 100644 --- a/src/test/java/racingcarGame/RaceTest.java +++ b/src/test/java/racingcarGame/RaceTest.java @@ -3,15 +3,34 @@ import org.assertj.core.api.Assertions; import org.junit.jupiter.api.Test; +import java.util.Arrays; +import java.util.List; + import static org.assertj.core.api.Assertions.assertThat; public class RaceTest { +// @Test +// void 차_1대_move_테스트() { +// Car car1 = new Car("hhj"); +// Race race = new Race(car1); +// race.race(); +// assertThat(car1.getLocation()).isEqualTo(1); +// } + + @Test - void 차_1대_move_테스트() { + void 차_여러대_move_테스트() { Car car1 = new Car("hhj"); - Race race = new Race(car1); + Car car2 = new Car("hhj2"); + Car car3 = new Car("hhj3"); + Car car4 = new Car("hhj4"); + + List car_list = Arrays.asList(car1,car2,car3,car4); + + Cars cars = new Cars(car_list); + Race race = new Race(cars); race.race(); - assertThat(car1.getLocation()).isEqualTo(1); + assertThat(cars.getLocations()).isNotEqualTo(Arrays.asList(1,1,1,1)); } } diff --git a/src/test/java/racingcarGame/splitUtilsTest.java b/src/test/java/racingcarGame/splitUtilsTest.java index 4250f40bf..ca185f20d 100644 --- a/src/test/java/racingcarGame/splitUtilsTest.java +++ b/src/test/java/racingcarGame/splitUtilsTest.java @@ -12,7 +12,7 @@ public class splitUtilsTest { @Test void 입력_쉼표_구분자() { - String input = "hhj,hhj2,hhj3"; - assertThat(SplitNames.splitName(input)).isEqualTo(new String[] { "hhj", "hhj2", "hhj3" }); + UserInput input = new UserInput("hhj,hhj2,hhj3",5); + assertThat(SplitNames.splitName(input.getInput())).isEqualTo(new String[] { "hhj", "hhj2", "hhj3" }); } } From 46f50ace7082af759487e6da2f29edd2c448f1da Mon Sep 17 00:00:00 2001 From: heehun Date: Tue, 10 Sep 2024 21:13:26 +0900 Subject: [PATCH 5/7] think --- README.md | 7 ++++++- 1 file changed, 6 insertions(+), 1 deletion(-) diff --git a/README.md b/README.md index 7cc439196..e4b9b05b2 100644 --- a/README.md +++ b/README.md @@ -12,4 +12,9 @@ ## 4. 자동차 여러대 클래스 -## 5. 사용자 input 문자열 포장 \ No newline at end of file +## 5. 사용자 input 문자열 포장 + +------------------ +우승자들을 cars에 넣는게 맞을까? +그냥 racing 내부에서 우승자만 반환 해주는게 맞나 ? +고민.. \ No newline at end of file From 3a780ae510d14b285e0d08c69b993b26737e06a2 Mon Sep 17 00:00:00 2001 From: heehun Date: Thu, 12 Sep 2024 15:08:43 +0900 Subject: [PATCH 6/7] checkout --- src/main/java/racingcarGame/Race.java | 6 ------ 1 file changed, 6 deletions(-) diff --git a/src/main/java/racingcarGame/Race.java b/src/main/java/racingcarGame/Race.java index 26bf9d5f9..449b430a8 100644 --- a/src/main/java/racingcarGame/Race.java +++ b/src/main/java/racingcarGame/Race.java @@ -13,7 +13,6 @@ public class Race { public Race(Cars car) { this.cars = car; } - public void race() { Cars cars = getCars(); for(Car car: cars.getCars()){ @@ -21,7 +20,6 @@ public void race() { car.move(rand); } } - public Cars winner(int farLocation) { Cars cars = getCars(); List carsList = new ArrayList<>(); @@ -31,9 +29,6 @@ public Cars winner(int farLocation) { } return new Cars(carsList); } - - - public int farLocation() { int far = 0; for(Car car: cars.getCars()){ @@ -41,7 +36,6 @@ public int farLocation() { } return far; } - private static int compareLocation(int location,Car car){ return Math.max(car.getLocation(), location); } From 8d7f2caa944d8ebb0354cb6c0f71cf0112e0738c Mon Sep 17 00:00:00 2001 From: heehun Date: Thu, 12 Sep 2024 20:58:11 +0900 Subject: [PATCH 7/7] =?UTF-8?q?=EC=9B=90=EC=8B=9C=EA=B0=92=20=ED=8F=AC?= =?UTF-8?q?=EC=9E=A5=20=EC=97=B0=EC=8A=B5?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- src/main/java/racingcarGame/Application.java | 3 ++ src/main/java/racingcarGame/Car.java | 27 ------------ src/main/java/racingcarGame/domain/Car.java | 42 +++++++++++++++++++ .../java/racingcarGame/{ => domain}/Cars.java | 2 +- .../racingcarGame/domain/MovingStrategy.java | 6 +++ .../java/racingcarGame/domain/Position.java | 22 ++++++++++ .../java/racingcarGame/{ => domain}/Race.java | 2 +- .../domain/RandomMovingImpl.java | 18 ++++++++ .../java/racingcarGame/views/ResultView.java | 4 +- src/test/java/racingcarGame/CarTest.java | 1 + src/test/java/racingcarGame/CarsTest.java | 2 + src/test/java/racingcarGame/LocationTest.java | 22 ++++++++++ src/test/java/racingcarGame/RaceTest.java | 4 +- 13 files changed, 123 insertions(+), 32 deletions(-) delete mode 100644 src/main/java/racingcarGame/Car.java create mode 100644 src/main/java/racingcarGame/domain/Car.java rename src/main/java/racingcarGame/{ => domain}/Cars.java (94%) create mode 100644 src/main/java/racingcarGame/domain/MovingStrategy.java create mode 100644 src/main/java/racingcarGame/domain/Position.java rename src/main/java/racingcarGame/{ => domain}/Race.java (97%) create mode 100644 src/main/java/racingcarGame/domain/RandomMovingImpl.java create mode 100644 src/test/java/racingcarGame/LocationTest.java diff --git a/src/main/java/racingcarGame/Application.java b/src/main/java/racingcarGame/Application.java index 4c5474f5f..6c08e7f4c 100644 --- a/src/main/java/racingcarGame/Application.java +++ b/src/main/java/racingcarGame/Application.java @@ -1,5 +1,8 @@ package racingcarGame; +import racingcarGame.domain.Car; +import racingcarGame.domain.Cars; +import racingcarGame.domain.Race; import racingcarGame.views.InputView; import racingcarGame.views.ResultView; diff --git a/src/main/java/racingcarGame/Car.java b/src/main/java/racingcarGame/Car.java deleted file mode 100644 index e6c4da01c..000000000 --- a/src/main/java/racingcarGame/Car.java +++ /dev/null @@ -1,27 +0,0 @@ -package racingcarGame; - -public class Car { - private final String name; - private int location; - - public String getName() { - return name; - } - - public int getLocation() { - return location; - } - - Car(String name) { - if (name.length() > 5) { - throw new IllegalArgumentException(); - } - this.name = name; - this.location = 0; - } - - public void move(int rand) { - if (rand >= 4 ) - this.location += 1; - } -} diff --git a/src/main/java/racingcarGame/domain/Car.java b/src/main/java/racingcarGame/domain/Car.java new file mode 100644 index 000000000..d490b54d8 --- /dev/null +++ b/src/main/java/racingcarGame/domain/Car.java @@ -0,0 +1,42 @@ +package racingcarGame.domain; + +public class Car { + private final String name; + private int location; + private Position position; + + public String getName() { + return name; + } + + public int getLocation() { + return location; + } + + Car(String name) { + if (name.length() > 5) { + throw new IllegalArgumentException(); + } + this.name = name; + this.location = 0; + this.position = new Position(); + } + + public void move(int rand) { + if (rand >= 4 ) + this.location += 1; + } + + + // move 전력이 바뀌는 것을 대비한 추상화 + public void move(MovingStrategy movingStrategy) { + //여기만 보면 구현체 뭔지 모르는데 + //애플리케이션 코드에 이 메서드 사용할 때 구현체를 넣어주지 + if (movingStrategy.movable()){ + this.location += 1; + position.move(); + + } + } + +} diff --git a/src/main/java/racingcarGame/Cars.java b/src/main/java/racingcarGame/domain/Cars.java similarity index 94% rename from src/main/java/racingcarGame/Cars.java rename to src/main/java/racingcarGame/domain/Cars.java index f5059313c..9dc9b46f8 100644 --- a/src/main/java/racingcarGame/Cars.java +++ b/src/main/java/racingcarGame/domain/Cars.java @@ -1,4 +1,4 @@ -package racingcarGame; +package racingcarGame.domain; import java.util.ArrayList; import java.util.List; diff --git a/src/main/java/racingcarGame/domain/MovingStrategy.java b/src/main/java/racingcarGame/domain/MovingStrategy.java new file mode 100644 index 000000000..9db9d6286 --- /dev/null +++ b/src/main/java/racingcarGame/domain/MovingStrategy.java @@ -0,0 +1,6 @@ +package racingcarGame.domain; + +public interface MovingStrategy { + + boolean movable(); +} diff --git a/src/main/java/racingcarGame/domain/Position.java b/src/main/java/racingcarGame/domain/Position.java new file mode 100644 index 000000000..cb4a96877 --- /dev/null +++ b/src/main/java/racingcarGame/domain/Position.java @@ -0,0 +1,22 @@ +package racingcarGame.domain; + +public class Position { + private int position; + public Position(int i) { + if (i < 0) { + throw new IllegalArgumentException("Position cannot be less than 0"); + } + this.position = i; + } + + public Position() { + this.position = 0; + } + public int getPosition() { + return this.position; + } + + public void move() { + this.position += 1; + } +} diff --git a/src/main/java/racingcarGame/Race.java b/src/main/java/racingcarGame/domain/Race.java similarity index 97% rename from src/main/java/racingcarGame/Race.java rename to src/main/java/racingcarGame/domain/Race.java index 449b430a8..671cd44b5 100644 --- a/src/main/java/racingcarGame/Race.java +++ b/src/main/java/racingcarGame/domain/Race.java @@ -1,4 +1,4 @@ -package racingcarGame; +package racingcarGame.domain; import java.util.ArrayList; import java.util.List; diff --git a/src/main/java/racingcarGame/domain/RandomMovingImpl.java b/src/main/java/racingcarGame/domain/RandomMovingImpl.java new file mode 100644 index 000000000..3814aea5b --- /dev/null +++ b/src/main/java/racingcarGame/domain/RandomMovingImpl.java @@ -0,0 +1,18 @@ +package racingcarGame.domain; + +import java.util.Random; + +public class RandomMovingImpl implements MovingStrategy{ + private static final int MAX_BOUND = 10; + private static final int FORWARD_NUM = 4; + @Override + public boolean movable() { + return getRandomNo() >= FORWARD_NUM; + } + + + private int getRandomNo() { + Random rand = new Random(); + return rand.nextInt(MAX_BOUND); + } +} diff --git a/src/main/java/racingcarGame/views/ResultView.java b/src/main/java/racingcarGame/views/ResultView.java index 04bb47011..726751c13 100644 --- a/src/main/java/racingcarGame/views/ResultView.java +++ b/src/main/java/racingcarGame/views/ResultView.java @@ -1,7 +1,7 @@ package racingcarGame.views; -import racingcarGame.Car; -import racingcarGame.Cars; +import racingcarGame.domain.Car; +import racingcarGame.domain.Cars; import java.util.List; diff --git a/src/test/java/racingcarGame/CarTest.java b/src/test/java/racingcarGame/CarTest.java index 4b59057b7..0e2e67ca5 100644 --- a/src/test/java/racingcarGame/CarTest.java +++ b/src/test/java/racingcarGame/CarTest.java @@ -1,6 +1,7 @@ package racingcarGame; import org.junit.jupiter.api.Test; +import racingcarGame.domain.Car; import static org.assertj.core.api.Assertions.*; diff --git a/src/test/java/racingcarGame/CarsTest.java b/src/test/java/racingcarGame/CarsTest.java index d3b554fc3..b7f5e5c30 100644 --- a/src/test/java/racingcarGame/CarsTest.java +++ b/src/test/java/racingcarGame/CarsTest.java @@ -2,6 +2,8 @@ import org.assertj.core.api.Assertions; import org.junit.jupiter.api.Test; +import racingcarGame.domain.Car; +import racingcarGame.domain.Cars; import java.util.Arrays; import java.util.List; diff --git a/src/test/java/racingcarGame/LocationTest.java b/src/test/java/racingcarGame/LocationTest.java new file mode 100644 index 000000000..51b19db87 --- /dev/null +++ b/src/test/java/racingcarGame/LocationTest.java @@ -0,0 +1,22 @@ +package racingcarGame; + +import org.junit.jupiter.api.Test; +import racingcarGame.domain.Position; + +import static org.assertj.core.api.Assertions.*; + +public class LocationTest { + @Test + void create() { + Position position = new Position(3); + assertThat(position).isNotNull(); + assertThat(position.getPosition()).isEqualTo(3); + + } + @Test + void valid() { + assertThatThrownBy(() -> new Position(-1)) + .isInstanceOf(IllegalArgumentException.class); + + } +} diff --git a/src/test/java/racingcarGame/RaceTest.java b/src/test/java/racingcarGame/RaceTest.java index 2fce4fa50..f3521c59d 100644 --- a/src/test/java/racingcarGame/RaceTest.java +++ b/src/test/java/racingcarGame/RaceTest.java @@ -1,7 +1,9 @@ package racingcarGame; -import org.assertj.core.api.Assertions; import org.junit.jupiter.api.Test; +import racingcarGame.domain.Car; +import racingcarGame.domain.Cars; +import racingcarGame.domain.Race; import java.util.Arrays; import java.util.List;