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

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

Open
wants to merge 35 commits into
base: main
Choose a base branch
from
Open
Show file tree
Hide file tree
Changes from all commits
Commits
Show all changes
35 commits
Select commit Hold shift + click to select a range
e30cf56
docs(README): 기능 목록 작성
ohksj77 Aug 13, 2023
635f27a
feat: 게임 관리 클래스와 팩토리 클래스 추가
ohksj77 Aug 13, 2023
5051033
feat(BridgeGameMessage): 게임 메시지 열거형 추가
ohksj77 Aug 13, 2023
473ee6b
feat: 다리 길이 입력
ohksj77 Aug 13, 2023
419acb9
feat(InputValidator): 입력값 검증
ohksj77 Aug 13, 2023
bf74380
feat: 다리 길이 검증
ohksj77 Aug 13, 2023
bc6ba2d
feat(BridgeType): 다리 타입 열거형 추가
ohksj77 Aug 13, 2023
0c94cf9
feat(ErrorMessage): 에러 메시지 열거형 추가
ohksj77 Aug 13, 2023
6fe804b
feat: 예외 메시지 적용
ohksj77 Aug 13, 2023
e38682a
feat: 다리 생성 기능
ohksj77 Aug 13, 2023
307de4a
fix: 입력값 숫자 검증 로직 수정
ohksj77 Aug 13, 2023
fb017ad
refactor: 열거형 상수 이름 변경
ohksj77 Aug 13, 2023
2796c7b
feat: 다리 생성 기능 적용
ohksj77 Aug 13, 2023
0438955
feat(Bridge): Bridge 클래스 추가
ohksj77 Aug 13, 2023
bdcf2a2
feat(MoveResult): 이동 결과 열거형 추가
ohksj77 Aug 13, 2023
5635d8b
docs(README): README에 열거형 추가
ohksj77 Aug 13, 2023
2c4c22b
feat: 이동할 칸 입력 요청 출력 기능
ohksj77 Aug 13, 2023
8e0336b
feat: 이동 방향 입력 및 입력값 검증 기능
ohksj77 Aug 13, 2023
2ca340f
feat(ResultStatus): 결과 상태 열거형 추가
ohksj77 Aug 13, 2023
da08a5c
feat(Result): 결과 도메인 추가
ohksj77 Aug 13, 2023
c858e4d
refactor: result 도메인 이름 수정
ohksj77 Aug 13, 2023
77d5823
refactor: 다리 크기 도메인 언어 통일
ohksj77 Aug 13, 2023
062aa12
feat(MoveResultMapper): mapper 클래스 추가
ohksj77 Aug 13, 2023
5741ff2
feat: 이동 가능 여부 판별 및 저장 기능
ohksj77 Aug 13, 2023
86e3674
feat: 플레이어 이동 기능 및 결과 map 출력
ohksj77 Aug 13, 2023
4bd7b8e
feat: 재시도 기능
ohksj77 Aug 13, 2023
7d7ab12
refactor: 상수 추가와 시도 횟수 도메인 추가 및 리팩토링
ohksj77 Aug 13, 2023
bd71b0f
refactor: 불필요한 싱글톤 및 메서드 제거
ohksj77 Aug 13, 2023
8d4fb2b
docs(README): 열거형 내용 추가
ohksj77 Aug 13, 2023
2271ade
refactor: 패키지 분리
ohksj77 Aug 14, 2023
07131d6
refactor: 로직 간소화와 메서드 분할 및 메서드 이름 수정
ohksj77 Aug 14, 2023
5a67fae
refactor(MoveResultMapper): 내부 상수 적용
ohksj77 Aug 14, 2023
30a7d80
refactor: 도메인 불변 객체로 변환
ohksj77 Aug 14, 2023
54d9c36
refactor: validation 위치 변경
ohksj77 Aug 14, 2023
838f8ac
refactor(TryCount): 상수 추가 및 팩토리 메서드 수정
ohksj77 Aug 14, 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
2 changes: 1 addition & 1 deletion README.md
Original file line number Diff line number Diff line change
Expand Up @@ -266,7 +266,7 @@ public class BridgeMaker {

### BridgeRandomNumberGenerator 클래스

- Random 값 추출은 제공된 `bridge.BridgeRandomNumberGenerator`의 `generate()`를 활용한다.
- Random 값 추출은 제공된 `bridge.utils.BridgeRandomNumberGenerator`의 `generate()`를 활용한다.
- `BridgeRandomNumberGenerator`, `BridgeNumberGenerator` 클래스의 코드는 변경할 수 없다.

#### 사용 예시
Expand Down
97 changes: 97 additions & 0 deletions docs/README.md
Original file line number Diff line number Diff line change
@@ -0,0 +1,97 @@
## 기능 목록
- [x] 게임 시작
- [x] 게임 시작 메시지 출력
- [x] 다리 길이 설정
- [x] 다리 길이 입력요청 메시지 출력
- [x] 다리 길이 입력
- [x] 입력값 숫자 여부 검증
- [x] 입력 숫자 3 이상 20 이하 숫자인지 검증
- [x] 다리 생성
- [x] 길이에 따른 랜덤 다리 생성
- [x] 플레이어 이동
- [x] 이동할 칸 입력
- [x] 입력값이 U 혹은 D 인지 검증
- [x] 이동 가능한 칸인 경우 O 표시
- [x] 이동 불가능한 칸인 경우 X 표시
- [x] 현황 출력
- [x] 게임 성공 여부 판단
- [x] 이동 불가능한 칸으로 이동한 경우 실패
- [x] 모두 이동 가능한 칸으로만 이동한 경우 성공
- [x] 성공 메시지 출력
- [x] 총 시도 횟수 출력
- [x] 실패시 게임 재시작 여부 판단
- [x] 게임 재시작 여부 입력
- [x] 입력값 R 혹은 Q 인지 검증
- [x] 게임 재시작
- [x] 게임 시도 횟수 증가
- [x] 게임 종료

## 구현 클래스 목록
- BridgeGame
- move()
- retry()
- getGameResultMap() result map 문자열 반환

- BridgeGameManager
- playBridgeGame() 게임 실행

- BridgeMaker
- makeBridge()

- BridgeNumberGenerator
- generate()

- BridgeRandomNumberGenerator
- generate()

- InputView
- readBridgeSize()
- readMoving()
- readGameCommand()

- InputValidator
- validateBridgeSizeInput() 다리 길이 입력값 검증

- OutputView
- printGameStart()
- printBridgeSizeRequest()
- printMap()
- printResult()
- printMovingRequest() 이동할 칸 입력 요청 출력

- ComponentFactory
- bridgeGameManager() BridgeGameManager 생성

- Bridge
- create() Bridge 객체 생성 팩토리 메서드

- GameResult
- addResultStatus() 결과 상태 추가
- getFirstBridgeElement() 다리의 첫번째 요소 조회
- getBridgeLeftSize() 다리 잔여 사이즈 조회

- MoveResultMapper
- mapToMoveResult() MoveResult로 매핑

- TryCount
- increment() 시도 횟수 증가
- toString() 시도 횟수 문자열로 반환

## 열거형 목록
- GameMessage
- 게임 메시지

- BridgeType
- 다리의 윗 칸과 아래칸

- ErrorMessage
- 에러 메시지

- MoveResult
- 이동 결과

- GameResultStatus
- 결과 상태

- RetryCommand
- 재시도 입력값
5 changes: 4 additions & 1 deletion src/main/java/bridge/Application.java
Original file line number Diff line number Diff line change
@@ -1,8 +1,11 @@
package bridge;

import bridge.factory.ComponentFactory;

public class Application {

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

This file was deleted.

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

This file was deleted.

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.

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

import java.util.Arrays;

public enum BridgeType {
U(1),
D(0);

private final Integer classifier;

BridgeType(final Integer classifier) {
this.classifier = classifier;
}

public static String getDirectionByClassifier(final int classifier) {
return Arrays.stream(BridgeType.values())
.filter(bridgeType -> bridgeType.classifier.equals(classifier))
.findAny()
.map(Enum::toString)
.orElseThrow(() -> new IllegalArgumentException(ErrorMessage.INVALID_CLASSIFIER.toString()));
}
}
24 changes: 24 additions & 0 deletions src/main/java/bridge/constant/ErrorMessage.java
Original file line number Diff line number Diff line change
@@ -0,0 +1,24 @@
package bridge.constant;

public enum ErrorMessage {
NOT_NUMERIC_INPUT("숫자만 입력 가능합니다."),
BLANK_INPUT("입력값이 비어있습니다."),
INVALID_CLASSIFIER("다리의 숫자 값이 올바르지 않습니다."),
INVALID_MOVE_DIRECTION("이동 방향 입력값은 %s 혹은 %s 입니다."),
NO_ELEMENT_LEFT("리스트의 원소가 없습니다."),
INVALID_RETRY_COMMAND("재시도 여부 입력값은 %s 혹은 %s 입니다."),
INVALID_BRIDGE_SIZE("다리의 길이는 %d 이상, %d 이하입니다."),
INVALID_COMMAND_LENGTH("커맨드의 길이는 %d 이여야 합니다.");

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

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

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

public enum GameMessage {
START_GAME("다리 건너기 게임을 시작합니다.\n"),
BRIDGE_SIZE_REQUEST("다리의 길이를 입력해주세요."),
MOVE_DIRECTION_REQUEST("이동할 칸을 선택해주세요. (위: %s, 아래: %s)"),
SUCCESS("게임 성공 여부: 성공\n총 시도한 횟수: %s"),
RETRY_REQUEST("게임을 다시 시도할지 여부를 입력해주세요. (재시도: %s, 종료: %s)"),
FINAL_RESULT("최종 게임 결과");

private final String message;

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

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

public enum GameResultStatus {
O("O"),
X("X"),
NONE(" ");

private final String symbol;

GameResultStatus(final String symbol) {
this.symbol = symbol;
}

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

public enum MoveResult {
CONTINUE, FAILED, SUCCESS;
}
5 changes: 5 additions & 0 deletions src/main/java/bridge/constant/RetryCommand.java
Original file line number Diff line number Diff line change
@@ -0,0 +1,5 @@
package bridge.constant;

public enum RetryCommand {
R, Q
}
34 changes: 34 additions & 0 deletions src/main/java/bridge/domain/Bridge.java
Original file line number Diff line number Diff line change
@@ -0,0 +1,34 @@
package bridge.domain;

import bridge.constant.BridgeType;
import bridge.constant.ErrorMessage;

import java.util.Collections;
import java.util.List;

public final class Bridge {
private final List<String> directions;

private Bridge(final List<String> directions) {
this.directions = Collections.unmodifiableList(directions);
}

public static Bridge create(final List<String> directions) {
return new Bridge(directions);
}

public BridgeType getNextElement(final int currentIndex) {
validateIndex(currentIndex);
return BridgeType.valueOf(directions.get(currentIndex));
}

private void validateIndex(final int currentIndex) {
if (directions.size() <= currentIndex) {
throw new IllegalArgumentException(ErrorMessage.NO_ELEMENT_LEFT.toString());
}
}

public int getLeftSize(final int currentIndex) {
return directions.size() - currentIndex;
}
}
Loading