From 3ed75105f4d91031b105e66789fa74554349603f Mon Sep 17 00:00:00 2001 From: Jeongyeun Date: Sun, 24 Mar 2024 23:44:50 +0900 Subject: [PATCH 1/8] =?UTF-8?q?=EC=82=AC=EC=9A=A9=EC=9E=90=EC=97=90?= =?UTF-8?q?=EA=B2=8C=20=EC=9E=85=EB=A0=A5=20=EB=B0=9B=EB=8A=94=20=EA=B0=9D?= =?UTF-8?q?=EC=B2=B4?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- src/main/java/View/InputView.java | 33 +++++++++++++++++++++++++++++++ 1 file changed, 33 insertions(+) create mode 100644 src/main/java/View/InputView.java diff --git a/src/main/java/View/InputView.java b/src/main/java/View/InputView.java new file mode 100644 index 0000000..832f840 --- /dev/null +++ b/src/main/java/View/InputView.java @@ -0,0 +1,33 @@ +package View; + +import utils.StringParser; + +import java.io.IOException; +import java.util.List; +import java.util.Scanner; + +public class InputView { //사용자에게 입력 받는 객체 + + private static final String READ_CAR_NAME = "경주할 자동차 이름을 입력하세요(이름은 쉼표(,)를 기준으로 구분.)"; + private static final String READ_ATTEMP_NUM = "시도할 회수는 몇회인가요?"; + private static final Scanner scanner = new Scanner(System.in); + + public static List CarNames() throws IOException{ + System.out.println(READ_CAR_NAME); + String name = scanner.nextLine(); //문자열 입력 받고 + return StringParser.splitByComma(name); //콤마 단위로 나누어 저장 + } + public static int AttemptNum() throws IOException{ + try{ + System.out.println(READ_ATTEMP_NUM); + int input; + input = Integer.parseInt(scanner.next()); //시도 횟수 입력 받아 정수로 저장 + return input; + } + catch(Exception e){ + System.out.println("정수로 다시 입력해주세요"); + return AttemptNum(); + } + } + +} From b217d2b147da583b93febb7e3bbad4d63f5f9078 Mon Sep 17 00:00:00 2001 From: Jeongyeun Date: Sun, 24 Mar 2024 23:45:46 +0900 Subject: [PATCH 2/8] =?UTF-8?q?=EC=9E=90=EB=8F=99=EC=B0=A8=EC=9D=98=20?= =?UTF-8?q?=EC=A0=95=EB=B3=B4=20=EC=A0=80=EC=9E=A5?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- src/main/java/Domain/Car.java | 38 +++++++++++++++++++++++++++++++++++ 1 file changed, 38 insertions(+) create mode 100644 src/main/java/Domain/Car.java diff --git a/src/main/java/Domain/Car.java b/src/main/java/Domain/Car.java new file mode 100644 index 0000000..56da9e8 --- /dev/null +++ b/src/main/java/Domain/Car.java @@ -0,0 +1,38 @@ +package Domain; +//Domain(Model)은 Controller와 View에 의존X +// ->Model 내부에 Controller와 View에 관련된 코드가 있으면 안됨. +public class Car { //자동차의 정보 저장 + + private static final int STATIC_NUM = 4; //전진 조건 숫자(3이하의 값->멈춤, 4이상의 값->전진) + + private final Name name; //이름을 저장할 변수 선언 + private final Position position; //위치를 저장할 변수 선언 + + private Car(final String name, final int position){ //자동차의 정보 저장(이름,위치) + this.name = new Name(name); + this.position = new Position(position); + } + + public static Car InitialInform(final String name){ + return new Car(name,0); + } + + public static Car EditInform(final String name, final int position){ + return new Car(name,position); + } + + public void move(final int number){ //4이상인 경우 전진 + if(number >= STATIC_NUM){ + position.increase(); + } + } + + public String getName(){ + return name.getName(); + } + + public int getPosition(){ + return position.getPosition(); + } + +} From ddf475ad52b5d286a397d1a4f1d582dfc4b09dbe Mon Sep 17 00:00:00 2001 From: Jeongyeun Date: Sun, 24 Mar 2024 23:46:08 +0900 Subject: [PATCH 3/8] =?UTF-8?q?=EC=9E=90=EB=8F=99=EC=B0=A8=EB=93=A4?= =?UTF-8?q?=EC=9D=98=20=EC=A0=95=EB=B3=B4=20=EC=A0=80=EC=9E=A5?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- src/main/java/Domain/Cars.java | 50 ++++++++++++++++++++++++++++++++++ 1 file changed, 50 insertions(+) create mode 100644 src/main/java/Domain/Cars.java diff --git a/src/main/java/Domain/Cars.java b/src/main/java/Domain/Cars.java new file mode 100644 index 0000000..365009c --- /dev/null +++ b/src/main/java/Domain/Cars.java @@ -0,0 +1,50 @@ +package Domain; + +import utils.NumberGenerator; + +import java.util.Collections; +import java.util.List; +import java.util.stream.Collectors; + +public class Cars { //자동차들의 정보 저장 + private static final int DEFAULT_POSITION = 0; //초기 위치=0 + + private final List cars; //자동차들의 정보를 저장할 리스트 선언 + + public Cars(final List cars){ + this.cars = Collections.unmodifiableList(cars); + } + + public static Cars InitialInform(final List carNames){ //carNames의 각 요소를 Car객체로 변환하여 리스트에 저장 + List cars = carNames.stream() + .map(Car::InitialInform) + .collect(Collectors.toList()); + return new Cars(cars); + } + + public void moveAll(final NumberGenerator numberGenerator){ + for(Car car : cars){ + int number = numberGenerator.generate(); + car.move(number); + } + } + + public Cars findWinners(){ + int maxPosition = getMaxPosition(); + List winningCars = cars.stream() + .filter(car -> car.getPosition() == maxPosition) + .collect(Collectors.toList()); + return new Cars(winningCars); + } + + private int getMaxPosition(){ + return cars.stream() + .mapToInt(Car::getPosition) + .max() + .orElse(DEFAULT_POSITION); + } + + public List getCars(){ + return cars; + } +} From 9a6d91a23cb21ed1e633be076137ec348e07a503 Mon Sep 17 00:00:00 2001 From: Jeongyeun Date: Sun, 24 Mar 2024 23:46:59 +0900 Subject: [PATCH 4/8] =?UTF-8?q?=EC=9E=90=EB=8F=99=EC=B0=A8=EC=9D=98=20?= =?UTF-8?q?=EC=9D=B4=EB=A6=84=20=EC=A0=80=EC=9E=A5?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- src/main/java/Domain/Name.java | 24 ++++++++++++++++++++++++ 1 file changed, 24 insertions(+) create mode 100644 src/main/java/Domain/Name.java diff --git a/src/main/java/Domain/Name.java b/src/main/java/Domain/Name.java new file mode 100644 index 0000000..f8791c8 --- /dev/null +++ b/src/main/java/Domain/Name.java @@ -0,0 +1,24 @@ +package Domain; + +public class Name { //자동차의 이름 저장 + private final String name; + + public Name(final String name){ + validate(name); + this.name = name; //조건에 부합하는 이름을 입력 받았다면 변수에 저장 + } + + private void validate(final String name){ //이름이 조건에 어긋나는지 판별 + if (name == null || name.isEmpty()) { //이름에 null값이 들어가면 오류 출력 + throw new IllegalArgumentException("[ERROR]"); + } + if(name.length() > 5){ //이름은 5자 이하만 가능 + throw new IllegalArgumentException("[ERROR]이름은 5글자까지 가능합니다."); + } + } + + public String getName(){ + return name; + } + +} From 222e634f37fde2cd1e1e7976de6a6ecb6f027f33 Mon Sep 17 00:00:00 2001 From: Jeongyeun Date: Sun, 24 Mar 2024 23:48:07 +0900 Subject: [PATCH 5/8] =?UTF-8?q?=EB=9E=9C=EB=8D=A4=ED=95=9C=20=EC=88=AB?= =?UTF-8?q?=EC=9E=90=20=EC=A0=80=EC=9E=A5?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- src/main/java/utils/NumberGenerator.java | 5 +++++ src/main/java/utils/RandomNumberGenerator.java | 7 +++++++ 2 files changed, 12 insertions(+) create mode 100644 src/main/java/utils/NumberGenerator.java create mode 100644 src/main/java/utils/RandomNumberGenerator.java diff --git a/src/main/java/utils/NumberGenerator.java b/src/main/java/utils/NumberGenerator.java new file mode 100644 index 0000000..e2eb4dd --- /dev/null +++ b/src/main/java/utils/NumberGenerator.java @@ -0,0 +1,5 @@ +package utils; + +public interface NumberGenerator { + int generate(); +} diff --git a/src/main/java/utils/RandomNumberGenerator.java b/src/main/java/utils/RandomNumberGenerator.java new file mode 100644 index 0000000..19173ca --- /dev/null +++ b/src/main/java/utils/RandomNumberGenerator.java @@ -0,0 +1,7 @@ +package utils; + +public class RandomNumberGenerator implements NumberGenerator{ + public int generate(){ + return (int) (Math.random() * 10); + } +} From 998b374ee96ccecfb7e008ed9f850f4f02eaddaf Mon Sep 17 00:00:00 2001 From: Jeongyeun Date: Sun, 24 Mar 2024 23:48:42 +0900 Subject: [PATCH 6/8] =?UTF-8?q?=EC=9E=90=EB=8F=99=EC=B0=A8=EC=9D=98=20?= =?UTF-8?q?=EC=9C=84=EC=B9=98=20=EC=A0=80=EC=9E=A5?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- src/main/java/Domain/Position.java | 16 ++++++++++++++++ 1 file changed, 16 insertions(+) create mode 100644 src/main/java/Domain/Position.java diff --git a/src/main/java/Domain/Position.java b/src/main/java/Domain/Position.java new file mode 100644 index 0000000..87a7a29 --- /dev/null +++ b/src/main/java/Domain/Position.java @@ -0,0 +1,16 @@ +package Domain; + +public class Position { //자동차의 위치 저장 + private int position; + + public Position(final int position){ + this.position = position; + } + + public void increase(){ //자동차를 전진시키는 메서드 + position++; + } + public int getPosition(){ + return position; + } +} From a321df80a56f811a8760fcaeb46bad095da6da51 Mon Sep 17 00:00:00 2001 From: Jeongyeun Date: Sun, 24 Mar 2024 23:49:14 +0900 Subject: [PATCH 7/8] =?UTF-8?q?=EC=BD=A4=EB=A7=88=20=EB=8B=A8=EC=9C=84?= =?UTF-8?q?=EB=A1=9C=20=EB=B6=84=EB=A6=AC=ED=95=98=EC=97=AC=20=EC=A0=80?= =?UTF-8?q?=EC=9E=A5?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- src/main/java/utils/StringParser.java | 9 +++++++++ 1 file changed, 9 insertions(+) create mode 100644 src/main/java/utils/StringParser.java diff --git a/src/main/java/utils/StringParser.java b/src/main/java/utils/StringParser.java new file mode 100644 index 0000000..db32bc7 --- /dev/null +++ b/src/main/java/utils/StringParser.java @@ -0,0 +1,9 @@ +package utils; + +import java.util.*; +public class StringParser { + public static List splitByComma(final String input){ //문자열을 ','기준으로 분리하여 저장하는 메서드 + String[] split = input.split(","); + return Arrays.asList(split); + } +} From a2e3048ba0f030d96c58da2372b77f999e9c274f Mon Sep 17 00:00:00 2001 From: Jeongyeun Date: Sun, 24 Mar 2024 23:49:52 +0900 Subject: [PATCH 8/8] =?UTF-8?q?=EC=B6=9C=EB=A0=A5=20=EB=B0=8F=20=EA=B2=8C?= =?UTF-8?q?=EC=9E=84=20=EC=88=98=ED=96=89=20=EA=B3=BC=EC=A0=95(=EB=AF=B8?= =?UTF-8?q?=EC=99=84=EC=84=B1)?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../java/Controller/GameManagerController.java | 10 ++++++++++ src/main/java/RacingMain.java | 9 ++++++--- src/main/java/View/OutputView.java | 17 +++++++++++++++++ 3 files changed, 33 insertions(+), 3 deletions(-) create mode 100644 src/main/java/Controller/GameManagerController.java create mode 100644 src/main/java/View/OutputView.java diff --git a/src/main/java/Controller/GameManagerController.java b/src/main/java/Controller/GameManagerController.java new file mode 100644 index 0000000..54b39d3 --- /dev/null +++ b/src/main/java/Controller/GameManagerController.java @@ -0,0 +1,10 @@ +package Controller; +//Controller는 Model과 View에 의존 가능 +public class GameManagerController { + /*public void play(){ + InputView.inputCarNames(); + + Result result = car.move(); + OutputView.printResult(result); + }*/ +} diff --git a/src/main/java/RacingMain.java b/src/main/java/RacingMain.java index 4394287..eb7268e 100644 --- a/src/main/java/RacingMain.java +++ b/src/main/java/RacingMain.java @@ -1,7 +1,10 @@ -public class RacingMain { +import View.InputView; +public class RacingMain { public static void main(String[] args) { - // TODO: MVC 패턴을 기반으로 자동차 경주 미션 구현해보기 - System.out.println("Hello, World!"); + + final var carNames = InputView.CarNames(); + final var tryCount = InputView.AttemptNum(); + } } diff --git a/src/main/java/View/OutputView.java b/src/main/java/View/OutputView.java new file mode 100644 index 0000000..ef9774d --- /dev/null +++ b/src/main/java/View/OutputView.java @@ -0,0 +1,17 @@ +package View; +//View는 Model에만 의존 +public class OutputView { + private static final String LINE_SEPARATOR = System.lineSeparator(); + private static final String RESULT_MESSAGE = "실행 결과"; + private static final String STATUS_PRINT_FORMAT = "%s : %s" + LINE_SEPARATOR; + private static final String WINNER_PRINT_FORMAT = "%s가 최종 우승했습니다." + LINE_SEPARATOR; + private static final String WORD_DELIMITER = ", "; + private static final String POSITION_SYMBOL = "-"; + + public static void printResult() { + System.out.println(RESULT_MESSAGE); + } + + + +}