diff --git a/src/main/java/racingcar/Application.java b/src/main/java/racingcar/Application.java index b9ed045..62ab11c 100644 --- a/src/main/java/racingcar/Application.java +++ b/src/main/java/racingcar/Application.java @@ -1,7 +1,8 @@ package racingcar; public class Application { - public static void main(String[] args) { - // TODO 구현 진행 - } + public static void main(String[] args) { + Game game = new Game(); + game.start(); + } } diff --git a/src/main/java/racingcar/Car.java b/src/main/java/racingcar/Car.java index ab3df94..621ab28 100644 --- a/src/main/java/racingcar/Car.java +++ b/src/main/java/racingcar/Car.java @@ -1,12 +1,32 @@ 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; + + public Car(String name) { + this.name = name; + } + + public int getPosition() { + return this.position; + } + + public String getName() { + return this.name; + } - public Car(String name) { - this.name = name; - } + public String toString() { + String distance = new String(new char[this.getPosition()]).replace("\0", "-"); + return this.getName() + " : " + distance; + } - // 추가 기능 구현 + // 추가 기능 구현 + void move() { + if (Randoms.pickNumberInRange(0, 9) >= 4) { + this.position += 1; + } + } } diff --git a/src/main/java/racingcar/Game.java b/src/main/java/racingcar/Game.java new file mode 100644 index 0000000..2422f96 --- /dev/null +++ b/src/main/java/racingcar/Game.java @@ -0,0 +1,47 @@ +package racingcar; + +import java.util.ArrayList; +import java.util.List; + +import utility.InputCheck; +import utility.Output; +import utility.Sort; + +public class Game { + private List cars = new ArrayList<>(); + + private void make() { + List names = InputCheck.inputCarNames(); + for (String name : names) { + this.cars.add(new Car(name)); + } + } + + private void run() { + int num = InputCheck.inputRound(); + for (int i = 0; i < num; i++) { + this.cars.forEach(Car::move); + Output.printProcedure(this.cars); + } + } + + public List findWinners() { + List winner = new ArrayList<>(); + List sortedCars = Sort.sortByPosition(this.cars); + int winnerScore = sortedCars.get(0).getPosition(); + for (Car car : sortedCars) { + if (car.getPosition() < winnerScore) { + break; + } + winner.add(car.getName()); + } + + return winner; + } + + public void start() { + make(); + run(); + Output.printResult(findWinners()); + } +} diff --git a/src/main/java/racingcar/manual.md b/src/main/java/racingcar/manual.md new file mode 100644 index 0000000..28f5e8b --- /dev/null +++ b/src/main/java/racingcar/manual.md @@ -0,0 +1,10 @@ +자동차 경주 게임 기능 구현 +====================== + +🗒️기능 목록 +-------- +### 1. 자동차가 주어진 Random 값에 따라 전진 혹은 멈추는 기능 +### 2. 입력받은 이동 횟수만큼 1의 함수를 실행시키는 기능 +### 3. 입력이 잘못되었을때 에러를 발생시키고 다시 입력받게 하는 기능 +### 4. 입력으로 주어진 이름을 기반으로 Car Object를 생성하는 기능 +### 5. 결과를 출력하는 기능 diff --git a/src/main/java/utility/InputCheck.java b/src/main/java/utility/InputCheck.java new file mode 100644 index 0000000..08411a8 --- /dev/null +++ b/src/main/java/utility/InputCheck.java @@ -0,0 +1,49 @@ +package utility; + +import java.util.Arrays; +import java.util.List; +import java.util.regex.Pattern; + +import camp.nextstep.edu.missionutils.Console; + +public final class InputCheck { + + public static List inputCarNames() { + while (true) { + System.out.println("경주할 자동차 이름을 입력하세요.(이름은 쉽표(,) 기준으로 구분)"); + List names = Arrays.asList(Console.readLine().split(",")); + try { + names.forEach(InputCheck::checkName); + return names; + } catch (IllegalArgumentException e) { + System.out.println(e.getMessage()); + } + } + } + + private static void checkName(String name) { + if (name.trim().length() == 0 || name.trim().length() > 5) { + throw new IllegalArgumentException("[ERROR] 이름은 1~5자 사이로 작성하라."); + } + } + + public static int inputRound() { + while (true) { + System.out.println("시도할 회수는 몇회인가요?"); + try { + String input = Console.readLine(); + checkRound(input); + return Integer.parseInt(input); + } catch (IllegalArgumentException e) { + System.out.println(e.getMessage()); + } + } + } + + private static void checkRound(String input) { + String pattern = "^[0-9]+$"; + if (!Pattern.matches(pattern, input)) { + throw new IllegalArgumentException("[ERROR] 시도 횟수는 자연수인 숫자여야 한다."); + } + } +} diff --git a/src/main/java/utility/Output.java b/src/main/java/utility/Output.java new file mode 100644 index 0000000..ddb053d --- /dev/null +++ b/src/main/java/utility/Output.java @@ -0,0 +1,18 @@ +package utility; + +import java.util.List; + +import racingcar.Car; + +public class Output { + public static void printProcedure(List cars) { + System.out.println("실행 결과"); + cars.forEach(car -> System.out.println(car.toString())); + System.out.println(); + } + + public static void printResult(List winners) { + System.out.println("최종 우승자" + " : " + String.join(", ", winners)); + } + +} diff --git a/src/main/java/utility/Sort.java b/src/main/java/utility/Sort.java new file mode 100644 index 0000000..c704956 --- /dev/null +++ b/src/main/java/utility/Sort.java @@ -0,0 +1,12 @@ +package utility; + +import java.util.List; + +import racingcar.Car; + +public class Sort { + public static List sortByPosition(List cars) { + cars.sort((x, y) -> y.getPosition() - x.getPosition()); + return cars; + } +}