Skip to content
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

[java-bridge] gib.son(손수환) 미션 제출합니다. #2

Open
wants to merge 77 commits into
base: gib/java-bridge
Choose a base branch
from
Open
Show file tree
Hide file tree
Changes from all commits
Commits
Show all changes
77 commits
Select commit Hold shift + click to select a range
ad0aec8
Docs(README.md): 문서 작성
swandevson Nov 17, 2022
f5e29b6
Docs(README.md): 문서 작성
swandevson Nov 17, 2022
0127043
Add: Domain/View 분리
swandevson Nov 17, 2022
bf3a584
Add(InputConverter): 입력한 문자열을 정수로 변환
swandevson Nov 17, 2022
c07d527
Feat(InputView): 게임 시작 메세지 출력, 다리 길이 입력 후 반환
swandevson Nov 17, 2022
74efb0b
Add(BridgeBlcok): UP, DOWN 상수에 대한 enum 클래스 생성
swandevson Nov 17, 2022
2e6c52b
Feat(BridgeMaker): 입력받은 길이만큼의 다리 생성
swandevson Nov 17, 2022
f9baf6d
Feat(Bridge): 사이즈 검증 및 게임에 사용할 다리 생성
swandevson Nov 17, 2022
7eaac10
Refactor(InputValidator): Converter의 검증 부분 분리
swandevson Nov 17, 2022
c4e7d96
Feat(InputValidator): 위, 아래 선택 입력값 검증
swandevson Nov 17, 2022
3c0a592
Rename(Bridge): 게임에 사용하는 다리 변수명 변경
swandevson Nov 17, 2022
bf6cb22
Feat(BridgeGame): 필드 및 생성자 작성
swandevson Nov 17, 2022
ed93bc5
Add(Player): 다리 건너기 게임을 플레이하는 플레이어
swandevson Nov 17, 2022
b1944f9
Feat(BridgeGame): 잘못된 다리를 건널시 사망
swandevson Nov 17, 2022
454d5c4
Implement(Application): 사용자 입력 기능 구현
swandevson Nov 17, 2022
16f007f
Implement(OutputView): 입력 결과, 최종 결과 출력
swandevson Nov 17, 2022
8387d20
Fix(BridgeGame): 재시도 횟수 필드 추가, 게임 승리 조건 수정
swandevson Nov 17, 2022
9655c92
Refactor(Application): View 클래스 정적 변수 변경 및 게임 실행 코드
swandevson Nov 17, 2022
5e83a27
Docs(README.md): 기능 목록 업데이트
swandevson Nov 17, 2022
5b63691
Fix(OutputView): import 수정
swandevson Nov 17, 2022
4746de9
Feat(InputView, InputValidator): 종료/재시작 입력
swandevson Nov 17, 2022
2c9c65d
Refactor(Applcation): 함수 인자 리팩토링
swandevson Nov 17, 2022
7b3e03d
Fix(BridgeBlockTest): 생성 번호에 따른 반환 문자 테스트 코드 수정
swandevson Nov 17, 2022
150b2d9
Feat(Application, Player): 실패 시 재입력 기능 추가
swandevson Nov 17, 2022
c160815
Fix(BridgeGame): 재시작시 위치 초기화
swandevson Nov 17, 2022
f5f2145
Fix(Application): 게임 실행 조건 수정
swandevson Nov 17, 2022
506b11d
Docs(README.md): 체크리스트 갱신
swandevson Nov 17, 2022
55cd755
Test(ApplicationTest): 재입력 동작에 대한 테스트
swandevson Nov 17, 2022
5c68f07
Feat(BridgeGame): 최대 넘어간 갯수를 저장
swandevson Nov 17, 2022
0af4bfc
Refactor(OutputView): 한 층 출력 인자 변경, 메소드명 변경
swandevson Nov 17, 2022
4594962
Feat(OutputView): 최종 게임 결과문 출력
swandevson Nov 17, 2022
2095cac
Refactor(Applcation): 재입력 리팩토링
swandevson Nov 18, 2022
39dbf2e
Refactor: 문자열을 상수 클래스로 분리
swandevson Nov 18, 2022
5312290
Chore: Model, Controller, View로 분리
swandevson Nov 18, 2022
84e5608
Refactor: 한 클래스에서만 사용하는 상수 클래스 삭제 및 클래스에 재할당
swandevson Nov 18, 2022
35ac642
Chore: Constant, Domain, View로 분리
swandevson Nov 18, 2022
326f09c
Style(OutputView): 상수 클래스 값을 static으로 사용
swandevson Nov 18, 2022
e3de220
Style(Player): 선택 및 지나온 다리 갯수 필드명 변경
swandevson Nov 18, 2022
22c06ec
Style(OutputView): 메소드명 변경
swandevson Nov 18, 2022
ea3ae4b
Refactor(OutputView): 지나온 각 칸의 결과 기능 분리
swandevson Nov 18, 2022
e6f6714
Style(OutputView): 메소드명 변경
swandevson Nov 18, 2022
b319c1e
Fix(OutputView): 실패 시 잘못된 결과 출력
swandevson Nov 18, 2022
38ce414
Fix(Bridge): 최대 범위 수정
swandevson Nov 18, 2022
67f4596
Test(ApplicationTest): 실패 후 종료 시 출력문 테스트
swandevson Nov 18, 2022
4c9a675
Fix(OutputView): 실패 시 잘못된 결과 출력
swandevson Nov 18, 2022
b6034f8
Refactor(OutputView): 출력문 반환 및 출력 기능 캡슐화
swandevson Nov 18, 2022
b8c81dd
Feat(BridgeGame): 현재 건넌 다리 개수 getter
swandevson Nov 18, 2022
feb3fed
Docs(README.md): 기능 목록 체크리스트 최신화
swandevson Nov 18, 2022
577b08c
Style: 코드 포맷팅 변경 및 import 축약
swandevson Nov 18, 2022
0d00d5e
Remove: 사용하지 않는 필드 및 메소드 제거
swandevson Nov 18, 2022
8354bd7
Docs(README.md): 체크리스트 최신화
swandevson Nov 18, 2022
5ed41e2
Docs(README.md): 기능 목록, 클래스 설계 업데이트
swandevson Nov 18, 2022
712a322
Refactor: final 키워드 추가
swandevson Nov 18, 2022
f8cebe3
Style(Bridge): 에러 메세지 포맷팅 변경
swandevson Nov 18, 2022
8d0449b
Test(InputConverter): 예외 메세지 출력 테스트
swandevson Nov 18, 2022
813a458
Fix(InputValidator): 숫자 정규식 수정
swandevson Nov 18, 2022
03c6f08
Fix(InputView): 출력예제와 일치하도록 공백 추가
swandevson Nov 18, 2022
94fd5f9
Test(BridgeTest): 에러 메세지, 정상 입력 테스트
swandevson Nov 18, 2022
3c12cba
Test(InputValidator): 예외 및 올바른 입력 체크
swandevson Nov 18, 2022
61dbe30
Style(BridgeGame): 하드코딩 제거
swandevson Nov 18, 2022
61366a5
Refactor(BridgeGame): 최대 도달 거리 갱신 기능 분리
swandevson Nov 18, 2022
9d2e15f
Refactor(Application): 게임 종료 체크 기능 분리 및 게임 재시작 수정
swandevson Nov 21, 2022
c943fb0
Style: 컨벤션에 맞게 수정
swandevson Nov 21, 2022
0fe194b
Chore: Domain을 Model, Util로 분리
swandevson Nov 21, 2022
40bca1e
Refactor(OutputView): 플레이어 생존 여부가 필요한 메소드 인자 변경
swandevson Nov 21, 2022
fd8db6d
Docs(README.md): 클래스 설계 업데이트
swandevson Nov 21, 2022
c93897d
Refactor(BridgeGame): 멤버 접근자 private 키워드 추가
swandevson Nov 21, 2022
b6fb129
Style(OutputView): 플레이어 생존 여부 변수명 변경
swandevson Nov 22, 2022
1d477f2
Style(Test): 테스트 코드 컨벤션에 맞게 수정
swandevson Nov 22, 2022
825420b
Refactor(BridgeBlockTest): 하드코딩 제거
swandevson Nov 22, 2022
0b27ce1
Style(Model): 불필요한 this 키워드 제거
swandevson Nov 22, 2022
cc068ba
Refactor(BridgeGameTest): 하드코딩 제거
swandevson Nov 22, 2022
ba2a649
Style: 컨벤션에 맞게 수정
swandevson Nov 22, 2022
f6284c7
Fix(BridgeMaker): unmodifiable한 리스트로 생성
swandevson Nov 22, 2022
cb596ab
Fix(BridgeGame): Player에 final 키워드 추가
swandevson Nov 22, 2022
d308731
Style(OutputView, BridgeMaker): 가독성을 해치는 불필요한 final 키워드 제거
swandevson Nov 22, 2022
78ba05d
Style(Bridge): final, private 키워드 순서 변경
swandevson Nov 22, 2022
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
166 changes: 166 additions & 0 deletions docs/README.md
Original file line number Diff line number Diff line change
@@ -0,0 +1,166 @@
# 💻 프로그램 동작 방식

