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/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(); + } + +} 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; + } +} 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; + } + +} 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; + } +} 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/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(); + } + } + +} 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); + } + + + +} 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); + } +} 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); + } +}