Skip to content
Open
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
36 changes: 13 additions & 23 deletions README.md
Original file line number Diff line number Diff line change
@@ -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();
3 changes: 2 additions & 1 deletion build.gradle
Original file line number Diff line number Diff line change
Expand Up @@ -3,7 +3,7 @@ apply plugin: 'eclipse'

group = 'camp.nextstep'
version = '1.0.0'
sourceCompatibility = '1.8'
sourceCompatibility = "11"

repositories {
mavenCentral()
Expand All @@ -17,3 +17,4 @@ dependencies {
test {
useJUnitPlatform()
}

23 changes: 23 additions & 0 deletions src/main/java/domain/GoalLine.java
Original file line number Diff line number Diff line change
@@ -0,0 +1,23 @@
package domain;

import java.util.ArrayList;
import java.util.List;

public class GoalLine {

public List<RacingCar> informWinner(List<RacingCar> racingCars) {
Position maxPosition = new Position();
for (RacingCar racingCar : racingCars) {
maxPosition = racingCar.findBiggerPosition(maxPosition);
}

List<RacingCar> winners = new ArrayList<>();
for (RacingCar racingCar : racingCars) {
if (racingCar.isMaxPosition(maxPosition)) {
winners.add(racingCar);
}
}

return winners;
}
}
44 changes: 44 additions & 0 deletions src/main/java/domain/Position.java
Original file line number Diff line number Diff line change
@@ -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);
}
}
20 changes: 20 additions & 0 deletions src/main/java/domain/RaceGameInfo.java
Original file line number Diff line number Diff line change
@@ -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;
}
}
17 changes: 17 additions & 0 deletions src/main/java/domain/RaceGameInformer.java
Original file line number Diff line number Diff line change
@@ -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);

}

}
55 changes: 55 additions & 0 deletions src/main/java/domain/RacingCar.java
Original file line number Diff line number Diff line change
@@ -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());
}
}
20 changes: 20 additions & 0 deletions src/main/java/domain/RacingCarGenerator.java
Original file line number Diff line number Diff line change
@@ -0,0 +1,20 @@
package domain;

import java.util.ArrayList;
import java.util.List;

public class RacingCarGenerator {

public List<RacingCar> create(String racingCarNames) {

String[] racingCarNameArray = racingCarNames.split(",");

List<RacingCar> racingCarList = new ArrayList<>();

for (String carName : racingCarNameArray) {
racingCarList.add(new RacingCar(carName));
}

return racingCarList;
}
}
45 changes: 45 additions & 0 deletions src/main/java/domain/RacingGame.java
Original file line number Diff line number Diff line change
@@ -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<RacingCar> racingCars = racingCarGenerator.create(raceGameInfo.getRacingCarNames());

for (int i = 0; i < raceGameInfo.getRaceCount(); i++) {
race(racingCars);
}

List<RacingCar> winner = goalLine.informWinner(racingCars);

winnerPrinter.print(winner);
}

private void race(List<RacingCar> racingCars) {
for (RacingCar racingCar : racingCars) {
int randomNumber = randomNumberGenerator.create();
racingCar.move(randomNumber);
}
}
}
8 changes: 8 additions & 0 deletions src/main/java/domain/RandomNumberGenerator.java
Original file line number Diff line number Diff line change
@@ -0,0 +1,8 @@
package domain;

public class RandomNumberGenerator {

public int create() {
return (int) (Math.random() * 10);
}
}
23 changes: 23 additions & 0 deletions src/main/java/domain/WinnerPrinter.java
Original file line number Diff line number Diff line change
@@ -0,0 +1,23 @@
package domain;

import java.util.List;
import java.util.stream.Collectors;

public class WinnerPrinter {

public void print(List<RacingCar> winners) {

List<String> 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);
}
}
33 changes: 33 additions & 0 deletions src/test/java/domain/GoalLineTest.java
Original file line number Diff line number Diff line change
@@ -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<RacingCar> 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<RacingCar> racingCarList = goalLine.informWinner(racingCars);

// then
assertThat(racingCarList)
.contains(
new RacingCar("pobi", new Position(3)),
new RacingCar("crong", new Position(3))
);
}

}
25 changes: 25 additions & 0 deletions src/test/java/domain/RacingCarGeneratorTest.java
Original file line number Diff line number Diff line change
@@ -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<RacingCar> racingCars = racingCarGenerator.create(givenRacingCarNames);

// then
assertThat(racingCars)
.contains(new RacingCar("pobi"), new RacingCar("crong"));
}

}
Loading