diff --git a/docs/README.md b/docs/README.md index e69de29..147e08a 100644 --- a/docs/README.md +++ b/docs/README.md @@ -0,0 +1,13 @@ +# 입력 + +### 자동차 +- 숫자 n개의 자동차의 이름을 입력받는다. +- 자동차의 이름은 영어이며 5자 이하이다. +- 자동차의 이름은 쉼표로 구별한다. +### 이동 횟수 +- 숫자 m의 자동차 이동 횟수를 입력받는다. +- 매 시도마다 0에서 9사이의 무작위 값을 구하고, 만약 4 이상의 값이라면 전진한다. +- 모든 경주가 끝이나면 우승자를 출력한다. +- 우승자는 한 명 이상일 수 있다. 만약 우승자가 여러명인 경우 쉼표로 구분한다. +### 예외처리 +- 사용자가 잘못된 값을 입력하면 `IllegalArgumentException`을 발생시킨 후 애플리케이션은 종료된다. diff --git a/src/main/java/racingcar/Application.java b/src/main/java/racingcar/Application.java index a17a52e..f8accce 100644 --- a/src/main/java/racingcar/Application.java +++ b/src/main/java/racingcar/Application.java @@ -1,7 +1,10 @@ package racingcar; +import java.io.IOException; + public class Application { - public static void main(String[] args) { - // TODO: 프로그램 구현 + public static void main(String[] args) throws IOException { + Controller controller = new Controller(); + controller.startGame(); } } diff --git a/src/main/java/racingcar/Controller.java b/src/main/java/racingcar/Controller.java new file mode 100644 index 0000000..f679de5 --- /dev/null +++ b/src/main/java/racingcar/Controller.java @@ -0,0 +1,23 @@ +package racingcar; + +import racingcar.Model.Model; + +public class Controller { + Model model = new Model(); + View view = new View(); + + public void startGame() { + try { + model.splitNames(view.inputCarNames()); + model.frequency = view.inputFrequency(); + for (int i = 0; i <= model.frequency; i++) { + model.moveCars(); + view.printCarProgress(model.cars, model.cars.size()); + } + model.findWinner(); + view.printWinner(model.winner); + } catch (Exception e) { + System.out.println("Exception [Err_Msg] : " + e.getMessage()); + } + } +} diff --git a/src/main/java/racingcar/Model/Car.java b/src/main/java/racingcar/Model/Car.java new file mode 100644 index 0000000..4209ae0 --- /dev/null +++ b/src/main/java/racingcar/Model/Car.java @@ -0,0 +1,34 @@ +package racingcar.Model; + +import camp.nextstep.edu.missionutils.Randoms; + +public class Car { + String name; + int progress; + boolean win; + + public Car(String name, int progress, boolean win) { + this.name = name; + this.progress = progress; + this.win = win; + } + + public String getName() { + return name; + } + + public int getProgress() { + return progress; + } + + public boolean isWin() { + return win; + } + + public void move() { + int random = Randoms.pickNumberInRange(0, 9); + if (random >= 4) { + progress += 1; + } + } +} diff --git a/src/main/java/racingcar/Model/Model.java b/src/main/java/racingcar/Model/Model.java new file mode 100644 index 0000000..ac01eac --- /dev/null +++ b/src/main/java/racingcar/Model/Model.java @@ -0,0 +1,45 @@ +package racingcar.Model; + +import java.util.ArrayList; +import java.util.List; +import java.util.StringTokenizer; + +public class Model { + public List cars = new ArrayList<>(); + public List winner = new ArrayList<>(); + public int frequency = 0; + + public void moveCars() { + for (Car car : cars) { + car.move(); + } + } + + public void splitNames(String carNames) { + StringTokenizer st = new StringTokenizer(carNames, ","); + while (st.hasMoreTokens()) { + String str = st.nextToken(); + Car car = new Car(str, 0, false); + cars.add(car); + if (str.length() > 5) { + throw new IllegalArgumentException("Car name should be less than 5 characters"); + } + } + } + + public void findWinner() { + int max = 0; + + for (int i = 0; i < cars.size(); i++) { // 최댓값 찾기 + if (cars.get(i).getProgress() >= max) { + max = cars.get(i).getProgress(); + } + } + + for (int i = 0; i < cars.size(); i++) { // 우승자 찾기 + if (cars.get(i).getProgress() >= max) { + winner.add(cars.get(i).getName()); + } + } + } +} \ No newline at end of file diff --git a/src/main/java/racingcar/View.java b/src/main/java/racingcar/View.java new file mode 100644 index 0000000..58d1546 --- /dev/null +++ b/src/main/java/racingcar/View.java @@ -0,0 +1,55 @@ +package racingcar; + +import camp.nextstep.edu.missionutils.Console; +import racingcar.Model.Car; + +import java.io.IOException; +import java.util.ArrayList; +import java.util.List; +import java.util.StringTokenizer; + +public class View { + public String inputCarNames() { + String carNames = ""; + try { + System.out.println("자동차의 이름들을 입력하세요"); + carNames = Console.readLine(); + } catch (Exception e) { + System.out.println("Exception [Err_location] : " + e.getStackTrace()[0]); + throw new RuntimeException(e); + } + return carNames; + } + + public int inputFrequency() { + try { + System.out.println("총 시도할 횟수를 입력하세요"); + return Integer.parseInt(Console.readLine()); + } catch (Exception e) { + System.out.println("Exception [Err_location] : " + e.getStackTrace()[0]); + throw new RuntimeException(e); + } + } + + public void printCarProgress(List cars, int length) { + for (int index = 0; index < length; index++) { + System.out.print(cars.get(index).getName() + " : "); + int progress = cars.get(index).getProgress(); + for (int i = 0; i < progress; i++) { + System.out.print("-"); + } + System.out.println(); + } + System.out.println(); + } + + public void printWinner(List winner) { + System.out.print("최종 우승자 : "); + for (int i = 0; i < winner.size(); i++) { + System.out.print(winner.get(i)); + if (i + 1 < winner.size()) { + System.out.print(","); + } + } + } +} diff --git a/src/test/java/racingcar/ApplicationTest.java b/src/test/java/racingcar/ApplicationTest.java index 764ba4c..c584514 100644 --- a/src/test/java/racingcar/ApplicationTest.java +++ b/src/test/java/racingcar/ApplicationTest.java @@ -3,6 +3,8 @@ import camp.nextstep.edu.missionutils.test.NsTest; import org.junit.jupiter.api.Test; +import java.io.IOException; + 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; @@ -33,6 +35,10 @@ class ApplicationTest extends NsTest { @Override public void runMain() { - Application.main(new String[]{}); + try { + Application.main(new String[]{}); + } catch (IOException e) { + throw new RuntimeException(e); + } } }