diff --git a/README.md b/README.md index 8fe711203..413466d49 100644 --- a/README.md +++ b/README.md @@ -1,26 +1,16 @@ -## [NEXTSTEP 플레이그라운드의 미션 진행 과정](https://github.com/next-step/nextstep-docs/blob/master/playground/README.md) +1. 각 자동차에 이름을 부여할 수 있다. 자동차 이름은 5자를 초과할 수 없다. -> CarValidator.validCarName(carName); +3. 자동차 이름은 쉼표(,)를 기준으로 구분한다. +4. 전진하는 조건은 0에서 9 사이에서 random 값을 구한 후 random 값이 4이상일 경우이다. -> RandomNumberGenerator.create(); ---- -## 학습 효과를 높이기 위해 추천하는 미션 진행 방법 +7. 전진하는 자동차를 출력할 때 자동차 이름을 같이 출력한다. -> RacingGame 에서 그냥 Sys로 반환해야 한다. +7. 자동차 시합에 기본적인 세팅들을 진행함 -> RacingGame.createGameInfo(); +(경주할 자동차 이름을 입력하세요(이름은 쉼표(,)를 기준으로 구분). +pobi,crong,honux +시도할 회수는 몇회인가요? +5 ) ---- -1. 피드백 강의 전까지 미션 진행 -> 피드백 강의 전까지 혼자 힘으로 미션 진행. 미션을 진행하면서 하나의 작업이 끝날 때 마다 add, commit -> 예를 들어 다음 숫자 야구 게임의 경우 0, 1, 2단계까지 구현을 완료한 후 push +7. 시합할 자동차를 만든다 -> RacingCarGenerator.create(); (0) +7. 우승자를 알려준다. -> GoalLine.informWinner(); -![mission baseball](https://raw.githubusercontent.com/next-step/nextstep-docs/master/playground/images/mission_baseball.png) - ---- -2. 피드백 앞 단계까지 미션 구현을 완료한 후 피드백 강의를 학습한다. - ---- -3. Git 브랜치를 master 또는 main으로 변경한 후 피드백을 반영하기 위한 새로운 브랜치를 생성한 후 처음부터 다시 미션 구현을 도전한다. - -``` -git branch -a // 모든 로컬 브랜치 확인 -git checkout master // 기본 브랜치가 master인 경우 -git checkout main // 기본 브랜치가 main인 경우 - -git checkout -b 브랜치이름 -ex) git checkout -b apply-feedback -``` +7. 자동차는 시도마다 움직일 수 있다. -> RacingCar.move(); (0) +8. 자동차는 경주한다. -> RacingGame.race(); \ No newline at end of file diff --git a/build.gradle b/build.gradle index 8172fb73f..349c365f9 100644 --- a/build.gradle +++ b/build.gradle @@ -3,7 +3,7 @@ apply plugin: 'eclipse' group = 'camp.nextstep' version = '1.0.0' -sourceCompatibility = '1.8' +sourceCompatibility = "11" repositories { mavenCentral() @@ -17,3 +17,4 @@ dependencies { test { useJUnitPlatform() } + diff --git a/src/main/java/domain/GoalLine.java b/src/main/java/domain/GoalLine.java new file mode 100644 index 000000000..0052df110 --- /dev/null +++ b/src/main/java/domain/GoalLine.java @@ -0,0 +1,23 @@ +package domain; + +import java.util.ArrayList; +import java.util.List; + +public class GoalLine { + + public List informWinner(List racingCars) { + Position maxPosition = new Position(); + for (RacingCar racingCar : racingCars) { + maxPosition = racingCar.findBiggerPosition(maxPosition); + } + + List winners = new ArrayList<>(); + for (RacingCar racingCar : racingCars) { + if (racingCar.isMaxPosition(maxPosition)) { + winners.add(racingCar); + } + } + + return winners; + } +} diff --git a/src/main/java/domain/Position.java b/src/main/java/domain/Position.java new file mode 100644 index 000000000..1cb413ab5 --- /dev/null +++ b/src/main/java/domain/Position.java @@ -0,0 +1,44 @@ +package domain; + +import java.util.Objects; + +public class Position { + + private final int position; + + public Position() { + this(0); + } + + public Position(int position) { + if (position < 0) { + throw new IllegalArgumentException("position can't less than zero"); + } + this.position = position; + } + + public Position move() { + return new Position(position + 1); + } + + public Position compare(Position maxPosition) { + return position >= maxPosition.position ? this : maxPosition; + } + + @Override + public boolean equals(Object o) { + if (this == o) { + return true; + } + if (o == null || getClass() != o.getClass()) { + return false; + } + Position position1 = (Position) o; + return position == position1.position; + } + + @Override + public int hashCode() { + return Objects.hash(position); + } +} diff --git a/src/main/java/domain/RaceGameInfo.java b/src/main/java/domain/RaceGameInfo.java new file mode 100644 index 000000000..afb499ba0 --- /dev/null +++ b/src/main/java/domain/RaceGameInfo.java @@ -0,0 +1,20 @@ +package domain; + +public class RaceGameInfo { + + private final String racingCarNames; + private final int raceCount; + + public RaceGameInfo(String racingCarNames, int raceCount) { + this.racingCarNames = racingCarNames; + this.raceCount = raceCount; + } + + public String getRacingCarNames() { + return racingCarNames; + } + + public int getRaceCount() { + return raceCount; + } +} diff --git a/src/main/java/domain/RaceGameInformer.java b/src/main/java/domain/RaceGameInformer.java new file mode 100644 index 000000000..ed084ab46 --- /dev/null +++ b/src/main/java/domain/RaceGameInformer.java @@ -0,0 +1,17 @@ +package domain; + +import java.io.BufferedReader; +import java.io.IOException; +import java.io.InputStreamReader; + +public class RaceGameInformer { + + public RaceGameInfo InformRaceGameInfo() throws IOException { + BufferedReader br = new BufferedReader(new InputStreamReader(System.in)); + String racingCarNames = br.readLine(); + int raceCount = Integer.parseInt(br.readLine()); + return new RaceGameInfo(racingCarNames, raceCount); + + } + +} diff --git a/src/main/java/domain/RacingCar.java b/src/main/java/domain/RacingCar.java new file mode 100644 index 000000000..59328718e --- /dev/null +++ b/src/main/java/domain/RacingCar.java @@ -0,0 +1,55 @@ +package domain; + +import java.util.Objects; + +public class RacingCar { + + private final String carName; + private final Position position; + + public RacingCar(String carName) { + this(carName, new Position()); + } + public RacingCar(String carName, Position position) { + this.carName = carName; + this.position = position; + } + + public Position move(int randomNumber) { + return randomNumber >= 4 ? position.move() : position; + } + + public String getCarName() { + return carName; + } + + public Position getPosition() { + return position; + } + + public boolean isMaxPosition(Position maxPosition) { + return position.equals(maxPosition); + } + + public Position findBiggerPosition(Position maxPosition) { + return position.compare(maxPosition); + } + + @Override + public boolean equals(Object o) { + if (this == o) { + return true; + } + if (o == null || getClass() != o.getClass()) { + return false; + } + RacingCar racingCar = (RacingCar) o; + return Objects.equals(carName, racingCar.carName) && Objects.equals( + getPosition(), racingCar.getPosition()); + } + + @Override + public int hashCode() { + return Objects.hash(carName, getPosition()); + } +} diff --git a/src/main/java/domain/RacingCarGenerator.java b/src/main/java/domain/RacingCarGenerator.java new file mode 100644 index 000000000..e0f900fcb --- /dev/null +++ b/src/main/java/domain/RacingCarGenerator.java @@ -0,0 +1,20 @@ +package domain; + +import java.util.ArrayList; +import java.util.List; + +public class RacingCarGenerator { + + public List create(String racingCarNames) { + + String[] racingCarNameArray = racingCarNames.split(","); + + List racingCarList = new ArrayList<>(); + + for (String carName : racingCarNameArray) { + racingCarList.add(new RacingCar(carName)); + } + + return racingCarList; + } +} diff --git a/src/main/java/domain/RacingGame.java b/src/main/java/domain/RacingGame.java new file mode 100644 index 000000000..c05dc1451 --- /dev/null +++ b/src/main/java/domain/RacingGame.java @@ -0,0 +1,45 @@ +package domain; + +import java.io.IOException; +import java.util.List; + +public class RacingGame { + + private final RaceGameInformer raceGameInformer; + private final RacingCarGenerator racingCarGenerator; + private final RandomNumberGenerator randomNumberGenerator; + private final GoalLine goalLine; + private final WinnerPrinter winnerPrinter; + + public RacingGame(RaceGameInformer raceGameInformer, RacingCarGenerator racingCarGenerator, + RandomNumberGenerator randomNumberGenerator, GoalLine goalLine, + WinnerPrinter winnerPrinter) { + this.raceGameInformer = raceGameInformer; + this.racingCarGenerator = racingCarGenerator; + this.randomNumberGenerator = randomNumberGenerator; + this.goalLine = goalLine; + this.winnerPrinter = winnerPrinter; + } + + public void startGame() throws IOException { + + RaceGameInfo raceGameInfo = raceGameInformer.InformRaceGameInfo(); + + List racingCars = racingCarGenerator.create(raceGameInfo.getRacingCarNames()); + + for (int i = 0; i < raceGameInfo.getRaceCount(); i++) { + race(racingCars); + } + + List winner = goalLine.informWinner(racingCars); + + winnerPrinter.print(winner); + } + + private void race(List racingCars) { + for (RacingCar racingCar : racingCars) { + int randomNumber = randomNumberGenerator.create(); + racingCar.move(randomNumber); + } + } +} \ No newline at end of file diff --git a/src/main/java/domain/RandomNumberGenerator.java b/src/main/java/domain/RandomNumberGenerator.java new file mode 100644 index 000000000..02baf3498 --- /dev/null +++ b/src/main/java/domain/RandomNumberGenerator.java @@ -0,0 +1,8 @@ +package domain; + +public class RandomNumberGenerator { + + public int create() { + return (int) (Math.random() * 10); + } +} diff --git a/src/main/java/domain/WinnerPrinter.java b/src/main/java/domain/WinnerPrinter.java new file mode 100644 index 000000000..7f1644563 --- /dev/null +++ b/src/main/java/domain/WinnerPrinter.java @@ -0,0 +1,23 @@ +package domain; + +import java.util.List; +import java.util.stream.Collectors; + +public class WinnerPrinter { + + public void print(List winners) { + + List winnerName = winners.stream().map(RacingCar::getCarName) + .collect(Collectors.toList()); + + StringBuilder winner = new StringBuilder(); + + for (String racingCarName : winnerName) { + winner.append(racingCarName).append(", "); + } + + winner.delete(winner.length() - 2, winner.length()); + + System.out.println(winner); + } +} diff --git a/src/test/java/domain/GoalLineTest.java b/src/test/java/domain/GoalLineTest.java new file mode 100644 index 000000000..4ab3ad7e9 --- /dev/null +++ b/src/test/java/domain/GoalLineTest.java @@ -0,0 +1,33 @@ +package domain; + +import static org.assertj.core.api.Assertions.assertThat; + +import java.util.List; +import org.junit.jupiter.api.DisplayName; +import org.junit.jupiter.api.Test; + +public class GoalLineTest { + + @Test + @DisplayName("우승한 레이싱카들을 알려줍니다.") + void informWinner() { + // given + List racingCars = List.of( + new RacingCar("pobi", new Position(3)), + new RacingCar("crong", new Position(3)), + new RacingCar("nobi, 2") + ); + GoalLine goalLine = new GoalLine(); + + // when + List racingCarList = goalLine.informWinner(racingCars); + + // then + assertThat(racingCarList) + .contains( + new RacingCar("pobi", new Position(3)), + new RacingCar("crong", new Position(3)) + ); + } + +} diff --git a/src/test/java/domain/RacingCarGeneratorTest.java b/src/test/java/domain/RacingCarGeneratorTest.java new file mode 100644 index 000000000..12a8fe060 --- /dev/null +++ b/src/test/java/domain/RacingCarGeneratorTest.java @@ -0,0 +1,25 @@ +package domain; + +import static org.assertj.core.api.Assertions.assertThat; + +import java.util.List; +import org.junit.jupiter.api.DisplayName; +import org.junit.jupiter.api.Test; + +public class RacingCarGeneratorTest { + + @Test + @DisplayName("시합에 참여할 레이싱카들을 만듭니다.") + void createTest(){ + // given + String givenRacingCarNames = "pobi,crong"; + RacingCarGenerator racingCarGenerator = new RacingCarGenerator(); + // when + List racingCars = racingCarGenerator.create(givenRacingCarNames); + + // then + assertThat(racingCars) + .contains(new RacingCar("pobi"), new RacingCar("crong")); + } + +} diff --git a/src/test/java/domain/RacingCarTest.java b/src/test/java/domain/RacingCarTest.java new file mode 100644 index 000000000..b71e3574b --- /dev/null +++ b/src/test/java/domain/RacingCarTest.java @@ -0,0 +1,25 @@ +package domain; + +import static org.assertj.core.api.Assertions.assertThat; + +import org.assertj.core.api.Assertions; +import org.junit.jupiter.api.DisplayName; +import org.junit.jupiter.api.Test; + +public class RacingCarTest { + + @Test + @DisplayName("레이싱카는 주어진 값이 4 이상이면 움직입니다.") + void moveTest() { + //given + RacingCar racingCar = new RacingCar("pobi"); + + //when + int randomNumber = 4; + Position position = racingCar.move(randomNumber); + + // then + assertThat(position).isEqualTo(new Position(1)); + } + +} diff --git a/src/test/java/domain/RandomNumberGeneratorTest.java b/src/test/java/domain/RandomNumberGeneratorTest.java new file mode 100644 index 000000000..48b0c6c8a --- /dev/null +++ b/src/test/java/domain/RandomNumberGeneratorTest.java @@ -0,0 +1,25 @@ +package domain; + +import static org.assertj.core.api.Assertions.assertThat; + +import org.junit.jupiter.api.DisplayName; +import org.junit.jupiter.api.Test; + +public class RandomNumberGeneratorTest { + + @Test + @DisplayName("1 - 9 사이 수를 생성한다.") + void createTest(){ + // given + RandomNumberGenerator randomNumberGenerator = new RandomNumberGenerator(); + + // when + int randomNumber = randomNumberGenerator.create(); + + // then + assertThat(randomNumber).isGreaterThanOrEqualTo(1); + assertThat(randomNumber).isLessThanOrEqualTo(9); + + } + +}