diff --git a/docs/README.md b/docs/README.md index e69de29b..59b3a628 100644 --- a/docs/README.md +++ b/docs/README.md @@ -0,0 +1,19 @@ +입력 + 경주할 자동차의 이름 입력(5자 이내) + 시도할 횟수 입력 +출력 + 각 차수별 실행 결과 출력 + 최종 우승자 출력 +자동차 + 자동차 객체 생성 + 0에서 9 사이에서 무작위 값 구하기 + 숫자가 4이상이면 자동차 전진 + 자동차가 전진한 횟수만큼 -로 표시 +경주 게임 + 입력받은 만큼 경주 반복 + 가장 많이 전진한 자동차를 우승자로 선정 + 우승자가 여러명일 경우 쉼표로 구분 +오류 + 자동차 이름 5자 이내 + 시도 횟수 0 이상 + 시도 횟수는 숫자 \ No newline at end of file diff --git a/src/main/java/racingcar/Application.java b/src/main/java/racingcar/Application.java index a17a52e7..6491ee0f 100644 --- a/src/main/java/racingcar/Application.java +++ b/src/main/java/racingcar/Application.java @@ -1,7 +1,7 @@ package racingcar; - public class Application { public static void main(String[] args) { - // TODO: 프로그램 구현 + RacingGame racingGame = new RacingGame(); + racingGame.start(); } -} +} \ 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..bfe4cf33 --- /dev/null +++ b/src/main/java/racingcar/Car.java @@ -0,0 +1,11 @@ +package racingcar; +public class Car { + private final String name; + private 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 getPositionSign(){return "-".repeat(position);} +} \ No newline at end of file diff --git a/src/main/java/racingcar/Input.java b/src/main/java/racingcar/Input.java new file mode 100644 index 00000000..77345247 --- /dev/null +++ b/src/main/java/racingcar/Input.java @@ -0,0 +1,22 @@ +package racingcar; +import camp.nextstep.edu.missionutils.Console; +import java.util.*; +public class Input{ + public static List readCarNames() { + System.out.println("경주할 자동차 이름을 입력하세요.(이름은 쉼표(,) 기준으로 구분)"); + String input = Console.readLine(); + String[] names = input.split(","); + List cars = new ArrayList<>(); + for (String name : names) { + Validator.validateCarName(name.trim()); + cars.add(new Car(name.trim())); + } + return cars; + } + public static int readTryCount() { + System.out.println("시도할 회수는 몇회인가요?"); + String input = Console.readLine(); + return Validator.validateTryCount(input); + } + +} \ No newline at end of file diff --git a/src/main/java/racingcar/Output.java b/src/main/java/racingcar/Output.java new file mode 100644 index 00000000..1e79b11c --- /dev/null +++ b/src/main/java/racingcar/Output.java @@ -0,0 +1,15 @@ +package racingcar; +import java.util.*; +public class Output { + public static void printRoundResult(List cars) { + for (Car car : cars) { + System.out.println(car.getName() + " : " + car.getPositionSign()); + } + System.out.println(); + } + public static void printWinners(List winners) { + String result = String.join(", ", + winners.stream().map(Car::getName).toList()); + System.out.println("최종 우승자 : " + result); + } +} \ 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 00000000..5ee93382 --- /dev/null +++ b/src/main/java/racingcar/RacingGame.java @@ -0,0 +1,37 @@ +package racingcar; +import camp.nextstep.edu.missionutils.Randoms; +import java.util.*; +public class RacingGame { + private List cars; + private int tryCount; + public void start() { + cars = Input.readCarNames(); + tryCount = Input.readTryCount(); + System.out.println("\n실행 결과"); + for (int i = 0; i < tryCount; i++) { + raceOnce(); + Output.printRoundResult(cars); + } + List winners = getWinners(); + Output.printWinners(winners); + } + private void raceOnce() { + for (Car car : cars) { + int number = Randoms.pickNumberInRange(0, 9); + car.move(number); + } + } + private List getWinners() { + int maxPosition = cars.stream() + .mapToInt(Car::getPosition) + .max() + .orElse(0); + List winners = new ArrayList<>(); + for (Car car : cars) { + if (car.getPosition() == maxPosition) { + winners.add(car); + } + } + return winners; + } +} \ No newline at end of file diff --git a/src/main/java/racingcar/Validator.java b/src/main/java/racingcar/Validator.java new file mode 100644 index 00000000..911dbb91 --- /dev/null +++ b/src/main/java/racingcar/Validator.java @@ -0,0 +1,19 @@ +package racingcar; +public class Validator { + public static void validateCarName(String name) { + if (name == null || name.trim().isEmpty() || name.length() > 5) { + throw new IllegalArgumentException("자동차 이름은 1~5자 이내여야 합니다."); + } + } + public static int validateTryCount(String input) { + try { + int count = Integer.parseInt(input); + if (count < 0) { + throw new IllegalArgumentException("시도 횟수는 0 이상이어야 합니다."); + } + return count; + } catch (NumberFormatException e) { + throw new IllegalArgumentException("시도 횟수는 숫자여야 합니다."); + } + } +} \ No newline at end of file diff --git a/src/test/java/racingcar/ApplicationTest.java b/src/test/java/racingcar/ApplicationTest.java index 764ba4c6..ce82c3c6 100644 --- a/src/test/java/racingcar/ApplicationTest.java +++ b/src/test/java/racingcar/ApplicationTest.java @@ -1,38 +1,32 @@ package racingcar; - import camp.nextstep.edu.missionutils.test.NsTest; import org.junit.jupiter.api.Test; - import static camp.nextstep.edu.missionutils.test.Assertions.assertRandomNumberInRangeTest; import static camp.nextstep.edu.missionutils.test.Assertions.assertSimpleTest; import static org.assertj.core.api.Assertions.assertThat; import static org.assertj.core.api.Assertions.assertThatThrownBy; - class ApplicationTest extends NsTest { - private static final int MOVING_FORWARD = 4; - private static final int STOP = 3; - + private static final int MOVING_FORWARD=4; + private static final int STOP=3; @Test void 전진_정지() { assertRandomNumberInRangeTest( () -> { - run("pobi,woni", "1"); - assertThat(output()).contains("pobi : -", "woni : ", "최종 우승자 : pobi"); + run("pobi,woni","1"); + assertThat(output()).contains("pobi : -","woni : ","최종 우승자 : pobi"); }, MOVING_FORWARD, STOP ); } - @Test void 이름에_대한_예외_처리() { assertSimpleTest(() -> - assertThatThrownBy(() -> runException("pobi,javaji", "1")) + assertThatThrownBy(() -> runException("pobi,javaji","1")) .isInstanceOf(IllegalArgumentException.class) ); } - @Override public void runMain() { Application.main(new String[]{}); } -} +} \ No newline at end of file