Skip to content

Commit 00fca49

Browse files
authored
고생하셨습니다.
🎉 PR 머지 완료! 🎉
1 parent e983732 commit 00fca49

22 files changed

+690
-132
lines changed

Diff for: README.md

+46-15
Original file line numberDiff line numberDiff line change
@@ -8,37 +8,68 @@
88
모든 라운드가 끝난 뒤 가장 많이 이동한 자동차들이 우승하게 됩니다.
99

1010
## 🎮게임 규칙
11-
* 🚗 게임에 참가할 자동차 수와 라운드 수를 정하고 게임을 시작합니다.
11+
* 🚗 게임에 참가할 자동차 이름을 입력합니다(자동차 이름의 길이는 5이하여야 합니다)
1212

1313

14-
* 🎲 게임이 시작되면 모든 차는 매 라운드마다 랜덤으로 발생한 0부터 10까지의 숫자 중 3 이하가 나올 경우 정지해있고, 4이상의 숫자가 나올 경우 1만큼 전진합니다.
14+
* 🏁 라운드 수를 정하고 게임을 시작합니다.
15+
16+
17+
* 🎲 게임이 시작되면 모든 차는 매 라운드마다 랜덤으로 발생한 0부터 9까지의 숫자 중 3 이하가 나올 경우 정지해있고, 4이상의 숫자가 나올 경우 1만큼 전진합니다.
1518

1619

1720
* 🏆 모든 라운드가 끝나고 우승한 자동차를 확인하면 됩니다.
1821

1922
## 🔧프로젝트 설계
20-
프로젝트는 크게 자동차, 게임을 구현한 두개의 클래스로 작성되었습니다.
21-
### 🚗자동차 클래스
22-
* 자동차 클래스는 필드로 이름과 이동 거리를 가지고 있습니다.
23+
프로젝트는 MVC 모델을 적용하여 controller, domain((model), view
24+
패키지로 이루어져 있습니다. 메인 클래스를 실행하면 controller 객체의
25+
게임 실행 메서드가 실행되어 게임이 진행됩니다.
2326

2427

25-
* 생성자는 이름을 매개변수로 받아 초기화하고 이동거리를 0으로 초기화합니다.
28+
### ⚙️Domain
29+
* domain 패키지는 자동차, 자동차의 리스트, 레이싱, 랜덤 변수 생성 클래스로 이루어져
30+
있습니다.
2631

2732

28-
* 자동차의 이동 메서드는 매개변수로 받은 값이 4 이상일 경우 이동거리를 1 증가시킵니다.
33+
* 자동차 클래스는 이름과 이동한 거리를 저장하고 있으며 생성된 랜덤 변수에
34+
따라 한 칸 전진하는 메서드, 자신의 현재 위치가 주어진 값과 같은지 반환하는
35+
메서드로 구성되어 있습니다.
2936

30-
### 🎮Game 클래스
31-
* 참가하는 차들과 우승한 차를 저장하기 위해 두 개의 리스트를 가지고 있습니다.
3237

33-
34-
* 게임 실행 메서드는 차 갯수와 라운드 수를 매개변수로 받아 게임 초기화, 게임 진행, 우승자 선정을 수행합니다.
38+
* 자동차 리스트 클래스는 자동차들의 배열을 저장하고 있습니다. 또한 리스트에
39+
저장된 자동차들을 이동시키는 메서드, 리스트에 저장된 자동차 중 가장 멀리
40+
이동한 자동차의 이동 거리를 반환하는 메서드, 어떤 한 위치에 있는 모든 자동차
41+
들의 리스트를 반환하는 메서드로 이루어져 있습니다.
42+
43+
44+
* 레이싱 클래스는 참가한 자동차들의 리스트를 저장하고 있으며 참가한 자동차들을
45+
전부 이동시키는 메서드와 참가한 자동차들 중 우승자들의 리스트를 반환하는
46+
메서드를 가지고 있습니다.
47+
48+
49+
* 랜덤 변수 생성 클래스는 0부터 9사이의 숫자를 생성해서 반환하는 메서드를
50+
가지고 있습니다.
51+
52+
### 💻View
53+
- view 패키지는 입력을 담당하는 클래스와 출력을 담당하는 클래스를 담당하는
54+
클래스로 이루어져 있습니다.
55+
56+
57+
- 입력을 담당하는 클래스는 자동차들의 이름을 양식에 맞게 입력받아 이를 문자열의
58+
배열로 변환하여 반환하는 메서드와, 라운드 수를 입력받는 메서드로 이루어져 있습니다.
59+
60+
61+
- 출력을 담당하는 클래스는 사용자 입력 요청을 출력하는 메서드와 게임 현황을
62+
출력하는 메서드, 우승자 리스트를 출력하는 메서드를 가지고 있습니다.
3563

3664

37-
* 게임 초기화 메서드는 게임 실행 중 가장 먼저 호출되어 차 갯수를 매개변수로 받아 갯수만큼 자동차 객체를 생성하여 리스트에 저장합니다. 현 단계에서는 차 이름이 순차적으로 자동생성됩니다.( ex)Car_1, Car_2, ... )
65+
- 출력의 양식을 지키기 위한 포맷팅 메서드도 출력을 담당하는 클래스에
66+
포함되어 있습니다
3867

