From ad0aec8b14d89605d26f85b6fd0f33cda44b9657 Mon Sep 17 00:00:00 2001 From: swandevson Date: Thu, 17 Nov 2022 12:39:05 +0900 Subject: [PATCH 01/77] =?UTF-8?q?Docs(README.md):=20=EB=AC=B8=EC=84=9C=20?= =?UTF-8?q?=EC=9E=91=EC=84=B1?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit - 프로그램 동작 방식 - 기능 목록 (예외사항 포함) - 클래스 설계 - 주의사항 체크 리스트 --- docs/README.md | 130 +++++++++++++++++++++++++++++++++++++++++++++++++ 1 file changed, 130 insertions(+) diff --git a/docs/README.md b/docs/README.md index e69de29bb2d..b704ebc0339 100644 --- a/docs/README.md +++ b/docs/README.md @@ -0,0 +1,130 @@ +# 💻 프로그램 동작 방식 + +--- + +#### 1. 사용자로부터 `InputView`에서 값을 입력 받고 초기화 후, 게임을 실행한다. +#### 2. `InputView`에서 값을 입력 받고, 해당 값을 `Controller`로 넘겨준다. +#### 3. `Validator`를 통해 입력값을 검증한다. +#### 4. 예외 발생시 재입력받는다. +#### 5. 예외가 발생하지 않을 경우, `Model`을 update한다. +#### 6. update된 정보를 `OutputView`를 활용해 출력한다. +#### 7. 게임이 종료될 때 까지 2~5를 반복한다. + + +# 🧰 기능 목록 + +--- + +### 1. 게임 시작 문구를 출력한다. - `View`/`InputView` + +### 2. 다리의 길이를 숫자를 입력받고 생성한다. + - [ ] 입력받은 숫자(문자열)을 정수로 변환한다. `Controller`/`Converter` + - [ ] 숫자가 아닌 입력일 경우(문자, 빈 문자열) 예외를 던진다. + - [ ] 잘못된 입력일 경우, 올바른 입력이 될 때 까지 입력받는다. + - [ ] 입력받은 숫자가 3 이상 20 이하인지 확인하고 아니면 예외를 던진다. - `Controller`/`BridgeMaker` from `Validator`/`InputValidator` + - [ ] 위 칸과 아래 칸 중 건널수 있는 칸은 0과 1중 무작위 값을 이용해서 정한다. `Controller`/`BridgeMaker` from `Controller`/`BridgeRandomNumberGenerator` + - [ ] 0인 경우 위 칸인 `U`, 1인 경우 아래 칸인 `D`인 다리 리스트를 만든다. - `Controller`/`BridgeMaker` + - [ ] +### 3.`U` 또는 `D`를 입력받아 이동할 칸을 선택한다. + - [ ] 정해진 문자가 아니거나 입력이 없으면 예외를 던진다. `Validator`/`InputValidator` + - [ ] 예외가 발생할 경우, 다시 입력받도록 한다. `Controller`/`BridgeGame` + - [ ] 이동 후 생사여부를 update한다 `Controller`/`BridgeGame` -> `Model`/`UserBridge` + +### 4. 입력 결과를 출력한다. + - [ ] 건너온 칸들은 전부 O로 출력하고 생사여부에 따라 O, X를 출력을 결정한다. `View`/`OutputView` +### 5. 건너다 실패하면 재시작`R`, 종료`Q` 할 수 있다. + - [ ] 정해진 문자가 아니거나 입력이 없으면 예외를 던진다 `Validator`/`InputValidator` + - [ ] 잘못된 입력일 경우, 올바른 입력이 될 때 까지 입력받는다. + + + +# 🛠️ 클래스 설계 + +## BridgeMaker +``` + - Bridge를 랜덤한 길이로 생성 +``` + +## Model + +--- + +- ### Bridge +``` + - 게임에 사용되는 다리 정보 +``` + +- ### Selection +``` + - 선택에 대한 정보를 담은 enum 클래스 +``` + +- ### User +``` + - 현재 위치 + - 생사 여부 +``` + + +## View + +--- + +- ### InputView +``` + - 게임 시작 문구 출력 + - 입력 문구 출력 + - 입력받은 값을 Controller에 전달 +``` +### OutputView +``` + - 결과 문구 출력 + - update된 model의 정보를 출력 +``` + +## Controller + +--- + +- ### BridgeGame +``` + - 게임 실행 및 상태에 관련된 클래스 + - 입력 값에 대한 검증 + - 개수를 입력받고 Bridge 모델 초기화 + - 입력값에 따라 유저의 생사 여부 및 위치 결정 +``` + +- ### Converter +``` + - 사용자가 입력한 값(문자열)을 정수로 변환해 return +``` + + +- ### Validator +``` + - 입력값에 대한 검증 +``` + + +# ❗ 주의사항 체크 리스트 + +--- + +- [ ] `Exception`이 아닌 `IllegalArgumentException`과 같이 명확하게 유형을 처리하였는가? +- [ ] 입출력 요구 사항을 모두 지켰는가? + - [ ] 게임 시작 문구 + - [ ] 길이 입력 문구 + - [ ] 칸 입력 문구 + - [ ] 칸 입력 후 다리 상태 + - [ ] 실패했을 시 재시도, 종료 여부 + - [ ] 게임 성공 여부 및 시도 횟수 +- [ ] 함수(또는 메소드)의 길이가 10라인 미만인가? (빈줄 포함) +- [ ] 함수(또는 메소드)의 파라미터가 3개 이하인가? +- [ ] 클래스 제약 사항들을 모두 지켰는가? + - [ ] `OutuptView`의 메소드 이름을 변경하면 안된다. + - [ ] `BridgeMaker`의 메소드의 시그니처(인자, 이름)와 반환 타입을 변경하면 안된다. + - [ ] `BridgeGame`의 메소드 이름을 변경하면 안된다. + - [ ] `Bridge` + - [ ] `InputView` 클래스에서만 `readLine()`을 사용한다. + - [ ] `BridgeRandomNumberGenerator`, `BridgeNumberGenerator`의 코드를 수정하면 안된다. + - [ ] `BridgeRandomNumberGenerator`, `BridgeNumberGenerator`의 패키지를 수정하면 안된다. From f5e29b6b6355af9553288490bd0df414e0664f80 Mon Sep 17 00:00:00 2001 From: swandevson Date: Thu, 17 Nov 2022 12:39:05 +0900 Subject: [PATCH 02/77] =?UTF-8?q?Docs(README.md):=20=EB=AC=B8=EC=84=9C=20?= =?UTF-8?q?=EC=9E=91=EC=84=B1?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit - 프로그램 동작 방식 - 기능 목록 (예외사항 포함) - 클래스 설계 - 주의사항 체크 리스트 --- docs/README.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/docs/README.md b/docs/README.md index b704ebc0339..9d449691568 100644 --- a/docs/README.md +++ b/docs/README.md @@ -8,7 +8,7 @@ #### 4. 예외 발생시 재입력받는다. #### 5. 예외가 발생하지 않을 경우, `Model`을 update한다. #### 6. update된 정보를 `OutputView`를 활용해 출력한다. -#### 7. 게임이 종료될 때 까지 2~5를 반복한다. +#### 7. 게임이 종료될 때 까지 2~6를 반복한다. # 🧰 기능 목록 From 0127043714f27b4f5496767c586a31050e302fd2 Mon Sep 17 00:00:00 2001 From: swandevson Date: Thu, 17 Nov 2022 13:10:32 +0900 Subject: [PATCH 03/77] =?UTF-8?q?Add:=20Domain/View=20=EB=B6=84=EB=A6=AC?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- src/main/java/bridge/BridgeMaker.java | 2 ++ src/main/java/bridge/Domain/Bridge.java | 4 ++++ src/main/java/bridge/{ => Domain}/BridgeGame.java | 2 +- src/main/java/bridge/Domain/Player.java | 4 ++++ src/main/java/bridge/{ => View}/InputView.java | 2 +- src/main/java/bridge/{ => View}/OutputView.java | 2 +- 6 files changed, 13 insertions(+), 3 deletions(-) create mode 100644 src/main/java/bridge/Domain/Bridge.java rename src/main/java/bridge/{ => Domain}/BridgeGame.java (96%) create mode 100644 src/main/java/bridge/Domain/Player.java rename src/main/java/bridge/{ => View}/InputView.java (96%) rename src/main/java/bridge/{ => View}/OutputView.java (96%) diff --git a/src/main/java/bridge/BridgeMaker.java b/src/main/java/bridge/BridgeMaker.java index 27e9f2cfa7f..d61a5322162 100644 --- a/src/main/java/bridge/BridgeMaker.java +++ b/src/main/java/bridge/BridgeMaker.java @@ -1,5 +1,7 @@ package bridge; +import bridge.BridgeNumberGenerator; + import java.util.List; /** diff --git a/src/main/java/bridge/Domain/Bridge.java b/src/main/java/bridge/Domain/Bridge.java new file mode 100644 index 00000000000..d898dbe49cb --- /dev/null +++ b/src/main/java/bridge/Domain/Bridge.java @@ -0,0 +1,4 @@ +package bridge.Domain; + +public class Bridge { +} diff --git a/src/main/java/bridge/BridgeGame.java b/src/main/java/bridge/Domain/BridgeGame.java similarity index 96% rename from src/main/java/bridge/BridgeGame.java rename to src/main/java/bridge/Domain/BridgeGame.java index 834c1c8362b..4615ce54613 100644 --- a/src/main/java/bridge/BridgeGame.java +++ b/src/main/java/bridge/Domain/BridgeGame.java @@ -1,4 +1,4 @@ -package bridge; +package bridge.Domain; /** * 다리 건너기 게임을 관리하는 클래스 diff --git a/src/main/java/bridge/Domain/Player.java b/src/main/java/bridge/Domain/Player.java new file mode 100644 index 00000000000..ae8e571d64d --- /dev/null +++ b/src/main/java/bridge/Domain/Player.java @@ -0,0 +1,4 @@ +package bridge.Domain; + +public class Player { +} diff --git a/src/main/java/bridge/InputView.java b/src/main/java/bridge/View/InputView.java similarity index 96% rename from src/main/java/bridge/InputView.java rename to src/main/java/bridge/View/InputView.java index c3911c8a8e7..16933326f9b 100644 --- a/src/main/java/bridge/InputView.java +++ b/src/main/java/bridge/View/InputView.java @@ -1,4 +1,4 @@ -package bridge; +package bridge.View; /** * 사용자로부터 입력을 받는 역할을 한다. diff --git a/src/main/java/bridge/OutputView.java b/src/main/java/bridge/View/OutputView.java similarity index 96% rename from src/main/java/bridge/OutputView.java rename to src/main/java/bridge/View/OutputView.java index 69a433a6285..db60b526448 100644 --- a/src/main/java/bridge/OutputView.java +++ b/src/main/java/bridge/View/OutputView.java @@ -1,4 +1,4 @@ -package bridge; +package bridge.View; /** * 사용자에게 게임 진행 상황과 결과를 출력하는 역할을 한다. From bf3a584ad2821749528936b807c1455991f2c42f Mon Sep 17 00:00:00 2001 From: swandevson Date: Thu, 17 Nov 2022 13:42:45 +0900 Subject: [PATCH 04/77] =?UTF-8?q?Add(InputConverter):=20=EC=9E=85=EB=A0=A5?= =?UTF-8?q?=ED=95=9C=20=EB=AC=B8=EC=9E=90=EC=97=B4=EC=9D=84=20=EC=A0=95?= =?UTF-8?q?=EC=88=98=EB=A1=9C=20=EB=B3=80=ED=99=98?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit - 빈 문자열, 숫자가 아닌 경우 IlleglArgumentException을 에러메세지와 함께 발생 --- .../java/bridge/Domain/InputConverter.java | 18 +++++++++++ .../bridge/Domain/InputConverterTest.java | 31 +++++++++++++++++++ 2 files changed, 49 insertions(+) create mode 100644 src/main/java/bridge/Domain/InputConverter.java create mode 100644 src/test/java/bridge/Domain/InputConverterTest.java diff --git a/src/main/java/bridge/Domain/InputConverter.java b/src/main/java/bridge/Domain/InputConverter.java new file mode 100644 index 00000000000..e3006261178 --- /dev/null +++ b/src/main/java/bridge/Domain/InputConverter.java @@ -0,0 +1,18 @@ +package bridge.Domain; + +public class InputConverter { + private static final String WRONG_INPUT = "[ERROR] 숫자만 입력 가능합니다."; + private static final String EMPTY_INPUT = "[ERROR] 빈 문자입니다."; + + public static int convertToInt(String input) throws IllegalArgumentException { + if (input.isBlank()) { + throw new IllegalArgumentException(EMPTY_INPUT); + } + + try { + return Integer.parseInt(input); + } catch (Exception exception){ + throw new IllegalArgumentException(WRONG_INPUT); + } + } +} diff --git a/src/test/java/bridge/Domain/InputConverterTest.java b/src/test/java/bridge/Domain/InputConverterTest.java new file mode 100644 index 00000000000..b02b1375667 --- /dev/null +++ b/src/test/java/bridge/Domain/InputConverterTest.java @@ -0,0 +1,31 @@ +package bridge.Domain; + +import org.junit.jupiter.api.DisplayName; +import org.junit.jupiter.api.Test; +import org.junit.jupiter.params.ParameterizedTest; +import org.junit.jupiter.params.provider.ValueSource; + +import static org.assertj.core.api.Assertions.assertThat; +import static org.assertj.core.api.Assertions.assertThatThrownBy; +import static org.junit.jupiter.api.Assertions.*; + +class InputConverterTest { + @DisplayName("정상적인 값의 문자열을 정수로 변환하는지 확인") + @ParameterizedTest + @ValueSource(strings = {"12", "1", "5", "4", "10"}) + void 문자열을_정수로_변환(String input) { + int convertedNumber = InputConverter.convertToInt(input); + int expectedNumber = Integer.parseInt(input); + + assertThat(convertedNumber).isEqualTo(expectedNumber); + } + + @DisplayName("잘못된 입력값이 예외를 던지는지 확인") + @ParameterizedTest + @ValueSource(strings = {" ", "", "1a", "1,0"}) + void 예외_정수_변환(String input) { + assertThatThrownBy(() -> + InputConverter.convertToInt((input))) + .isInstanceOf(IllegalArgumentException.class); + } +} \ No newline at end of file From c07d5277b8b73eb43122ae6440e9877243ab3ee9 Mon Sep 17 00:00:00 2001 From: swandevson Date: Thu, 17 Nov 2022 13:56:01 +0900 Subject: [PATCH 05/77] =?UTF-8?q?Feat(InputView):=20=EA=B2=8C=EC=9E=84=20?= =?UTF-8?q?=EC=8B=9C=EC=9E=91=20=EB=A9=94=EC=84=B8=EC=A7=80=20=EC=B6=9C?= =?UTF-8?q?=EB=A0=A5,=20=EB=8B=A4=EB=A6=AC=20=EA=B8=B8=EC=9D=B4=20?= =?UTF-8?q?=EC=9E=85=EB=A0=A5=20=ED=9B=84=20=EB=B0=98=ED=99=98?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- src/main/java/bridge/View/InputView.java | 26 ++++++++++++++++++++++-- 1 file changed, 24 insertions(+), 2 deletions(-) diff --git a/src/main/java/bridge/View/InputView.java b/src/main/java/bridge/View/InputView.java index 16933326f9b..2e7c6416513 100644 --- a/src/main/java/bridge/View/InputView.java +++ b/src/main/java/bridge/View/InputView.java @@ -1,15 +1,37 @@ package bridge.View; +import bridge.Domain.InputConverter; + +import static camp.nextstep.edu.missionutils.Console.readLine; + /** * 사용자로부터 입력을 받는 역할을 한다. */ public class InputView { + private final String START_GAME = "다리 건너기 게임을 시작합니다."; + private final String INPUT_BRIDGE_SIZE = "다리의 길이를 입력해주세요."; /** * 다리의 길이를 입력받는다. */ - public int readBridgeSize() { - return 0; + public void printStartMessage() { + System.out.println(START_GAME); + } + + public int readBridgeSize() throws IllegalArgumentException { + System.out.println(INPUT_BRIDGE_SIZE); + + String input = readLine(); + + try { + int bridgeSize = InputConverter.convertToInt(input); + + return bridgeSize; + } catch (IllegalArgumentException illegalArgumentException) { + throw illegalArgumentException; + } + + } /** From 74efb0b88b53e601402d237f016647904410c053 Mon Sep 17 00:00:00 2001 From: swandevson Date: Thu, 17 Nov 2022 14:44:49 +0900 Subject: [PATCH 06/77] =?UTF-8?q?Add(BridgeBlcok):=20UP,=20DOWN=20?= =?UTF-8?q?=EC=83=81=EC=88=98=EC=97=90=20=EB=8C=80=ED=95=9C=20enum=20?= =?UTF-8?q?=ED=81=B4=EB=9E=98=EC=8A=A4=20=EC=83=9D=EC=84=B1?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit - 문자열, 숫자 값으로 구성 --- src/main/java/bridge/Domain/BridgeBlock.java | 27 +++++++++++++++++++ .../java/bridge/Domain/BridgeBlockTest.java | 26 ++++++++++++++++++ 2 files changed, 53 insertions(+) create mode 100644 src/main/java/bridge/Domain/BridgeBlock.java create mode 100644 src/test/java/bridge/Domain/BridgeBlockTest.java diff --git a/src/main/java/bridge/Domain/BridgeBlock.java b/src/main/java/bridge/Domain/BridgeBlock.java new file mode 100644 index 00000000000..a7527b7a1ac --- /dev/null +++ b/src/main/java/bridge/Domain/BridgeBlock.java @@ -0,0 +1,27 @@ +package bridge.Domain; + +import java.util.Arrays; + +public enum BridgeBlock { + UP("U", 1), + DOWN("D", 0); + + + private final String blockIdentifier; + private final int blockNumber; + + + BridgeBlock(String blockIdentifier, int blockNumber) { + this.blockIdentifier = blockIdentifier; + this.blockNumber = blockNumber; + } + + + public static String getBlockIdentifier(int blockNumber) { + return Arrays.stream(BridgeBlock.values()) + .filter(block -> block.blockNumber == blockNumber) + .findAny() + .get() + .blockIdentifier; + } +} diff --git a/src/test/java/bridge/Domain/BridgeBlockTest.java b/src/test/java/bridge/Domain/BridgeBlockTest.java new file mode 100644 index 00000000000..bb796d27583 --- /dev/null +++ b/src/test/java/bridge/Domain/BridgeBlockTest.java @@ -0,0 +1,26 @@ +package bridge.Domain; + +import org.junit.jupiter.api.DisplayName; +import org.junit.jupiter.api.Nested; +import org.junit.jupiter.api.Test; +import org.junit.jupiter.params.ParameterizedTest; +import org.junit.jupiter.params.provider.EnumSource; + +import static org.assertj.core.api.Assertions.assertThat; +import static org.junit.jupiter.api.Assertions.*; + +class BridgeBlockTest { + + @DisplayName("생성 번호에 따른 올바른 문자 반환하는지 테스트") + @Nested + class StringReturnTest { + @Test + void 반환_올바른_문자_UP() { + assertThat(BridgeBlock.getBlockIdentifier(0)).isEqualTo("U"); + } + @Test + void 반환_올바른_문자_DOWN() { + assertThat(BridgeBlock.getBlockIdentifier(1)).isEqualTo("D"); + } + } +} \ No newline at end of file From 2e6c52bddd2dbf30660d1955bdc6fa5ad081f025 Mon Sep 17 00:00:00 2001 From: swandevson Date: Thu, 17 Nov 2022 16:28:31 +0900 Subject: [PATCH 07/77] =?UTF-8?q?Feat(BridgeMaker):=20=EC=9E=85=EB=A0=A5?= =?UTF-8?q?=EB=B0=9B=EC=9D=80=20=EA=B8=B8=EC=9D=B4=EB=A7=8C=ED=81=BC?= =?UTF-8?q?=EC=9D=98=20=EB=8B=A4=EB=A6=AC=20=EC=83=9D=EC=84=B1?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- src/main/java/bridge/BridgeMaker.java | 23 +++++++++++++++++++++-- 1 file changed, 21 insertions(+), 2 deletions(-) diff --git a/src/main/java/bridge/BridgeMaker.java b/src/main/java/bridge/BridgeMaker.java index d61a5322162..49f37d6de52 100644 --- a/src/main/java/bridge/BridgeMaker.java +++ b/src/main/java/bridge/BridgeMaker.java @@ -1,8 +1,11 @@ package bridge; -import bridge.BridgeNumberGenerator; +import bridge.Domain.BridgeBlock; +import java.util.ArrayList; import java.util.List; +import java.util.stream.Collectors; + /** * 다리의 길이를 입력 받아서 다리를 생성해주는 역할을 한다. @@ -20,6 +23,22 @@ public BridgeMaker(BridgeNumberGenerator bridgeNumberGenerator) { * @return 입력받은 길이에 해당하는 다리 모양. 위 칸이면 "U", 아래 칸이면 "D"로 표현해야 한다. */ public List makeBridge(int size) { - return null; + final List bridgeNumbers = generateBridgeNumbers(size); + final List bridge = bridgeNumbers.stream() + .map(bridgeNumber -> BridgeBlock.getBlockIdentifier((bridgeNumber))) + .collect(Collectors.toList()); + + return bridge; + } + + private List generateBridgeNumbers(int size) { + final List bridgeNumbers = new ArrayList<>(size); + + for (int i = 0; i < size; i++) { + int blockNumber = bridgeNumberGenerator.generate(); + bridgeNumbers.add(blockNumber); + } + + return bridgeNumbers; } } From f9baf6d32b3f7746c0466b4f843115730d34b232 Mon Sep 17 00:00:00 2001 From: swandevson Date: Thu, 17 Nov 2022 16:40:58 +0900 Subject: [PATCH 08/77] =?UTF-8?q?Feat(Bridge):=20=EC=82=AC=EC=9D=B4?= =?UTF-8?q?=EC=A6=88=20=EA=B2=80=EC=A6=9D=20=EB=B0=8F=20=EA=B2=8C=EC=9E=84?= =?UTF-8?q?=EC=97=90=20=EC=82=AC=EC=9A=A9=ED=95=A0=20=EB=8B=A4=EB=A6=AC=20?= =?UTF-8?q?=EC=83=9D=EC=84=B1?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit - 범위를 벗어나는 사이즈일시 예외를 throw - 범위 내일 경우 게임에 사용할 다리를 생성 --- src/main/java/bridge/Domain/Bridge.java | 35 +++++++++++++++++++++ src/test/java/bridge/Domain/BridgeTest.java | 20 ++++++++++++ 2 files changed, 55 insertions(+) create mode 100644 src/test/java/bridge/Domain/BridgeTest.java diff --git a/src/main/java/bridge/Domain/Bridge.java b/src/main/java/bridge/Domain/Bridge.java index d898dbe49cb..eb43f126d91 100644 --- a/src/main/java/bridge/Domain/Bridge.java +++ b/src/main/java/bridge/Domain/Bridge.java @@ -1,4 +1,39 @@ package bridge.Domain; +import bridge.BridgeMaker; +import bridge.BridgeNumberGenerator; +import bridge.BridgeRandomNumberGenerator; + +import java.util.List; + + + public class Bridge { + private final static int MIN_BRIDGE_SIZE = 3; + private final static int MAX_BRIDGE_SIZE = 50; + private final static String WRONG_RANGE_INPUT = "[ERROR] 다리 길이는 3부터 20 사이의 숫자여야 합니다."; + + + private List bridge; + + + public Bridge(int bridgeSize) throws IllegalArgumentException { + try { + validate(bridgeSize); + } catch (IllegalArgumentException illegalArgumentException) { + throw illegalArgumentException; + } + + BridgeNumberGenerator bridgeRandomNumberGenerator = new BridgeRandomNumberGenerator(); + BridgeMaker bridgeMaker = new BridgeMaker(bridgeRandomNumberGenerator); + + this.bridge = bridgeMaker.makeBridge(bridgeSize); + } + + + public void validate(int bridgeSize) throws IllegalArgumentException { + if (bridgeSize < MIN_BRIDGE_SIZE || MAX_BRIDGE_SIZE < bridgeSize) { + throw new IllegalArgumentException(WRONG_RANGE_INPUT); + } + } } diff --git a/src/test/java/bridge/Domain/BridgeTest.java b/src/test/java/bridge/Domain/BridgeTest.java new file mode 100644 index 00000000000..d46ff330541 --- /dev/null +++ b/src/test/java/bridge/Domain/BridgeTest.java @@ -0,0 +1,20 @@ +package bridge.Domain; + +import org.junit.jupiter.api.DisplayName; +import org.junit.jupiter.params.ParameterizedTest; +import org.junit.jupiter.params.provider.ValueSource; + +import static org.assertj.core.api.Assertions.assertThat; +import static org.assertj.core.api.Assertions.assertThatThrownBy; + + + +class BridgeTest { + @DisplayName("범위 외의 숫자 예외 throw") + @ParameterizedTest + @ValueSource(ints = {1, 2, 55, 101}) + void 예외_범위를_벗어난_숫자(int size) { + assertThatThrownBy(() -> assertThat(new Bridge(size))) + .isInstanceOf(IllegalArgumentException.class); + } +} \ No newline at end of file From 7eaac102ecee7b2078eebd4b7bc65c8a1ba124ec Mon Sep 17 00:00:00 2001 From: swandevson Date: Thu, 17 Nov 2022 17:05:48 +0900 Subject: [PATCH 09/77] =?UTF-8?q?Refactor(InputValidator):=20Converter?= =?UTF-8?q?=EC=9D=98=20=EA=B2=80=EC=A6=9D=20=EB=B6=80=EB=B6=84=20=EB=B6=84?= =?UTF-8?q?=EB=A6=AC?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../java/bridge/Domain/InputConverter.java | 15 ++++++------- .../java/bridge/Domain/InputValidator.java | 21 +++++++++++++++++++ 2 files changed, 27 insertions(+), 9 deletions(-) create mode 100644 src/main/java/bridge/Domain/InputValidator.java diff --git a/src/main/java/bridge/Domain/InputConverter.java b/src/main/java/bridge/Domain/InputConverter.java index e3006261178..975de0eca7f 100644 --- a/src/main/java/bridge/Domain/InputConverter.java +++ b/src/main/java/bridge/Domain/InputConverter.java @@ -1,18 +1,15 @@ package bridge.Domain; public class InputConverter { - private static final String WRONG_INPUT = "[ERROR] 숫자만 입력 가능합니다."; - private static final String EMPTY_INPUT = "[ERROR] 빈 문자입니다."; - public static int convertToInt(String input) throws IllegalArgumentException { - if (input.isBlank()) { - throw new IllegalArgumentException(EMPTY_INPUT); - } + public static int convertToInt(String input) throws IllegalArgumentException { try { - return Integer.parseInt(input); - } catch (Exception exception){ - throw new IllegalArgumentException(WRONG_INPUT); + InputValidator.validateNumberInput(input); + } catch (IllegalArgumentException illegalArgumentException) { + throw illegalArgumentException; } + + return Integer.parseInt(input); } } diff --git a/src/main/java/bridge/Domain/InputValidator.java b/src/main/java/bridge/Domain/InputValidator.java new file mode 100644 index 00000000000..9ae4129c450 --- /dev/null +++ b/src/main/java/bridge/Domain/InputValidator.java @@ -0,0 +1,21 @@ +package bridge.Domain; + +import org.junit.platform.commons.util.StringUtils; + +public class InputValidator { + private static final String ERROR_PREFIX = "[ERROR]"; + private static final String EMPTY_INPUT = ERROR_PREFIX + "빈 문자입니다."; + private static final String WRONG_SIZE_INPUT = ERROR_PREFIX + "숫자만 입력 가능합니다."; + + public static void validateNumberInput(String input) throws IllegalArgumentException { + final String NOT_NUMBER_REGEX = "[^0-9]"; + + if (input.isBlank()) { + throw new IllegalArgumentException(EMPTY_INPUT); + } + + if (input.matches(NOT_NUMBER_REGEX)) { + throw new IllegalArgumentException(WRONG_SIZE_INPUT); + } + } +} From c4e7d9648b9c88bffd9880198b949518c6200e31 Mon Sep 17 00:00:00 2001 From: swandevson Date: Thu, 17 Nov 2022 17:18:51 +0900 Subject: [PATCH 10/77] =?UTF-8?q?Feat(InputValidator):=20=EC=9C=84,=20?= =?UTF-8?q?=EC=95=84=EB=9E=98=20=EC=84=A0=ED=83=9D=20=EC=9E=85=EB=A0=A5?= =?UTF-8?q?=EA=B0=92=20=EA=B2=80=EC=A6=9D?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../java/bridge/Domain/InputValidator.java | 14 +++++++++++++ .../bridge/Domain/InputValidatorTest.java | 20 +++++++++++++++++++ 2 files changed, 34 insertions(+) create mode 100644 src/test/java/bridge/Domain/InputValidatorTest.java diff --git a/src/main/java/bridge/Domain/InputValidator.java b/src/main/java/bridge/Domain/InputValidator.java index 9ae4129c450..f38d4c348a9 100644 --- a/src/main/java/bridge/Domain/InputValidator.java +++ b/src/main/java/bridge/Domain/InputValidator.java @@ -6,6 +6,9 @@ public class InputValidator { private static final String ERROR_PREFIX = "[ERROR]"; private static final String EMPTY_INPUT = ERROR_PREFIX + "빈 문자입니다."; private static final String WRONG_SIZE_INPUT = ERROR_PREFIX + "숫자만 입력 가능합니다."; + private static final String WRONG_SELECTION_INPUT = ERROR_PREFIX + "'U' 또는 'D'만 입력 가능합니다."; + private static final String SELECTION_UP = "U"; + private static final String SELECTION_DOWN = "D"; public static void validateNumberInput(String input) throws IllegalArgumentException { final String NOT_NUMBER_REGEX = "[^0-9]"; @@ -18,4 +21,15 @@ public static void validateNumberInput(String input) throws IllegalArgumentExcep throw new IllegalArgumentException(WRONG_SIZE_INPUT); } } + + public static void validateSelectionInput(String input) throws IllegalArgumentException { + if (input.isBlank()) { + throw new IllegalArgumentException(EMPTY_INPUT); + } + + if (!input.equals(SELECTION_UP) && !input.equals(SELECTION_DOWN)) { + throw new IllegalArgumentException(WRONG_SELECTION_INPUT); + } + } + } diff --git a/src/test/java/bridge/Domain/InputValidatorTest.java b/src/test/java/bridge/Domain/InputValidatorTest.java new file mode 100644 index 00000000000..2faad7872b0 --- /dev/null +++ b/src/test/java/bridge/Domain/InputValidatorTest.java @@ -0,0 +1,20 @@ +package bridge.Domain; + +import org.junit.jupiter.api.DisplayName; +import org.junit.jupiter.api.Test; +import org.junit.jupiter.params.ParameterizedTest; +import org.junit.jupiter.params.provider.ValueSource; + +import static org.assertj.core.api.Assertions.assertThatThrownBy; +import static org.junit.jupiter.api.Assertions.*; + +class InputValidatorTest { + + @DisplayName("잘못된 위, 아래 입력 예외 throw") + @ParameterizedTest + @ValueSource(strings = {"aaa", "bb", "d", "u", "", " "}) + void validateSelectionInput(String input) { + assertThatThrownBy(() -> InputValidator.validateSelectionInput(input)) + .isInstanceOf(IllegalArgumentException.class); + } +} \ No newline at end of file From 3c0a5924cc59ac057e4753b01b7856393d6dcb10 Mon Sep 17 00:00:00 2001 From: swandevson Date: Thu, 17 Nov 2022 21:13:40 +0900 Subject: [PATCH 11/77] =?UTF-8?q?Rename(Bridge):=20=EA=B2=8C=EC=9E=84?= =?UTF-8?q?=EC=97=90=20=EC=82=AC=EC=9A=A9=ED=95=98=EB=8A=94=20=EB=8B=A4?= =?UTF-8?q?=EB=A6=AC=20=EB=B3=80=EC=88=98=EB=AA=85=20=EB=B3=80=EA=B2=BD?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit - bridge -> bridgeStates --- src/main/java/bridge/Domain/Bridge.java | 13 +++++++++++-- 1 file changed, 11 insertions(+), 2 deletions(-) diff --git a/src/main/java/bridge/Domain/Bridge.java b/src/main/java/bridge/Domain/Bridge.java index eb43f126d91..7ed4aeb2e74 100644 --- a/src/main/java/bridge/Domain/Bridge.java +++ b/src/main/java/bridge/Domain/Bridge.java @@ -14,7 +14,7 @@ public class Bridge { private final static String WRONG_RANGE_INPUT = "[ERROR] 다리 길이는 3부터 20 사이의 숫자여야 합니다."; - private List bridge; + private List bridgeStates; public Bridge(int bridgeSize) throws IllegalArgumentException { @@ -27,7 +27,7 @@ public Bridge(int bridgeSize) throws IllegalArgumentException { BridgeNumberGenerator bridgeRandomNumberGenerator = new BridgeRandomNumberGenerator(); BridgeMaker bridgeMaker = new BridgeMaker(bridgeRandomNumberGenerator); - this.bridge = bridgeMaker.makeBridge(bridgeSize); + this.bridgeStates = bridgeMaker.makeBridge(bridgeSize); } @@ -36,4 +36,13 @@ public void validate(int bridgeSize) throws IllegalArgumentException { throw new IllegalArgumentException(WRONG_RANGE_INPUT); } } + + public List getBridgeStates() { + return this.bridgeStates; + } + + public String getBridgeState(int bridgeLocation) { + return bridgeStates.get(bridgeLocation); + } + } From bf6cb22122e4bd78a4ed17472c96c83c18aa203c Mon Sep 17 00:00:00 2001 From: swandevson Date: Thu, 17 Nov 2022 21:36:11 +0900 Subject: [PATCH 12/77] =?UTF-8?q?Feat(BridgeGame):=20=ED=95=84=EB=93=9C=20?= =?UTF-8?q?=EB=B0=8F=20=EC=83=9D=EC=84=B1=EC=9E=90=20=EC=9E=91=EC=84=B1?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit - 다리와 플레이어를 필드로 설정 - 사이즈를 인자로 받는 생성자 --- src/main/java/bridge/Domain/BridgeGame.java | 12 ++++++++++++ 1 file changed, 12 insertions(+) diff --git a/src/main/java/bridge/Domain/BridgeGame.java b/src/main/java/bridge/Domain/BridgeGame.java index 4615ce54613..767f03a6328 100644 --- a/src/main/java/bridge/Domain/BridgeGame.java +++ b/src/main/java/bridge/Domain/BridgeGame.java @@ -4,6 +4,18 @@ * 다리 건너기 게임을 관리하는 클래스 */ public class BridgeGame { + Bridge bridge; + Player player; + + + public BridgeGame(int size) throws IllegalArgumentException { + try { + this.bridge = new Bridge(size); + this.player = new Player(); + } catch (IllegalArgumentException illegalArgumentException) { + throw illegalArgumentException; + } + } /** * 사용자가 칸을 이동할 때 사용하는 메서드 From ed93bc52627932d6bbe410893bdf6e47ab2f2108 Mon Sep 17 00:00:00 2001 From: swandevson Date: Thu, 17 Nov 2022 21:38:34 +0900 Subject: [PATCH 13/77] =?UTF-8?q?Add(Player):=20=EB=8B=A4=EB=A6=AC=20?= =?UTF-8?q?=EA=B1=B4=EB=84=88=EA=B8=B0=20=EA=B2=8C=EC=9E=84=EC=9D=84=20?= =?UTF-8?q?=ED=94=8C=EB=A0=88=EC=9D=B4=ED=95=98=EB=8A=94=20=ED=94=8C?= =?UTF-8?q?=EB=A0=88=EC=9D=B4=EC=96=B4?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit - 다음에 갈 위치, 마지막 선택, 생존 여부를 멤버로 가짐 - getter와 setter 작성 --- src/main/java/bridge/Domain/Player.java | 28 +++++++++++++++++++++++++ 1 file changed, 28 insertions(+) diff --git a/src/main/java/bridge/Domain/Player.java b/src/main/java/bridge/Domain/Player.java index ae8e571d64d..ff4d38cfad8 100644 --- a/src/main/java/bridge/Domain/Player.java +++ b/src/main/java/bridge/Domain/Player.java @@ -1,4 +1,32 @@ package bridge.Domain; public class Player { + private int nextLocation; + private String lastSelection; + private boolean alive; + + + public Player() { + this.nextLocation = 0; + this.lastSelection = null; + this.alive = true; + } + + + public void setLastSelection(String lastSelection) { + this.lastSelection = lastSelection; + } + + + public boolean isAlive() { + return this.alive; + } + + public int getNextLocation() { + return this.nextLocation; + } + + public String getLastSelection() { + return this.lastSelection; + } } From b1944f936d946a3a606d79b3854decd22cfb350a Mon Sep 17 00:00:00 2001 From: swandevson Date: Thu, 17 Nov 2022 21:41:29 +0900 Subject: [PATCH 14/77] =?UTF-8?q?Feat(BridgeGame):=20=EC=9E=98=EB=AA=BB?= =?UTF-8?q?=EB=90=9C=20=EB=8B=A4=EB=A6=AC=EB=A5=BC=20=EA=B1=B4=EB=84=90?= =?UTF-8?q?=EC=8B=9C=20=EC=82=AC=EB=A7=9D?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit - 선택한 다리 칸이 무너지는 경우 플레이어 사망 처리 --- src/main/java/bridge/Domain/BridgeGame.java | 10 ++++++++- src/main/java/bridge/Domain/Player.java | 6 +++++ .../java/bridge/Domain/BridgeGameTest.java | 22 +++++++++++++++++++ 3 files changed, 37 insertions(+), 1 deletion(-) create mode 100644 src/test/java/bridge/Domain/BridgeGameTest.java diff --git a/src/main/java/bridge/Domain/BridgeGame.java b/src/main/java/bridge/Domain/BridgeGame.java index 767f03a6328..90bebb9223d 100644 --- a/src/main/java/bridge/Domain/BridgeGame.java +++ b/src/main/java/bridge/Domain/BridgeGame.java @@ -22,7 +22,15 @@ public BridgeGame(int size) throws IllegalArgumentException { *

