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) #8

Open
wants to merge 37 commits into
base: main
Choose a base branch
from
Open
Show file tree
Hide file tree
Changes from all commits
Commits
Show all changes
37 commits
Select commit Hold shift + click to select a range
de27111
docs(README): 기능 목록 작성
ohksj77 Aug 20, 2023
7f15ca6
feat: ComponentFactory와 BridgeGameManager 추가
ohksj77 Aug 20, 2023
2fa5c20
feat: InputValidator와 InputManager 추가
ohksj77 Aug 20, 2023
b582e76
feat: 게임 시작 메시지 출력
ohksj77 Aug 20, 2023
d7d8368
docs(README): 구현 클래스 추가
ohksj77 Aug 20, 2023
29db821
feat: 다리 길이 입력 요청 메시지 출력 기능
ohksj77 Aug 20, 2023
68be748
feat: 열거형 추가
ohksj77 Aug 20, 2023
4c141c5
feat: 출력문 추가 및 출력 기능
ohksj77 Aug 20, 2023
9fea868
feat(ErrorMessage): 열거형 추가
ohksj77 Aug 20, 2023
6220b94
refactor: InputValidator 위치 수정
ohksj77 Aug 20, 2023
ee54fd4
feat: 다리 사이즈 입력 기능
ohksj77 Aug 20, 2023
653b7b1
feat(MoveCommand): 열거형 추가
ohksj77 Aug 30, 2023
c6419fc
feat: 움직일 방향 입력 기능
ohksj77 Aug 30, 2023
933ddb3
refactor: 기존 InputManager 이름 수정 및 입력 재시도 기능
ohksj77 Aug 30, 2023
f719668
feat(TryCount): 시도횟수 도메인 클래스 추가
ohksj77 Aug 31, 2023
0c1d693
feat(ResultStatus): 결과 상태 enum 추가
ohksj77 Aug 31, 2023
11fa306
feat(GameResult): 결과 도메인 클래스 추가
ohksj77 Aug 31, 2023
a2bfb1f
feat(ResultManager): 결과 관리 클래스 추가
ohksj77 Aug 31, 2023
fc538d9
feat(Bridge): 다리 관리 일급 컬렉션 추가
ohksj77 Aug 31, 2023
d9cf1c8
feat(BridgeMaker): 다리 생성 기능
ohksj77 Aug 31, 2023
8345a0a
feat(BridgeType): 랜덤 생성 숫자 U 혹은 D로 매핑 기능
ohksj77 Aug 31, 2023
9dc365f
feat(ComponentFactory): 팩토리 메서드
ohksj77 Aug 31, 2023
58d92fc
feat(ErrorMessage): 에러 메시지 추가
ohksj77 Aug 31, 2023
e45fd72
feat(BridgeStorage): 저장소 클래스 추가
ohksj77 Aug 31, 2023
fbbe984
feat: 다리 사이즈 열거형 추가 및 적용
ohksj77 Aug 31, 2023
b44aec2
refactor: 중복 열거형 제거 및 통합
ohksj77 Aug 31, 2023
6ee84d1
feat: 정답 결과 계산 로직
ohksj77 Aug 31, 2023
6aea15e
feat: 매 시도 결과 출력 기능
ohksj77 Aug 31, 2023
c25bc71
feat: 재시도 기능
ohksj77 Aug 31, 2023
56b9152
feat: 입력 에러 메시지 출력 기능
ohksj77 Aug 31, 2023
b5d9c8d
feat: 결과 출력 기능
ohksj77 Aug 31, 2023
689a59e
refactor: BridgeGame 패키지 이동
ohksj77 Aug 31, 2023
0867315
docs(README): 리드미 내용 추가
ohksj77 Aug 31, 2023
812d1f1
refactor: 에러 메시지 출력 공통 로직 메서드 추출
ohksj77 Aug 31, 2023
03cbfd1
refactor: final 매개변수에 추가
ohksj77 Sep 1, 2023
8832bdd
test: 테스트 추가
ohksj77 Sep 1, 2023
f08402f
test: 재시도 테스트 추가
ohksj77 Sep 2, 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
101 changes: 101 additions & 0 deletions docs/README.md
Original file line number Diff line number Diff line change
@@ -0,0 +1,101 @@
## 기능 목록
- [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] 게임 종료

## 구현 클래스 목록
- ComponentFactory
- bridgeGameManager()

- InputProvider
- bridgeSize()
- moveCommand()
- retryCommand()

- InputValidator
- validateBridgeSize()
- validateMoving()
- validateRetryCommand()

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

- OutputView
- printMap()
- printResult()
- printGameStart()
- printBridgeSizeRequest()
- printMovingRequest()
- printRetryRequest()

- BridgeGameManager
- playGame()

- Application
- main()

- BridgeGame
- move()
- retry()
- makeBridge()
- findGameResult()

- BridgeMaker
- makeBridge()

