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

[다리 건너기] 김연진 미션 제출 합니다. (2) #6

Open
wants to merge 44 commits into
base: main
Choose a base branch
from
Open
Show file tree
Hide file tree
Changes from all commits
Commits
Show all changes
44 commits
Select commit Hold shift + click to select a range
c993751
docs: 기능 구현 목 작성
homebdy Aug 21, 2023
b1aad3d
feat(outputView): 게임 시작 안내 출력 기능 구현
homebdy Aug 21, 2023
9d533a1
feat(InputView): 다리 길이 입력 기능 구현
homebdy Aug 21, 2023
c241aeb
feat(InputView): 이동할 칸 입력 기능 구현
homebdy Aug 21, 2023
fe332f0
feat(BridgeMaker): 다리 요소 랜덤 생성 기능 구현
homebdy Aug 21, 2023
c8b48d5
feat(BridgeMaker): 다리 요소 변환 기능 구현
homebdy Aug 21, 2023
bc63ab2
feat(BridgeGame): 게임 시작 시 다리 생성
homebdy Aug 21, 2023
0bb6040
feat(Bridge): 생성된 다리와 사용자의 입력 비교 기능 구현
homebdy Aug 21, 2023
84d4d33
feat(BridgeGame): 게임 진행 기능 구현
homebdy Aug 21, 2023
e5f18a2
feat(InputView): 재시작 입력 기능 구현
homebdy Aug 21, 2023
4bf127b
Refactor(BridgeController): 게임 진행 메서드 분리
homebdy Aug 21, 2023
aa7d1a9
feat(GameRecorder): 재시작 기능 구현
homebdy Aug 21, 2023
c9accf9
Refactor(GameStatus): 게임 상태 확인 메서드 분리
homebdy Aug 21, 2023
db7aeac
feat(RetryCommand): 재시작 문자 관리 enum 생성
homebdy Aug 21, 2023
722ba6c
refactor(GameStatus): 하드코딩 제거
homebdy Aug 21, 2023
9a58496
feat(BridgeMaps): 게임 진행 내용 저장 기능 구현
homebdy Aug 21, 2023
733f335
feat(BridgeMaps): 게임 재시작시 초기화
homebdy Aug 21, 2023
9106c4e
feat(BridgeElement): 다리 출력 요소 상수 관리 enum 구현
homebdy Aug 21, 2023
5339097
feat(OutputView): 게임 진행 시 다리 출력 기능 구현
homebdy Aug 21, 2023
4204fa0
feat(OutputView): 게임 종료 시 총 시도 횟수 출력 기능 구현
homebdy Aug 21, 2023
235a0e3
fix(BridgeMaker): 반환값 수정
homebdy Aug 21, 2023
a4a2aaa
feat(OutputView): 게임 성공 여부 출력 기능 구현
homebdy Aug 21, 2023
c6bc203
feat(InputValidator): 다리 이동 입력 시 예외 처리 기능 구현
homebdy Aug 21, 2023
e7d4610
feat(RetryCommand): 재시작 입력 시 예외 처리 기능 구현
homebdy Aug 21, 2023
6c1a5de
feat(InputValidator): 다리 길이 입력시 숫자 이외 입력 예외 처리
homebdy Aug 21, 2023
b6ad11a
feat(BridgeSize): 범위 이외의 숫자가 들어온 경우 예외 발생
homebdy Aug 21, 2023
d8b1a01
refactor(BridgeController): 메서드 분리
homebdy Aug 21, 2023
20b2400
feat(OutputView): 빈 줄 출력
homebdy Aug 21, 2023
641fb9d
feat(InputView): 오류 발생 시 발생 지점부터 재시작
homebdy Aug 21, 2023
9b8e181
refactor(BridgeSize): BridgeSize 오류 발생시 재시작
homebdy Aug 21, 2023
f66d397
test(BridgeDirection): 방향 변환 테스트
homebdy Aug 22, 2023
fb5bc02
test(RetryCommand): 재시도 enum 테스트
homebdy Aug 22, 2023
c27f170
test(InputValidator): 예외 발생 테스트
homebdy Aug 22, 2023
a8f346a
docs: 테스트 목록 추가
homebdy Aug 22, 2023
9a424d0
test(GameStatusMessage): 게임 진행 상황 관리 테스트
homebdy Aug 22, 2023
e2a7231
test(Bridge): 주어진 방향으로 다리를 건너갈 수 있는지 확인
homebdy Aug 22, 2023
05d0b30
test(BridgeMaker): 다리 생성 기능 테스트
homebdy Aug 22, 2023
c6a0396
test(BridgeSize): 범위 이외의 길이가 입력될 경우 예외 발생
homebdy Aug 22, 2023
a899ecb
test(BridgeMaps): 게임 진행 기록 테스트
homebdy Aug 22, 2023
ca4655f
test:재시작 테스트
homebdy Aug 22, 2023
52353ae
refactor: 다리 길이 입력 메서드 분리
homebdy Aug 22, 2023
6b0719e
refactor(Bridge): 불필요한 메서드 삭제
homebdy Aug 22, 2023
13d3012
refactor(GameReco거der): 하드코딩 제
homebdy Aug 22, 2023
a8543d4
refactor(TryCount): 재시작 횟수 카운트 역할 분리
homebdy Aug 22, 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
66 changes: 66 additions & 0 deletions docs/README.md
Original file line number Diff line number Diff line change
@@ -0,0 +1,66 @@
## 기능 구현 목록