---

#### 1. 사용자로부터 `InputView`에서 값을 입력 받고 초기화 후, 게임을 실행한다.
#### 2. `InputView`에서 값을 입력 받는다.
#### 3. `Validator`를 통해 입력값을 검증한다.
#### 4. 예외 발생시 재입력받는다.
#### 5. 예외가 발생하지 않을 경우, `Application`에 값을 반환한다.
#### 6. `BridgeGame`에 해당 값을 넘겨주어 update한다.
#### 7. update된 `BridgeGame`을 `Application`에서 `OutputView`로 넘겨준다.
#### 8. 해당 값을 활용해 출력한다.
#### 9. 게임이 종료될 때 까지 2~8를 반복한다.


# 🧰 기능 목록

---

### 1. 게임 시작 문구를 출력한다. - `View`/`InputView`

### 2. 다리의 길이를 숫자를 입력받고 생성한다.
- [x] 입력받은 숫자(문자열)을 정수로 변환한다. - `Domain`/`InputConverter`
- [x] 숫자가 아닌 입력일 경우(문자, 빈 문자열) 예외를 던진다. - `Domain`/`InputValidator`
- [x] 잘못된 입력일 경우, 올바른 입력이 될 때 까지 입력받는다. - from `Application` call `View`/`InputView`
- [x] 입력받은 숫자가 3 이상 20 이하인지 확인하고 아니면 예외를 던진다. - `Domain`/`InputValidator`
- [x] 0과 1을 다리 길이만큼 무작위로 생성한다. - `BridgeMaker` from `BridgeRandomNumberGenerator`
- [x] 0인 경우 아랫 칸인 `D`, 1인 경우 윗 칸인 `U`인 다리 리스트를 만든다. - from `Domain`/`Bridge` call `BridgeMaker`
### 3.`U` 또는 `D`를 입력받아 이동할 칸을 선택한다. `View`/`InputView`
- [x] 정해진 문자가 아니거나 입력이 없으면 예외를 던진다. - `Domain`/`InputValidator`
- [x] 예외가 발생할 경우, 다시 입력받도록 한다. - from `Application` call `View`/`InputView`
- [x] 이동 후 생사여부를 update한다 - in `Domain`/`BridgeGame` update `Domain`/`Player`

