diff --git "a/\353\260\225\353\217\204\354\227\260/java-racingcar-6/src/main/java/racingcar/Application.java" "b/\353\260\225\353\217\204\354\227\260/java-racingcar-6/src/main/java/racingcar/Application.java" index a17a52e..46e67c1 100644 --- "a/\353\260\225\353\217\204\354\227\260/java-racingcar-6/src/main/java/racingcar/Application.java" +++ "b/\353\260\225\353\217\204\354\227\260/java-racingcar-6/src/main/java/racingcar/Application.java" @@ -1,7 +1,24 @@ package racingcar; +import camp.nextstep.edu.missionutils.Console; public class Application { public static void main(String[] args) { - // TODO: 프로그램 구현 + + // initialize - 1 자동차 목록 입력 + System.out.println("경주할 자동차 이름을 입력하세요.(이름은 쉼표(,) 기준으로 구분)"); + String input = Console.readLine(); + String[] carNames = input.split(","); + + // initialize - 2 시도 횟수 입력 + System.out.println("시도할 회수는 몇회인가요?"); + String sTryCount = Console.readLine(); + int tryCount = Validator.tryCountValidator(sTryCount); + + Cars cars = new Cars(carNames); + + RacingGame.playGame(cars, tryCount, new RandomMovingStrategy()); + + System.out.println("실행 결과"); + RacingGame.printWinners(cars); } } diff --git "a/\353\260\225\353\217\204\354\227\260/java-racingcar-6/src/main/java/racingcar/Car.java" "b/\353\260\225\353\217\204\354\227\260/java-racingcar-6/src/main/java/racingcar/Car.java" new file mode 100644 index 0000000..f8ab279 --- /dev/null +++ "b/\353\260\225\353\217\204\354\227\260/java-racingcar-6/src/main/java/racingcar/Car.java" @@ -0,0 +1,22 @@ +package racingcar; + +public class Car { + private final String name; + private int position = 0; + + public Car() { this.name = null; } + public Car(String name) { + this.name = name; + } + public String getName() { return name; } + public int getPosition() { return position; } + public void setPosition(int position) { this.position = position; } + public void strategyMove(MovingStrategy strategy) { + if (strategy.canMove()) { + position++; + } + } + public void PrintInfo() { + System.out.println("Name: " + name + " Position: " + position); + } +} \ No newline at end of file diff --git "a/\353\260\225\353\217\204\354\227\260/java-racingcar-6/src/main/java/racingcar/Cars.java" "b/\353\260\225\353\217\204\354\227\260/java-racingcar-6/src/main/java/racingcar/Cars.java" new file mode 100644 index 0000000..b945890 --- /dev/null +++ "b/\353\260\225\353\217\204\354\227\260/java-racingcar-6/src/main/java/racingcar/Cars.java" @@ -0,0 +1,49 @@ +package racingcar; +import camp.nextstep.edu.missionutils.Console; +import java.util.ArrayList; +import java.util.List; + +public class Cars { + private final List cars; + + private Cars() { cars = new ArrayList<>(); } + public Cars(List cars) { this.cars = cars; } + + public Cars(String[] carNames) { + this.cars = new ArrayList<>(); + for (String carName : carNames) { + Validator.carNameValidator(carName); + cars.add(new Car(carName.trim())); + } + } + + public List getCars() { + return cars; + } + + public void printInfo() { + for (Car car : cars) { + System.out.print(car.getName() + " : "); + for (int i = 0; i < car.getPosition(); i++) { + System.out.print("-"); + } + System.out.println(); + } + } + + public List getWinners() { + int maxPosition = 0; + + for (Car car : cars) { + maxPosition = Math.max(maxPosition, car.getPosition()); + } + + List winners = new ArrayList<>(); + for (Car car : cars) { + if (car.getPosition() == maxPosition) { + winners.add(car.getName()); + } + } + return winners; + } +} diff --git "a/\353\260\225\353\217\204\354\227\260/java-racingcar-6/src/main/java/racingcar/MovingStrategy.java" "b/\353\260\225\353\217\204\354\227\260/java-racingcar-6/src/main/java/racingcar/MovingStrategy.java" new file mode 100644 index 0000000..0627426 --- /dev/null +++ "b/\353\260\225\353\217\204\354\227\260/java-racingcar-6/src/main/java/racingcar/MovingStrategy.java" @@ -0,0 +1,5 @@ +package racingcar; + +public interface MovingStrategy { + boolean canMove(); +} \ No newline at end of file diff --git "a/\353\260\225\353\217\204\354\227\260/java-racingcar-6/src/main/java/racingcar/RacingGame.java" "b/\353\260\225\353\217\204\354\227\260/java-racingcar-6/src/main/java/racingcar/RacingGame.java" new file mode 100644 index 0000000..6c5df32 --- /dev/null +++ "b/\353\260\225\353\217\204\354\227\260/java-racingcar-6/src/main/java/racingcar/RacingGame.java" @@ -0,0 +1,22 @@ +package racingcar; +import java.util.ArrayList; +import java.util.List; + +public class RacingGame{ + private RacingGame() {}; + + public static void playGame(Cars cars, int count, MovingStrategy strategy) { + for (int i = 0; i < count; i++) { + for(Car car : cars.getCars()) { + car.strategyMove(strategy); + } + cars.printInfo(); + System.out.println(); + } + } + + public static void printWinners(Cars cars) { + List winners = cars.getWinners(); + System.out.println("최종 우승자 : " + String.join(", ", winners)); + } +} diff --git "a/\353\260\225\353\217\204\354\227\260/java-racingcar-6/src/main/java/racingcar/RandomMovingStrategy.java" "b/\353\260\225\353\217\204\354\227\260/java-racingcar-6/src/main/java/racingcar/RandomMovingStrategy.java" new file mode 100644 index 0000000..a57adb3 --- /dev/null +++ "b/\353\260\225\353\217\204\354\227\260/java-racingcar-6/src/main/java/racingcar/RandomMovingStrategy.java" @@ -0,0 +1,12 @@ +package racingcar; +import camp.nextstep.edu.missionutils.Randoms; + +public class RandomMovingStrategy implements MovingStrategy { + @Override + public boolean canMove() { + if (Randoms.pickNumberInRange(0, 9) >= 4) { + return true; + } + return false; + } +} diff --git "a/\353\260\225\353\217\204\354\227\260/java-racingcar-6/src/main/java/racingcar/Validator.java" "b/\353\260\225\353\217\204\354\227\260/java-racingcar-6/src/main/java/racingcar/Validator.java" new file mode 100644 index 0000000..1388aec --- /dev/null +++ "b/\353\260\225\353\217\204\354\227\260/java-racingcar-6/src/main/java/racingcar/Validator.java" @@ -0,0 +1,41 @@ +package racingcar; + +public class Validator { + final static int MAX_NAME_LENGTH = 5; + + private Validator() {} + public static int tryCountValidator(String tryCountInput) { + int tryCount = 0; + + // 1. 빈 입력값 예외 처리 + if (tryCountInput == null || tryCountInput.trim().isEmpty()) { + throw new IllegalArgumentException("시도 횟수는 비어 있을 수 없습니다."); + } + + try { + tryCount = Integer.parseInt(tryCountInput); + } catch (NumberFormatException e) { + throw new IllegalArgumentException("시도 횟수는 양의 정수여야 합니다."); + } + + // 양수인지 검증 + if (tryCount <= 0) { + throw new IllegalArgumentException("시도 횟수는 양의 정수여야 합니다."); + } + + return (tryCount); + } + + public static void carNameValidator(String name) { + if (name == null || name.trim().isEmpty()) { + throw new IllegalArgumentException("자동차 이름은 빈 값이 될 수 없습니다."); + } + + if (name.length() > MAX_NAME_LENGTH) { + throw new IllegalArgumentException("자동차 이름은 5자를 초과할 수 없습니다."); + } + + if (name.contains(",")) { + throw new IllegalArgumentException("자동차 이름에 ','를 포함할 수 없습니다."); + } + }}