3968

40-
* 라운드 진행 메서드는 라운드 수만큼 실행되며 게임에 참여한 모든 차의 이동 메서드를 호출합니다.
41-
이때 각 자동차마다 랜덤 변수 생성기를 통해 0부터 10까지의 숫자 중 하나를 매개변수로 줍니다
69+
### 🎮Controller
4270

4371

44-
* 우승자 선정 메서드는 모든 라운드가 끝난 후 가장 먼 거리를 이동한 차들을 우승자 리스트에 저장합니다.
72+
* Controller 클래스는 domain과 view의 클래스들을 이용하여 게임을 진행합니다
73+
게임 실행 메서드가 실행되면 사용자에게 자동차 이름과 라운드 수를 입력받아
74+
레이싱을 수행합니다. 레이싱이 끝나면 우승자 리스트를 출력하고 메서드가
75+
종료됩니다.

Diff for: src/main/java/Car.java

-30
This file was deleted.

Diff for: src/main/java/Game.java

-55
This file was deleted.

Diff for: src/main/java/RacingApplication.java

+9
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,9 @@
1+
import controller.RacingController;
2+
3+
public class RacingApplication {
4+
5+
public static void main(String[] args) {
6+
new RacingController().run();
7+
}
8+
9+
}

Diff for: src/main/java/controller/RacingController.java

+50
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,50 @@
1+
package controller;
2+
3+
import domain.Car;
4+
import domain.Cars;
5+
import domain.Racing;
6+
import domain.NumberGenerator;
7+
import domain.RandomNumberGenerator;
8+
import java.util.ArrayList;
9+
import java.util.List;
10+
import view.InputView;
11+
import view.OutputView;
12+
13+
public class RacingController {
14+
15+
private static final NumberGenerator randomGenerator = new RandomNumberGenerator();
16+
17+
public void run() {
18+
19+
OutputView.printInputCarNames();
20+
List<String> carNames = InputView.getCarNames();
21+
Cars cars = Cars.from(createCars(carNames));
22+
23+
OutputView.printInputRoundNumber();
24+
int roundNumber = InputView.getRoundNumber();
25+
26+
Racing racing = new Racing(cars);
27+
28+
OutputView.printResult();
29+
playRace(racing, cars, roundNumber);
30+
31+
Cars winnerList = racing.findWinners();
32+
OutputView.printWinners(winnerList.getCars());
33+
}
34+
35+
public List<Car> createCars(List<String> names) {
36+
List<Car> cars = new ArrayList<>();
37+
for (String name : names) {
38+
cars.add(new Car(name, randomGenerator));
39+
}
40+
return cars;
41+
}
42+
43+
public void playRace(Racing racing, Cars cars, int roundNumber) {
44+
for (int i = 0; i < roundNumber; i++) {
45+
racing.playRound();
46+
OutputView.printProcess(cars.getCars());
47+
}
48+
}
49+
50+
}

Diff for: src/main/java/domain/Car.java

