diff --git a/build.gradle b/build.gradle index 45d61697f..e17727c42 100644 --- a/build.gradle +++ b/build.gradle @@ -12,12 +12,17 @@ dependencies { implementation('com.github.woowacourse-projects:mission-utils:1.0.0') } +/* java { toolchain { languageVersion = JavaLanguageVersion.of(8) } } +*/ + test { useJUnitPlatform() } +sourceCompatibility = JavaVersion.VERSION_11 +targetCompatibility = JavaVersion.VERSION_11 diff --git a/docs/README.md b/docs/README.md new file mode 100644 index 000000000..27ac30ca0 --- /dev/null +++ b/docs/README.md @@ -0,0 +1,52 @@ +## 미션 - 자동차 경주 게임 + +### 개요📌 +자동차 이름을 입력 받고, 시도한 횟수 만큼 랜덤으로 전진 또는 멈추는 게임이다. +게임을 완료한 후 우승자를 출력한다. + +- - - + +### 동작 방식📌 + +**[게임]** +- 경주할 자동차 이름을 쉼표 기준으로 입력한다. +- 시도할 횟수를 입력한다. +- 각 차수별 실행 결과를 출력한다. + - 0~9까지 랜덤한 숫자를 발행 후, 4 이상의 숫자만 전진한다. +- 우승자를 출력한다. + - 공동 우승자의 경우 쉼표를 기준으로 함께 출력한다. + +- - - + +### 기능 구현 목록📌 + +**[게임]** +- [x] 입력한 시도 횟수 만큼 0~9사이의 랜덤 숫자를 발행한다. + - [x] 숫자가 4 이상이면 전진, 아니면 멈춘다. + +**[입력]** +- [x] 경주할 자동차 이름을 입력한다. + - [x] 자동차 이름은 쉼표(,)를 기준으로 구분하며 이름은 5자 이하만 가능하다. +- [x] 사용자는 몇 번의 이동을 할 것인지를 입력할 수 있어야 한다. + +**[출력]** +- [x] 매 라운드 각 자동차가 얼만큼 전진했는지 출력한다. +- [x] 자동차 경주 게임을 완료한 후 누가 우승했는지를 알려준다. + - [x] 우승자가 여러 명일 경우 쉼표(,)를 이용하여 구분한다. + +- - - + +### 예외처리📌 + +**[자동차 입력]** +- [x] 자동차 이름은 5글자를 넘으면 안된다. +- [x] 자동차 이름은 중복되면 안된다. + +**[라운드 입력]** +- [x] 숫자가 아닌 문자를 입력하면 안된다. + +- - - + +### 테스트 케이스📌 + +- 어떻게 추가해야 할 지 모르겠어서 추가를 하지 못했습니다... ㅠㅠ \ No newline at end of file diff --git a/src/main/java/racingcar/Application.java b/src/main/java/racingcar/Application.java index b9ed0456a..e2f79b315 100644 --- a/src/main/java/racingcar/Application.java +++ b/src/main/java/racingcar/Application.java @@ -1,7 +1,11 @@ package racingcar; +import racingcar.controller.racingController; + public class Application { + private static final racingController racingcontroller = new racingController(); + public static void main(String[] args) { - // TODO 구현 진행 + racingcontroller.start(); } } diff --git a/src/main/java/racingcar/Car.java b/src/main/java/racingcar/Car.java deleted file mode 100644 index ab3df9492..000000000 --- a/src/main/java/racingcar/Car.java +++ /dev/null @@ -1,12 +0,0 @@ -package racingcar; - -public class Car { - private final String name; - private int position = 0; - - public Car(String name) { - this.name = name; - } - - // 추가 기능 구현 -} diff --git a/src/main/java/racingcar/controller/racingController.java b/src/main/java/racingcar/controller/racingController.java new file mode 100644 index 000000000..a593ed055 --- /dev/null +++ b/src/main/java/racingcar/controller/racingController.java @@ -0,0 +1,34 @@ +package racingcar.controller; + +import racingcar.message.outputMessage; +import racingcar.model.Car; +import racingcar.model.racingGame; +import racingcar.model.winningResult; +import racingcar.view.inputView; +import racingcar.view.outputView; + +import java.util.List; + +public class racingController { + private final racingGame racinggame = new racingGame(); + private final winningResult winningresult = new winningResult(); + private final inputView inputView = new inputView(); + private final outputView outputview = new outputView(); + + public void start() { + String[] names = inputView.getNames(); + int round = inputView.getRound(); + List cars = racinggame.saveCars(names); + roundResult(round, cars); + winningresult.winningScore(cars); + outputview.result(cars, winningresult.winningScore); + } + + private void roundResult(int round, List cars) { + System.out.println(outputMessage.GAME_ROUND); + for (int i = 0; i < round; i++) { + racinggame.updatePhase(cars); + outputview.round(cars); + } + } +} \ No newline at end of file diff --git a/src/main/java/racingcar/message/exceptionMessage.java b/src/main/java/racingcar/message/exceptionMessage.java new file mode 100644 index 000000000..6ceb8173c --- /dev/null +++ b/src/main/java/racingcar/message/exceptionMessage.java @@ -0,0 +1,8 @@ +package racingcar.message; + +public class exceptionMessage { + public static final String CAR_NAME_RANGE = "[ERROR] 이름은 다섯 글자를 넘길 수 없습니다."; + public static final String SAME_NAME = "[ERROR] 자동차 이름이 중복되었습니다."; + public static final String ROUND_STIRNG = "[ERROR] 시도 횟수는 숫자여야 합니다."; + +} diff --git a/src/main/java/racingcar/message/inputMessage.java b/src/main/java/racingcar/message/inputMessage.java new file mode 100644 index 000000000..a105c4dac --- /dev/null +++ b/src/main/java/racingcar/message/inputMessage.java @@ -0,0 +1,8 @@ +package racingcar.message; + +public class inputMessage { + + public static final String START_GAME = "경주할 자동차 이름을 입력하세요.(이름은 쉼표(,) 기준으로 구분)"; + public static final String GET_GAME_ROUND = "시도할 회수는 몇회인가요?"; + +} diff --git a/src/main/java/racingcar/message/outputMessage.java b/src/main/java/racingcar/message/outputMessage.java new file mode 100644 index 000000000..f34366260 --- /dev/null +++ b/src/main/java/racingcar/message/outputMessage.java @@ -0,0 +1,6 @@ +package racingcar.message; + +public class outputMessage { + public static final String GAME_ROUND = "\n" + "실행 결과"; + public static final String GAME_RESULT = "최종 우승자 : "; +} diff --git a/src/main/java/racingcar/model/Car.java b/src/main/java/racingcar/model/Car.java new file mode 100644 index 000000000..d64017e8a --- /dev/null +++ b/src/main/java/racingcar/model/Car.java @@ -0,0 +1,23 @@ +package racingcar.model; + +public class Car { + private final String name; + private int position = 0; + + public Car(String name, int position) { + this.name = name; + this.position = position; + } + + public String getName() { + return name; + } + + public int getPosition() { + return position; + } + + public void setPosition(int position) { + this.position = position; + } +} diff --git a/src/main/java/racingcar/model/racingGame.java b/src/main/java/racingcar/model/racingGame.java new file mode 100644 index 000000000..479c383a6 --- /dev/null +++ b/src/main/java/racingcar/model/racingGame.java @@ -0,0 +1,27 @@ +package racingcar.model; + +import camp.nextstep.edu.missionutils.Randoms; + +import java.util.ArrayList; +import java.util.List; + +public class racingGame { + + public List saveCars(String[] carNames) { + List cars = new ArrayList<>(); + for (int i = 0; i < carNames.length; i++) { + String name = carNames[i]; + cars.add(new Car(name, 0)); + } + return cars; + } + + public void updatePhase(List cars) { + for (int j = 0; j < cars.size(); j++) { + int randomNum = Randoms.pickNumberInRange(0, 9); + if (randomNum >= 4) { + cars.get(j).setPosition(cars.get(j).getPosition() + 1); + } + } + } +} diff --git a/src/main/java/racingcar/model/winningResult.java b/src/main/java/racingcar/model/winningResult.java new file mode 100644 index 000000000..44330c70a --- /dev/null +++ b/src/main/java/racingcar/model/winningResult.java @@ -0,0 +1,16 @@ +package racingcar.model; + +import java.util.List; + +public class winningResult { + public int winningScore = 0; + + public void winningScore(List cars) { + for (int m = 0; m < cars.size(); m++) { + if (winningScore < cars.get(m).getPosition()) { + winningScore = cars.get(m).getPosition(); + } + } + } + +} diff --git a/src/main/java/racingcar/view/inputView.java b/src/main/java/racingcar/view/inputView.java new file mode 100644 index 000000000..73b2d1b3a --- /dev/null +++ b/src/main/java/racingcar/view/inputView.java @@ -0,0 +1,63 @@ +package racingcar.view; + +import camp.nextstep.edu.missionutils.Console; +import racingcar.message.exceptionMessage; +import racingcar.message.inputMessage; + +import java.util.ArrayList; +import java.util.List; + +public class inputView { + + public String[] getNames() { + out(inputMessage.START_GAME); + String inputname = Console.readLine(); + String[] names = inputname.split(","); + try { + nameRange(names); + sameName(names); + } catch (IllegalArgumentException e) { + getNames(); + } + return names; + } + + private void nameRange(String[] names) { + for (String name : names) { + if (name.length() > 5) { + out(exceptionMessage.CAR_NAME_RANGE); + throw new IllegalArgumentException(); + } + } + } + + private void sameName(String[] names) { + List check = new ArrayList<>(); + for (String name : names) { + if (check.contains(name)) { + out(exceptionMessage.SAME_NAME); + throw new IllegalArgumentException(); + } else { + check.add(name); + } + } + } + + public int getRound() { + out(inputMessage.GET_GAME_ROUND); + String inputround = Console.readLine(); + int round = 0; + try { + round = Integer.parseInt(inputround); + } catch (IllegalArgumentException e) { + out(exceptionMessage.ROUND_STIRNG); + getRound(); + } + return round; + } + + private void out(String text) { + System.out.println(text); + } + +} diff --git a/src/main/java/racingcar/view/outputView.java b/src/main/java/racingcar/view/outputView.java new file mode 100644 index 000000000..00d39816c --- /dev/null +++ b/src/main/java/racingcar/view/outputView.java @@ -0,0 +1,30 @@ +package racingcar.view; + +import racingcar.message.outputMessage; +import racingcar.model.Car; + +import java.util.ArrayList; +import java.util.List; + +public class outputView { + + public void round(List cars) { + for (Car car : cars) { + System.out.print(car.getName()); + System.out.print(" : "); + System.out.println("-".repeat(car.getPosition())); + } + System.out.println(); + } + + public void result(List cars, int firstPrize) { + System.out.print(outputMessage.GAME_RESULT); + List winner = new ArrayList<>(); + for (int n = 0; n < cars.size(); n++) { + if (cars.get(n).getPosition() == firstPrize) { + winner.add(cars.get(n).getName()); + } + } + System.out.println(String.join(", ", winner)); + } +}