우테코 7기/2주차

자동차 경주

gilbert9172 2024. 10. 21. 23:57

❐ Description


과제 기한 2024.10.22(화) 15:00 ~ 2024.10.28(월) 00:00
과제 진행 Branch https://github.com/Gilbert9172/java-racingcar-7
과제 제출 PR 링크 https://github.com/woowacourse-precourse/java-racingcar-7/pull/53
Git convention https://gist.github.com/stephenparish/9941e89d80e2bc58a153#file-commit-md

 

 

 

 

 

❐ Requirements


1. User

  • 경주할 자동차 이름을 입력할 수 있다.
    • 1개 이상
    • 구분은 쉼표(,)로 한다.
    • 이름은 5자 이하만 입력할 수 있다.
  • 이동 횟수를 입력할 수 있다.

 

2. System

  • 자동차에는 이름을 부여할 수 있다.
    • 이름의 길이는 5자 이하
    • 자동차는 두 가지 상태를 가진다.
    • 멈춤 / 전진
  • 무작위 값을 뽑을 수 있다.
    • 0 ~ 9 사이
    • 4이상인 경우 자동차는 전진할 수 있다.
    • 자동차 마다 매번 할당한다.
  • 실행 결과를 매번 출력해야 한다.
  • 경주가 끝나면 우승자를 알려줘야 한다.
    • 우승자는 1명 이상일 수 있다.
    • 여러명일 경우 쉼표(,)를 이용하여 구분한다.
  • 사용자가 잘못된 값을 입력할 경우 애플리케이션은 종료되어야 한다.
    • 이때 IllegalArgumentException이 발생한다.

 

 

 

 

 

❐ Exceptions


1. 자동차 이름 입력

  • CarNameNullValidator
    • 자동차 이름을 하나도 입력하지 않은 경우
    • 쉼표가 연속으로 되어 있는 경우
  • CarCountValidator
    • 자동차 이름을 1개 이하로 입력한 경우
  • CarNameLengthValidator
    • 자동차 이름이 5글자를 초과하는 경우

 

2. 시도할 횟 수 입력

  • LapCountNullValidator
    • 아무것도 입력하지 않은 경우
  • LapRegexValidator
    • 소수점있는 값을 입력하는 경우
    • 숫자 이외의 문자가 들어가는 경우
    • 문자열이 들어오는 경우
  • NumberFormatValidator
    • 0이하의 값을 입력하는 경우

 

 

 

 

 

❐ 혼자 정한 정책


  • 우승자가 없는 경우 : "우승자가 없습니다." 출력하기
  • 문자열 전처리
    • 모든 공백 제거
    • 가장 앞에 있는 0 제거 (Ex. 00100 ‣ 100)

 

 

 

 

 

❐ Domain Modeling


1. Car 

Field Type
name String
myProgress MyProgress

 

 

2. Cars 

Field Type
cars List<Car>

 

3. MovementCondition 

Field Type
distance Distance
predicate BiPredicate<Speed,Speed>

 

4. MyProgress 

Field Type
remainLap Lap
position Position

 

5. DashBoard 

Field Type
cars Cars
lapCharts LapCharts

 

6. LapChart

Field Type
summary String

 

7. LapCharts

Field Type
lapCharts List<LapChart>

 

8. Distance

Field Type
value long

 

9. Position

Field Type
value String

 

10. Lap

Field Type
value long

 

11. Race

Field Type
remainingCount Lap

 

12. Speed

Field Type
value long

 

 

 

 

 

❐ Main logic


  1. 주어진 Lap 수 만큼 while문 순회
  2. 각 자동차 마다 랜덤 값을 부여
    1. 랜덤 값이 4 이상인 경우 앞으로 한칸 이동
    2. 랜덤 값이 4 미만인 경우 제자리
  3. 랜덤 값을 사용해서 이동 방향(FOWARD/STOP) 결정
    1. 함수형 인터페이스 BiPredicate를 사용
    2. 이 로직은 MovementCondition에 속함

4. cars에서 car를 이동
5. Lap을 한 바 퀴 돌 때마다 DashBoard에 LapChart 기록

 

while (race 진행동안) {
    // 차들 이동;
    // 매 lap 결과를 DashBoard에 기록
    // 다름 lap으로 이동
}
// DashBorad 반환

 

 

 

 

 

❐ Domain & BusinessLogic


Github ReadMe에 작성. (링크)