diff --git a/.gitignore b/.gitignore index 100e36f..9e2c655 100644 --- a/.gitignore +++ b/.gitignore @@ -31,3 +31,5 @@ out/ ### VS Code ### .vscode/ .DS_Store +bin/ +*.class diff --git a/bin/main/racingcar/Application.class b/bin/main/racingcar/Application.class new file mode 100644 index 0000000..19e476a Binary files /dev/null and b/bin/main/racingcar/Application.class differ diff --git a/bin/test/racingcar/ApplicationTest.class b/bin/test/racingcar/ApplicationTest.class new file mode 100644 index 0000000..5951e3d Binary files /dev/null and b/bin/test/racingcar/ApplicationTest.class differ diff --git a/src/main/java/racingcar/Application.java b/src/main/java/racingcar/Application.java index a17a52e..d7c05d1 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: 프로그램 구현 + RacingGame game = new RacingGame(); + game.start(); } } diff --git a/src/main/java/racingcar/Car.java b/src/main/java/racingcar/Car.java new file mode 100644 index 0000000..d835a96 --- /dev/null +++ b/src/main/java/racingcar/Car.java @@ -0,0 +1,26 @@ +package racingcar; + +public class Car { + + private final String name; + private int position; + + public Car(String name) { + this.name = name; + this.position = 0; + } + + public void move(int number, int threshold) { + if (number >= threshold) { + position++; + } + } + + public String getName() { + return name; + } + + public int getPosition() { + return position; + } +} \ No newline at end of file diff --git a/src/main/java/racingcar/RacingGame.java b/src/main/java/racingcar/RacingGame.java new file mode 100644 index 0000000..2ec9f86 --- /dev/null +++ b/src/main/java/racingcar/RacingGame.java @@ -0,0 +1,132 @@ +package racingcar; + +import camp.nextstep.edu.missionutils.Console; +import camp.nextstep.edu.missionutils.Randoms; + +import java.util.ArrayList; +import java.util.List; + +public class RacingGame { + + private static final int MAX_CAR_NAME_LENGTH = 5; + private static final int MIN_TRY_COUNT = 1; + private static final int RANDOM_START = 0; + private static final int RANDOM_END = 9; + private static final int MOVE_THRESHOLD = 4; + + public void start() { + List cars = createCars(); + int tryCount = inputTryCount(); + + System.out.print('\n'); + System.out.println("실행 결과"); + + for (int i = 0; i < tryCount; i++) { + moveCars(cars); + printCars(cars); + } + + printWinners(cars); + } + + private List createCars() { + System.out.println("경주할 자동차 이름을 입력하세요.(이름은 쉼표(,) 기준으로 구분)"); + String input = Console.readLine(); + String[] names = input.split(","); + + validateNames(names); + + List cars = new ArrayList<>(); + for (String name : names) { + cars.add(new Car(name)); + } + return cars; + } + + private int inputTryCount() { + System.out.println("시도할 회수는 몇회인가요?"); + String input = Console.readLine(); + int count = parseTryCount(input); + + if (count < MIN_TRY_COUNT) { + throw new IllegalArgumentException(); + } + + return count; + } + + private int parseTryCount(String input) { + try { + return Integer.parseInt(input); + } catch (NumberFormatException e) { + throw new IllegalArgumentException(); + } + } + + private void validateNames(String[] names) { + List used = new ArrayList<>(); + + for (String name : names) { + validateName(name); + + if (used.contains(name)) { + throw new IllegalArgumentException(); + } + used.add(name); + } + } + + private void validateName(String name) { + if (name.isEmpty()) { + throw new IllegalArgumentException(); + } + + if (name.chars().anyMatch(Character::isWhitespace)) { + throw new IllegalArgumentException(); + } + + if (name.length() > MAX_CAR_NAME_LENGTH) { + throw new IllegalArgumentException(); + } + } + + private void moveCars(List cars) { + for (Car car : cars) { + int number = Randoms.pickNumberInRange(RANDOM_START, RANDOM_END); + car.move(number, MOVE_THRESHOLD); + } + } + + private void printCars(List cars) { + for (Car car : cars) { + System.out.println(car.getName() + " : " + "-".repeat(car.getPosition())); + } + System.out.print('\n'); + } + + private void printWinners(List cars) { + int max = findMaxPosition(cars); + List winners = findWinners(cars, max); + System.out.println("최종 우승자 : " + String.join(", ", winners)); + } + + private int findMaxPosition(List cars) { + int max = 0; + for (Car car : cars) { + max = Math.max(max, car.getPosition()); + } + return max; + } + + private List findWinners(List cars, int max) { + List winners = new ArrayList<>(); + + for (Car car : cars) { + if (car.getPosition() == max) { + winners.add(car.getName()); + } + } + + return winners; + } +}