### 4. 입력 결과를 출력한다.
- [X] 건너온 칸들은 전부 O로 출력하고 칸 일치여부와 생사여부에 따라 O, X를 출력을 결정한다. - from `Application` call `View`/`OutputView`

### 5. 생사여부를 판별 후, 다음 행동을 결정한다.
#### 5-1. 죽었을 때
- [x] 건너다 실패하면 재시작 `R`, 종료 `Q` 할 수 있다. `View`/`InputView`
- [x] 정해진 문자가 아니거나 입력이 없으면 예외를 던진다 `Domain`/`InputValidator`
- [x] 예외가 발생할 경우, 다시 입력받도록 한다. from `Application` call `View`/`InputView`
- [x] 재시작시 처음부터 다시 진행한다. - `Application`

#### 5-2. 살았을 때
- [x] 끝에 도달할 때 까지 계속 진행한다. - `Application`


### 6. 게임 종료시 결과를 출력한다. `OutputView`/`printResult`
- [x] 최고 기록을 출력한다.
- [x] 게임 성공 여부를 출력한다.
- [x] 총 시도 횟수를 출력한다.





# 🛠️ 클래스 설계

---

## BridgeMaker
```
- Bridge를 랜덤한 길이로 생성
```

## Constant

---

- ### InputValue
```
- 사용자 입력값으로 이루어진 상수 클래스
```

