Skip to content

[그리디] 염지환 자동차 경주 3, 4단계 제출합니다! #114

New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

Merged
merged 34 commits into from
Mar 24, 2025
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
Show all changes
34 commits
Select commit Hold shift + click to select a range
b260211
* feat : 1단계 구현
JihwanYeom Mar 12, 2025
d5a9797
* test : Car 객체 테스트 코드 작성
JihwanYeom Mar 12, 2025
92c56ec
* feat : 2단계 구현
JihwanYeom Mar 12, 2025
9e69781
* test : makeWinnerList() 테스트코드 작성
JihwanYeom Mar 12, 2025
d187dc8
* docs : README 작성
JihwanYeom Mar 12, 2025
15ed321
* docs : README 수정
JihwanYeom Mar 15, 2025
e38bd09
* fix : Car, Game 클래스 리뷰 1차 반영
JihwanYeom Mar 15, 2025
96b822e
* test : 테스트 코드 리뷰 1차 반영
JihwanYeom Mar 15, 2025
11094f8
* feat : 3단계 구현
JihwanYeom Mar 19, 2025
7b7c714
* test : 4단계 부분 구현
JihwanYeom Mar 19, 2025
a1b7358
Merge branch 'jihwanyeom' into jihwanyeom
JihwanYeom Mar 19, 2025
833a5a8
* test : Car 테스트 수정
JihwanYeom Mar 22, 2025
46cbdbf
* test : Cars 테스트 코드 작성
JihwanYeom Mar 22, 2025
1386774
* test : Game 테스트 코드 삭제 및 Racing 테스트 코드 작성
JihwanYeom Mar 22, 2025
e6e1089
* test : Controller 테스트 코드 작성
JihwanYeom Mar 22, 2025
40fd209
* test : View 테스트 코드 작성
JihwanYeom Mar 22, 2025
2943098
* refactor : Controller 인스턴스 변수 최소화
JihwanYeom Mar 22, 2025
e9de809
* refactor : 같은 거리의 자동차를 구하는 로직의 메서드 명 변경
JihwanYeom Mar 22, 2025
34995d0
* feat : 사용자 입력 안내 메세지 출력 메서드 추가
JihwanYeom Mar 22, 2025
759de06
* style : RacingApplicaion에 개행 추가
JihwanYeom Mar 22, 2025
bd2d256
* docs : README.md 업데이트
JihwanYeom Mar 22, 2025
df2090b
* chore : 생성자 중복제거
JihwanYeom Mar 22, 2025
30742b5
Merge remote-tracking branch 'origin/jihwanyeom' into jihwanyeom
JihwanYeom Mar 22, 2025
c916e39
docs : README.md 오타 변경
JihwanYeom Mar 22, 2025
2c48874
chore : 불필요해진 파일 삭제
JihwanYeom Mar 23, 2025
0c0ba23
style : 실행파일 불필요한 개행 제거
JihwanYeom Mar 23, 2025
cb2c86a
feat : 이름에 대한 예외처리 추가
JihwanYeom Mar 23, 2025
0050f0f
feat : 이름에 대한 예외처리를 입력단에 추가
JihwanYeom Mar 23, 2025
4995016
refactor : Cars 객체 생성전략 변경
JihwanYeom Mar 23, 2025
f4133eb
refactor : RandomNumberGenerator 클래스 수정
JihwanYeom Mar 23, 2025
eed3c57
refactor : OutputView 포맷 관련 메서드 수정
JihwanYeom Mar 23, 2025
1350e36
test : Cars 테스트에 Fixture 적용
JihwanYeom Mar 23, 2025
38976c5
style : 코드 서식 점검
JihwanYeom Mar 23, 2025
97bb64d
test : 입력 서식 검증 테스트 추가
JihwanYeom Mar 23, 2025
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
61 changes: 46 additions & 15 deletions README.md
Original file line number Diff line number Diff line change
Expand Up @@ -8,37 +8,68 @@
모든 라운드가 끝난 뒤 가장 많이 이동한 자동차들이 우승하게 됩니다.

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


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


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


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

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


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


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

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


* 게임 실행 메서드는 차 갯수와 라운드 수를 매개변수로 받아 게임 초기화, 게임 진행, 우승자 선정을 수행합니다.
* 자동차 리스트 클래스는 자동차들의 배열을 저장하고 있습니다. 또한 리스트에
저장된 자동차들을 이동시키는 메서드, 리스트에 저장된 자동차 중 가장 멀리
이동한 자동차의 이동 거리를 반환하는 메서드, 어떤 한 위치에 있는 모든 자동차
들의 리스트를 반환하는 메서드로 이루어져 있습니다.


* 레이싱 클래스는 참가한 자동차들의 리스트를 저장하고 있으며 참가한 자동차들을
전부 이동시키는 메서드와 참가한 자동차들 중 우승자들의 리스트를 반환하는
메서드를 가지고 있습니다.


* 랜덤 변수 생성 클래스는 0부터 9사이의 숫자를 생성해서 반환하는 메서드를
가지고 있습니다.

### 💻View
- view 패키지는 입력을 담당하는 클래스와 출력을 담당하는 클래스를 담당하는
클래스로 이루어져 있습니다.


