diff --git a/README.md b/README.md index d0286c859f..e99ddf7885 100644 --- a/README.md +++ b/README.md @@ -1 +1,20 @@ # java-racingcar-precourse +# 구현할 기능 목록 + +## 입력 기능 +- 자동차 이름 입력받기 +- 시도 횟수 입력받기 + +## 검증 기능 +- 자동차 이름이 5자 이하인지 검증 +- 잘못된 입력 시 IllegalArgumentException 발생 + +## 자동차 경주 기능 +- 자동차 객체 생성 +- 0~9 사이 랜덤 값 생성 +- 랜덤 값이 4 이상이면 전진 +- 주어진 횟수만큼 경주 진행 + +## 출력 기능 +- 각 라운드마다 자동차 위치 출력 +- 최종 우승자 출력 (공동 우승자 포함) \ No newline at end of file diff --git a/src/main/java/racingcar/Application.java b/src/main/java/racingcar/Application.java index a17a52e724..f083f18262 100644 --- a/src/main/java/racingcar/Application.java +++ b/src/main/java/racingcar/Application.java @@ -1,7 +1,124 @@ package racingcar; +import camp.nextstep.edu.missionutils.Console; +import camp.nextstep.edu.missionutils.Randoms; + +import java.util.ArrayList; +import java.util.List; + public class Application { public static void main(String[] args) { - // TODO: 프로그램 구현 + try { + List cars = getCars(); + int rounds = getRounds(); + + System.out.println(); + System.out.println("실행 결과"); + playGame(cars, rounds); + + announceWinners(cars); + } catch (IllegalArgumentException e) { + throw e; + } + } + + private static List getCars() { + System.out.println("경주할 자동차 이름을 입력하세요.(이름은 쉼표(,) 기준으로 구분)"); + String input = Console.readLine(); + String[] names = input.split(","); + + List cars = new ArrayList<>(); + for (String name : names) { + validateName(name); + cars.add(new Car(name)); + } + return cars; + } + + private static void validateName(String name) { + if (name.length() > 5) { + throw new IllegalArgumentException("자동차 이름은 5자 이하여야 합니다."); + } + } + + private static int getRounds() { + System.out.println("시도할 횟수는 몇 회인가요?"); + String input = Console.readLine(); + return Integer.parseInt(input); + } + + private static void playGame(List cars, int rounds) { + for (int i = 0; i < rounds; i++) { + moveAllCars(cars); + printStatus(cars); + } + } + + private static void moveAllCars(List cars) { + for (Car car : cars) { + int randomValue = Randoms.pickNumberInRange(0, 9); + if (randomValue >= 4) { + car.move(); + } + } + } + + private static void printStatus(List cars) { + for (Car car : cars) { + System.out.println(car.getName() + " : " + car.getPosition()); + } + System.out.println(); + } + + private static void announceWinners(List cars) { + int maxDistance = getMaxDistance(cars); + List winners = getWinners(cars, maxDistance); + System.out.println("최종 우승자 : " + String.join(", ", winners)); + } + + private static int getMaxDistance(List cars) { + int max = 0; + for (Car car : cars) { + if (car.getDistance() > max) { + max = car.getDistance(); + } + } + return max; + } + + private static List getWinners(List cars, int maxDistance) { + List winners = new ArrayList<>(); + for (Car car : cars) { + if (car.getDistance() == maxDistance) { + winners.add(car.getName()); + } + } + return winners; } } + +class Car { + private final String name; + private int distance; + + public Car(String name) { + this.name = name; + this.distance = 0; + } + + public void move() { + distance++; + } + + public String getName() { + return name; + } + + public int getDistance() { + return distance; + } + + public String getPosition() { + return "-".repeat(distance); + } +} \ No newline at end of file