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

[다리 건너기] 김연진 미션 제출합니다. #4

Open
wants to merge 34 commits into
base: main
Choose a base branch
from
Open
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
0ca66e8
docs: 기능 구현 목록 작성
homebdy Aug 10, 2023
5841a6a
feat(OutputView): 게임 시작 안내 출력 기능 구현
homebdy Aug 10, 2023
e10aa33
feat(InputView): 다리 길이 입력 기능 구현
homebdy Aug 10, 2023
92bb8c2
feat(InputView): 이동할 칸 입력 기능 구현
homebdy Aug 10, 2023
84245bd
feat(BridgeMaker): 다리 요소 랜덤 생성 기능 구현
homebdy Aug 10, 2023
a982a41
feat(BridgeMaker): 다리 랜덤 생성 시 숫자➝문자 변환 기능 구현
homebdy Aug 10, 2023
1dbefb1
feat(BridgeGame): 사용자 입력과 다리에 저장된 값 비교 기능 구현
homebdy Aug 11, 2023
1c60f36
feat(AnswerTable): 시도 내용 저장 기능 구현
homebdy Aug 11, 2023
15a5181
feat(BridgeController): 게임 진행 기능 구현
homebdy Aug 11, 2023
3072eae
feat(InputView): 재시도 입력 기능 구현
homebdy Aug 11, 2023
b7a7022
docs: 기능 구현 목록 추가
homebdy Aug 11, 2023
e0ec0e5
feat(BridgeController): 게임 재시작 기능 구현
homebdy Aug 11, 2023
f041216
feat(BridgeGame): 게임 재시작 시 저장된 내용 초기화
homebdy Aug 11, 2023
07a7a24
feat(GameStatus): 게임 재시작 시 재시작 횟수 증가 기능 구현
homebdy Aug 11, 2023
aff2735
feat(OutputView): 게임 진행 시 다리 출력 기능 구현
homebdy Aug 12, 2023
49ee662
feat(OutputView): 최종 결과 출력 기능 구현
homebdy Aug 12, 2023
c6709a3
feat(OutputView): 내용 출력시 줄 바꿈 추가
homebdy Aug 12, 2023
9d3eece
feat(InputValidator): 다리 이동 입력 시 예외 처리 기능 구현
homebdy Aug 12, 2023
ad15ef0
feat(InputValidator): 재시작 입력 예외 처리 기능 구현
homebdy Aug 12, 2023
a96a505
feat(InputValidator): 다리 길이 입력 시 숫자 이외의 입력 예외 처리
homebdy Aug 12, 2023
f35197d
feat(InputValidator): 다리 길이 입력 시 숫자 범위 검사 기능 구현
homebdy Aug 12, 2023
bf6c9ad
refactor(BridgeController): 게임 진행 기능 메서드 분리
homebdy Aug 12, 2023
01d2fea
docs: 테스트 목록 작성
homebdy Aug 13, 2023
f1e69cd
test: 다리 길이 입력 시 다리 생성 테스트
homebdy Aug 13, 2023
3dfbc75
test: 0->D 변환 테스트
homebdy Aug 13, 2023
eefbfb1
test: 사용자 입력 예외 처리 테스트
homebdy Aug 13, 2023
2acce54
test: 사용자 입력과 다리 입력 비교 기능 테스트
homebdy Aug 13, 2023
2a98b52
test: 정답 비교 후 사용자 위치 확인 테스트
homebdy Aug 13, 2023
fc25b73
test: 게임 재시작 시 재시작 카운트 증가 테스트
homebdy Aug 13, 2023
4538c3f
test: 게임 재시작 시 이전 게임 진행 내용 초기화 테스트
homebdy Aug 13, 2023
933edb0
test: 재시작 테스트 추가
homebdy Aug 13, 2023
9b51dcc
Refactor(LocationConverter): 클래스 명 변경
homebdy Aug 13, 2023
fc56ae1
Refactor(AnswerTable): 값이 없을 경우 예외 발생
homebdy Aug 13, 2023
1bd61a7
Refactor(BridgeComparison): 다리와 사용자 입력 값 비교 기능 분리
homebdy Aug 13, 2023
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
58 changes: 58 additions & 0 deletions docs/README.md
Original file line number Diff line number Diff line change
@@ -0,0 +1,58 @@
## 다리 건너기 기능 구현 목록

**입력 & 출력**
- [x] 게임 시작 안내 출력
- [x] 다리 길이 입력 (3 ~ 20사이 숫자)
- [x] 이동할 칸 입력 (U / D)
- [x] 재시도 입력 (R / Q)

