diff --git a/src/main/java/racingcar/Application.java b/src/main/java/racingcar/Application.java index a17a52e724..f17ef3731a 100644 --- a/src/main/java/racingcar/Application.java +++ b/src/main/java/racingcar/Application.java @@ -1,7 +1,10 @@ package racingcar; +import racingcar.controller.GameController; + public class Application { public static void main(String[] args) { - // TODO: 프로그램 구현 + GameController gameController = new GameController(); + gameController.startGame(); } } diff --git a/src/main/java/racingcar/controller/GameController.java b/src/main/java/racingcar/controller/GameController.java new file mode 100644 index 0000000000..2123a2bcc6 --- /dev/null +++ b/src/main/java/racingcar/controller/GameController.java @@ -0,0 +1,29 @@ +package racingcar.controller; + +import racingcar.domain.Car; +import racingcar.domain.RacingGame; +import racingcar.service.GameService; +import racingcar.view.InputGameView; +import racingcar.view.ResultGameView; + +import java.util.List; +import java.util.stream.Collectors; + +public class GameController { + private final GameService gameService=new GameService(); + public void startGame(){ + List carNames= InputGameView.carNames(); + int tryNum=InputGameView.tryNum(); + + RacingGame game= gameService.createGame(carNames,tryNum); + System.out.print("\n실행 결과"); + + while (!game.isFinished()){ + gameService.playGame(game); + ResultGameView.midPrint(game.getCars()); + } + + ResultGameView.finalPrint(game.getWinner()); + + } +} diff --git a/src/main/java/racingcar/domain/Car.java b/src/main/java/racingcar/domain/Car.java new file mode 100644 index 0000000000..154e3d5aa4 --- /dev/null +++ b/src/main/java/racingcar/domain/Car.java @@ -0,0 +1,29 @@ +package racingcar.domain; + +import java.util.List; + +public class Car { + private String carName; + private int count; + + public Car( String carName) { + + if (carName.length() > 5) throw new IllegalArgumentException("잘못된 값을 입력하였습니다."); + this.carName = carName; + this.count = 0; + } + + public void move(int randomValue) { + if (randomValue >= 4) count++; + } + + public String getName() { + return carName; + } + public int getCount() { + return count; + } + + + +} diff --git a/src/main/java/racingcar/domain/RacingGame.java b/src/main/java/racingcar/domain/RacingGame.java new file mode 100644 index 0000000000..6b1c04734f --- /dev/null +++ b/src/main/java/racingcar/domain/RacingGame.java @@ -0,0 +1,45 @@ +package racingcar.domain; + +import racingcar.view.InputGameView; +import java.util.*; +import java.util.stream.Collectors; + +public class RacingGame { + private final List cars; + private int remainRounds; + private final Random random = new Random(); + private InputGameView inputGameView; + + public RacingGame(List cars, int remainRounds) { + this.cars = cars; + this.remainRounds = remainRounds; + } + + public boolean isFinished(){ + return remainRounds <= 0; + } + + public void play(){ + cars.forEach(car -> car.move(randomValue())); + remainRounds--; + } + + public List getCars(){ + return cars; + } + + public List getWinner(){ + int maxDistance=cars.stream() + .mapToInt(Car::getCount) + .max() + .orElse(0); + return cars.stream() + .filter(car -> car.getCount()==maxDistance) + .map(car -> car.getName()) + .collect(Collectors.toList()); + } + + public int randomValue(){ + return random.nextInt(10); + } +} diff --git a/src/main/java/racingcar/service/GameService.java b/src/main/java/racingcar/service/GameService.java new file mode 100644 index 0000000000..f84d7b5ec0 --- /dev/null +++ b/src/main/java/racingcar/service/GameService.java @@ -0,0 +1,18 @@ +package racingcar.service; + +import racingcar.domain.Car; +import racingcar.domain.RacingGame; + +import java.util.List; +import java.util.stream.Collectors; + +public class GameService { + public RacingGame createGame(List carNames, int rounds){ + List cars = carNames.stream().map(Car::new).collect(Collectors.toList()); + return new RacingGame(cars, rounds); + } + + public void playGame(RacingGame racingGame){ + racingGame.play(); + } +} diff --git a/src/main/java/racingcar/view/InputGameView.java b/src/main/java/racingcar/view/InputGameView.java new file mode 100644 index 0000000000..e12def7ab0 --- /dev/null +++ b/src/main/java/racingcar/view/InputGameView.java @@ -0,0 +1,22 @@ +package racingcar.view; + +import camp.nextstep.edu.missionutils.Console; + +import java.util.Arrays; +import java.util.List; + +public class InputGameView { + public static List carNames(){ + System.out.println("경주할 자동차 이름을 입력하세요.(이름은 쉼표(,) 기준으로 구분)"); + return Arrays.stream(Console.readLine().split(",")) + .map(String::trim) + .toList(); + } + + public static int tryNum(){ + System.out.println("시도할 횟수는 몇 회인가요?"); + return Integer.parseInt(Console.readLine()); + } + +} + diff --git a/src/main/java/racingcar/view/ResultGameView.java b/src/main/java/racingcar/view/ResultGameView.java new file mode 100644 index 0000000000..5aab1ba756 --- /dev/null +++ b/src/main/java/racingcar/view/ResultGameView.java @@ -0,0 +1,22 @@ + +package racingcar.view; + +import racingcar.domain.Car; + +import java.util.List; +import java.util.Map; +import java.util.stream.Collectors; + +public class ResultGameView { + + public static void midPrint(Listcars){ + System.out.println(); + cars.forEach(car-> + System.out.printf("%s : %s\n", car.getName(),"-".repeat(car.getCount())) + ); + } + + public static void finalPrint(List carNames){ + System.out.printf("최종 우승자 : %s", String.join(", ",carNames)); + } +}