diff --git a/src/main/java/racingcar/Application.java b/src/main/java/racingcar/Application.java index a17a52e..bbba48d 100644 --- a/src/main/java/racingcar/Application.java +++ b/src/main/java/racingcar/Application.java @@ -2,6 +2,7 @@ public class Application { public static void main(String[] args) { - // TODO: 프로그램 구현 + GameController gameController = new GameController(); + gameController.run(); } -} +} \ 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 0000000..3bff98d --- /dev/null +++ b/src/main/java/racingcar/Car.java @@ -0,0 +1,29 @@ +package racingcar; + +public class Car { + String name; + int position = 0; + + public Car(String name) { + this.name = name; + } + + public void move(int number) { + if (number >= 4) position++; + } + + public String getName() { + return name; + } + public int getPosition() { + return position; + } + + public String setName(String name) { + return this.name = name; + } + + public int setPosition(int position) { + return this.position = position; + } +} \ No newline at end of file diff --git a/src/main/java/racingcar/GameController.java b/src/main/java/racingcar/GameController.java new file mode 100644 index 0000000..d95ed4e --- /dev/null +++ b/src/main/java/racingcar/GameController.java @@ -0,0 +1,55 @@ +package racingcar; + +import camp.nextstep.edu.missionutils.Randoms; +import java.util.ArrayList; +import java.util.List; + +public class GameController { + private InputView inputView = new InputView(); + private OutputView outputView = new OutputView(); + private List cars = new ArrayList<>(); + + //게임 실행 메인 로직 + public void run() { + String[] carNames = inputView.getCarNames(); + for (String name : carNames) { + cars.add(new Car(name.trim())); + } + + int attemptCount = inputView.getCount(); + outputView.printExecutionResultMessage(); + + for (int i = 0; i < attemptCount; i++) { + playRound(); + outputView.printRaceStatus(cars); + } + + List winners = findWinners(); + outputView.printFinalWinners(winners); + } + + private void playRound() { + for (Car car : cars) { + int randomNumber = Randoms.pickNumberInRange(0, 9); + car.move(randomNumber); + } + } + + private List findWinners() { + // 가장 멀리 간 자동차의 위치 확인 + int maxPosition = 0; + for (Car car : cars) { + if (car.getPosition() > maxPosition) { + maxPosition = car.getPosition(); + } + } + //위에서 찾은 최고 기록과 똑같은 위치에 있는 자동차 이름을 다 모음. + List winners = new ArrayList<>(); + for (Car car : cars) { + if (car.getPosition() == maxPosition) { + winners.add(car.getName()); + } + } + return winners; + } +} \ No newline at end of file diff --git a/src/main/java/racingcar/InputView.java b/src/main/java/racingcar/InputView.java new file mode 100644 index 0000000..9098ffb --- /dev/null +++ b/src/main/java/racingcar/InputView.java @@ -0,0 +1,56 @@ +package racingcar; + +import camp.nextstep.edu.missionutils.Console; +import java.util.ArrayList; +import java.util.List; + +public class InputView { + public String[] getCarNames() { + System.out.println("경주할 자동차 이름을 입력하세요.(이름은 쉼표(,) 기준으로 구분)"); + String input = Console.readLine(); + String[] names = input.split(","); + validateCarNames(names); + return names; + } + + public int getCount() { + System.out.println("시도할 회수는 몇회인가요?"); + String input = Console.readLine(); //처음부터 int로 받는 것보다 String으로 받고 int로 바꾸는게 더 정확함 + try { + int count = Integer.parseInt(input); + if (count <= 0) { + throw new IllegalArgumentException("시도 횟수는 0보다 커야 합니다."); + } + return count; + } catch (NumberFormatException e) { + throw new IllegalArgumentException("시도 횟수는 숫자여야 합니다."); + } + } + + + private void validateCarNames(String[] names) { + List nameList = new ArrayList<>(); + + for (String name : names) { + // 공백이 들어있는지 확인 + if(name.contains(" ")) { + throw new IllegalArgumentException("자동차 이름에는 공백이 포함될 수 없습니다."); + } + // 이름이 비어있는지 확인 + String trimmedName = name.trim(); + if (trimmedName.isEmpty()) { + throw new IllegalArgumentException("자동차 이름은 빈 값일 수 없습니다."); + } + // 5자가 넘는지 확인 + if (trimmedName.length() > 5) { + throw new IllegalArgumentException("자동차 이름은 5자 이하만 가능합니다."); + } + // 이미 나온 이름인지 확인 (중복 체크) + if (nameList.contains(name)) { + throw new IllegalArgumentException("중복된 이름이 있습니다."); + } + + nameList.add(name); // 검사를 통과한 이름은 리스트에 보관 + } + } +} \ No newline at end of file diff --git a/src/main/java/racingcar/OutputView.java b/src/main/java/racingcar/OutputView.java new file mode 100644 index 0000000..e59cc6d --- /dev/null +++ b/src/main/java/racingcar/OutputView.java @@ -0,0 +1,28 @@ +package racingcar; + +import java.util.List; + +public class OutputView { + + public void printExecutionResultMessage() { + System.out.println("\n실행 결과"); + } + + public void printRaceStatus(List cars) { + for (Car car : cars) { + System.out.print(car.getName() + " : "); + + for (int i = 0; i < car.getPosition(); i++) { + System.out.print("-"); + } + + System.out.println(); + } + System.out.println(); + } + + public void printFinalWinners(List winners) { + String result = String.join(", ", winners); + System.out.println("최종 우승자 : " + result); + } +} \ No newline at end of file