- ### OutputValue
```
- 출력값으로 이루어진 상수 클래스
```


## Util

---

- ### InputConverter
```
- 사용자가 입력한 값(문자열)을 정수로 변환해 return
- 변환 불가시 예외를 던짐
```

- ### InputValidator
```
- 입력값에 대한 검증
- 올바르지 않은 입력일 시 예외를 던짐
```


## Model

---

- ### Bridge
```
- 게임에 사용되는 다리 정보
```

- ### BridgeBlock
```
- 사용자 선택 정보를 열거형 상수로 지정한 enum 클래스
```

- ### Player
```
- 현재 위치
- 생사 여부
```

- ### BridgeGame
```
- 게임 상태 및 제어에 관련된 클래스
- 주어진 값에 대한 검증
- 개수를 입력받고 Bridge 모델 초기화
- 입력값에 따라 유저의 생사 여부 및 위치 결정
- 최고 기록을 저장
```


## View

---

- ### InputView
```
- 게임 시작 문구 출력
- 입력 문구 출력
- 입력받은 값을 검증 후 반환
```
### OutputView
```
- 결과 문구 출력
- update된 정보를 가공하여 출력
```



# ❗ 주의사항 체크 리스트

---

- [x] `Exception`이 아닌 `IllegalArgumentException`과 같이 명확하게 유형을 처리하였는가?
- [x] 입출력 요구 사항을 모두 지켰는가?
- [x] 게임 시작 문구
- [x] 길이 입력 문구
- [x] 칸 입력 문구
- [x] 칸 입력 후 다리 상태
- [x] 실패했을 시 재시도, 종료 여부
- [x] 게임 성공 여부 및 시도 횟수
- [x] 함수(또는 메소드)의 길이가 10라인 이내인가? (빈줄 포함)
- [x] 함수(또는 메소드)의 파라미터가 3개 이하인가?
- [x] 클래스 제약 사항들을 모두 지켰는가?
- [x] `OutuptView`의 메소드 이름을 변경하면 안된다. (printMap, printResult)
- [x] `BridgeMaker`의 메소드의 시그니처(인자, 이름)와 반환 타입을 변경하면 안된다.
- [x] `BridgeGame`의 메소드 이름을 변경하면 안된다. (move, retry)
- [x] `InputView` 클래스에서만 `readLine()`을 사용한다.
- [x] `BridgeRandomNumberGenerator`, `BridgeNumberGenerator`의 를 수정하면 안된다.
- [x] `BridgeRandomNumberGenerator`, `BridgeNumberGenerator`의 패키지를 수정하면 안된다.
67 changes: 66 additions & 1 deletion src/main/java/bridge/Application.java
Original file line number Diff line number Diff line change
@@ -1,8 +1,73 @@
package bridge;

import bridge.Model.BridgeGame;
import bridge.View.InputView;
import bridge.View.OutputView;



