|
1 |
| -## 구현 기능 목록 |
| 1 | +## 🏎️ 자동차 경주 게임 |
| 2 | + |
| 3 | +> 우아한테크코스 4기 2주차 프리코스 과제입니다 :) |
| 4 | +
|
| 5 | +여러대의 자동차가 함께 경주 하여 승자를 가리는 간단한 게임입니다. 각 자동차는 고유한 이름을 가지고 있으며, 자동차는 각 전진 시도마다 랜덤하게 전진 여부가 결정됩니다. 공동 우승자가 존재할 수 있으며, 경주 중 모든 자동차가 주행하지 않는다면 모두가 공동우승 처리 됩니다. |
| 6 | + |
| 7 | +자동차 이름과 총 시도 횟수는 사용자로부터 입력받습니다. 사용자는 각 입력은 아래의 조건에 맞게 입력해야합니다. |
| 8 | + |
| 9 | +### 🏁 입력값 조건 |
| 10 | + |
| 11 | +**자동차 이름** |
| 12 | + |
| 13 | +- 자동차 이름은 한줄에 2개 이상의 이름을 적으며, 그 구분은 `,` 문자로 한다. |
| 14 | + - 예) `dev,hudi,dong,hyun` |
| 15 | +- 자동차 이름은 5글자를 초과할 수 없다. |
| 16 | +- 자동차 이름은 비어있을 수 없다. (0글자일 수 없다.) |
| 17 | +- 자동차 이름은 공백(`" " `)을 포함할 수 없다. |
| 18 | +- 자동차 이름은 중복될 수 없다. |
| 19 | + |
| 20 | +**시도 횟수** |
| 21 | + |
| 22 | +- 시도 횟수는 1이상의 정수여야 한다. |
| 23 | + |
| 24 | +### 🚩 전진 조건 |
| 25 | + |
| 26 | +각 자동차는 전진 시도마다 0부터 9 사이의 임의의 정수를 생성하고, 생성된 정수가 4 이상일 경우 1칸 전진한다. |
| 27 | + |
| 28 | +## 🖥️ 실행 결과 |
| 29 | + |
| 30 | +``` |
| 31 | +경주할 자동차 이름을 입력하세요.(이름은 쉼표(,) 기준으로 구분) |
| 32 | +hudi,java,c++,woowa |
| 33 | +시도할 회수는 몇회인가요? |
| 34 | +10 |
| 35 | +
|
| 36 | +실행결과 |
| 37 | +hudi : |
| 38 | +java : |
| 39 | +c++ : - |
| 40 | +woowa : - |
| 41 | +
|
| 42 | +hudi : |
| 43 | +java : |
| 44 | +c++ : - |
| 45 | +woowa : - |
| 46 | +
|
| 47 | +hudi : - |
| 48 | +java : - |
| 49 | +c++ : -- |
| 50 | +woowa : - |
| 51 | +
|
| 52 | +hudi : -- |
| 53 | +java : -- |
| 54 | +c++ : --- |
| 55 | +woowa : -- |
| 56 | +
|
| 57 | +hudi : --- |
| 58 | +java : --- |
| 59 | +c++ : ---- |
| 60 | +woowa : --- |
| 61 | +
|
| 62 | +hudi : --- |
| 63 | +java : --- |
| 64 | +c++ : ----- |
| 65 | +woowa : ---- |
| 66 | +
|
| 67 | +hudi : ---- |
| 68 | +java : ---- |
| 69 | +c++ : ----- |
| 70 | +woowa : ---- |
| 71 | +
|
| 72 | +hudi : ---- |
| 73 | +java : ----- |
| 74 | +c++ : ------ |
| 75 | +woowa : ----- |
| 76 | +
|
| 77 | +hudi : ----- |
| 78 | +java : ----- |
| 79 | +c++ : ------ |
| 80 | +woowa : ----- |
| 81 | +
|
| 82 | +hudi : ------ |
| 83 | +java : ----- |
| 84 | +c++ : ------- |
| 85 | +woowa : ------ |
| 86 | +
|
| 87 | +최종 우승자 : c++ |
| 88 | +``` |
| 89 | + |
| 90 | + |
| 91 | + |
| 92 | +## ⚙️ 구현 기능 목록 |
| 93 | + |
| 94 | +### 경주 전 |
2 | 95 |
|
3 | 96 | - [x] 경주할 자동차 이름들을 입력하는 기능
|
4 | 97 | - [x] 입력 이름 중 5자를 초과하는 이름이 입력된 경우 예외처리
|
|
12 | 105 | - [x] 숫자가 아닌 문자를 입력받을 경우 예외처리 (공백 포함)
|
13 | 106 | - [x] 양의 정수가 아닌 숫자 (0과 음수) 를 입력 받을 경우 예외처리
|
14 | 107 | - [x] 예외가 발생한 경우 에러를 출력하고, 입력을 다시 받는 기능
|
| 108 | + |
| 109 | +### 경주 중 |
| 110 | + |
15 | 111 | - [x] 개별 자동차 1회 전진 기능
|
16 | 112 | - [x] 0 ~ 9 사이의 무작위 값을 구하고, 4 이상일 경우에만 전진한다.
|
17 | 113 | - [x] 개별 자동차의 진행도를 출력하는 기능
|
18 | 114 | - [x] 모든 자동차를 사용자가 입력한 횟수만큼 전진하는 기능
|
19 | 115 | - [x] 모든 자동차의 진행도를 출력하는 기능
|
| 116 | + |
| 117 | +### 경주 완료 |
| 118 | + |
20 | 119 | - [x] 경주가 마무리되면, 우승자를 출력하는 기능
|
21 | 120 | - [x] 단독 우승자는 단일 이름만 출력되어야 함
|
22 | 121 | - [x] 공동 우승자는 `,` 로 구분되어 함께 출력되어야 함
|
23 | 122 |
|
| 123 | + |
| 124 | + |
| 125 | +## 🏛️ 프로젝트 구조 |
| 126 | + |
| 127 | +> 큰 틀로 **MVC** 패턴을 사용하였으며, **VO** 객체의 **불변성**을 유지하기 위해 혹은 **생성자의 구현을 숨기기** 위해 일부 **정적 팩토리 메소드 패턴**을 사용하였습니다. 레이어간 데이터를 전달하기 위한 **DTO 클래스**를 정의하여 사용하였습니다. |
| 128 | +
|
| 129 | +- `controller` |
| 130 | + - `Game` : Domain 객체와 View 를 제어하여, 게임의 전반적인 흐름 제어를 담당합니다. |
| 131 | +- `domain` |
| 132 | + - `Car` : 자동차 |
| 133 | + - `CarDto` : 자동차에 대한 정보를 View 레이어로 전달하기 위해 사용되는 DTO (Data Transfer Object) |
| 134 | + - `Cars` : 경주하는 여러대의 Car 를 담고있는 일급 컬렉션 |
| 135 | + - `MoveCount` : 사용자로부터 입력받은 시도 횟수를 담고 있는 객체 |
| 136 | + - `Name` : 사용자로부터 입력받은 자동차의 이름을 담고 있는 VO |
| 137 | + - `Names` : 입력받은 모든 Name 을 담고있는 일급 컬렉션 |
| 138 | + - `Position` : 자동차의 위치 정보를 담고있는 VO |
| 139 | + - `Winners` : Cars 중 가장 멀리 전진한 Car 를 담고있는 일급 컬렉션 |
| 140 | + - `WinnersDto` : 승자 정보를 View 레이어로 저달하기 위해 사용되는 DTO |
| 141 | +- `view` |
| 142 | + - `InputView` : 사용자로부터 데이터를 입력받을 때 사용되는 클래스 |
| 143 | + - `OutputView` : 사용자에게 정보를 표시하기 위해 사용되는 클래스 |
| 144 | +- `racingcar` |
| 145 | + - `Application` : 프로그램의 Entry |
0 commit comments