**다리 생성**
- 입력한 다리 길이만큼 다리 생성
- [x] 0(아래), 1(위)형식으로 다리 요소 랜덤 생성
- [x] 0➝D / 1➝U 변환

**게임 진행**
- [x] 생성된 다리와 사용자의 입력 비교
- [x] 이동 가능한 경우 계속 진행
- [x] 이동 불가능한 경우 재시작 / 종료
- [x] 재시작하는 경우 시도 횟수 증가
**게임 진행 내용 저장**
- [x] 사용자의 입력이 맞는지 저장한다
- 맞을 경우 O, 틀릴 경우 X 저장

**결과 출력**
- 다리 출력
- [x] `[`로 시작, `]`로 끝, 구분자는 `|`
- [x] 이동 가능한 경우 O / 불가능한 경우 X 출력
- [x] 게임 성공 여부
- [x] 총 시도 횟수

**예외 처리**
- 이동할 칸 입력
- [x] U/D 이외의 입력이 들어올 경우
- 재시도 입력
- [x] R/Q 이외의 입력이 들어올 경우
- 다리 길이 입력
- [x] 숫자가 아닌 입력이 들어온 경우
- [x] 범위 이외의 숫자가 들어온 경우

### 테스트 목록

**BridgeMaker**
- [x] 다리 길이 입력시 길이에 맞는 다리를 생성하는가

**InputValidator**
- [x] 움직임 입력 시 U/D 이외의 문자를 입력하면 예외가 발생하는가
- [x] 재시작 입력 시 R/Q 이외의 문자를 입력하면 예외가 발생하는가
- [x] 다리 길이를 입력할 경우 문자를 입력하면 예외가 발생하는가
- [x] 다리 길이를 입력할 경우 3~20 이외의 숫자를 입력하면 예외가 발생하는가

**LocationConverter**
- [x] 0 = D, 1 = U로 변환을 하는가

**BridgeGame**
- [x] 게임 진행 시 사용자가 입력한 내용과 다리의 내용이 일치하는지 확인
- [x] 정답 계산 이후 사용자 위치 움직였는지 확인
- [x] 게임 재시작 시 재시작 카운트 증가
- [x] 게임 재시작 시 사용자 위치, 다리 건넌 기록 초기화
7 changes: 6 additions & 1 deletion src/main/java/bridge/Application.java
Original file line number Diff line number Diff line change
@@ -1,8 +1,13 @@
package bridge;

import bridge.controller.BridgeController;
import bridge.view.InputView;
import bridge.view.OutputView;

public class Application {

public static void main(String[] args) {
// TODO: 프로그램 구현
BridgeController bridgeController = new BridgeController(new OutputView(), new InputView());
bridgeController.start();
}
}
23 changes: 0 additions & 23 deletions src/main/java/bridge/BridgeGame.java

This file was deleted.

9 changes: 8 additions & 1 deletion src/main/java/bridge/BridgeMaker.java
Original file line number Diff line number Diff line change
@@ -1,5 +1,8 @@
package bridge;

import bridge.model.BridgeConverter;

import java.util.ArrayList;
import java.util.List;

/**
Expand All @@ -18,6 +21,10 @@ public BridgeMaker(BridgeNumberGenerator bridgeNumberGenerator) {
* @return 입력받은 길이에 해당하는 다리 모양. 위 칸이면 "U", 아래 칸이면 "D"로 표현해야 한다.
*/
public List<String> makeBridge(int size) {
return null;
List<String> bridge = new ArrayList<>();
while (bridge.size() != size) {
bridge.add(BridgeConverter.convert(bridgeNumberGenerator.generate()));
}
return bridge;
}
}
28 changes: 0 additions & 28 deletions src/main/java/bridge/InputView.java

This file was deleted.

23 changes: 0 additions & 23 deletions src/main/java/bridge/OutputView.java

This file was deleted.

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

import bridge.BridgeMaker;
import bridge.BridgeRandomNumberGenerator;
import bridge.model.AnswerTable;
import bridge.model.Bridge;
import bridge.model.Constant;
import bridge.model.GameStatus;
import bridge.service.BridgeGame;
import bridge.view.InputView;
import bridge.view.OutputView;

