diff --git a/src/main/java/racingcar/Application.java b/src/main/java/racingcar/Application.java index a17a52e7..e7b2e5f7 100644 --- a/src/main/java/racingcar/Application.java +++ b/src/main/java/racingcar/Application.java @@ -2,6 +2,13 @@ public class Application { public static void main(String[] args) { - // TODO: 프로그램 구현 + + Car car = new Car(); + String[] carNames = car.getCarNames(); + int rounds = car.getRounds(); + + Racing racing = new Racing(carNames, rounds); + racing.startRace(); + } -} +} \ No newline at end of file diff --git a/src/main/java/racingcar/Car.java b/src/main/java/racingcar/Car.java new file mode 100644 index 00000000..52ce377b --- /dev/null +++ b/src/main/java/racingcar/Car.java @@ -0,0 +1,42 @@ +package racingcar; +import camp.nextstep.edu.missionutils.Console; + +public class Car { + private final int MAX_NAME = 5; + + public String[] getCarNames() { + String[] carNames = readCarNames(); + validCarNames(carNames); + return carNames; + } + + // 자동차 이름 입력 + private String[] readCarNames() { + System.out.println("경주할 자동차 이름을 입력하세요. (이름은 쉼표(,) 기준으로 구분)"); + String carString = Console.readLine(); + return carString.split(","); + } + + // 이름 예외 처리 + private void validCarNames(String[] carNames) { + for (String carName : carNames) { + if (carName.length() > MAX_NAME) { + throw new IllegalArgumentException("[ERROR] 이름은 5자 이하만 가능합니다."); + } + } + } + + public int getRounds() { + // 시도 횟수 입력 + System.out.println("시도할 횟수를 입력하세요."); + String input = Console.readLine(); + + // 시도 횟수 예외 처리 + try { + int rounds = Integer.parseInt(input); + return rounds; + } catch (NumberFormatException e) { + throw new IllegalArgumentException("[ERROR] 시도 횟수는 숫자여야 합니다."); + } + } +} \ No newline at end of file diff --git a/src/main/java/racingcar/Racing.java b/src/main/java/racingcar/Racing.java new file mode 100644 index 00000000..3f0dbfb2 --- /dev/null +++ b/src/main/java/racingcar/Racing.java @@ -0,0 +1,85 @@ +package racingcar; +import camp.nextstep.edu.missionutils.Randoms; +import java.util.ArrayList; +import java.util.List; + +public class Racing { + private final String[] carNames; + private final int rounds; + private final int[] positions; + + public Racing(String[] carNames, int rounds) { + this.carNames = carNames; + this.rounds = rounds; + this.positions = new int[carNames.length]; + } + + // 레이스 시작 + public void startRace() { + System.out.println("\n실행 결과"); + for (int i = 0; i < rounds; i++) { + playRound(); + printResult(); + } + printWinners(); + } + + // 한 라운드 실행 + private void playRound() { + for (int i = 0; i < carNames.length; i++) { + moveCar(i); + } + } + + // 이동 여부 확인 + private void moveCar(int carIndex) { + if (shouldMove()) { + positions[carIndex]++; + } + } + + // 이동 여부 결정 + private boolean shouldMove() { + final int MOVE_NUMBER = 4; + final int START_NUMBER = 0; + final int END_NUMBER = 9; + int randomNumber = Randoms.pickNumberInRange(START_NUMBER, END_NUMBER); + return randomNumber >= MOVE_NUMBER; + } + + // 결과 출력 + private void printResult() { + for (int i = 0; i < carNames.length; i++) { + System.out.println(carNames[i] + " : " + "-".repeat(positions[i])); + } + System.out.println(); + } + + // 최종 승리자 + private void printWinners() { + int maxPosition = 0; + for (int nowPosition : positions) { + maxPosition = getMax(maxPosition, nowPosition); + } + + List winners = new ArrayList<>(); + for (int i = 0; i < carNames.length; i++) { + addWinner(winners, carNames[i], positions[i], maxPosition); + } + + String winnerString = String.join(", ", winners); + System.out.println("최종 우승자 : " + winnerString); + } + + // 최대값 비교 + private int getMax(int currentMax, int nowPosition) { + return nowPosition > currentMax ? nowPosition : currentMax; + } + + //우승자 추가 + private void addWinner(List winners, String carName, int position, int maxPosition) { + if (position == maxPosition) { + winners.add(carName); + } + } +} \ No newline at end of file