diff --git a/src/main/java/racingcar/Application.java b/src/main/java/racingcar/Application.java deleted file mode 100644 index b9ed045..0000000 --- a/src/main/java/racingcar/Application.java +++ /dev/null @@ -1,7 +0,0 @@ -package racingcar; - -public class Application { - public static void main(String[] args) { - // TODO 구현 진행 - } -} diff --git a/src/main/java/racingcar/Car.java b/src/main/java/racingcar/Car.java index ab3df94..856f0b3 100644 --- a/src/main/java/racingcar/Car.java +++ b/src/main/java/racingcar/Car.java @@ -1,6 +1,9 @@ package racingcar; +import camp.nextstep.edu.missionutils.Randoms; + public class Car { + private static final int MOVE_RATE = 4; private final String name; private int position = 0; @@ -8,5 +11,16 @@ public Car(String name) { this.name = name; } - // 추가 기능 구현 + public void randomlyGoForward() { + if(Randoms.pickNumberInRange(0, 9) >= MOVE_RATE) + position++; + } + + public String getName() { + return name; + } + + public int getPosition() { + return position; + } } diff --git a/src/main/java/racingcar/InputManager.java b/src/main/java/racingcar/InputManager.java new file mode 100644 index 0000000..36ff180 --- /dev/null +++ b/src/main/java/racingcar/InputManager.java @@ -0,0 +1,21 @@ +package racingcar; + +import camp.nextstep.edu.missionutils.Console; + +public class InputManager { + private static final String CAR_NAME_DELIMITER = ","; + + public String[] getCarNames(){ + String inputLine = Console.readLine(); + return inputLine.split(CAR_NAME_DELIMITER); + } + + public int getCount(){ + String inputLine = Console.readLine(); + try{ + return Integer.parseInt(inputLine); + } catch (NumberFormatException e) { + throw new IllegalArgumentException("[Error]숫자를 입력해주세요."); + } + } +} diff --git a/src/main/java/racingcar/OutputManager.java b/src/main/java/racingcar/OutputManager.java new file mode 100644 index 0000000..4ca75a8 --- /dev/null +++ b/src/main/java/racingcar/OutputManager.java @@ -0,0 +1,53 @@ +package racingcar; + +import java.util.List; + +public class OutputManager { + + int maxCarNameLen = 5; + + public void printCarNameInputMessage() { + System.out.println("경주할 자동차 이름을 입력하세요(이름은 쉼표(,)를 기준으로 구분). 최대 5글자"); + } + + public void printTurnInputMessage() { + System.out.println("시도할 회수는 몇회인가요?"); + } + + public void printResultMessage() { + System.out.println("실행 결과"); + } + + public void printCarData(List cars) { + for (Car car : cars) { + System.out.println(getName(car.getName()) + " : " + getDash(car.getPosition())); + } + System.out.println(); + } + private String getName(String carName){ + StringBuilder carNameBuilder = new StringBuilder(carName); + while (carNameBuilder.length() < maxCarNameLen) { + carNameBuilder.append(" "); + } + return carNameBuilder.toString(); + + } + + private String getDash(int position) { + StringBuilder dash = new StringBuilder(); + for (int i = 0; i < position; i++) { + dash.append("-"); + } + return dash.toString(); + } + + public void printWinner(List winnerCars) { + System.out.print("최종 우승자 : "); + for(Car winner : winnerCars){ + System.out.print(winner.getName()); + if(winner != winnerCars.get(winnerCars.size()-1)) + System.out.print(", "); + } + System.out.println(); + } +} diff --git a/src/main/java/racingcar/RacingGame.java b/src/main/java/racingcar/RacingGame.java new file mode 100644 index 0000000..5f3701c --- /dev/null +++ b/src/main/java/racingcar/RacingGame.java @@ -0,0 +1,98 @@ +package racingcar; + +import static java.lang.Integer.*; + +import java.util.ArrayList; +import java.util.Arrays; +import java.util.HashSet; +import java.util.List; +import java.util.Set; + +public class RacingGame { + + private static final String CAR_NAME_DELIMITER = ","; + private InputManager inputManager; + private OutputManager outputManager; + private List cars; + private int maxTurnCount; + + public static void main(String[] args) { + InputManager inputManager = new InputManager(); + OutputManager outputManager = new OutputManager(); + RacingGame game = new RacingGame(inputManager, outputManager); + game.start(); + } + + public RacingGame(InputManager inputManager, OutputManager outputManager) { + this.inputManager = inputManager; + this.outputManager = outputManager; + } + + public void start() { + initGame(); + race(); + reward(); + } + + private void initGame() { + outputManager.printCarNameInputMessage(); + String[] carNames = inputManager.getCarNames(); + checkDuplicateName(carNames); + + outputManager.printTurnInputMessage(); + int turn = inputManager.getCount(); + checkTurnValid(turn); + + + cars = new ArrayList<>(); + this.maxTurnCount = turn; + for (String carName : carNames) { + String trimed = carName.trim(); + if(trimed.length() > 5) + throw new IllegalArgumentException("[Error] 이름은 5글자 이하만 가능합니다."); + cars.add(new Car(trimed)); + } + } + + private void race() { + outputManager.printResultMessage(); + for (int i = 0; i < maxTurnCount; i++) { + for (Car car : cars) { + car.randomlyGoForward(); + } + outputManager.printCarData(cars); + } + } + + private void reward() { + List winnerCars = getWinnerCars(); + outputManager.printWinner(winnerCars); + } + + private void checkDuplicateName(String[] carNamesArray) { + Set carNamesSet = new HashSet<>(Arrays.asList(carNamesArray)); + if (carNamesSet.size() != carNamesArray.length) { + throw new IllegalArgumentException("[Error] 중복된 이름이 있습니다."); + } + } + + private void checkTurnValid(int turn) { + if (turn < 1) { + throw new IllegalArgumentException("[Error] 1 이상의 숫자를 입력해주세요."); + } + } + + private List getWinnerCars() { + List winners = new ArrayList<>(); + int maxPosition = 0; + for (Car car : cars) { + maxPosition = Math.max(maxPosition, car.getPosition()); + } + for (Car car : cars) { + if (car.getPosition() == maxPosition) { + winners.add(car); + } + } + return winners; + } +} diff --git a/src/test/java/racingcar/ApplicationTest.java b/src/test/java/racingcar/RacingGameTest.java similarity index 87% rename from src/test/java/racingcar/ApplicationTest.java rename to src/test/java/racingcar/RacingGameTest.java index 8f6f70a..9390861 100644 --- a/src/test/java/racingcar/ApplicationTest.java +++ b/src/test/java/racingcar/RacingGameTest.java @@ -1,13 +1,14 @@ 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.*; -class ApplicationTest extends NsTest { +class RacingGameTest extends NsTest { private static final int MOVING_FORWARD = 4; private static final int STOP = 3; @@ -36,6 +37,6 @@ class ApplicationTest extends NsTest { @Override public void runMain() { - Application.main(new String[]{}); + RacingGame.main(new String[] {}); } } diff --git "a/\352\270\260\353\212\245\353\252\251\353\241\235.md" "b/\352\270\260\353\212\245\353\252\251\353\241\235.md" new file mode 100644 index 0000000..695f2c3 --- /dev/null +++ "b/\352\270\260\353\212\245\353\252\251\353\241\235.md" @@ -0,0 +1,9 @@ +### 기능 목록 +1. 사용자의 입력을 받는 입력부 + 1. 동일한 자동차 이름이 존재하는지 여부를 확인 +2. 입력받은 자동차 이름을 분리하여 자동차 객체를 생성하는 기능 +3. 입력받은 시도 횟수를 저장하는 기능 + 1. 숫자가 입력이 되었는지 여부를 확인 +4. 자동차 객체의 움직임을 결정하는 기능 +5. 자동차 객체의 움직임을 출력하는 기능 +6. 우승자를 결정하는 기능 \ No newline at end of file