From 2fbaee47d6edbaac1bb41067540505fccdf81bbb Mon Sep 17 00:00:00 2001 From: yeunsuh Date: Fri, 14 Feb 2025 23:33:15 +0900 Subject: [PATCH 01/10] docs(README.md): declaring feature list --- README.md | 18 ++++++++++++++++++ 1 file changed, 18 insertions(+) diff --git a/README.md b/README.md index d0286c8..81860f1 100644 --- a/README.md +++ b/README.md @@ -1 +1,19 @@ # java-racingcar-precourse + +# 기능 목록 + +1. 자동차경주 뷰 + - input, output(차수별, 우승자) + +2. 자동차경주 컨트롤러 + - 입력값 처리 및 자동차 모델에게 전달 및 생성 + - 자동차 경주 게임 진행 + +3. 자동차경주 서비스 + - 예외처리 후 모델에게 전달 + - 우승자 판별 + - 회차 반복 경기 기능 + +4. 자동차 모델(클래스) + - 이름, 좌표 관련 입출력 + - 좌표 이동 후 뷰에 통보하는 observer \ No newline at end of file From e536ea5f7dd3c75bb96fbbe133a3d2a272825e38 Mon Sep 17 00:00:00 2001 From: yeunsuh Date: Fri, 14 Feb 2025 23:50:19 +0900 Subject: [PATCH 02/10] docs(README.md) : added one feature --- README.md | 9 ++++++--- 1 file changed, 6 insertions(+), 3 deletions(-) diff --git a/README.md b/README.md index 81860f1..6d7d3b0 100644 --- a/README.md +++ b/README.md @@ -5,15 +5,18 @@ 1. 자동차경주 뷰 - input, output(차수별, 우승자) -2. 자동차경주 컨트롤러 +2. 자동차 움직임 뷰 + - 자동차가 움직이면 그걸 출력하는 뷰 + +3. 자동차경주 컨트롤러 - 입력값 처리 및 자동차 모델에게 전달 및 생성 - 자동차 경주 게임 진행 -3. 자동차경주 서비스 +4. 자동차경주 서비스 - 예외처리 후 모델에게 전달 - 우승자 판별 - 회차 반복 경기 기능 -4. 자동차 모델(클래스) +5. 자동차 모델(클래스) - 이름, 좌표 관련 입출력 - 좌표 이동 후 뷰에 통보하는 observer \ No newline at end of file From ddbd59e7753f29131c4fee677c1e87838319ff7e Mon Sep 17 00:00:00 2001 From: yeunsuh Date: Fri, 14 Feb 2025 23:50:30 +0900 Subject: [PATCH 03/10] feat(directory): implementing directory structure made according to MVC pattern --- .../java/racingcar/controller/RacingGameController.java | 4 ++++ src/main/java/racingcar/model/Car.java | 4 ++++ src/main/java/racingcar/model/CarObserver.java | 4 ++++ src/main/java/racingcar/service/RacingGameService.java | 4 ++++ src/main/java/racingcar/view/CarView.java | 6 ++++++ src/main/java/racingcar/view/RacingGameView.java | 4 ++++ 6 files changed, 26 insertions(+) create mode 100644 src/main/java/racingcar/controller/RacingGameController.java create mode 100644 src/main/java/racingcar/model/Car.java create mode 100644 src/main/java/racingcar/model/CarObserver.java create mode 100644 src/main/java/racingcar/service/RacingGameService.java create mode 100644 src/main/java/racingcar/view/CarView.java create mode 100644 src/main/java/racingcar/view/RacingGameView.java diff --git a/src/main/java/racingcar/controller/RacingGameController.java b/src/main/java/racingcar/controller/RacingGameController.java new file mode 100644 index 0000000..74b6be3 --- /dev/null +++ b/src/main/java/racingcar/controller/RacingGameController.java @@ -0,0 +1,4 @@ +package racingcar.controller; + +public class RacingGameController { +} diff --git a/src/main/java/racingcar/model/Car.java b/src/main/java/racingcar/model/Car.java new file mode 100644 index 0000000..dca5e48 --- /dev/null +++ b/src/main/java/racingcar/model/Car.java @@ -0,0 +1,4 @@ +package racingcar.model; + +public class Car { +} diff --git a/src/main/java/racingcar/model/CarObserver.java b/src/main/java/racingcar/model/CarObserver.java new file mode 100644 index 0000000..7170f30 --- /dev/null +++ b/src/main/java/racingcar/model/CarObserver.java @@ -0,0 +1,4 @@ +package racingcar.model; + +public interface CarObserver { +} diff --git a/src/main/java/racingcar/service/RacingGameService.java b/src/main/java/racingcar/service/RacingGameService.java new file mode 100644 index 0000000..d85bd2e --- /dev/null +++ b/src/main/java/racingcar/service/RacingGameService.java @@ -0,0 +1,4 @@ +package racingcar.service; + +public class RacingGameService { +} diff --git a/src/main/java/racingcar/view/CarView.java b/src/main/java/racingcar/view/CarView.java new file mode 100644 index 0000000..bcfe015 --- /dev/null +++ b/src/main/java/racingcar/view/CarView.java @@ -0,0 +1,6 @@ +package racingcar.view; + +import racingcar.model.CarObserver; + +public class CarView implements CarObserver { +} diff --git a/src/main/java/racingcar/view/RacingGameView.java b/src/main/java/racingcar/view/RacingGameView.java new file mode 100644 index 0000000..1d0f503 --- /dev/null +++ b/src/main/java/racingcar/view/RacingGameView.java @@ -0,0 +1,4 @@ +package racingcar.view; + +public class RacingGameView { +} From 2a736e5d2bb178153e73934978d600f2e7fae6e6 Mon Sep 17 00:00:00 2001 From: yeunsuh Date: Sat, 15 Feb 2025 14:43:00 +0900 Subject: [PATCH 04/10] feat(main): #f5 finished MVC::model created model & custom observer --- src/main/java/racingcar/model/Car.java | 32 +++++++++++++++++++ .../java/racingcar/model/CarObserver.java | 1 + 2 files changed, 33 insertions(+) diff --git a/src/main/java/racingcar/model/Car.java b/src/main/java/racingcar/model/Car.java index dca5e48..13acf07 100644 --- a/src/main/java/racingcar/model/Car.java +++ b/src/main/java/racingcar/model/Car.java @@ -1,4 +1,36 @@ package racingcar.model; +import racingcar.util.ErrorMessage; + public class Car { + private String name; + private int position; + private CarObserver observer; + + public Car(String name){ + setName(name); + this.position = 0; + } + + public String getName() { + return name; + } + + public void setName(String name) { + if(name.length()>5) throw new IllegalArgumentException(ErrorMessage.TOOLONG.getMessage()); + this.name = name; + } + + public int getPosition() { + return position; + } + + public void addPosition(int dice) { + if(dice>3) this.position++; + observer.onCarMove(name, position); + } + + public void setObserver(CarObserver observer) { + this.observer = observer; + } } diff --git a/src/main/java/racingcar/model/CarObserver.java b/src/main/java/racingcar/model/CarObserver.java index 7170f30..26e191f 100644 --- a/src/main/java/racingcar/model/CarObserver.java +++ b/src/main/java/racingcar/model/CarObserver.java @@ -1,4 +1,5 @@ package racingcar.model; public interface CarObserver { + void onCarMove(String carName, int position); } From 16d9b393e37f50d07872472b88e947a58d73dc36 Mon Sep 17 00:00:00 2001 From: yeunsuh Date: Sat, 15 Feb 2025 14:47:21 +0900 Subject: [PATCH 05/10] feat(main): #f1,2 finished messaging constants ErrorMessage & SystemMessage enum --- src/main/java/racingcar/util/ErrorMessage.java | 14 ++++++++++++++ src/main/java/racingcar/util/SystemMessage.java | 17 +++++++++++++++++ 2 files changed, 31 insertions(+) create mode 100644 src/main/java/racingcar/util/ErrorMessage.java create mode 100644 src/main/java/racingcar/util/SystemMessage.java diff --git a/src/main/java/racingcar/util/ErrorMessage.java b/src/main/java/racingcar/util/ErrorMessage.java new file mode 100644 index 0000000..d503d2d --- /dev/null +++ b/src/main/java/racingcar/util/ErrorMessage.java @@ -0,0 +1,14 @@ +package racingcar.util; + +public enum ErrorMessage { + TOOLONG("이름 5자 초과"); + + + private String message; + + ErrorMessage(String message){this.message = message;} + + public String getMessage() { + return "Error: "+message; + } +} diff --git a/src/main/java/racingcar/util/SystemMessage.java b/src/main/java/racingcar/util/SystemMessage.java new file mode 100644 index 0000000..07d2d60 --- /dev/null +++ b/src/main/java/racingcar/util/SystemMessage.java @@ -0,0 +1,17 @@ +package racingcar.util; + +public enum SystemMessage { + START_NAME_GUIDE("경주할 자동차 이름을 입력하세요.(이름은 쉼표(,) 기준으로 구분)"), + START_REPEAT_GUIDE("시도할 회수는 몇 회인가요?"), + RESULT_GUIDE("실행 결과"), + RESULT_WINNER("최종 우승자 : "); + + + private String message; + + SystemMessage(String message){this.message = message;} + + public String getMessage() { + return this.message; + } +} From 91973dada46e411656fcae9b253bae302809dd1e Mon Sep 17 00:00:00 2001 From: yeunsuh Date: Sat, 15 Feb 2025 14:48:23 +0900 Subject: [PATCH 06/10] feat(main): #f1,2 finished MVC::view RacingGameView & removed CarView.java --- src/main/java/racingcar/view/CarView.java | 6 ---- .../java/racingcar/view/RacingGameView.java | 35 ++++++++++++++++++- 2 files changed, 34 insertions(+), 7 deletions(-) delete mode 100644 src/main/java/racingcar/view/CarView.java diff --git a/src/main/java/racingcar/view/CarView.java b/src/main/java/racingcar/view/CarView.java deleted file mode 100644 index bcfe015..0000000 --- a/src/main/java/racingcar/view/CarView.java +++ /dev/null @@ -1,6 +0,0 @@ -package racingcar.view; - -import racingcar.model.CarObserver; - -public class CarView implements CarObserver { -} diff --git a/src/main/java/racingcar/view/RacingGameView.java b/src/main/java/racingcar/view/RacingGameView.java index 1d0f503..dde0d45 100644 --- a/src/main/java/racingcar/view/RacingGameView.java +++ b/src/main/java/racingcar/view/RacingGameView.java @@ -1,4 +1,37 @@ package racingcar.view; -public class RacingGameView { +import camp.nextstep.edu.missionutils.Console; +import racingcar.model.CarObserver; +import racingcar.util.SystemMessage; + +public class RacingGameView implements CarObserver { + + public String readName(){ + System.out.println(SystemMessage.START_NAME_GUIDE.getMessage()); + return Console.readLine(); + } + + public String readRepeat(){ + System.out.println(SystemMessage.START_REPEAT_GUIDE.getMessage();); + return Console.readLine(); + } + + public void lineBreak(){ + System.out.println(""); + } + + public void printEndGuide(){ + System.out.println(SystemMessage.RESULT_GUIDE.getMessage()); + } + + public void printFinalWinner(String winner){ + System.out.println(SystemMessage.RESULT_WINNER.getMessage() + winner); + } + + @Override + public void onCarMove(String carName, int position){ + //뷰가 모델과 분리되어야해서 인스턴스 말고 각각 보내는게 좋다 함. + String message = carName + " : " + "-".repeat(position); + System.out.println(message); + } } From 32061e0e3db156abe8a83da5b4f5852cf09d38ac Mon Sep 17 00:00:00 2001 From: yeunsuh Date: Sat, 15 Feb 2025 14:49:55 +0900 Subject: [PATCH 07/10] feat(main, README.md): #f4 finished service MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit RacingGameService, 회차반복경기기능->1회차경기기능 --- README.md | 2 +- .../racingcar/service/RacingGameService.java | 37 +++++++++++++++++++ 2 files changed, 38 insertions(+), 1 deletion(-) diff --git a/README.md b/README.md index 6d7d3b0..1bba800 100644 --- a/README.md +++ b/README.md @@ -15,7 +15,7 @@ 4. 자동차경주 서비스 - 예외처리 후 모델에게 전달 - 우승자 판별 - - 회차 반복 경기 기능 + - 1회차 경기 기능 5. 자동차 모델(클래스) - 이름, 좌표 관련 입출력 diff --git a/src/main/java/racingcar/service/RacingGameService.java b/src/main/java/racingcar/service/RacingGameService.java index d85bd2e..3c9df7c 100644 --- a/src/main/java/racingcar/service/RacingGameService.java +++ b/src/main/java/racingcar/service/RacingGameService.java @@ -1,4 +1,41 @@ package racingcar.service; +import racingcar.model.Car; +import racingcar.model.CarObserver; + +import java.net.CacheRequest; +import java.util.ArrayList; +import java.util.Comparator; +import java.util.List; +import java.util.Optional; +import java.util.stream.Collectors; + +import static camp.nextstep.edu.missionutils.Randoms.pickNumberInRange; + public class RacingGameService { + private List cars = new ArrayList<>(); + + public void addCar(String carName){ + Car car = new Car(carName); + cars.add(car); + } + + public void addObserver(CarObserver carObserver){ + cars.forEach(car->car.setObserver(carObserver)); + } + + public void playOneGame(){ + for(Car car : cars) car.addPosition(pickNumberInRange(0,9)); + } + + public String checkWinner(){ + Optional maxValue = cars.stream().map(Car::getPosition).max(Integer::compareTo); + + String maxPositionCars = cars.stream() + .filter(n -> maxValue.isPresent() && n.getPosition()==maxValue.get()) + .map(Car::getName) + .collect(Collectors.joining(", ")); + + return maxPositionCars; + } } From b5e5c1417a4c3b63d35c1c5e73a39f5c583d9594 Mon Sep 17 00:00:00 2001 From: yeunsuh Date: Sat, 15 Feb 2025 14:50:50 +0900 Subject: [PATCH 08/10] feat(main): #f3 finished MVC::controller RacingGameController --- .../controller/RacingGameController.java | 34 +++++++++++++++++++ 1 file changed, 34 insertions(+) diff --git a/src/main/java/racingcar/controller/RacingGameController.java b/src/main/java/racingcar/controller/RacingGameController.java index 74b6be3..e8dacef 100644 --- a/src/main/java/racingcar/controller/RacingGameController.java +++ b/src/main/java/racingcar/controller/RacingGameController.java @@ -1,4 +1,38 @@ package racingcar.controller; +import racingcar.service.RacingGameService; +import racingcar.view.RacingGameView; + +import java.util.List; + public class RacingGameController { + + private RacingGameView racingGameView; + private RacingGameService racingGameService; + + public RacingGameController(RacingGameView racingGameView, RacingGameService racingGameService){ + this.racingGameService = racingGameService; + this.racingGameView = racingGameView; + } + + public void makeCar(){ + String[] carNames = racingGameView.readName().split(","); + for(String name : carNames) racingGameService.addCar(name); + racingGameService.addObserver(racingGameView); + } + + public void runGame(){ + int repetitionNumber = Integer.parseInt(racingGameView.readRepeat()); + racingGameView.printEndGuide(); + for (int i=0;i Date: Sat, 15 Feb 2025 14:52:00 +0900 Subject: [PATCH 09/10] feat(main): set Application & properties --- gradle.properties | 1 + src/main/java/racingcar/Application.java | 19 ++++++++++++++++++- 2 files changed, 19 insertions(+), 1 deletion(-) create mode 100644 gradle.properties diff --git a/gradle.properties b/gradle.properties new file mode 100644 index 0000000..656f2e6 --- /dev/null +++ b/gradle.properties @@ -0,0 +1 @@ +org.gradle.jvmargs=-Dfile.encoding=UTF-8 \ No newline at end of file diff --git a/src/main/java/racingcar/Application.java b/src/main/java/racingcar/Application.java index a17a52e..30ed559 100644 --- a/src/main/java/racingcar/Application.java +++ b/src/main/java/racingcar/Application.java @@ -1,7 +1,24 @@ package racingcar; +import racingcar.controller.RacingGameController; +import racingcar.service.RacingGameService; +import racingcar.view.RacingGameView; + +import java.io.PrintStream; +import java.io.UnsupportedEncodingException; + public class Application { public static void main(String[] args) { - // TODO: 프로그램 구현 + new Application().run(); + } + + public void run(){ + RacingGameService racingGameService = new RacingGameService(); + RacingGameView racingGameView = new RacingGameView(); + RacingGameController racingGameController = new RacingGameController(racingGameView, racingGameService); + + racingGameController.makeCar(); + racingGameController.runGame(); + racingGameController.result(); } } From d983f9b968b45e852deb701d2c57a4df3330acc2 Mon Sep 17 00:00:00 2001 From: yeunsuh Date: Sat, 15 Feb 2025 15:06:44 +0900 Subject: [PATCH 10/10] feat(main): add&fix for validation add - Validator.java fix - Car.java, ErrorMessage.java, RacingGameController.java, RacingGameView.java --- .../racingcar/controller/RacingGameController.java | 10 +++++++--- src/main/java/racingcar/model/Car.java | 2 +- src/main/java/racingcar/util/ErrorMessage.java | 3 ++- src/main/java/racingcar/util/Validator.java | 10 ++++++++++ src/main/java/racingcar/view/RacingGameView.java | 2 +- 5 files changed, 21 insertions(+), 6 deletions(-) create mode 100644 src/main/java/racingcar/util/Validator.java diff --git a/src/main/java/racingcar/controller/RacingGameController.java b/src/main/java/racingcar/controller/RacingGameController.java index e8dacef..e172da3 100644 --- a/src/main/java/racingcar/controller/RacingGameController.java +++ b/src/main/java/racingcar/controller/RacingGameController.java @@ -1,10 +1,10 @@ package racingcar.controller; import racingcar.service.RacingGameService; +import racingcar.util.ErrorMessage; +import racingcar.util.Validator; import racingcar.view.RacingGameView; -import java.util.List; - public class RacingGameController { private RacingGameView racingGameView; @@ -22,7 +22,11 @@ public void makeCar(){ } public void runGame(){ - int repetitionNumber = Integer.parseInt(racingGameView.readRepeat()); + String input = racingGameView.readRepeat(); + if(!Validator.isNumber(input)) throw new IllegalArgumentException(ErrorMessage.WRONG_REPEAT_INPUT.getMessage()); + + int repetitionNumber = Integer.parseInt(input); + if(repetitionNumber<1) racingGameView.printEndGuide(); for (int i=0;i5) throw new IllegalArgumentException(ErrorMessage.TOOLONG.getMessage()); + if(name.length()>5) throw new IllegalArgumentException(ErrorMessage.TOO_LONG.getMessage()); this.name = name; } diff --git a/src/main/java/racingcar/util/ErrorMessage.java b/src/main/java/racingcar/util/ErrorMessage.java index d503d2d..e498e21 100644 --- a/src/main/java/racingcar/util/ErrorMessage.java +++ b/src/main/java/racingcar/util/ErrorMessage.java @@ -1,7 +1,8 @@ package racingcar.util; public enum ErrorMessage { - TOOLONG("이름 5자 초과"); + TOO_LONG("이름 5자 초과"), + WRONG_REPEAT_INPUT("입력 반복 횟수는 1 이상의 숫자여야합니다."); private String message; diff --git a/src/main/java/racingcar/util/Validator.java b/src/main/java/racingcar/util/Validator.java new file mode 100644 index 0000000..5afb572 --- /dev/null +++ b/src/main/java/racingcar/util/Validator.java @@ -0,0 +1,10 @@ +package racingcar.util; + +import java.util.regex.Pattern; + +public class Validator { + public static boolean isNumber(String arg){ + if(arg == null || !arg.matches("\\d+")) return false; + return true; + } +} diff --git a/src/main/java/racingcar/view/RacingGameView.java b/src/main/java/racingcar/view/RacingGameView.java index dde0d45..7fac614 100644 --- a/src/main/java/racingcar/view/RacingGameView.java +++ b/src/main/java/racingcar/view/RacingGameView.java @@ -12,7 +12,7 @@ public String readName(){ } public String readRepeat(){ - System.out.println(SystemMessage.START_REPEAT_GUIDE.getMessage();); + System.out.println(SystemMessage.START_REPEAT_GUIDE.getMessage()); return Console.readLine(); }