diff --git a/src/main/java/racingcar/Application.java b/src/main/java/racingcar/Application.java index a17a52e7..c048b909 100644 --- a/src/main/java/racingcar/Application.java +++ b/src/main/java/racingcar/Application.java @@ -1,7 +1,18 @@ package racingcar; +import java.util.List; + public class Application { public static void main(String[] args) { - // TODO: 프로그램 구현 + List carNames = InputView.getCarNames(); + int tryCount = InputView.getTryCount(); + + List cars = CarFactory.createCars(carNames); + + System.out.println(); + Race race = new Race(cars, tryCount); + race.start(); + + ResultView.printWinners(race.getWinners()); } } diff --git a/src/main/java/racingcar/Car.java b/src/main/java/racingcar/Car.java new file mode 100644 index 00000000..75a7d0a4 --- /dev/null +++ b/src/main/java/racingcar/Car.java @@ -0,0 +1,32 @@ +package racingcar; + +public class Car { + private static final int MOVE_THRESHOLD = 4; + private static final String POSITION_MARK = "-"; + + private final String name; + private int position = 0; + + public Car(String name) { + this.name = name; + } + + public void move(int randomNumber) { + if (randomNumber >= MOVE_THRESHOLD) { + position++; + } + } + + public int getPosition() { + return position; + } + + public String getName() { + return name; + } + + @Override + public String toString() { + return name + " : " + POSITION_MARK.repeat(position); + } +} diff --git a/src/main/java/racingcar/CarFactory.java b/src/main/java/racingcar/CarFactory.java new file mode 100644 index 00000000..8b18c11e --- /dev/null +++ b/src/main/java/racingcar/CarFactory.java @@ -0,0 +1,14 @@ +package racingcar; + +import java.util.List; +import java.util.stream.Collectors; +import racingcar.Car; + +public class CarFactory { + public static List createCars(List names) { + return names.stream() + .map(String::trim) + .map(Car::new) + .collect(Collectors.toList()); + } +} diff --git a/src/main/java/racingcar/InputView.java b/src/main/java/racingcar/InputView.java new file mode 100644 index 00000000..3e24f436 --- /dev/null +++ b/src/main/java/racingcar/InputView.java @@ -0,0 +1,28 @@ +package racingcar; + +import camp.nextstep.edu.missionutils.Console; + +import java.util.Arrays; +import java.util.List; + +public class InputView { + private static final int MAX_NAME_LENGTH = 5; + + public static List getCarNames() { + System.out.println("경주할 자동차 이름을 입력하세요.(이름은 쉼표(,) 기준으로 구분)"); + String input = Console.readLine(); + List names = Arrays.asList(input.split(",")); + + for (String name : names) { + if (name.trim().length() > MAX_NAME_LENGTH) { + throw new IllegalArgumentException("자동차 이름은 5자 이하만 가능합니다."); + } + } + return names; + } + + public static int getTryCount() { + System.out.println("시도할 회수는 몇회인가요?"); + return Integer.parseInt(Console.readLine()); + } +} diff --git a/src/main/java/racingcar/Race.java b/src/main/java/racingcar/Race.java new file mode 100644 index 00000000..4154256a --- /dev/null +++ b/src/main/java/racingcar/Race.java @@ -0,0 +1,45 @@ +package racingcar; + +import camp.nextstep.edu.missionutils.Randoms; + +import java.util.ArrayList; +import java.util.List; + +public class Race { + private final List cars; + private final int tryCount; + + public Race(List cars, int tryCount) { + this.cars = cars; + this.tryCount = tryCount; + } + + public void start() { + for (int i = 0; i < tryCount; i++) { + moveCars(); + ResultView.printRaceResult(cars); + } + } + + private void moveCars() { + for (Car car : cars) { + int number = Randoms.pickNumberInRange(0, 9); + car.move(number); + } + } + + 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/ResultView.java b/src/main/java/racingcar/ResultView.java new file mode 100644 index 00000000..4b311e13 --- /dev/null +++ b/src/main/java/racingcar/ResultView.java @@ -0,0 +1,16 @@ +package racingcar; + +import java.util.List; + +public class ResultView { + public static void printRaceResult(List cars) { + for (Car car : cars) { + System.out.println(car); + } + System.out.println(); + } + + public static void printWinners(List winners) { + System.out.println("최종 우승자 : " + String.join(", ", winners)); + } +}