diff --git a/docs/README.md b/docs/README.md index e69de29..cef8ada 100644 --- a/docs/README.md +++ b/docs/README.md @@ -0,0 +1,29 @@ +## 기능명세 +### 1. 자동차 이름을 입력받기 위한 화면을 구성한다. +- 자동차 이름 입력받기 + - 자동차 이름이 5자 이하인 경우에만 입력받기 + - 자동차 이름에 쉼표(,)로 구분된 이름이 1개 이상인 경우에만 입력받기 + - 같은 이름의 자동차가 존재하지 않는 경우에만 입력받기 +- 자동차 이름 저장하기 + - 자동차 이름을 쉼표(,)로 구분하여 저장하기 +- 예외 발생 시 에러 던지고 종료 + +### 2. 시도할 회수를 입력받기 위한 화면을 구성한다. +- 시도할 회수 입력받기 + - 시도할 회수가 1 이상인 경우에만 입력받기 + - 시도할 회수가 숫자인 경우에만 입력받기 +- 시도할 회수 저장하기 + - 시도할 회수를 저장하기 + - 정수로 저장하기 +- 예외 발생 시 에러 던지고 종료 + +### 3. 자동차 경주를 진행한다. +- 시도할 회수를 입력 받은 대로 자동차를 전진시킨다. +- 차수별 자동차 이름과 전진한 거리를 출력한다. + +### 4. 경주 결과를 출력한다. +- 경주 결과를 출력한다. +- 우승자를 출력한다. + +### 5. 경주 게임을 종료한다. +- 경주 게임을 종료한다. \ No newline at end of file diff --git a/src/main/java/racingcar/Application.java b/src/main/java/racingcar/Application.java index a17a52e..c17d422 100644 --- a/src/main/java/racingcar/Application.java +++ b/src/main/java/racingcar/Application.java @@ -1,7 +1,25 @@ package racingcar; +import racingcar.controller.InputController; +import racingcar.model.RacingCar; +import racingcar.view.ResultView; + public class Application { + public static void main(String[] args) { // TODO: 프로그램 구현 + startGame(); + } + + // 게임 시작 + public static void startGame() { + InputController.createRacingCar(); + int round = InputController.setRoundNum(); + ResultView.printResult(); + for (int i = 0; i < round; i++) { + RacingCar.moveCars(); + System.out.println(); + } + RacingCar.getWinners(); } -} +} \ No newline at end of file diff --git a/src/main/java/racingcar/controller/InputController.java b/src/main/java/racingcar/controller/InputController.java new file mode 100644 index 0000000..6e6194d --- /dev/null +++ b/src/main/java/racingcar/controller/InputController.java @@ -0,0 +1,18 @@ +package racingcar.controller; +import racingcar.model.NameValid; +import racingcar.model.NumberVaild; +import racingcar.model.RacingCar; +import racingcar.view.InputView; + +public class InputController { + // 레이싱 자동차를 생성한다. + public static void createRacingCar() { + NameValid nameValid = new NameValid(InputView.carNameInput()); + new RacingCar(nameValid.getNames()); + } + + public static int setRoundNum() { + NumberVaild validation = new NumberVaild(Integer.parseInt(InputView.tryCountInput())); + return validation.getNumber(); + } +} diff --git a/src/main/java/racingcar/model/Car.java b/src/main/java/racingcar/model/Car.java new file mode 100644 index 0000000..d6fddfa --- /dev/null +++ b/src/main/java/racingcar/model/Car.java @@ -0,0 +1,28 @@ +package racingcar.model; + +public class Car{ + private final String name; + private int position; + + public Car(String name){ + this.name = name; + this.position = 0; + } + + public void move(){ + // 매개변수로 랜덤 값을 주면 테스트하기 좋아진다. + // 랜덤 값이 4 이상이면 전진한다. + if(RandomNumber.getRandomNumber() >= 4){ + position++; + } + } + + // 최대 위치 반환 + public int getPosition(){ + return position; + } + + public String getName() { + return name.replace(" ", ""); + } +} diff --git a/src/main/java/racingcar/model/NameValid.java b/src/main/java/racingcar/model/NameValid.java new file mode 100644 index 0000000..0ef3150 --- /dev/null +++ b/src/main/java/racingcar/model/NameValid.java @@ -0,0 +1,49 @@ +package racingcar.model; + +import java.util.ArrayList; +import java.util.Arrays; + +public class NameValid { + final ArrayList names; + + public ArrayList toArrayList(String carsString) { + String[] carNames = carsString.trim().split(","); + return new ArrayList<>(Arrays.asList(carNames)); + } + + public NameValid(String carName) { + this.names = toArrayList(carName); + isValid(); + } + + // 자동차 이름이 5자 이하인지 확인 + public void isNameValid() { + for (String name : names) { + if (name.length() > 5) { + throw new IllegalArgumentException("자동차 이름은 5자 이하만 가능합니다."); + } + } + } + + // 자동차 이름이 중복되는지 확인 + public void isNameDuplicate() { + for (int i = 0; i < names.size(); i++) { + for (int j = i + 1; j < names.size(); j++) { + if (names.get(i).equals(names.get(j))) { + // 에러 반환 + throw new IllegalArgumentException("중복된 이름이 존재합니다."); + } + } + } + } + + // 자동차 이름이 유효한지 확인 + public void isValid() { + isNameValid(); + isNameDuplicate(); + } + + public ArrayList getNames() { + return names; + } +} diff --git a/src/main/java/racingcar/model/NumberVaild.java b/src/main/java/racingcar/model/NumberVaild.java new file mode 100644 index 0000000..30bea52 --- /dev/null +++ b/src/main/java/racingcar/model/NumberVaild.java @@ -0,0 +1,34 @@ +package racingcar.model; + +public class NumberVaild { + private static int number = 0; + + public NumberVaild(int number) { + NumberVaild.number = number; + isValid(); + } + + // 숫자가 맞는지 확인한다. + public void isValid() { + isNumber(); + isPositiveNumber(); + } + + // 숫자만 입력했는지 확인한다. + public void isNumber() { + if (!String.valueOf(number).matches("^[0-9]*$")) { + throw new IllegalArgumentException("숫자만 입력해주세요."); + } + } + + // 0보다 큰 숫자인지 확인한다. + public void isPositiveNumber() { + if (number < 0) { + throw new IllegalArgumentException("0보다 큰 숫자를 입력해주세요."); + } + } + + public int getNumber() { + return number; + } +} diff --git a/src/main/java/racingcar/model/RacingCar.java b/src/main/java/racingcar/model/RacingCar.java new file mode 100644 index 0000000..bcec40f --- /dev/null +++ b/src/main/java/racingcar/model/RacingCar.java @@ -0,0 +1,44 @@ +package racingcar.model; + +import racingcar.view.ResultView; + +import java.util.ArrayList; + +public class RacingCar { + private static final ArrayList cars = new ArrayList<>(); + + public RacingCar(ArrayList cars) { + for (String car : cars) { + RacingCar.cars.add(new Car(car)); + } + } + + // 자동차들을 이동시킨다. + public static void moveCars() { + for (Car car : cars) { + car.move(); + ResultView.printRoundResult(car.getName(), car.getPosition()); + } + } + + // 우승자를 반환한다. + public static void getWinners() { + ArrayList winners = new ArrayList<>(); + int maxPosition = getMaxPosition(); + for (Car car : cars) { + if (car.getPosition() == maxPosition) { + winners.add(car.getName()); + } + } + ResultView.printWinner(winners); + } + + // 최대 이동값 + private static int getMaxPosition() { + int maxPosition = 0; + for (Car car : cars) { + maxPosition = Math.max(maxPosition, car.getPosition()); + } + return maxPosition; + } +} diff --git a/src/main/java/racingcar/model/RandomNumber.java b/src/main/java/racingcar/model/RandomNumber.java new file mode 100644 index 0000000..03f7ef4 --- /dev/null +++ b/src/main/java/racingcar/model/RandomNumber.java @@ -0,0 +1,8 @@ +package racingcar.model; +import camp.nextstep.edu.missionutils.Randoms; + +public class RandomNumber { + public static int getRandomNumber() { + return Randoms.pickNumberInRange(0,9); + } +} diff --git a/src/main/java/racingcar/view/InputView.java b/src/main/java/racingcar/view/InputView.java new file mode 100644 index 0000000..36b881c --- /dev/null +++ b/src/main/java/racingcar/view/InputView.java @@ -0,0 +1,20 @@ +package racingcar.view; +import camp.nextstep.edu.missionutils.Console; + +public class InputView { + + private InputView() { + } + + // 자동차의 이름을 입력받는다. + public static String carNameInput() { + System.out.println("경주할 자동차 이름을 입력하세요.(이름은 쉼표(,) 기준으로 구분)"); + return Console.readLine(); + } + + // 시도할 회수를 입력받는다. + public static String tryCountInput() { + System.out.println("시도할 회수는 몇회인가요?"); + return Console.readLine(); + } +} diff --git a/src/main/java/racingcar/view/ResultView.java b/src/main/java/racingcar/view/ResultView.java new file mode 100644 index 0000000..94f92aa --- /dev/null +++ b/src/main/java/racingcar/view/ResultView.java @@ -0,0 +1,32 @@ +package racingcar.view; + +import java.util.ArrayList; + +public class ResultView { + + private ResultView() { + } + + // 경주 결과를 출력한다. + public static void printResult() { + System.out.println("실행 결과"); + } + + // 라운드 결과 출력 + public static void printRoundResult(String name, int position) { + System.out.print(name + " : "); + System.out.print("-".repeat(position)); + System.out.println(); + } + + // 최종 우승자를 출력한다. + public static void printWinner(ArrayList winners) { + System.out.print("최종 우승자 : "); + for (int i = 0; i < winners.size(); i++) { + System.out.print(winners.get(i)); + if (i != winners.size() - 1) { + System.out.print(", "); + } + } + } +}