* 이동을 위해 필요한 메서드의 반환 타입(return type), 인자(parameter)는 자유롭게 추가하거나 변경할 수 있다. */ - public void move() { + public void move(String playerSelection) { + player.setLastSelection(playerSelection); + + int nextPlayerLocation = player.getNextLocation(); + String nextBridgeState = bridge.getBridgeState(nextPlayerLocation); + + if (!playerSelection.equals(nextBridgeState)) { + player.die(); + } } /** diff --git a/src/main/java/bridge/Domain/Player.java b/src/main/java/bridge/Domain/Player.java index ff4d38cfad8..2598c2b3371 100644 --- a/src/main/java/bridge/Domain/Player.java +++ b/src/main/java/bridge/Domain/Player.java @@ -29,4 +29,10 @@ public int getNextLocation() { public String getLastSelection() { return this.lastSelection; } + + public void die() { + this.alive = false; + } + + } diff --git a/src/test/java/bridge/Domain/BridgeGameTest.java b/src/test/java/bridge/Domain/BridgeGameTest.java new file mode 100644 index 00000000000..b98624f8839 --- /dev/null +++ b/src/test/java/bridge/Domain/BridgeGameTest.java @@ -0,0 +1,22 @@ +package bridge.Domain; + +import org.junit.jupiter.api.DisplayName; +import org.junit.jupiter.api.Test; + +import static camp.nextstep.edu.missionutils.test.Assertions.assertRandomNumberInRangeTest; +import static org.assertj.core.api.Assertions.assertThat; + +class BridgeGameTest { + + @DisplayName("잘못된 발판을 밟았을 때 죽는지 확인") + @Test + void 잘못_움직여_사망() { + assertRandomNumberInRangeTest(() -> { + BridgeGame bridgeGame = new BridgeGame(3); + bridgeGame.move("D"); + + assertThat(bridgeGame.isPlayerDead()).isTrue(); + }, 1, 0, 0); + + } +} \ No newline at end of file From 454d5c4a4110749771593135a51c22f146a87ed9 Mon Sep 17 00:00:00 2001 From: swandevson Date: Thu, 17 Nov 2022 21:53:35 +0900 Subject: [PATCH 15/77] =?UTF-8?q?Implement(Application):=20=EC=82=AC?= =?UTF-8?q?=EC=9A=A9=EC=9E=90=20=EC=9E=85=EB=A0=A5=20=EA=B8=B0=EB=8A=A5=20?= =?UTF-8?q?=EA=B5=AC=ED=98=84?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit - 사이즈, U/D을 잘못입력할 시 제대로 입력할 때 까지 반복 - 사이즈를 입력받고 BridgeGame을 생성 - U/D를 입력받고 사용자 상태 업데이트 - 다리를 모두 건너거나 사용자가 죽으면 일단은 종료하도록 구현 - 필요한 정보 및 업데이트를 BridgeGame의 getter/setter 메소드 구현 --- src/main/java/bridge/Application.java | 50 ++++++++++++++++++++- src/main/java/bridge/Domain/BridgeGame.java | 32 +++++++++++++ src/main/java/bridge/Domain/Player.java | 4 +- src/main/java/bridge/View/InputView.java | 13 +++++- 4 files changed, 95 insertions(+), 4 deletions(-) diff --git a/src/main/java/bridge/Application.java b/src/main/java/bridge/Application.java index 5cb72dfd3de..7deed30366d 100644 --- a/src/main/java/bridge/Application.java +++ b/src/main/java/bridge/Application.java @@ -1,8 +1,56 @@ package bridge; +import bridge.Domain.BridgeGame; +import bridge.Domain.Player; +import bridge.View.InputView; +import bridge.View.OutputView; + public class Application { + public static BridgeGame initiateBridgeGame(InputView inputView) { + boolean exceptionFlag = true; + BridgeGame bridgeGame = null; + + inputView.printStartMessage(); + + while(exceptionFlag) { + exceptionFlag = false; + + try { + int size = inputView.readBridgeSize(); + bridgeGame = new BridgeGame(size); + } catch (IllegalArgumentException illegalArgumentException) { + System.out.println(illegalArgumentException.getMessage()); + exceptionFlag = true; + } + } + + return bridgeGame; + } + + public static void inputMoving(InputView inputView, BridgeGame bridgeGame) { + boolean exceptionFlag = true; + while(exceptionFlag) { + exceptionFlag = false; + + try { + String selection = inputView.readMoving(); + bridgeGame.move(selection); + } catch (IllegalArgumentException illegalArgumentException) { + System.out.println(illegalArgumentException.getMessage()); + exceptionFlag = true; + } + } + + bridgeGame.updatePlayer(); + } public static void main(String[] args) { - // TODO: 프로그램 구현 + InputView inputView = new InputView(); + BridgeGame bridgeGame = initiateBridgeGame(inputView); + OutputView outputView = new OutputView(); + + while(!bridgeGame.winGame() && !bridgeGame.isPlayerDead()) { + inputMoving(inputView, bridgeGame); + } } } diff --git a/src/main/java/bridge/Domain/BridgeGame.java b/src/main/java/bridge/Domain/BridgeGame.java index 90bebb9223d..6c0a8304f65 100644 --- a/src/main/java/bridge/Domain/BridgeGame.java +++ b/src/main/java/bridge/Domain/BridgeGame.java @@ -1,5 +1,7 @@ package bridge.Domain; +import java.util.List; + /** * 다리 건너기 게임을 관리하는 클래스 */ @@ -40,4 +42,34 @@ public void move(String playerSelection) { */ public void retry() { } + + + public boolean winGame() { + int playerNextLocation = player.getNextLocation(); + List bridgeStates = bridge.getBridgeStates(); + + if (bridgeStates.size() < playerNextLocation) { + return true; + } + + return false; + } + + public List getBridgeStates() { + return this.bridge.getBridgeStates(); + } + + public boolean isPlayerDead() { + if (player.isAlive()) { + return false; + } + + return true; + } + + public void updatePlayer() { + if (player.isAlive()) { + player.success(); + } + } } diff --git a/src/main/java/bridge/Domain/Player.java b/src/main/java/bridge/Domain/Player.java index 2598c2b3371..a7dcd55ba04 100644 --- a/src/main/java/bridge/Domain/Player.java +++ b/src/main/java/bridge/Domain/Player.java @@ -34,5 +34,7 @@ public void die() { this.alive = false; } - + public void success() { + this.nextLocation++; + } } diff --git a/src/main/java/bridge/View/InputView.java b/src/main/java/bridge/View/InputView.java index 2e7c6416513..65b8267c7b1 100644 --- a/src/main/java/bridge/View/InputView.java +++ b/src/main/java/bridge/View/InputView.java @@ -37,8 +37,17 @@ public int readBridgeSize() throws IllegalArgumentException { /** * 사용자가 이동할 칸을 입력받는다. */ - public String readMoving() { - return null; + public String readMoving() throws IllegalArgumentException { + System.out.println(INPUT_SELECTION); + String input = readLine(); + + try { + InputValidator.validateSelectionInput(input); + + return input; + } catch (IllegalArgumentException illegalArgumentException) { + throw illegalArgumentException; + } } /** From 16f007fdc64aa45c148c16de42b62d18b0c40a09 Mon Sep 17 00:00:00 2001 From: swandevson Date: Thu, 17 Nov 2022 22:47:24 +0900 Subject: [PATCH 16/77] =?UTF-8?q?Implement(OutputView):=20=EC=9E=85?= =?UTF-8?q?=EB=A0=A5=20=EA=B2=B0=EA=B3=BC,=20=EC=B5=9C=EC=A2=85=20?= =?UTF-8?q?=EA=B2=B0=EA=B3=BC=20=EC=B6=9C=EB=A0=A5?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- src/main/java/bridge/Domain/BridgeGame.java | 9 +++ src/main/java/bridge/View/OutputView.java | 64 ++++++++++++++++++--- 2 files changed, 66 insertions(+), 7 deletions(-) diff --git a/src/main/java/bridge/Domain/BridgeGame.java b/src/main/java/bridge/Domain/BridgeGame.java index 6c0a8304f65..db2c61971fb 100644 --- a/src/main/java/bridge/Domain/BridgeGame.java +++ b/src/main/java/bridge/Domain/BridgeGame.java @@ -41,6 +41,7 @@ public void move(String playerSelection) { * 재시작을 위해 필요한 메서드의 반환 타입(return type), 인자(parameter)는 자유롭게 추가하거나 변경할 수 있다. */ public void retry() { + this.retryCount++; } @@ -72,4 +73,12 @@ public void updatePlayer() { player.success(); } } + + public Player getPlayer() { + return this.player; + } + + public int getRetryCount() { + return this.retryCount; + } } diff --git a/src/main/java/bridge/View/OutputView.java b/src/main/java/bridge/View/OutputView.java index db60b526448..0e97e79bddf 100644 --- a/src/main/java/bridge/View/OutputView.java +++ b/src/main/java/bridge/View/OutputView.java @@ -4,13 +4,50 @@ * 사용자에게 게임 진행 상황과 결과를 출력하는 역할을 한다. */ public class OutputView { + private String printLastStair(Player player, String stair) { + if (!stair.equals(player.getLastSelection())) { + return " "; + } - /** - * 현재까지 이동한 다리의 상태를 정해진 형식에 맞춰 출력한다. - *

- * 출력을 위해 필요한 메서드의 인자(parameter)는 자유롭게 추가하거나 변경할 수 있다. - */ - public void printMap() { + if (!player.isAlive()) { + return " X "; + } + + return " O "; + } + + private String printPassedStair(List bridgeStates, Player player, String stair) { + String result = ""; + + for (int bridgeLocation = 0; bridgeLocation < player.getNextLocation() - 1; bridgeLocation++) { + String state = " "; + if (stair.equals(bridgeStates.get(bridgeLocation))) { + state = " O "; + } + state += "|"; + result += state; + } + + return result; + } + + private void printStair(List bridgeStates, Player player, String stair) { + String result = "["; + result += printPassedStair(bridgeStates, player, stair); + result += printLastStair(player, stair); + result += "]"; + + System.out.println(result); + } + + public void printMap(BridgeGame bridgeGame) { + List bridgeState = bridgeGame.getBridgeStates(); + Player player = bridgeGame.getPlayer(); + + System.out.println(player.getNextLocation()); + printStair(bridgeState, player, "U"); + printStair(bridgeState, player, "D"); + System.out.println(); } /** @@ -18,6 +55,19 @@ public void printMap() { *

* 출력을 위해 필요한 메서드의 인자(parameter)는 자유롭게 추가하거나 변경할 수 있다. */ - public void printResult() { + + private String printIsSuccess(BridgeGame bridgeGame) { + if (bridgeGame.isPlayerDead()) { + return "실패"; + } + + return "성공"; + } + public void printResult(BridgeGame bridgeGame) { + System.out.println("최종 게임 결과"); + printMap(bridgeGame); + + System.out.println("게임 성공 여부: " + printIsSuccess(bridgeGame)); + System.out.println("총 시도한 횟수: " + bridgeGame.getRetryCount()); } } From 8387d20523a002acf3cf41c89c7230965e631e6e Mon Sep 17 00:00:00 2001 From: swandevson Date: Thu, 17 Nov 2022 22:49:06 +0900 Subject: [PATCH 17/77] =?UTF-8?q?Fix(BridgeGame):=20=EC=9E=AC=EC=8B=9C?= =?UTF-8?q?=EB=8F=84=20=ED=9A=9F=EC=88=98=20=ED=95=84=EB=93=9C=20=EC=B6=94?= =?UTF-8?q?=EA=B0=80,=20=EA=B2=8C=EC=9E=84=20=EC=8A=B9=EB=A6=AC=20?= =?UTF-8?q?=EC=A1=B0=EA=B1=B4=20=EC=88=98=EC=A0=95?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit - 재시도 횟수 필드 추가 - 게임 승리 조건 수정 --- src/main/java/bridge/Domain/BridgeGame.java | 5 ++++- 1 file changed, 4 insertions(+), 1 deletion(-) diff --git a/src/main/java/bridge/Domain/BridgeGame.java b/src/main/java/bridge/Domain/BridgeGame.java index db2c61971fb..ed9f2099b43 100644 --- a/src/main/java/bridge/Domain/BridgeGame.java +++ b/src/main/java/bridge/Domain/BridgeGame.java @@ -8,12 +8,14 @@ public class BridgeGame { Bridge bridge; Player player; + private int retryCount; public BridgeGame(int size) throws IllegalArgumentException { try { this.bridge = new Bridge(size); this.player = new Player(); + this.retryCount = 1; } catch (IllegalArgumentException illegalArgumentException) { throw illegalArgumentException; } @@ -49,7 +51,8 @@ public boolean winGame() { int playerNextLocation = player.getNextLocation(); List bridgeStates = bridge.getBridgeStates(); - if (bridgeStates.size() < playerNextLocation) { + // 다음에 이동할 곳이 인덱스를 벗어날 경우 끝에 도달한 것 + if (bridgeStates.size() <= playerNextLocation) { return true; } From 9655c92873d978c51532ae7ae128ca0aba5f4bd4 Mon Sep 17 00:00:00 2001 From: swandevson Date: Thu, 17 Nov 2022 22:50:50 +0900 Subject: [PATCH 18/77] =?UTF-8?q?Refactor(Application):=20View=20=ED=81=B4?= =?UTF-8?q?=EB=9E=98=EC=8A=A4=20=EC=A0=95=EC=A0=81=20=EB=B3=80=EC=88=98=20?= =?UTF-8?q?=EB=B3=80=EA=B2=BD=20=EB=B0=8F=20=EA=B2=8C=EC=9E=84=20=EC=8B=A4?= =?UTF-8?q?=ED=96=89=20=EC=BD=94=EB=93=9C?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit - InputView, OutputView를 정적 변수로 변경 - 게임 재실행을 위해 실행을 메소드로 분리 --- src/main/java/bridge/Application.java | 18 ++++++++++++------ 1 file changed, 12 insertions(+), 6 deletions(-) diff --git a/src/main/java/bridge/Application.java b/src/main/java/bridge/Application.java index 7deed30366d..2d9403e8020 100644 --- a/src/main/java/bridge/Application.java +++ b/src/main/java/bridge/Application.java @@ -6,6 +6,9 @@ import bridge.View.OutputView; public class Application { + private static InputView inputView = new InputView(); + private static OutputView outputView = new OutputView(); + public static BridgeGame initiateBridgeGame(InputView inputView) { boolean exceptionFlag = true; BridgeGame bridgeGame = null; @@ -40,17 +43,20 @@ public static void inputMoving(InputView inputView, BridgeGame bridgeGame) { exceptionFlag = true; } } + } - bridgeGame.updatePlayer(); + public static void run(BridgeGame bridgeGame) { + while(!bridgeGame.winGame() && !bridgeGame.isPlayerDead()) { + inputMoving(inputView, bridgeGame); + outputView.printMap(bridgeGame); + bridgeGame.updatePlayer(); + } } public static void main(String[] args) { - InputView inputView = new InputView(); BridgeGame bridgeGame = initiateBridgeGame(inputView); - OutputView outputView = new OutputView(); - while(!bridgeGame.winGame() && !bridgeGame.isPlayerDead()) { - inputMoving(inputView, bridgeGame); - } + run(bridgeGame); + outputView.printResult(bridgeGame); } } From 5e83a270d52c9f5e97cae17663ee383e4fe75845 Mon Sep 17 00:00:00 2001 From: swandevson Date: Fri, 18 Nov 2022 00:04:42 +0900 Subject: [PATCH 19/77] =?UTF-8?q?Docs(README.md):=20=EA=B8=B0=EB=8A=A5=20?= =?UTF-8?q?=EB=AA=A9=EB=A1=9D=20=EC=97=85=EB=8D=B0=EC=9D=B4=ED=8A=B8?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- docs/README.md | 55 +++++++++++++++++++++++++++++++++----------------- 1 file changed, 36 insertions(+), 19 deletions(-) diff --git a/docs/README.md b/docs/README.md index 9d449691568..355d4862436 100644 --- a/docs/README.md +++ b/docs/README.md @@ -18,23 +18,40 @@ ### 1. 게임 시작 문구를 출력한다. - `View`/`InputView` ### 2. 다리의 길이를 숫자를 입력받고 생성한다. - - [ ] 입력받은 숫자(문자열)을 정수로 변환한다. `Controller`/`Converter` - - [ ] 숫자가 아닌 입력일 경우(문자, 빈 문자열) 예외를 던진다. - - [ ] 잘못된 입력일 경우, 올바른 입력이 될 때 까지 입력받는다. - - [ ] 입력받은 숫자가 3 이상 20 이하인지 확인하고 아니면 예외를 던진다. - `Controller`/`BridgeMaker` from `Validator`/`InputValidator` - - [ ] 위 칸과 아래 칸 중 건널수 있는 칸은 0과 1중 무작위 값을 이용해서 정한다. `Controller`/`BridgeMaker` from `Controller`/`BridgeRandomNumberGenerator` - - [ ] 0인 경우 위 칸인 `U`, 1인 경우 아래 칸인 `D`인 다리 리스트를 만든다. - `Controller`/`BridgeMaker` - - [ ] -### 3.`U` 또는 `D`를 입력받아 이동할 칸을 선택한다. - - [ ] 정해진 문자가 아니거나 입력이 없으면 예외를 던진다. `Validator`/`InputValidator` - - [ ] 예외가 발생할 경우, 다시 입력받도록 한다. `Controller`/`BridgeGame` - - [ ] 이동 후 생사여부를 update한다 `Controller`/`BridgeGame` -> `Model`/`UserBridge` + - [x] 입력받은 숫자(문자열)을 정수로 변환한다. `Domain`/`Converter` + - [x] 숫자가 아닌 입력일 경우(문자, 빈 문자열) 예외를 던진다. + - [x] 잘못된 입력일 경우, 올바른 입력이 될 때 까지 입력받는다. + - [x] 입력받은 숫자가 3 이상 20 이하인지 확인하고 아니면 예외를 던진다. - `Controller`/`BridgeMaker` from `Validator`/`InputValidator` + - [x] 0과 1을 다리 길이만큼 무작위로 생성한다. `Controller`/`BridgeMaker` from `Controller`/`BridgeRandomNumberGenerator` + - [x] 0인 경우 아랫 칸인 `D`, 1인 경우 윗 칸인 `U`인 다리 리스트를 만든다. - `Controller`/`BridgeMaker` +### 3.`U` 또는 `D`를 입력받아 이동할 칸을 선택한다. `View`/`InputView` + - [x] 정해진 문자가 아니거나 입력이 없으면 예외를 던진다. `Validator`/`InputValidator` + - [x] 예외가 발생할 경우, 다시 입력받도록 한다. `Controller`/`BridgeGame` + - [x] 이동 후 생사여부를 update한다 `Controller`/`BridgeGame` -> `Model`/`UserBridge` ### 4. 입력 결과를 출력한다. - - [ ] 건너온 칸들은 전부 O로 출력하고 생사여부에 따라 O, X를 출력을 결정한다. `View`/`OutputView` -### 5. 건너다 실패하면 재시작`R`, 종료`Q` 할 수 있다. + - [X] 건너온 칸들은 전부 O로 출력하고 칸 일치여부와 생사여부에 따라 O, X를 출력을 결정한다. `View`/`OutputView` + +### 5. 생사여부를 판별 후, 다음 행동을 결정한다. + + + #### 5-1. 죽었을 때 + - [ ] 건너다 실패하면 재시작 `R`, 종료 `Q` 할 수 있다. - [ ] 정해진 문자가 아니거나 입력이 없으면 예외를 던진다 `Validator`/`InputValidator` - - [ ] 잘못된 입력일 경우, 올바른 입력이 될 때 까지 입력받는다. + - [ ] 예외가 발생할 경우, 다시 입력받도록 한다. + - [ ] 재시작시 처음부터 다시 진행한다. + - [ ] 종료시 최종 결과를 출력하고 종료한다. + + #### 5-2. 살았을 때 +- [ ] 끝에 도달할 때 까지 계속 진행한다. +- [ ] 끝에 도달하면 결과를 출력하고 종료한다. + + +### 6. 결과 출력 `OutputView`/`printResult` + - [ ] 게임 성공 여부를 출력한다. + - [ ] 총 시도 횟수를 출력한다. + + @@ -112,9 +129,9 @@ - [ ] `Exception`이 아닌 `IllegalArgumentException`과 같이 명확하게 유형을 처리하였는가? - [ ] 입출력 요구 사항을 모두 지켰는가? - - [ ] 게임 시작 문구 - - [ ] 길이 입력 문구 - - [ ] 칸 입력 문구 + - [x] 게임 시작 문구 + - [x] 길이 입력 문구 + - [x] 칸 입력 문구 - [ ] 칸 입력 후 다리 상태 - [ ] 실패했을 시 재시도, 종료 여부 - [ ] 게임 성공 여부 및 시도 횟수 @@ -126,5 +143,5 @@ - [ ] `BridgeGame`의 메소드 이름을 변경하면 안된다. - [ ] `Bridge` - [ ] `InputView` 클래스에서만 `readLine()`을 사용한다. - - [ ] `BridgeRandomNumberGenerator`, `BridgeNumberGenerator`의 코드를 수정하면 안된다. - - [ ] `BridgeRandomNumberGenerator`, `BridgeNumberGenerator`의 패키지를 수정하면 안된다. + - [x] `BridgeRandomNumberGenerator`, `BridgeNumberGenerator`의 를 수정하면 안된다. + - [x] `BridgeRandomNumberGenerator`, `BridgeNumberGenerator`의 패키지를 수정하면 안된다. From 5b6369188e9c2321b668eb03fb9aab26dee4fdc7 Mon Sep 17 00:00:00 2001 From: swandevson Date: Fri, 18 Nov 2022 00:07:10 +0900 Subject: [PATCH 20/77] =?UTF-8?q?Fix(OutputView):=20import=20=EC=88=98?= =?UTF-8?q?=EC=A0=95?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- src/main/java/bridge/View/OutputView.java | 5 +++++ 1 file changed, 5 insertions(+) diff --git a/src/main/java/bridge/View/OutputView.java b/src/main/java/bridge/View/OutputView.java index 0e97e79bddf..61bd5982c3b 100644 --- a/src/main/java/bridge/View/OutputView.java +++ b/src/main/java/bridge/View/OutputView.java @@ -1,5 +1,10 @@ package bridge.View; +import bridge.Domain.BridgeGame; +import bridge.Domain.Player; + +import java.util.List; + /** * 사용자에게 게임 진행 상황과 결과를 출력하는 역할을 한다. */ From 4746de9c8bfed00453d92515bb03fb078c563951 Mon Sep 17 00:00:00 2001 From: swandevson Date: Fri, 18 Nov 2022 00:09:12 +0900 Subject: [PATCH 21/77] =?UTF-8?q?Feat(InputView,=20InputValidator):=20?= =?UTF-8?q?=EC=A2=85=EB=A3=8C/=EC=9E=AC=EC=8B=9C=EC=9E=91=20=EC=9E=85?= =?UTF-8?q?=EB=A0=A5?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit - 올바르지 않은 입력에 대한 검증 및 예외 throw --- src/main/java/bridge/Domain/InputValidator.java | 13 +++++++++++++ src/main/java/bridge/View/InputView.java | 17 ++++++++++++++--- 2 files changed, 27 insertions(+), 3 deletions(-) diff --git a/src/main/java/bridge/Domain/InputValidator.java b/src/main/java/bridge/Domain/InputValidator.java index f38d4c348a9..ddece33c8c7 100644 --- a/src/main/java/bridge/Domain/InputValidator.java +++ b/src/main/java/bridge/Domain/InputValidator.java @@ -7,8 +7,11 @@ public class InputValidator { private static final String EMPTY_INPUT = ERROR_PREFIX + "빈 문자입니다."; private static final String WRONG_SIZE_INPUT = ERROR_PREFIX + "숫자만 입력 가능합니다."; private static final String WRONG_SELECTION_INPUT = ERROR_PREFIX + "'U' 또는 'D'만 입력 가능합니다."; + private static final String WRONG_COMMAND_INPUT = ERROR_PREFIX + "종료를 위해서는 'Q', 재시작을 위해서는 'R을 입력해주세요."; private static final String SELECTION_UP = "U"; private static final String SELECTION_DOWN = "D"; + private static final String COMMAND_RETRY = "R"; + private static final String COMMAND_QUIT = "Q"; public static void validateNumberInput(String input) throws IllegalArgumentException { final String NOT_NUMBER_REGEX = "[^0-9]"; @@ -32,4 +35,14 @@ public static void validateSelectionInput(String input) throws IllegalArgumentEx } } + public static void validateCommandInput(String input) throws IllegalArgumentException { + if (input.isBlank()) { + throw new IllegalArgumentException(EMPTY_INPUT); + } + + if (!input.equals(COMMAND_RETRY) && !input.equals(COMMAND_QUIT)) { + throw new IllegalArgumentException(WRONG_COMMAND_INPUT); + } + } + } diff --git a/src/main/java/bridge/View/InputView.java b/src/main/java/bridge/View/InputView.java index 65b8267c7b1..7e01022baa9 100644 --- a/src/main/java/bridge/View/InputView.java +++ b/src/main/java/bridge/View/InputView.java @@ -1,6 +1,7 @@ package bridge.View; import bridge.Domain.InputConverter; +import bridge.Domain.InputValidator; import static camp.nextstep.edu.missionutils.Console.readLine; @@ -10,7 +11,8 @@ public class InputView { private final String START_GAME = "다리 건너기 게임을 시작합니다."; private final String INPUT_BRIDGE_SIZE = "다리의 길이를 입력해주세요."; - + private final String INPUT_SELECTION = "이동할 칸을 선택해주세요. (위: U, 아래: D)"; + private final String INPUT_COMMAND = "게임을 다시 시도할지 여부를 입력해주세요. (재시도: R, 종료: Q)"; /** * 다리의 길이를 입력받는다. */ @@ -53,7 +55,16 @@ public String readMoving() throws IllegalArgumentException { /** * 사용자가 게임을 다시 시도할지 종료할지 여부를 입력받는다. */ - public String readGameCommand() { - return null; + public String readGameCommand() throws IllegalArgumentException { + System.out.println(INPUT_COMMAND); + + String input = readLine(); + try { + InputValidator.validateCommandInput(input); + + return input; + } catch (IllegalArgumentException illegalArgumentException) { + throw illegalArgumentException; + } } } From 2c9c65d9499aab6b82f0f2afecabc4ae896af91d Mon Sep 17 00:00:00 2001 From: swandevson Date: Fri, 18 Nov 2022 00:10:43 +0900 Subject: [PATCH 22/77] =?UTF-8?q?Refactor(Applcation):=20=ED=95=A8?= =?UTF-8?q?=EC=88=98=20=EC=9D=B8=EC=9E=90=20=EB=A6=AC=ED=8C=A9=ED=86=A0?= =?UTF-8?q?=EB=A7=81?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit - View를 static으로 수정했으므로 인자로 넘겨줄 필요 X --- src/main/java/bridge/Application.java | 9 ++++----- 1 file changed, 4 insertions(+), 5 deletions(-) diff --git a/src/main/java/bridge/Application.java b/src/main/java/bridge/Application.java index 2d9403e8020..4e0e60b17b8 100644 --- a/src/main/java/bridge/Application.java +++ b/src/main/java/bridge/Application.java @@ -1,7 +1,6 @@ package bridge; import bridge.Domain.BridgeGame; -import bridge.Domain.Player; import bridge.View.InputView; import bridge.View.OutputView; @@ -9,7 +8,7 @@ public class Application { private static InputView inputView = new InputView(); private static OutputView outputView = new OutputView(); - public static BridgeGame initiateBridgeGame(InputView inputView) { + public static BridgeGame initiateBridgeGame() { boolean exceptionFlag = true; BridgeGame bridgeGame = null; @@ -30,7 +29,7 @@ public static BridgeGame initiateBridgeGame(InputView inputView) { return bridgeGame; } - public static void inputMoving(InputView inputView, BridgeGame bridgeGame) { + public static void inputMoving(BridgeGame bridgeGame) { boolean exceptionFlag = true; while(exceptionFlag) { exceptionFlag = false; @@ -47,14 +46,14 @@ public static void inputMoving(InputView inputView, BridgeGame bridgeGame) { public static void run(BridgeGame bridgeGame) { while(!bridgeGame.winGame() && !bridgeGame.isPlayerDead()) { - inputMoving(inputView, bridgeGame); + inputMoving(bridgeGame); outputView.printMap(bridgeGame); bridgeGame.updatePlayer(); } } public static void main(String[] args) { - BridgeGame bridgeGame = initiateBridgeGame(inputView); + BridgeGame bridgeGame = initiateBridgeGame(); run(bridgeGame); outputView.printResult(bridgeGame); From 7b3e03d0dcd08541d0ae7ec1620b0fbbe62bf4bd Mon Sep 17 00:00:00 2001 From: swandevson Date: Fri, 18 Nov 2022 00:29:43 +0900 Subject: [PATCH 23/77] =?UTF-8?q?Fix(BridgeBlockTest):=20=EC=83=9D?= =?UTF-8?q?=EC=84=B1=20=EB=B2=88=ED=98=B8=EC=97=90=20=EB=94=B0=EB=A5=B8=20?= =?UTF-8?q?=EB=B0=98=ED=99=98=20=EB=AC=B8=EC=9E=90=20=ED=85=8C=EC=8A=A4?= =?UTF-8?q?=ED=8A=B8=20=EC=BD=94=EB=93=9C=20=EC=88=98=EC=A0=95?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- src/test/java/bridge/Domain/BridgeBlockTest.java | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/src/test/java/bridge/Domain/BridgeBlockTest.java b/src/test/java/bridge/Domain/BridgeBlockTest.java index bb796d27583..1f9c33b1389 100644 --- a/src/test/java/bridge/Domain/BridgeBlockTest.java +++ b/src/test/java/bridge/Domain/BridgeBlockTest.java @@ -16,11 +16,11 @@ class BridgeBlockTest { class StringReturnTest { @Test void 반환_올바른_문자_UP() { - assertThat(BridgeBlock.getBlockIdentifier(0)).isEqualTo("U"); + assertThat(BridgeBlock.getBlockIdentifier(0)).isEqualTo("D"); } @Test void 반환_올바른_문자_DOWN() { - assertThat(BridgeBlock.getBlockIdentifier(1)).isEqualTo("D"); + assertThat(BridgeBlock.getBlockIdentifier(1)).isEqualTo("U"); } } } \ No newline at end of file From 150b2d9153ddcdca6dc4054f9109f6adca6fb8b7 Mon Sep 17 00:00:00 2001 From: swandevson Date: Fri, 18 Nov 2022 01:29:02 +0900 Subject: [PATCH 24/77] =?UTF-8?q?Feat(Application,=20Player):=20=EC=8B=A4?= =?UTF-8?q?=ED=8C=A8=20=EC=8B=9C=20=EC=9E=AC=EC=9E=85=EB=A0=A5=20=EA=B8=B0?= =?UTF-8?q?=EB=8A=A5=20=EC=B6=94=EA=B0=80?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit - 게임을 이기거나 죽으면 게임 종료 - 죽었을 경우, 재시작할지 종료할지 입력받고 이를 처리 - 재시작할 경우, 다리는 그대로 두고 플레이어는 처음부터 다시 시작한다. --- src/main/java/bridge/Application.java | 23 ++++++++++++++++++++++- src/main/java/bridge/Domain/Player.java | 6 ++++++ 2 files changed, 28 insertions(+), 1 deletion(-) diff --git a/src/main/java/bridge/Application.java b/src/main/java/bridge/Application.java index 4e0e60b17b8..288dcfd27d3 100644 --- a/src/main/java/bridge/Application.java +++ b/src/main/java/bridge/Application.java @@ -44,6 +44,21 @@ public static void inputMoving(BridgeGame bridgeGame) { } } + public static void inputCommand(BridgeGame bridgeGame) { + boolean exceptionFlag = true; + + while(exceptionFlag) { + exceptionFlag = false; + try { + String command = inputView.readGameCommand(); + bridgeGame.retry(command); + } catch (IllegalArgumentException illegalArgumentException) { + System.out.println(illegalArgumentException.getMessage()); + exceptionFlag = true; + } + } + } + public static void run(BridgeGame bridgeGame) { while(!bridgeGame.winGame() && !bridgeGame.isPlayerDead()) { inputMoving(bridgeGame); @@ -55,7 +70,13 @@ public static void run(BridgeGame bridgeGame) { public static void main(String[] args) { BridgeGame bridgeGame = initiateBridgeGame(); - run(bridgeGame); + do { + run(bridgeGame); + if (bridgeGame.isPlayerDead()) { + inputCommand(bridgeGame); + } + } while(bridgeGame.winGame() || bridgeGame.isPlayerDead()); + outputView.printResult(bridgeGame); } } diff --git a/src/main/java/bridge/Domain/Player.java b/src/main/java/bridge/Domain/Player.java index a7dcd55ba04..2752b2edd43 100644 --- a/src/main/java/bridge/Domain/Player.java +++ b/src/main/java/bridge/Domain/Player.java @@ -37,4 +37,10 @@ public void die() { public void success() { this.nextLocation++; } + + public void revive() { + this.alive = true; + this.nextLocation = 0; + } + } From c1608150a7e80619a4451fffa67d894537014427 Mon Sep 17 00:00:00 2001 From: swandevson Date: Fri, 18 Nov 2022 01:30:48 +0900 Subject: [PATCH 25/77] =?UTF-8?q?Fix(BridgeGame):=20=EC=9E=AC=EC=8B=9C?= =?UTF-8?q?=EC=9E=91=EC=8B=9C=20=EC=9C=84=EC=B9=98=20=EC=B4=88=EA=B8=B0?= =?UTF-8?q?=ED=99=94?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- src/main/java/bridge/Domain/BridgeGame.java | 7 +++++-- 1 file changed, 5 insertions(+), 2 deletions(-) diff --git a/src/main/java/bridge/Domain/BridgeGame.java b/src/main/java/bridge/Domain/BridgeGame.java index ed9f2099b43..ce6d8a09c59 100644 --- a/src/main/java/bridge/Domain/BridgeGame.java +++ b/src/main/java/bridge/Domain/BridgeGame.java @@ -42,8 +42,11 @@ public void move(String playerSelection) { *

* 재시작을 위해 필요한 메서드의 반환 타입(return type), 인자(parameter)는 자유롭게 추가하거나 변경할 수 있다. */ - public void retry() { - this.retryCount++; + public void retry(String command) { + if (command.equals("R")) { + player.revive(); + this.retryCount++; + } } From f5f2145a4c997cf42ba5006e4a4b8f0ec4e2feac Mon Sep 17 00:00:00 2001 From: swandevson Date: Fri, 18 Nov 2022 01:46:20 +0900 Subject: [PATCH 26/77] =?UTF-8?q?Fix(Application):=20=EA=B2=8C=EC=9E=84=20?= =?UTF-8?q?=EC=8B=A4=ED=96=89=20=EC=A1=B0=EA=B1=B4=20=EC=88=98=EC=A0=95?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- src/main/java/bridge/Application.java | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/main/java/bridge/Application.java b/src/main/java/bridge/Application.java index 288dcfd27d3..518551200f5 100644 --- a/src/main/java/bridge/Application.java +++ b/src/main/java/bridge/Application.java @@ -75,7 +75,7 @@ public static void main(String[] args) { if (bridgeGame.isPlayerDead()) { inputCommand(bridgeGame); } - } while(bridgeGame.winGame() || bridgeGame.isPlayerDead()); + } while(!bridgeGame.winGame() && !bridgeGame.isPlayerDead()); outputView.printResult(bridgeGame); } From 506b11de40d4169fabd16dcb76c5dc6af82f1893 Mon Sep 17 00:00:00 2001 From: swandevson Date: Fri, 18 Nov 2022 01:49:58 +0900 Subject: [PATCH 27/77] =?UTF-8?q?Docs(README.md):=20=EC=B2=B4=ED=81=AC?= =?UTF-8?q?=EB=A6=AC=EC=8A=A4=ED=8A=B8=20=EA=B0=B1=EC=8B=A0?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- docs/README.md | 23 +++++++++++------------ 1 file changed, 11 insertions(+), 12 deletions(-) diff --git a/docs/README.md b/docs/README.md index 355d4862436..0377a1e602d 100644 --- a/docs/README.md +++ b/docs/README.md @@ -33,21 +33,20 @@ - [X] 건너온 칸들은 전부 O로 출력하고 칸 일치여부와 생사여부에 따라 O, X를 출력을 결정한다. `View`/`OutputView` ### 5. 생사여부를 판별 후, 다음 행동을 결정한다. - - #### 5-1. 죽었을 때 - - [ ] 건너다 실패하면 재시작 `R`, 종료 `Q` 할 수 있다. - - [ ] 정해진 문자가 아니거나 입력이 없으면 예외를 던진다 `Validator`/`InputValidator` - - [ ] 예외가 발생할 경우, 다시 입력받도록 한다. - - [ ] 재시작시 처음부터 다시 진행한다. - - [ ] 종료시 최종 결과를 출력하고 종료한다. + - [x] 건너다 실패하면 재시작 `R`, 종료 `Q` 할 수 있다. + - [x] 정해진 문자가 아니거나 입력이 없으면 예외를 던진다 `Validator`/`InputValidator` + - [x] 예외가 발생할 경우, 다시 입력받도록 한다. + - [x] 재시작시 처음부터 다시 진행한다. + - [x] 종료시 최종 결과를 출력하고 종료한다. #### 5-2. 살았을 때 -- [ ] 끝에 도달할 때 까지 계속 진행한다. -- [ ] 끝에 도달하면 결과를 출력하고 종료한다. +- [x] 끝에 도달할 때 까지 계속 진행한다. +- [x] 끝에 도달하면 결과를 출력하고 종료한다. ### 6. 결과 출력 `OutputView`/`printResult` + - [ ] 최고 기록을 출력한다. - [ ] 게임 성공 여부를 출력한다. - [ ] 총 시도 횟수를 출력한다. @@ -132,9 +131,9 @@ - [x] 게임 시작 문구 - [x] 길이 입력 문구 - [x] 칸 입력 문구 - - [ ] 칸 입력 후 다리 상태 - - [ ] 실패했을 시 재시도, 종료 여부 - - [ ] 게임 성공 여부 및 시도 횟수 + - [x] 칸 입력 후 다리 상태 + - [x] 실패했을 시 재시도, 종료 여부 + - [x] 게임 성공 여부 및 시도 횟수 - [ ] 함수(또는 메소드)의 길이가 10라인 미만인가? (빈줄 포함) - [ ] 함수(또는 메소드)의 파라미터가 3개 이하인가? - [ ] 클래스 제약 사항들을 모두 지켰는가? From 55cd75593965410ada4b8564e2756af92aa3d496 Mon Sep 17 00:00:00 2001 From: swandevson Date: Fri, 18 Nov 2022 02:22:43 +0900 Subject: [PATCH 28/77] =?UTF-8?q?Test(ApplicationTest):=20=EC=9E=AC?= =?UTF-8?q?=EC=9E=85=EB=A0=A5=20=EB=8F=99=EC=9E=91=EC=97=90=20=EB=8C=80?= =?UTF-8?q?=ED=95=9C=20=ED=85=8C=EC=8A=A4=ED=8A=B8?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- src/test/java/bridge/ApplicationTest.java | 36 +++++++++++++++++++++++ 1 file changed, 36 insertions(+) diff --git a/src/test/java/bridge/ApplicationTest.java b/src/test/java/bridge/ApplicationTest.java index 1a163ec0a2a..a4566e1e2cd 100644 --- a/src/test/java/bridge/ApplicationTest.java +++ b/src/test/java/bridge/ApplicationTest.java @@ -39,6 +39,42 @@ class ApplicationTest extends NsTest { }, 1, 0, 1); } + @Test + void 기능_테스트_실패_후_성공() { + assertRandomNumberInRangeTest(() -> { + run("3", "U", "U", "R", "D", "R", "U", "D", "U"); + assertThat(output()).contains( + "[ O | X ]", + "[ | ]", + "[ ]", + "[ X ]", + "최종 게임 결과", + "[ O | | O ]", + "[ | O | ]", + "게임 성공 여부: 성공", + "총 시도한 횟수: 3" + ); + }, 1, 0, 1); + } + + @Test + void 기능_테스트_실패_후_종료() { + assertRandomNumberInRangeTest(() -> { + run("3", "U", "U", "R", "D", "Q"); + assertThat(output()).contains( + "[ O | X ]", + "[ | ]", + "[ ]", + "[ X ]", + "최종 게임 결과", + "[ O | X ]", + "[ | ]", + "게임 성공 여부: 실패", + "총 시도한 횟수: 2" + ); + }, 1, 0, 1); + } + @Test void 예외_테스트() { assertSimpleTest(() -> { From 5c68f0704be2c8c8424f5ead9f327cd19f4d45e0 Mon Sep 17 00:00:00 2001 From: swandevson Date: Fri, 18 Nov 2022 02:30:26 +0900 Subject: [PATCH 29/77] =?UTF-8?q?Feat(BridgeGame):=20=EC=B5=9C=EB=8C=80=20?= =?UTF-8?q?=EB=84=98=EC=96=B4=EA=B0=84=20=EA=B0=AF=EC=88=98=EB=A5=BC=20?= =?UTF-8?q?=EC=A0=80=EC=9E=A5?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit - 게임에서 이길 시 갱신 - 게임에서 재시도하거나 종료할 시 갱신 --- src/main/java/bridge/Domain/BridgeGame.java | 10 ++++++++++ 1 file changed, 10 insertions(+) diff --git a/src/main/java/bridge/Domain/BridgeGame.java b/src/main/java/bridge/Domain/BridgeGame.java index ce6d8a09c59..9ad1a67943c 100644 --- a/src/main/java/bridge/Domain/BridgeGame.java +++ b/src/main/java/bridge/Domain/BridgeGame.java @@ -9,6 +9,7 @@ public class BridgeGame { Bridge bridge; Player player; private int retryCount; + private int maxPassedCount; public BridgeGame(int size) throws IllegalArgumentException { @@ -16,6 +17,7 @@ public BridgeGame(int size) throws IllegalArgumentException { this.bridge = new Bridge(size); this.player = new Player(); this.retryCount = 1; + this.maxPassedCount = 0; } catch (IllegalArgumentException illegalArgumentException) { throw illegalArgumentException; } @@ -43,6 +45,9 @@ public void move(String playerSelection) { * 재시작을 위해 필요한 메서드의 반환 타입(return type), 인자(parameter)는 자유롭게 추가하거나 변경할 수 있다. */ public void retry(String command) { + if (this.maxPassedCount < player.getNextLocation()) { + this.maxPassedCount = player.getNextLocation(); + } if (command.equals("R")) { player.revive(); this.retryCount++; @@ -56,6 +61,7 @@ public boolean winGame() { // 다음에 이동할 곳이 인덱스를 벗어날 경우 끝에 도달한 것 if (bridgeStates.size() <= playerNextLocation) { + this.maxPassedCount = playerNextLocation - 1; return true; } @@ -87,4 +93,8 @@ public Player getPlayer() { public int getRetryCount() { return this.retryCount; } + + public int getMaxPassedCount() { + return this.maxPassedCount; + } } From 0af4bfc5df7547e38a7049f144195210f002b6f6 Mon Sep 17 00:00:00 2001 From: swandevson Date: Fri, 18 Nov 2022 02:40:56 +0900 Subject: [PATCH 30/77] =?UTF-8?q?Refactor(OutputView):=20=ED=95=9C=20?= =?UTF-8?q?=EC=B8=B5=20=EC=B6=9C=EB=A0=A5=20=EC=9D=B8=EC=9E=90=20=EB=B3=80?= =?UTF-8?q?=EA=B2=BD,=20=EB=A9=94=EC=86=8C=EB=93=9C=EB=AA=85=20=EB=B3=80?= =?UTF-8?q?=EA=B2=BD?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit - 확장성을 위해 player가 아닌 지나간 칸 수를 인자로 넘김 - 의미 혼란을 막기 위한 메소드명 변경 --- src/main/java/bridge/View/OutputView.java | 11 +++++------ 1 file changed, 5 insertions(+), 6 deletions(-) diff --git a/src/main/java/bridge/View/OutputView.java b/src/main/java/bridge/View/OutputView.java index 61bd5982c3b..a33b353d20d 100644 --- a/src/main/java/bridge/View/OutputView.java +++ b/src/main/java/bridge/View/OutputView.java @@ -9,7 +9,7 @@ * 사용자에게 게임 진행 상황과 결과를 출력하는 역할을 한다. */ public class OutputView { - private String printLastStair(Player player, String stair) { + private String printSelectedStair(Player player, String stair) { if (!stair.equals(player.getLastSelection())) { return " "; } @@ -21,10 +21,10 @@ private String printLastStair(Player player, String stair) { return " O "; } - private String printPassedStair(List bridgeStates, Player player, String stair) { + private String printPassedStair(List bridgeStates, int passedCount, String stair) { String result = ""; - for (int bridgeLocation = 0; bridgeLocation < player.getNextLocation() - 1; bridgeLocation++) { + for (int bridgeLocation = 0; bridgeLocation < passedCount; bridgeLocation++) { String state = " "; if (stair.equals(bridgeStates.get(bridgeLocation))) { state = " O "; @@ -38,8 +38,8 @@ private String printPassedStair(List bridgeStates, Player player, String private void printStair(List bridgeStates, Player player, String stair) { String result = "["; - result += printPassedStair(bridgeStates, player, stair); - result += printLastStair(player, stair); + result += printPassedStair(bridgeStates, player.getNextLocation(), stair); + result += printSelectedStair(player, stair); result += "]"; System.out.println(result); @@ -49,7 +49,6 @@ public void printMap(BridgeGame bridgeGame) { List bridgeState = bridgeGame.getBridgeStates(); Player player = bridgeGame.getPlayer(); - System.out.println(player.getNextLocation()); printStair(bridgeState, player, "U"); printStair(bridgeState, player, "D"); System.out.println(); From 4594962a47e7c5e99c76cbcb4ce75ce2dfa4900c Mon Sep 17 00:00:00 2001 From: swandevson Date: Fri, 18 Nov 2022 02:41:41 +0900 Subject: [PATCH 31/77] =?UTF-8?q?Feat(OutputView):=20=EC=B5=9C=EC=A2=85=20?= =?UTF-8?q?=EA=B2=8C=EC=9E=84=20=EA=B2=B0=EA=B3=BC=EB=AC=B8=20=EC=B6=9C?= =?UTF-8?q?=EB=A0=A5?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- src/main/java/bridge/View/OutputView.java | 29 ++++++++++++++++++++++- 1 file changed, 28 insertions(+), 1 deletion(-) diff --git a/src/main/java/bridge/View/OutputView.java b/src/main/java/bridge/View/OutputView.java index a33b353d20d..6f04f3ab10b 100644 --- a/src/main/java/bridge/View/OutputView.java +++ b/src/main/java/bridge/View/OutputView.java @@ -67,9 +67,36 @@ private String printIsSuccess(BridgeGame bridgeGame) { return "성공"; } + + private String printLastStair(BridgeGame bridgeGame, String stair) { + List bridgeStates = bridgeGame.getBridgeStates(); + String bridgeState = bridgeStates.get(bridgeGame.getMaxPassedCount()); + + if (!bridgeState.equals(stair)) { + return " "; + } + + if (bridgeGame.isPlayerDead()) { + return " X "; + } + + return " O "; + } + + private void printResultStair(BridgeGame bridgeGame, String stair) { + String result = "["; + result += printPassedStair(bridgeGame.getBridgeStates(), bridgeGame.getMaxPassedCount(), stair); + result += printLastStair(bridgeGame, stair); + result += "]"; + + System.out.println(result); + } + public void printResult(BridgeGame bridgeGame) { System.out.println("최종 게임 결과"); - printMap(bridgeGame); + + printResultStair(bridgeGame, "U"); + printResultStair(bridgeGame, "D"); System.out.println("게임 성공 여부: " + printIsSuccess(bridgeGame)); System.out.println("총 시도한 횟수: " + bridgeGame.getRetryCount()); From 2095caca3db1f970307ec9395c59c7d3d599bfbb Mon Sep 17 00:00:00 2001 From: swandevson Date: Fri, 18 Nov 2022 12:14:30 +0900 Subject: [PATCH 32/77] =?UTF-8?q?Refactor(Applcation):=20=EC=9E=AC?= =?UTF-8?q?=EC=9E=85=EB=A0=A5=20=EB=A6=AC=ED=8C=A9=ED=86=A0=EB=A7=81?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit - 조기 반환으로 함수 종료하도록 함 --- src/main/java/bridge/Application.java | 31 ++++++++++----------------- 1 file changed, 11 insertions(+), 20 deletions(-) diff --git a/src/main/java/bridge/Application.java b/src/main/java/bridge/Application.java index 518551200f5..867583da0da 100644 --- a/src/main/java/bridge/Application.java +++ b/src/main/java/bridge/Application.java @@ -1,5 +1,6 @@ package bridge; +import bridge.Domain.Bridge; import bridge.Domain.BridgeGame; import bridge.View.InputView; import bridge.View.OutputView; @@ -8,53 +9,43 @@ public class Application { private static InputView inputView = new InputView(); private static OutputView outputView = new OutputView(); - public static BridgeGame initiateBridgeGame() { - boolean exceptionFlag = true; - BridgeGame bridgeGame = null; + public static BridgeGame initiateBridgeGame() { inputView.printStartMessage(); - while(exceptionFlag) { - exceptionFlag = false; - + while(true) { try { int size = inputView.readBridgeSize(); - bridgeGame = new BridgeGame(size); + + return new BridgeGame(size); } catch (IllegalArgumentException illegalArgumentException) { System.out.println(illegalArgumentException.getMessage()); - exceptionFlag = true; } } - - return bridgeGame; } public static void inputMoving(BridgeGame bridgeGame) { - boolean exceptionFlag = true; - while(exceptionFlag) { - exceptionFlag = false; - + while(true) { try { String selection = inputView.readMoving(); bridgeGame.move(selection); + + return; } catch (IllegalArgumentException illegalArgumentException) { System.out.println(illegalArgumentException.getMessage()); - exceptionFlag = true; } } } public static void inputCommand(BridgeGame bridgeGame) { - boolean exceptionFlag = true; - - while(exceptionFlag) { - exceptionFlag = false; + while(true) { try { String command = inputView.readGameCommand(); bridgeGame.retry(command); + + return; } catch (IllegalArgumentException illegalArgumentException) { System.out.println(illegalArgumentException.getMessage()); - exceptionFlag = true; } } } From 39dbf2eccb2f5d58c3057d40192c5bdd044eb8cc Mon Sep 17 00:00:00 2001 From: swandevson Date: Fri, 18 Nov 2022 15:22:35 +0900 Subject: [PATCH 33/77] =?UTF-8?q?Refactor:=20=EB=AC=B8=EC=9E=90=EC=97=B4?= =?UTF-8?q?=EC=9D=84=20=EC=83=81=EC=88=98=20=ED=81=B4=EB=9E=98=EC=8A=A4?= =?UTF-8?q?=EB=A1=9C=20=EB=B6=84=EB=A6=AC?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit - 문자열을 상수클래스로 분리 - 값이 필요한 출력의 경우 문자열 포맷팅 형식으로 지정 - 클래스 분리에 따른 View 리팩토링 --- .../java/bridge/Constant/ErrorMessage.java | 9 +++ .../java/bridge/Constant/InputMessage.java | 8 +++ src/main/java/bridge/Constant/InputValue.java | 8 +++ .../java/bridge/Constant/OutputMessage.java | 9 +++ .../java/bridge/Constant/OutputValue.java | 10 ++++ .../java/bridge/Domain/InputValidator.java | 14 ++--- src/main/java/bridge/View/InputView.java | 14 ++--- src/main/java/bridge/View/OutputView.java | 55 ++++++++++--------- 8 files changed, 82 insertions(+), 45 deletions(-) create mode 100644 src/main/java/bridge/Constant/ErrorMessage.java create mode 100644 src/main/java/bridge/Constant/InputMessage.java create mode 100644 src/main/java/bridge/Constant/InputValue.java create mode 100644 src/main/java/bridge/Constant/OutputMessage.java create mode 100644 src/main/java/bridge/Constant/OutputValue.java diff --git a/src/main/java/bridge/Constant/ErrorMessage.java b/src/main/java/bridge/Constant/ErrorMessage.java new file mode 100644 index 00000000000..777080f7084 --- /dev/null +++ b/src/main/java/bridge/Constant/ErrorMessage.java @@ -0,0 +1,9 @@ +package bridge.Constant; + +public class ErrorMessage { + public static final String ERROR_PREFIX = "[ERROR]"; + public static final String EMPTY_INPUT = ERROR_PREFIX + "빈 문자입니다."; + public static final String WRONG_SIZE_INPUT = ERROR_PREFIX + "숫자만 입력 가능합니다."; + public static final String WRONG_SELECTION_INPUT = ERROR_PREFIX + "'U' 또는 'D'만 입력 가능합니다."; + public static final String WRONG_COMMAND_INPUT = ERROR_PREFIX + "종료를 위해서는 'Q', 재시작을 위해서는 'R을 입력해주세요."; +} diff --git a/src/main/java/bridge/Constant/InputMessage.java b/src/main/java/bridge/Constant/InputMessage.java new file mode 100644 index 00000000000..18a9e391260 --- /dev/null +++ b/src/main/java/bridge/Constant/InputMessage.java @@ -0,0 +1,8 @@ +package bridge.Constant; + +public class InputMessage { + public static final String START_GAME = "다리 건너기 게임을 시작합니다."; + public static final String INPUT_BRIDGE_SIZE = "다리의 길이를 입력해주세요."; + public static final String INPUT_SELECTION = "이동할 칸을 선택해주세요. (위: U, 아래: D)"; + public static final String INPUT_COMMAND = "게임을 다시 시도할지 여부를 입력해주세요. (재시도: R, 종료: Q)"; +} diff --git a/src/main/java/bridge/Constant/InputValue.java b/src/main/java/bridge/Constant/InputValue.java new file mode 100644 index 00000000000..b51d7a9b780 --- /dev/null +++ b/src/main/java/bridge/Constant/InputValue.java @@ -0,0 +1,8 @@ +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"; +} diff --git a/src/main/java/bridge/Constant/OutputMessage.java b/src/main/java/bridge/Constant/OutputMessage.java new file mode 100644 index 00000000000..f8da0166f9d --- /dev/null +++ b/src/main/java/bridge/Constant/OutputMessage.java @@ -0,0 +1,9 @@ +package bridge.Constant; + +public class OutputMessage { + + public static final String RESULT_MESSAGE = "최종 게임 결과"; + public static final String BRIDGE_MAP = "[%s]" + System.lineSeparator(); + public static final String IS_SUCCESS = "게임 성공 여부: %s" + System.lineSeparator(); + public static final String RETRY_COUNT = "총 시도한 횟수: %d" + System.lineSeparator(); +} diff --git a/src/main/java/bridge/Constant/OutputValue.java b/src/main/java/bridge/Constant/OutputValue.java new file mode 100644 index 00000000000..169e8daab39 --- /dev/null +++ b/src/main/java/bridge/Constant/OutputValue.java @@ -0,0 +1,10 @@ +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 = "실패"; +} diff --git a/src/main/java/bridge/Domain/InputValidator.java b/src/main/java/bridge/Domain/InputValidator.java index ddece33c8c7..24bbb88fe81 100644 --- a/src/main/java/bridge/Domain/InputValidator.java +++ b/src/main/java/bridge/Domain/InputValidator.java @@ -1,17 +1,11 @@ package bridge.Domain; -import org.junit.platform.commons.util.StringUtils; +import static bridge.Constant.ErrorMessage.*; +import static bridge.Constant.InputValue.*; public class InputValidator { - private static final String ERROR_PREFIX = "[ERROR]"; - private static final String EMPTY_INPUT = ERROR_PREFIX + "빈 문자입니다."; - private static final String WRONG_SIZE_INPUT = ERROR_PREFIX + "숫자만 입력 가능합니다."; - private static final String WRONG_SELECTION_INPUT = ERROR_PREFIX + "'U' 또는 'D'만 입력 가능합니다."; - private static final String WRONG_COMMAND_INPUT = ERROR_PREFIX + "종료를 위해서는 'Q', 재시작을 위해서는 'R을 입력해주세요."; - private static final String SELECTION_UP = "U"; - private static final String SELECTION_DOWN = "D"; - private static final String COMMAND_RETRY = "R"; - private static final String COMMAND_QUIT = "Q"; + + public static void validateNumberInput(String input) throws IllegalArgumentException { final String NOT_NUMBER_REGEX = "[^0-9]"; diff --git a/src/main/java/bridge/View/InputView.java b/src/main/java/bridge/View/InputView.java index 7e01022baa9..114ce4265ee 100644 --- a/src/main/java/bridge/View/InputView.java +++ b/src/main/java/bridge/View/InputView.java @@ -2,6 +2,7 @@ import bridge.Domain.InputConverter; import bridge.Domain.InputValidator; +import bridge.Constant.InputMessage; import static camp.nextstep.edu.missionutils.Console.readLine; @@ -9,19 +10,16 @@ * 사용자로부터 입력을 받는 역할을 한다. */ public class InputView { - private final String START_GAME = "다리 건너기 게임을 시작합니다."; - private final String INPUT_BRIDGE_SIZE = "다리의 길이를 입력해주세요."; - private final String INPUT_SELECTION = "이동할 칸을 선택해주세요. (위: U, 아래: D)"; - private final String INPUT_COMMAND = "게임을 다시 시도할지 여부를 입력해주세요. (재시도: R, 종료: Q)"; + /** * 다리의 길이를 입력받는다. */ public void printStartMessage() { - System.out.println(START_GAME); + System.out.println(InputMessage.START_GAME); } public int readBridgeSize() throws IllegalArgumentException { - System.out.println(INPUT_BRIDGE_SIZE); + System.out.println(InputMessage.INPUT_BRIDGE_SIZE); String input = readLine(); @@ -40,7 +38,7 @@ public int readBridgeSize() throws IllegalArgumentException { * 사용자가 이동할 칸을 입력받는다. */ public String readMoving() throws IllegalArgumentException { - System.out.println(INPUT_SELECTION); + System.out.println(InputMessage.INPUT_SELECTION); String input = readLine(); try { @@ -56,7 +54,7 @@ public String readMoving() throws IllegalArgumentException { * 사용자가 게임을 다시 시도할지 종료할지 여부를 입력받는다. */ public String readGameCommand() throws IllegalArgumentException { - System.out.println(INPUT_COMMAND); + System.out.println(InputMessage.INPUT_COMMAND); String input = readLine(); try { diff --git a/src/main/java/bridge/View/OutputView.java b/src/main/java/bridge/View/OutputView.java index 6f04f3ab10b..b69f257b695 100644 --- a/src/main/java/bridge/View/OutputView.java +++ b/src/main/java/bridge/View/OutputView.java @@ -2,6 +2,9 @@ import bridge.Domain.BridgeGame; import bridge.Domain.Player; +import bridge.Constant.InputValue; +import bridge.Constant.OutputMessage; +import bridge.Constant.OutputValue; import java.util.List; @@ -9,27 +12,27 @@ * 사용자에게 게임 진행 상황과 결과를 출력하는 역할을 한다. */ public class OutputView { - private String printSelectedStair(Player player, String stair) { + private String printSelectedStair(Player player, String stair) { if (!stair.equals(player.getLastSelection())) { - return " "; + return OutputValue.NOT_SELECTION; } if (!player.isAlive()) { - return " X "; + return OutputValue.WRONG_SELECTION; } - return " O "; + return OutputValue.RIGHT_SELECTION; } private String printPassedStair(List bridgeStates, int passedCount, String stair) { String result = ""; for (int bridgeLocation = 0; bridgeLocation < passedCount; bridgeLocation++) { - String state = " "; + String state = OutputValue.NOT_SELECTION; if (stair.equals(bridgeStates.get(bridgeLocation))) { - state = " O "; + state = OutputValue.RIGHT_SELECTION; } - state += "|"; + state += OutputValue.SEPARATOR; result += state; } @@ -37,20 +40,19 @@ private String printPassedStair(List bridgeStates, int passedCount, Stri } private void printStair(List bridgeStates, Player player, String stair) { - String result = "["; - result += printPassedStair(bridgeStates, player.getNextLocation(), stair); + String result; + result = printPassedStair(bridgeStates, player.getNextLocation(), stair); result += printSelectedStair(player, stair); - result += "]"; - System.out.println(result); + System.out.printf(OutputMessage.BRIDGE_MAP, result); } public void printMap(BridgeGame bridgeGame) { List bridgeState = bridgeGame.getBridgeStates(); Player player = bridgeGame.getPlayer(); - printStair(bridgeState, player, "U"); - printStair(bridgeState, player, "D"); + printStair(bridgeState, player, InputValue.SELECTION_UP); + printStair(bridgeState, player, InputValue.SELECTION_DOWN); System.out.println(); } @@ -62,10 +64,10 @@ public void printMap(BridgeGame bridgeGame) { private String printIsSuccess(BridgeGame bridgeGame) { if (bridgeGame.isPlayerDead()) { - return "실패"; + return OutputValue.FAIL; } - return "성공"; + return OutputValue.SUCCESS; } private String printLastStair(BridgeGame bridgeGame, String stair) { @@ -73,32 +75,31 @@ private String printLastStair(BridgeGame bridgeGame, String stair) { String bridgeState = bridgeStates.get(bridgeGame.getMaxPassedCount()); if (!bridgeState.equals(stair)) { - return " "; + return OutputValue.NOT_SELECTION; } if (bridgeGame.isPlayerDead()) { - return " X "; + return OutputValue.WRONG_SELECTION; } - return " O "; + return OutputValue.RIGHT_SELECTION; } private void printResultStair(BridgeGame bridgeGame, String stair) { - String result = "["; - result += printPassedStair(bridgeGame.getBridgeStates(), bridgeGame.getMaxPassedCount(), stair); + String result; + result = printPassedStair(bridgeGame.getBridgeStates(), bridgeGame.getMaxPassedCount(), stair); result += printLastStair(bridgeGame, stair); - result += "]"; - System.out.println(result); + System.out.printf(OutputMessage.BRIDGE_MAP, result); } public void printResult(BridgeGame bridgeGame) { - System.out.println("최종 게임 결과"); + System.out.println(OutputMessage.RESULT_MESSAGE); - printResultStair(bridgeGame, "U"); - printResultStair(bridgeGame, "D"); + printResultStair(bridgeGame, InputValue.SELECTION_UP); + printResultStair(bridgeGame, InputValue.SELECTION_DOWN); - System.out.println("게임 성공 여부: " + printIsSuccess(bridgeGame)); - System.out.println("총 시도한 횟수: " + bridgeGame.getRetryCount()); + System.out.printf(OutputMessage.IS_SUCCESS, printIsSuccess(bridgeGame)); + System.out.printf(OutputMessage.RETRY_COUNT, bridgeGame.getRetryCount()); } } From 53122902ebfe16201c092b068f1f014fe8aa3399 Mon Sep 17 00:00:00 2001 From: swandevson Date: Fri, 18 Nov 2022 16:28:55 +0900 Subject: [PATCH 34/77] =?UTF-8?q?Chore:=20Model,=20Controller,=20View?= =?UTF-8?q?=EB=A1=9C=20=EB=B6=84=EB=A6=AC?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- src/main/java/bridge/Application.java | 3 +-- src/main/java/bridge/BridgeMaker.java | 2 +- src/main/java/bridge/{Domain => Controller}/BridgeGame.java | 5 ++++- .../java/bridge/{Domain => Controller}/InputConverter.java | 2 +- .../java/bridge/{Domain => Controller}/InputValidator.java | 2 +- src/main/java/bridge/{Domain => Model}/Bridge.java | 2 +- src/main/java/bridge/{Domain => Model}/BridgeBlock.java | 2 +- src/main/java/bridge/{Domain => Model}/Player.java | 2 +- src/main/java/bridge/View/InputView.java | 4 ++-- src/main/java/bridge/View/OutputView.java | 4 ++-- src/test/java/bridge/Domain/BridgeBlockTest.java | 4 +--- src/test/java/bridge/Domain/BridgeGameTest.java | 1 + src/test/java/bridge/Domain/BridgeTest.java | 1 + src/test/java/bridge/Domain/InputConverterTest.java | 3 +-- src/test/java/bridge/Domain/InputValidatorTest.java | 3 +-- 15 files changed, 20 insertions(+), 20 deletions(-) rename src/main/java/bridge/{Domain => Controller}/BridgeGame.java (96%) rename src/main/java/bridge/{Domain => Controller}/InputConverter.java (92%) rename src/main/java/bridge/{Domain => Controller}/InputValidator.java (97%) rename src/main/java/bridge/{Domain => Model}/Bridge.java (98%) rename src/main/java/bridge/{Domain => Model}/BridgeBlock.java (96%) rename src/main/java/bridge/{Domain => Model}/Player.java (97%) diff --git a/src/main/java/bridge/Application.java b/src/main/java/bridge/Application.java index 867583da0da..4ba35596e99 100644 --- a/src/main/java/bridge/Application.java +++ b/src/main/java/bridge/Application.java @@ -1,7 +1,6 @@ package bridge; -import bridge.Domain.Bridge; -import bridge.Domain.BridgeGame; +import bridge.Controller.BridgeGame; import bridge.View.InputView; import bridge.View.OutputView; diff --git a/src/main/java/bridge/BridgeMaker.java b/src/main/java/bridge/BridgeMaker.java index 49f37d6de52..35cc8aec258 100644 --- a/src/main/java/bridge/BridgeMaker.java +++ b/src/main/java/bridge/BridgeMaker.java @@ -1,6 +1,6 @@ package bridge; -import bridge.Domain.BridgeBlock; +import bridge.Model.BridgeBlock; import java.util.ArrayList; import java.util.List; diff --git a/src/main/java/bridge/Domain/BridgeGame.java b/src/main/java/bridge/Controller/BridgeGame.java similarity index 96% rename from src/main/java/bridge/Domain/BridgeGame.java rename to src/main/java/bridge/Controller/BridgeGame.java index 9ad1a67943c..183f2e38f04 100644 --- a/src/main/java/bridge/Domain/BridgeGame.java +++ b/src/main/java/bridge/Controller/BridgeGame.java @@ -1,4 +1,7 @@ -package bridge.Domain; +package bridge.Controller; + +import bridge.Model.Bridge; +import bridge.Model.Player; import java.util.List; diff --git a/src/main/java/bridge/Domain/InputConverter.java b/src/main/java/bridge/Controller/InputConverter.java similarity index 92% rename from src/main/java/bridge/Domain/InputConverter.java rename to src/main/java/bridge/Controller/InputConverter.java index 975de0eca7f..5d95f922f79 100644 --- a/src/main/java/bridge/Domain/InputConverter.java +++ b/src/main/java/bridge/Controller/InputConverter.java @@ -1,4 +1,4 @@ -package bridge.Domain; +package bridge.Controller; public class InputConverter { diff --git a/src/main/java/bridge/Domain/InputValidator.java b/src/main/java/bridge/Controller/InputValidator.java similarity index 97% rename from src/main/java/bridge/Domain/InputValidator.java rename to src/main/java/bridge/Controller/InputValidator.java index 24bbb88fe81..355417b327b 100644 --- a/src/main/java/bridge/Domain/InputValidator.java +++ b/src/main/java/bridge/Controller/InputValidator.java @@ -1,4 +1,4 @@ -package bridge.Domain; +package bridge.Controller; import static bridge.Constant.ErrorMessage.*; import static bridge.Constant.InputValue.*; diff --git a/src/main/java/bridge/Domain/Bridge.java b/src/main/java/bridge/Model/Bridge.java similarity index 98% rename from src/main/java/bridge/Domain/Bridge.java rename to src/main/java/bridge/Model/Bridge.java index 7ed4aeb2e74..d255b7aebf0 100644 --- a/src/main/java/bridge/Domain/Bridge.java +++ b/src/main/java/bridge/Model/Bridge.java @@ -1,4 +1,4 @@ -package bridge.Domain; +package bridge.Model; import bridge.BridgeMaker; import bridge.BridgeNumberGenerator; diff --git a/src/main/java/bridge/Domain/BridgeBlock.java b/src/main/java/bridge/Model/BridgeBlock.java similarity index 96% rename from src/main/java/bridge/Domain/BridgeBlock.java rename to src/main/java/bridge/Model/BridgeBlock.java index a7527b7a1ac..3ed05b6ad68 100644 --- a/src/main/java/bridge/Domain/BridgeBlock.java +++ b/src/main/java/bridge/Model/BridgeBlock.java @@ -1,4 +1,4 @@ -package bridge.Domain; +package bridge.Model; import java.util.Arrays; diff --git a/src/main/java/bridge/Domain/Player.java b/src/main/java/bridge/Model/Player.java similarity index 97% rename from src/main/java/bridge/Domain/Player.java rename to src/main/java/bridge/Model/Player.java index 2752b2edd43..f2eac91f5ce 100644 --- a/src/main/java/bridge/Domain/Player.java +++ b/src/main/java/bridge/Model/Player.java @@ -1,4 +1,4 @@ -package bridge.Domain; +package bridge.Model; public class Player { private int nextLocation; diff --git a/src/main/java/bridge/View/InputView.java b/src/main/java/bridge/View/InputView.java index 114ce4265ee..36053e4de97 100644 --- a/src/main/java/bridge/View/InputView.java +++ b/src/main/java/bridge/View/InputView.java @@ -1,7 +1,7 @@ package bridge.View; -import bridge.Domain.InputConverter; -import bridge.Domain.InputValidator; +import bridge.Controller.InputConverter; +import bridge.Controller.InputValidator; import bridge.Constant.InputMessage; import static camp.nextstep.edu.missionutils.Console.readLine; diff --git a/src/main/java/bridge/View/OutputView.java b/src/main/java/bridge/View/OutputView.java index b69f257b695..63ed867b141 100644 --- a/src/main/java/bridge/View/OutputView.java +++ b/src/main/java/bridge/View/OutputView.java @@ -1,7 +1,7 @@ package bridge.View; -import bridge.Domain.BridgeGame; -import bridge.Domain.Player; +import bridge.Controller.BridgeGame; +import bridge.Model.Player; import bridge.Constant.InputValue; import bridge.Constant.OutputMessage; import bridge.Constant.OutputValue; diff --git a/src/test/java/bridge/Domain/BridgeBlockTest.java b/src/test/java/bridge/Domain/BridgeBlockTest.java index 1f9c33b1389..9a8509bd6a9 100644 --- a/src/test/java/bridge/Domain/BridgeBlockTest.java +++ b/src/test/java/bridge/Domain/BridgeBlockTest.java @@ -1,13 +1,11 @@ package bridge.Domain; +import bridge.Model.BridgeBlock; import org.junit.jupiter.api.DisplayName; import org.junit.jupiter.api.Nested; import org.junit.jupiter.api.Test; -import org.junit.jupiter.params.ParameterizedTest; -import org.junit.jupiter.params.provider.EnumSource; import static org.assertj.core.api.Assertions.assertThat; -import static org.junit.jupiter.api.Assertions.*; class BridgeBlockTest { diff --git a/src/test/java/bridge/Domain/BridgeGameTest.java b/src/test/java/bridge/Domain/BridgeGameTest.java index b98624f8839..da365788844 100644 --- a/src/test/java/bridge/Domain/BridgeGameTest.java +++ b/src/test/java/bridge/Domain/BridgeGameTest.java @@ -1,5 +1,6 @@ package bridge.Domain; +import bridge.Controller.BridgeGame; import org.junit.jupiter.api.DisplayName; import org.junit.jupiter.api.Test; diff --git a/src/test/java/bridge/Domain/BridgeTest.java b/src/test/java/bridge/Domain/BridgeTest.java index d46ff330541..1c5e4a011ec 100644 --- a/src/test/java/bridge/Domain/BridgeTest.java +++ b/src/test/java/bridge/Domain/BridgeTest.java @@ -1,5 +1,6 @@ package bridge.Domain; +import bridge.Model.Bridge; import org.junit.jupiter.api.DisplayName; import org.junit.jupiter.params.ParameterizedTest; import org.junit.jupiter.params.provider.ValueSource; diff --git a/src/test/java/bridge/Domain/InputConverterTest.java b/src/test/java/bridge/Domain/InputConverterTest.java index b02b1375667..4f00e8e5239 100644 --- a/src/test/java/bridge/Domain/InputConverterTest.java +++ b/src/test/java/bridge/Domain/InputConverterTest.java @@ -1,13 +1,12 @@ package bridge.Domain; +import bridge.Controller.InputConverter; import org.junit.jupiter.api.DisplayName; -import org.junit.jupiter.api.Test; import org.junit.jupiter.params.ParameterizedTest; import org.junit.jupiter.params.provider.ValueSource; import static org.assertj.core.api.Assertions.assertThat; import static org.assertj.core.api.Assertions.assertThatThrownBy; -import static org.junit.jupiter.api.Assertions.*; class InputConverterTest { @DisplayName("정상적인 값의 문자열을 정수로 변환하는지 확인") diff --git a/src/test/java/bridge/Domain/InputValidatorTest.java b/src/test/java/bridge/Domain/InputValidatorTest.java index 2faad7872b0..46acb4d416d 100644 --- a/src/test/java/bridge/Domain/InputValidatorTest.java +++ b/src/test/java/bridge/Domain/InputValidatorTest.java @@ -1,12 +1,11 @@ package bridge.Domain; +import bridge.Controller.InputValidator; import org.junit.jupiter.api.DisplayName; -import org.junit.jupiter.api.Test; import org.junit.jupiter.params.ParameterizedTest; import org.junit.jupiter.params.provider.ValueSource; import static org.assertj.core.api.Assertions.assertThatThrownBy; -import static org.junit.jupiter.api.Assertions.*; class InputValidatorTest { From 84e5608d8120998a79b5a8ac1c24f20d9a872483 Mon Sep 17 00:00:00 2001 From: swandevson Date: Fri, 18 Nov 2022 19:25:15 +0900 Subject: [PATCH 35/77] =?UTF-8?q?Refactor:=20=ED=95=9C=20=ED=81=B4?= =?UTF-8?q?=EB=9E=98=EC=8A=A4=EC=97=90=EC=84=9C=EB=A7=8C=20=EC=82=AC?= =?UTF-8?q?=EC=9A=A9=ED=95=98=EB=8A=94=20=EC=83=81=EC=88=98=20=ED=81=B4?= =?UTF-8?q?=EB=9E=98=EC=8A=A4=20=EC=82=AD=EC=A0=9C=20=EB=B0=8F=20=ED=81=B4?= =?UTF-8?q?=EB=9E=98=EC=8A=A4=EC=97=90=20=EC=9E=AC=ED=95=A0=EB=8B=B9?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- docs/README.md | 10 +++++---- .../java/bridge/Constant/ErrorMessage.java | 9 -------- .../java/bridge/Constant/InputMessage.java | 8 ------- .../java/bridge/Constant/OutputMessage.java | 9 -------- .../{Controller => }/InputValidator.java | 7 +++++-- src/main/java/bridge/View/InputView.java | 9 +++++--- src/main/java/bridge/View/OutputView.java | 21 ++++++++++++------- 7 files changed, 30 insertions(+), 43 deletions(-) delete mode 100644 src/main/java/bridge/Constant/ErrorMessage.java delete mode 100644 src/main/java/bridge/Constant/InputMessage.java delete mode 100644 src/main/java/bridge/Constant/OutputMessage.java rename src/main/java/bridge/{Controller => }/InputValidator.java (69%) diff --git a/docs/README.md b/docs/README.md index 0377a1e602d..f764f8d3ff9 100644 --- a/docs/README.md +++ b/docs/README.md @@ -3,12 +3,14 @@ --- #### 1. 사용자로부터 `InputView`에서 값을 입력 받고 초기화 후, 게임을 실행한다. -#### 2. `InputView`에서 값을 입력 받고, 해당 값을 `Controller`로 넘겨준다. +#### 2. `InputView`에서 값을 입력 받는다. #### 3. `Validator`를 통해 입력값을 검증한다. #### 4. 예외 발생시 재입력받는다. -#### 5. 예외가 발생하지 않을 경우, `Model`을 update한다. -#### 6. update된 정보를 `OutputView`를 활용해 출력한다. -#### 7. 게임이 종료될 때 까지 2~6를 반복한다. +#### 5. 예외가 발생하지 않을 경우, `Application`에 값을 반환한다. +#### 6. `BridgeGame`에 해당 값을 넘겨주어 update한다. +#### 7. update된 `BridgeGame`을 `Application`에서 `OutputView`로 넘겨준다. +#### 8. 해당 값을 활용해 출력한다. +#### 9. 게임이 종료될 때 까지 2~8를 반복한다. # 🧰 기능 목록 diff --git a/src/main/java/bridge/Constant/ErrorMessage.java b/src/main/java/bridge/Constant/ErrorMessage.java deleted file mode 100644 index 777080f7084..00000000000 --- a/src/main/java/bridge/Constant/ErrorMessage.java +++ /dev/null @@ -1,9 +0,0 @@ -package bridge.Constant; - -public class ErrorMessage { - public static final String ERROR_PREFIX = "[ERROR]"; - public static final String EMPTY_INPUT = ERROR_PREFIX + "빈 문자입니다."; - public static final String WRONG_SIZE_INPUT = ERROR_PREFIX + "숫자만 입력 가능합니다."; - public static final String WRONG_SELECTION_INPUT = ERROR_PREFIX + "'U' 또는 'D'만 입력 가능합니다."; - public static final String WRONG_COMMAND_INPUT = ERROR_PREFIX + "종료를 위해서는 'Q', 재시작을 위해서는 'R을 입력해주세요."; -} diff --git a/src/main/java/bridge/Constant/InputMessage.java b/src/main/java/bridge/Constant/InputMessage.java deleted file mode 100644 index 18a9e391260..00000000000 --- a/src/main/java/bridge/Constant/InputMessage.java +++ /dev/null @@ -1,8 +0,0 @@ -package bridge.Constant; - -public class InputMessage { - public static final String START_GAME = "다리 건너기 게임을 시작합니다."; - public static final String INPUT_BRIDGE_SIZE = "다리의 길이를 입력해주세요."; - public static final String INPUT_SELECTION = "이동할 칸을 선택해주세요. (위: U, 아래: D)"; - public static final String INPUT_COMMAND = "게임을 다시 시도할지 여부를 입력해주세요. (재시도: R, 종료: Q)"; -} diff --git a/src/main/java/bridge/Constant/OutputMessage.java b/src/main/java/bridge/Constant/OutputMessage.java deleted file mode 100644 index f8da0166f9d..00000000000 --- a/src/main/java/bridge/Constant/OutputMessage.java +++ /dev/null @@ -1,9 +0,0 @@ -package bridge.Constant; - -public class OutputMessage { - - public static final String RESULT_MESSAGE = "최종 게임 결과"; - public static final String BRIDGE_MAP = "[%s]" + System.lineSeparator(); - public static final String IS_SUCCESS = "게임 성공 여부: %s" + System.lineSeparator(); - public static final String RETRY_COUNT = "총 시도한 횟수: %d" + System.lineSeparator(); -} diff --git a/src/main/java/bridge/Controller/InputValidator.java b/src/main/java/bridge/InputValidator.java similarity index 69% rename from src/main/java/bridge/Controller/InputValidator.java rename to src/main/java/bridge/InputValidator.java index 355417b327b..78682d0c54d 100644 --- a/src/main/java/bridge/Controller/InputValidator.java +++ b/src/main/java/bridge/InputValidator.java @@ -1,10 +1,13 @@ package bridge.Controller; -import static bridge.Constant.ErrorMessage.*; import static bridge.Constant.InputValue.*; public class InputValidator { - + private static final String ERROR_PREFIX = "[ERROR]"; + private static final String EMPTY_INPUT = ERROR_PREFIX + "빈 문자입니다."; + private static final String WRONG_SIZE_INPUT = ERROR_PREFIX + "숫자만 입력 가능합니다."; + private static final String WRONG_SELECTION_INPUT = ERROR_PREFIX + "'U' 또는 'D'만 입력 가능합니다."; + private static final String WRONG_COMMAND_INPUT = ERROR_PREFIX + "종료를 위해서는 'Q', 재시작을 위해서는 'R을 입력해주세요."; public static void validateNumberInput(String input) throws IllegalArgumentException { diff --git a/src/main/java/bridge/View/InputView.java b/src/main/java/bridge/View/InputView.java index 36053e4de97..a8c48f11b42 100644 --- a/src/main/java/bridge/View/InputView.java +++ b/src/main/java/bridge/View/InputView.java @@ -1,8 +1,7 @@ package bridge.View; -import bridge.Controller.InputConverter; -import bridge.Controller.InputValidator; -import bridge.Constant.InputMessage; +import bridge.InputConverter; +import bridge.InputValidator; import static camp.nextstep.edu.missionutils.Console.readLine; @@ -10,6 +9,10 @@ * 사용자로부터 입력을 받는 역할을 한다. */ public class InputView { + private static final String START_GAME = "다리 건너기 게임을 시작합니다."; + private static final String INPUT_BRIDGE_SIZE = "다리의 길이를 입력해주세요."; + private static final String INPUT_SELECTION = "이동할 칸을 선택해주세요. (위: U, 아래: D)"; + private static final String INPUT_COMMAND = "게임을 다시 시도할지 여부를 입력해주세요. (재시도: R, 종료: Q)"; /** * 다리의 길이를 입력받는다. diff --git a/src/main/java/bridge/View/OutputView.java b/src/main/java/bridge/View/OutputView.java index 63ed867b141..9bb30846b6a 100644 --- a/src/main/java/bridge/View/OutputView.java +++ b/src/main/java/bridge/View/OutputView.java @@ -1,9 +1,8 @@ package bridge.View; -import bridge.Controller.BridgeGame; -import bridge.Model.Player; +import bridge.Domain.BridgeGame; +import bridge.Domain.Player; import bridge.Constant.InputValue; -import bridge.Constant.OutputMessage; import bridge.Constant.OutputValue; import java.util.List; @@ -12,6 +11,12 @@ * 사용자에게 게임 진행 상황과 결과를 출력하는 역할을 한다. */ public class OutputView { + private static final String RESULT_MESSAGE = "최종 게임 결과"; + private static final String BRIDGE_MAP = "[%s]" + System.lineSeparator(); + private static final String IS_SUCCESS = "게임 성공 여부: %s" + System.lineSeparator(); + private static final String RETRY_COUNT = "총 시도한 횟수: %d" + System.lineSeparator(); + + private String printSelectedStair(Player player, String stair) { if (!stair.equals(player.getLastSelection())) { return OutputValue.NOT_SELECTION; @@ -44,7 +49,7 @@ private void printStair(List bridgeStates, Player player, String stair) result = printPassedStair(bridgeStates, player.getNextLocation(), stair); result += printSelectedStair(player, stair); - System.out.printf(OutputMessage.BRIDGE_MAP, result); + System.out.printf(BRIDGE_MAP, result); } public void printMap(BridgeGame bridgeGame) { @@ -90,16 +95,16 @@ private void printResultStair(BridgeGame bridgeGame, String stair) { result = printPassedStair(bridgeGame.getBridgeStates(), bridgeGame.getMaxPassedCount(), stair); result += printLastStair(bridgeGame, stair); - System.out.printf(OutputMessage.BRIDGE_MAP, result); + System.out.printf(BRIDGE_MAP, result); } public void printResult(BridgeGame bridgeGame) { - System.out.println(OutputMessage.RESULT_MESSAGE); + System.out.println(RESULT_MESSAGE); printResultStair(bridgeGame, InputValue.SELECTION_UP); printResultStair(bridgeGame, InputValue.SELECTION_DOWN); - System.out.printf(OutputMessage.IS_SUCCESS, printIsSuccess(bridgeGame)); - System.out.printf(OutputMessage.RETRY_COUNT, bridgeGame.getRetryCount()); + System.out.printf(IS_SUCCESS, printIsSuccess(bridgeGame)); + System.out.printf(RETRY_COUNT, bridgeGame.getRetryCount()); } } From 35ac64224f43e439d7783a0808182cf59ee521be Mon Sep 17 00:00:00 2001 From: swandevson Date: Fri, 18 Nov 2022 20:25:45 +0900 Subject: [PATCH 36/77] =?UTF-8?q?Chore:=20Constant,=20Domain,=20View?= =?UTF-8?q?=EB=A1=9C=20=EB=B6=84=EB=A6=AC?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- src/main/java/bridge/Application.java | 2 +- src/main/java/bridge/BridgeMaker.java | 2 +- src/main/java/bridge/{Model => Domain}/Bridge.java | 2 +- .../java/bridge/{Model => Domain}/BridgeBlock.java | 2 +- .../bridge/{Controller => Domain}/BridgeGame.java | 5 +---- .../{Controller => Domain}/InputConverter.java | 2 +- .../java/bridge/{ => Domain}/InputValidator.java | 2 +- src/main/java/bridge/{Model => Domain}/Player.java | 2 +- src/main/java/bridge/View/InputView.java | 12 ++++++------ src/test/java/bridge/Domain/BridgeBlockTest.java | 1 - src/test/java/bridge/Domain/BridgeGameTest.java | 1 - src/test/java/bridge/Domain/BridgeTest.java | 1 - src/test/java/bridge/Domain/InputConverterTest.java | 1 - src/test/java/bridge/Domain/InputValidatorTest.java | 1 - 14 files changed, 14 insertions(+), 22 deletions(-) rename src/main/java/bridge/{Model => Domain}/Bridge.java (98%) rename src/main/java/bridge/{Model => Domain}/BridgeBlock.java (96%) rename src/main/java/bridge/{Controller => Domain}/BridgeGame.java (96%) rename src/main/java/bridge/{Controller => Domain}/InputConverter.java (92%) rename src/main/java/bridge/{ => Domain}/InputValidator.java (98%) rename src/main/java/bridge/{Model => Domain}/Player.java (97%) diff --git a/src/main/java/bridge/Application.java b/src/main/java/bridge/Application.java index 4ba35596e99..794cafc9c4b 100644 --- a/src/main/java/bridge/Application.java +++ b/src/main/java/bridge/Application.java @@ -1,6 +1,6 @@ package bridge; -import bridge.Controller.BridgeGame; +import bridge.Domain.BridgeGame; import bridge.View.InputView; import bridge.View.OutputView; diff --git a/src/main/java/bridge/BridgeMaker.java b/src/main/java/bridge/BridgeMaker.java index 35cc8aec258..49f37d6de52 100644 --- a/src/main/java/bridge/BridgeMaker.java +++ b/src/main/java/bridge/BridgeMaker.java @@ -1,6 +1,6 @@ package bridge; -import bridge.Model.BridgeBlock; +import bridge.Domain.BridgeBlock; import java.util.ArrayList; import java.util.List; diff --git a/src/main/java/bridge/Model/Bridge.java b/src/main/java/bridge/Domain/Bridge.java similarity index 98% rename from src/main/java/bridge/Model/Bridge.java rename to src/main/java/bridge/Domain/Bridge.java index d255b7aebf0..7ed4aeb2e74 100644 --- a/src/main/java/bridge/Model/Bridge.java +++ b/src/main/java/bridge/Domain/Bridge.java @@ -1,4 +1,4 @@ -package bridge.Model; +package bridge.Domain; import bridge.BridgeMaker; import bridge.BridgeNumberGenerator; diff --git a/src/main/java/bridge/Model/BridgeBlock.java b/src/main/java/bridge/Domain/BridgeBlock.java similarity index 96% rename from src/main/java/bridge/Model/BridgeBlock.java rename to src/main/java/bridge/Domain/BridgeBlock.java index 3ed05b6ad68..a7527b7a1ac 100644 --- a/src/main/java/bridge/Model/BridgeBlock.java +++ b/src/main/java/bridge/Domain/BridgeBlock.java @@ -1,4 +1,4 @@ -package bridge.Model; +package bridge.Domain; import java.util.Arrays; diff --git a/src/main/java/bridge/Controller/BridgeGame.java b/src/main/java/bridge/Domain/BridgeGame.java similarity index 96% rename from src/main/java/bridge/Controller/BridgeGame.java rename to src/main/java/bridge/Domain/BridgeGame.java index 183f2e38f04..9ad1a67943c 100644 --- a/src/main/java/bridge/Controller/BridgeGame.java +++ b/src/main/java/bridge/Domain/BridgeGame.java @@ -1,7 +1,4 @@ -package bridge.Controller; - -import bridge.Model.Bridge; -import bridge.Model.Player; +package bridge.Domain; import java.util.List; diff --git a/src/main/java/bridge/Controller/InputConverter.java b/src/main/java/bridge/Domain/InputConverter.java similarity index 92% rename from src/main/java/bridge/Controller/InputConverter.java rename to src/main/java/bridge/Domain/InputConverter.java index 5d95f922f79..975de0eca7f 100644 --- a/src/main/java/bridge/Controller/InputConverter.java +++ b/src/main/java/bridge/Domain/InputConverter.java @@ -1,4 +1,4 @@ -package bridge.Controller; +package bridge.Domain; public class InputConverter { diff --git a/src/main/java/bridge/InputValidator.java b/src/main/java/bridge/Domain/InputValidator.java similarity index 98% rename from src/main/java/bridge/InputValidator.java rename to src/main/java/bridge/Domain/InputValidator.java index 78682d0c54d..99586469222 100644 --- a/src/main/java/bridge/InputValidator.java +++ b/src/main/java/bridge/Domain/InputValidator.java @@ -1,4 +1,4 @@ -package bridge.Controller; +package bridge.Domain; import static bridge.Constant.InputValue.*; diff --git a/src/main/java/bridge/Model/Player.java b/src/main/java/bridge/Domain/Player.java similarity index 97% rename from src/main/java/bridge/Model/Player.java rename to src/main/java/bridge/Domain/Player.java index f2eac91f5ce..2752b2edd43 100644 --- a/src/main/java/bridge/Model/Player.java +++ b/src/main/java/bridge/Domain/Player.java @@ -1,4 +1,4 @@ -package bridge.Model; +package bridge.Domain; public class Player { private int nextLocation; diff --git a/src/main/java/bridge/View/InputView.java b/src/main/java/bridge/View/InputView.java index a8c48f11b42..5c546a8594f 100644 --- a/src/main/java/bridge/View/InputView.java +++ b/src/main/java/bridge/View/InputView.java @@ -1,7 +1,7 @@ package bridge.View; -import bridge.InputConverter; -import bridge.InputValidator; +import bridge.Domain.InputConverter; +import bridge.Domain.InputValidator; import static camp.nextstep.edu.missionutils.Console.readLine; @@ -18,11 +18,11 @@ public class InputView { * 다리의 길이를 입력받는다. */ public void printStartMessage() { - System.out.println(InputMessage.START_GAME); + System.out.println(START_GAME); } public int readBridgeSize() throws IllegalArgumentException { - System.out.println(InputMessage.INPUT_BRIDGE_SIZE); + System.out.println(INPUT_BRIDGE_SIZE); String input = readLine(); @@ -41,7 +41,7 @@ public int readBridgeSize() throws IllegalArgumentException { * 사용자가 이동할 칸을 입력받는다. */ public String readMoving() throws IllegalArgumentException { - System.out.println(InputMessage.INPUT_SELECTION); + System.out.println(INPUT_SELECTION); String input = readLine(); try { @@ -57,7 +57,7 @@ public String readMoving() throws IllegalArgumentException { * 사용자가 게임을 다시 시도할지 종료할지 여부를 입력받는다. */ public String readGameCommand() throws IllegalArgumentException { - System.out.println(InputMessage.INPUT_COMMAND); + System.out.println(INPUT_COMMAND); String input = readLine(); try { diff --git a/src/test/java/bridge/Domain/BridgeBlockTest.java b/src/test/java/bridge/Domain/BridgeBlockTest.java index 9a8509bd6a9..57c95aa5a10 100644 --- a/src/test/java/bridge/Domain/BridgeBlockTest.java +++ b/src/test/java/bridge/Domain/BridgeBlockTest.java @@ -1,6 +1,5 @@ package bridge.Domain; -import bridge.Model.BridgeBlock; import org.junit.jupiter.api.DisplayName; import org.junit.jupiter.api.Nested; import org.junit.jupiter.api.Test; diff --git a/src/test/java/bridge/Domain/BridgeGameTest.java b/src/test/java/bridge/Domain/BridgeGameTest.java index da365788844..b98624f8839 100644 --- a/src/test/java/bridge/Domain/BridgeGameTest.java +++ b/src/test/java/bridge/Domain/BridgeGameTest.java @@ -1,6 +1,5 @@ package bridge.Domain; -import bridge.Controller.BridgeGame; import org.junit.jupiter.api.DisplayName; import org.junit.jupiter.api.Test; diff --git a/src/test/java/bridge/Domain/BridgeTest.java b/src/test/java/bridge/Domain/BridgeTest.java index 1c5e4a011ec..d46ff330541 100644 --- a/src/test/java/bridge/Domain/BridgeTest.java +++ b/src/test/java/bridge/Domain/BridgeTest.java @@ -1,6 +1,5 @@ package bridge.Domain; -import bridge.Model.Bridge; import org.junit.jupiter.api.DisplayName; import org.junit.jupiter.params.ParameterizedTest; import org.junit.jupiter.params.provider.ValueSource; diff --git a/src/test/java/bridge/Domain/InputConverterTest.java b/src/test/java/bridge/Domain/InputConverterTest.java index 4f00e8e5239..9746e7ba8f1 100644 --- a/src/test/java/bridge/Domain/InputConverterTest.java +++ b/src/test/java/bridge/Domain/InputConverterTest.java @@ -1,6 +1,5 @@ package bridge.Domain; -import bridge.Controller.InputConverter; import org.junit.jupiter.api.DisplayName; import org.junit.jupiter.params.ParameterizedTest; import org.junit.jupiter.params.provider.ValueSource; diff --git a/src/test/java/bridge/Domain/InputValidatorTest.java b/src/test/java/bridge/Domain/InputValidatorTest.java index 46acb4d416d..1369f75811e 100644 --- a/src/test/java/bridge/Domain/InputValidatorTest.java +++ b/src/test/java/bridge/Domain/InputValidatorTest.java @@ -1,6 +1,5 @@ package bridge.Domain; -import bridge.Controller.InputValidator; import org.junit.jupiter.api.DisplayName; import org.junit.jupiter.params.ParameterizedTest; import org.junit.jupiter.params.provider.ValueSource; From 326f09ca2bef04ccda0ab04daf08489cb4b046d7 Mon Sep 17 00:00:00 2001 From: swandevson Date: Fri, 18 Nov 2022 20:37:51 +0900 Subject: [PATCH 37/77] =?UTF-8?q?Style(OutputView):=20=EC=83=81=EC=88=98?= =?UTF-8?q?=20=ED=81=B4=EB=9E=98=EC=8A=A4=20=EA=B0=92=EC=9D=84=20static?= =?UTF-8?q?=EC=9C=BC=EB=A1=9C=20=EC=82=AC=EC=9A=A9?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- src/main/java/bridge/View/OutputView.java | 35 ++++++++++++----------- 1 file changed, 19 insertions(+), 16 deletions(-) diff --git a/src/main/java/bridge/View/OutputView.java b/src/main/java/bridge/View/OutputView.java index 9bb30846b6a..b84c85d097f 100644 --- a/src/main/java/bridge/View/OutputView.java +++ b/src/main/java/bridge/View/OutputView.java @@ -1,9 +1,12 @@ package bridge.View; +import static bridge.Constant.InputValue.SELECTION_DOWN; +import static bridge.Constant.InputValue.SELECTION_UP; + +import static bridge.Constant.OutputValue.*; + import bridge.Domain.BridgeGame; import bridge.Domain.Player; -import bridge.Constant.InputValue; -import bridge.Constant.OutputValue; import java.util.List; @@ -19,23 +22,23 @@ public class OutputView { private String printSelectedStair(Player player, String stair) { if (!stair.equals(player.getLastSelection())) { - return OutputValue.NOT_SELECTION; + return NOT_SELECTION; } if (!player.isAlive()) { - return OutputValue.WRONG_SELECTION; + return WRONG_SELECTION; } - return OutputValue.RIGHT_SELECTION; + return RIGHT_SELECTION; } private String printPassedStair(List bridgeStates, int passedCount, String stair) { String result = ""; for (int bridgeLocation = 0; bridgeLocation < passedCount; bridgeLocation++) { - String state = OutputValue.NOT_SELECTION; + String state = NOT_SELECTION; if (stair.equals(bridgeStates.get(bridgeLocation))) { - state = OutputValue.RIGHT_SELECTION; + state = RIGHT_SELECTION; } state += OutputValue.SEPARATOR; result += state; @@ -56,8 +59,8 @@ public void printMap(BridgeGame bridgeGame) { List bridgeState = bridgeGame.getBridgeStates(); Player player = bridgeGame.getPlayer(); - printStair(bridgeState, player, InputValue.SELECTION_UP); - printStair(bridgeState, player, InputValue.SELECTION_DOWN); + printStair(bridgeState, player, SELECTION_UP); + printStair(bridgeState, player, SELECTION_DOWN); System.out.println(); } @@ -69,10 +72,10 @@ public void printMap(BridgeGame bridgeGame) { private String printIsSuccess(BridgeGame bridgeGame) { if (bridgeGame.isPlayerDead()) { - return OutputValue.FAIL; + return FAIL; } - return OutputValue.SUCCESS; + return SUCCESS; } private String printLastStair(BridgeGame bridgeGame, String stair) { @@ -80,14 +83,14 @@ private String printLastStair(BridgeGame bridgeGame, String stair) { String bridgeState = bridgeStates.get(bridgeGame.getMaxPassedCount()); if (!bridgeState.equals(stair)) { - return OutputValue.NOT_SELECTION; + return NOT_SELECTION; } if (bridgeGame.isPlayerDead()) { - return OutputValue.WRONG_SELECTION; + return WRONG_SELECTION; } - return OutputValue.RIGHT_SELECTION; + return RIGHT_SELECTION; } private void printResultStair(BridgeGame bridgeGame, String stair) { @@ -101,8 +104,8 @@ private void printResultStair(BridgeGame bridgeGame, String stair) { public void printResult(BridgeGame bridgeGame) { System.out.println(RESULT_MESSAGE); - printResultStair(bridgeGame, InputValue.SELECTION_UP); - printResultStair(bridgeGame, InputValue.SELECTION_DOWN); + printResultStair(bridgeGame, SELECTION_UP); + printResultStair(bridgeGame, SELECTION_DOWN); System.out.printf(IS_SUCCESS, printIsSuccess(bridgeGame)); System.out.printf(RETRY_COUNT, bridgeGame.getRetryCount()); From e3de220f84c9a5f8422a0a602954a4cef0cd37da Mon Sep 17 00:00:00 2001 From: swandevson Date: Fri, 18 Nov 2022 20:46:18 +0900 Subject: [PATCH 38/77] =?UTF-8?q?Style(Player):=20=EC=84=A0=ED=83=9D=20?= =?UTF-8?q?=EB=B0=8F=20=EC=A7=80=EB=82=98=EC=98=A8=20=EB=8B=A4=EB=A6=AC=20?= =?UTF-8?q?=EA=B0=AF=EC=88=98=20=ED=95=84=EB=93=9C=EB=AA=85=20=EB=B3=80?= =?UTF-8?q?=EA=B2=BD?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit - lastSelection -> selection - nextLocation -> passedCount --- src/main/java/bridge/Domain/BridgeGame.java | 10 ++++----- src/main/java/bridge/Domain/Player.java | 24 ++++++++++----------- src/main/java/bridge/View/OutputView.java | 19 ++++++++-------- 3 files changed, 26 insertions(+), 27 deletions(-) diff --git a/src/main/java/bridge/Domain/BridgeGame.java b/src/main/java/bridge/Domain/BridgeGame.java index 9ad1a67943c..7f5c323f991 100644 --- a/src/main/java/bridge/Domain/BridgeGame.java +++ b/src/main/java/bridge/Domain/BridgeGame.java @@ -29,9 +29,9 @@ public BridgeGame(int size) throws IllegalArgumentException { * 이동을 위해 필요한 메서드의 반환 타입(return type), 인자(parameter)는 자유롭게 추가하거나 변경할 수 있다. */ public void move(String playerSelection) { - player.setLastSelection(playerSelection); + player.setSelection(playerSelection); - int nextPlayerLocation = player.getNextLocation(); + int nextPlayerLocation = player.getPassedCount(); String nextBridgeState = bridge.getBridgeState(nextPlayerLocation); if (!playerSelection.equals(nextBridgeState)) { @@ -45,8 +45,8 @@ public void move(String playerSelection) { * 재시작을 위해 필요한 메서드의 반환 타입(return type), 인자(parameter)는 자유롭게 추가하거나 변경할 수 있다. */ public void retry(String command) { - if (this.maxPassedCount < player.getNextLocation()) { - this.maxPassedCount = player.getNextLocation(); + if (this.maxPassedCount < player.getPassedCount()) { + this.maxPassedCount = player.getPassedCount(); } if (command.equals("R")) { player.revive(); @@ -56,7 +56,7 @@ public void retry(String command) { public boolean winGame() { - int playerNextLocation = player.getNextLocation(); + int playerNextLocation = player.getPassedCount(); List bridgeStates = bridge.getBridgeStates(); // 다음에 이동할 곳이 인덱스를 벗어날 경우 끝에 도달한 것 diff --git a/src/main/java/bridge/Domain/Player.java b/src/main/java/bridge/Domain/Player.java index 2752b2edd43..fde4c8da9a8 100644 --- a/src/main/java/bridge/Domain/Player.java +++ b/src/main/java/bridge/Domain/Player.java @@ -1,20 +1,20 @@ package bridge.Domain; public class Player { - private int nextLocation; - private String lastSelection; + private int passedCount; + private String selection; private boolean alive; public Player() { - this.nextLocation = 0; - this.lastSelection = null; + this.passedCount = 0; + this.selection = null; this.alive = true; } - public void setLastSelection(String lastSelection) { - this.lastSelection = lastSelection; + public void setSelection(String selection) { + this.selection = selection; } @@ -22,12 +22,12 @@ public boolean isAlive() { return this.alive; } - public int getNextLocation() { - return this.nextLocation; + public int getPassedCount() { + return this.passedCount; } - public String getLastSelection() { - return this.lastSelection; + public String getSelection() { + return this.selection; } public void die() { @@ -35,12 +35,12 @@ public void die() { } public void success() { - this.nextLocation++; + this.passedCount++; } public void revive() { this.alive = true; - this.nextLocation = 0; + this.passedCount = 0; } } diff --git a/src/main/java/bridge/View/OutputView.java b/src/main/java/bridge/View/OutputView.java index b84c85d097f..fa46867065f 100644 --- a/src/main/java/bridge/View/OutputView.java +++ b/src/main/java/bridge/View/OutputView.java @@ -20,8 +20,8 @@ public class OutputView { private static final String RETRY_COUNT = "총 시도한 횟수: %d" + System.lineSeparator(); - private String printSelectedStair(Player player, String stair) { - if (!stair.equals(player.getLastSelection())) { + private String processSelectedStair(Player player, String stair) { + if (!stair.equals(player.getSelection())) { return NOT_SELECTION; } @@ -32,7 +32,7 @@ private String printSelectedStair(Player player, String stair) { return RIGHT_SELECTION; } - private String printPassedStair(List bridgeStates, int passedCount, String stair) { + private String processPassedStair(List bridgeStates, int passedCount, String stair) { String result = ""; for (int bridgeLocation = 0; bridgeLocation < passedCount; bridgeLocation++) { @@ -40,8 +40,7 @@ private String printPassedStair(List bridgeStates, int passedCount, Stri if (stair.equals(bridgeStates.get(bridgeLocation))) { state = RIGHT_SELECTION; } - state += OutputValue.SEPARATOR; - result += state; + result += state + SEPARATOR; } return result; @@ -70,7 +69,7 @@ public void printMap(BridgeGame bridgeGame) { * 출력을 위해 필요한 메서드의 인자(parameter)는 자유롭게 추가하거나 변경할 수 있다. */ - private String printIsSuccess(BridgeGame bridgeGame) { + private String processIsSuccess(BridgeGame bridgeGame) { if (bridgeGame.isPlayerDead()) { return FAIL; } @@ -78,7 +77,7 @@ private String printIsSuccess(BridgeGame bridgeGame) { return SUCCESS; } - private String printLastStair(BridgeGame bridgeGame, String stair) { + private String processLastStair(BridgeGame bridgeGame, String stair) { List bridgeStates = bridgeGame.getBridgeStates(); String bridgeState = bridgeStates.get(bridgeGame.getMaxPassedCount()); @@ -95,8 +94,8 @@ private String printLastStair(BridgeGame bridgeGame, String stair) { private void printResultStair(BridgeGame bridgeGame, String stair) { String result; - result = printPassedStair(bridgeGame.getBridgeStates(), bridgeGame.getMaxPassedCount(), stair); - result += printLastStair(bridgeGame, stair); + result = processPassedStair(bridgeGame.getBridgeStates(), bridgeGame.getMaxPassedCount(), stair); + result += processLastStair(bridgeGame, stair); System.out.printf(BRIDGE_MAP, result); } @@ -107,7 +106,7 @@ public void printResult(BridgeGame bridgeGame) { printResultStair(bridgeGame, SELECTION_UP); printResultStair(bridgeGame, SELECTION_DOWN); - System.out.printf(IS_SUCCESS, printIsSuccess(bridgeGame)); + System.out.printf(IS_SUCCESS, processIsSuccess(bridgeGame)); System.out.printf(RETRY_COUNT, bridgeGame.getRetryCount()); } } From 22c06ecf5a87dd8f9b8f12388cf05b894378f8bc Mon Sep 17 00:00:00 2001 From: swandevson Date: Fri, 18 Nov 2022 21:06:24 +0900 Subject: [PATCH 39/77] =?UTF-8?q?Style(OutputView):=20=EB=A9=94=EC=86=8C?= =?UTF-8?q?=EB=93=9C=EB=AA=85=20=EB=B3=80=EA=B2=BD?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit - 조건에 따른 문자열 반환 -> get 동사 사용 --- src/main/java/bridge/View/OutputView.java | 18 +++++++++--------- 1 file changed, 9 insertions(+), 9 deletions(-) diff --git a/src/main/java/bridge/View/OutputView.java b/src/main/java/bridge/View/OutputView.java index fa46867065f..67977ac8bfa 100644 --- a/src/main/java/bridge/View/OutputView.java +++ b/src/main/java/bridge/View/OutputView.java @@ -20,7 +20,7 @@ public class OutputView { private static final String RETRY_COUNT = "총 시도한 횟수: %d" + System.lineSeparator(); - private String processSelectedStair(Player player, String stair) { + private String getSelectResult(Player player, String stair) { if (!stair.equals(player.getSelection())) { return NOT_SELECTION; } @@ -32,7 +32,7 @@ private String processSelectedStair(Player player, String stair) { return RIGHT_SELECTION; } - private String processPassedStair(List bridgeStates, int passedCount, String stair) { + private String getPassedResultMap(List bridgeStates, int passedCount, String stair) { String result = ""; for (int bridgeLocation = 0; bridgeLocation < passedCount; bridgeLocation++) { @@ -48,8 +48,8 @@ private String processPassedStair(List bridgeStates, int passedCount, St private void printStair(List bridgeStates, Player player, String stair) { String result; - result = printPassedStair(bridgeStates, player.getNextLocation(), stair); - result += printSelectedStair(player, stair); + result = getPassedResultMap(bridgeStates, player.getPassedCount(), stair); + result += getSelectResult(player, stair); System.out.printf(BRIDGE_MAP, result); } @@ -69,7 +69,7 @@ public void printMap(BridgeGame bridgeGame) { * 출력을 위해 필요한 메서드의 인자(parameter)는 자유롭게 추가하거나 변경할 수 있다. */ - private String processIsSuccess(BridgeGame bridgeGame) { + private String getIsSuccess(BridgeGame bridgeGame) { if (bridgeGame.isPlayerDead()) { return FAIL; } @@ -77,7 +77,7 @@ private String processIsSuccess(BridgeGame bridgeGame) { return SUCCESS; } - private String processLastStair(BridgeGame bridgeGame, String stair) { + private String getLastSelectResult(BridgeGame bridgeGame, String stair) { List bridgeStates = bridgeGame.getBridgeStates(); String bridgeState = bridgeStates.get(bridgeGame.getMaxPassedCount()); @@ -94,8 +94,8 @@ private String processLastStair(BridgeGame bridgeGame, String stair) { private void printResultStair(BridgeGame bridgeGame, String stair) { String result; - result = processPassedStair(bridgeGame.getBridgeStates(), bridgeGame.getMaxPassedCount(), stair); - result += processLastStair(bridgeGame, stair); + result = getPassedResultMap(bridgeGame.getBridgeStates(), bridgeGame.getMaxPassedCount(), stair); + result += getLastSelectResult(bridgeGame, stair); System.out.printf(BRIDGE_MAP, result); } @@ -106,7 +106,7 @@ public void printResult(BridgeGame bridgeGame) { printResultStair(bridgeGame, SELECTION_UP); printResultStair(bridgeGame, SELECTION_DOWN); - System.out.printf(IS_SUCCESS, processIsSuccess(bridgeGame)); + System.out.printf(IS_SUCCESS, getIsSuccess(bridgeGame)); System.out.printf(RETRY_COUNT, bridgeGame.getRetryCount()); } } From ea3ae4b60841acdfbf06f978b0424da574b934bf Mon Sep 17 00:00:00 2001 From: swandevson Date: Fri, 18 Nov 2022 21:10:49 +0900 Subject: [PATCH 40/77] =?UTF-8?q?Refactor(OutputView):=20=EC=A7=80?= =?UTF-8?q?=EB=82=98=EC=98=A8=20=EA=B0=81=20=EC=B9=B8=EC=9D=98=20=EA=B2=B0?= =?UTF-8?q?=EA=B3=BC=20=EA=B8=B0=EB=8A=A5=20=EB=B6=84=EB=A6=AC?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- src/main/java/bridge/View/OutputView.java | 18 +++++++++++++----- 1 file changed, 13 insertions(+), 5 deletions(-) diff --git a/src/main/java/bridge/View/OutputView.java b/src/main/java/bridge/View/OutputView.java index 67977ac8bfa..53ccd06225f 100644 --- a/src/main/java/bridge/View/OutputView.java +++ b/src/main/java/bridge/View/OutputView.java @@ -32,15 +32,23 @@ private String getSelectResult(Player player, String stair) { return RIGHT_SELECTION; } + private String getPassedResult(String bridgeState, String stair) { + if (bridgeState.equals(stair)) { + return RIGHT_SELECTION; + } + + return NOT_SELECTION; + } + + private String getPassedResultMap(List bridgeStates, int passedCount, String stair) { String result = ""; for (int bridgeLocation = 0; bridgeLocation < passedCount; bridgeLocation++) { - String state = NOT_SELECTION; - if (stair.equals(bridgeStates.get(bridgeLocation))) { - state = RIGHT_SELECTION; - } - result += state + SEPARATOR; + String bridgeState = bridgeStates.get(bridgeLocation); + + result += getPassedResult(bridgeState, stair); + result += SEPARATOR; } return result; From e6f671428b081739cb83b1356865bd4db6de5935 Mon Sep 17 00:00:00 2001 From: swandevson Date: Fri, 18 Nov 2022 21:27:36 +0900 Subject: [PATCH 41/77] =?UTF-8?q?Style(OutputView):=20=EB=A9=94=EC=86=8C?= =?UTF-8?q?=EB=93=9C=EB=AA=85=20=EB=B3=80=EA=B2=BD?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit - 이미 지나간 해당 층(Up, Down)에 대한 결과문 -> getPassedStair - 해당 층(Up, Down)이 지나간 층인지에 대한 결과문 -> getIsPassedStair --- src/main/java/bridge/View/OutputView.java | 10 +++++----- 1 file changed, 5 insertions(+), 5 deletions(-) diff --git a/src/main/java/bridge/View/OutputView.java b/src/main/java/bridge/View/OutputView.java index 53ccd06225f..5035c42a5ed 100644 --- a/src/main/java/bridge/View/OutputView.java +++ b/src/main/java/bridge/View/OutputView.java @@ -32,7 +32,7 @@ private String getSelectResult(Player player, String stair) { return RIGHT_SELECTION; } - private String getPassedResult(String bridgeState, String stair) { + private String getIsPassedStair(String bridgeState, String stair) { if (bridgeState.equals(stair)) { return RIGHT_SELECTION; } @@ -41,13 +41,13 @@ private String getPassedResult(String bridgeState, String stair) { } - private String getPassedResultMap(List bridgeStates, int passedCount, String stair) { + private String getPassedStair(List bridgeStates, int passedCount, String stair) { String result = ""; for (int bridgeLocation = 0; bridgeLocation < passedCount; bridgeLocation++) { String bridgeState = bridgeStates.get(bridgeLocation); - result += getPassedResult(bridgeState, stair); + result += getIsPassedStair(bridgeState, stair); result += SEPARATOR; } @@ -56,7 +56,7 @@ private String getPassedResultMap(List bridgeStates, int passedCount, St private void printStair(List bridgeStates, Player player, String stair) { String result; - result = getPassedResultMap(bridgeStates, player.getPassedCount(), stair); + result = getPassedStair(bridgeStates, player.getPassedCount(), stair); result += getSelectResult(player, stair); System.out.printf(BRIDGE_MAP, result); @@ -102,7 +102,7 @@ private String getLastSelectResult(BridgeGame bridgeGame, String stair) { private void printResultStair(BridgeGame bridgeGame, String stair) { String result; - result = getPassedResultMap(bridgeGame.getBridgeStates(), bridgeGame.getMaxPassedCount(), stair); + result = getPassedStair(bridgeGame.getBridgeStates(), bridgeGame.getMaxPassedCount(), stair); result += getLastSelectResult(bridgeGame, stair); System.out.printf(BRIDGE_MAP, result); From b319c1eea3e937919248aa67df1be6c8e7ffe27d Mon Sep 17 00:00:00 2001 From: swandevson Date: Fri, 18 Nov 2022 21:58:56 +0900 Subject: [PATCH 42/77] =?UTF-8?q?Fix(OutputView):=20=EC=8B=A4=ED=8C=A8=20?= =?UTF-8?q?=EC=8B=9C=20=EC=9E=98=EB=AA=BB=EB=90=9C=20=EA=B2=B0=EA=B3=BC=20?= =?UTF-8?q?=EC=B6=9C=EB=A0=A5?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit - 잘못된 위치에 X가 출력되는 버그 수정 --- src/main/java/bridge/View/OutputView.java | 18 +++++++++++------- 1 file changed, 11 insertions(+), 7 deletions(-) diff --git a/src/main/java/bridge/View/OutputView.java b/src/main/java/bridge/View/OutputView.java index 5035c42a5ed..0a36f16db5d 100644 --- a/src/main/java/bridge/View/OutputView.java +++ b/src/main/java/bridge/View/OutputView.java @@ -56,7 +56,9 @@ private String getPassedStair(List bridgeStates, int passedCount, String private void printStair(List bridgeStates, Player player, String stair) { String result; - result = getPassedStair(bridgeStates, player.getPassedCount(), stair); + int passedCount = player.getPassedCount(); + + result = getPassedStair(bridgeStates, passedCount, stair); result += getSelectResult(player, stair); System.out.printf(BRIDGE_MAP, result); @@ -89,20 +91,22 @@ private String getLastSelectResult(BridgeGame bridgeGame, String stair) { List bridgeStates = bridgeGame.getBridgeStates(); String bridgeState = bridgeStates.get(bridgeGame.getMaxPassedCount()); - if (!bridgeState.equals(stair)) { - return NOT_SELECTION; + if (bridgeGame.winGame() && bridgeState.equals(stair)) { + return RIGHT_SELECTION; } - if (bridgeGame.isPlayerDead()) { + if (bridgeGame.isPlayerDead() && !bridgeState.equals(stair)) { // 옳지 않은 발판을 선택해서 죽었기 때문에 해당 위치에 X 출력 return WRONG_SELECTION; } - return RIGHT_SELECTION; + return NOT_SELECTION; } private void printResultStair(BridgeGame bridgeGame, String stair) { - String result; - result = getPassedStair(bridgeGame.getBridgeStates(), bridgeGame.getMaxPassedCount(), stair); + List bridgeStates = bridgeGame.getBridgeStates(); + int passedCount = bridgeGame.getMaxPassedCount(); + + String result = getPassedStair(bridgeStates, passedCount, stair); result += getLastSelectResult(bridgeGame, stair); System.out.printf(BRIDGE_MAP, result); From 38ce414c9698b17cc5090160abc70dabd6473bcb Mon Sep 17 00:00:00 2001 From: swandevson Date: Fri, 18 Nov 2022 22:11:09 +0900 Subject: [PATCH 43/77] =?UTF-8?q?Fix(Bridge):=20=EC=B5=9C=EB=8C=80=20?= =?UTF-8?q?=EB=B2=94=EC=9C=84=20=EC=88=98=EC=A0=95?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- src/main/java/bridge/Domain/Bridge.java | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/main/java/bridge/Domain/Bridge.java b/src/main/java/bridge/Domain/Bridge.java index 7ed4aeb2e74..7ddc4658ae7 100644 --- a/src/main/java/bridge/Domain/Bridge.java +++ b/src/main/java/bridge/Domain/Bridge.java @@ -10,7 +10,7 @@ public class Bridge { private final static int MIN_BRIDGE_SIZE = 3; - private final static int MAX_BRIDGE_SIZE = 50; + private final static int MAX_BRIDGE_SIZE = 20; private final static String WRONG_RANGE_INPUT = "[ERROR] 다리 길이는 3부터 20 사이의 숫자여야 합니다."; From 67f4596804f1fef5a2e48de0f80405733277cb1e Mon Sep 17 00:00:00 2001 From: swandevson Date: Fri, 18 Nov 2022 22:44:49 +0900 Subject: [PATCH 44/77] =?UTF-8?q?Test(ApplicationTest):=20=EC=8B=A4?= =?UTF-8?q?=ED=8C=A8=20=ED=9B=84=20=EC=A2=85=EB=A3=8C=20=EC=8B=9C=20?= =?UTF-8?q?=EC=B6=9C=EB=A0=A5=EB=AC=B8=20=ED=85=8C=EC=8A=A4=ED=8A=B8?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- src/test/java/bridge/ApplicationTest.java | 27 ++++++++++++++++++++--- 1 file changed, 24 insertions(+), 3 deletions(-) diff --git a/src/test/java/bridge/ApplicationTest.java b/src/test/java/bridge/ApplicationTest.java index a4566e1e2cd..13ba1d376b3 100644 --- a/src/test/java/bridge/ApplicationTest.java +++ b/src/test/java/bridge/ApplicationTest.java @@ -7,6 +7,7 @@ import camp.nextstep.edu.missionutils.test.NsTest; import java.util.List; +import org.junit.jupiter.api.DisplayName; import org.junit.jupiter.api.Test; class ApplicationTest extends NsTest { @@ -39,6 +40,7 @@ class ApplicationTest extends NsTest { }, 1, 0, 1); } + @Test void 기능_테스트_실패_후_성공() { assertRandomNumberInRangeTest(() -> { @@ -56,12 +58,12 @@ class ApplicationTest extends NsTest { ); }, 1, 0, 1); } - + @DisplayName("재시작 전후로 서로 다른 값일 경우") @Test - void 기능_테스트_실패_후_종료() { + void 기능_테스트_실패_후_종료_다른값() { assertRandomNumberInRangeTest(() -> { run("3", "U", "U", "R", "D", "Q"); - assertThat(output()).contains( + assertThat(output()).containsSubsequence( "[ O | X ]", "[ | ]", "[ ]", @@ -75,6 +77,25 @@ class ApplicationTest extends NsTest { }, 1, 0, 1); } + @DisplayName("재시작 전후로 서로 같은 값일 경우") + @Test + void 기능_테스트_실패_후_종료_같은값() { + assertRandomNumberInRangeTest(() -> { + run("3", "U", "D", "R", "D", "Q"); + assertThat(output()).containsSubsequence( + "[ O | ]", + "[ | X ]", + "[ ]", + "[ X ]", + "최종 게임 결과", + "[ O | ]", + "[ | X ]", + "게임 성공 여부: 실패", + "총 시도한 횟수: 2" + ); + }, 1, 1, 1); + } + @Test void 예외_테스트() { assertSimpleTest(() -> { From 4c9a6759bb2c98f9dfa5902db1a21c555e553ec2 Mon Sep 17 00:00:00 2001 From: swandevson Date: Fri, 18 Nov 2022 23:43:49 +0900 Subject: [PATCH 45/77] =?UTF-8?q?Fix(OutputView):=20=EC=8B=A4=ED=8C=A8=20?= =?UTF-8?q?=EC=8B=9C=20=EC=9E=98=EB=AA=BB=EB=90=9C=20=EA=B2=B0=EA=B3=BC=20?= =?UTF-8?q?=EC=B6=9C=EB=A0=A5?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- src/main/java/bridge/View/OutputView.java | 44 ++++++++--------------- 1 file changed, 14 insertions(+), 30 deletions(-) diff --git a/src/main/java/bridge/View/OutputView.java b/src/main/java/bridge/View/OutputView.java index 0a36f16db5d..e82c196884a 100644 --- a/src/main/java/bridge/View/OutputView.java +++ b/src/main/java/bridge/View/OutputView.java @@ -20,18 +20,6 @@ public class OutputView { private static final String RETRY_COUNT = "총 시도한 횟수: %d" + System.lineSeparator(); - private String getSelectResult(Player player, String stair) { - if (!stair.equals(player.getSelection())) { - return NOT_SELECTION; - } - - if (!player.isAlive()) { - return WRONG_SELECTION; - } - - return RIGHT_SELECTION; - } - private String getIsPassedStair(String bridgeState, String stair) { if (bridgeState.equals(stair)) { return RIGHT_SELECTION; @@ -54,22 +42,20 @@ private String getPassedStair(List bridgeStates, int passedCount, String return result; } - private void printStair(List bridgeStates, Player player, String stair) { - String result; - int passedCount = player.getPassedCount(); + private void printStair(BridgeGame bridgeGame, String stair) { + List bridgeStates = bridgeGame.getBridgeStates(); + int passedCount = bridgeGame.getPlayerLocation(); + String selectedBridgeState = bridgeStates.get(passedCount); - result = getPassedStair(bridgeStates, passedCount, stair); - result += getSelectResult(player, stair); + String result = getPassedStair(bridgeStates, passedCount, stair) + + getLastSelectResult(bridgeGame, selectedBridgeState, stair); System.out.printf(BRIDGE_MAP, result); } public void printMap(BridgeGame bridgeGame) { - List bridgeState = bridgeGame.getBridgeStates(); - Player player = bridgeGame.getPlayer(); - - printStair(bridgeState, player, SELECTION_UP); - printStair(bridgeState, player, SELECTION_DOWN); + printStair(bridgeGame, SELECTION_UP); + printStair(bridgeGame, SELECTION_DOWN); System.out.println(); } @@ -87,11 +73,8 @@ private String getIsSuccess(BridgeGame bridgeGame) { return SUCCESS; } - private String getLastSelectResult(BridgeGame bridgeGame, String stair) { - List bridgeStates = bridgeGame.getBridgeStates(); - String bridgeState = bridgeStates.get(bridgeGame.getMaxPassedCount()); - - if (bridgeGame.winGame() && bridgeState.equals(stair)) { + private String getLastSelectResult(BridgeGame bridgeGame, String bridgeState, String stair) { + if (!bridgeGame.isPlayerDead() && bridgeState.equals(stair)) { return RIGHT_SELECTION; } @@ -104,10 +87,11 @@ private String getLastSelectResult(BridgeGame bridgeGame, String stair) { private void printResultStair(BridgeGame bridgeGame, String stair) { List bridgeStates = bridgeGame.getBridgeStates(); - int passedCount = bridgeGame.getMaxPassedCount(); + int maxPassedCount = bridgeGame.getMaxPassedCount(); + String lastBridgeState = bridgeStates.get(maxPassedCount); - String result = getPassedStair(bridgeStates, passedCount, stair); - result += getLastSelectResult(bridgeGame, stair); + String result = getPassedStair(bridgeStates, maxPassedCount, stair) + + getLastSelectResult(bridgeGame, lastBridgeState, stair); System.out.printf(BRIDGE_MAP, result); } From b6034f8c9bf72498d5c700f7d4d118eb03f47e71 Mon Sep 17 00:00:00 2001 From: swandevson Date: Sat, 19 Nov 2022 00:03:23 +0900 Subject: [PATCH 46/77] =?UTF-8?q?Refactor(OutputView):=20=EC=B6=9C?= =?UTF-8?q?=EB=A0=A5=EB=AC=B8=20=EB=B0=98=ED=99=98=20=EB=B0=8F=20=EC=B6=9C?= =?UTF-8?q?=EB=A0=A5=20=EA=B8=B0=EB=8A=A5=20=EC=BA=A1=EC=8A=90=ED=99=94?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit - printResult에서 printMap을 사용할 수 있도록 변경 --- src/main/java/bridge/Application.java | 2 +- src/main/java/bridge/View/OutputView.java | 39 ++++++----------------- 2 files changed, 11 insertions(+), 30 deletions(-) diff --git a/src/main/java/bridge/Application.java b/src/main/java/bridge/Application.java index 794cafc9c4b..6c895404f82 100644 --- a/src/main/java/bridge/Application.java +++ b/src/main/java/bridge/Application.java @@ -52,7 +52,7 @@ public static void inputCommand(BridgeGame bridgeGame) { public static void run(BridgeGame bridgeGame) { while(!bridgeGame.winGame() && !bridgeGame.isPlayerDead()) { inputMoving(bridgeGame); - outputView.printMap(bridgeGame); + outputView.printMap(bridgeGame, bridgeGame.getPassedCount()); bridgeGame.updatePlayer(); } } diff --git a/src/main/java/bridge/View/OutputView.java b/src/main/java/bridge/View/OutputView.java index e82c196884a..db649032b64 100644 --- a/src/main/java/bridge/View/OutputView.java +++ b/src/main/java/bridge/View/OutputView.java @@ -6,7 +6,6 @@ import static bridge.Constant.OutputValue.*; import bridge.Domain.BridgeGame; -import bridge.Domain.Player; import java.util.List; @@ -28,7 +27,6 @@ private String getIsPassedStair(String bridgeState, String stair) { return NOT_SELECTION; } - private String getPassedStair(List bridgeStates, int passedCount, String stair) { String result = ""; @@ -42,29 +40,16 @@ private String getPassedStair(List bridgeStates, int passedCount, String return result; } - private void printStair(BridgeGame bridgeGame, String stair) { + private void printStair(BridgeGame bridgeGame, int passedCount, String stair) { List bridgeStates = bridgeGame.getBridgeStates(); - int passedCount = bridgeGame.getPlayerLocation(); String selectedBridgeState = bridgeStates.get(passedCount); String result = getPassedStair(bridgeStates, passedCount, stair) - + getLastSelectResult(bridgeGame, selectedBridgeState, stair); + + getSelectResult(bridgeGame, selectedBridgeState, stair); System.out.printf(BRIDGE_MAP, result); } - public void printMap(BridgeGame bridgeGame) { - printStair(bridgeGame, SELECTION_UP); - printStair(bridgeGame, SELECTION_DOWN); - System.out.println(); - } - - /** - * 게임의 최종 결과를 정해진 형식에 맞춰 출력한다. - *

- * 출력을 위해 필요한 메서드의 인자(parameter)는 자유롭게 추가하거나 변경할 수 있다. - */ - private String getIsSuccess(BridgeGame bridgeGame) { if (bridgeGame.isPlayerDead()) { return FAIL; @@ -73,7 +58,7 @@ private String getIsSuccess(BridgeGame bridgeGame) { return SUCCESS; } - private String getLastSelectResult(BridgeGame bridgeGame, String bridgeState, String stair) { + private String getSelectResult(BridgeGame bridgeGame, String bridgeState, String stair) { if (!bridgeGame.isPlayerDead() && bridgeState.equals(stair)) { return RIGHT_SELECTION; } @@ -85,22 +70,18 @@ private String getLastSelectResult(BridgeGame bridgeGame, String bridgeState, St return NOT_SELECTION; } - private void printResultStair(BridgeGame bridgeGame, String stair) { - List bridgeStates = bridgeGame.getBridgeStates(); - int maxPassedCount = bridgeGame.getMaxPassedCount(); - String lastBridgeState = bridgeStates.get(maxPassedCount); - - String result = getPassedStair(bridgeStates, maxPassedCount, stair) - + getLastSelectResult(bridgeGame, lastBridgeState, stair); - - System.out.printf(BRIDGE_MAP, result); + public void printMap(BridgeGame bridgeGame, int passedCount) { + printStair(bridgeGame, passedCount, SELECTION_UP); + printStair(bridgeGame, passedCount, SELECTION_DOWN); + System.out.println(); } public void printResult(BridgeGame bridgeGame) { + int maxPassedCount = bridgeGame.getMaxPassedCount(); + System.out.println(RESULT_MESSAGE); - printResultStair(bridgeGame, SELECTION_UP); - printResultStair(bridgeGame, SELECTION_DOWN); + printMap(bridgeGame, maxPassedCount); System.out.printf(IS_SUCCESS, getIsSuccess(bridgeGame)); System.out.printf(RETRY_COUNT, bridgeGame.getRetryCount()); From b8c81dd285860a796b1565fd1a1d10e65583db48 Mon Sep 17 00:00:00 2001 From: swandevson Date: Sat, 19 Nov 2022 00:03:57 +0900 Subject: [PATCH 47/77] =?UTF-8?q?Feat(BridgeGame):=20=ED=98=84=EC=9E=AC=20?= =?UTF-8?q?=EA=B1=B4=EB=84=8C=20=EB=8B=A4=EB=A6=AC=20=EA=B0=9C=EC=88=98=20?= =?UTF-8?q?getter?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- src/main/java/bridge/Domain/BridgeGame.java | 4 ++++ 1 file changed, 4 insertions(+) diff --git a/src/main/java/bridge/Domain/BridgeGame.java b/src/main/java/bridge/Domain/BridgeGame.java index 7f5c323f991..e1966fce4de 100644 --- a/src/main/java/bridge/Domain/BridgeGame.java +++ b/src/main/java/bridge/Domain/BridgeGame.java @@ -97,4 +97,8 @@ public int getRetryCount() { public int getMaxPassedCount() { return this.maxPassedCount; } + + public int getPassedCount() { + return player.getPassedCount(); + } } From feb3fed35668d6bf2fbb79990b6541b8b1f18e47 Mon Sep 17 00:00:00 2001 From: swandevson Date: Sat, 19 Nov 2022 00:04:21 +0900 Subject: [PATCH 48/77] =?UTF-8?q?Docs(README.md):=20=EA=B8=B0=EB=8A=A5=20?= =?UTF-8?q?=EB=AA=A9=EB=A1=9D=20=EC=B2=B4=ED=81=AC=EB=A6=AC=EC=8A=A4?= =?UTF-8?q?=ED=8A=B8=20=EC=B5=9C=EC=8B=A0=ED=99=94?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- docs/README.md | 10 +++++----- 1 file changed, 5 insertions(+), 5 deletions(-) diff --git a/docs/README.md b/docs/README.md index f764f8d3ff9..43a532087a5 100644 --- a/docs/README.md +++ b/docs/README.md @@ -48,9 +48,9 @@ ### 6. 결과 출력 `OutputView`/`printResult` - - [ ] 최고 기록을 출력한다. - - [ ] 게임 성공 여부를 출력한다. - - [ ] 총 시도 횟수를 출력한다. + - [x] 최고 기록을 출력한다. + - [x] 게임 성공 여부를 출력한다. + - [x] 총 시도 횟수를 출력한다. @@ -128,8 +128,8 @@ --- -- [ ] `Exception`이 아닌 `IllegalArgumentException`과 같이 명확하게 유형을 처리하였는가? -- [ ] 입출력 요구 사항을 모두 지켰는가? +- [x] `Exception`이 아닌 `IllegalArgumentException`과 같이 명확하게 유형을 처리하였는가? +- [x] 입출력 요구 사항을 모두 지켰는가? - [x] 게임 시작 문구 - [x] 길이 입력 문구 - [x] 칸 입력 문구 From 577b08c2e4ab935d5a31c763fe5b05d49892a5bd Mon Sep 17 00:00:00 2001 From: swandevson Date: Sat, 19 Nov 2022 00:28:28 +0900 Subject: [PATCH 49/77] =?UTF-8?q?Style:=20=EC=BD=94=EB=93=9C=20=ED=8F=AC?= =?UTF-8?q?=EB=A7=B7=ED=8C=85=20=EB=B3=80=EA=B2=BD=20=EB=B0=8F=20import=20?= =?UTF-8?q?=EC=B6=95=EC=95=BD?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- src/main/java/bridge/Application.java | 2 ++ src/main/java/bridge/Domain/Bridge.java | 1 - src/main/java/bridge/Domain/BridgeBlock.java | 2 ++ src/main/java/bridge/Domain/BridgeGame.java | 30 +++++++------------ .../java/bridge/Domain/InputConverter.java | 2 -- .../java/bridge/Domain/InputValidator.java | 9 ++++-- src/main/java/bridge/Domain/Player.java | 28 ++++++++++------- src/main/java/bridge/View/InputView.java | 20 ++++--------- src/main/java/bridge/View/OutputView.java | 5 ++-- 9 files changed, 45 insertions(+), 54 deletions(-) diff --git a/src/main/java/bridge/Application.java b/src/main/java/bridge/Application.java index 6c895404f82..35962e72f2e 100644 --- a/src/main/java/bridge/Application.java +++ b/src/main/java/bridge/Application.java @@ -4,6 +4,8 @@ import bridge.View.InputView; import bridge.View.OutputView; + + public class Application { private static InputView inputView = new InputView(); private static OutputView outputView = new OutputView(); diff --git a/src/main/java/bridge/Domain/Bridge.java b/src/main/java/bridge/Domain/Bridge.java index 7ddc4658ae7..8dc29b536f5 100644 --- a/src/main/java/bridge/Domain/Bridge.java +++ b/src/main/java/bridge/Domain/Bridge.java @@ -44,5 +44,4 @@ public List getBridgeStates() { public String getBridgeState(int bridgeLocation) { return bridgeStates.get(bridgeLocation); } - } diff --git a/src/main/java/bridge/Domain/BridgeBlock.java b/src/main/java/bridge/Domain/BridgeBlock.java index a7527b7a1ac..145289f532e 100644 --- a/src/main/java/bridge/Domain/BridgeBlock.java +++ b/src/main/java/bridge/Domain/BridgeBlock.java @@ -2,6 +2,8 @@ import java.util.Arrays; + + public enum BridgeBlock { UP("U", 1), DOWN("D", 0); diff --git a/src/main/java/bridge/Domain/BridgeGame.java b/src/main/java/bridge/Domain/BridgeGame.java index e1966fce4de..b0e36ee41ff 100644 --- a/src/main/java/bridge/Domain/BridgeGame.java +++ b/src/main/java/bridge/Domain/BridgeGame.java @@ -2,9 +2,8 @@ import java.util.List; -/** - * 다리 건너기 게임을 관리하는 클래스 - */ + + public class BridgeGame { Bridge bridge; Player player; @@ -23,11 +22,7 @@ public BridgeGame(int size) throws IllegalArgumentException { } } - /** - * 사용자가 칸을 이동할 때 사용하는 메서드 - *

- * 이동을 위해 필요한 메서드의 반환 타입(return type), 인자(parameter)는 자유롭게 추가하거나 변경할 수 있다. - */ + public void move(String playerSelection) { player.setSelection(playerSelection); @@ -39,11 +34,6 @@ public void move(String playerSelection) { } } - /** - * 사용자가 게임을 다시 시도할 때 사용하는 메서드 - *

- * 재시작을 위해 필요한 메서드의 반환 타입(return type), 인자(parameter)는 자유롭게 추가하거나 변경할 수 있다. - */ public void retry(String command) { if (this.maxPassedCount < player.getPassedCount()) { this.maxPassedCount = player.getPassedCount(); @@ -54,13 +44,11 @@ public void retry(String command) { } } - public boolean winGame() { int playerNextLocation = player.getPassedCount(); List bridgeStates = bridge.getBridgeStates(); - // 다음에 이동할 곳이 인덱스를 벗어날 경우 끝에 도달한 것 - if (bridgeStates.size() <= playerNextLocation) { + if (bridgeStates.size() <= playerNextLocation) { // 다음에 이동할 곳이 인덱스를 벗어날 경우 끝에 도달한 것 this.maxPassedCount = playerNextLocation - 1; return true; } @@ -68,10 +56,6 @@ public boolean winGame() { return false; } - public List getBridgeStates() { - return this.bridge.getBridgeStates(); - } - public boolean isPlayerDead() { if (player.isAlive()) { return false; @@ -86,6 +70,11 @@ public void updatePlayer() { } } + //getter + public List getBridgeStates() { + return this.bridge.getBridgeStates(); + } + public Player getPlayer() { return this.player; } @@ -101,4 +90,5 @@ public int getMaxPassedCount() { public int getPassedCount() { return player.getPassedCount(); } + } diff --git a/src/main/java/bridge/Domain/InputConverter.java b/src/main/java/bridge/Domain/InputConverter.java index 975de0eca7f..c6c17420243 100644 --- a/src/main/java/bridge/Domain/InputConverter.java +++ b/src/main/java/bridge/Domain/InputConverter.java @@ -1,8 +1,6 @@ package bridge.Domain; public class InputConverter { - - public static int convertToInt(String input) throws IllegalArgumentException { try { InputValidator.validateNumberInput(input); diff --git a/src/main/java/bridge/Domain/InputValidator.java b/src/main/java/bridge/Domain/InputValidator.java index 99586469222..8eb716d2ef1 100644 --- a/src/main/java/bridge/Domain/InputValidator.java +++ b/src/main/java/bridge/Domain/InputValidator.java @@ -1,10 +1,15 @@ package bridge.Domain; -import static bridge.Constant.InputValue.*; +import static bridge.Constant.InputValue.COMMAND_QUIT; +import static bridge.Constant.InputValue.COMMAND_RETRY; +import static bridge.Constant.InputValue.SELECTION_DOWN; +import static bridge.Constant.InputValue.SELECTION_UP; + + public class InputValidator { private static final String ERROR_PREFIX = "[ERROR]"; - private static final String EMPTY_INPUT = ERROR_PREFIX + "빈 문자입니다."; + private static final String EMPTY_INPUT = ERROR_PREFIX + "빈 문자입니다."; private static final String WRONG_SIZE_INPUT = ERROR_PREFIX + "숫자만 입력 가능합니다."; private static final String WRONG_SELECTION_INPUT = ERROR_PREFIX + "'U' 또는 'D'만 입력 가능합니다."; private static final String WRONG_COMMAND_INPUT = ERROR_PREFIX + "종료를 위해서는 'Q', 재시작을 위해서는 'R을 입력해주세요."; diff --git a/src/main/java/bridge/Domain/Player.java b/src/main/java/bridge/Domain/Player.java index fde4c8da9a8..1ee696219f8 100644 --- a/src/main/java/bridge/Domain/Player.java +++ b/src/main/java/bridge/Domain/Player.java @@ -1,5 +1,7 @@ package bridge.Domain; + + public class Player { private int passedCount; private String selection; @@ -13,11 +15,20 @@ public Player() { } - public void setSelection(String selection) { - this.selection = selection; + public void die() { + this.alive = false; } + public void success() { + this.passedCount++; + } + + public void revive() { + this.alive = true; + this.passedCount = 0; + } + // getter public boolean isAlive() { return this.alive; } @@ -30,17 +41,12 @@ public String getSelection() { return this.selection; } - public void die() { - this.alive = false; - } - public void success() { - this.passedCount++; + // setter + public void setSelection(String selection) { + this.selection = selection; } - public void revive() { - this.alive = true; - this.passedCount = 0; - } + } diff --git a/src/main/java/bridge/View/InputView.java b/src/main/java/bridge/View/InputView.java index 5c546a8594f..27057a7bc00 100644 --- a/src/main/java/bridge/View/InputView.java +++ b/src/main/java/bridge/View/InputView.java @@ -1,29 +1,25 @@ package bridge.View; +import static camp.nextstep.edu.missionutils.Console.readLine; + import bridge.Domain.InputConverter; import bridge.Domain.InputValidator; -import static camp.nextstep.edu.missionutils.Console.readLine; -/** - * 사용자로부터 입력을 받는 역할을 한다. - */ + public class InputView { private static final String START_GAME = "다리 건너기 게임을 시작합니다."; private static final String INPUT_BRIDGE_SIZE = "다리의 길이를 입력해주세요."; private static final String INPUT_SELECTION = "이동할 칸을 선택해주세요. (위: U, 아래: D)"; private static final String INPUT_COMMAND = "게임을 다시 시도할지 여부를 입력해주세요. (재시도: R, 종료: Q)"; - /** - * 다리의 길이를 입력받는다. - */ + public void printStartMessage() { System.out.println(START_GAME); } public int readBridgeSize() throws IllegalArgumentException { System.out.println(INPUT_BRIDGE_SIZE); - String input = readLine(); try { @@ -37,9 +33,6 @@ public int readBridgeSize() throws IllegalArgumentException { } - /** - * 사용자가 이동할 칸을 입력받는다. - */ public String readMoving() throws IllegalArgumentException { System.out.println(INPUT_SELECTION); String input = readLine(); @@ -53,13 +46,10 @@ public String readMoving() throws IllegalArgumentException { } } - /** - * 사용자가 게임을 다시 시도할지 종료할지 여부를 입력받는다. - */ public String readGameCommand() throws IllegalArgumentException { System.out.println(INPUT_COMMAND); - String input = readLine(); + try { InputValidator.validateCommandInput(input); diff --git a/src/main/java/bridge/View/OutputView.java b/src/main/java/bridge/View/OutputView.java index db649032b64..efcc0e06d50 100644 --- a/src/main/java/bridge/View/OutputView.java +++ b/src/main/java/bridge/View/OutputView.java @@ -9,9 +9,8 @@ import java.util.List; -/** - * 사용자에게 게임 진행 상황과 결과를 출력하는 역할을 한다. - */ + + public class OutputView { private static final String RESULT_MESSAGE = "최종 게임 결과"; private static final String BRIDGE_MAP = "[%s]" + System.lineSeparator(); From 0d00d5e454ad6e82e88019ebbeceaf166dcb0164 Mon Sep 17 00:00:00 2001 From: swandevson Date: Sat, 19 Nov 2022 00:33:25 +0900 Subject: [PATCH 50/77] =?UTF-8?q?Remove:=20=EC=82=AC=EC=9A=A9=ED=95=98?= =?UTF-8?q?=EC=A7=80=20=EC=95=8A=EB=8A=94=20=ED=95=84=EB=93=9C=20=EB=B0=8F?= =?UTF-8?q?=20=EB=A9=94=EC=86=8C=EB=93=9C=20=EC=A0=9C=EA=B1=B0?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- src/main/java/bridge/Domain/BridgeGame.java | 6 ------ src/main/java/bridge/Domain/Player.java | 15 --------------- src/main/java/bridge/View/OutputView.java | 2 +- 3 files changed, 1 insertion(+), 22 deletions(-) diff --git a/src/main/java/bridge/Domain/BridgeGame.java b/src/main/java/bridge/Domain/BridgeGame.java index b0e36ee41ff..543de9a86f1 100644 --- a/src/main/java/bridge/Domain/BridgeGame.java +++ b/src/main/java/bridge/Domain/BridgeGame.java @@ -24,8 +24,6 @@ public BridgeGame(int size) throws IllegalArgumentException { public void move(String playerSelection) { - player.setSelection(playerSelection); - int nextPlayerLocation = player.getPassedCount(); String nextBridgeState = bridge.getBridgeState(nextPlayerLocation); @@ -75,10 +73,6 @@ public List getBridgeStates() { return this.bridge.getBridgeStates(); } - public Player getPlayer() { - return this.player; - } - public int getRetryCount() { return this.retryCount; } diff --git a/src/main/java/bridge/Domain/Player.java b/src/main/java/bridge/Domain/Player.java index 1ee696219f8..1149bffdbc6 100644 --- a/src/main/java/bridge/Domain/Player.java +++ b/src/main/java/bridge/Domain/Player.java @@ -4,13 +4,11 @@ public class Player { private int passedCount; - private String selection; private boolean alive; public Player() { this.passedCount = 0; - this.selection = null; this.alive = true; } @@ -36,17 +34,4 @@ public boolean isAlive() { public int getPassedCount() { return this.passedCount; } - - public String getSelection() { - return this.selection; - } - - - // setter - public void setSelection(String selection) { - this.selection = selection; - } - - - } diff --git a/src/main/java/bridge/View/OutputView.java b/src/main/java/bridge/View/OutputView.java index efcc0e06d50..bba51bd1679 100644 --- a/src/main/java/bridge/View/OutputView.java +++ b/src/main/java/bridge/View/OutputView.java @@ -62,7 +62,7 @@ private String getSelectResult(BridgeGame bridgeGame, String bridgeState, String return RIGHT_SELECTION; } - if (bridgeGame.isPlayerDead() && !bridgeState.equals(stair)) { // 옳지 않은 발판을 선택해서 죽었기 때문에 해당 위치에 X 출력 + if (bridgeGame.isPlayerDead() && !bridgeState.equals(stair)) { return WRONG_SELECTION; } From 8354bd74f9f35319d938c297286fce28038c2277 Mon Sep 17 00:00:00 2001 From: swandevson Date: Sat, 19 Nov 2022 00:36:12 +0900 Subject: [PATCH 51/77] =?UTF-8?q?Docs(README.md):=20=EC=B2=B4=ED=81=AC?= =?UTF-8?q?=EB=A6=AC=EC=8A=A4=ED=8A=B8=20=EC=B5=9C=EC=8B=A0=ED=99=94?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- docs/README.md | 15 +++++++-------- 1 file changed, 7 insertions(+), 8 deletions(-) diff --git a/docs/README.md b/docs/README.md index 43a532087a5..6d2129f0121 100644 --- a/docs/README.md +++ b/docs/README.md @@ -136,13 +136,12 @@ - [x] 칸 입력 후 다리 상태 - [x] 실패했을 시 재시도, 종료 여부 - [x] 게임 성공 여부 및 시도 횟수 -- [ ] 함수(또는 메소드)의 길이가 10라인 미만인가? (빈줄 포함) -- [ ] 함수(또는 메소드)의 파라미터가 3개 이하인가? -- [ ] 클래스 제약 사항들을 모두 지켰는가? - - [ ] `OutuptView`의 메소드 이름을 변경하면 안된다. - - [ ] `BridgeMaker`의 메소드의 시그니처(인자, 이름)와 반환 타입을 변경하면 안된다. - - [ ] `BridgeGame`의 메소드 이름을 변경하면 안된다. - - [ ] `Bridge` - - [ ] `InputView` 클래스에서만 `readLine()`을 사용한다. +- [x] 함수(또는 메소드)의 길이가 10라인 이내인가? (빈줄 포함) +- [x] 함수(또는 메소드)의 파라미터가 3개 이하인가? +- [x] 클래스 제약 사항들을 모두 지켰는가? + - [x] `OutuptView`의 메소드 이름을 변경하면 안된다. (printMap, printResult) + - [x] `BridgeMaker`의 메소드의 시그니처(인자, 이름)와 반환 타입을 변경하면 안된다. + - [x] `BridgeGame`의 메소드 이름을 변경하면 안된다. (move, retry) + - [x] `InputView` 클래스에서만 `readLine()`을 사용한다. - [x] `BridgeRandomNumberGenerator`, `BridgeNumberGenerator`의 를 수정하면 안된다. - [x] `BridgeRandomNumberGenerator`, `BridgeNumberGenerator`의 패키지를 수정하면 안된다. From 5ed41e21a6799d67aa830f7eabfcebdd8f3866fa Mon Sep 17 00:00:00 2001 From: swandevson Date: Sat, 19 Nov 2022 00:58:43 +0900 Subject: [PATCH 52/77] =?UTF-8?q?Docs(README.md):=20=EA=B8=B0=EB=8A=A5=20?= =?UTF-8?q?=EB=AA=A9=EB=A1=9D,=20=ED=81=B4=EB=9E=98=EC=8A=A4=20=EC=84=A4?= =?UTF-8?q?=EA=B3=84=20=EC=97=85=EB=8D=B0=EC=9D=B4=ED=8A=B8?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- docs/README.md | 105 +++++++++++++++++++++++++++---------------------- 1 file changed, 59 insertions(+), 46 deletions(-) diff --git a/docs/README.md b/docs/README.md index 6d2129f0121..6ddf37d7127 100644 --- a/docs/README.md +++ b/docs/README.md @@ -20,34 +20,32 @@ ### 1. 게임 시작 문구를 출력한다. - `View`/`InputView` ### 2. 다리의 길이를 숫자를 입력받고 생성한다. - - [x] 입력받은 숫자(문자열)을 정수로 변환한다. `Domain`/`Converter` - - [x] 숫자가 아닌 입력일 경우(문자, 빈 문자열) 예외를 던진다. - - [x] 잘못된 입력일 경우, 올바른 입력이 될 때 까지 입력받는다. - - [x] 입력받은 숫자가 3 이상 20 이하인지 확인하고 아니면 예외를 던진다. - `Controller`/`BridgeMaker` from `Validator`/`InputValidator` - - [x] 0과 1을 다리 길이만큼 무작위로 생성한다. `Controller`/`BridgeMaker` from `Controller`/`BridgeRandomNumberGenerator` - - [x] 0인 경우 아랫 칸인 `D`, 1인 경우 윗 칸인 `U`인 다리 리스트를 만든다. - `Controller`/`BridgeMaker` + - [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] 정해진 문자가 아니거나 입력이 없으면 예외를 던진다. `Validator`/`InputValidator` - - [x] 예외가 발생할 경우, 다시 입력받도록 한다. `Controller`/`BridgeGame` - - [x] 이동 후 생사여부를 update한다 `Controller`/`BridgeGame` -> `Model`/`UserBridge` + - [x] 정해진 문자가 아니거나 입력이 없으면 예외를 던진다. - `Domain`/`InputValidator` + - [x] 예외가 발생할 경우, 다시 입력받도록 한다. - from `Application` call `View`/`InputView` + - [x] 이동 후 생사여부를 update한다 - in `Domain`/`BridgeGame` update `Domain`/`Player` ### 4. 입력 결과를 출력한다. - - [X] 건너온 칸들은 전부 O로 출력하고 칸 일치여부와 생사여부에 따라 O, X를 출력을 결정한다. `View`/`OutputView` + - [X] 건너온 칸들은 전부 O로 출력하고 칸 일치여부와 생사여부에 따라 O, X를 출력을 결정한다. - from `Application` call `View`/`OutputView` ### 5. 생사여부를 판별 후, 다음 행동을 결정한다. #### 5-1. 죽었을 때 - - [x] 건너다 실패하면 재시작 `R`, 종료 `Q` 할 수 있다. - - [x] 정해진 문자가 아니거나 입력이 없으면 예외를 던진다 `Validator`/`InputValidator` - - [x] 예외가 발생할 경우, 다시 입력받도록 한다. - - [x] 재시작시 처음부터 다시 진행한다. - - [x] 종료시 최종 결과를 출력하고 종료한다. + - [x] 건너다 실패하면 재시작 `R`, 종료 `Q` 할 수 있다. `View`/`InputView` + - [x] 정해진 문자가 아니거나 입력이 없으면 예외를 던진다 `Domain`/`InputValidator` + - [x] 예외가 발생할 경우, 다시 입력받도록 한다. from `Application` call `View`/`InputView` + - [x] 재시작시 처음부터 다시 진행한다. - `Application` #### 5-2. 살았을 때 -- [x] 끝에 도달할 때 까지 계속 진행한다. -- [x] 끝에 도달하면 결과를 출력하고 종료한다. +- [x] 끝에 도달할 때 까지 계속 진행한다. - `Application` -### 6. 결과 출력 `OutputView`/`printResult` +### 6. 게임 종료시 결과를 출력한다. `OutputView`/`printResult` - [x] 최고 기록을 출력한다. - [x] 게임 성공 여부를 출력한다. - [x] 총 시도 횟수를 출력한다. @@ -63,26 +61,63 @@ - Bridge를 랜덤한 길이로 생성 ``` -## Model +## Constant --- +- ### InputValue +``` + - 사용자 입력값으로 이루어진 상수 클래스 +``` + +- ### OutputValue +``` + - 출력값으로 이루어진 상수 클래스 +``` + + +## Domain + +--- + +- ### InputConverter +``` + - 사용자가 입력한 값(문자열)을 정수로 변환해 return + - 변환 불가시 예외를 던짐 +``` + +- ### InputValidator +``` + - 입력값에 대한 검증 + - 올바르지 않은 입력일 시 예외를 던짐 +``` + + - ### Bridge ``` - 게임에 사용되는 다리 정보 ``` -- ### Selection +- ### BridgeBlock ``` - - 선택에 대한 정보를 담은 enum 클래스 + - 사용자 선택 정보를 열거형 상수로 지정한 enum 클래스 ``` -- ### User +- ### Player ``` - 현재 위치 - 생사 여부 ``` +- ### BridgeGame +``` + - 게임 상태 및 제어에 관련된 클래스 + - 주어진 값에 대한 검증 + - 개수를 입력받고 Bridge 모델 초기화 + - 입력값에 따라 유저의 생사 여부 및 위치 결정 + - 최고 기록을 저장 +``` + ## View @@ -92,36 +127,14 @@ ``` - 게임 시작 문구 출력 - 입력 문구 출력 - - 입력받은 값을 Controller에 전달 + - 입력받은 값을 검증 후 반환 ``` ### OutputView ``` - 결과 문구 출력 - - update된 model의 정보를 출력 + - update된 정보를 가공하여 출력 ``` -## Controller - ---- - -- ### BridgeGame -``` - - 게임 실행 및 상태에 관련된 클래스 - - 입력 값에 대한 검증 - - 개수를 입력받고 Bridge 모델 초기화 - - 입력값에 따라 유저의 생사 여부 및 위치 결정 -``` - -- ### Converter -``` - - 사용자가 입력한 값(문자열)을 정수로 변환해 return -``` - - -- ### Validator -``` - - 입력값에 대한 검증 -``` # ❗ 주의사항 체크 리스트 From 712a3221bafac02897a17b3f1ca941d85ccaec1b Mon Sep 17 00:00:00 2001 From: swandevson Date: Sat, 19 Nov 2022 01:06:19 +0900 Subject: [PATCH 53/77] =?UTF-8?q?Refactor:=20final=20=ED=82=A4=EC=9B=8C?= =?UTF-8?q?=EB=93=9C=20=EC=B6=94=EA=B0=80?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit - 변하면 치명적인 오류가 발생하는 멤버 final로 지정 --- src/main/java/bridge/Domain/Bridge.java | 2 +- src/main/java/bridge/Domain/BridgeGame.java | 2 +- src/main/java/bridge/View/OutputView.java | 6 +++--- 3 files changed, 5 insertions(+), 5 deletions(-) diff --git a/src/main/java/bridge/Domain/Bridge.java b/src/main/java/bridge/Domain/Bridge.java index 8dc29b536f5..fbc6c826d42 100644 --- a/src/main/java/bridge/Domain/Bridge.java +++ b/src/main/java/bridge/Domain/Bridge.java @@ -14,7 +14,7 @@ public class Bridge { private final static String WRONG_RANGE_INPUT = "[ERROR] 다리 길이는 3부터 20 사이의 숫자여야 합니다."; - private List bridgeStates; + final private List bridgeStates; public Bridge(int bridgeSize) throws IllegalArgumentException { diff --git a/src/main/java/bridge/Domain/BridgeGame.java b/src/main/java/bridge/Domain/BridgeGame.java index 543de9a86f1..bd369be89f9 100644 --- a/src/main/java/bridge/Domain/BridgeGame.java +++ b/src/main/java/bridge/Domain/BridgeGame.java @@ -5,7 +5,7 @@ public class BridgeGame { - Bridge bridge; + final Bridge bridge; Player player; private int retryCount; private int maxPassedCount; diff --git a/src/main/java/bridge/View/OutputView.java b/src/main/java/bridge/View/OutputView.java index bba51bd1679..887f15a96b4 100644 --- a/src/main/java/bridge/View/OutputView.java +++ b/src/main/java/bridge/View/OutputView.java @@ -40,10 +40,10 @@ private String getPassedStair(List bridgeStates, int passedCount, String } private void printStair(BridgeGame bridgeGame, int passedCount, String stair) { - List bridgeStates = bridgeGame.getBridgeStates(); - String selectedBridgeState = bridgeStates.get(passedCount); + final List bridgeStates = bridgeGame.getBridgeStates(); + final String selectedBridgeState = bridgeStates.get(passedCount); - String result = getPassedStair(bridgeStates, passedCount, stair) + final String result = getPassedStair(bridgeStates, passedCount, stair) + getSelectResult(bridgeGame, selectedBridgeState, stair); System.out.printf(BRIDGE_MAP, result); From f8cebe393948b19b9f004ae401add715866b13ca Mon Sep 17 00:00:00 2001 From: swandevson Date: Sat, 19 Nov 2022 01:09:50 +0900 Subject: [PATCH 54/77] =?UTF-8?q?Style(Bridge):=20=EC=97=90=EB=9F=AC=20?= =?UTF-8?q?=EB=A9=94=EC=84=B8=EC=A7=80=20=ED=8F=AC=EB=A7=B7=ED=8C=85=20?= =?UTF-8?q?=EB=B3=80=EA=B2=BD?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- src/main/java/bridge/Domain/Bridge.java | 6 ++++-- 1 file changed, 4 insertions(+), 2 deletions(-) diff --git a/src/main/java/bridge/Domain/Bridge.java b/src/main/java/bridge/Domain/Bridge.java index fbc6c826d42..f25c7f9ed31 100644 --- a/src/main/java/bridge/Domain/Bridge.java +++ b/src/main/java/bridge/Domain/Bridge.java @@ -11,7 +11,7 @@ public class Bridge { private final static int MIN_BRIDGE_SIZE = 3; private final static int MAX_BRIDGE_SIZE = 20; - private final static String WRONG_RANGE_INPUT = "[ERROR] 다리 길이는 3부터 20 사이의 숫자여야 합니다."; + private final static String WRONG_RANGE_INPUT = "[ERROR] 다리 길이는 %d부터 %d 사이의 숫자여야 합니다." + System.lineSeparator(); final private List bridgeStates; @@ -33,7 +33,9 @@ public Bridge(int bridgeSize) throws IllegalArgumentException { public void validate(int bridgeSize) throws IllegalArgumentException { if (bridgeSize < MIN_BRIDGE_SIZE || MAX_BRIDGE_SIZE < bridgeSize) { - throw new IllegalArgumentException(WRONG_RANGE_INPUT); + String rangeError = String.format(WRONG_RANGE_INPUT, MIN_BRIDGE_SIZE, MAX_BRIDGE_SIZE); + + throw new IllegalArgumentException(rangeError); } } From 8d0449b5538163c599b4d71b697a2d62def0ee15 Mon Sep 17 00:00:00 2001 From: swandevson Date: Sat, 19 Nov 2022 01:21:55 +0900 Subject: [PATCH 55/77] =?UTF-8?q?Test(InputConverter):=20=EC=98=88?= =?UTF-8?q?=EC=99=B8=20=EB=A9=94=EC=84=B8=EC=A7=80=20=EC=B6=9C=EB=A0=A5=20?= =?UTF-8?q?=ED=85=8C=EC=8A=A4=ED=8A=B8?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- src/test/java/bridge/Domain/InputConverterTest.java | 11 +++++++++++ 1 file changed, 11 insertions(+) diff --git a/src/test/java/bridge/Domain/InputConverterTest.java b/src/test/java/bridge/Domain/InputConverterTest.java index 9746e7ba8f1..2ddf63c06d3 100644 --- a/src/test/java/bridge/Domain/InputConverterTest.java +++ b/src/test/java/bridge/Domain/InputConverterTest.java @@ -8,6 +8,8 @@ import static org.assertj.core.api.Assertions.assertThatThrownBy; class InputConverterTest { + private static final String ERROR = "[ERROR]"; + @DisplayName("정상적인 값의 문자열을 정수로 변환하는지 확인") @ParameterizedTest @ValueSource(strings = {"12", "1", "5", "4", "10"}) @@ -26,4 +28,13 @@ class InputConverterTest { InputConverter.convertToInt((input))) .isInstanceOf(IllegalArgumentException.class); } + + @DisplayName("잘못된 입력값에 대해 [Error]를 포함한 예외 메세지를 던지는지 확인") + @ParameterizedTest + @ValueSource(strings = {" ", "", "1a", "1,0"}) + void 에러_정수_변환(String input) { + assertThatThrownBy(() -> + InputConverter.convertToInt((input))) + .hasMessageContaining(ERROR); + } } \ No newline at end of file From 813a458f79edfdab971b1f9f1423ba92ce24d09c Mon Sep 17 00:00:00 2001 From: swandevson Date: Sat, 19 Nov 2022 01:29:19 +0900 Subject: [PATCH 56/77] =?UTF-8?q?Fix(InputValidator):=20=EC=88=AB=EC=9E=90?= =?UTF-8?q?=20=EC=A0=95=EA=B7=9C=EC=8B=9D=20=EC=88=98=EC=A0=95?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- src/main/java/bridge/Domain/InputValidator.java | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/src/main/java/bridge/Domain/InputValidator.java b/src/main/java/bridge/Domain/InputValidator.java index 8eb716d2ef1..2447a5d6ef3 100644 --- a/src/main/java/bridge/Domain/InputValidator.java +++ b/src/main/java/bridge/Domain/InputValidator.java @@ -16,13 +16,13 @@ public class InputValidator { public static void validateNumberInput(String input) throws IllegalArgumentException { - final String NOT_NUMBER_REGEX = "[^0-9]"; + final String NUMBER_REGEX = "[0-9]+"; if (input.isBlank()) { throw new IllegalArgumentException(EMPTY_INPUT); } - if (input.matches(NOT_NUMBER_REGEX)) { + if (!input.matches(NUMBER_REGEX)) { throw new IllegalArgumentException(WRONG_SIZE_INPUT); } } From 03c6f084805b947ec8861d6f3952f98cc1d56d64 Mon Sep 17 00:00:00 2001 From: swandevson Date: Sat, 19 Nov 2022 01:30:35 +0900 Subject: [PATCH 57/77] =?UTF-8?q?Fix(InputView):=20=EC=B6=9C=EB=A0=A5?= =?UTF-8?q?=EC=98=88=EC=A0=9C=EC=99=80=20=EC=9D=BC=EC=B9=98=ED=95=98?= =?UTF-8?q?=EB=8F=84=EB=A1=9D=20=EA=B3=B5=EB=B0=B1=20=EC=B6=94=EA=B0=80?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- src/main/java/bridge/View/InputView.java | 1 + 1 file changed, 1 insertion(+) diff --git a/src/main/java/bridge/View/InputView.java b/src/main/java/bridge/View/InputView.java index 27057a7bc00..5f62db10ba4 100644 --- a/src/main/java/bridge/View/InputView.java +++ b/src/main/java/bridge/View/InputView.java @@ -16,6 +16,7 @@ public class InputView { public void printStartMessage() { System.out.println(START_GAME); + System.out.println(); } public int readBridgeSize() throws IllegalArgumentException { From 94fd5f97a3550d91fe830704558850283c08f1fc Mon Sep 17 00:00:00 2001 From: swandevson Date: Sat, 19 Nov 2022 01:48:02 +0900 Subject: [PATCH 58/77] =?UTF-8?q?Test(BridgeTest):=20=EC=97=90=EB=9F=AC=20?= =?UTF-8?q?=EB=A9=94=EC=84=B8=EC=A7=80,=20=EC=A0=95=EC=83=81=20=EC=9E=85?= =?UTF-8?q?=EB=A0=A5=20=ED=85=8C=EC=8A=A4=ED=8A=B8?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- src/test/java/bridge/Domain/BridgeTest.java | 25 ++++++++++++++++++++- 1 file changed, 24 insertions(+), 1 deletion(-) diff --git a/src/test/java/bridge/Domain/BridgeTest.java b/src/test/java/bridge/Domain/BridgeTest.java index d46ff330541..19167de15a0 100644 --- a/src/test/java/bridge/Domain/BridgeTest.java +++ b/src/test/java/bridge/Domain/BridgeTest.java @@ -7,14 +7,37 @@ import static org.assertj.core.api.Assertions.assertThat; import static org.assertj.core.api.Assertions.assertThatThrownBy; +import static org.junit.jupiter.api.Assertions.assertDoesNotThrow; + class BridgeTest { - @DisplayName("범위 외의 숫자 예외 throw") + private static final String ERROR = "[ERROR]"; + private static final int MIN_RANGE = 3; + private static final int MAX_RANGE = 20; + + + @DisplayName("범위 외의 숫자 입력 시 예외 throw") @ParameterizedTest @ValueSource(ints = {1, 2, 55, 101}) void 예외_범위를_벗어난_숫자(int size) { assertThatThrownBy(() -> assertThat(new Bridge(size))) .isInstanceOf(IllegalArgumentException.class); } + + @DisplayName("범위 외의 숫자 입력 시 예외 메세지 확인") + @ParameterizedTest + @ValueSource(ints = {1, 2, 55, 101}) + void 에러_범위를_벗어난_숫자(int size) { + assertThatThrownBy(() -> assertThat(new Bridge(size))) + .hasMessageContaining(ERROR); + } + + @DisplayName("범위 내의 숫자가 예외를 발생하지 않는지 확인") + @ParameterizedTest + @ValueSource(ints = {MIN_RANGE, 5, MAX_RANGE}) + void 입력_범위_내의_숫자(int size) { + assertDoesNotThrow(() -> new Bridge(size)); + + } } \ No newline at end of file From 3c12cba0e70b01c00d36c63e0e711c86c7ddd268 Mon Sep 17 00:00:00 2001 From: swandevson Date: Sat, 19 Nov 2022 01:58:44 +0900 Subject: [PATCH 59/77] =?UTF-8?q?Test(InputValidator):=20=EC=98=88?= =?UTF-8?q?=EC=99=B8=20=EB=B0=8F=20=EC=98=AC=EB=B0=94=EB=A5=B8=20=EC=9E=85?= =?UTF-8?q?=EB=A0=A5=20=EC=B2=B4=ED=81=AC?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../bridge/Domain/InputValidatorTest.java | 28 ++++++++++++++++++- 1 file changed, 27 insertions(+), 1 deletion(-) diff --git a/src/test/java/bridge/Domain/InputValidatorTest.java b/src/test/java/bridge/Domain/InputValidatorTest.java index 1369f75811e..dd1e871469b 100644 --- a/src/test/java/bridge/Domain/InputValidatorTest.java +++ b/src/test/java/bridge/Domain/InputValidatorTest.java @@ -1,13 +1,16 @@ package bridge.Domain; +import bridge.Constant.InputValue; + import org.junit.jupiter.api.DisplayName; import org.junit.jupiter.params.ParameterizedTest; import org.junit.jupiter.params.provider.ValueSource; import static org.assertj.core.api.Assertions.assertThatThrownBy; -class InputValidatorTest { +import static org.junit.jupiter.api.Assertions.assertDoesNotThrow; +class InputValidatorTest { @DisplayName("잘못된 위, 아래 입력 예외 throw") @ParameterizedTest @ValueSource(strings = {"aaa", "bb", "d", "u", "", " "}) @@ -15,4 +18,27 @@ void validateSelectionInput(String input) { assertThatThrownBy(() -> InputValidator.validateSelectionInput(input)) .isInstanceOf(IllegalArgumentException.class); } + + @DisplayName("올바른 위, 아래 입력 체크") + @ParameterizedTest + @ValueSource(strings = {InputValue.SELECTION_DOWN, InputValue.SELECTION_UP}) + void assignSelectionInput(String input) { + assertDoesNotThrow(() -> InputValidator.validateSelectionInput(input)); + } + + @DisplayName("잘못된 재시작/종료 명령어 입력 예외 throw") + @ParameterizedTest + @ValueSource(strings = {"aaa", "bb", "d1", "5", "", " ", "Q3", "3Q"}) + void validateCommandInput(String input) { + assertThatThrownBy(() -> InputValidator.validateCommandInput(input)) + .isInstanceOf(IllegalArgumentException.class); + } + + + @DisplayName("올바른 재시작/종료 명령어 체크") + @ParameterizedTest + @ValueSource(strings = {InputValue.COMMAND_QUIT, InputValue.COMMAND_RETRY}) + void assignCommandInput(String input) { + assertDoesNotThrow(() -> InputValidator.validateCommandInput(input)); + } } \ No newline at end of file From 61dbe3019630d21ee9aefe8f16b40d522f0ec49d Mon Sep 17 00:00:00 2001 From: swandevson Date: Sat, 19 Nov 2022 02:00:53 +0900 Subject: [PATCH 60/77] =?UTF-8?q?Style(BridgeGame):=20=ED=95=98=EB=93=9C?= =?UTF-8?q?=EC=BD=94=EB=94=A9=20=EC=A0=9C=EA=B1=B0?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- src/main/java/bridge/Domain/BridgeGame.java | 5 ++++- 1 file changed, 4 insertions(+), 1 deletion(-) diff --git a/src/main/java/bridge/Domain/BridgeGame.java b/src/main/java/bridge/Domain/BridgeGame.java index bd369be89f9..4767eda1bda 100644 --- a/src/main/java/bridge/Domain/BridgeGame.java +++ b/src/main/java/bridge/Domain/BridgeGame.java @@ -1,5 +1,7 @@ package bridge.Domain; +import bridge.Constant.InputValue; + import java.util.List; @@ -36,7 +38,7 @@ public void retry(String command) { if (this.maxPassedCount < player.getPassedCount()) { this.maxPassedCount = player.getPassedCount(); } - if (command.equals("R")) { + if (command.equals(InputValue.COMMAND_RETRY)) { player.revive(); this.retryCount++; } @@ -48,6 +50,7 @@ public boolean winGame() { if (bridgeStates.size() <= playerNextLocation) { // 다음에 이동할 곳이 인덱스를 벗어날 경우 끝에 도달한 것 this.maxPassedCount = playerNextLocation - 1; + return true; } From 61366a57ff9b4841f940f17a3beacd52b2538433 Mon Sep 17 00:00:00 2001 From: swandevson Date: Sat, 19 Nov 2022 02:48:54 +0900 Subject: [PATCH 61/77] =?UTF-8?q?Refactor(BridgeGame):=20=EC=B5=9C?= =?UTF-8?q?=EB=8C=80=20=EB=8F=84=EB=8B=AC=20=EA=B1=B0=EB=A6=AC=20=EA=B0=B1?= =?UTF-8?q?=EC=8B=A0=20=EA=B8=B0=EB=8A=A5=20=EB=B6=84=EB=A6=AC?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- src/main/java/bridge/Domain/BridgeGame.java | 13 ++++++++++--- 1 file changed, 10 insertions(+), 3 deletions(-) diff --git a/src/main/java/bridge/Domain/BridgeGame.java b/src/main/java/bridge/Domain/BridgeGame.java index 4767eda1bda..6940b3c9b11 100644 --- a/src/main/java/bridge/Domain/BridgeGame.java +++ b/src/main/java/bridge/Domain/BridgeGame.java @@ -35,15 +35,22 @@ public void move(String playerSelection) { } public void retry(String command) { - if (this.maxPassedCount < player.getPassedCount()) { - this.maxPassedCount = player.getPassedCount(); - } + updateMaxPassedCount(); + if (command.equals(InputValue.COMMAND_RETRY)) { player.revive(); this.retryCount++; } } + public void updateMaxPassedCount() { + int passedCount = player.getPassedCount(); + + if (this.maxPassedCount < passedCount) { + this.maxPassedCount = passedCount; + } + } + public boolean winGame() { int playerNextLocation = player.getPassedCount(); List bridgeStates = bridge.getBridgeStates(); From 9d2e15facaff13af490f909d62a4c945e15e60e4 Mon Sep 17 00:00:00 2001 From: swandevson Date: Mon, 21 Nov 2022 23:35:58 +0900 Subject: [PATCH 62/77] =?UTF-8?q?Refactor(Application):=20=EA=B2=8C?= =?UTF-8?q?=EC=9E=84=20=EC=A2=85=EB=A3=8C=20=EC=B2=B4=ED=81=AC=20=EA=B8=B0?= =?UTF-8?q?=EB=8A=A5=20=EB=B6=84=EB=A6=AC=20=EB=B0=8F=20=EA=B2=8C=EC=9E=84?= =?UTF-8?q?=20=EC=9E=AC=EC=8B=9C=EC=9E=91=20=EC=88=98=EC=A0=95?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit - BridgeGame에서 게임 종료 여부를 확인 - run에서 재시작 처리 가능하도록 수정 --- src/main/java/bridge/Application.java | 23 ++++++++++----------- src/main/java/bridge/Domain/BridgeGame.java | 9 +++++++- 2 files changed, 19 insertions(+), 13 deletions(-) diff --git a/src/main/java/bridge/Application.java b/src/main/java/bridge/Application.java index 35962e72f2e..cc3732b25dc 100644 --- a/src/main/java/bridge/Application.java +++ b/src/main/java/bridge/Application.java @@ -12,9 +12,7 @@ public class Application { public static BridgeGame initiateBridgeGame() { - inputView.printStartMessage(); - - while(true) { + while (true) { try { int size = inputView.readBridgeSize(); @@ -26,7 +24,7 @@ public static BridgeGame initiateBridgeGame() { } public static void inputMoving(BridgeGame bridgeGame) { - while(true) { + while (true) { try { String selection = inputView.readMoving(); bridgeGame.move(selection); @@ -39,7 +37,7 @@ public static void inputMoving(BridgeGame bridgeGame) { } public static void inputCommand(BridgeGame bridgeGame) { - while(true) { + while (true) { try { String command = inputView.readGameCommand(); bridgeGame.retry(command); @@ -52,22 +50,23 @@ public static void inputCommand(BridgeGame bridgeGame) { } public static void run(BridgeGame bridgeGame) { - while(!bridgeGame.winGame() && !bridgeGame.isPlayerDead()) { + while (!bridgeGame.isGameOver()) { inputMoving(bridgeGame); outputView.printMap(bridgeGame, bridgeGame.getPassedCount()); bridgeGame.updatePlayer(); + + if (bridgeGame.isPlayerDead()) { + inputCommand(bridgeGame); + } } } public static void main(String[] args) { + inputView.printStartMessage(); + BridgeGame bridgeGame = initiateBridgeGame(); - do { - run(bridgeGame); - if (bridgeGame.isPlayerDead()) { - inputCommand(bridgeGame); - } - } while(!bridgeGame.winGame() && !bridgeGame.isPlayerDead()); + run(bridgeGame); outputView.printResult(bridgeGame); } diff --git a/src/main/java/bridge/Domain/BridgeGame.java b/src/main/java/bridge/Domain/BridgeGame.java index 6940b3c9b11..62630f2799d 100644 --- a/src/main/java/bridge/Domain/BridgeGame.java +++ b/src/main/java/bridge/Domain/BridgeGame.java @@ -1,7 +1,6 @@ package bridge.Domain; import bridge.Constant.InputValue; - import java.util.List; @@ -64,6 +63,14 @@ public boolean winGame() { return false; } + public boolean isGameOver() { + if (isPlayerDead() || winGame()) { + return true; + } + + return false; + } + public boolean isPlayerDead() { if (player.isAlive()) { return false; From c943fb01e33c14b348c25b8afb75288bd1bae6e7 Mon Sep 17 00:00:00 2001 From: swandevson Date: Tue, 22 Nov 2022 00:03:55 +0900 Subject: [PATCH 63/77] =?UTF-8?q?Style:=20=EC=BB=A8=EB=B2=A4=EC=85=98?= =?UTF-8?q?=EC=97=90=20=EB=A7=9E=EA=B2=8C=20=EC=88=98=EC=A0=95?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- src/main/java/bridge/Domain/BridgeGame.java | 6 +++--- src/main/java/bridge/Domain/InputConverter.java | 2 ++ src/main/java/bridge/View/InputView.java | 2 -- 3 files changed, 5 insertions(+), 5 deletions(-) diff --git a/src/main/java/bridge/Domain/BridgeGame.java b/src/main/java/bridge/Domain/BridgeGame.java index 62630f2799d..61c84ad4586 100644 --- a/src/main/java/bridge/Domain/BridgeGame.java +++ b/src/main/java/bridge/Domain/BridgeGame.java @@ -1,6 +1,7 @@ package bridge.Domain; -import bridge.Constant.InputValue; +import static bridge.Constant.InputValue.COMMAND_RETRY; + import java.util.List; @@ -36,7 +37,7 @@ public void move(String playerSelection) { public void retry(String command) { updateMaxPassedCount(); - if (command.equals(InputValue.COMMAND_RETRY)) { + if (command.equals(COMMAND_RETRY)) { player.revive(); this.retryCount++; } @@ -101,5 +102,4 @@ public int getMaxPassedCount() { public int getPassedCount() { return player.getPassedCount(); } - } diff --git a/src/main/java/bridge/Domain/InputConverter.java b/src/main/java/bridge/Domain/InputConverter.java index c6c17420243..ef3c58de5f0 100644 --- a/src/main/java/bridge/Domain/InputConverter.java +++ b/src/main/java/bridge/Domain/InputConverter.java @@ -1,5 +1,7 @@ package bridge.Domain; + + public class InputConverter { public static int convertToInt(String input) throws IllegalArgumentException { try { diff --git a/src/main/java/bridge/View/InputView.java b/src/main/java/bridge/View/InputView.java index 5f62db10ba4..19445a95348 100644 --- a/src/main/java/bridge/View/InputView.java +++ b/src/main/java/bridge/View/InputView.java @@ -30,8 +30,6 @@ public int readBridgeSize() throws IllegalArgumentException { } catch (IllegalArgumentException illegalArgumentException) { throw illegalArgumentException; } - - } public String readMoving() throws IllegalArgumentException { From 0fe194bedfee0a3199b12009d22875d827c017c2 Mon Sep 17 00:00:00 2001 From: swandevson Date: Tue, 22 Nov 2022 00:13:21 +0900 Subject: [PATCH 64/77] =?UTF-8?q?Chore:=20Domain=EC=9D=84=20Model,=20Util?= =?UTF-8?q?=EB=A1=9C=20=EB=B6=84=EB=A6=AC?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- src/main/java/bridge/Application.java | 2 +- src/main/java/bridge/BridgeMaker.java | 2 +- src/main/java/bridge/{Domain => Model}/Bridge.java | 2 +- src/main/java/bridge/{Domain => Model}/BridgeBlock.java | 2 +- src/main/java/bridge/{Domain => Model}/BridgeGame.java | 2 +- src/main/java/bridge/{Domain => Model}/Player.java | 2 +- src/main/java/bridge/{Domain => Util}/InputConverter.java | 2 +- src/main/java/bridge/{Domain => Util}/InputValidator.java | 2 +- src/main/java/bridge/View/InputView.java | 4 ++-- src/main/java/bridge/View/OutputView.java | 2 +- src/test/java/bridge/{Domain => Model}/BridgeBlockTest.java | 2 +- src/test/java/bridge/{Domain => Model}/BridgeGameTest.java | 2 +- src/test/java/bridge/{Domain => Model}/BridgeTest.java | 2 +- src/test/java/bridge/{Domain => Util}/InputConverterTest.java | 3 ++- src/test/java/bridge/{Domain => Util}/InputValidatorTest.java | 3 ++- 15 files changed, 18 insertions(+), 16 deletions(-) rename src/main/java/bridge/{Domain => Model}/Bridge.java (98%) rename src/main/java/bridge/{Domain => Model}/BridgeBlock.java (96%) rename src/main/java/bridge/{Domain => Model}/BridgeGame.java (99%) rename src/main/java/bridge/{Domain => Model}/Player.java (95%) rename src/main/java/bridge/{Domain => Util}/InputConverter.java (93%) rename src/main/java/bridge/{Domain => Util}/InputValidator.java (98%) rename src/test/java/bridge/{Domain => Model}/BridgeBlockTest.java (96%) rename src/test/java/bridge/{Domain => Model}/BridgeGameTest.java (96%) rename src/test/java/bridge/{Domain => Model}/BridgeTest.java (98%) rename src/test/java/bridge/{Domain => Util}/InputConverterTest.java (96%) rename src/test/java/bridge/{Domain => Util}/InputValidatorTest.java (96%) diff --git a/src/main/java/bridge/Application.java b/src/main/java/bridge/Application.java index cc3732b25dc..7efd6acfb2d 100644 --- a/src/main/java/bridge/Application.java +++ b/src/main/java/bridge/Application.java @@ -1,6 +1,6 @@ package bridge; -import bridge.Domain.BridgeGame; +import bridge.Model.BridgeGame; import bridge.View.InputView; import bridge.View.OutputView; diff --git a/src/main/java/bridge/BridgeMaker.java b/src/main/java/bridge/BridgeMaker.java index 49f37d6de52..35cc8aec258 100644 --- a/src/main/java/bridge/BridgeMaker.java +++ b/src/main/java/bridge/BridgeMaker.java @@ -1,6 +1,6 @@ package bridge; -import bridge.Domain.BridgeBlock; +import bridge.Model.BridgeBlock; import java.util.ArrayList; import java.util.List; diff --git a/src/main/java/bridge/Domain/Bridge.java b/src/main/java/bridge/Model/Bridge.java similarity index 98% rename from src/main/java/bridge/Domain/Bridge.java rename to src/main/java/bridge/Model/Bridge.java index f25c7f9ed31..4e35e5235d2 100644 --- a/src/main/java/bridge/Domain/Bridge.java +++ b/src/main/java/bridge/Model/Bridge.java @@ -1,4 +1,4 @@ -package bridge.Domain; +package bridge.Model; import bridge.BridgeMaker; import bridge.BridgeNumberGenerator; diff --git a/src/main/java/bridge/Domain/BridgeBlock.java b/src/main/java/bridge/Model/BridgeBlock.java similarity index 96% rename from src/main/java/bridge/Domain/BridgeBlock.java rename to src/main/java/bridge/Model/BridgeBlock.java index 145289f532e..a033bfc79c6 100644 --- a/src/main/java/bridge/Domain/BridgeBlock.java +++ b/src/main/java/bridge/Model/BridgeBlock.java @@ -1,4 +1,4 @@ -package bridge.Domain; +package bridge.Model; import java.util.Arrays; diff --git a/src/main/java/bridge/Domain/BridgeGame.java b/src/main/java/bridge/Model/BridgeGame.java similarity index 99% rename from src/main/java/bridge/Domain/BridgeGame.java rename to src/main/java/bridge/Model/BridgeGame.java index 61c84ad4586..c04cc0a523e 100644 --- a/src/main/java/bridge/Domain/BridgeGame.java +++ b/src/main/java/bridge/Model/BridgeGame.java @@ -1,4 +1,4 @@ -package bridge.Domain; +package bridge.Model; import static bridge.Constant.InputValue.COMMAND_RETRY; diff --git a/src/main/java/bridge/Domain/Player.java b/src/main/java/bridge/Model/Player.java similarity index 95% rename from src/main/java/bridge/Domain/Player.java rename to src/main/java/bridge/Model/Player.java index 1149bffdbc6..d149453cc5c 100644 --- a/src/main/java/bridge/Domain/Player.java +++ b/src/main/java/bridge/Model/Player.java @@ -1,4 +1,4 @@ -package bridge.Domain; +package bridge.Model; diff --git a/src/main/java/bridge/Domain/InputConverter.java b/src/main/java/bridge/Util/InputConverter.java similarity index 93% rename from src/main/java/bridge/Domain/InputConverter.java rename to src/main/java/bridge/Util/InputConverter.java index ef3c58de5f0..1fe2b7de4c9 100644 --- a/src/main/java/bridge/Domain/InputConverter.java +++ b/src/main/java/bridge/Util/InputConverter.java @@ -1,4 +1,4 @@ -package bridge.Domain; +package bridge.Util; diff --git a/src/main/java/bridge/Domain/InputValidator.java b/src/main/java/bridge/Util/InputValidator.java similarity index 98% rename from src/main/java/bridge/Domain/InputValidator.java rename to src/main/java/bridge/Util/InputValidator.java index 2447a5d6ef3..0f04945f114 100644 --- a/src/main/java/bridge/Domain/InputValidator.java +++ b/src/main/java/bridge/Util/InputValidator.java @@ -1,4 +1,4 @@ -package bridge.Domain; +package bridge.Util; import static bridge.Constant.InputValue.COMMAND_QUIT; import static bridge.Constant.InputValue.COMMAND_RETRY; diff --git a/src/main/java/bridge/View/InputView.java b/src/main/java/bridge/View/InputView.java index 19445a95348..c53c894a0aa 100644 --- a/src/main/java/bridge/View/InputView.java +++ b/src/main/java/bridge/View/InputView.java @@ -2,8 +2,8 @@ import static camp.nextstep.edu.missionutils.Console.readLine; -import bridge.Domain.InputConverter; -import bridge.Domain.InputValidator; +import bridge.Util.InputConverter; +import bridge.Util.InputValidator; diff --git a/src/main/java/bridge/View/OutputView.java b/src/main/java/bridge/View/OutputView.java index 887f15a96b4..bca4258cb02 100644 --- a/src/main/java/bridge/View/OutputView.java +++ b/src/main/java/bridge/View/OutputView.java @@ -5,7 +5,7 @@ import static bridge.Constant.OutputValue.*; -import bridge.Domain.BridgeGame; +import bridge.Model.BridgeGame; import java.util.List; diff --git a/src/test/java/bridge/Domain/BridgeBlockTest.java b/src/test/java/bridge/Model/BridgeBlockTest.java similarity index 96% rename from src/test/java/bridge/Domain/BridgeBlockTest.java rename to src/test/java/bridge/Model/BridgeBlockTest.java index 57c95aa5a10..307ce81fba7 100644 --- a/src/test/java/bridge/Domain/BridgeBlockTest.java +++ b/src/test/java/bridge/Model/BridgeBlockTest.java @@ -1,4 +1,4 @@ -package bridge.Domain; +package bridge.Model; import org.junit.jupiter.api.DisplayName; import org.junit.jupiter.api.Nested; diff --git a/src/test/java/bridge/Domain/BridgeGameTest.java b/src/test/java/bridge/Model/BridgeGameTest.java similarity index 96% rename from src/test/java/bridge/Domain/BridgeGameTest.java rename to src/test/java/bridge/Model/BridgeGameTest.java index b98624f8839..7ffd89ebd0a 100644 --- a/src/test/java/bridge/Domain/BridgeGameTest.java +++ b/src/test/java/bridge/Model/BridgeGameTest.java @@ -1,4 +1,4 @@ -package bridge.Domain; +package bridge.Model; import org.junit.jupiter.api.DisplayName; import org.junit.jupiter.api.Test; diff --git a/src/test/java/bridge/Domain/BridgeTest.java b/src/test/java/bridge/Model/BridgeTest.java similarity index 98% rename from src/test/java/bridge/Domain/BridgeTest.java rename to src/test/java/bridge/Model/BridgeTest.java index 19167de15a0..1010d33bc3b 100644 --- a/src/test/java/bridge/Domain/BridgeTest.java +++ b/src/test/java/bridge/Model/BridgeTest.java @@ -1,4 +1,4 @@ -package bridge.Domain; +package bridge.Model; import org.junit.jupiter.api.DisplayName; import org.junit.jupiter.params.ParameterizedTest; diff --git a/src/test/java/bridge/Domain/InputConverterTest.java b/src/test/java/bridge/Util/InputConverterTest.java similarity index 96% rename from src/test/java/bridge/Domain/InputConverterTest.java rename to src/test/java/bridge/Util/InputConverterTest.java index 2ddf63c06d3..5819e58b60d 100644 --- a/src/test/java/bridge/Domain/InputConverterTest.java +++ b/src/test/java/bridge/Util/InputConverterTest.java @@ -1,5 +1,6 @@ -package bridge.Domain; +package bridge.Util; +import bridge.Util.InputConverter; import org.junit.jupiter.api.DisplayName; import org.junit.jupiter.params.ParameterizedTest; import org.junit.jupiter.params.provider.ValueSource; diff --git a/src/test/java/bridge/Domain/InputValidatorTest.java b/src/test/java/bridge/Util/InputValidatorTest.java similarity index 96% rename from src/test/java/bridge/Domain/InputValidatorTest.java rename to src/test/java/bridge/Util/InputValidatorTest.java index dd1e871469b..21a55ac8468 100644 --- a/src/test/java/bridge/Domain/InputValidatorTest.java +++ b/src/test/java/bridge/Util/InputValidatorTest.java @@ -1,7 +1,8 @@ -package bridge.Domain; +package bridge.Util; import bridge.Constant.InputValue; +import bridge.Util.InputValidator; import org.junit.jupiter.api.DisplayName; import org.junit.jupiter.params.ParameterizedTest; import org.junit.jupiter.params.provider.ValueSource; From 40bca1e40120639fe147fede7b510db6acf48b1c Mon Sep 17 00:00:00 2001 From: swandevson Date: Tue, 22 Nov 2022 00:25:32 +0900 Subject: [PATCH 65/77] =?UTF-8?q?Refactor(OutputView):=20=ED=94=8C?= =?UTF-8?q?=EB=A0=88=EC=9D=B4=EC=96=B4=20=EC=83=9D=EC=A1=B4=20=EC=97=AC?= =?UTF-8?q?=EB=B6=80=EA=B0=80=20=ED=95=84=EC=9A=94=ED=95=9C=20=EB=A9=94?= =?UTF-8?q?=EC=86=8C=EB=93=9C=20=EC=9D=B8=EC=9E=90=20=EB=B3=80=EA=B2=BD?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit - BridgeGame을 인자로 받아 player 생존 여부를 체크하는 것이 아닌, player 생존 여부만을 인자로 전달하도록 변경 --- src/main/java/bridge/View/OutputView.java | 16 +++++++++------- 1 file changed, 9 insertions(+), 7 deletions(-) diff --git a/src/main/java/bridge/View/OutputView.java b/src/main/java/bridge/View/OutputView.java index bca4258cb02..10a27501d25 100644 --- a/src/main/java/bridge/View/OutputView.java +++ b/src/main/java/bridge/View/OutputView.java @@ -7,6 +7,7 @@ import bridge.Model.BridgeGame; +import bridge.Model.Player; import java.util.List; @@ -42,27 +43,28 @@ private String getPassedStair(List bridgeStates, int passedCount, String private void printStair(BridgeGame bridgeGame, int passedCount, String stair) { final List bridgeStates = bridgeGame.getBridgeStates(); final String selectedBridgeState = bridgeStates.get(passedCount); + boolean isPlayerDead = bridgeGame.isPlayerDead(); final String result = getPassedStair(bridgeStates, passedCount, stair) - + getSelectResult(bridgeGame, selectedBridgeState, stair); + + getSelectResult(isPlayerDead, selectedBridgeState, stair); System.out.printf(BRIDGE_MAP, result); } - private String getIsSuccess(BridgeGame bridgeGame) { - if (bridgeGame.isPlayerDead()) { + private String getIsSuccess(boolean isPlayerDead) { + if (isPlayerDead) { return FAIL; } return SUCCESS; } - private String getSelectResult(BridgeGame bridgeGame, String bridgeState, String stair) { - if (!bridgeGame.isPlayerDead() && bridgeState.equals(stair)) { + private String getSelectResult(boolean isPlayerDead, String bridgeState, String stair) { + if (!isPlayerDead && bridgeState.equals(stair)) { return RIGHT_SELECTION; } - if (bridgeGame.isPlayerDead() && !bridgeState.equals(stair)) { + if (isPlayerDead && !bridgeState.equals(stair)) { return WRONG_SELECTION; } @@ -82,7 +84,7 @@ public void printResult(BridgeGame bridgeGame) { printMap(bridgeGame, maxPassedCount); - System.out.printf(IS_SUCCESS, getIsSuccess(bridgeGame)); + System.out.printf(IS_SUCCESS, getIsSuccess(bridgeGame.isPlayerDead())); System.out.printf(RETRY_COUNT, bridgeGame.getRetryCount()); } } From fd8db6d02fbf1d7d19a9a4e6454426822688a0e1 Mon Sep 17 00:00:00 2001 From: swandevson Date: Tue, 22 Nov 2022 01:45:00 +0900 Subject: [PATCH 66/77] =?UTF-8?q?Docs(README.md):=20=ED=81=B4=EB=9E=98?= =?UTF-8?q?=EC=8A=A4=20=EC=84=A4=EA=B3=84=20=EC=97=85=EB=8D=B0=EC=9D=B4?= =?UTF-8?q?=ED=8A=B8?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- docs/README.md | 8 +++++++- 1 file changed, 7 insertions(+), 1 deletion(-) diff --git a/docs/README.md b/docs/README.md index 6ddf37d7127..60915dd25bf 100644 --- a/docs/README.md +++ b/docs/README.md @@ -56,6 +56,8 @@ # 🛠️ 클래스 설계 +--- + ## BridgeMaker ``` - Bridge를 랜덤한 길이로 생성 @@ -76,7 +78,7 @@ ``` -## Domain +## Util --- @@ -93,6 +95,10 @@ ``` +## Model + +--- + - ### Bridge ``` - 게임에 사용되는 다리 정보 From c93897d30865082e138ea6bf507dac33aaff2b81 Mon Sep 17 00:00:00 2001 From: swandevson Date: Tue, 22 Nov 2022 02:35:55 +0900 Subject: [PATCH 67/77] =?UTF-8?q?Refactor(BridgeGame):=20=EB=A9=A4?= =?UTF-8?q?=EB=B2=84=20=EC=A0=91=EA=B7=BC=EC=9E=90=20private=20=ED=82=A4?= =?UTF-8?q?=EC=9B=8C=EB=93=9C=20=EC=B6=94=EA=B0=80?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit - 멤버에 private 키워드 추가 --- src/main/java/bridge/Model/BridgeGame.java | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/src/main/java/bridge/Model/BridgeGame.java b/src/main/java/bridge/Model/BridgeGame.java index c04cc0a523e..3aac8e92b90 100644 --- a/src/main/java/bridge/Model/BridgeGame.java +++ b/src/main/java/bridge/Model/BridgeGame.java @@ -7,8 +7,8 @@ public class BridgeGame { - final Bridge bridge; - Player player; + private final Bridge bridge; + private Player player; private int retryCount; private int maxPassedCount; From b6fb129948676f01bbecc3d5db980022e5717e02 Mon Sep 17 00:00:00 2001 From: swandevson Date: Tue, 22 Nov 2022 11:21:44 +0900 Subject: [PATCH 68/77] =?UTF-8?q?Style(OutputView):=20=ED=94=8C=EB=A0=88?= =?UTF-8?q?=EC=9D=B4=EC=96=B4=20=EC=83=9D=EC=A1=B4=20=EC=97=AC=EB=B6=80=20?= =?UTF-8?q?=EB=B3=80=EC=88=98=EB=AA=85=20=EB=B3=80=EA=B2=BD?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit - isPlayerDead -> playerDead --- src/main/java/bridge/View/OutputView.java | 14 +++++++------- 1 file changed, 7 insertions(+), 7 deletions(-) diff --git a/src/main/java/bridge/View/OutputView.java b/src/main/java/bridge/View/OutputView.java index 10a27501d25..a1ea564f840 100644 --- a/src/main/java/bridge/View/OutputView.java +++ b/src/main/java/bridge/View/OutputView.java @@ -43,28 +43,28 @@ private String getPassedStair(List bridgeStates, int passedCount, String private void printStair(BridgeGame bridgeGame, int passedCount, String stair) { final List bridgeStates = bridgeGame.getBridgeStates(); final String selectedBridgeState = bridgeStates.get(passedCount); - boolean isPlayerDead = bridgeGame.isPlayerDead(); + boolean playerDead = bridgeGame.isPlayerDead(); final String result = getPassedStair(bridgeStates, passedCount, stair) - + getSelectResult(isPlayerDead, selectedBridgeState, stair); + + getSelectResult(playerDead, selectedBridgeState, stair); System.out.printf(BRIDGE_MAP, result); } - private String getIsSuccess(boolean isPlayerDead) { - if (isPlayerDead) { + private String getIsSuccess(boolean playerDead) { + if (playerDead) { return FAIL; } return SUCCESS; } - private String getSelectResult(boolean isPlayerDead, String bridgeState, String stair) { - if (!isPlayerDead && bridgeState.equals(stair)) { + private String getSelectResult(boolean playerDead, String bridgeState, String stair) { + if (!playerDead && bridgeState.equals(stair)) { return RIGHT_SELECTION; } - if (isPlayerDead && !bridgeState.equals(stair)) { + if (playerDead && !bridgeState.equals(stair)) { return WRONG_SELECTION; } From 1d477f216ff2c6f20576b5cf61ee1d3bc1d4efca Mon Sep 17 00:00:00 2001 From: swandevson Date: Tue, 22 Nov 2022 12:29:53 +0900 Subject: [PATCH 69/77] =?UTF-8?q?Style(Test):=20=ED=85=8C=EC=8A=A4?= =?UTF-8?q?=ED=8A=B8=20=EC=BD=94=EB=93=9C=20=EC=BB=A8=EB=B2=A4=EC=85=98?= =?UTF-8?q?=EC=97=90=20=EB=A7=9E=EA=B2=8C=20=EC=88=98=EC=A0=95?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- src/test/java/bridge/Model/BridgeGameTest.java | 2 ++ src/test/java/bridge/Util/InputConverterTest.java | 3 ++- src/test/java/bridge/Util/InputValidatorTest.java | 4 ++-- 3 files changed, 6 insertions(+), 3 deletions(-) diff --git a/src/test/java/bridge/Model/BridgeGameTest.java b/src/test/java/bridge/Model/BridgeGameTest.java index 7ffd89ebd0a..768460f4be6 100644 --- a/src/test/java/bridge/Model/BridgeGameTest.java +++ b/src/test/java/bridge/Model/BridgeGameTest.java @@ -6,6 +6,8 @@ import static camp.nextstep.edu.missionutils.test.Assertions.assertRandomNumberInRangeTest; import static org.assertj.core.api.Assertions.assertThat; + + class BridgeGameTest { @DisplayName("잘못된 발판을 밟았을 때 죽는지 확인") diff --git a/src/test/java/bridge/Util/InputConverterTest.java b/src/test/java/bridge/Util/InputConverterTest.java index 5819e58b60d..58b0fece9fe 100644 --- a/src/test/java/bridge/Util/InputConverterTest.java +++ b/src/test/java/bridge/Util/InputConverterTest.java @@ -1,6 +1,5 @@ package bridge.Util; -import bridge.Util.InputConverter; import org.junit.jupiter.api.DisplayName; import org.junit.jupiter.params.ParameterizedTest; import org.junit.jupiter.params.provider.ValueSource; @@ -8,6 +7,8 @@ import static org.assertj.core.api.Assertions.assertThat; import static org.assertj.core.api.Assertions.assertThatThrownBy; + + class InputConverterTest { private static final String ERROR = "[ERROR]"; diff --git a/src/test/java/bridge/Util/InputValidatorTest.java b/src/test/java/bridge/Util/InputValidatorTest.java index 21a55ac8468..c6ce7ef7703 100644 --- a/src/test/java/bridge/Util/InputValidatorTest.java +++ b/src/test/java/bridge/Util/InputValidatorTest.java @@ -2,7 +2,6 @@ import bridge.Constant.InputValue; -import bridge.Util.InputValidator; import org.junit.jupiter.api.DisplayName; import org.junit.jupiter.params.ParameterizedTest; import org.junit.jupiter.params.provider.ValueSource; @@ -11,6 +10,8 @@ import static org.junit.jupiter.api.Assertions.assertDoesNotThrow; + + class InputValidatorTest { @DisplayName("잘못된 위, 아래 입력 예외 throw") @ParameterizedTest @@ -35,7 +36,6 @@ void validateCommandInput(String input) { .isInstanceOf(IllegalArgumentException.class); } - @DisplayName("올바른 재시작/종료 명령어 체크") @ParameterizedTest @ValueSource(strings = {InputValue.COMMAND_QUIT, InputValue.COMMAND_RETRY}) From 825420b866afc5bb4e22572440b546c0216f153c Mon Sep 17 00:00:00 2001 From: swandevson Date: Tue, 22 Nov 2022 12:30:54 +0900 Subject: [PATCH 70/77] =?UTF-8?q?Refactor(BridgeBlockTest):=20=ED=95=98?= =?UTF-8?q?=EB=93=9C=EC=BD=94=EB=94=A9=20=EC=A0=9C=EA=B1=B0?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit - 위/아래를 나타내는 숫자 1/0을 상수로 생성 --- src/test/java/bridge/Model/BridgeBlockTest.java | 11 +++++++++-- 1 file changed, 9 insertions(+), 2 deletions(-) diff --git a/src/test/java/bridge/Model/BridgeBlockTest.java b/src/test/java/bridge/Model/BridgeBlockTest.java index 307ce81fba7..e24340a0291 100644 --- a/src/test/java/bridge/Model/BridgeBlockTest.java +++ b/src/test/java/bridge/Model/BridgeBlockTest.java @@ -4,20 +4,27 @@ import org.junit.jupiter.api.Nested; import org.junit.jupiter.api.Test; +import static bridge.Constant.InputValue.SELECTION_DOWN; +import static bridge.Constant.InputValue.SELECTION_UP; + import static org.assertj.core.api.Assertions.assertThat; + + class BridgeBlockTest { + private static final int SELECTION_UP_NUMBER = 1; + private static final int SELECTION_DOWN_NUMBER = 0; @DisplayName("생성 번호에 따른 올바른 문자 반환하는지 테스트") @Nested class StringReturnTest { @Test void 반환_올바른_문자_UP() { - assertThat(BridgeBlock.getBlockIdentifier(0)).isEqualTo("D"); + assertThat(BridgeBlock.getBlockIdentifier(SELECTION_UP_NUMBER)).isEqualTo(SELECTION_UP); } @Test void 반환_올바른_문자_DOWN() { - assertThat(BridgeBlock.getBlockIdentifier(1)).isEqualTo("U"); + assertThat(BridgeBlock.getBlockIdentifier(SELECTION_DOWN_NUMBER)).isEqualTo(SELECTION_DOWN); } } } \ No newline at end of file From 0b27ce1052e07094424971f53aa351b8692842ff Mon Sep 17 00:00:00 2001 From: swandevson Date: Tue, 22 Nov 2022 13:11:52 +0900 Subject: [PATCH 71/77] =?UTF-8?q?Style(Model):=20=EB=B6=88=ED=95=84?= =?UTF-8?q?=EC=9A=94=ED=95=9C=20this=20=ED=82=A4=EC=9B=8C=EB=93=9C=20?= =?UTF-8?q?=EC=A0=9C=EA=B1=B0?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit - constructor를 제외한 불필요한 this 키워드 제거 --- src/main/java/bridge/Model/Bridge.java | 4 ++-- src/main/java/bridge/Model/BridgeGame.java | 14 +++++++------- src/main/java/bridge/Model/Player.java | 12 ++++++------ 3 files changed, 15 insertions(+), 15 deletions(-) diff --git a/src/main/java/bridge/Model/Bridge.java b/src/main/java/bridge/Model/Bridge.java index 4e35e5235d2..9a6020a575a 100644 --- a/src/main/java/bridge/Model/Bridge.java +++ b/src/main/java/bridge/Model/Bridge.java @@ -27,7 +27,7 @@ public Bridge(int bridgeSize) throws IllegalArgumentException { BridgeNumberGenerator bridgeRandomNumberGenerator = new BridgeRandomNumberGenerator(); BridgeMaker bridgeMaker = new BridgeMaker(bridgeRandomNumberGenerator); - this.bridgeStates = bridgeMaker.makeBridge(bridgeSize); + bridgeStates = bridgeMaker.makeBridge(bridgeSize); } @@ -40,7 +40,7 @@ public void validate(int bridgeSize) throws IllegalArgumentException { } public List getBridgeStates() { - return this.bridgeStates; + return bridgeStates; } public String getBridgeState(int bridgeLocation) { diff --git a/src/main/java/bridge/Model/BridgeGame.java b/src/main/java/bridge/Model/BridgeGame.java index 3aac8e92b90..8e1b7fe5198 100644 --- a/src/main/java/bridge/Model/BridgeGame.java +++ b/src/main/java/bridge/Model/BridgeGame.java @@ -39,15 +39,15 @@ public void retry(String command) { if (command.equals(COMMAND_RETRY)) { player.revive(); - this.retryCount++; + retryCount++; } } public void updateMaxPassedCount() { int passedCount = player.getPassedCount(); - if (this.maxPassedCount < passedCount) { - this.maxPassedCount = passedCount; + if (maxPassedCount < passedCount) { + maxPassedCount = passedCount; } } @@ -56,7 +56,7 @@ public boolean winGame() { List bridgeStates = bridge.getBridgeStates(); if (bridgeStates.size() <= playerNextLocation) { // 다음에 이동할 곳이 인덱스를 벗어날 경우 끝에 도달한 것 - this.maxPassedCount = playerNextLocation - 1; + maxPassedCount = playerNextLocation - 1; return true; } @@ -88,15 +88,15 @@ public void updatePlayer() { //getter public List getBridgeStates() { - return this.bridge.getBridgeStates(); + return bridge.getBridgeStates(); } public int getRetryCount() { - return this.retryCount; + return retryCount; } public int getMaxPassedCount() { - return this.maxPassedCount; + return maxPassedCount; } public int getPassedCount() { diff --git a/src/main/java/bridge/Model/Player.java b/src/main/java/bridge/Model/Player.java index d149453cc5c..c062b4753f7 100644 --- a/src/main/java/bridge/Model/Player.java +++ b/src/main/java/bridge/Model/Player.java @@ -14,24 +14,24 @@ public Player() { public void die() { - this.alive = false; + alive = false; } public void success() { - this.passedCount++; + passedCount++; } public void revive() { - this.alive = true; - this.passedCount = 0; + alive = true; + passedCount = 0; } // getter public boolean isAlive() { - return this.alive; + return alive; } public int getPassedCount() { - return this.passedCount; + return passedCount; } } From cc068ba5ffe4fa7a16ed5864c11268f3b03664f6 Mon Sep 17 00:00:00 2001 From: swandevson Date: Tue, 22 Nov 2022 18:47:38 +0900 Subject: [PATCH 72/77] =?UTF-8?q?Refactor(BridgeGameTest):=20=ED=95=98?= =?UTF-8?q?=EB=93=9C=EC=BD=94=EB=94=A9=20=EC=A0=9C=EA=B1=B0?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- src/test/java/bridge/Model/BridgeGameTest.java | 10 +++++++--- 1 file changed, 7 insertions(+), 3 deletions(-) diff --git a/src/test/java/bridge/Model/BridgeGameTest.java b/src/test/java/bridge/Model/BridgeGameTest.java index 768460f4be6..1571dc6db61 100644 --- a/src/test/java/bridge/Model/BridgeGameTest.java +++ b/src/test/java/bridge/Model/BridgeGameTest.java @@ -4,21 +4,25 @@ import org.junit.jupiter.api.Test; import static camp.nextstep.edu.missionutils.test.Assertions.assertRandomNumberInRangeTest; + import static org.assertj.core.api.Assertions.assertThat; class BridgeGameTest { - + private static final String SELECTION_UP = "U"; + private static final int SELECTION_UP_NUMBER = 1; + private static final String SELECTION_DOWN = "D"; + private static final int SELECTION_DOWN_NUMBER = 0; @DisplayName("잘못된 발판을 밟았을 때 죽는지 확인") @Test void 잘못_움직여_사망() { assertRandomNumberInRangeTest(() -> { BridgeGame bridgeGame = new BridgeGame(3); - bridgeGame.move("D"); + bridgeGame.move(SELECTION_DOWN); assertThat(bridgeGame.isPlayerDead()).isTrue(); - }, 1, 0, 0); + }, SELECTION_UP_NUMBER, SELECTION_DOWN_NUMBER, SELECTION_DOWN_NUMBER); } } \ No newline at end of file From ba2a64943394dc314017af14417aa32591dd78b6 Mon Sep 17 00:00:00 2001 From: swandevson Date: Tue, 22 Nov 2022 18:49:02 +0900 Subject: [PATCH 73/77] =?UTF-8?q?Style:=20=EC=BB=A8=EB=B2=A4=EC=85=98?= =?UTF-8?q?=EC=97=90=20=EB=A7=9E=EA=B2=8C=20=EC=88=98=EC=A0=95?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- src/main/java/bridge/BridgeMaker.java | 9 ++------- src/main/java/bridge/BridgeNumberGenerator.java | 3 ++- src/main/java/bridge/BridgeRandomNumberGenerator.java | 2 ++ src/main/java/bridge/Constant/InputValue.java | 2 ++ src/main/java/bridge/Constant/OutputValue.java | 2 ++ src/main/java/bridge/View/OutputView.java | 1 - 6 files changed, 10 insertions(+), 9 deletions(-) diff --git a/src/main/java/bridge/BridgeMaker.java b/src/main/java/bridge/BridgeMaker.java index 35cc8aec258..5b3d8883a0c 100644 --- a/src/main/java/bridge/BridgeMaker.java +++ b/src/main/java/bridge/BridgeMaker.java @@ -7,9 +7,7 @@ import java.util.stream.Collectors; -/** - * 다리의 길이를 입력 받아서 다리를 생성해주는 역할을 한다. - */ + public class BridgeMaker { private final BridgeNumberGenerator bridgeNumberGenerator; @@ -18,10 +16,7 @@ public BridgeMaker(BridgeNumberGenerator bridgeNumberGenerator) { this.bridgeNumberGenerator = bridgeNumberGenerator; } - /** - * @param size 다리의 길이 - * @return 입력받은 길이에 해당하는 다리 모양. 위 칸이면 "U", 아래 칸이면 "D"로 표현해야 한다. - */ + public List makeBridge(int size) { final List bridgeNumbers = generateBridgeNumbers(size); final List bridge = bridgeNumbers.stream() diff --git a/src/main/java/bridge/BridgeNumberGenerator.java b/src/main/java/bridge/BridgeNumberGenerator.java index 56187b71d2d..f201d1b1438 100644 --- a/src/main/java/bridge/BridgeNumberGenerator.java +++ b/src/main/java/bridge/BridgeNumberGenerator.java @@ -1,7 +1,8 @@ package bridge; + + @FunctionalInterface public interface BridgeNumberGenerator { - int generate(); } diff --git a/src/main/java/bridge/BridgeRandomNumberGenerator.java b/src/main/java/bridge/BridgeRandomNumberGenerator.java index 4c9cb53e03a..35915c4d98a 100644 --- a/src/main/java/bridge/BridgeRandomNumberGenerator.java +++ b/src/main/java/bridge/BridgeRandomNumberGenerator.java @@ -2,6 +2,8 @@ import camp.nextstep.edu.missionutils.Randoms; + + public class BridgeRandomNumberGenerator implements BridgeNumberGenerator { private static final int RANDOM_LOWER_INCLUSIVE = 0; diff --git a/src/main/java/bridge/Constant/InputValue.java b/src/main/java/bridge/Constant/InputValue.java index b51d7a9b780..cc21fe617f7 100644 --- a/src/main/java/bridge/Constant/InputValue.java +++ b/src/main/java/bridge/Constant/InputValue.java @@ -1,5 +1,7 @@ package bridge.Constant; + + public class InputValue { public static final String SELECTION_UP = "U"; public static final String SELECTION_DOWN = "D"; diff --git a/src/main/java/bridge/Constant/OutputValue.java b/src/main/java/bridge/Constant/OutputValue.java index 169e8daab39..cba86ea61d7 100644 --- a/src/main/java/bridge/Constant/OutputValue.java +++ b/src/main/java/bridge/Constant/OutputValue.java @@ -1,5 +1,7 @@ package bridge.Constant; + + public class OutputValue { public static final String SEPARATOR = "|"; public static final String NOT_SELECTION = " "; diff --git a/src/main/java/bridge/View/OutputView.java b/src/main/java/bridge/View/OutputView.java index a1ea564f840..3f9075ac871 100644 --- a/src/main/java/bridge/View/OutputView.java +++ b/src/main/java/bridge/View/OutputView.java @@ -7,7 +7,6 @@ import bridge.Model.BridgeGame; -import bridge.Model.Player; import java.util.List; From f6284c7b6fb6ed4d90fe656e3fb57fa443a01c56 Mon Sep 17 00:00:00 2001 From: swandevson Date: Tue, 22 Nov 2022 21:14:13 +0900 Subject: [PATCH 74/77] =?UTF-8?q?Fix(BridgeMaker):=20unmodifiable=ED=95=9C?= =?UTF-8?q?=20=EB=A6=AC=EC=8A=A4=ED=8A=B8=EB=A1=9C=20=EC=83=9D=EC=84=B1?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit - Collections.unmodifiable() 메소드를 사용해 최초 생성 후 값이 변경될 수 없도록 수정 --- src/main/java/bridge/BridgeMaker.java | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/src/main/java/bridge/BridgeMaker.java b/src/main/java/bridge/BridgeMaker.java index 5b3d8883a0c..9f013dea954 100644 --- a/src/main/java/bridge/BridgeMaker.java +++ b/src/main/java/bridge/BridgeMaker.java @@ -3,6 +3,7 @@ import bridge.Model.BridgeBlock; import java.util.ArrayList; +import java.util.Collections; import java.util.List; import java.util.stream.Collectors; @@ -23,7 +24,7 @@ public List makeBridge(int size) { .map(bridgeNumber -> BridgeBlock.getBlockIdentifier((bridgeNumber))) .collect(Collectors.toList()); - return bridge; + return Collections.unmodifiableList(bridge); } private List generateBridgeNumbers(int size) { From cb596abd8bca0b3807553d5963130ce4ae7f952c Mon Sep 17 00:00:00 2001 From: swandevson Date: Tue, 22 Nov 2022 21:19:48 +0900 Subject: [PATCH 75/77] =?UTF-8?q?Fix(BridgeGame):=20Player=EC=97=90=20fina?= =?UTF-8?q?l=20=ED=82=A4=EC=9B=8C=EB=93=9C=20=EC=B6=94=EA=B0=80?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit - 최초 할당 후, 변경되어서는 안됨 --- src/main/java/bridge/Model/BridgeGame.java | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/main/java/bridge/Model/BridgeGame.java b/src/main/java/bridge/Model/BridgeGame.java index 8e1b7fe5198..285246b5e59 100644 --- a/src/main/java/bridge/Model/BridgeGame.java +++ b/src/main/java/bridge/Model/BridgeGame.java @@ -8,7 +8,7 @@ public class BridgeGame { private final Bridge bridge; - private Player player; + private final Player player; private int retryCount; private int maxPassedCount; From d30873135a6950c15af928bec49f9cac07fa1fa7 Mon Sep 17 00:00:00 2001 From: swandevson Date: Tue, 22 Nov 2022 21:30:52 +0900 Subject: [PATCH 76/77] =?UTF-8?q?Style(OutputView,=20BridgeMaker):=20?= =?UTF-8?q?=EA=B0=80=EB=8F=85=EC=84=B1=EC=9D=84=20=ED=95=B4=EC=B9=98?= =?UTF-8?q?=EB=8A=94=20=EB=B6=88=ED=95=84=EC=9A=94=ED=95=9C=20final=20?= =?UTF-8?q?=ED=82=A4=EC=9B=8C=EB=93=9C=20=EC=A0=9C=EA=B1=B0?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- src/main/java/bridge/BridgeMaker.java | 6 +++--- src/main/java/bridge/View/OutputView.java | 6 +++--- 2 files changed, 6 insertions(+), 6 deletions(-) diff --git a/src/main/java/bridge/BridgeMaker.java b/src/main/java/bridge/BridgeMaker.java index 9f013dea954..07341e08dce 100644 --- a/src/main/java/bridge/BridgeMaker.java +++ b/src/main/java/bridge/BridgeMaker.java @@ -19,8 +19,8 @@ public BridgeMaker(BridgeNumberGenerator bridgeNumberGenerator) { public List makeBridge(int size) { - final List bridgeNumbers = generateBridgeNumbers(size); - final List bridge = bridgeNumbers.stream() + List bridgeNumbers = generateBridgeNumbers(size); + List bridge = bridgeNumbers.stream() .map(bridgeNumber -> BridgeBlock.getBlockIdentifier((bridgeNumber))) .collect(Collectors.toList()); @@ -28,7 +28,7 @@ public List makeBridge(int size) { } private List generateBridgeNumbers(int size) { - final List bridgeNumbers = new ArrayList<>(size); + List bridgeNumbers = new ArrayList<>(size); for (int i = 0; i < size; i++) { int blockNumber = bridgeNumberGenerator.generate(); diff --git a/src/main/java/bridge/View/OutputView.java b/src/main/java/bridge/View/OutputView.java index 3f9075ac871..5818db745c0 100644 --- a/src/main/java/bridge/View/OutputView.java +++ b/src/main/java/bridge/View/OutputView.java @@ -40,11 +40,11 @@ private String getPassedStair(List bridgeStates, int passedCount, String } private void printStair(BridgeGame bridgeGame, int passedCount, String stair) { - final List bridgeStates = bridgeGame.getBridgeStates(); - final String selectedBridgeState = bridgeStates.get(passedCount); + List bridgeStates = bridgeGame.getBridgeStates(); + String selectedBridgeState = bridgeStates.get(passedCount); boolean playerDead = bridgeGame.isPlayerDead(); - final String result = getPassedStair(bridgeStates, passedCount, stair) + String result = getPassedStair(bridgeStates, passedCount, stair) + getSelectResult(playerDead, selectedBridgeState, stair); System.out.printf(BRIDGE_MAP, result); From 78ba05d76e9615ed996a7af52b52c52be232e874 Mon Sep 17 00:00:00 2001 From: swandevson Date: Tue, 22 Nov 2022 21:32:22 +0900 Subject: [PATCH 77/77] =?UTF-8?q?Style(Bridge):=20final,=20private=20?= =?UTF-8?q?=ED=82=A4=EC=9B=8C=EB=93=9C=20=EC=88=9C=EC=84=9C=20=EB=B3=80?= =?UTF-8?q?=EA=B2=BD?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- src/main/java/bridge/Model/Bridge.java | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/main/java/bridge/Model/Bridge.java b/src/main/java/bridge/Model/Bridge.java index 9a6020a575a..31a0b608980 100644 --- a/src/main/java/bridge/Model/Bridge.java +++ b/src/main/java/bridge/Model/Bridge.java @@ -14,7 +14,7 @@ public class Bridge { private final static String WRONG_RANGE_INPUT = "[ERROR] 다리 길이는 %d부터 %d 사이의 숫자여야 합니다." + System.lineSeparator(); - final private List bridgeStates; + private final List bridgeStates; public Bridge(int bridgeSize) throws IllegalArgumentException {