diff --git a/README.md b/README.md index 491aece1..4d9377bf 100644 --- a/README.md +++ b/README.md @@ -1 +1,10 @@ -# java-racingcar-precourse \ No newline at end of file +# java-racingcar-precourse + +# 기능 목록 정리 + +1. n대의 자동차 이름 입력 기능 +2. 이름 글자 제한 +3. 전진 기능 +4. 시행 횟수 입력 기능 +5. 우승자 표시 기능 +6. 예외 처리 기능 \ No newline at end of file diff --git a/src/main/java/racingcar/Application.java b/src/main/java/racingcar/Application.java new file mode 100644 index 00000000..35a27186 --- /dev/null +++ b/src/main/java/racingcar/Application.java @@ -0,0 +1,10 @@ +package racingcar; + +import racingcar.controller.RaceController; + +public class Application { + public static void main(String[] args) { + RaceController controller = new RaceController(); + controller.run(); + } +} diff --git a/src/main/java/racingcar/controller/RaceController.java b/src/main/java/racingcar/controller/RaceController.java new file mode 100644 index 00000000..df587bc5 --- /dev/null +++ b/src/main/java/racingcar/controller/RaceController.java @@ -0,0 +1,26 @@ +package racingcar.controller; + +import racingcar.model.Car; +import racingcar.model.Race; +import racingcar.view.InputView; +import racingcar.view.OutputView; + +import java.util.List; + +public class RaceController { + public void run(){ + String[] carNames = InputView.getCarNames(); + int numberOfAttempts = InputView.getNumberOfAttempts(); + + Race race = new Race(carNames); + OutputView.printOutput(); + for (int i = 0; i < numberOfAttempts; i++) { + race.race(); + OutputView.printRace(race.getCars()); + } + + List winners = race.getWinners(); + OutputView.printWinners(winners); + + } +} diff --git a/src/main/java/racingcar/model/Car.java b/src/main/java/racingcar/model/Car.java new file mode 100644 index 00000000..80f803f7 --- /dev/null +++ b/src/main/java/racingcar/model/Car.java @@ -0,0 +1,35 @@ +package racingcar.model; + +import java.util.Random; + +public class Car { + private static final int MINIMUM_NUM = 4; + private String name; + private int position = 0; + + public Car(String name){ + if (name == null || name.isEmpty() || name.length() > 5) { + throw new IllegalArgumentException("자동차 이름은 1자 이상, 5자 이하로 입력하세요."); + } + this.name = name; + } + + public void move(){ + if(canMove()){ + position++; + } + } + + private boolean canMove() { + Random random = new Random(); + return random.nextInt(10) >= MINIMUM_NUM; + } + + public int getPosition(){ + return position; + } + + public String getName(){ + return name; + } +} diff --git a/src/main/java/racingcar/model/Race.java b/src/main/java/racingcar/model/Race.java new file mode 100644 index 00000000..326900cb --- /dev/null +++ b/src/main/java/racingcar/model/Race.java @@ -0,0 +1,37 @@ +package racingcar.model; + +import java.util.ArrayList; +import java.util.List; +import java.util.stream.Collectors; + +public class Race { + private final List cars; + + public Race(String[] carNames) { + cars = new ArrayList<>(); + for (String name : carNames) { + cars.add(new Car(name)); + } + } + + public List getCars(){ + return cars; + } + + public void race() { + for (Car car : cars) { + car.move(); + } + } + + public List getWinners(){ + int maxPosition = cars.stream() + .mapToInt(Car::getPosition) + .max() + .orElse(0); + return cars.stream() + .filter(car -> car.getPosition() == maxPosition) + .map(Car::getName) + .collect(Collectors.toList()); + } +} diff --git a/src/main/java/racingcar/view/InputView.java b/src/main/java/racingcar/view/InputView.java new file mode 100644 index 00000000..2db5a472 --- /dev/null +++ b/src/main/java/racingcar/view/InputView.java @@ -0,0 +1,17 @@ +package racingcar.view; + +import java.util.Scanner; + +public class InputView { + private static final Scanner scanner = new Scanner(System.in); + + public static String[] getCarNames(){ + System.out.println("경주할 자동차 이름을 입력하세요. (이름은 쉼표(,) 기준으로 구분"); + return scanner.nextLine().split(","); + } + + public static int getNumberOfAttempts(){ + System.out.println("시도할 회수는 몇회인가요?"); + return scanner.nextInt(); + } +} diff --git a/src/main/java/racingcar/view/OutputView.java b/src/main/java/racingcar/view/OutputView.java new file mode 100644 index 00000000..e58bae48 --- /dev/null +++ b/src/main/java/racingcar/view/OutputView.java @@ -0,0 +1,21 @@ +package racingcar.view; + +import racingcar.model.Car; + +import java.util.List; + +public class OutputView { + + public static void printOutput(){ + System.out.println("\n실행 결과"); + } + public static void printRace(List cars) { + for (Car car : cars) { + System.out.println(car.getName() + " : " + "-".repeat(car.getPosition())); + } + } + + public static void printWinners(List winners) { + System.out.println("최종 우승자 : " + String.join(", ", winners)); + } +} diff --git a/src/test/java/racingcar/model/CarTest.java b/src/test/java/racingcar/model/CarTest.java new file mode 100644 index 00000000..eae96259 --- /dev/null +++ b/src/test/java/racingcar/model/CarTest.java @@ -0,0 +1,39 @@ +package racingcar.model; + +import org.junit.jupiter.api.Test; + +import static org.assertj.core.api.AssertionsForClassTypes.assertThat; +import static org.assertj.core.api.AssertionsForClassTypes.assertThatThrownBy; + +class CarTest { + + @Test + void move() { + Car car = new Car("pobi"); + int initialPosition = car.getPosition(); + car.move(); + assertThat(car.getPosition()).isGreaterThanOrEqualTo(initialPosition); + } + + @Test + void getPosition() { + Car car = new Car("pobi"); + assertThat(car.getPosition()).isEqualTo(0); + car.move(); + assertThat(car.getPosition()).isGreaterThanOrEqualTo(0); + } + + @Test + void getName() { + Car car = new Car("pobi"); + assertThat(car.getName()).isEqualTo("pobi"); + } + + @Test + void createCar() { + Car car = new Car("pobi"); + assertThat(car.getName()).isEqualTo("pobi"); + assertThat(car.getPosition()).isEqualTo(0); + } + +} \ No newline at end of file diff --git a/src/test/java/racingcar/model/RaceTest.java b/src/test/java/racingcar/model/RaceTest.java new file mode 100644 index 00000000..c52a1e94 --- /dev/null +++ b/src/test/java/racingcar/model/RaceTest.java @@ -0,0 +1,44 @@ +package racingcar.model; + +import org.junit.jupiter.api.Test; + +import java.util.List; + +import static org.assertj.core.api.AssertionsForInterfaceTypes.assertThat; + +class RaceTest { + + @Test + void getCars() { + String[] carNames = {"pobi", "woni", "jun"}; + Race race = new Race(carNames); + List cars = race.getCars(); + + assertThat(cars).hasSize(3); + assertThat(cars.get(0).getName()).isEqualTo("pobi"); + assertThat(cars.get(1).getName()).isEqualTo("woni"); + assertThat(cars.get(2).getName()).isEqualTo("jun"); + } + + @Test + void race() { + String[] carNames = {"pobi", "woni", "jun"}; + Race race = new Race(carNames); + race.race(); + + List cars = race.getCars(); + for (Car car : cars) { + assertThat(car.getPosition()).isGreaterThanOrEqualTo(0); + } + } + + @Test + void getWinners() { + String[] carNames = {"pobi", "woni", "jun"}; + Race race = new Race(carNames); + race.race(); + + List winners = race.getWinners(); + assertThat(winners).isNotEmpty(); + } +} \ No newline at end of file