- BridgeRandomNumberGenerator
- generate()

- Bridge
- getCurrentElement()
- compareToInput()
- clearIndex()

- GameResult
- addResultStatus()
- toString()
- clearAndAddCount()
- findTryCount()

- TryCount
- nextCount()
- toString()

- BridgeStorage
- saveBridge()
- findBridge()
- saveGameResult()
- findGameResult()

## 구현 열거형 목록
- GameMessage
- RetryCommand
- ErrorMessage
- MoveCommand
- BridgeSize
- BridgeType
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().playGame();
}
}
23 changes: 0 additions & 23 deletions src/main/java/bridge/BridgeGame.java

This file was deleted.

19 changes: 15 additions & 4 deletions src/main/java/bridge/BridgeMaker.java
Original file line number Diff line number Diff line change
@@ -1,23 +1,34 @@
package bridge;

import bridge.constant.BridgeType;

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

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

private static final int START_INDEX = 0;
private final BridgeNumberGenerator bridgeNumberGenerator;

public BridgeMaker(BridgeNumberGenerator bridgeNumberGenerator) {
public BridgeMaker(final BridgeNumberGenerator bridgeNumberGenerator) {
this.bridgeNumberGenerator = bridgeNumberGenerator;
}

/**
* @param size 다리의 길이
* @return 입력받은 길이에 해당하는 다리 모양. 위 칸이면 "U", 아래 칸이면 "D"로 표현해야 한다.
*/
public List<String> makeBridge(int size) {
return null;
public List<String> makeBridge(final int size) {
return IntStream.range(START_INDEX, size)
.mapToObj(i -> getBridgeDirection())
.collect(Collectors.toList());
}

private String getBridgeDirection() {
final int randomNumber = bridgeNumberGenerator.generate();
return BridgeType.getDirectionByClassifier(randomNumber);
}
}
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.

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

public enum BridgeSize {
MIN_BRIDGE_SIZE(3),
MAX_BRIDGE_SIZE(20);
private final int size;

BridgeSize(int size) {
this.size = size;
}

public int size() {
return this.size;
}
}
30 changes: 30 additions & 0 deletions src/main/java/bridge/constant/BridgeType.java
Original file line number Diff line number Diff line change
@@ -0,0 +1,30 @@
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()));
}

public static boolean isNotMoveCommand(final String input) {
return !input.equals(U.toString()) && !input.equals(D.toString());
}

public boolean isUp() {
return this == U;
}
}
22 changes: 22 additions & 0 deletions src/main/java/bridge/constant/ErrorMessage.java
Original file line number Diff line number Diff line change
@@ -0,0 +1,22 @@
package bridge.constant;

public enum ErrorMessage {
NOT_NUMERIC_INPUT("숫자만 입력 가능합니다."),
INVALID_MOVE_COMMAND(String.format("이동 방향 입력값은 %s 혹은 %s 입니다.", BridgeType.D, BridgeType.U)),
INVALID_CLASSIFIER("다리의 숫자 값이 올바르지 않습니다."),
INVALID_BRIDGE_SIZE(String.format("다리의 길이는 %d 이상, %d 이하입니다.", BridgeSize.MIN_BRIDGE_SIZE.size(), BridgeSize.MAX_BRIDGE_SIZE.size())),
INVALID_RETRY_COMMAND(String.format("재시도 여부 입력값은 %s 혹은 %s 입니다.", RetryCommand.R, RetryCommand.Q)),
NO_ELEMENT_LEFT("리스트의 원소가 없습니다.");

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

ErrorMessage(final 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("다리의 길이를 입력해주세요."),
FINAL_RESULT("최종 게임 결과"),
SUCCESS("게임 성공 여부: 성공\n총 시도한 횟수: %s"),
MOVE_DIRECTION_REQUEST(String.format("이동할 칸을 선택해주세요. (위: %s, 아래: %s)", BridgeType.U, BridgeType.D)),
RETRY_REQUEST(String.format("게임을 다시 시도할지 여부를 입력해주세요. (재시도: %s, 종료: %s)", RetryCommand.R, RetryCommand.Q));

private final String message;

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

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

public enum ResultStatus {
O("O"),
X("X"),
CONTINUE("O"),
NONE(" ");

private final String symbol;

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

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

public boolean isContinue() {
return this == CONTINUE;
}

public boolean isSuccess() {
return this == O;
}

public boolean isCorrect() {
return isContinue() || isSuccess();
}
}
13 changes: 13 additions & 0 deletions src/main/java/bridge/constant/RetryCommand.java
Original file line number Diff line number Diff line change
@@ -0,0 +1,13 @@
package bridge.constant;

public enum RetryCommand {
R, Q;

public static boolean isNotRetryCommand(final String input) {
return !input.equals(R.toString()) && !input.equals(Q.toString());
}

public boolean isRetry() {
return this == R;
}
}
Loading