diff --git a/TODOList.md b/TODOList.md new file mode 100644 index 0000000..8596404 --- /dev/null +++ b/TODOList.md @@ -0,0 +1,10 @@ +# 기능 목록 +1. 경주할 자동차의 이름을 입력 받는다 +2. 입력 받은 자동차 이름을 검증 한 후 실패시 에러를 띄운다 +3. 시도할 횟수를 입력 받는다 +4. 시도할 횟수를 검증 한 후 실패시 에러를 띄운다 +5. 시도할 횟수에 맞게 무작위 값을 계산한다 +6. 무작위 값에 따라 자동차들을 전진 시킨다 +7. 전진시킬 때마다 각 차수별 실행 결과를 출력한다 +8. 전진이 끝나면 우승자를 뽑는다 +9. 우승자들을 출력한다 \ No newline at end of file diff --git a/src/main/java/racingcar/Application.java b/src/main/java/racingcar/Application.java index b9ed045..4be2d1c 100644 --- a/src/main/java/racingcar/Application.java +++ b/src/main/java/racingcar/Application.java @@ -3,5 +3,7 @@ public class Application { public static void main(String[] args) { // TODO 구현 진행 + CarGame carGame = new CarGame(); + carGame.start(); } } diff --git a/src/main/java/racingcar/Car.java b/src/main/java/racingcar/Car.java index ab3df94..5e91b90 100644 --- a/src/main/java/racingcar/Car.java +++ b/src/main/java/racingcar/Car.java @@ -9,4 +9,16 @@ public Car(String name) { } // 추가 기능 구현 + + public String getName() { + return name; + } + + public int getPosition() { + return position; + } + + public void go() { + this.position++; + } } diff --git a/src/main/java/racingcar/CarGame.java b/src/main/java/racingcar/CarGame.java new file mode 100644 index 0000000..749419c --- /dev/null +++ b/src/main/java/racingcar/CarGame.java @@ -0,0 +1,59 @@ +package racingcar; + +import camp.nextstep.edu.missionutils.Randoms; +import view.InputView; +import view.OutputView; + +import java.util.ArrayList; +import java.util.List; + +public class CarGame { + private final InputView inputView; + private final OutputView outputView; + + public CarGame() { + this.inputView = new InputView(); + this.outputView = new OutputView(); + } + + public void start() { + List cars = inputView.getCars(); + int trial = inputView.getTrial(); + startGame(cars, trial); + } + + private void startGame(List cars, int trial) { + outputView.printInit(); + for (int i = 0; i < trial; i++) { + for (Car car : cars) { + goOrNot(car); + } + outputView.printResult(cars); + } + List result = pickWinner(cars); + outputView.printFinalWinner(result); + } + + private void goOrNot(Car car) { + int randomNum = Randoms.pickNumberInRange(0, 9); + if (randomNum >= 4) { + car.go(); + } + } + + private List pickWinner(List cars) { + List winner = new ArrayList<>(); + int maxDistance = -1; + for (Car car : cars) { + if (car.getPosition() == maxDistance) { + winner.add(car.getName()); + } + if (car.getPosition() > maxDistance) { + maxDistance = car.getPosition(); + winner.clear(); + winner.add(car.getName()); + } + } + return winner; + } +} diff --git a/src/main/java/view/InputValidator.java b/src/main/java/view/InputValidator.java new file mode 100644 index 0000000..0b0716b --- /dev/null +++ b/src/main/java/view/InputValidator.java @@ -0,0 +1,48 @@ +package view; + +import racingcar.Car; + +import java.util.List; +import java.util.regex.PatternSyntaxException; + +public class InputValidator { + public static void validateSplit(String carString) { + try { + String[] split = carString.split(","); + } catch (PatternSyntaxException e) { + throw new IllegalArgumentException("[ERROR] 자동차 이름은 쉼표를 기준으로 구분되어야 한다."); + } + } + + public static void validateCarNames(List cars) { + for (Car car : cars) { + String carName = car.getName(); + if (carName.length() > 5) { + throw new IllegalArgumentException("[ERROR] 자동차 이름은 5자 이하만 가능하다."); + } + } + } + + public static void validateEmpty(String[] carNames) { + if (carNames.length == 0) { + throw new IllegalArgumentException("[ERROR] 자동차는 1대 이상 입력 되어야 한다."); + } + for (String carName : + carNames) { + if (carName.trim().isEmpty()) { + throw new IllegalArgumentException("[ERROR] 자동차 이름은 빈칸일 수 없다."); + } + } + } + + public static void validateTrial(String trial) { + try { + int trialNum = Integer.parseInt(trial); + if (trialNum < 0) { + throw new IllegalArgumentException("[ERROR] 시도 횟수는 음수일 수 없다."); + } + } catch (NumberFormatException e) { + throw new IllegalArgumentException("[ERROR] 시도 횟수는 숫자여야 한다."); + } + } +} diff --git a/src/main/java/view/InputView.java b/src/main/java/view/InputView.java new file mode 100644 index 0000000..8b9f4be --- /dev/null +++ b/src/main/java/view/InputView.java @@ -0,0 +1,58 @@ +package view; + +import camp.nextstep.edu.missionutils.Console; +import racingcar.Car; + +import java.util.ArrayList; +import java.util.List; + +public class InputView { + + public List getCars() { + while (true) { + try { + System.out.println("경주할 자동차 이름을 입력하세요. (이름은 쉼표(,) 기준으로 구분)"); + String carString = Console.readLine(); + String[] carNames = getCarNamesStringArray(carString); + return getCarList(carNames); + } catch (IllegalArgumentException e) { + System.out.println(e.getMessage()); + } + } + } + + private String[] getCarNamesStringArray(String carString) { + InputValidator.validateSplit(carString); + String[] carNames = carString.split(","); + InputValidator.validateEmpty(carNames); + return carNames; + } + + private List getCarList(String[] carNames) { + List cars = getCarArrayList(carNames); + InputValidator.validateCarNames(cars); + return cars; + } + + private List getCarArrayList(String[] carNames) { + List cars = new ArrayList<>(); + for (String carName : + carNames) { + cars.add(new Car(carName)); + } + return cars; + } + + public int getTrial() { + while (true) { + try { + System.out.println("시도할 횟수는 몇회인가요?"); + String trial = Console.readLine(); + InputValidator.validateTrial(trial); + return Integer.parseInt(trial); + } catch (IllegalArgumentException e) { + System.out.println(e.getMessage()); + } + } + } +} diff --git a/src/main/java/view/OutputView.java b/src/main/java/view/OutputView.java new file mode 100644 index 0000000..5d77f3b --- /dev/null +++ b/src/main/java/view/OutputView.java @@ -0,0 +1,30 @@ +package view; + +import racingcar.Car; + +import java.util.List; + +public class OutputView { + public void printInit() { + System.out.println("실행 결과"); + } + + public void printResult(List cars) { + for (Car car : cars) { + printCarStatus(car); + } + System.out.println(); + } + + private void printCarStatus(Car car) { + System.out.print(car.getName() + " : "); + for (int i = 0; i < car.getPosition(); i++) { + System.out.print("-"); + } + System.out.println(); + } + + public void printFinalWinner(List winner) { + System.out.println("최종 우승자 : " + String.join(", ", winner)); + } +}