diff --git a/src/main/java/racingcar/Application.java b/src/main/java/racingcar/Application.java index b9ed045..48174a7 100644 --- a/src/main/java/racingcar/Application.java +++ b/src/main/java/racingcar/Application.java @@ -1,7 +1,51 @@ package racingcar; +import java.util.ArrayList; +import java.util.List; + public class Application { public static void main(String[] args) { - // TODO 구현 진행 + InputView inputView = new InputView(); + OutputView outputView = new OutputView(); + + List cars = initializeCars(inputView.receiveCarNames()); + int attemptNumber = inputView.receiveAttemptNumber(); + + outputView.printPreface(); + for (int i = 0; i < attemptNumber; i++) { + moveCars(cars); + outputView.printExecutionResults(cars); + } + + outputView.printFinalWinner(getWinnerNames(cars)); + } + + private static List initializeCars(List carNames) { + List cars = new ArrayList<>(); + for (String name : carNames) { + cars.add(new Car(name)); + } + return cars; + } + + private static void moveCars(List cars) { + for (Car car : cars) { + car.forward(); + } + } + + private static List getWinnerNames(List cars) { + List winnerNames = new ArrayList<>(); + int max = 0; + for (Car car : cars) { + if (car.getPosition() > max) { + winnerNames.clear(); + max = car.getPosition(); + } + if (car.getPosition() == max) { + winnerNames.add(car.getName()); + } + } + return winnerNames; } } diff --git a/src/main/java/racingcar/Car.java b/src/main/java/racingcar/Car.java index ab3df94..80bf198 100644 --- a/src/main/java/racingcar/Car.java +++ b/src/main/java/racingcar/Car.java @@ -1,5 +1,7 @@ package racingcar; +import static camp.nextstep.edu.missionutils.Randoms.pickNumberInRange; + public class Car { private final String name; private int position = 0; @@ -8,5 +10,25 @@ public Car(String name) { this.name = name; } - // 추가 기능 구현 + public String getName() { + return name; + } + + public int getPosition() { + return position; + } + + public void forward() { + if (pickNumberInRange(0, 9) >= 4) { + this.position++; + } + } + + public String toString() { + StringBuilder bar = new StringBuilder(); + for (int i = 0; i < this.position; i++) { + bar.append("-"); + } + return this.name + " : " + bar; + } } diff --git a/src/main/java/racingcar/InputView.java b/src/main/java/racingcar/InputView.java new file mode 100644 index 0000000..01f65f3 --- /dev/null +++ b/src/main/java/racingcar/InputView.java @@ -0,0 +1,51 @@ +package racingcar; + +import java.util.Arrays; +import java.util.List; +import java.util.regex.Pattern; + +import static camp.nextstep.edu.missionutils.Console.readLine; + +public class InputView { + public List receiveCarNames() { + while (true) { + System.out.println("경주할 자동차 이름을 입력하세요.(이름은 쉼표(,) 기준으로 구분)"); + List carNames = Arrays.asList(readLine().split(",")); + try { + validateCarNames(carNames); + } catch (IllegalArgumentException iae) { + System.out.println(iae.getMessage()); + continue; + } + return carNames; + } + } + + private void validateCarNames(List carNames) { + for (String name : carNames) { + if (name.length() > 5) { + throw new IllegalArgumentException("[ERROR] 자동차의 이름은 5자 이하만 가능합니다."); + } + } + } + + public int receiveAttemptNumber() { + while (true) { + System.out.println("시도할 횟수는 몇 회인가요?"); + String attemptNumber = readLine(); + try { + validateAttemptNumber(attemptNumber); + } catch (IllegalArgumentException iae) { + System.out.println(iae.getMessage()); + continue; + } + return Integer.parseInt(attemptNumber); + } + } + + private void validateAttemptNumber(String attemptNumber) { + if (!Pattern.matches("^[0-9]+$", attemptNumber)) { + throw new IllegalArgumentException("[ERROR] 숫자만 입력할 수 있습니다."); + } + } +} diff --git a/src/main/java/racingcar/OutputView.java b/src/main/java/racingcar/OutputView.java new file mode 100644 index 0000000..753c32e --- /dev/null +++ b/src/main/java/racingcar/OutputView.java @@ -0,0 +1,21 @@ +package racingcar; + +import java.util.List; + +public class OutputView { + public void printExecutionResults(List cars) { + for (Car car : cars) { + System.out.println(car); + } + System.out.println(); + } + + public void printPreface() { + System.out.println(); + System.out.println("실행 결과"); + } + + public void printFinalWinner(List names) { + System.out.println("최종 우승자 : " + String.join(", ", names)); + } +} diff --git "a/\352\270\260\353\212\245\353\252\251\353\241\235.md" "b/\352\270\260\353\212\245\353\252\251\353\241\235.md" new file mode 100644 index 0000000..fba2038 --- /dev/null +++ "b/\352\270\260\353\212\245\353\252\251\353\241\235.md" @@ -0,0 +1,12 @@ +# 기능 목록 + +- 경주할 자동차를 입력 + - 각 자동차의 이름이 5자 이하인지 확인 +- 시도할 횟수를 입력 +- 각 차수별로 하위 기능들을 실행 + - 0~9의 무작위 값을 생성 + - 4 이상의 값인지 판단 + - 4 이상이라면 자동차를 전진 + - 각 차수의 결과를 출력 +- 우승자 목록을 생성 +- 최종 우승자를 출력 \ No newline at end of file