public class Application {
private static InputView inputView = new InputView();
private static OutputView outputView = new OutputView();


public static BridgeGame initiateBridgeGame() {
while (true) {
try {
int size = inputView.readBridgeSize();

return new BridgeGame(size);
} catch (IllegalArgumentException illegalArgumentException) {
System.out.println(illegalArgumentException.getMessage());
}
}
}

public static void inputMoving(BridgeGame bridgeGame) {
while (true) {
try {
String selection = inputView.readMoving();
bridgeGame.move(selection);

return;
} catch (IllegalArgumentException illegalArgumentException) {
System.out.println(illegalArgumentException.getMessage());
}
}
}

public static void inputCommand(BridgeGame bridgeGame) {
while (true) {
try {
String command = inputView.readGameCommand();
bridgeGame.retry(command);

return;
} catch (IllegalArgumentException illegalArgumentException) {
System.out.println(illegalArgumentException.getMessage());
}
}
}

public static void run(BridgeGame bridgeGame) {
while (!bridgeGame.isGameOver()) {
inputMoving(bridgeGame);
outputView.printMap(bridgeGame, bridgeGame.getPassedCount());
bridgeGame.updatePlayer();

if (bridgeGame.isPlayerDead()) {
inputCommand(bridgeGame);
}
}
}

public static void main(String[] args) {
// TODO: 프로그램 구현
inputView.printStartMessage();

BridgeGame bridgeGame = initiateBridgeGame();

run(bridgeGame);

outputView.printResult(bridgeGame);
}
}
23 changes: 0 additions & 23 deletions src/main/java/bridge/BridgeGame.java

This file was deleted.

33 changes: 25 additions & 8 deletions src/main/java/bridge/BridgeMaker.java
Original file line number Diff line number Diff line change
@@ -1,10 +1,14 @@
package bridge;

import bridge.Model.BridgeBlock;

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



/**
* 다리의 길이를 입력 받아서 다리를 생성해주는 역할을 한다.
*/
public class BridgeMaker {

private final BridgeNumberGenerator bridgeNumberGenerator;
Expand All @@ -13,11 +17,24 @@ public BridgeMaker(BridgeNumberGenerator bridgeNumberGenerator) {
this.bridgeNumberGenerator = bridgeNumberGenerator;
}

/**
* @param size 다리의 길이
* @return 입력받은 길이에 해당하는 다리 모양. 위 칸이면 "U", 아래 칸이면 "D"로 표현해야 한다.
*/

public List<String> makeBridge(int size) {
return null;
List<Integer> bridgeNumbers = generateBridgeNumbers(size);
List<String> bridge = bridgeNumbers.stream()
.map(bridgeNumber -> BridgeBlock.getBlockIdentifier((bridgeNumber)))
.collect(Collectors.toList());

return Collections.unmodifiableList(bridge);
}

private List<Integer> generateBridgeNumbers(int size) {
List<Integer> bridgeNumbers = new ArrayList<>(size);

for (int i = 0; i < size; i++) {
int blockNumber = bridgeNumberGenerator.generate();
bridgeNumbers.add(blockNumber);
}

return bridgeNumbers;
}
}
3 changes: 2 additions & 1 deletion src/main/java/bridge/BridgeNumberGenerator.java
Original file line number Diff line number Diff line change
@@ -1,7 +1,8 @@
package bridge;



@FunctionalInterface
public interface BridgeNumberGenerator {

int generate();
}
2 changes: 2 additions & 0 deletions src/main/java/bridge/BridgeRandomNumberGenerator.java
Original file line number Diff line number Diff line change
Expand Up @@ -2,6 +2,8 @@

import camp.nextstep.edu.missionutils.Randoms;



public class BridgeRandomNumberGenerator implements BridgeNumberGenerator {

private static final int RANDOM_LOWER_INCLUSIVE = 0;
Expand Down
10 changes: 10 additions & 0 deletions src/main/java/bridge/Constant/InputValue.java
Original file line number Diff line number Diff line change
@@ -0,0 +1,10 @@
package bridge.Constant;



public class InputValue {
public static final String SELECTION_UP = "U";
public static final String SELECTION_DOWN = "D";
public static final String COMMAND_RETRY = "R";
public static final String COMMAND_QUIT = "Q";
}
12 changes: 12 additions & 0 deletions src/main/java/bridge/Constant/OutputValue.java
Original file line number Diff line number Diff line change
@@ -0,0 +1,12 @@
package bridge.Constant;



public class OutputValue {
public static final String SEPARATOR = "|";
public static final String NOT_SELECTION = " ";
public static final String WRONG_SELECTION = " X ";
public static final String RIGHT_SELECTION = " O ";
public static final String SUCCESS = "성공";
public static final String FAIL = "실패";
}
28 changes: 0 additions & 28 deletions src/main/java/bridge/InputView.java

This file was deleted.

Loading