- 입력을 담당하는 클래스는 자동차들의 이름을 양식에 맞게 입력받아 이를 문자열의
배열로 변환하여 반환하는 메서드와, 라운드 수를 입력받는 메서드로 이루어져 있습니다.


- 출력을 담당하는 클래스는 사용자 입력 요청을 출력하는 메서드와 게임 현황을
출력하는 메서드, 우승자 리스트를 출력하는 메서드를 가지고 있습니다.


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


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


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

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

추가된 요구사항에 맞게 기능 명세서도 업데이트 하셨네요!
문서화도 관리 대상입니다. 아주 좋은 습관이에요👍👍

30 changes: 0 additions & 30 deletions src/main/java/Car.java

This file was deleted.

55 changes: 0 additions & 55 deletions src/main/java/Game.java

This file was deleted.

9 changes: 9 additions & 0 deletions src/main/java/RacingApplication.java
Original file line number Diff line number Diff line change
@@ -0,0 +1,9 @@
import controller.RacingController;

public class RacingApplication {

public static void main(String[] args) {
new RacingController().run();
}

}
50 changes: 50 additions & 0 deletions src/main/java/controller/RacingController.java
Original file line number Diff line number Diff line change
@@ -0,0 +1,50 @@
package controller;

import domain.Car;
import domain.Cars;
import domain.Racing;
import domain.NumberGenerator;
import domain.RandomNumberGenerator;
import java.util.ArrayList;
import java.util.List;
import view.InputView;
import view.OutputView;

public class RacingController {

private static final NumberGenerator randomGenerator = new RandomNumberGenerator();

public void run() {

OutputView.printInputCarNames();
List<String> carNames = InputView.getCarNames();
Cars cars = Cars.from(createCars(carNames));

OutputView.printInputRoundNumber();
int roundNumber = InputView.getRoundNumber();

Racing racing = new Racing(cars);

OutputView.printResult();
playRace(racing, cars, roundNumber);

Cars winnerList = racing.findWinners();
OutputView.printWinners(winnerList.getCars());
}

public List<Car> createCars(List<String> names) {
List<Car> cars = new ArrayList<>();
for (String name : names) {
cars.add(new Car(name, randomGenerator));
}
return cars;
}

public void playRace(Racing racing, Cars cars, int roundNumber) {
for (int i = 0; i < roundNumber; i++) {
racing.playRound();
OutputView.printProcess(cars.getCars());
}
}

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

public class Car {

private static final int CRITICAL_NUMBER_TO_MOVE = 4;

private final Name name;
private int distance;
private final NumberGenerator numberGenerator;

public Car(String name, NumberGenerator numberGenerator) {
this.name = Name.from(name);
this.distance = 0;
this.numberGenerator = numberGenerator;
}

public void move() {
if (numberGenerator.generateNumber() >= CRITICAL_NUMBER_TO_MOVE) {
distance++;
}
}

public boolean hasSamePosition(int position) {
return distance == position;
}

public String getName() {
return name.getName();
}

public int getDistance() {
return distance;
}

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

import java.util.ArrayList;
import java.util.HashSet;
import java.util.List;
import java.util.Set;
import java.util.stream.Collectors;

public class Cars {

private static final int MAX_CAR_NUMBER = 10;

private final List<Car> cars;

private Cars(List<Car> cars) {
this.cars = cars;
}

public static Cars from(List<Car> cars) {
checkCarNumber(cars);
checkDuplicates(cars);
return new Cars(new ArrayList<>(cars));
}

public static void checkCarNumber(List<Car> cars) {
if (cars.size() > MAX_CAR_NUMBER) {
throw new IllegalArgumentException("[Error] 차의 개수는 10대를 초과할 수 없습니다.");
}
}

public static void checkDuplicates(List<Car> cars) {
if (hasDuplicates(cars)) {
throw new IllegalArgumentException("[Error] 차의 이름은 중복될 수 없습니다.");
}
}

private static boolean hasDuplicates(List<Car> cars) {
Set<String> nameSet = new HashSet<>();
return cars.stream()
.map(Car::getName)
.anyMatch(name -> !nameSet.add(name));
}

public void move() {
for (Car car : cars) {
car.move();
}
}

public int getMaxDistance() {
int maxDistance = 0;
for (Car car : cars) {
maxDistance = Math.max(maxDistance, car.getDistance());
}
return maxDistance;
}

public Cars findCarsHasSamePosition(int position) {
List<Car> carsHasSamePosition = cars.stream()
.filter(car -> car.hasSamePosition(position))
.collect(Collectors.toList());

return new Cars(carsHasSamePosition);
}

public List<Car> getCars() {
return new ArrayList<>(cars);
}

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

public class Name {

private static final int MAX_LENGTH = 5;

private final String name;

private Name(final String name) {
this.name = name;
}

public static Name from(final String name) {
checkBlank(name);
checkLength(name);
return new Name(name);
}

public static void checkLength(String name) {
if (name.length() > MAX_LENGTH) {
throw new IllegalArgumentException("[Error] 이름은 " + MAX_LENGTH + "자를 초과할 수 없습니다.");
}
}

public static void checkBlank(String name) {
if (name.trim().isEmpty()) {
throw new IllegalArgumentException("[Error] 이름은 공백으로 이루어질 수 없습니다.");
}
}

public String getName() {
return name;
}

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

public interface NumberGenerator {
int generateNumber();
}
Loading