diff --git a/README.md b/README.md index 1969313..d9e62c2 100644 --- a/README.md +++ b/README.md @@ -2,3 +2,7 @@ 자동차 경주 미션 저장소 +//경주할 자동차 이름 입력받기 +//시도할 횟수 입력 받기 +//경주 진행하기 +//우승자 출력하기 diff --git a/src/main/java/RacingMain.java b/src/main/java/RacingMain.java index 4394287..6db9c8f 100644 --- a/src/main/java/RacingMain.java +++ b/src/main/java/RacingMain.java @@ -1,7 +1,9 @@ -public class RacingMain { +import controller.RacingController; +import domain.RacingGame; +public class RacingMain { public static void main(String[] args) { - // TODO: MVC 패턴을 기반으로 자동차 경주 미션 구현해보기 - System.out.println("Hello, World!"); + final RacingController racingController = new RacingController(); + racingController.run(); } } diff --git a/src/main/java/controller/RacingController.java b/src/main/java/controller/RacingController.java new file mode 100644 index 0000000..1ad20ae --- /dev/null +++ b/src/main/java/controller/RacingController.java @@ -0,0 +1,53 @@ +package controller; + +import domain.RacingGame; +import util.GenerateRandomDistance; +import view.InputView; +import view.ResultView; + +import java.util.*; + + +public class RacingController { + public void run(){ + try{ + final var cars = InputView.readCarNames(); //차이름 입력받기 + final var tryCount = InputView.readTryCount(); //시도 횟수 입력받기 + + final var racingGame = new RacingGame(cars, tryCount); + race(racingGame); //경주 실행 + + ResultView.printWinners(getWinners(racingGame.getCars())); //우승자 출력 + + }catch(IllegalArgumentException e){ + System.out.println(e.getMessage()); + } + } + + + //경주 실행 + private void race(RacingGame racingGame){ + ResultView resultView = new ResultView(); + resultView.start(racingGame.getCars()); + + for(int i = 0; i < racingGame.getTryCount(); i++){ + GenerateRandomDistance.generateRandomDistance(racingGame.getCars()); + resultView.printRaceStep(racingGame.getCars()); + System.out.println(); + } + } + + + //우승자 구하는 메소드 + private List getWinners(Map cars){ + List winners = new ArrayList<>(); + int maxValue = Collections.max(cars.values()); + + for(Map.Entry entry : cars.entrySet()){ //이거 메소드로 분리하는게 가독성이 더 떨어질듯? + if(entry.getValue() == maxValue){ + winners.add(entry.getKey()); + } + } + return winners; + } +} diff --git a/src/main/java/domain/RacingGame.java b/src/main/java/domain/RacingGame.java new file mode 100644 index 0000000..a2219df --- /dev/null +++ b/src/main/java/domain/RacingGame.java @@ -0,0 +1,56 @@ +package domain; + +import java.util.*; + +public class RacingGame { + private static Map cars; + private int tryCount; + + public RacingGame(){ + + } + public RacingGame(Map cars, int tryCount){ + carNamesValidate(cars); + tryCountValidate(tryCount); + this.cars = cars; + this.tryCount = tryCount; + } + + //자동차 distance 업데이트 메소드 + public static void updateDistance(String carName, int random){ + if(random >= 4) { + int distance = cars.get(carName) + 1; + cars.replace(carName, distance); + } + } + + public Map getCars() { + return cars; + } + + public int getTryCount() { + return tryCount; + } + + public static void tryCountValidate(int count){ + if(count <= 0) + throw new IllegalArgumentException("[ERROR]시도 횟수는 양수입니다."); + } + + //차이름 유효성 검사 메소드 + public static void carNamesValidate(Map cars){ + Iterator keys = cars.keySet().iterator(); + while(keys.hasNext()){ + String key = keys.next(); + lengthValidate(key); + } + + } + + //차 길이 유효성 검사 메소드 + private static void lengthValidate(String name){ + if(name.length() > 5) + throw new IllegalArgumentException("[ERROR]차 이름은 5자 이하여야합 니다."); + } + +} diff --git a/src/main/java/util/GenerateRandomDistance.java b/src/main/java/util/GenerateRandomDistance.java new file mode 100644 index 0000000..2d29df3 --- /dev/null +++ b/src/main/java/util/GenerateRandomDistance.java @@ -0,0 +1,17 @@ +package util; + +import domain.RacingGame; + +import java.util.Map; +import java.util.Random; + +public class GenerateRandomDistance { + + public static void generateRandomDistance(Map cars){ + for(Map.Entry entry : cars.entrySet()){ + Random random = new Random(); + int randomNum = random.nextInt(10); + RacingGame.updateDistance(entry.getKey(), randomNum); + } + } +} diff --git a/src/main/java/view/InputView.java b/src/main/java/view/InputView.java new file mode 100644 index 0000000..3615e2f --- /dev/null +++ b/src/main/java/view/InputView.java @@ -0,0 +1,33 @@ +package view; + +import java.util.*; + +public class InputView { + private static Scanner scanner = new Scanner(System.in); + + //차이름 입력 메소드 + public static Map readCarNames(){ + try{ + Map cars = new HashMap<>(); + System.out.println("경주할 자동차 이름을 입력하세요(이름은 쉼표(,)를 기준으로 구분)."); + String line = scanner.nextLine(); + String[] str = line.split(","); + for(int i = 0; i winners){ + int i; + for(i = 0; i < winners.size() - 1; i++){ + System.out.print(winners.get(i)+ ", "); + } + System.out.print(winners.get(i) + "가 최종 우승했습니다."); + } + + //경주 단계 출력 메소드 + public void printRaceStep(Map cars){ + for(Map.Entry entry : cars.entrySet()){ + String name = entry.getKey(); + String distance = "-".repeat(cars.get(name)); + System.out.println(name + " : " + distance); + } + } + + //경주 시작 출력 메소드 + public void start(Map cars){ + System.out.println("실행 결과"); + printRaceStep(cars); + System.out.println(); + } +} + + diff --git a/src/test/java/controller/RacingControllerTest.java b/src/test/java/controller/RacingControllerTest.java new file mode 100644 index 0000000..39e8fe5 --- /dev/null +++ b/src/test/java/controller/RacingControllerTest.java @@ -0,0 +1,4 @@ +package controller; + +public class RacingControllerTest { +} diff --git a/src/test/java/domain/RacingGameTest.java b/src/test/java/domain/RacingGameTest.java new file mode 100644 index 0000000..8b71ded --- /dev/null +++ b/src/test/java/domain/RacingGameTest.java @@ -0,0 +1,4 @@ +package domain; + +public class RacingGameTest { +} diff --git a/src/test/java/view/InputViewTest.java b/src/test/java/view/InputViewTest.java new file mode 100644 index 0000000..c565b41 --- /dev/null +++ b/src/test/java/view/InputViewTest.java @@ -0,0 +1,4 @@ +package view; + +public class InputViewTest { +} diff --git a/src/test/java/view/ResultViewTest.java b/src/test/java/view/ResultViewTest.java new file mode 100644 index 0000000..1d34421 --- /dev/null +++ b/src/test/java/view/ResultViewTest.java @@ -0,0 +1,18 @@ +package view; + +import org.junit.jupiter.api.Test; +import org.assertj.*; + +public class ResultViewTest { + + @Test + void 기능_테스트(){ + //given + + //when + + //then + + + } +}