diff --git a/docs/README.md b/docs/README.md new file mode 100644 index 0000000000..0d1336cc80 --- /dev/null +++ b/docs/README.md @@ -0,0 +1,26 @@ +InputClass 구현 +입력기능: ReadCarName, ReadTryNum +예외처리기능: StringHandlingException, IntHandlingException + +- 자동차이름 이름 5자 초과로 들어올때 +- 횟수에 숫자가 안들어올때 + getCarNum기능: 입력된 자동차의 개수반환 + +Car 구현 + +- 랜덤결과에 따라 전진, 머무르는 기능 MoveOrNot +- Race: Trynum 만큼 Race진행 +- getPosition: 현재 Position +- winNum: 이긴횟수 기록 + +Game 구현 + +- 생성자구현: 차세팅, play 진행 + -play: 횟수 만큼 경주게임 시작 + -round: 한 라운드 게임진행 + -setCars: Input으로 받아온 이름으로 Car객체배열생성 + -sortCars: 매라운드 postion순으로 정렬 + +output 구현 + +- printRound: 라운드마다 게임결과 출력 diff --git a/src/main/java/racingcar/Application.java b/src/main/java/racingcar/Application.java index b9ed0456a3..5172ebcbbf 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 구현 진행 - } + public static void main(String[] args) { + Game r1 = new Game(); + } } diff --git a/src/main/java/racingcar/Car.java b/src/main/java/racingcar/Car.java index ab3df94921..7d10e7b322 100644 --- a/src/main/java/racingcar/Car.java +++ b/src/main/java/racingcar/Car.java @@ -1,12 +1,43 @@ package racingcar; +import camp.nextstep.edu.missionutils.Randoms; + public class Car { - private final String name; - private int position = 0; + private final String name; + private int position = 0; + private int positionBase = 0; + private int winNum = 0; + + public Car(String name) { + this.name = name; + } + + public void Race(int num) { + positionBase = position;//변하기전 위치 기억 + for (int i = 0; i < num; i++) { + position += MoveOrNot(); + } + } + + public int MoveOrNot() { + if (Randoms.pickNumberInRange(0, 9) >= 4) + return 1; + return 0; + } + + public int getPosition() { + return position - positionBase;//전체 위치가 아닌 한라운드당 위차 계산 + } + + public String getName() { + return name; + } - public Car(String name) { - this.name = name; - } + public void increaseWinNum() { + winNum++; + } - // 추가 기능 구현 + public int getWinNum() { + return winNum; + } } diff --git a/src/main/java/racingcar/Game.java b/src/main/java/racingcar/Game.java new file mode 100644 index 0000000000..08d9cc5797 --- /dev/null +++ b/src/main/java/racingcar/Game.java @@ -0,0 +1,87 @@ +package racingcar; + +import java.util.*; +import java.util.stream.Collectors; + +public class Game { + private final ArrayList cars = new ArrayList<>(); + private List SortedCars; + private final int TryNum; + private final int carNum; + + public Game() { + ArrayList StringInput = Input.ReadCarName(); + TryNum = Input.ReadTryNum(); + setCars(StringInput); + carNum = cars.size(); + + System.out.println("실행 결과"); + Play(); + finalWin(); + } + + private void Play() { + for (int i = 0; i < TryNum; i++) { + Round(); + SortCars(); + Score(); + } + } + + private void SortCars() { + SortedCars = cars.stream() + .sorted(Comparator.comparing(Car::getPosition).reversed()) + .collect(Collectors.toList()); + } + + private void Score() { + Car maxCar = SortedCars.get(0); + maxCar.increaseWinNum(); + int max = maxCar.getPosition(); + + handleRoundCoWinner(max); + } + + private void handleRoundCoWinner(int max) { + for (int i = 1; i < carNum; i++) { + Car c1 = SortedCars.get(i); + if (c1.getPosition() != max) { + break; + } + c1.increaseWinNum(); + } + } + + private void Round() { + for (Car c1 : cars) { + c1.Race(TryNum); + Output.printRound(c1); + } + System.out.println(); + } + + private void setCars(ArrayList input) { + for (String s : input) { + cars.add(new Car(s)); + } + } + + private void finalWin() { + Collections.sort(cars, (c1, c2) -> c2.getWinNum() - c1.getWinNum()); + Car maxCar = cars.get(0); + int max = maxCar.getWinNum(); + System.out.print("최종 우승자 : " + maxCar.getName()); + handleFinalCoWinner(max); + System.out.println(); + } + + private void handleFinalCoWinner(int max) { + for (int i = 1; i < carNum; i++) { + Car c1 = cars.get(i); + if (c1.getWinNum() != max) { + break; + } + System.out.print(", " + c1.getName()); + } + } +} diff --git a/src/main/java/racingcar/Input.java b/src/main/java/racingcar/Input.java new file mode 100644 index 0000000000..cd4db2973c --- /dev/null +++ b/src/main/java/racingcar/Input.java @@ -0,0 +1,59 @@ +package racingcar; + +import camp.nextstep.edu.missionutils.Console; + +import java.util.ArrayList; +import java.util.List; + +public class Input { + static ArrayList carNames = new ArrayList(); + + public static ArrayList ReadCarName() { + System.out.println("경주할 자동차 이름을 입력하세요.(이름은 쉼표(,) 기준으로 구분)"); + while (true) { + String[] input = Console.readLine().split(","); + try { + StringHandlingExecption(input); + } catch (IllegalArgumentException e) { + System.out.println(e.getMessage() + " 5이하의 문자열을 입력하세요."); + continue; + } + break; + } + return carNames; + } + + private static void StringHandlingExecption(String[] input) { + + for (String s : input) { + if (s.length() > 5) { + throw new IllegalArgumentException("[ERROR]"); + } + carNames.add(s); + } + } + + public static int ReadTryNum() { + System.out.println("시도할 회수는 몇회인가요?"); + while (true) { + int num; + try { + num = IntHandlingException(Console.readLine()); + } catch (Exception e) { + System.out.println("[Error] 시도횟수는 숫자여야 한다."); + continue; + } + return num; + } + } + + private static int IntHandlingException(String n) { + int num; + try { + num = Integer.parseInt(n); + } catch (Exception e) { + throw new IllegalArgumentException("[Error]"); + } + return num; + } +} diff --git a/src/main/java/racingcar/Output.java b/src/main/java/racingcar/Output.java new file mode 100644 index 0000000000..31494a82ca --- /dev/null +++ b/src/main/java/racingcar/Output.java @@ -0,0 +1,15 @@ +package racingcar; + +public class Output { + public static void printRound(Car c1) { + System.out.print(c1.getName() + " : "); + printBar(c1); + } + + public static void printBar(Car c1) { + for (int i = 0; i < c1.getPosition(); i++) { + System.out.print("-"); + } + System.out.println(); + } +} diff --git a/src/test/java/racingcar/ApplicationTest.java b/src/test/java/racingcar/ApplicationTest.java index 8f6f70a218..fb4b24cb18 100644 --- a/src/test/java/racingcar/ApplicationTest.java +++ b/src/test/java/racingcar/ApplicationTest.java @@ -1,6 +1,7 @@ package racingcar; import camp.nextstep.edu.missionutils.test.NsTest; + import org.junit.jupiter.api.Test; import static camp.nextstep.edu.missionutils.test.Assertions.assertRandomNumberInRangeTest; @@ -8,34 +9,34 @@ import static org.assertj.core.api.Assertions.assertThat; class ApplicationTest extends NsTest { - private static final int MOVING_FORWARD = 4; - private static final int STOP = 3; - - private static final String ERROR_MESSAGE = "[ERROR]"; - - @Test - void 전진_정지() { - assertRandomNumberInRangeTest( - () -> { - run("pobi,woni", "1"); - assertThat(output()).contains("pobi : -", "woni : ", "최종 우승자 : pobi"); - }, - MOVING_FORWARD, STOP - ); - } - - @Test - void 이름에_대한_예외_처리() { - assertSimpleTest( - () -> { - runException("pobi,javaji"); - assertThat(output()).contains(ERROR_MESSAGE); - } - ); - } - - @Override - public void runMain() { - Application.main(new String[]{}); - } + private static final int MOVING_FORWARD = 4; + private static final int STOP = 3; + + private static final String ERROR_MESSAGE = "[ERROR]"; + + @Test + void 전진_정지() { + assertRandomNumberInRangeTest( + () -> { + run("pobi,woni", "1"); + assertThat(output()).contains("pobi : -", "woni : ", "최종 우승자 : pobi"); + }, + MOVING_FORWARD, STOP + ); + } + + @Test + void 이름에_대한_예외_처리() { + assertSimpleTest( + () -> { + runException("pobi,javaji"); + assertThat(output()).contains(ERROR_MESSAGE); + } + ); + } + + @Override + public void runMain() { + Application.main(new String[] {}); + } }