public class BridgeController {

private final OutputView outputView;
private final InputView inputView;
private final AnswerTable answerTable = new AnswerTable();
private final GameStatus gameStatus = new GameStatus();

public BridgeController(OutputView outputView, InputView inputView) {
this.outputView = outputView;
this.inputView = inputView;
}

public void start() {
try {
Bridge bridge = makeBridge();
progressGame(bridge);
printResult();
} catch (IllegalArgumentException exception) {
outputView.printExceptionMessage(exception.getMessage());
}
}

private Bridge makeBridge() {
outputView.printGameStart();
BridgeMaker bridgeMaker = new BridgeMaker(new BridgeRandomNumberGenerator());
return new Bridge(bridgeMaker.makeBridge(inputView.readBridgeSize()));
}

private void progressGame(Bridge bridge) {
BridgeGame bridgeGame = new BridgeGame(bridge, gameStatus, answerTable);
while (gameStatus.getPosition() < bridge.size()) {
boolean isCorrect = bridgeGame.move(inputView.readMoving());
outputView.printMap(answerTable);
if(!isCorrect && !retry(bridgeGame)) {
gameStatus.setGameResultFailed();
break;
}
}
}

private boolean retry(BridgeGame bridgeGame) {
String userInput = inputView.readGameCommand();
if (userInput.equals(Constant.RETRY.toString())) {
bridgeGame.retry();
return true;
}
return false;
}

private void printResult() {
outputView.printResult(answerTable, gameStatus);
}
}
59 changes: 59 additions & 0 deletions src/main/java/bridge/model/AnswerTable.java
Original file line number Diff line number Diff line change
@@ -0,0 +1,59 @@
package bridge.model;

import bridge.view.ExceptionMessage;

import java.util.ArrayList;
import java.util.Arrays;
import java.util.List;

public class AnswerTable {

private final List<String> upper;
private final List<String> lower;

public AnswerTable() {
this.upper = new ArrayList<>();
this.lower = new ArrayList<>();
}

public void setAnswerTable(String userInput, boolean success) {
setUpperCase(userInput, success);
setLowerCase(userInput, success);
}

private void setUpperCase(String userInput, boolean success) {
if(userInput.equals(Constant.UPPER_CHAR.toString())) {
MovingResult correctMessage = calculateMovingResult(success);
upper.add(correctMessage.getAnswer());
lower.add(Constant.BLANK.toString());
}
}

private void setLowerCase(String userInput, boolean success) {
if(userInput.equals(Constant.LOWER_CHAR.toString())) {
MovingResult correctMessage = calculateMovingResult(success);
lower.add(correctMessage.getAnswer());
upper.add(Constant.BLANK.toString());
}
}

private MovingResult calculateMovingResult(boolean success) {
return Arrays.stream(MovingResult.values())
.filter(movingResult -> movingResult.getSuccess() == success)
.findAny()
.orElseThrow(() -> new IllegalArgumentException(ExceptionMessage.MOVING_RESULT_NONE.toString()));
}

public List<String> getUpper() {
return upper;
}

public List<String> getLower() {
return lower;
}

public void clear() {
upper.clear();
lower.clear();
}
}
20 changes: 20 additions & 0 deletions src/main/java/bridge/model/Bridge.java
Original file line number Diff line number Diff line change
@@ -0,0 +1,20 @@
package bridge.model;

import java.util.List;

public class Bridge {

private final List<String> bridge;

public Bridge(List<String> bridge) {
this.bridge = bridge;
}

public String getBridgeByPosition(int position) {
return bridge.get(position);
}

public int size() {
return bridge.size();
}
}
15 changes: 15 additions & 0 deletions src/main/java/bridge/model/BridgeComparison.java
Original file line number Diff line number Diff line change
@@ -0,0 +1,15 @@
package bridge.model;

public class BridgeComparison {

private final Bridge bridge;

public BridgeComparison(Bridge bridge) {
this.bridge = bridge;
}

public boolean checkMoving(String moving, int position) {
String correctMoving = bridge.getBridgeByPosition(position);
return correctMoving.equals(moving);
}
}
13 changes: 13 additions & 0 deletions src/main/java/bridge/model/BridgeConverter.java
Original file line number Diff line number Diff line change
@@ -0,0 +1,13 @@
package bridge.model;

public class BridgeConverter {

private static final int LOWER_CASE = 0;

public static String convert(int position) {
if (position == LOWER_CASE) {
return Constant.LOWER_CHAR.toString();
}
return Constant.UPPER_CHAR.toString();
}
}
21 changes: 21 additions & 0 deletions src/main/java/bridge/model/Constant.java
Original file line number Diff line number Diff line change
@@ -0,0 +1,21 @@
package bridge.model;

public enum Constant {

UPPER_CHAR("U"),
LOWER_CHAR("D"),
BLANK(" "),
RETRY("R"),
QUIT("Q");

private final String constant;

Constant(String constant) {
this.constant = constant;
}

@Override
public String toString() {
return this.constant;
}
}
Loading