diff --git a/README.md b/README.md index d0286c859f..d355363234 100644 --- a/README.md +++ b/README.md @@ -1 +1,9 @@ -# java-racingcar-precourse +## 기능 목록 + +1. 경주할 자동차 이름을 입력받는다. (이름은 쉼표로, 각 이름은 5자 이하) +2. 시도할 횟수를 입력받는다. (양의 정수) +3. 각 자동차가 0~9 중에 4 이상이면 전진한다. +4. 매 시도마다 자동차의 이동 결과를 출력한다. +5. 모든 시도 후 최종 우승자를 출력한다. (공동 우승자는 쉼표로 구분) +6. 잘못된 입력 시 IllegalArgumentException 발생 후 프로그램 종료. + diff --git a/src/main/java/racingcar/Application.java b/src/main/java/racingcar/Application.java index a17a52e724..56bacad74a 100644 --- a/src/main/java/racingcar/Application.java +++ b/src/main/java/racingcar/Application.java @@ -1,7 +1,10 @@ package racingcar; +import racingcar.controller.RacingController; + public class Application { public static void main(String[] args) { - // TODO: 프로그램 구현 + RacingController controller = new RacingController(); + controller.run(); } } diff --git a/src/main/java/racingcar/controller/RacingController.java b/src/main/java/racingcar/controller/RacingController.java new file mode 100644 index 0000000000..86098dd5b4 --- /dev/null +++ b/src/main/java/racingcar/controller/RacingController.java @@ -0,0 +1,39 @@ +package racingcar.controller; + +import racingcar.domain.Car; +import racingcar.domain.Cars; +import racingcar.view.InputView; +import racingcar.view.OutputView; + +import java.util.ArrayList; +import java.util.List; + +public class RacingController { + public void run() { + + String[] names = InputView.readCarNames(); + int attemptCount = InputView.readAttemptCount(); + + + List carList = new ArrayList<>(); + for (String name : names) { + carList.add(new Car(name.trim())); + } + Cars cars = new Cars(carList); + + + OutputView.printResultTitle(); + + + for (int i = 0; i < attemptCount; i++) { + for (Car car : cars.getCars()) { + car.move(); + } + OutputView.printRoundResult(cars.getCars()); + } + + + OutputView.printWinners(cars.getWinners()); + } + +} diff --git a/src/main/java/racingcar/domain/Car.java b/src/main/java/racingcar/domain/Car.java new file mode 100644 index 0000000000..70dd292567 --- /dev/null +++ b/src/main/java/racingcar/domain/Car.java @@ -0,0 +1,29 @@ +package racingcar.domain; + +import camp.nextstep.edu.missionutils.Randoms; + +public class Car { + private static final int MOVE_THRESHOLD = 4; + + private final String name; + private int position = 0; + + public Car(String name) { + this.name = name; + } + + public void move() { + int randomNumber = Randoms.pickNumberInRange(0, 9); + if (randomNumber >= MOVE_THRESHOLD) { + position++; + } + } + + public String getName() { + return name; + } + + public int getPosition() { + return position; + } +} diff --git a/src/main/java/racingcar/domain/Cars.java b/src/main/java/racingcar/domain/Cars.java new file mode 100644 index 0000000000..d50add8e7b --- /dev/null +++ b/src/main/java/racingcar/domain/Cars.java @@ -0,0 +1,32 @@ +package racingcar.domain; + +import java.util.ArrayList; +import java.util.Collections; +import java.util.List; + +public class Cars { + private final List cars; + + public Cars(List cars) { + this.cars = cars; + } + + public List getCars() { + return Collections.unmodifiableList(cars); + } + + public List getWinners() { + int maxPosition = cars.stream() + .mapToInt(Car::getPosition) + .max() + .orElse(0); + + List winners = new ArrayList<>(); + for (Car car : cars) { + if (car.getPosition() == maxPosition) { + winners.add(car.getName()); + } + } + return winners; + } +} diff --git a/src/main/java/racingcar/view/InputView.java b/src/main/java/racingcar/view/InputView.java new file mode 100644 index 0000000000..03ee3de40b --- /dev/null +++ b/src/main/java/racingcar/view/InputView.java @@ -0,0 +1,34 @@ +package racingcar.view; + +import camp.nextstep.edu.missionutils.Console; + +public class InputView { + public static String[] readCarNames() { + System.out.println("경주할 자동차 이름을 입력하세요.(이름은 쉼표(,) 기준으로 구분)"); + String input = Console.readLine(); + String[] names = input.split(","); + + for (String name : names) { + String trimmed = name.trim(); + if (trimmed.isEmpty() || trimmed.length() > 5) { + throw new IllegalArgumentException("자동차 이름은 1~5자여야 합니다: " + trimmed); + } + } + return names; + } + + public static int readAttemptCount() { + System.out.println("시도할 횟수는 몇 회인가요?"); + String input = Console.readLine(); + + try { + int count = Integer.parseInt(input.trim()); + if (count <= 0) { + throw new IllegalArgumentException("시도 횟수는 1 이상의 정수여야 합니다."); + } + return count; + } catch (NumberFormatException e) { + throw new IllegalArgumentException("시도 횟수는 숫자로 입력해야 합니다."); + } + } +} diff --git a/src/main/java/racingcar/view/OutputView.java b/src/main/java/racingcar/view/OutputView.java new file mode 100644 index 0000000000..8ebecb5a27 --- /dev/null +++ b/src/main/java/racingcar/view/OutputView.java @@ -0,0 +1,26 @@ +package racingcar.view; + +import racingcar.domain.Car; +import java.util.List; +import java.util.stream.Collectors; + +public class OutputView { + + public static void printRoundResult(List cars) { + for (Car car : cars) { + String progress = "-".repeat(car.getPosition()); + System.out.println(car.getName() + " : " + progress); + } + System.out.println(); + } + + public static void printResultTitle() { + System.out.println("\n실행 결과"); + } + + public static void printWinners(List winners) { + String result = winners.stream() + .collect(Collectors.joining(", ")); + System.out.println("최종 우승자 : " + result); + } +}