diff --git a/src/main/java/empty.txt b/src/main/java/empty.txt deleted file mode 100644 index e69de29..0000000 diff --git a/src/main/java/racing/RacingMain.java b/src/main/java/racing/RacingMain.java new file mode 100644 index 0000000..5019214 --- /dev/null +++ b/src/main/java/racing/RacingMain.java @@ -0,0 +1,19 @@ +package racing; + +import racing.domain.RacingGame; +import racing.dto.RacingGameResult; +import racing.view.InputView; +import racing.view.OutputView; + +public class RacingMain { + + private static RacingGame racingGame = new RacingGame(); + + public static void main(String[] args) { + racingGame.setCars(InputView.readCarInfo()); + RacingGameResult result = racingGame.play(InputView.readTryRound()); + + OutputView.printRacingGameResult(result); + OutputView.printWinners(result); + } +} diff --git a/src/main/java/racing/domain/Car.java b/src/main/java/racing/domain/Car.java new file mode 100644 index 0000000..9c50d41 --- /dev/null +++ b/src/main/java/racing/domain/Car.java @@ -0,0 +1,49 @@ +package racing.domain; + +import racing.dto.CarDTO; + +import java.util.Objects; + +public class Car { + + private String name; + private int distance; + + public Car(String name) { + this.name = name; + } + + public int getDistance() { + return distance; + } + + public int move() { + return this.distance++; + } + + public CarDTO toCarDTO() { + return new CarDTO(name, distance); + } + + @Override + public boolean equals(Object o) { + if (this == o) return true; + if (o == null || getClass() != o.getClass()) return false; + Car car = (Car) o; + return distance == car.distance && + Objects.equals(name, car.name); + } + + @Override + public int hashCode() { + return Objects.hash(name, distance); + } + + @Override + public String toString() { + return "Car{" + + "name='" + name + '\'' + + ", distance=" + distance + + '}'; + } +} diff --git a/src/main/java/racing/domain/RacingGame.java b/src/main/java/racing/domain/RacingGame.java new file mode 100644 index 0000000..3906833 --- /dev/null +++ b/src/main/java/racing/domain/RacingGame.java @@ -0,0 +1,67 @@ +package racing.domain; + +import racing.dto.RacingGameResult; +import racing.utils.RandomValueGenerator; + +import java.util.ArrayList; +import java.util.List; +import java.util.Objects; +import java.util.stream.Collectors; + +public class RacingGame { + + private static final int FORWARD_CONDITION = 4; + private static final int BOUNDARY = 10; + + private List cars; + + public void setCars(String carNames) { + String[] carArrays = carNames.split(","); + cars = new ArrayList<>(); + + for (int i = 0; i < carArrays.length; i++) { + cars.add(new Car(carArrays[i])); + } + } + + public RacingGameResult play(int tryRound) { + for (int i = 0; i < tryRound; i++) { + moveCars(); + } + return new RacingGameResult(cars.stream().map(Car::toCarDTO).collect(Collectors.toList())); + } + + public void moveCars() { + for (Car car : cars) { + moveSelectedCar(car, RandomValueGenerator.generate(BOUNDARY)); + } + } + + public void moveSelectedCar(Car car, int randomValue) { + if (isMoveCondition(randomValue)) { + car.move(); + } + } + + public boolean isMoveCondition(int randomValue) { + return randomValue > FORWARD_CONDITION; + } + + @Override + public boolean equals(Object o) { + if (this == o) return true; + if (o == null || getClass() != o.getClass()) return false; + RacingGame that = (RacingGame) o; + return Objects.equals(cars, that.cars); + } + + @Override + public int hashCode() { + return Objects.hash(cars); + } + + @Override + public String toString() { + return cars.toString(); + } +} diff --git a/src/main/java/racing/dto/CarDTO.java b/src/main/java/racing/dto/CarDTO.java new file mode 100644 index 0000000..b89c490 --- /dev/null +++ b/src/main/java/racing/dto/CarDTO.java @@ -0,0 +1,60 @@ +package racing.dto; + +import java.util.Objects; + +public class CarDTO { + + private String name; + private int distance; + + public CarDTO(String carName, int distance) { + this.name = carName; + this.distance = distance; + } + + public String getName() { + return name; + } + + public void setName(String name) { + this.name = name; + } + + public int getDistance() { + return distance; + } + + public void setDistance(int distance) { + this.distance = distance; + } + + public void drawCarTrack(String TRACK) { + System.out.print(name); + for (int i = 0; i < distance; i++) { + System.out.print(TRACK); + } + System.out.println(); + } + + @Override + public boolean equals(Object o) { + if (this == o) return true; + if (o == null || getClass() != o.getClass()) return false; + CarDTO carDTO = (CarDTO) o; + return distance == carDTO.distance && + Objects.equals(name, carDTO.name); + } + + @Override + public int hashCode() { + return Objects.hash(name, distance); + } + + @Override + public String toString() { + return "CarDTO{" + + "name='" + name + '\'' + + ", distance=" + distance + + '}'; + } +} diff --git a/src/main/java/racing/dto/RacingGameResult.java b/src/main/java/racing/dto/RacingGameResult.java new file mode 100644 index 0000000..e1624c2 --- /dev/null +++ b/src/main/java/racing/dto/RacingGameResult.java @@ -0,0 +1,58 @@ +package racing.dto; + +import java.util.ArrayList; +import java.util.Comparator; +import java.util.List; +import java.util.stream.Collectors; + +public class RacingGameResult { + + private static final String TRACK = "-"; + + private List cars; + + public RacingGameResult(List cars) { + this.cars = cars; + } + + public void visualize() { + for (CarDTO car : cars) { + car.drawCarTrack(TRACK); + } + } + + public List getWinnersName(){ + List sortedCar = sortCars(); + List winners = findWinners(sortedCar, getFirstCar(sortedCar)); + + return winners.stream() + .map(CarDTO::getName) + .collect(Collectors.toList()); + } + + private List findWinners(List sortedCar, int maxDistance) { + List winners = new ArrayList<>(); + for (CarDTO carDTO : sortedCar) { + if(!isMaxDistance(maxDistance, carDTO)) { + break; + } + winners.add(carDTO); + } + return winners; + } + + private boolean isMaxDistance(int maxDistance, CarDTO carDTO) { + return carDTO.getDistance() == maxDistance; + } + + private int getFirstCar(List sortedCar) { + return sortedCar.get(0).getDistance(); + } + + private List sortCars() { + return cars.stream() + .sorted(Comparator.comparing(CarDTO::getDistance) + .reversed()) + .collect(Collectors.toList()); + } +} diff --git a/src/main/java/racing/utils/RandomValueGenerator.java b/src/main/java/racing/utils/RandomValueGenerator.java new file mode 100644 index 0000000..cff6a1f --- /dev/null +++ b/src/main/java/racing/utils/RandomValueGenerator.java @@ -0,0 +1,12 @@ +package racing.utils; + +import java.util.Random; + +public class RandomValueGenerator { + + private static Random random = new Random(); + + public static int generate(int bound) { + return random.nextInt(bound); + } +} diff --git a/src/main/java/racing/view/InputView.java b/src/main/java/racing/view/InputView.java new file mode 100644 index 0000000..b0a508c --- /dev/null +++ b/src/main/java/racing/view/InputView.java @@ -0,0 +1,18 @@ +package racing.view; + +import java.util.Scanner; + +public class InputView { + + private static Scanner scanner = new Scanner(System.in); + + public static String readCarInfo() { + System.out.println("경주할 자동차 이름을 입력하세요(이름을 쉼표(,)를 기준으로 구분)."); + return scanner.nextLine(); + } + + public static int readTryRound() { + System.out.println("시도할 회수는 몇 회 인가요?"); + return scanner.nextInt(); + } +} diff --git a/src/main/java/racing/view/OutputView.java b/src/main/java/racing/view/OutputView.java new file mode 100644 index 0000000..16fc82c --- /dev/null +++ b/src/main/java/racing/view/OutputView.java @@ -0,0 +1,16 @@ +package racing.view; + +import racing.dto.RacingGameResult; + +public class OutputView { + + public static void printRacingGameResult(RacingGameResult result) { + System.out.println("실행 결과"); + + result.visualize(); + } + + public static void printWinners(RacingGameResult result) { + System.out.println(result.getWinnersName() + "가 최종 우승했습니다."); + } +} diff --git a/src/test/java/empty.txt b/src/test/java/empty.txt deleted file mode 100644 index e69de29..0000000 diff --git a/src/test/java/racing/domain/CarTest.java b/src/test/java/racing/domain/CarTest.java new file mode 100644 index 0000000..8aead55 --- /dev/null +++ b/src/test/java/racing/domain/CarTest.java @@ -0,0 +1,30 @@ +package racing.domain; + +import racing.dto.CarDTO; +import org.junit.Before; +import org.junit.Test; + +import static org.assertj.core.api.Assertions.assertThat; + + +public class CarTest { + + private Car car; + + @Before + public void setUp() { + car = new Car("javajigi"); + } + + @Test + public void moveTest() { + car.move(); + assertThat(car.getDistance()).isEqualTo(1); + } + + @Test + public void toCarDTOTest(){ + car.move(); // distance + 1 + assertThat(car.toCarDTO().toString()).isEqualTo(new CarDTO("javajigi", 1).toString()); + } +} \ No newline at end of file diff --git a/src/test/java/racing/domain/RacingGameTest.java b/src/test/java/racing/domain/RacingGameTest.java new file mode 100644 index 0000000..417883e --- /dev/null +++ b/src/test/java/racing/domain/RacingGameTest.java @@ -0,0 +1,55 @@ +package racing.domain; + +import racing.dto.RacingGameResult; +import org.junit.Before; +import org.junit.Test; + +import java.util.ArrayList; +import java.util.List; + +import static org.assertj.core.api.Assertions.assertThat; + +public class RacingGameTest { + + private RacingGame racingGame; + + @Before + public void setup() { + racingGame = new RacingGame(); + } + + @Test + public void playGameTest() { + racingGame.setCars("pobi"); + RacingGameResult result = racingGame.play(5); + + assertThat(result).isNotNull(); + } + + @Test + public void setCarsTest() { + List cars = new ArrayList<>(); + + cars.add(new Car("hyukjin")); + cars.add(new Car("hwajoong")); + cars.add(new Car("changhwan")); + + racingGame.setCars("hyukjin,hwajoong,changhwan"); + + assertThat(racingGame.toString()).isEqualTo(cars.toString()); + } + + @Test + public void moveSelectedCarTest() { + Car car = new Car("hyukjin"); + racingGame.moveSelectedCar(car, 5); + + assertThat(car.getDistance()).isEqualTo(1); + } + + @Test + public void isMoveConditionTest(){ + assertThat(racingGame.isMoveCondition(5)).isTrue(); + } + +} diff --git a/src/test/java/racing/dto/RacingGameResultTest.java b/src/test/java/racing/dto/RacingGameResultTest.java new file mode 100644 index 0000000..5c2cf20 --- /dev/null +++ b/src/test/java/racing/dto/RacingGameResultTest.java @@ -0,0 +1,28 @@ +package racing.dto; + +import org.junit.Before; +import org.junit.Test; + +import java.util.ArrayList; +import java.util.List; + +import static org.assertj.core.api.Assertions.assertThat; + +public class RacingGameResultTest { + + private RacingGameResult racingGameResult; + + @Before + public void setUp() { + List cars = new ArrayList<>(); + cars.add(new CarDTO("hyukjin2",4)); + cars.add(new CarDTO("hyukjin",5)); + + racingGameResult = new RacingGameResult(cars); + } + + @Test + public void getWinnersNameTest() { + assertThat(racingGameResult.getWinnersName().toString()).isEqualTo("[hyukjin]"); + } +}