**입력 & 출력**
- [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] 다리 길이를 입력할 경우 문자를 입력하면 예외가 발생하는가


**RetryCommand**
- [x] R, Q를 입력할 경우 올바른 상수를 가져오는가
- [x] 재시작 입력 시 R/Q 이외의 문자를 입력하면 예외가 발생하는가

**BridgeSize**
- [x] 다리 길이를 입력할 경우 3~20 이외의 숫자를 입력하면 예외가 발생하는가

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

**BridgeGame**
- [ ] 게임 진행 시 사용자가 입력한 내용과 다리의 내용이 일치하는지 확인
- [ ] 게임 재시작 시 재시작 카운트 증가
- [ ] 게임 재시작 시 사용자 위치, 다리 건넌 기록 초기화

**Bridge**
- [x] 해당 방향으로 다리를 건너갈 수 있는지 확인
7 changes: 5 additions & 2 deletions src/main/java/bridge/Application.java
Original file line number Diff line number Diff line change
@@ -1,8 +1,11 @@
package bridge;

import bridge.controller.BridgeController;

public class Application {

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

This file was deleted.

14 changes: 13 additions & 1 deletion src/main/java/bridge/BridgeMaker.java
Original file line number Diff line number Diff line change
@@ -1,6 +1,11 @@
package bridge;

import bridge.constant.BridgeDirection;

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

/**
* 다리의 길이를 입력 받아서 다리를 생성해주는 역할을 한다.
Expand All @@ -18,6 +23,13 @@ public BridgeMaker(BridgeNumberGenerator bridgeNumberGenerator) {
* @return 입력받은 길이에 해당하는 다리 모양. 위 칸이면 "U", 아래 칸이면 "D"로 표현해야 한다.
*/
public List<String> makeBridge(int size) {
return null;
List<Integer> bridge = new ArrayList<>();
IntStream.range(0, size)
.forEach(i -> bridge.add(bridgeNumberGenerator.generate()));
return bridge.stream()
.map(BridgeDirection::convertDirection)
.map(BridgeDirection::getDirection)
.collect(Collectors.toList()
);
}
}
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.

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

import java.util.Arrays;

public enum BridgeDirection {

DOWN(0, "D"),
UP(1, "U");

private final int generateValue;
private final String direction;


BridgeDirection(int generateValue, String direction) {
this.generateValue = generateValue;
this.direction = direction;
}

public static BridgeDirection convertDirection(int generateValue) {
return Arrays.stream(BridgeDirection.values())
.filter(value -> value.generateValue == generateValue)
.findAny()
.orElseThrow(() -> new IllegalArgumentException(ExceptionMessage.NOT_BRIDGE_ELEMENT.toString()));
}

public static boolean isNotDirectionCommand(String direction) {
return !(direction.equals(UP.direction) || direction.equals(DOWN.direction));
}

public String getDirection() {
return direction;
}
}
19 changes: 19 additions & 0 deletions src/main/java/bridge/constant/BridgeElement.java
Original file line number Diff line number Diff line change
@@ -0,0 +1,19 @@
package bridge.constant;

public enum BridgeElement {
BRIDGE_START("[ "),
BRIDGE_END(" ]"),
BRIDGE_DELIMITER(" | ");


private final String element;

BridgeElement(String element) {
this.element = element;
}

@Override
public String toString() {
return this.element;
}
}
23 changes: 23 additions & 0 deletions src/main/java/bridge/constant/ExceptionMessage.java
Original file line number Diff line number Diff line change
@@ -0,0 +1,23 @@
package bridge.constant;

