diff --git a/src/main/java/racingcar/Application.java b/src/main/java/racingcar/Application.java index b9ed0456a3..b08f5bccaa 100644 --- a/src/main/java/racingcar/Application.java +++ b/src/main/java/racingcar/Application.java @@ -1,7 +1,99 @@ package racingcar; +import camp.nextstep.edu.missionutils.Console; + +import java.util.ArrayList; +import java.util.Arrays; +import java.util.List; + public class Application { public static void main(String[] args) { - // TODO 구현 진행 + List cars = createCars(); + + int tryCount = receiveTryCount(); + + runRacingGame(cars, tryCount); + + printWinners(findWinners(cars)); + } + + private static List createCars() { + List carNames = null; + List cars = new ArrayList<>(); + while (carNames == null) { + System.out.println("경주할 자동차 이름을 입력하세요. (이름은 쉼표(,) 기준으로 구분)"); + String input = Console.readLine(); + try { + carNames = Arrays.asList(input.split(",")); + carNames.forEach(inputName -> cars.add(new Car(inputName))); // carNames 리스트의 각 요소를 inputName으로 받아서 객체를 생성하고 cars 리스트에 추가함. + break; + } catch (IllegalArgumentException e) { + System.out.println("[ERROR] 올바른 형식의 자동차 이름을 입력하세요."); + } + } + return cars; + } + + private static int receiveTryCount() { + int tryCount = 0; + while (tryCount == 0) { + System.out.println("시도할 횟수는 몇 회인가요?"); + String input = Console.readLine(); + try { + tryCount = Integer.parseInt(input); // 문자열을 정수로 변환하는 문법 + validateTryCount(tryCount); + break; + } + catch (IllegalArgumentException e) { + System.out.println("[ERROR] 올바른 형식의 숫자를 입력하세요."); + } + } + return tryCount; + } + + private static void validateTryCount(int tryCount) { + if (tryCount <= 0) { + throw new IllegalArgumentException(); + } + } + + private static void runRacingGame(List cars, int tryCount) { + System.out.println("\n실행 결과"); + for (int i = 0; i < tryCount; i++) { + for (Car car : cars) { + car.moveForward(); + } + printRoundResult(cars); + } + } + + private static void printRoundResult(List cars) { + for (Car car : cars) { + System.out.println(car.getName() + " : " + new String(new char[car.getPosition()]).replace('\0', '-')); + } + System.out.println(); + } + + private static List findWinners(List cars) { + int maxPosition = getMaxPosition(cars); + List winners = new ArrayList<>(); + for (Car car : cars) { + if (car.getPosition() == maxPosition) { + winners.add(car.getName()); + } + } + return winners; + } + + private static int getMaxPosition(List cars) { + int maxPosition = 0; + for (Car car : cars) { + maxPosition = Math.max(maxPosition, car.getPosition()); + } + return maxPosition; + } + + private static void printWinners(List winners) { + System.out.println("최종 우승자 : " + String.join(", ", winners)); } } diff --git a/src/main/java/racingcar/Car.java b/src/main/java/racingcar/Car.java index ab3df94921..65d59a59b8 100644 --- a/src/main/java/racingcar/Car.java +++ b/src/main/java/racingcar/Car.java @@ -1,12 +1,36 @@ package racingcar; +import camp.nextstep.edu.missionutils.Randoms; + public class Car { + static final int MAX_NAME_LENGTH = 5; private final String name; - private int position = 0; + private int position; + + public Car(String inputName) { + validateCarNames(inputName); + this.name = inputName; + this.position = 0; + } + + public void moveForward() { + int randomValue = Randoms.pickNumberInRange(0,9); + if (randomValue >= 4) { + position++; + } + } + + public String getName() { + return name; + } - public Car(String name) { - this.name = name; + public int getPosition() { + return position; } - // 추가 기능 구현 + private void validateCarNames(String inputName) { + if (inputName.isEmpty() || inputName.length() > MAX_NAME_LENGTH) { + throw new IllegalArgumentException(); + } + } }