diff --git a/src/main/java/carRacingGame/CarRacingGame.java b/src/main/java/carRacingGame/CarRacingGame.java new file mode 100644 index 00000000000..87f4f885639 --- /dev/null +++ b/src/main/java/carRacingGame/CarRacingGame.java @@ -0,0 +1,15 @@ +package carRacingGame; + +public class CarRacingGame { + static CarRacingGameUtils cars = new CarRacingGameUtils(); + + public static void main(String[] args) { + String[] nameOfCars = InputView.inputNameOfCars(); + int numberOfAttempts = InputView.inputNumberOfAttempts(); + + cars.setupCars(nameOfCars); + cars.displayRaceProgress(numberOfAttempts); + cars.printWinnerName(); + } +} + diff --git a/src/main/java/carRacingGame/CarRacingGameUtils.java b/src/main/java/carRacingGame/CarRacingGameUtils.java new file mode 100644 index 00000000000..61b5c440cab --- /dev/null +++ b/src/main/java/carRacingGame/CarRacingGameUtils.java @@ -0,0 +1,67 @@ +package carRacingGame; + +import java.util.*; + +import static carRacingGame.PrintView.printWinners; + +public class CarRacingGameUtils { + public Map cars = new HashMap<>(); + public List finalWinners = new ArrayList<>(); + + public Map setupCars(String[] inputNameOfCars) { + for (String carName : inputNameOfCars) { + cars.put(carName, ""); + } + return cars; + } + + public void displayRaceProgress(int numberOfAttempts) { + System.out.println("실행 결과"); + for (int attempt = 0; attempt < numberOfAttempts; attempt++) { + moveCars(); + PrintView.printCars(cars); + System.out.println(); + } + } + + public void moveCars() { + cars.forEach((carName, currentPosition) -> { + String newPosition = moveForward(currentPosition); + cars.put(carName, newPosition); + }); + } + + + public String moveForward(String currentPosition) { + Random random = new Random(); + int randomValue = random.nextInt(10); + if (randomValue >= 4) { + currentPosition += "-"; + } + return currentPosition; + } + + + public void printWinnerName() { + racingResult(); + String winnerNames = ""; + winnerNames = String.join(", ", finalWinners); + printWinners(winnerNames); + } + + public void racingResult(){ + String furthestDistance = Collections.max(cars.values()); + int furthestDistanceOfCar = furthestDistance.length(); + + cars.forEach((carName, finalDistance) -> { + int carNameDistance = finalDistance.length(); + getCurrentWinner(carName, furthestDistanceOfCar, carNameDistance); + }); + + } + public void getCurrentWinner(String carName, int furthestDistanceOfCar, int carNameDistance) { + if (carNameDistance >= furthestDistanceOfCar) { + finalWinners.add(carName); + } + } +} diff --git a/src/main/java/carRacingGame/InputView.java b/src/main/java/carRacingGame/InputView.java new file mode 100644 index 00000000000..d111e14d763 --- /dev/null +++ b/src/main/java/carRacingGame/InputView.java @@ -0,0 +1,35 @@ +package carRacingGame; + +import java.util.Scanner; + +public class InputView { + private static final Scanner scanner = new Scanner(System.in); + private static final String splitter = ","; + public static String[] inputNameOfCars() { + System.out.println("경주할 자동차 이름을 입력하세요(이름은 쉼표(,)를 기준으로 구분)."); + String nameOfCars = scanner.next(); + if (!(nameOfCars instanceof String)) { + throw new IllegalArgumentException("Name of cars should be string type"); + } + String[] listedCars = nameOfCars.split(splitter); + + return listedCars; + } + public static int inputNumberOfCars() { + System.out.println("자동차 대수는 몇 대 인가요?"); + int numberOfCars = scanner.nextInt(); + if (numberOfCars <= 0) { + throw new IllegalArgumentException("Number of cars should be positive"); + } + return numberOfCars; + } + + public static int inputNumberOfAttempts() { + System.out.println("시도할 회수는 몇 회 인가요?"); + int numberOfAttempts = scanner.nextInt(); + if (numberOfAttempts <= 0) { + throw new IllegalArgumentException("Number of attempts should be positive"); + } + return numberOfAttempts; + } +} diff --git a/src/main/java/carRacingGame/PrintView.java b/src/main/java/carRacingGame/PrintView.java new file mode 100644 index 00000000000..c36ee3cca10 --- /dev/null +++ b/src/main/java/carRacingGame/PrintView.java @@ -0,0 +1,17 @@ +package carRacingGame; + +import java.util.Map; + +public class PrintView { + + public static void printCars(Map cars) { + cars.forEach((carName, position) -> { + System.out.println(carName + " : " + position); + }); + } + + public static void printWinners(String winnerNames) { + System.out.println(winnerNames + "가 최종 우승했습니다."); + + } +} diff --git a/src/main/java/StringAddCalculator/StringCalculator.java b/src/main/java/stringAddCalculator/StringCalculator.java similarity index 95% rename from src/main/java/StringAddCalculator/StringCalculator.java rename to src/main/java/stringAddCalculator/StringCalculator.java index 29661773f27..ae2af39d8f8 100644 --- a/src/main/java/StringAddCalculator/StringCalculator.java +++ b/src/main/java/stringAddCalculator/StringCalculator.java @@ -1,4 +1,4 @@ -package StringAddCalculator; +package stringAddCalculator; import java.util.List; diff --git a/src/main/java/StringAddCalculator/StringCalculatorUtils.java b/src/main/java/stringAddCalculator/StringCalculatorUtils.java similarity index 67% rename from src/main/java/StringAddCalculator/StringCalculatorUtils.java rename to src/main/java/stringAddCalculator/StringCalculatorUtils.java index 9b114a49cd5..534d086bbdd 100644 --- a/src/main/java/StringAddCalculator/StringCalculatorUtils.java +++ b/src/main/java/stringAddCalculator/StringCalculatorUtils.java @@ -1,21 +1,24 @@ -package StringAddCalculator; +package stringAddCalculator; import java.util.ArrayList; import java.util.List; public class StringCalculatorUtils { + private static final String DELEMETER = ",|:"; + public static String[] splitStringCalculator(String inputs) { - String DELEMETER = ",|:"; String splitedString = inputs; + String currentDelimeter = DELEMETER; if (inputs.startsWith("//")) { int separatorIndex = inputs.indexOf("\n"); - DELEMETER = inputs.substring(2, separatorIndex); + currentDelimeter = inputs.substring(2, separatorIndex); // 사용자 정의 구분자를 currentDelimeter에 저장 splitedString = inputs.substring(separatorIndex + 1); } - return splitedString.split(DELEMETER); + return splitedString.split(currentDelimeter); + } public static List convertInputs(String[] inputs) { List result = new ArrayList<>(); @@ -29,7 +32,7 @@ public static List convertInputs(String[] inputs) { private static int toPositiveInteger(String input) { int number = Integer.parseInt(input); if (number < 0) { - throw new RuntimeException("There is wrong value included: " + input); + throw new IllegalArgumentException("There is wrong value included: " + input); } return number; } diff --git a/src/test/java/CarRacingUtilsTest.java b/src/test/java/CarRacingUtilsTest.java new file mode 100644 index 00000000000..c47daaee798 --- /dev/null +++ b/src/test/java/CarRacingUtilsTest.java @@ -0,0 +1,63 @@ + +import carRacingGame.CarRacingGameUtils; +import org.junit.jupiter.api.BeforeEach; +import org.junit.jupiter.api.DisplayName; +import org.junit.jupiter.api.Test; + +import java.util.Map; + +import static org.junit.jupiter.api.Assertions.*; + +public class CarRacingUtilsTest { + + private CarRacingGameUtils carRacingGameUtils; + + @BeforeEach + public void setUp() { + carRacingGameUtils = new CarRacingGameUtils(); + } + + @Test + @DisplayName("Test if car names are properly saved") + public void testSetupCars() { + String[] carNames = {"Car1", "Car2", "Car3"}; + + Map cars = carRacingGameUtils.setupCars(carNames); + + assertEquals(3, cars.size()); + assertTrue(cars.containsKey("Car1")); + assertTrue(cars.containsKey("Car2")); + assertTrue(cars.containsKey("Car3")); + } + + @Test + public void testMakeDistanceOfCars() { + + String initialPosition = ""; + String newPosition = carRacingGameUtils.moveForward(initialPosition); + assertTrue(newPosition.equals("") || newPosition.equals("-")); + } + + @Test + public void testMoveCars() { + + String[] carNames = {"Car1", "Car2"}; + carRacingGameUtils.setupCars(carNames); + carRacingGameUtils.moveCars(); + carRacingGameUtils.cars.forEach((carName, position) -> { + assertTrue(position.equals("") || position.equals("-")); + }); + } + + @Test + @DisplayName("test if winners found properly") + public void testRacingResult() { + + String[] carNames = {"Car1", "Car2"}; + carRacingGameUtils.setupCars(carNames); + carRacingGameUtils.moveCars(); + carRacingGameUtils.racingResult(); + + assertFalse(carRacingGameUtils.finalWinners.isEmpty()); + } +} diff --git a/src/test/java/StringCalculatorTest.java b/src/test/java/StringCalculatorTest.java index cfdedc1f593..780414eb8b5 100644 --- a/src/test/java/StringCalculatorTest.java +++ b/src/test/java/StringCalculatorTest.java @@ -1,4 +1,4 @@ -import StringAddCalculator.StringCalculator; +import stringAddCalculator.StringCalculator; import org.junit.jupiter.api.Test;