public enum ExceptionMessage {

NOT_BRIDGE_ELEMENT("다리 건너기 게임을 시작합니다."),
MOVING_RESULT_NONE("해당 방향으로 움직일 수 없습니다."),
INCORRECT_MOVING("U 또는 D로만 이동할 수 있습니다."),
INCORRECT_RETRY("R 또는 Q만 입력할 수 있습니다."),
NOT_INTEGER("숫자만 입력할 수 있습니다."),
INCORRECT_RANGE("다리 길이는 3부터 20 사이의 숫자여야 합니다."),;

private static final String PREFIX = "[ERROR] ";
private final String message;

ExceptionMessage(String message) {
this.message = message;
}

@Override
public String toString() {
return PREFIX + message;
}
}
20 changes: 20 additions & 0 deletions src/main/java/bridge/constant/GameClearMessage.java
Original file line number Diff line number Diff line change
@@ -0,0 +1,20 @@
package bridge.constant;

public enum GameClearMessage {

GAME_CLEAR("성공"),
GAME_FAILED("실패");

private final String message;

GameClearMessage(String message) {
this.message = message;
}

public static String getGameClearMessage(boolean isClear) {
if(isClear) {
return GAME_CLEAR.message;
}
return GAME_FAILED.message;
}
}
53 changes: 53 additions & 0 deletions src/main/java/bridge/constant/GameStatus.java
Original file line number Diff line number Diff line change
@@ -0,0 +1,53 @@
package bridge.constant;

import bridge.domain.BridgeSize;

public enum GameStatus {

PROGRESS,
MOVING_FAILED,
GAME_SUCCESS,
RESTART,
GAME_QUIT;

public static GameStatus checkStatus(RetryCommand command) {
if (command.isQuit()){
return GameStatus.GAME_QUIT;
}
return GameStatus.RESTART;
}

public static GameStatus checkStatus(boolean canMoving, BridgeSize bridgeSize, int position) {
if (!canMoving) {
return GameStatus.MOVING_FAILED;
}
return checkGameStatus(bridgeSize, position);
}

private static GameStatus checkGameStatus(BridgeSize bridgeSize, int position) {
if (bridgeSize.isSame(position)) {
return GameStatus.GAME_SUCCESS;
}
return GameStatus.PROGRESS;
}

public static GameStatus init() {
return GameStatus.PROGRESS;
}

public boolean isProgress() {
return this == PROGRESS;
}

public boolean isNotEnd() {
return this != GAME_QUIT && this != GameStatus.GAME_SUCCESS;
}

public boolean isFailed() {
return this == GameStatus.MOVING_FAILED;
}

public boolean isClear() {
return this == GameStatus.GAME_SUCCESS;
}
}
28 changes: 28 additions & 0 deletions src/main/java/bridge/constant/MovingResult.java
Original file line number Diff line number Diff line change
@@ -0,0 +1,28 @@
package bridge.constant;

import java.util.Arrays;

public enum MovingResult {

MOVING_SUCCESS("O", true),
MOVING_FAILED("X", false);

private final String display;
private final boolean success;

MovingResult(String display, boolean success) {
this.display = display;
this.success = success;
}

public static MovingResult calculateDisplay(boolean isSuccess) {
return Arrays.stream(MovingResult.values())
.filter(movingResult -> movingResult.success == isSuccess)
.findAny()
.orElseThrow(() -> new IllegalArgumentException(ExceptionMessage.MOVING_RESULT_NONE.toString()));
}

public String getDisplay() {
return this.display;
}
}
23 changes: 23 additions & 0 deletions src/main/java/bridge/constant/OutputMessage.java
Original file line number Diff line number Diff line change
@@ -0,0 +1,23 @@
package bridge.constant;

public enum OutputMessage {

START_MESSAGE("다리 건너기 게임을 시작합니다."),
LENGTH_MESSAGE("다리의 길이를 입력해주세요."),
MOVE_LOCATION("이동할 칸을 선택해주세요. (위: U, 아래: D)"),
RETRY_MESSAGE("게임을 다시 시도할지 여부를 입력해주세요. (재시도: R, 종료: Q)"),
GAME_END_MESSAGE("최종 게임 결과"),
RETRY_NUMBERS("총 시도한 횟수: %d\n"),
GAME_STATUS("게임 성공 여부: %s\n");

private final String message;

OutputMessage(String message) {
this.message = message;
}

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