+35
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,35 @@
1+
package domain;
2+
3+
public class Car {
4+
5+
private static final int CRITICAL_NUMBER_TO_MOVE = 4;
6+
7+
private final Name name;
8+
private int distance;
9+
private final NumberGenerator numberGenerator;
10+
11+
public Car(String name, NumberGenerator numberGenerator) {
12+
this.name = Name.from(name);
13+
this.distance = 0;
14+
this.numberGenerator = numberGenerator;
15+
}
16+
17+
public void move() {
18+
if (numberGenerator.generateNumber() >= CRITICAL_NUMBER_TO_MOVE) {
19+
distance++;
20+
}
21+
}
22+
23+
public boolean hasSamePosition(int position) {
24+
return distance == position;
25+
}
26+
27+
public String getName() {
28+
return name.getName();
29+
}
30+
31+
public int getDistance() {
32+
return distance;
33+
}
34+
35+
}

Diff for: src/main/java/domain/Cars.java

+70
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,70 @@
1+
package domain;
2+
3+
import java.util.ArrayList;
4+
import java.util.HashSet;
5+
import java.util.List;
6+
import java.util.Set;
7+
import java.util.stream.Collectors;
8+
9+
public class Cars {
10+
11+
private static final int MAX_CAR_NUMBER = 10;
12+
13+
private final List<Car> cars;
14+
15+
private Cars(List<Car> cars) {
16+
this.cars = cars;
17+
}
18+
19+
public static Cars from(List<Car> cars) {
20+
checkCarNumber(cars);
21+
checkDuplicates(cars);
22+
return new Cars(new ArrayList<>(cars));
23+
}
24+
25+
public static void checkCarNumber(List<Car> cars) {
26+
if (cars.size() > MAX_CAR_NUMBER) {
27+
throw new IllegalArgumentException("[Error] 차의 개수는 10대를 초과할 수 없습니다.");
28+
}
29+
}
30+
31+
public static void checkDuplicates(List<Car> cars) {
32+
if (hasDuplicates(cars)) {
33+
throw new IllegalArgumentException("[Error] 차의 이름은 중복될 수 없습니다.");
34+
}
35+
}
36+
37+
private static boolean hasDuplicates(List<Car> cars) {
38+
Set<String> nameSet = new HashSet<>();
39+
return cars.stream()
40+
.map(Car::getName)
41+
.anyMatch(name -> !nameSet.add(name));
42+
}
43+
44+
public void move() {
45+
for (Car car : cars) {
46+
car.move();
47+
}
48+
}
49+
50+
public int getMaxDistance() {
51+
int maxDistance = 0;
52+
for (Car car : cars) {
53+
maxDistance = Math.max(maxDistance, car.getDistance());
54+
}
55+
return maxDistance;
56+
}
57+
58+
public Cars findCarsHasSamePosition(int position) {
59+
List<Car> carsHasSamePosition = cars.stream()
60+
.filter(car -> car.hasSamePosition(position))
61+
.collect(Collectors.toList());
62+
63+
return new Cars(carsHasSamePosition);
64+
}
65+
66+
public List<Car> getCars() {
67+
return new ArrayList<>(cars);
68+
}
69+
70+
}

Diff for: src/main/java/domain/Name.java

+35
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,35 @@
1+
package domain;
2+
3+
public class Name {
4+
5+
private static final int MAX_LENGTH = 5;
6+
7+
private final String name;
8+
9+
private Name(final String name) {
10+
this.name = name;
11+
}
12+
13+
public static Name from(final String name) {
14+
checkBlank(name);
15+
checkLength(name);
16+
return new Name(name);
17+
}
18+
19+
public static void checkLength(String name) {
20+
if (name.length() > MAX_LENGTH) {
21+
throw new IllegalArgumentException("[Error] 이름은 " + MAX_LENGTH + "자를 초과할 수 없습니다.");
22+
}
23+
}
24+
25+
public static void checkBlank(String name) {
26+
if (name.trim().isEmpty()) {
27+
throw new IllegalArgumentException("[Error] 이름은 공백으로 이루어질 수 없습니다.");
28+
}
29+
}
30+
31+
public String getName() {
32+
return name;
33+
}
34+
35+
}

Diff for: src/main/java/domain/NumberGenerator.java

+5
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,5 @@
1+
package domain;
2+
3+
public interface NumberGenerator {
4+
int generateNumber();
5+
}

0 commit comments

Comments
 (0)