From c99375145c5009de8f2a521aeda1f90cce70dda1 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=EA=B9=80=EC=97=B0=EC=A7=84?= Date: Mon, 21 Aug 2023 16:30:02 +0900 Subject: [PATCH 01/44] =?UTF-8?q?docs:=20=EA=B8=B0=EB=8A=A5=20=EA=B5=AC?= =?UTF-8?q?=ED=98=84=20=EB=AA=A9=20=EC=9E=91=EC=84=B1?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- docs/README.md | 38 ++++++++++++++++++++++++++++++++++++++ 1 file changed, 38 insertions(+) diff --git a/docs/README.md b/docs/README.md index e69de29bb2d..72a5d2c3092 100644 --- a/docs/README.md +++ b/docs/README.md @@ -0,0 +1,38 @@ +## 기능 구현 목록 + +**입력 & 출력** +- [ ] 게임 시작 안내 출력 +- [ ] 다리 길이 입력 (3 ~ 20사이 숫자) +- [ ] 이동할 칸 입력 (U / D) +- [ ] 재시도 입력 (R / Q) + +**다리 생성** +- 입력한 다리 길이만큼 다리 생성 + - [ ] 0(아래), 1(위)형식으로 다리 요소 랜덤 생성 + - [ ] 0➝D / 1➝U 변환 + +**게임 진행** +- [ ] 생성된 다리와 사용자의 입력 비교 + - [ ] 이동 가능한 경우 계속 진행 + - [ ] 이동 불가능한 경우 재시작 / 종료 +- [ ] 재시작하는 경우 시도 횟수 증가 + +**게임 진행 내용 저장** +- [ ] 사용자의 입력이 맞는지 저장한다 + - 맞을 경우 O, 틀릴 경우 X 저장 + +**결과 출력** +- 다리 출력 + - [ ] `[`로 시작, `]`로 끝, 구분자는 `|` + - [ ] 이동 가능한 경우 O / 불가능한 경우 X 출력 +- [ ] 게임 성공 여부 +- [ ] 총 시도 횟수 + +**예외 처리** +- 이동할 칸 입력 + - [ ] U/D 이외의 입력이 들어올 경우 +- 재시도 입력 + - [ ] R/Q 이외의 입력이 들어올 경우 +- 다리 길이 입력 + - [ ] 숫자가 아닌 입력이 들어온 경우 + - [ ] 범위 이외의 숫자가 들어온 경우 \ No newline at end of file From b1aad3da293e3a16887ada17dc94971f3fdafbbd Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=EA=B9=80=EC=97=B0=EC=A7=84?= Date: Mon, 21 Aug 2023 16:43:26 +0900 Subject: [PATCH 02/44] =?UTF-8?q?feat(outputView):=20=EA=B2=8C=EC=9E=84=20?= =?UTF-8?q?=EC=8B=9C=EC=9E=91=20=EC=95=88=EB=82=B4=20=EC=B6=9C=EB=A0=A5=20?= =?UTF-8?q?=EA=B8=B0=EB=8A=A5=20=EA=B5=AC=ED=98=84?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- docs/README.md | 2 +- src/main/java/bridge/Application.java | 7 +++++-- .../java/bridge/constant/OutputMessage.java | 17 +++++++++++++++++ .../bridge/controller/BridgeController.java | 14 ++++++++++++++ src/main/java/bridge/{ => view}/OutputView.java | 8 +++++++- 5 files changed, 44 insertions(+), 4 deletions(-) create mode 100644 src/main/java/bridge/constant/OutputMessage.java create mode 100644 src/main/java/bridge/controller/BridgeController.java rename src/main/java/bridge/{ => view}/OutputView.java (80%) diff --git a/docs/README.md b/docs/README.md index 72a5d2c3092..95a7fa728c5 100644 --- a/docs/README.md +++ b/docs/README.md @@ -1,7 +1,7 @@ ## 기능 구현 목록 **입력 & 출력** -- [ ] 게임 시작 안내 출력 +- [x] 게임 시작 안내 출력 - [ ] 다리 길이 입력 (3 ~ 20사이 숫자) - [ ] 이동할 칸 입력 (U / D) - [ ] 재시도 입력 (R / Q) diff --git a/src/main/java/bridge/Application.java b/src/main/java/bridge/Application.java index 5cb72dfd3de..29ccf2dd4b0 100644 --- a/src/main/java/bridge/Application.java +++ b/src/main/java/bridge/Application.java @@ -1,8 +1,11 @@ package bridge; +import bridge.controller.BridgeController; + public class Application { public static void main(String[] args) { - // TODO: 프로그램 구현 + BridgeController bridgeController = new BridgeController(); + bridgeController.start(); } -} +} \ No newline at end of file diff --git a/src/main/java/bridge/constant/OutputMessage.java b/src/main/java/bridge/constant/OutputMessage.java new file mode 100644 index 00000000000..6b54a612fff --- /dev/null +++ b/src/main/java/bridge/constant/OutputMessage.java @@ -0,0 +1,17 @@ +package bridge.constant; + +public enum OutputMessage { + + START_MESSAGE("다리 건너기 게임을 시작합니다."); + + private final String message; + + OutputMessage(String message) { + this.message = message; + } + + @Override + public String toString() { + return this.message; + } +} \ No newline at end of file diff --git a/src/main/java/bridge/controller/BridgeController.java b/src/main/java/bridge/controller/BridgeController.java new file mode 100644 index 00000000000..2384d9bf654 --- /dev/null +++ b/src/main/java/bridge/controller/BridgeController.java @@ -0,0 +1,14 @@ +package bridge.controller; + +import bridge.view.InputView; +import bridge.view.OutputView; + +public class BridgeController { + + private final OutputView outputView = new OutputView(); + private final InputView inputView = new InputView(); + + public void start() { + outputView.printGameStart(); + } +} \ No newline at end of file diff --git a/src/main/java/bridge/OutputView.java b/src/main/java/bridge/view/OutputView.java similarity index 80% rename from src/main/java/bridge/OutputView.java rename to src/main/java/bridge/view/OutputView.java index 69a433a6285..30fb00d16c1 100644 --- a/src/main/java/bridge/OutputView.java +++ b/src/main/java/bridge/view/OutputView.java @@ -1,4 +1,6 @@ -package bridge; +package bridge.view; + +import bridge.constant.OutputMessage; /** * 사용자에게 게임 진행 상황과 결과를 출력하는 역할을 한다. @@ -20,4 +22,8 @@ public void printMap() { */ public void printResult() { } + + public void printGameStart() { + System.out.println(OutputMessage.START_MESSAGE); + } } From 9d533a1061bdd05d9925d9ad159379782b3749b3 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=EA=B9=80=EC=97=B0=EC=A7=84?= Date: Mon, 21 Aug 2023 16:44:59 +0900 Subject: [PATCH 03/44] =?UTF-8?q?feat(InputView):=20=EB=8B=A4=EB=A6=AC=20?= =?UTF-8?q?=EA=B8=B8=EC=9D=B4=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 --- docs/README.md | 2 +- src/main/java/bridge/constant/OutputMessage.java | 3 ++- src/main/java/bridge/controller/BridgeController.java | 2 ++ src/main/java/bridge/{ => view}/InputView.java | 7 +++++-- src/main/java/bridge/view/OutputView.java | 4 ++++ 5 files changed, 14 insertions(+), 4 deletions(-) rename src/main/java/bridge/{ => view}/InputView.java (75%) diff --git a/docs/README.md b/docs/README.md index 95a7fa728c5..e7c0fa48387 100644 --- a/docs/README.md +++ b/docs/README.md @@ -2,7 +2,7 @@ **입력 & 출력** - [x] 게임 시작 안내 출력 -- [ ] 다리 길이 입력 (3 ~ 20사이 숫자) +- [x] 다리 길이 입력 (3 ~ 20사이 숫자) - [ ] 이동할 칸 입력 (U / D) - [ ] 재시도 입력 (R / Q) diff --git a/src/main/java/bridge/constant/OutputMessage.java b/src/main/java/bridge/constant/OutputMessage.java index 6b54a612fff..ce8307506d8 100644 --- a/src/main/java/bridge/constant/OutputMessage.java +++ b/src/main/java/bridge/constant/OutputMessage.java @@ -2,7 +2,8 @@ public enum OutputMessage { - START_MESSAGE("다리 건너기 게임을 시작합니다."); + START_MESSAGE("다리 건너기 게임을 시작합니다."), + LENGTH_MESSAGE("다리의 길이를 입력해주세요."); private final String message; diff --git a/src/main/java/bridge/controller/BridgeController.java b/src/main/java/bridge/controller/BridgeController.java index 2384d9bf654..68d57a78804 100644 --- a/src/main/java/bridge/controller/BridgeController.java +++ b/src/main/java/bridge/controller/BridgeController.java @@ -10,5 +10,7 @@ public class BridgeController { public void start() { outputView.printGameStart(); + outputView.printLengthMessage(); + inputView.readBridgeSize(); } } \ No newline at end of file diff --git a/src/main/java/bridge/InputView.java b/src/main/java/bridge/view/InputView.java similarity index 75% rename from src/main/java/bridge/InputView.java rename to src/main/java/bridge/view/InputView.java index c3911c8a8e7..9720569edc2 100644 --- a/src/main/java/bridge/InputView.java +++ b/src/main/java/bridge/view/InputView.java @@ -1,4 +1,6 @@ -package bridge; +package bridge.view; + +import camp.nextstep.edu.missionutils.Console; /** * 사용자로부터 입력을 받는 역할을 한다. @@ -9,7 +11,8 @@ public class InputView { * 다리의 길이를 입력받는다. */ public int readBridgeSize() { - return 0; + String userInput = Console.readLine(); + return Integer.parseInt(userInput); } /** diff --git a/src/main/java/bridge/view/OutputView.java b/src/main/java/bridge/view/OutputView.java index 30fb00d16c1..5125e49aebf 100644 --- a/src/main/java/bridge/view/OutputView.java +++ b/src/main/java/bridge/view/OutputView.java @@ -26,4 +26,8 @@ public void printResult() { public void printGameStart() { System.out.println(OutputMessage.START_MESSAGE); } + + public void printLengthMessage() { + System.out.println(OutputMessage.LENGTH_MESSAGE); + } } From c241aebd890341a91673a21a80da4dc3cdca5645 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=EA=B9=80=EC=97=B0=EC=A7=84?= Date: Mon, 21 Aug 2023 16:48:48 +0900 Subject: [PATCH 04/44] =?UTF-8?q?feat(InputView):=20=EC=9D=B4=EB=8F=99?= =?UTF-8?q?=ED=95=A0=20=EC=B9=B8=20=EC=9E=85=EB=A0=A5=20=EA=B8=B0=EB=8A=A5?= =?UTF-8?q?=20=EA=B5=AC=ED=98=84?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- docs/README.md | 2 +- src/main/java/bridge/constant/OutputMessage.java | 3 ++- src/main/java/bridge/controller/BridgeController.java | 2 ++ src/main/java/bridge/view/InputView.java | 2 +- src/main/java/bridge/view/OutputView.java | 4 ++++ 5 files changed, 10 insertions(+), 3 deletions(-) diff --git a/docs/README.md b/docs/README.md index e7c0fa48387..c607f34d78d 100644 --- a/docs/README.md +++ b/docs/README.md @@ -3,7 +3,7 @@ **입력 & 출력** - [x] 게임 시작 안내 출력 - [x] 다리 길이 입력 (3 ~ 20사이 숫자) -- [ ] 이동할 칸 입력 (U / D) +- [x] 이동할 칸 입력 (U / D) - [ ] 재시도 입력 (R / Q) **다리 생성** diff --git a/src/main/java/bridge/constant/OutputMessage.java b/src/main/java/bridge/constant/OutputMessage.java index ce8307506d8..8b1a79d47de 100644 --- a/src/main/java/bridge/constant/OutputMessage.java +++ b/src/main/java/bridge/constant/OutputMessage.java @@ -3,7 +3,8 @@ public enum OutputMessage { START_MESSAGE("다리 건너기 게임을 시작합니다."), - LENGTH_MESSAGE("다리의 길이를 입력해주세요."); + LENGTH_MESSAGE("다리의 길이를 입력해주세요."), + MOVE_LOCATION("이동할 칸을 선택해주세요. (위: U, 아래: D)"); private final String message; diff --git a/src/main/java/bridge/controller/BridgeController.java b/src/main/java/bridge/controller/BridgeController.java index 68d57a78804..77a247f63df 100644 --- a/src/main/java/bridge/controller/BridgeController.java +++ b/src/main/java/bridge/controller/BridgeController.java @@ -12,5 +12,7 @@ public void start() { outputView.printGameStart(); outputView.printLengthMessage(); inputView.readBridgeSize(); + outputView.printMovingDirectionMessage(); + inputView.readMoving(); } } \ No newline at end of file diff --git a/src/main/java/bridge/view/InputView.java b/src/main/java/bridge/view/InputView.java index 9720569edc2..8009f1edf91 100644 --- a/src/main/java/bridge/view/InputView.java +++ b/src/main/java/bridge/view/InputView.java @@ -19,7 +19,7 @@ public int readBridgeSize() { * 사용자가 이동할 칸을 입력받는다. */ public String readMoving() { - return null; + return Console.readLine(); } /** diff --git a/src/main/java/bridge/view/OutputView.java b/src/main/java/bridge/view/OutputView.java index 5125e49aebf..251cade7caf 100644 --- a/src/main/java/bridge/view/OutputView.java +++ b/src/main/java/bridge/view/OutputView.java @@ -30,4 +30,8 @@ public void printGameStart() { public void printLengthMessage() { System.out.println(OutputMessage.LENGTH_MESSAGE); } + + public void printMovingDirectionMessage() { + System.out.println(OutputMessage.MOVE_LOCATION); + } } From fe332f0880ef6e879a4ba7ea280bc4b2a04dcf38 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=EA=B9=80=EC=97=B0=EC=A7=84?= Date: Mon, 21 Aug 2023 16:57:23 +0900 Subject: [PATCH 05/44] =?UTF-8?q?feat(BridgeMaker):=20=EB=8B=A4=EB=A6=AC?= =?UTF-8?q?=20=EC=9A=94=EC=86=8C=20=EB=9E=9C=EB=8D=A4=20=EC=83=9D=EC=84=B1?= =?UTF-8?q?=20=EA=B8=B0=EB=8A=A5=20=EA=B5=AC=ED=98=84?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- docs/README.md | 2 +- src/main/java/bridge/BridgeMaker.java | 10 +++++++++- src/main/java/bridge/controller/BridgeController.java | 10 +++++++++- 3 files changed, 19 insertions(+), 3 deletions(-) diff --git a/docs/README.md b/docs/README.md index c607f34d78d..8ca20d9c889 100644 --- a/docs/README.md +++ b/docs/README.md @@ -8,7 +8,7 @@ **다리 생성** - 입력한 다리 길이만큼 다리 생성 - - [ ] 0(아래), 1(위)형식으로 다리 요소 랜덤 생성 + - [x] 0(아래), 1(위)형식으로 다리 요소 랜덤 생성 - [ ] 0➝D / 1➝U 변환 **게임 진행** diff --git a/src/main/java/bridge/BridgeMaker.java b/src/main/java/bridge/BridgeMaker.java index 27e9f2cfa7f..e652f7de994 100644 --- a/src/main/java/bridge/BridgeMaker.java +++ b/src/main/java/bridge/BridgeMaker.java @@ -1,6 +1,9 @@ package bridge; +import java.util.ArrayList; import java.util.List; +import java.util.stream.Collectors; +import java.util.stream.IntStream; /** * 다리의 길이를 입력 받아서 다리를 생성해주는 역할을 한다. @@ -18,6 +21,11 @@ public BridgeMaker(BridgeNumberGenerator bridgeNumberGenerator) { * @return 입력받은 길이에 해당하는 다리 모양. 위 칸이면 "U", 아래 칸이면 "D"로 표현해야 한다. */ public List makeBridge(int size) { - return null; + List bridge = new ArrayList<>(); + IntStream.range(0, size) + .forEach(i -> bridge.add(bridgeNumberGenerator.generate())); + return bridge.stream() + .map(Object::toString) + .collect(Collectors.toList()); } } diff --git a/src/main/java/bridge/controller/BridgeController.java b/src/main/java/bridge/controller/BridgeController.java index 77a247f63df..3a4e38249cb 100644 --- a/src/main/java/bridge/controller/BridgeController.java +++ b/src/main/java/bridge/controller/BridgeController.java @@ -1,5 +1,7 @@ package bridge.controller; +import bridge.BridgeMaker; +import bridge.BridgeRandomNumberGenerator; import bridge.view.InputView; import bridge.view.OutputView; @@ -10,9 +12,15 @@ public class BridgeController { public void start() { outputView.printGameStart(); + + BridgeMaker bridgeMaker = new BridgeMaker(new BridgeRandomNumberGenerator()); outputView.printLengthMessage(); - inputView.readBridgeSize(); + bridgeMaker.makeBridge(inputView.readBridgeSize()); + outputView.printMovingDirectionMessage(); inputView.readMoving(); + + + } } \ No newline at end of file From c8b48d5398db847300f9fd49072041f4233c0501 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=EA=B9=80=EC=97=B0=EC=A7=84?= Date: Mon, 21 Aug 2023 17:47:57 +0900 Subject: [PATCH 06/44] =?UTF-8?q?feat(BridgeMaker):=20=EB=8B=A4=EB=A6=AC?= =?UTF-8?q?=20=EC=9A=94=EC=86=8C=20=EB=B3=80=ED=99=98=20=EA=B8=B0=EB=8A=A5?= =?UTF-8?q?=20=EA=B5=AC=ED=98=84?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- docs/README.md | 2 +- src/main/java/bridge/BridgeMaker.java | 5 +++- .../java/bridge/constant/BridgeDirection.java | 29 +++++++++++++++++++ .../bridge/constant/ExceptionMessage.java | 18 ++++++++++++ 4 files changed, 52 insertions(+), 2 deletions(-) create mode 100644 src/main/java/bridge/constant/BridgeDirection.java create mode 100644 src/main/java/bridge/constant/ExceptionMessage.java diff --git a/docs/README.md b/docs/README.md index 8ca20d9c889..a9005009d71 100644 --- a/docs/README.md +++ b/docs/README.md @@ -9,7 +9,7 @@ **다리 생성** - 입력한 다리 길이만큼 다리 생성 - [x] 0(아래), 1(위)형식으로 다리 요소 랜덤 생성 - - [ ] 0➝D / 1➝U 변환 + - [x] 0➝D / 1➝U 변환 **게임 진행** - [ ] 생성된 다리와 사용자의 입력 비교 diff --git a/src/main/java/bridge/BridgeMaker.java b/src/main/java/bridge/BridgeMaker.java index e652f7de994..091288caa44 100644 --- a/src/main/java/bridge/BridgeMaker.java +++ b/src/main/java/bridge/BridgeMaker.java @@ -1,5 +1,7 @@ package bridge; +import bridge.constant.BridgeDirection; + import java.util.ArrayList; import java.util.List; import java.util.stream.Collectors; @@ -25,7 +27,8 @@ public List makeBridge(int size) { IntStream.range(0, size) .forEach(i -> bridge.add(bridgeNumberGenerator.generate())); return bridge.stream() - .map(Object::toString) + .map(BridgeDirection::convertDirection) + .map(BridgeDirection::getDirection) .collect(Collectors.toList()); } } diff --git a/src/main/java/bridge/constant/BridgeDirection.java b/src/main/java/bridge/constant/BridgeDirection.java new file mode 100644 index 00000000000..b222c89191d --- /dev/null +++ b/src/main/java/bridge/constant/BridgeDirection.java @@ -0,0 +1,29 @@ +package bridge.constant; + +import java.util.Arrays; + +public enum BridgeDirection { + + DOWN(0, "D"), + UP(1, "U"); + + private final int generateValue; + private final String direction; + + + BridgeDirection(int generateValue, String message) { + this.generateValue = generateValue; + this.direction = message; + } + + public static BridgeDirection convertDirection(int generateValue) { + return Arrays.stream(BridgeDirection.values()) + .filter(value -> value.generateValue == generateValue) + .findAny() + .orElseThrow(() -> new IllegalArgumentException(ExceptionMessage.NOT_BRIDGE_ELEMENT.toString())); + } + + public String getDirection() { + return direction; + } +} diff --git a/src/main/java/bridge/constant/ExceptionMessage.java b/src/main/java/bridge/constant/ExceptionMessage.java new file mode 100644 index 00000000000..ab95228612f --- /dev/null +++ b/src/main/java/bridge/constant/ExceptionMessage.java @@ -0,0 +1,18 @@ +package bridge.constant; + +public enum ExceptionMessage { + + NOT_BRIDGE_ELEMENT("다리 건너기 게임을 시작합니다."); + + private static final String PREFIX = "[ERROR] "; + private final String message; + + ExceptionMessage(String message) { + this.message = message; + } + + @Override + public String toString() { + return PREFIX + message; + } +} \ No newline at end of file From bc63ab2bf590abc4657b97fd403eb150b687420e Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=EA=B9=80=EC=97=B0=EC=A7=84?= Date: Mon, 21 Aug 2023 18:12:22 +0900 Subject: [PATCH 07/44] =?UTF-8?q?feat(BridgeGame):=20=EA=B2=8C=EC=9E=84=20?= =?UTF-8?q?=EC=8B=9C=EC=9E=91=20=EC=8B=9C=20=EB=8B=A4=EB=A6=AC=20=EC=83=9D?= =?UTF-8?q?=EC=84=B1?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../bridge/controller/BridgeController.java | 6 ++---- .../java/bridge/{ => service}/BridgeGame.java | 18 +++++++++++++++++- 2 files changed, 19 insertions(+), 5 deletions(-) rename src/main/java/bridge/{ => service}/BridgeGame.java (61%) diff --git a/src/main/java/bridge/controller/BridgeController.java b/src/main/java/bridge/controller/BridgeController.java index 3a4e38249cb..2325d208f99 100644 --- a/src/main/java/bridge/controller/BridgeController.java +++ b/src/main/java/bridge/controller/BridgeController.java @@ -1,7 +1,6 @@ package bridge.controller; -import bridge.BridgeMaker; -import bridge.BridgeRandomNumberGenerator; +import bridge.service.BridgeGame; import bridge.view.InputView; import bridge.view.OutputView; @@ -13,9 +12,8 @@ public class BridgeController { public void start() { outputView.printGameStart(); - BridgeMaker bridgeMaker = new BridgeMaker(new BridgeRandomNumberGenerator()); outputView.printLengthMessage(); - bridgeMaker.makeBridge(inputView.readBridgeSize()); + BridgeGame bridgeGame = new BridgeGame(inputView.readBridgeSize()); outputView.printMovingDirectionMessage(); inputView.readMoving(); diff --git a/src/main/java/bridge/BridgeGame.java b/src/main/java/bridge/service/BridgeGame.java similarity index 61% rename from src/main/java/bridge/BridgeGame.java rename to src/main/java/bridge/service/BridgeGame.java index 834c1c8362b..2a3a0ec46ce 100644 --- a/src/main/java/bridge/BridgeGame.java +++ b/src/main/java/bridge/service/BridgeGame.java @@ -1,10 +1,22 @@ -package bridge; +package bridge.service; + +import bridge.BridgeMaker; +import bridge.BridgeRandomNumberGenerator; + +import java.util.List; /** * 다리 건너기 게임을 관리하는 클래스 */ public class BridgeGame { + private final List bridge; + + public BridgeGame(int size) { + BridgeMaker bridgeMaker = new BridgeMaker(new BridgeRandomNumberGenerator()); + this.bridge = bridgeMaker.makeBridge(size); + } + /** * 사용자가 칸을 이동할 때 사용하는 메서드 *

@@ -20,4 +32,8 @@ public void move() { */ public void retry() { } + + public List getBridge() { + return bridge; + } } From 0bb60408783b039a9722c825b73164d290f70528 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=EA=B9=80=EC=97=B0=EC=A7=84?= Date: Mon, 21 Aug 2023 18:34:20 +0900 Subject: [PATCH 08/44] =?UTF-8?q?feat(Bridge):=20=EC=83=9D=EC=84=B1?= =?UTF-8?q?=EB=90=9C=20=EB=8B=A4=EB=A6=AC=EC=99=80=20=EC=82=AC=EC=9A=A9?= =?UTF-8?q?=EC=9E=90=EC=9D=98=20=EC=9E=85=EB=A0=A5=20=EB=B9=84=EA=B5=90=20?= =?UTF-8?q?=EA=B8=B0=EB=8A=A5=20=EA=B5=AC=ED=98=84?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- docs/README.md | 2 +- src/main/java/bridge/BridgeMaker.java | 13 +++++++----- .../bridge/controller/BridgeController.java | 5 +---- src/main/java/bridge/domain/Bridge.java | 21 +++++++++++++++++++ src/main/java/bridge/service/BridgeGame.java | 14 ++++++------- 5 files changed, 38 insertions(+), 17 deletions(-) create mode 100644 src/main/java/bridge/domain/Bridge.java diff --git a/docs/README.md b/docs/README.md index a9005009d71..794d287b014 100644 --- a/docs/README.md +++ b/docs/README.md @@ -12,7 +12,7 @@ - [x] 0➝D / 1➝U 변환 **게임 진행** -- [ ] 생성된 다리와 사용자의 입력 비교 +- [x] 생성된 다리와 사용자의 입력 비교 - [ ] 이동 가능한 경우 계속 진행 - [ ] 이동 불가능한 경우 재시작 / 종료 - [ ] 재시작하는 경우 시도 횟수 증가 diff --git a/src/main/java/bridge/BridgeMaker.java b/src/main/java/bridge/BridgeMaker.java index 091288caa44..aa7b7409a55 100644 --- a/src/main/java/bridge/BridgeMaker.java +++ b/src/main/java/bridge/BridgeMaker.java @@ -1,6 +1,7 @@ package bridge; import bridge.constant.BridgeDirection; +import bridge.domain.Bridge; import java.util.ArrayList; import java.util.List; @@ -22,13 +23,15 @@ public BridgeMaker(BridgeNumberGenerator bridgeNumberGenerator) { * @param size 다리의 길이 * @return 입력받은 길이에 해당하는 다리 모양. 위 칸이면 "U", 아래 칸이면 "D"로 표현해야 한다. */ - public List makeBridge(int size) { + public Bridge makeBridge(int size) { List bridge = new ArrayList<>(); IntStream.range(0, size) .forEach(i -> bridge.add(bridgeNumberGenerator.generate())); - return bridge.stream() - .map(BridgeDirection::convertDirection) - .map(BridgeDirection::getDirection) - .collect(Collectors.toList()); + return new Bridge( + bridge.stream() + .map(BridgeDirection::convertDirection) + .map(BridgeDirection::getDirection) + .collect(Collectors.toList()) + ); } } diff --git a/src/main/java/bridge/controller/BridgeController.java b/src/main/java/bridge/controller/BridgeController.java index 2325d208f99..7c3a98efa23 100644 --- a/src/main/java/bridge/controller/BridgeController.java +++ b/src/main/java/bridge/controller/BridgeController.java @@ -16,9 +16,6 @@ public void start() { BridgeGame bridgeGame = new BridgeGame(inputView.readBridgeSize()); outputView.printMovingDirectionMessage(); - inputView.readMoving(); - - - + bridgeGame.move(inputView.readMoving()); } } \ No newline at end of file diff --git a/src/main/java/bridge/domain/Bridge.java b/src/main/java/bridge/domain/Bridge.java new file mode 100644 index 00000000000..e00cea1c3db --- /dev/null +++ b/src/main/java/bridge/domain/Bridge.java @@ -0,0 +1,21 @@ +package bridge.domain; + +import java.util.List; + +public class Bridge { + + private final List bridge; + + public Bridge(List bridge) { + this.bridge = bridge; + } + + public List getBridge() { + return bridge; + } + + public boolean isCorrectMoving(String moving, int position) { + String correctMoving = bridge.get(position); + return correctMoving.equals(moving); + } +} diff --git a/src/main/java/bridge/service/BridgeGame.java b/src/main/java/bridge/service/BridgeGame.java index 2a3a0ec46ce..6b95af55598 100644 --- a/src/main/java/bridge/service/BridgeGame.java +++ b/src/main/java/bridge/service/BridgeGame.java @@ -2,15 +2,17 @@ import bridge.BridgeMaker; import bridge.BridgeRandomNumberGenerator; +import bridge.domain.Bridge; -import java.util.List; /** * 다리 건너기 게임을 관리하는 클래스 */ public class BridgeGame { - private final List bridge; + private final Bridge bridge; + + private int position = 0; public BridgeGame(int size) { BridgeMaker bridgeMaker = new BridgeMaker(new BridgeRandomNumberGenerator()); @@ -22,7 +24,9 @@ public BridgeGame(int size) { *

* 이동을 위해 필요한 메서드의 반환 타입(return type), 인자(parameter)는 자유롭게 추가하거나 변경할 수 있다. */ - public void move() { + public void move(String moving) { + bridge.isCorrectMoving(moving, position); + position++; } /** @@ -32,8 +36,4 @@ public void move() { */ public void retry() { } - - public List getBridge() { - return bridge; - } } From 84d4d331579c655b7a2ff67226432a159c14a40f Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=EA=B9=80=EC=97=B0=EC=A7=84?= Date: Mon, 21 Aug 2023 21:39:20 +0900 Subject: [PATCH 09/44] =?UTF-8?q?feat(BridgeGame):=20=EA=B2=8C=EC=9E=84=20?= =?UTF-8?q?=EC=A7=84=ED=96=89=20=EA=B8=B0=EB=8A=A5=20=EA=B5=AC=ED=98=84?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- docs/README.md | 4 +-- src/main/java/bridge/constant/GameStatus.java | 23 +++++++++++++ .../bridge/controller/BridgeController.java | 6 ++-- src/main/java/bridge/domain/GameRecorder.java | 34 +++++++++++++++++++ src/main/java/bridge/service/BridgeGame.java | 15 ++++++-- 5 files changed, 75 insertions(+), 7 deletions(-) create mode 100644 src/main/java/bridge/constant/GameStatus.java create mode 100644 src/main/java/bridge/domain/GameRecorder.java diff --git a/docs/README.md b/docs/README.md index 794d287b014..87a0187fb45 100644 --- a/docs/README.md +++ b/docs/README.md @@ -12,8 +12,8 @@ - [x] 0➝D / 1➝U 변환 **게임 진행** -- [x] 생성된 다리와 사용자의 입력 비교 - - [ ] 이동 가능한 경우 계속 진행 +- [x] 생성된 다리와 사용자의 현입력 비교 + - [x] 이동 가능한 경우 계속 진행 - [ ] 이동 불가능한 경우 재시작 / 종료 - [ ] 재시작하는 경우 시도 횟수 증가 diff --git a/src/main/java/bridge/constant/GameStatus.java b/src/main/java/bridge/constant/GameStatus.java new file mode 100644 index 00000000000..a8e1d4b170c --- /dev/null +++ b/src/main/java/bridge/constant/GameStatus.java @@ -0,0 +1,23 @@ +package bridge.constant; + +public enum GameStatus { + + PROGRESS, + MOVING_FAILED, + GAME_SUCCESS, + GAME_QUIT; + + public static GameStatus checkProgress(boolean canMoving, int bridgeSize, int position) { + if (!canMoving) { + return GameStatus.MOVING_FAILED; + } + return checkGameStatus(bridgeSize, position); + } + + private static GameStatus checkGameStatus(int bridgeSize, int position) { + if (bridgeSize == position) { + return GameStatus.GAME_SUCCESS; + } + return GameStatus.PROGRESS; + } +} diff --git a/src/main/java/bridge/controller/BridgeController.java b/src/main/java/bridge/controller/BridgeController.java index 7c3a98efa23..25aa5c2f415 100644 --- a/src/main/java/bridge/controller/BridgeController.java +++ b/src/main/java/bridge/controller/BridgeController.java @@ -15,7 +15,9 @@ public void start() { outputView.printLengthMessage(); BridgeGame bridgeGame = new BridgeGame(inputView.readBridgeSize()); - outputView.printMovingDirectionMessage(); - bridgeGame.move(inputView.readMoving()); + while (bridgeGame.isProgress()) { + outputView.printMovingDirectionMessage(); + bridgeGame.move(inputView.readMoving()); + } } } \ No newline at end of file diff --git a/src/main/java/bridge/domain/GameRecorder.java b/src/main/java/bridge/domain/GameRecorder.java new file mode 100644 index 00000000000..cb83b282608 --- /dev/null +++ b/src/main/java/bridge/domain/GameRecorder.java @@ -0,0 +1,34 @@ +package bridge.domain; + +import bridge.constant.GameStatus; + +public class GameRecorder { + + private final int bridgeSize; + + private int position = 0; + private int retryCount = 0; + private GameStatus gameStatus; + + + public GameRecorder(int bridgeSize) { + this.bridgeSize = bridgeSize; + this.gameStatus = GameStatus.PROGRESS; + } + + public void movePosition() { + position++; + } + + public void checkProgress(boolean canMoving) { + gameStatus = GameStatus.checkProgress(canMoving, bridgeSize, position); + } + + public int getPosition() { + return position; + } + + public GameStatus getGameStatus() { + return gameStatus; + } +} diff --git a/src/main/java/bridge/service/BridgeGame.java b/src/main/java/bridge/service/BridgeGame.java index 6b95af55598..1b0bc3a4018 100644 --- a/src/main/java/bridge/service/BridgeGame.java +++ b/src/main/java/bridge/service/BridgeGame.java @@ -2,7 +2,9 @@ import bridge.BridgeMaker; import bridge.BridgeRandomNumberGenerator; +import bridge.constant.GameStatus; import bridge.domain.Bridge; +import bridge.domain.GameRecorder; /** @@ -12,11 +14,13 @@ public class BridgeGame { private final Bridge bridge; - private int position = 0; + private final GameRecorder gameRecorder; public BridgeGame(int size) { BridgeMaker bridgeMaker = new BridgeMaker(new BridgeRandomNumberGenerator()); this.bridge = bridgeMaker.makeBridge(size); + gameRecorder = new GameRecorder(size); + System.out.println(bridge.getBridge()); } /** @@ -25,8 +29,9 @@ public BridgeGame(int size) { * 이동을 위해 필요한 메서드의 반환 타입(return type), 인자(parameter)는 자유롭게 추가하거나 변경할 수 있다. */ public void move(String moving) { - bridge.isCorrectMoving(moving, position); - position++; + boolean isCorrect = bridge.isCorrectMoving(moving, gameRecorder.getPosition()); + gameRecorder.movePosition(); + gameRecorder.checkProgress(isCorrect); } /** @@ -36,4 +41,8 @@ public void move(String moving) { */ public void retry() { } + + public boolean isProgress() { + return gameRecorder.getGameStatus() == GameStatus.PROGRESS; + } } From e5f18a2e9d722d19328f3138f82c1344c01916db Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=EA=B9=80=EC=97=B0=EC=A7=84?= Date: Mon, 21 Aug 2023 21:57:57 +0900 Subject: [PATCH 10/44] =?UTF-8?q?feat(InputView):=20=EC=9E=AC=EC=8B=9C?= =?UTF-8?q?=EC=9E=91=20=EC=9E=85=EB=A0=A5=20=EA=B8=B0=EB=8A=A5=20=EA=B5=AC?= =?UTF-8?q?=ED=98=84?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- src/main/java/bridge/constant/OutputMessage.java | 3 ++- src/main/java/bridge/view/InputView.java | 2 +- src/main/java/bridge/view/OutputView.java | 4 ++++ 3 files changed, 7 insertions(+), 2 deletions(-) diff --git a/src/main/java/bridge/constant/OutputMessage.java b/src/main/java/bridge/constant/OutputMessage.java index 8b1a79d47de..5a548d651d0 100644 --- a/src/main/java/bridge/constant/OutputMessage.java +++ b/src/main/java/bridge/constant/OutputMessage.java @@ -4,7 +4,8 @@ public enum OutputMessage { START_MESSAGE("다리 건너기 게임을 시작합니다."), LENGTH_MESSAGE("다리의 길이를 입력해주세요."), - MOVE_LOCATION("이동할 칸을 선택해주세요. (위: U, 아래: D)"); + MOVE_LOCATION("이동할 칸을 선택해주세요. (위: U, 아래: D)"), + RETRY_MESSAGE("게임을 다시 시도할지 여부를 입력해주세요. (재시도: R, 종료: Q)"); private final String message; diff --git a/src/main/java/bridge/view/InputView.java b/src/main/java/bridge/view/InputView.java index 8009f1edf91..45edf609d5e 100644 --- a/src/main/java/bridge/view/InputView.java +++ b/src/main/java/bridge/view/InputView.java @@ -26,6 +26,6 @@ public String readMoving() { * 사용자가 게임을 다시 시도할지 종료할지 여부를 입력받는다. */ public String readGameCommand() { - return null; + return Console.readLine(); } } diff --git a/src/main/java/bridge/view/OutputView.java b/src/main/java/bridge/view/OutputView.java index 251cade7caf..f455097bf82 100644 --- a/src/main/java/bridge/view/OutputView.java +++ b/src/main/java/bridge/view/OutputView.java @@ -34,4 +34,8 @@ public void printLengthMessage() { public void printMovingDirectionMessage() { System.out.println(OutputMessage.MOVE_LOCATION); } + + public void printRetryMessage() { + System.out.println(OutputMessage.RETRY_MESSAGE); + } } From 4bf127b6052d7a7d2f7e5abd69128fd79d0322e6 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=EA=B9=80=EC=97=B0=EC=A7=84?= Date: Mon, 21 Aug 2023 21:59:15 +0900 Subject: [PATCH 11/44] =?UTF-8?q?Refactor(BridgeController):=20=EA=B2=8C?= =?UTF-8?q?=EC=9E=84=20=EC=A7=84=ED=96=89=20=EB=A9=94=EC=84=9C=EB=93=9C=20?= =?UTF-8?q?=EB=B6=84=EB=A6=AC?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- docs/README.md | 2 +- .../java/bridge/controller/BridgeController.java | 16 ++++++++++++++-- 2 files changed, 15 insertions(+), 3 deletions(-) diff --git a/docs/README.md b/docs/README.md index 87a0187fb45..e17f3668995 100644 --- a/docs/README.md +++ b/docs/README.md @@ -4,7 +4,7 @@ - [x] 게임 시작 안내 출력 - [x] 다리 길이 입력 (3 ~ 20사이 숫자) - [x] 이동할 칸 입력 (U / D) -- [ ] 재시도 입력 (R / Q) +- [x] 재시도 입력 (R / Q) **다리 생성** - 입력한 다리 길이만큼 다리 생성 diff --git a/src/main/java/bridge/controller/BridgeController.java b/src/main/java/bridge/controller/BridgeController.java index 25aa5c2f415..ce615d543ed 100644 --- a/src/main/java/bridge/controller/BridgeController.java +++ b/src/main/java/bridge/controller/BridgeController.java @@ -9,12 +9,24 @@ public class BridgeController { private final OutputView outputView = new OutputView(); private final InputView inputView = new InputView(); + private BridgeGame bridgeGame; + public void start() { - outputView.printGameStart(); + bridgeGame = startGame(); + while (bridgeGame.isNotQuit()) { + progress(); + outputView.printRetryMessage(); + inputView.readGameCommand(); + } + } + private BridgeGame startGame() { + outputView.printGameStart(); outputView.printLengthMessage(); - BridgeGame bridgeGame = new BridgeGame(inputView.readBridgeSize()); + return new BridgeGame(inputView.readBridgeSize()); + } + private void progress() { while (bridgeGame.isProgress()) { outputView.printMovingDirectionMessage(); bridgeGame.move(inputView.readMoving()); From aa7d1a92565b17393f5d3d855199e2723c993936 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=EA=B9=80=EC=97=B0=EC=A7=84?= Date: Mon, 21 Aug 2023 22:53:22 +0900 Subject: [PATCH 12/44] =?UTF-8?q?feat(GameRecorder):=20=EC=9E=AC=EC=8B=9C?= =?UTF-8?q?=EC=9E=91=20=EA=B8=B0=EB=8A=A5=20=EA=B5=AC=ED=98=84?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../bridge/controller/BridgeController.java | 6 +++-- src/main/java/bridge/domain/GameRecorder.java | 25 +++++++++++++++++++ src/main/java/bridge/service/BridgeGame.java | 12 ++++++++- 3 files changed, 40 insertions(+), 3 deletions(-) diff --git a/src/main/java/bridge/controller/BridgeController.java b/src/main/java/bridge/controller/BridgeController.java index ce615d543ed..393a03399e2 100644 --- a/src/main/java/bridge/controller/BridgeController.java +++ b/src/main/java/bridge/controller/BridgeController.java @@ -15,8 +15,10 @@ public void start() { bridgeGame = startGame(); while (bridgeGame.isNotQuit()) { progress(); - outputView.printRetryMessage(); - inputView.readGameCommand(); + if (bridgeGame.isFailed()) { + outputView.printRetryMessage(); + bridgeGame.retry(inputView.readGameCommand()); + } } } diff --git a/src/main/java/bridge/domain/GameRecorder.java b/src/main/java/bridge/domain/GameRecorder.java index cb83b282608..efd4284d0ff 100644 --- a/src/main/java/bridge/domain/GameRecorder.java +++ b/src/main/java/bridge/domain/GameRecorder.java @@ -2,6 +2,8 @@ import bridge.constant.GameStatus; +import java.util.Objects; + public class GameRecorder { private final int bridgeSize; @@ -24,6 +26,25 @@ public void checkProgress(boolean canMoving) { gameStatus = GameStatus.checkProgress(canMoving, bridgeSize, position); } + public void updateRetry(String restartCommand) { + if (gameStatus == GameStatus.MOVING_FAILED) { + gameStatus = checkGameStatus(restartCommand); + } + } + + private GameStatus checkGameStatus(String restartCommand) { + if (Objects.equals(restartCommand, "Q")){ + return GameStatus.GAME_QUIT; + } + initGame(); + return GameStatus.PROGRESS; + } + + private void initGame() { + position = 0; + retryCount++; + } + public int getPosition() { return position; } @@ -31,4 +52,8 @@ public int getPosition() { public GameStatus getGameStatus() { return gameStatus; } + + public int getRetryCount() { + return retryCount; + } } diff --git a/src/main/java/bridge/service/BridgeGame.java b/src/main/java/bridge/service/BridgeGame.java index 1b0bc3a4018..1149eb5b65d 100644 --- a/src/main/java/bridge/service/BridgeGame.java +++ b/src/main/java/bridge/service/BridgeGame.java @@ -39,10 +39,20 @@ public void move(String moving) { *

* 재시작을 위해 필요한 메서드의 반환 타입(return type), 인자(parameter)는 자유롭게 추가하거나 변경할 수 있다. */ - public void retry() { + public void retry(String restartCommand) { + gameRecorder.updateRetry(restartCommand); } public boolean isProgress() { return gameRecorder.getGameStatus() == GameStatus.PROGRESS; } + + public boolean isNotQuit() { + return gameRecorder.getGameStatus() != GameStatus.GAME_QUIT + && gameRecorder.getGameStatus() != GameStatus.GAME_SUCCESS; + } + + public boolean isFailed() { + return gameRecorder.getGameStatus() == GameStatus.MOVING_FAILED; + } } From c9accf96faba9c5a3e2a7e1c58f2ffc073cefc52 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=EA=B9=80=EC=97=B0=EC=A7=84?= Date: Tue, 22 Aug 2023 00:23:36 +0900 Subject: [PATCH 13/44] =?UTF-8?q?Refactor(GameStatus):=20=EA=B2=8C?= =?UTF-8?q?=EC=9E=84=20=EC=83=81=ED=83=9C=20=ED=99=95=EC=9D=B8=20=EB=A9=94?= =?UTF-8?q?=EC=84=9C=EB=93=9C=20=EB=B6=84=EB=A6=AC?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- docs/README.md | 4 +-- src/main/java/bridge/constant/GameStatus.java | 28 ++++++++++++++- .../bridge/controller/BridgeController.java | 2 +- src/main/java/bridge/domain/GameRecorder.java | 36 +++++++++---------- src/main/java/bridge/service/BridgeGame.java | 12 +++---- 5 files changed, 53 insertions(+), 29 deletions(-) diff --git a/docs/README.md b/docs/README.md index e17f3668995..cdbdd7c310a 100644 --- a/docs/README.md +++ b/docs/README.md @@ -14,8 +14,8 @@ **게임 진행** - [x] 생성된 다리와 사용자의 현입력 비교 - [x] 이동 가능한 경우 계속 진행 - - [ ] 이동 불가능한 경우 재시작 / 종료 -- [ ] 재시작하는 경우 시도 횟수 증가 + - [x] 이동 불가능한 경우 재시작 / 종료 +- [x] 재시작하는 경우 시도 횟수 증가 **게임 진행 내용 저장** - [ ] 사용자의 입력이 맞는지 저장한다 diff --git a/src/main/java/bridge/constant/GameStatus.java b/src/main/java/bridge/constant/GameStatus.java index a8e1d4b170c..c94ee635225 100644 --- a/src/main/java/bridge/constant/GameStatus.java +++ b/src/main/java/bridge/constant/GameStatus.java @@ -1,13 +1,23 @@ package bridge.constant; +import java.util.Objects; + public enum GameStatus { PROGRESS, MOVING_FAILED, GAME_SUCCESS, + RESTART, GAME_QUIT; - public static GameStatus checkProgress(boolean canMoving, int bridgeSize, int position) { + public static GameStatus checkStatus(String command) { + if (Objects.equals(command, "Q")){ + return GameStatus.GAME_QUIT; + } + return GameStatus.RESTART; + } + + public static GameStatus checkStatus(boolean canMoving, int bridgeSize, int position) { if (!canMoving) { return GameStatus.MOVING_FAILED; } @@ -20,4 +30,20 @@ private static GameStatus checkGameStatus(int bridgeSize, int position) { } return GameStatus.PROGRESS; } + + public static GameStatus init() { + return GameStatus.PROGRESS; + } + + public boolean isProgress() { + return this == PROGRESS; + } + + public boolean isNotEnd() { + return this != GAME_QUIT && this != GameStatus.GAME_SUCCESS; + } + + public boolean isFailed() { + return this == GameStatus.MOVING_FAILED; + } } diff --git a/src/main/java/bridge/controller/BridgeController.java b/src/main/java/bridge/controller/BridgeController.java index 393a03399e2..0ed988ec46f 100644 --- a/src/main/java/bridge/controller/BridgeController.java +++ b/src/main/java/bridge/controller/BridgeController.java @@ -13,7 +13,7 @@ public class BridgeController { public void start() { bridgeGame = startGame(); - while (bridgeGame.isNotQuit()) { + while (bridgeGame.isNotEnd()) { progress(); if (bridgeGame.isFailed()) { outputView.printRetryMessage(); diff --git a/src/main/java/bridge/domain/GameRecorder.java b/src/main/java/bridge/domain/GameRecorder.java index efd4284d0ff..faeff4ffb58 100644 --- a/src/main/java/bridge/domain/GameRecorder.java +++ b/src/main/java/bridge/domain/GameRecorder.java @@ -2,8 +2,6 @@ import bridge.constant.GameStatus; -import java.util.Objects; - public class GameRecorder { private final int bridgeSize; @@ -23,37 +21,39 @@ public void movePosition() { } public void checkProgress(boolean canMoving) { - gameStatus = GameStatus.checkProgress(canMoving, bridgeSize, position); - } - - public void updateRetry(String restartCommand) { - if (gameStatus == GameStatus.MOVING_FAILED) { - gameStatus = checkGameStatus(restartCommand); - } + gameStatus = GameStatus.checkStatus(canMoving, bridgeSize, position); } - private GameStatus checkGameStatus(String restartCommand) { - if (Objects.equals(restartCommand, "Q")){ - return GameStatus.GAME_QUIT; + public void checkGameStatus(String restartCommand) { + gameStatus = GameStatus.checkStatus(restartCommand); + if (gameStatus == GameStatus.RESTART) { + initGame(); } - initGame(); - return GameStatus.PROGRESS; } private void initGame() { position = 0; retryCount++; + gameStatus = GameStatus.init(); } public int getPosition() { return position; } - public GameStatus getGameStatus() { - return gameStatus; - } - public int getRetryCount() { return retryCount; } + + public boolean isProgress() { + return gameStatus.isProgress(); + } + + public boolean isNotEnd() { + return gameStatus.isNotEnd(); + } + + public boolean isFailed() { + return gameStatus.isFailed(); + } } diff --git a/src/main/java/bridge/service/BridgeGame.java b/src/main/java/bridge/service/BridgeGame.java index 1149eb5b65d..8b3eb430a85 100644 --- a/src/main/java/bridge/service/BridgeGame.java +++ b/src/main/java/bridge/service/BridgeGame.java @@ -2,7 +2,6 @@ import bridge.BridgeMaker; import bridge.BridgeRandomNumberGenerator; -import bridge.constant.GameStatus; import bridge.domain.Bridge; import bridge.domain.GameRecorder; @@ -40,19 +39,18 @@ public void move(String moving) { * 재시작을 위해 필요한 메서드의 반환 타입(return type), 인자(parameter)는 자유롭게 추가하거나 변경할 수 있다. */ public void retry(String restartCommand) { - gameRecorder.updateRetry(restartCommand); + gameRecorder.checkGameStatus(restartCommand); } public boolean isProgress() { - return gameRecorder.getGameStatus() == GameStatus.PROGRESS; + return gameRecorder.isProgress(); } - public boolean isNotQuit() { - return gameRecorder.getGameStatus() != GameStatus.GAME_QUIT - && gameRecorder.getGameStatus() != GameStatus.GAME_SUCCESS; + public boolean isNotEnd() { + return gameRecorder.isNotEnd(); } public boolean isFailed() { - return gameRecorder.getGameStatus() == GameStatus.MOVING_FAILED; + return gameRecorder.isFailed(); } } From db7aeac65f0035e92df0deac3ef350ea1b0e82d5 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=EA=B9=80=EC=97=B0=EC=A7=84?= Date: Tue, 22 Aug 2023 01:10:44 +0900 Subject: [PATCH 14/44] =?UTF-8?q?feat(RetryCommand):=20=EC=9E=AC=EC=8B=9C?= =?UTF-8?q?=EC=9E=91=20=EB=AC=B8=EC=9E=90=20=EA=B4=80=EB=A6=AC=20enum=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 --- .../java/bridge/constant/RetryCommand.java | 18 ++++++++++++++++++ 1 file changed, 18 insertions(+) create mode 100644 src/main/java/bridge/constant/RetryCommand.java diff --git a/src/main/java/bridge/constant/RetryCommand.java b/src/main/java/bridge/constant/RetryCommand.java new file mode 100644 index 00000000000..c5f4773c98f --- /dev/null +++ b/src/main/java/bridge/constant/RetryCommand.java @@ -0,0 +1,18 @@ +package bridge.constant; + +public enum RetryCommand { + + RETRY("R"), + QUIT("Q"); + + private final String command; + + RetryCommand(String command) { + this.command = command; + } + + @Override + public String toString() { + return this.command; + } +} From 722ba6c9c31eec3befaa9b26d1f3fd3ce76a61f3 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=EA=B9=80=EC=97=B0=EC=A7=84?= Date: Tue, 22 Aug 2023 01:11:25 +0900 Subject: [PATCH 15/44] =?UTF-8?q?refactor(GameStatus):=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/main/java/bridge/constant/GameStatus.java | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/main/java/bridge/constant/GameStatus.java b/src/main/java/bridge/constant/GameStatus.java index c94ee635225..06f8c0ffba9 100644 --- a/src/main/java/bridge/constant/GameStatus.java +++ b/src/main/java/bridge/constant/GameStatus.java @@ -11,7 +11,7 @@ public enum GameStatus { GAME_QUIT; public static GameStatus checkStatus(String command) { - if (Objects.equals(command, "Q")){ + if (Objects.equals(command, RetryCommand.QUIT.toString())){ return GameStatus.GAME_QUIT; } return GameStatus.RESTART; From 9a58496b1b824bbd9d3c9551ab3ec4acc153081f Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=EA=B9=80=EC=97=B0=EC=A7=84?= Date: Tue, 22 Aug 2023 01:16:03 +0900 Subject: [PATCH 16/44] =?UTF-8?q?feat(BridgeMaps):=20=EA=B2=8C=EC=9E=84=20?= =?UTF-8?q?=EC=A7=84=ED=96=89=20=EB=82=B4=EC=9A=A9=20=EC=A0=80=EC=9E=A5=20?= =?UTF-8?q?=EA=B8=B0=EB=8A=A5=20=EA=B5=AC=ED=98=84?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- docs/README.md | 2 +- .../bridge/constant/ExceptionMessage.java | 3 +- .../java/bridge/constant/MovingResult.java | 28 ++++++++++++++ src/main/java/bridge/domain/BridgeMaps.java | 37 +++++++++++++++++++ src/main/java/bridge/service/BridgeGame.java | 4 +- 5 files changed, 71 insertions(+), 3 deletions(-) create mode 100644 src/main/java/bridge/constant/MovingResult.java create mode 100644 src/main/java/bridge/domain/BridgeMaps.java diff --git a/docs/README.md b/docs/README.md index cdbdd7c310a..0ead84e3143 100644 --- a/docs/README.md +++ b/docs/README.md @@ -18,7 +18,7 @@ - [x] 재시작하는 경우 시도 횟수 증가 **게임 진행 내용 저장** -- [ ] 사용자의 입력이 맞는지 저장한다 +- [x] 사용자의 입력이 맞는지 저장한다 - 맞을 경우 O, 틀릴 경우 X 저장 **결과 출력** diff --git a/src/main/java/bridge/constant/ExceptionMessage.java b/src/main/java/bridge/constant/ExceptionMessage.java index ab95228612f..73165ce2735 100644 --- a/src/main/java/bridge/constant/ExceptionMessage.java +++ b/src/main/java/bridge/constant/ExceptionMessage.java @@ -2,7 +2,8 @@ public enum ExceptionMessage { - NOT_BRIDGE_ELEMENT("다리 건너기 게임을 시작합니다."); + NOT_BRIDGE_ELEMENT("다리 건너기 게임을 시작합니다."), + MOVING_RESULT_NONE("해당 방향으로 움직일 수 없습니다."); private static final String PREFIX = "[ERROR] "; private final String message; diff --git a/src/main/java/bridge/constant/MovingResult.java b/src/main/java/bridge/constant/MovingResult.java new file mode 100644 index 00000000000..b270ccbce44 --- /dev/null +++ b/src/main/java/bridge/constant/MovingResult.java @@ -0,0 +1,28 @@ +package bridge.constant; + +import java.util.Arrays; + +public enum MovingResult { + + MOVING_SUCCESS("O", true), + MOVING_FAILED("X", false); + + private final String display; + private final boolean success; + + MovingResult(String display, boolean success) { + this.display = display; + this.success = success; + } + + public static MovingResult calculateDisplay(boolean isSuccess) { + return Arrays.stream(MovingResult.values()) + .filter(movingResult -> movingResult.success == isSuccess) + .findAny() + .orElseThrow(() -> new IllegalArgumentException(ExceptionMessage.MOVING_RESULT_NONE.toString())); + } + + public String getDisplay() { + return this.display; + } +} diff --git a/src/main/java/bridge/domain/BridgeMaps.java b/src/main/java/bridge/domain/BridgeMaps.java new file mode 100644 index 00000000000..28eaf520975 --- /dev/null +++ b/src/main/java/bridge/domain/BridgeMaps.java @@ -0,0 +1,37 @@ +package bridge.domain; + +import bridge.constant.BridgeDirection; +import bridge.constant.MovingResult; + +import java.util.ArrayList; +import java.util.List; + +public class BridgeMaps { + + private final static String BLANK = " "; + + private final List upper = new ArrayList<>(); + private final List lower = new ArrayList<>(); + + public void addResult(String userInput, boolean isSuccess) { + setUpper(userInput, isSuccess); + setLower(userInput, isSuccess); + } + + private void setUpper(String userInput, boolean isSuccess) { + if(userInput.equals(BridgeDirection.UP.getDirection())) { + MovingResult correctMessage = MovingResult.calculateDisplay(isSuccess); + System.out.println(correctMessage); + upper.add(correctMessage.getDisplay()); + lower.add(BLANK); + } + } + + private void setLower(String userInput, boolean success) { + if(userInput.equals(BridgeDirection.DOWN.getDirection())) { + MovingResult resultMessage = MovingResult.calculateDisplay(success); + lower.add(resultMessage.getDisplay()); + upper.add(BLANK); + } + } +} \ No newline at end of file diff --git a/src/main/java/bridge/service/BridgeGame.java b/src/main/java/bridge/service/BridgeGame.java index 8b3eb430a85..791544e2bea 100644 --- a/src/main/java/bridge/service/BridgeGame.java +++ b/src/main/java/bridge/service/BridgeGame.java @@ -3,6 +3,7 @@ import bridge.BridgeMaker; import bridge.BridgeRandomNumberGenerator; import bridge.domain.Bridge; +import bridge.domain.BridgeMaps; import bridge.domain.GameRecorder; @@ -12,8 +13,8 @@ public class BridgeGame { private final Bridge bridge; - private final GameRecorder gameRecorder; + private final BridgeMaps bridgeMaps = new BridgeMaps(); public BridgeGame(int size) { BridgeMaker bridgeMaker = new BridgeMaker(new BridgeRandomNumberGenerator()); @@ -31,6 +32,7 @@ public void move(String moving) { boolean isCorrect = bridge.isCorrectMoving(moving, gameRecorder.getPosition()); gameRecorder.movePosition(); gameRecorder.checkProgress(isCorrect); + bridgeMaps.addResult(moving, isCorrect); } /** From 733f3359bc72110f6c494aa58ae4f8eae6b20c36 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=EA=B9=80=EC=97=B0=EC=A7=84?= Date: Tue, 22 Aug 2023 01:40:31 +0900 Subject: [PATCH 17/44] =?UTF-8?q?feat(BridgeMaps):=20=EA=B2=8C=EC=9E=84=20?= =?UTF-8?q?=EC=9E=AC=EC=8B=9C=EC=9E=91=EC=8B=9C=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/BridgeMaps.java | 8 ++++++++ src/main/java/bridge/service/BridgeGame.java | 1 + 2 files changed, 9 insertions(+) diff --git a/src/main/java/bridge/domain/BridgeMaps.java b/src/main/java/bridge/domain/BridgeMaps.java index 28eaf520975..d2ceab62ab0 100644 --- a/src/main/java/bridge/domain/BridgeMaps.java +++ b/src/main/java/bridge/domain/BridgeMaps.java @@ -2,6 +2,7 @@ import bridge.constant.BridgeDirection; import bridge.constant.MovingResult; +import bridge.constant.RetryCommand; import java.util.ArrayList; import java.util.List; @@ -34,4 +35,11 @@ private void setLower(String userInput, boolean success) { upper.add(BLANK); } } + + public void clear(String command) { + if (command.equals(RetryCommand.RETRY.toString())){ + upper.clear(); + lower.clear(); + } + } } \ No newline at end of file diff --git a/src/main/java/bridge/service/BridgeGame.java b/src/main/java/bridge/service/BridgeGame.java index 791544e2bea..1be8b7a7475 100644 --- a/src/main/java/bridge/service/BridgeGame.java +++ b/src/main/java/bridge/service/BridgeGame.java @@ -42,6 +42,7 @@ public void move(String moving) { */ public void retry(String restartCommand) { gameRecorder.checkGameStatus(restartCommand); + bridgeMaps.clear(restartCommand); } public boolean isProgress() { From 9106c4e202363a775ed678546d26d828e0df54a2 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=EA=B9=80=EC=97=B0=EC=A7=84?= Date: Tue, 22 Aug 2023 02:00:59 +0900 Subject: [PATCH 18/44] =?UTF-8?q?feat(BridgeElement):=20=EB=8B=A4=EB=A6=AC?= =?UTF-8?q?=20=EC=B6=9C=EB=A0=A5=20=EC=9A=94=EC=86=8C=20=EC=83=81=EC=88=98?= =?UTF-8?q?=20=EA=B4=80=EB=A6=AC=20enum=20=EA=B5=AC=ED=98=84?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../java/bridge/constant/BridgeElement.java | 19 +++++++++++++++++++ 1 file changed, 19 insertions(+) create mode 100644 src/main/java/bridge/constant/BridgeElement.java diff --git a/src/main/java/bridge/constant/BridgeElement.java b/src/main/java/bridge/constant/BridgeElement.java new file mode 100644 index 00000000000..40ed88e2bca --- /dev/null +++ b/src/main/java/bridge/constant/BridgeElement.java @@ -0,0 +1,19 @@ +package bridge.constant; + +public enum BridgeElement { + BRIDGE_START("[ "), + BRIDGE_END(" ]"), + BRIDGE_DELIMITER(" | "); + + + private final String element; + + BridgeElement(String element) { + this.element = element; + } + + @Override + public String toString() { + return this.element; + } +} From 53390975382fdac414ef6e4eda30772cc92e9ae8 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=EA=B9=80=EC=97=B0=EC=A7=84?= Date: Tue, 22 Aug 2023 02:02:29 +0900 Subject: [PATCH 19/44] =?UTF-8?q?feat(OutputView):=20=EA=B2=8C=EC=9E=84=20?= =?UTF-8?q?=EC=A7=84=ED=96=89=20=EC=8B=9C=20=EB=8B=A4=EB=A6=AC=20=EC=B6=9C?= =?UTF-8?q?=EB=A0=A5=20=EA=B8=B0=EB=8A=A5=20=EA=B5=AC=ED=98=84?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- docs/README.md | 4 ++-- .../java/bridge/controller/BridgeController.java | 1 + src/main/java/bridge/domain/BridgeMaps.java | 14 +++++++++++++- src/main/java/bridge/service/BridgeGame.java | 4 ++++ src/main/java/bridge/view/OutputView.java | 4 +++- 5 files changed, 23 insertions(+), 4 deletions(-) diff --git a/docs/README.md b/docs/README.md index 0ead84e3143..631114a1cd3 100644 --- a/docs/README.md +++ b/docs/README.md @@ -23,8 +23,8 @@ **결과 출력** - 다리 출력 - - [ ] `[`로 시작, `]`로 끝, 구분자는 `|` - - [ ] 이동 가능한 경우 O / 불가능한 경우 X 출력 + - [x] `[`로 시작, `]`로 끝, 구분자는 `|` + - [x] 이동 가능한 경우 O / 불가능한 경우 X 출력 - [ ] 게임 성공 여부 - [ ] 총 시도 횟수 diff --git a/src/main/java/bridge/controller/BridgeController.java b/src/main/java/bridge/controller/BridgeController.java index 0ed988ec46f..433427b8a86 100644 --- a/src/main/java/bridge/controller/BridgeController.java +++ b/src/main/java/bridge/controller/BridgeController.java @@ -32,6 +32,7 @@ private void progress() { while (bridgeGame.isProgress()) { outputView.printMovingDirectionMessage(); bridgeGame.move(inputView.readMoving()); + outputView.printMap(bridgeGame.getBridgeMaps()); } } } \ No newline at end of file diff --git a/src/main/java/bridge/domain/BridgeMaps.java b/src/main/java/bridge/domain/BridgeMaps.java index d2ceab62ab0..0651eb9964c 100644 --- a/src/main/java/bridge/domain/BridgeMaps.java +++ b/src/main/java/bridge/domain/BridgeMaps.java @@ -1,11 +1,13 @@ package bridge.domain; import bridge.constant.BridgeDirection; +import bridge.constant.BridgeElement; import bridge.constant.MovingResult; import bridge.constant.RetryCommand; import java.util.ArrayList; import java.util.List; +import java.util.StringJoiner; public class BridgeMaps { @@ -22,7 +24,6 @@ public void addResult(String userInput, boolean isSuccess) { private void setUpper(String userInput, boolean isSuccess) { if(userInput.equals(BridgeDirection.UP.getDirection())) { MovingResult correctMessage = MovingResult.calculateDisplay(isSuccess); - System.out.println(correctMessage); upper.add(correctMessage.getDisplay()); lower.add(BLANK); } @@ -42,4 +43,15 @@ public void clear(String command) { lower.clear(); } } + + @Override + public String toString() { + return setBridge(upper) + "\n" + setBridge(lower); + } + + private String setBridge(List bridge) { + StringJoiner stringJoiner = new StringJoiner(BridgeElement.BRIDGE_DELIMITER.toString(), BridgeElement.BRIDGE_START.toString(), BridgeElement.BRIDGE_END.toString()); + bridge.forEach(stringJoiner::add); + return stringJoiner.toString(); + } } \ No newline at end of file diff --git a/src/main/java/bridge/service/BridgeGame.java b/src/main/java/bridge/service/BridgeGame.java index 1be8b7a7475..e0da2b0fe86 100644 --- a/src/main/java/bridge/service/BridgeGame.java +++ b/src/main/java/bridge/service/BridgeGame.java @@ -56,4 +56,8 @@ public boolean isNotEnd() { public boolean isFailed() { return gameRecorder.isFailed(); } + + public BridgeMaps getBridgeMaps() { + return bridgeMaps; + } } diff --git a/src/main/java/bridge/view/OutputView.java b/src/main/java/bridge/view/OutputView.java index f455097bf82..dc4833d9775 100644 --- a/src/main/java/bridge/view/OutputView.java +++ b/src/main/java/bridge/view/OutputView.java @@ -1,6 +1,7 @@ package bridge.view; import bridge.constant.OutputMessage; +import bridge.domain.BridgeMaps; /** * 사용자에게 게임 진행 상황과 결과를 출력하는 역할을 한다. @@ -12,7 +13,8 @@ public class OutputView { *

* 출력을 위해 필요한 메서드의 인자(parameter)는 자유롭게 추가하거나 변경할 수 있다. */ - public void printMap() { + public void printMap(BridgeMaps bridgeMaps) { + System.out.println(bridgeMaps.toString()); } /** From 4204fa000f6a5024d01a2a82c02361ef0a6bdc6c Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=EA=B9=80=EC=97=B0=EC=A7=84?= Date: Tue, 22 Aug 2023 02:15:09 +0900 Subject: [PATCH 20/44] =?UTF-8?q?feat(OutputView):=20=EA=B2=8C=EC=9E=84=20?= =?UTF-8?q?=EC=A2=85=EB=A3=8C=20=EC=8B=9C=20=EC=B4=9D=20=EC=8B=9C=EB=8F=84?= =?UTF-8?q?=20=ED=9A=9F=EC=88=98=20=EC=B6=9C=EB=A0=A5=20=EA=B8=B0=EB=8A=A5?= =?UTF-8?q?=20=EA=B5=AC=ED=98=84?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- src/main/java/bridge/constant/OutputMessage.java | 4 +++- src/main/java/bridge/controller/BridgeController.java | 1 + src/main/java/bridge/service/BridgeGame.java | 4 ++++ src/main/java/bridge/view/OutputView.java | 6 +++++- 4 files changed, 13 insertions(+), 2 deletions(-) diff --git a/src/main/java/bridge/constant/OutputMessage.java b/src/main/java/bridge/constant/OutputMessage.java index 5a548d651d0..fdda800ac1d 100644 --- a/src/main/java/bridge/constant/OutputMessage.java +++ b/src/main/java/bridge/constant/OutputMessage.java @@ -5,7 +5,9 @@ public enum OutputMessage { START_MESSAGE("다리 건너기 게임을 시작합니다."), LENGTH_MESSAGE("다리의 길이를 입력해주세요."), MOVE_LOCATION("이동할 칸을 선택해주세요. (위: U, 아래: D)"), - RETRY_MESSAGE("게임을 다시 시도할지 여부를 입력해주세요. (재시도: R, 종료: Q)"); + RETRY_MESSAGE("게임을 다시 시도할지 여부를 입력해주세요. (재시도: R, 종료: Q)"), + GAME_END_MESSAGE("최종 게임 결과"), + RETRY_NUMBERS("총 시도한 횟수: %d\n"); private final String message; diff --git a/src/main/java/bridge/controller/BridgeController.java b/src/main/java/bridge/controller/BridgeController.java index 433427b8a86..1f8489401dc 100644 --- a/src/main/java/bridge/controller/BridgeController.java +++ b/src/main/java/bridge/controller/BridgeController.java @@ -20,6 +20,7 @@ public void start() { bridgeGame.retry(inputView.readGameCommand()); } } + outputView.printResult(bridgeGame.getBridgeMaps(), bridgeGame.getGameRecorder()); } private BridgeGame startGame() { diff --git a/src/main/java/bridge/service/BridgeGame.java b/src/main/java/bridge/service/BridgeGame.java index e0da2b0fe86..d1109092fa2 100644 --- a/src/main/java/bridge/service/BridgeGame.java +++ b/src/main/java/bridge/service/BridgeGame.java @@ -60,4 +60,8 @@ public boolean isFailed() { public BridgeMaps getBridgeMaps() { return bridgeMaps; } + + public GameRecorder getGameRecorder() { + return gameRecorder; + } } diff --git a/src/main/java/bridge/view/OutputView.java b/src/main/java/bridge/view/OutputView.java index dc4833d9775..43c7ce0a27f 100644 --- a/src/main/java/bridge/view/OutputView.java +++ b/src/main/java/bridge/view/OutputView.java @@ -2,6 +2,7 @@ import bridge.constant.OutputMessage; import bridge.domain.BridgeMaps; +import bridge.domain.GameRecorder; /** * 사용자에게 게임 진행 상황과 결과를 출력하는 역할을 한다. @@ -22,7 +23,10 @@ public void printMap(BridgeMaps bridgeMaps) { *

* 출력을 위해 필요한 메서드의 인자(parameter)는 자유롭게 추가하거나 변경할 수 있다. */ - public void printResult() { + public void printResult(BridgeMaps bridgeMaps, GameRecorder gameRecorder) { + System.out.println(OutputMessage.GAME_END_MESSAGE); + printMap(bridgeMaps); + System.out.printf(OutputMessage.RETRY_NUMBERS.toString(), gameRecorder.getRetryCount()); } public void printGameStart() { From 235a0e3a27e6871279528f9e75a2c0deb87cc7bf Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=EA=B9=80=EC=97=B0=EC=A7=84?= Date: Tue, 22 Aug 2023 03:42:05 +0900 Subject: [PATCH 21/44] =?UTF-8?q?fix(BridgeMaker):=20=EB=B0=98=ED=99=98?= =?UTF-8?q?=EA=B0=92=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 | 8 +++----- src/main/java/bridge/service/BridgeGame.java | 2 +- 2 files changed, 4 insertions(+), 6 deletions(-) diff --git a/src/main/java/bridge/BridgeMaker.java b/src/main/java/bridge/BridgeMaker.java index aa7b7409a55..e3ef6aa8a0f 100644 --- a/src/main/java/bridge/BridgeMaker.java +++ b/src/main/java/bridge/BridgeMaker.java @@ -1,7 +1,6 @@ package bridge; import bridge.constant.BridgeDirection; -import bridge.domain.Bridge; import java.util.ArrayList; import java.util.List; @@ -23,15 +22,14 @@ public BridgeMaker(BridgeNumberGenerator bridgeNumberGenerator) { * @param size 다리의 길이 * @return 입력받은 길이에 해당하는 다리 모양. 위 칸이면 "U", 아래 칸이면 "D"로 표현해야 한다. */ - public Bridge makeBridge(int size) { + public List makeBridge(int size) { List bridge = new ArrayList<>(); IntStream.range(0, size) .forEach(i -> bridge.add(bridgeNumberGenerator.generate())); - return new Bridge( - bridge.stream() + return bridge.stream() .map(BridgeDirection::convertDirection) .map(BridgeDirection::getDirection) - .collect(Collectors.toList()) + .collect(Collectors.toList() ); } } diff --git a/src/main/java/bridge/service/BridgeGame.java b/src/main/java/bridge/service/BridgeGame.java index d1109092fa2..54e64227bdb 100644 --- a/src/main/java/bridge/service/BridgeGame.java +++ b/src/main/java/bridge/service/BridgeGame.java @@ -18,7 +18,7 @@ public class BridgeGame { public BridgeGame(int size) { BridgeMaker bridgeMaker = new BridgeMaker(new BridgeRandomNumberGenerator()); - this.bridge = bridgeMaker.makeBridge(size); + this.bridge = new Bridge(bridgeMaker.makeBridge(size)); gameRecorder = new GameRecorder(size); System.out.println(bridge.getBridge()); } From a4a2aaa9db6cc9dd90bd5e5687a75f64590e21f2 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=EA=B9=80=EC=97=B0=EC=A7=84?= Date: Tue, 22 Aug 2023 04:02:26 +0900 Subject: [PATCH 22/44] =?UTF-8?q?feat(OutputView):=20=EA=B2=8C=EC=9E=84=20?= =?UTF-8?q?=EC=84=B1=EA=B3=B5=20=EC=97=AC=EB=B6=80=20=EC=B6=9C=EB=A0=A5=20?= =?UTF-8?q?=EA=B8=B0=EB=8A=A5=20=EA=B5=AC=ED=98=84?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- docs/README.md | 4 ++-- .../bridge/constant/GameClearMessage.java | 20 +++++++++++++++++++ src/main/java/bridge/constant/GameStatus.java | 4 ++++ .../java/bridge/constant/OutputMessage.java | 3 ++- src/main/java/bridge/domain/GameRecorder.java | 8 ++++++-- src/main/java/bridge/view/OutputView.java | 1 + 6 files changed, 35 insertions(+), 5 deletions(-) create mode 100644 src/main/java/bridge/constant/GameClearMessage.java diff --git a/docs/README.md b/docs/README.md index 631114a1cd3..7fc8ba234e6 100644 --- a/docs/README.md +++ b/docs/README.md @@ -25,8 +25,8 @@ - 다리 출력 - [x] `[`로 시작, `]`로 끝, 구분자는 `|` - [x] 이동 가능한 경우 O / 불가능한 경우 X 출력 -- [ ] 게임 성공 여부 -- [ ] 총 시도 횟수 +- [x] 게임 성공 여부 +- [x] 총 시도 횟수 **예외 처리** - 이동할 칸 입력 diff --git a/src/main/java/bridge/constant/GameClearMessage.java b/src/main/java/bridge/constant/GameClearMessage.java new file mode 100644 index 00000000000..dc67c4c7175 --- /dev/null +++ b/src/main/java/bridge/constant/GameClearMessage.java @@ -0,0 +1,20 @@ +package bridge.constant; + +public enum GameClearMessage { + + GAME_CLEAR("성공"), + GAME_FAILED("실패"); + + private final String message; + + GameClearMessage(String message) { + this.message = message; + } + + public static String getGameClearMessage(boolean isClear) { + if(isClear) { + return GAME_CLEAR.message; + } + return GAME_FAILED.message; + } +} diff --git a/src/main/java/bridge/constant/GameStatus.java b/src/main/java/bridge/constant/GameStatus.java index 06f8c0ffba9..4aff49ab25b 100644 --- a/src/main/java/bridge/constant/GameStatus.java +++ b/src/main/java/bridge/constant/GameStatus.java @@ -46,4 +46,8 @@ public boolean isNotEnd() { public boolean isFailed() { return this == GameStatus.MOVING_FAILED; } + + public boolean isClear() { + return this == GameStatus.GAME_SUCCESS; + } } diff --git a/src/main/java/bridge/constant/OutputMessage.java b/src/main/java/bridge/constant/OutputMessage.java index fdda800ac1d..4009f849622 100644 --- a/src/main/java/bridge/constant/OutputMessage.java +++ b/src/main/java/bridge/constant/OutputMessage.java @@ -7,7 +7,8 @@ public enum OutputMessage { MOVE_LOCATION("이동할 칸을 선택해주세요. (위: U, 아래: D)"), RETRY_MESSAGE("게임을 다시 시도할지 여부를 입력해주세요. (재시도: R, 종료: Q)"), GAME_END_MESSAGE("최종 게임 결과"), - RETRY_NUMBERS("총 시도한 횟수: %d\n"); + RETRY_NUMBERS("총 시도한 횟수: %d\n"), + GAME_STATUS("게임 성공 여부: %s\n"); private final String message; diff --git a/src/main/java/bridge/domain/GameRecorder.java b/src/main/java/bridge/domain/GameRecorder.java index faeff4ffb58..faaa7958296 100644 --- a/src/main/java/bridge/domain/GameRecorder.java +++ b/src/main/java/bridge/domain/GameRecorder.java @@ -1,5 +1,6 @@ package bridge.domain; +import bridge.constant.GameClearMessage; import bridge.constant.GameStatus; public class GameRecorder { @@ -7,10 +8,9 @@ public class GameRecorder { private final int bridgeSize; private int position = 0; - private int retryCount = 0; + private int retryCount = 1; private GameStatus gameStatus; - public GameRecorder(int bridgeSize) { this.bridgeSize = bridgeSize; this.gameStatus = GameStatus.PROGRESS; @@ -56,4 +56,8 @@ public boolean isNotEnd() { public boolean isFailed() { return gameStatus.isFailed(); } + + public String getGameClearMessage() { + return GameClearMessage.getGameClearMessage(gameStatus.isClear()); + } } diff --git a/src/main/java/bridge/view/OutputView.java b/src/main/java/bridge/view/OutputView.java index 43c7ce0a27f..7bc52658ccc 100644 --- a/src/main/java/bridge/view/OutputView.java +++ b/src/main/java/bridge/view/OutputView.java @@ -26,6 +26,7 @@ public void printMap(BridgeMaps bridgeMaps) { public void printResult(BridgeMaps bridgeMaps, GameRecorder gameRecorder) { System.out.println(OutputMessage.GAME_END_MESSAGE); printMap(bridgeMaps); + System.out.printf((OutputMessage.GAME_STATUS.toString()), gameRecorder.getGameClearMessage()); System.out.printf(OutputMessage.RETRY_NUMBERS.toString(), gameRecorder.getRetryCount()); } From c6bc20362042b70dfac19a1237c08eaeffcc9608 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=EA=B9=80=EC=97=B0=EC=A7=84?= Date: Tue, 22 Aug 2023 04:43:11 +0900 Subject: [PATCH 23/44] =?UTF-8?q?feat(InputValidator):=20=EB=8B=A4?= =?UTF-8?q?=EB=A6=AC=20=EC=9D=B4=EB=8F=99=20=EC=9E=85=EB=A0=A5=20=EC=8B=9C?= =?UTF-8?q?=20=EC=98=88=EC=99=B8=20=EC=B2=98=EB=A6=AC=20=EA=B8=B0=EB=8A=A5?= =?UTF-8?q?=20=EA=B5=AC=ED=98=84?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- docs/README.md | 2 +- src/main/java/bridge/constant/BridgeDirection.java | 8 ++++++-- src/main/java/bridge/constant/ExceptionMessage.java | 3 ++- src/main/java/bridge/validator/InputValidator.java | 13 +++++++++++++ src/main/java/bridge/view/InputView.java | 7 ++++++- 5 files changed, 28 insertions(+), 5 deletions(-) create mode 100644 src/main/java/bridge/validator/InputValidator.java diff --git a/docs/README.md b/docs/README.md index 7fc8ba234e6..f21b96541df 100644 --- a/docs/README.md +++ b/docs/README.md @@ -30,7 +30,7 @@ **예외 처리** - 이동할 칸 입력 - - [ ] U/D 이외의 입력이 들어올 경우 + - [x] U/D 이외의 입력이 들어올 경우 - 재시도 입력 - [ ] R/Q 이외의 입력이 들어올 경우 - 다리 길이 입력 diff --git a/src/main/java/bridge/constant/BridgeDirection.java b/src/main/java/bridge/constant/BridgeDirection.java index b222c89191d..413a5cb117a 100644 --- a/src/main/java/bridge/constant/BridgeDirection.java +++ b/src/main/java/bridge/constant/BridgeDirection.java @@ -11,9 +11,9 @@ public enum BridgeDirection { private final String direction; - BridgeDirection(int generateValue, String message) { + BridgeDirection(int generateValue, String direction) { this.generateValue = generateValue; - this.direction = message; + this.direction = direction; } public static BridgeDirection convertDirection(int generateValue) { @@ -23,6 +23,10 @@ public static BridgeDirection convertDirection(int generateValue) { .orElseThrow(() -> new IllegalArgumentException(ExceptionMessage.NOT_BRIDGE_ELEMENT.toString())); } + public static boolean isNotDirectionCommand(String direction) { + return !(direction.equals(UP.direction) || direction.equals(DOWN.direction)); + } + public String getDirection() { return direction; } diff --git a/src/main/java/bridge/constant/ExceptionMessage.java b/src/main/java/bridge/constant/ExceptionMessage.java index 73165ce2735..de39f4c950b 100644 --- a/src/main/java/bridge/constant/ExceptionMessage.java +++ b/src/main/java/bridge/constant/ExceptionMessage.java @@ -3,7 +3,8 @@ public enum ExceptionMessage { NOT_BRIDGE_ELEMENT("다리 건너기 게임을 시작합니다."), - MOVING_RESULT_NONE("해당 방향으로 움직일 수 없습니다."); + MOVING_RESULT_NONE("해당 방향으로 움직일 수 없습니다."), + INCORRECT_MOVING("U 또는 D로만 이동할 수 있습니다."),; private static final String PREFIX = "[ERROR] "; private final String message; diff --git a/src/main/java/bridge/validator/InputValidator.java b/src/main/java/bridge/validator/InputValidator.java new file mode 100644 index 00000000000..4b06fec7d4c --- /dev/null +++ b/src/main/java/bridge/validator/InputValidator.java @@ -0,0 +1,13 @@ +package bridge.validator; + +import bridge.constant.BridgeDirection; +import bridge.constant.ExceptionMessage; + +public class InputValidator { + + public void validateMoving(String input) { + if (BridgeDirection.isNotDirectionCommand(input)) { + throw new IllegalArgumentException(ExceptionMessage.INCORRECT_MOVING.toString()); + } + } +} diff --git a/src/main/java/bridge/view/InputView.java b/src/main/java/bridge/view/InputView.java index 45edf609d5e..bbebb7a3357 100644 --- a/src/main/java/bridge/view/InputView.java +++ b/src/main/java/bridge/view/InputView.java @@ -1,5 +1,6 @@ package bridge.view; +import bridge.validator.InputValidator; import camp.nextstep.edu.missionutils.Console; /** @@ -7,6 +8,8 @@ */ public class InputView { + private static final InputValidator inputValidator = new InputValidator(); + /** * 다리의 길이를 입력받는다. */ @@ -19,7 +22,9 @@ public int readBridgeSize() { * 사용자가 이동할 칸을 입력받는다. */ public String readMoving() { - return Console.readLine(); + String input = Console.readLine(); + inputValidator.validateMoving(input); + return input; } /** From e7d4610498fedb2d313aff2ecb7ce0e0e7c46159 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=EA=B9=80=EC=97=B0=EC=A7=84?= Date: Tue, 22 Aug 2023 05:04:46 +0900 Subject: [PATCH 24/44] =?UTF-8?q?feat(RetryCommand):=20=EC=9E=AC=EC=8B=9C?= =?UTF-8?q?=EC=9E=91=20=EC=9E=85=EB=A0=A5=20=EC=8B=9C=20=EC=98=88=EC=99=B8?= =?UTF-8?q?=20=EC=B2=98=EB=A6=AC=20=EA=B8=B0=EB=8A=A5=20=EA=B5=AC=ED=98=84?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- docs/README.md | 2 +- .../java/bridge/constant/ExceptionMessage.java | 3 ++- src/main/java/bridge/constant/GameStatus.java | 6 ++---- src/main/java/bridge/constant/RetryCommand.java | 17 +++++++++++++++++ src/main/java/bridge/domain/BridgeMaps.java | 4 ++-- src/main/java/bridge/domain/GameRecorder.java | 3 ++- src/main/java/bridge/service/BridgeGame.java | 3 ++- src/main/java/bridge/view/InputView.java | 5 +++-- 8 files changed, 31 insertions(+), 12 deletions(-) diff --git a/docs/README.md b/docs/README.md index f21b96541df..e9676d03a89 100644 --- a/docs/README.md +++ b/docs/README.md @@ -32,7 +32,7 @@ - 이동할 칸 입력 - [x] U/D 이외의 입력이 들어올 경우 - 재시도 입력 - - [ ] R/Q 이외의 입력이 들어올 경우 + - [x] R/Q 이외의 입력이 들어올 경우 - 다리 길이 입력 - [ ] 숫자가 아닌 입력이 들어온 경우 - [ ] 범위 이외의 숫자가 들어온 경우 \ No newline at end of file diff --git a/src/main/java/bridge/constant/ExceptionMessage.java b/src/main/java/bridge/constant/ExceptionMessage.java index de39f4c950b..ab74449a913 100644 --- a/src/main/java/bridge/constant/ExceptionMessage.java +++ b/src/main/java/bridge/constant/ExceptionMessage.java @@ -4,7 +4,8 @@ public enum ExceptionMessage { NOT_BRIDGE_ELEMENT("다리 건너기 게임을 시작합니다."), MOVING_RESULT_NONE("해당 방향으로 움직일 수 없습니다."), - INCORRECT_MOVING("U 또는 D로만 이동할 수 있습니다."),; + INCORRECT_MOVING("U 또는 D로만 이동할 수 있습니다."), + INCORRECT_RETRY("R 또는 Q만 입력할 수 있습니다."); private static final String PREFIX = "[ERROR] "; private final String message; diff --git a/src/main/java/bridge/constant/GameStatus.java b/src/main/java/bridge/constant/GameStatus.java index 4aff49ab25b..614ff163ba1 100644 --- a/src/main/java/bridge/constant/GameStatus.java +++ b/src/main/java/bridge/constant/GameStatus.java @@ -1,7 +1,5 @@ package bridge.constant; -import java.util.Objects; - public enum GameStatus { PROGRESS, @@ -10,8 +8,8 @@ public enum GameStatus { RESTART, GAME_QUIT; - public static GameStatus checkStatus(String command) { - if (Objects.equals(command, RetryCommand.QUIT.toString())){ + public static GameStatus checkStatus(RetryCommand command) { + if (command.isQuit()){ return GameStatus.GAME_QUIT; } return GameStatus.RESTART; diff --git a/src/main/java/bridge/constant/RetryCommand.java b/src/main/java/bridge/constant/RetryCommand.java index c5f4773c98f..05cc042858c 100644 --- a/src/main/java/bridge/constant/RetryCommand.java +++ b/src/main/java/bridge/constant/RetryCommand.java @@ -1,5 +1,8 @@ package bridge.constant; +import java.util.Arrays; +import java.util.Objects; + public enum RetryCommand { RETRY("R"), @@ -11,6 +14,20 @@ public enum RetryCommand { this.command = command; } + public static RetryCommand getCommand(String command) { + return Arrays.stream(RetryCommand.values()) + .filter(value -> value.command.equals(command)) + .findAny() + .orElseThrow(() -> new IllegalArgumentException(ExceptionMessage.INCORRECT_RETRY.toString())); + } + + public boolean isRetry() { + return Objects.equals(this.command, RETRY.command); + } + + public boolean isQuit() { + return Objects.equals(this.command, QUIT.command); + } @Override public String toString() { return this.command; diff --git a/src/main/java/bridge/domain/BridgeMaps.java b/src/main/java/bridge/domain/BridgeMaps.java index 0651eb9964c..388439cafcd 100644 --- a/src/main/java/bridge/domain/BridgeMaps.java +++ b/src/main/java/bridge/domain/BridgeMaps.java @@ -37,8 +37,8 @@ private void setLower(String userInput, boolean success) { } } - public void clear(String command) { - if (command.equals(RetryCommand.RETRY.toString())){ + public void clear(RetryCommand command) { + if (command.isRetry()){ upper.clear(); lower.clear(); } diff --git a/src/main/java/bridge/domain/GameRecorder.java b/src/main/java/bridge/domain/GameRecorder.java index faaa7958296..51dc076f167 100644 --- a/src/main/java/bridge/domain/GameRecorder.java +++ b/src/main/java/bridge/domain/GameRecorder.java @@ -2,6 +2,7 @@ import bridge.constant.GameClearMessage; import bridge.constant.GameStatus; +import bridge.constant.RetryCommand; public class GameRecorder { @@ -24,7 +25,7 @@ public void checkProgress(boolean canMoving) { gameStatus = GameStatus.checkStatus(canMoving, bridgeSize, position); } - public void checkGameStatus(String restartCommand) { + public void checkGameStatus(RetryCommand restartCommand) { gameStatus = GameStatus.checkStatus(restartCommand); if (gameStatus == GameStatus.RESTART) { initGame(); diff --git a/src/main/java/bridge/service/BridgeGame.java b/src/main/java/bridge/service/BridgeGame.java index 54e64227bdb..518614fdd20 100644 --- a/src/main/java/bridge/service/BridgeGame.java +++ b/src/main/java/bridge/service/BridgeGame.java @@ -2,6 +2,7 @@ import bridge.BridgeMaker; import bridge.BridgeRandomNumberGenerator; +import bridge.constant.RetryCommand; import bridge.domain.Bridge; import bridge.domain.BridgeMaps; import bridge.domain.GameRecorder; @@ -40,7 +41,7 @@ public void move(String moving) { *

* 재시작을 위해 필요한 메서드의 반환 타입(return type), 인자(parameter)는 자유롭게 추가하거나 변경할 수 있다. */ - public void retry(String restartCommand) { + public void retry(RetryCommand restartCommand) { gameRecorder.checkGameStatus(restartCommand); bridgeMaps.clear(restartCommand); } diff --git a/src/main/java/bridge/view/InputView.java b/src/main/java/bridge/view/InputView.java index bbebb7a3357..7d9afea398b 100644 --- a/src/main/java/bridge/view/InputView.java +++ b/src/main/java/bridge/view/InputView.java @@ -1,5 +1,6 @@ package bridge.view; +import bridge.constant.RetryCommand; import bridge.validator.InputValidator; import camp.nextstep.edu.missionutils.Console; @@ -30,7 +31,7 @@ public String readMoving() { /** * 사용자가 게임을 다시 시도할지 종료할지 여부를 입력받는다. */ - public String readGameCommand() { - return Console.readLine(); + public RetryCommand readGameCommand() { + return RetryCommand.getCommand(Console.readLine()); } } From 6c1a5de4a449451290a7bc0ea9729ac998a3315e Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=EA=B9=80=EC=97=B0=EC=A7=84?= Date: Tue, 22 Aug 2023 05:12:06 +0900 Subject: [PATCH 25/44] =?UTF-8?q?feat(InputValidator):=20=EB=8B=A4?= =?UTF-8?q?=EB=A6=AC=20=EA=B8=B8=EC=9D=B4=20=EC=9E=85=EB=A0=A5=EC=8B=9C=20?= =?UTF-8?q?=EC=88=AB=EC=9E=90=20=EC=9D=B4=EC=99=B8=20=EC=9E=85=EB=A0=A5=20?= =?UTF-8?q?=EC=98=88=EC=99=B8=20=EC=B2=98=EB=A6=AC?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- docs/README.md | 2 +- src/main/java/bridge/constant/ExceptionMessage.java | 3 ++- src/main/java/bridge/validator/InputValidator.java | 10 ++++++++++ src/main/java/bridge/view/InputView.java | 5 +++-- 4 files changed, 16 insertions(+), 4 deletions(-) diff --git a/docs/README.md b/docs/README.md index e9676d03a89..b54dafd45d2 100644 --- a/docs/README.md +++ b/docs/README.md @@ -34,5 +34,5 @@ - 재시도 입력 - [x] R/Q 이외의 입력이 들어올 경우 - 다리 길이 입력 - - [ ] 숫자가 아닌 입력이 들어온 경우 + - [x] 숫자가 아닌 입력이 들어온 경우 - [ ] 범위 이외의 숫자가 들어온 경우 \ No newline at end of file diff --git a/src/main/java/bridge/constant/ExceptionMessage.java b/src/main/java/bridge/constant/ExceptionMessage.java index ab74449a913..e7ff859f9cd 100644 --- a/src/main/java/bridge/constant/ExceptionMessage.java +++ b/src/main/java/bridge/constant/ExceptionMessage.java @@ -5,7 +5,8 @@ public enum ExceptionMessage { NOT_BRIDGE_ELEMENT("다리 건너기 게임을 시작합니다."), MOVING_RESULT_NONE("해당 방향으로 움직일 수 없습니다."), INCORRECT_MOVING("U 또는 D로만 이동할 수 있습니다."), - INCORRECT_RETRY("R 또는 Q만 입력할 수 있습니다."); + INCORRECT_RETRY("R 또는 Q만 입력할 수 있습니다."), + NOT_INTEGER("숫자만 입력할 수 있습니다."); private static final String PREFIX = "[ERROR] "; private final String message; diff --git a/src/main/java/bridge/validator/InputValidator.java b/src/main/java/bridge/validator/InputValidator.java index 4b06fec7d4c..c40e69d0764 100644 --- a/src/main/java/bridge/validator/InputValidator.java +++ b/src/main/java/bridge/validator/InputValidator.java @@ -3,6 +3,8 @@ import bridge.constant.BridgeDirection; import bridge.constant.ExceptionMessage; +import java.util.regex.Pattern; + public class InputValidator { public void validateMoving(String input) { @@ -10,4 +12,12 @@ public void validateMoving(String input) { throw new IllegalArgumentException(ExceptionMessage.INCORRECT_MOVING.toString()); } } + + public void validateIsNumber(String input) { + String NUMBER_REGEXP = "^\\d*$"; + if (!Pattern.matches(NUMBER_REGEXP, input)) { + ExceptionMessage exceptionMessage = ExceptionMessage.NOT_INTEGER; + throw new IllegalArgumentException(exceptionMessage.toString()); + } + } } diff --git a/src/main/java/bridge/view/InputView.java b/src/main/java/bridge/view/InputView.java index 7d9afea398b..c0f5fda28d0 100644 --- a/src/main/java/bridge/view/InputView.java +++ b/src/main/java/bridge/view/InputView.java @@ -15,8 +15,9 @@ public class InputView { * 다리의 길이를 입력받는다. */ public int readBridgeSize() { - String userInput = Console.readLine(); - return Integer.parseInt(userInput); + String input = Console.readLine(); + inputValidator.validateIsNumber(input); + return Integer.parseInt(input); } /** From b6ad11a618ac714a586352285975a6ebbdb9ee0b Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=EA=B9=80=EC=97=B0=EC=A7=84?= Date: Tue, 22 Aug 2023 05:26:00 +0900 Subject: [PATCH 26/44] =?UTF-8?q?feat(BridgeSize):=20=EB=B2=94=EC=9C=84=20?= =?UTF-8?q?=EC=9D=B4=EC=99=B8=EC=9D=98=20=EC=88=AB=EC=9E=90=EA=B0=80=20?= =?UTF-8?q?=EB=93=A4=EC=96=B4=EC=98=A8=20=EA=B2=BD=EC=9A=B0=20=EC=98=88?= =?UTF-8?q?=EC=99=B8=20=EB=B0=9C=EC=83=9D?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../bridge/constant/ExceptionMessage.java | 3 ++- src/main/java/bridge/constant/GameStatus.java | 8 +++--- .../bridge/controller/BridgeController.java | 18 ++++++++----- src/main/java/bridge/domain/BridgeSize.java | 27 +++++++++++++++++++ src/main/java/bridge/domain/GameRecorder.java | 4 +-- src/main/java/bridge/service/BridgeGame.java | 3 ++- 6 files changed, 49 insertions(+), 14 deletions(-) create mode 100644 src/main/java/bridge/domain/BridgeSize.java diff --git a/src/main/java/bridge/constant/ExceptionMessage.java b/src/main/java/bridge/constant/ExceptionMessage.java index e7ff859f9cd..86b8174ca15 100644 --- a/src/main/java/bridge/constant/ExceptionMessage.java +++ b/src/main/java/bridge/constant/ExceptionMessage.java @@ -6,7 +6,8 @@ public enum ExceptionMessage { MOVING_RESULT_NONE("해당 방향으로 움직일 수 없습니다."), INCORRECT_MOVING("U 또는 D로만 이동할 수 있습니다."), INCORRECT_RETRY("R 또는 Q만 입력할 수 있습니다."), - NOT_INTEGER("숫자만 입력할 수 있습니다."); + NOT_INTEGER("숫자만 입력할 수 있습니다."), + INCORRECT_RANGE("다리 길이는 3부터 20 사이의 숫자여야 합니다."),; private static final String PREFIX = "[ERROR] "; private final String message; diff --git a/src/main/java/bridge/constant/GameStatus.java b/src/main/java/bridge/constant/GameStatus.java index 614ff163ba1..8ba108f9960 100644 --- a/src/main/java/bridge/constant/GameStatus.java +++ b/src/main/java/bridge/constant/GameStatus.java @@ -1,5 +1,7 @@ package bridge.constant; +import bridge.domain.BridgeSize; + public enum GameStatus { PROGRESS, @@ -15,15 +17,15 @@ public static GameStatus checkStatus(RetryCommand command) { return GameStatus.RESTART; } - public static GameStatus checkStatus(boolean canMoving, int bridgeSize, int position) { + public static GameStatus checkStatus(boolean canMoving, BridgeSize bridgeSize, int position) { if (!canMoving) { return GameStatus.MOVING_FAILED; } return checkGameStatus(bridgeSize, position); } - private static GameStatus checkGameStatus(int bridgeSize, int position) { - if (bridgeSize == position) { + private static GameStatus checkGameStatus(BridgeSize bridgeSize, int position) { + if (bridgeSize.isSame(position)) { return GameStatus.GAME_SUCCESS; } return GameStatus.PROGRESS; diff --git a/src/main/java/bridge/controller/BridgeController.java b/src/main/java/bridge/controller/BridgeController.java index 1f8489401dc..0cf11a7294a 100644 --- a/src/main/java/bridge/controller/BridgeController.java +++ b/src/main/java/bridge/controller/BridgeController.java @@ -12,15 +12,19 @@ public class BridgeController { private BridgeGame bridgeGame; public void start() { - bridgeGame = startGame(); - while (bridgeGame.isNotEnd()) { - progress(); - if (bridgeGame.isFailed()) { - outputView.printRetryMessage(); - bridgeGame.retry(inputView.readGameCommand()); + try { + bridgeGame = startGame(); + while (bridgeGame.isNotEnd()) { + progress(); + if (bridgeGame.isFailed()) { + outputView.printRetryMessage(); + bridgeGame.retry(inputView.readGameCommand()); + } } + outputView.printResult(bridgeGame.getBridgeMaps(), bridgeGame.getGameRecorder()); + } catch (IllegalArgumentException e) { + System.out.println(e.getMessage()); } - outputView.printResult(bridgeGame.getBridgeMaps(), bridgeGame.getGameRecorder()); } private BridgeGame startGame() { diff --git a/src/main/java/bridge/domain/BridgeSize.java b/src/main/java/bridge/domain/BridgeSize.java new file mode 100644 index 00000000000..6935f45ded9 --- /dev/null +++ b/src/main/java/bridge/domain/BridgeSize.java @@ -0,0 +1,27 @@ +package bridge.domain; + +import bridge.constant.ExceptionMessage; + +public class BridgeSize { + + private static final int MIN_SIZE = 3; + private static final int MAX_SIZE = 20; + + private final int bridgeSize; + + public BridgeSize(int bridgeSize) { + validateIsCorrectRange(bridgeSize); + this.bridgeSize = bridgeSize; + } + + private void validateIsCorrectRange(int bridgeSize) { + if (!(MIN_SIZE <= bridgeSize && bridgeSize <= MAX_SIZE)) { + ExceptionMessage exceptionMessage = ExceptionMessage.INCORRECT_RANGE; + throw new IllegalArgumentException(exceptionMessage.toString()); + } + } + + public boolean isSame(int size) { + return bridgeSize == size; + } +} diff --git a/src/main/java/bridge/domain/GameRecorder.java b/src/main/java/bridge/domain/GameRecorder.java index 51dc076f167..f0c4fad6132 100644 --- a/src/main/java/bridge/domain/GameRecorder.java +++ b/src/main/java/bridge/domain/GameRecorder.java @@ -6,13 +6,13 @@ public class GameRecorder { - private final int bridgeSize; + private final BridgeSize bridgeSize; private int position = 0; private int retryCount = 1; private GameStatus gameStatus; - public GameRecorder(int bridgeSize) { + public GameRecorder(BridgeSize bridgeSize) { this.bridgeSize = bridgeSize; this.gameStatus = GameStatus.PROGRESS; } diff --git a/src/main/java/bridge/service/BridgeGame.java b/src/main/java/bridge/service/BridgeGame.java index 518614fdd20..74e9c85a572 100644 --- a/src/main/java/bridge/service/BridgeGame.java +++ b/src/main/java/bridge/service/BridgeGame.java @@ -5,6 +5,7 @@ import bridge.constant.RetryCommand; import bridge.domain.Bridge; import bridge.domain.BridgeMaps; +import bridge.domain.BridgeSize; import bridge.domain.GameRecorder; @@ -20,7 +21,7 @@ public class BridgeGame { public BridgeGame(int size) { BridgeMaker bridgeMaker = new BridgeMaker(new BridgeRandomNumberGenerator()); this.bridge = new Bridge(bridgeMaker.makeBridge(size)); - gameRecorder = new GameRecorder(size); + gameRecorder = new GameRecorder(new BridgeSize(size)); System.out.println(bridge.getBridge()); } From d8b1a014e1e303742c63070c48e182dc352139a4 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=EA=B9=80=EC=97=B0=EC=A7=84?= Date: Tue, 22 Aug 2023 05:33:02 +0900 Subject: [PATCH 27/44] =?UTF-8?q?refactor(BridgeController):=20=EB=A9=94?= =?UTF-8?q?=EC=84=9C=EB=93=9C=20=EB=B6=84=EB=A6=AC?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- docs/README.md | 26 ++++++++++++++++++- .../bridge/controller/BridgeController.java | 22 +++++++++++----- 2 files changed, 40 insertions(+), 8 deletions(-) diff --git a/docs/README.md b/docs/README.md index b54dafd45d2..93a575aeafa 100644 --- a/docs/README.md +++ b/docs/README.md @@ -35,4 +35,28 @@ - [x] R/Q 이외의 입력이 들어올 경우 - 다리 길이 입력 - [x] 숫자가 아닌 입력이 들어온 경우 - - [ ] 범위 이외의 숫자가 들어온 경우 \ No newline at end of file + - [x] 범위 이외의 숫자가 들어온 경우 + +### 테스트 목록 + +**BridgeMaker** +- [ ] 다리 길이 입력시 길이에 맞는 다리를 생성하는가 + +**InputValidator** +- [ ] 움직임 입력 시 U/D 이외의 문자를 입력하면 예외가 발생하는가 +- [ ] 다리 길이를 입력할 경우 문자를 입력하면 예외가 발생하는가 + + +**RetryCommand** +- [ ] 재시작 입력 시 R/Q 이외의 문자를 입력하면 예외가 발생하는가 + +**BridgeSize** +- [ ] 다리 길이를 입력할 경우 3~20 이외의 숫자를 입력하면 예외가 발생하는가 + +**BridgeDirection** +- [ ] 0 = D, 1 = U로 변환을 하는가 + +**BridgeGame** +- [ ] 게임 진행 시 사용자가 입력한 내용과 다리의 내용이 일치하는지 확인 +- [ ] 게임 재시작 시 재시작 카운트 증가 +- [ ] 게임 재시작 시 사용자 위치, 다리 건넌 기록 초기화 \ No newline at end of file diff --git a/src/main/java/bridge/controller/BridgeController.java b/src/main/java/bridge/controller/BridgeController.java index 0cf11a7294a..bcc6d1d4ca9 100644 --- a/src/main/java/bridge/controller/BridgeController.java +++ b/src/main/java/bridge/controller/BridgeController.java @@ -14,13 +14,7 @@ public class BridgeController { public void start() { try { bridgeGame = startGame(); - while (bridgeGame.isNotEnd()) { - progress(); - if (bridgeGame.isFailed()) { - outputView.printRetryMessage(); - bridgeGame.retry(inputView.readGameCommand()); - } - } + playGame(); outputView.printResult(bridgeGame.getBridgeMaps(), bridgeGame.getGameRecorder()); } catch (IllegalArgumentException e) { System.out.println(e.getMessage()); @@ -33,6 +27,13 @@ private BridgeGame startGame() { return new BridgeGame(inputView.readBridgeSize()); } + private void playGame() { + while (bridgeGame.isNotEnd()) { + progress(); + handleFailed(); + } + } + private void progress() { while (bridgeGame.isProgress()) { outputView.printMovingDirectionMessage(); @@ -40,4 +41,11 @@ private void progress() { outputView.printMap(bridgeGame.getBridgeMaps()); } } + + private void handleFailed() { + if (bridgeGame.isFailed()) { + outputView.printRetryMessage(); + bridgeGame.retry(inputView.readGameCommand()); + } + } } \ No newline at end of file From 20b2400773e1793ff5b16efc91804e5f625c40a2 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=EA=B9=80=EC=97=B0=EC=A7=84?= Date: Tue, 22 Aug 2023 05:37:12 +0900 Subject: [PATCH 28/44] =?UTF-8?q?feat(OutputView):=20=EB=B9=88=20=EC=A4=84?= =?UTF-8?q?=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/view/InputView.java | 1 + src/main/java/bridge/view/OutputView.java | 8 +++++++- 2 files changed, 8 insertions(+), 1 deletion(-) diff --git a/src/main/java/bridge/view/InputView.java b/src/main/java/bridge/view/InputView.java index c0f5fda28d0..1a824fe7433 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 int readBridgeSize() { String input = Console.readLine(); + System.out.println(); inputValidator.validateIsNumber(input); return Integer.parseInt(input); } diff --git a/src/main/java/bridge/view/OutputView.java b/src/main/java/bridge/view/OutputView.java index 7bc52658ccc..95e866a1af4 100644 --- a/src/main/java/bridge/view/OutputView.java +++ b/src/main/java/bridge/view/OutputView.java @@ -16,6 +16,7 @@ public class OutputView { */ public void printMap(BridgeMaps bridgeMaps) { System.out.println(bridgeMaps.toString()); + printEmpty(); } /** @@ -25,13 +26,14 @@ public void printMap(BridgeMaps bridgeMaps) { */ public void printResult(BridgeMaps bridgeMaps, GameRecorder gameRecorder) { System.out.println(OutputMessage.GAME_END_MESSAGE); - printMap(bridgeMaps); + System.out.println(bridgeMaps.toString()); System.out.printf((OutputMessage.GAME_STATUS.toString()), gameRecorder.getGameClearMessage()); System.out.printf(OutputMessage.RETRY_NUMBERS.toString(), gameRecorder.getRetryCount()); } public void printGameStart() { System.out.println(OutputMessage.START_MESSAGE); + printEmpty(); } public void printLengthMessage() { @@ -45,4 +47,8 @@ public void printMovingDirectionMessage() { public void printRetryMessage() { System.out.println(OutputMessage.RETRY_MESSAGE); } + + public void printEmpty() { + System.out.println(); + } } From 641fb9dd284e88777dabca7416705495f4f3e04e Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=EA=B9=80=EC=97=B0=EC=A7=84?= Date: Tue, 22 Aug 2023 06:02:02 +0900 Subject: [PATCH 29/44] =?UTF-8?q?feat(InputView):=20=EC=98=A4=EB=A5=98=20?= =?UTF-8?q?=EB=B0=9C=EC=83=9D=20=EC=8B=9C=20=EB=B0=9C=EC=83=9D=20=EC=A7=80?= =?UTF-8?q?=EC=A0=90=EB=B6=80=ED=84=B0=20=EC=9E=AC=EC=8B=9C=EC=9E=91?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- src/main/java/bridge/view/InputView.java | 39 ++++++++++++++++++------ 1 file changed, 30 insertions(+), 9 deletions(-) diff --git a/src/main/java/bridge/view/InputView.java b/src/main/java/bridge/view/InputView.java index 1a824fe7433..a2508e81208 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.constant.RetryCommand; +import bridge.domain.BridgeSize; import bridge.validator.InputValidator; import camp.nextstep.edu.missionutils.Console; @@ -14,26 +15,46 @@ public class InputView { /** * 다리의 길이를 입력받는다. */ - public int readBridgeSize() { - String input = Console.readLine(); - System.out.println(); - inputValidator.validateIsNumber(input); - return Integer.parseInt(input); + public BridgeSize readBridgeSize() { + try { + String input = Console.readLine(); + System.out.println(); + inputValidator.validateIsNumber(input); + return new BridgeSize(Integer.parseInt(input)); + } catch (IllegalArgumentException exception) { + printExceptionMessage(exception.getMessage()); + return readBridgeSize(); + } } /** * 사용자가 이동할 칸을 입력받는다. */ public String readMoving() { - String input = Console.readLine(); - inputValidator.validateMoving(input); - return input; + try { + String input = Console.readLine(); + inputValidator.validateMoving(input); + return input; + } catch (IllegalArgumentException exception) { + printExceptionMessage(exception.getMessage()); + return readMoving(); + } } /** * 사용자가 게임을 다시 시도할지 종료할지 여부를 입력받는다. */ public RetryCommand readGameCommand() { - return RetryCommand.getCommand(Console.readLine()); + try { + return RetryCommand.getCommand(Console.readLine()); + } catch (IllegalArgumentException exception) { + printExceptionMessage(exception.getMessage()); + return readGameCommand(); + } + + } + + private void printExceptionMessage(String message) { + System.out.println(message); } } From 9b8e181e223fd62fb25b57b1ce3d321120828567 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=EA=B9=80=EC=97=B0=EC=A7=84?= Date: Tue, 22 Aug 2023 07:38:49 +0900 Subject: [PATCH 30/44] =?UTF-8?q?refactor(BridgeSize):=20BridgeSize=20?= =?UTF-8?q?=EC=98=A4=EB=A5=98=20=EB=B0=9C=EC=83=9D=EC=8B=9C=20=EC=9E=AC?= =?UTF-8?q?=EC=8B=9C=EC=9E=91?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../java/bridge/controller/BridgeController.java | 12 ++++-------- src/main/java/bridge/domain/BridgeSize.java | 4 ++++ src/main/java/bridge/service/BridgeGame.java | 6 +++--- src/main/java/bridge/view/InputView.java | 16 +++++++--------- src/main/java/bridge/view/OutputView.java | 5 +++++ 5 files changed, 23 insertions(+), 20 deletions(-) diff --git a/src/main/java/bridge/controller/BridgeController.java b/src/main/java/bridge/controller/BridgeController.java index bcc6d1d4ca9..1c6556cea68 100644 --- a/src/main/java/bridge/controller/BridgeController.java +++ b/src/main/java/bridge/controller/BridgeController.java @@ -1,5 +1,6 @@ package bridge.controller; +import bridge.domain.BridgeSize; import bridge.service.BridgeGame; import bridge.view.InputView; import bridge.view.OutputView; @@ -12,19 +13,16 @@ public class BridgeController { private BridgeGame bridgeGame; public void start() { - try { bridgeGame = startGame(); playGame(); outputView.printResult(bridgeGame.getBridgeMaps(), bridgeGame.getGameRecorder()); - } catch (IllegalArgumentException e) { - System.out.println(e.getMessage()); - } } private BridgeGame startGame() { outputView.printGameStart(); - outputView.printLengthMessage(); - return new BridgeGame(inputView.readBridgeSize()); + BridgeSize bridgeSize = inputView.readBridgeSize(); + outputView.printEmpty(); + return new BridgeGame(bridgeSize); } private void playGame() { @@ -36,7 +34,6 @@ private void playGame() { private void progress() { while (bridgeGame.isProgress()) { - outputView.printMovingDirectionMessage(); bridgeGame.move(inputView.readMoving()); outputView.printMap(bridgeGame.getBridgeMaps()); } @@ -44,7 +41,6 @@ private void progress() { private void handleFailed() { if (bridgeGame.isFailed()) { - outputView.printRetryMessage(); bridgeGame.retry(inputView.readGameCommand()); } } diff --git a/src/main/java/bridge/domain/BridgeSize.java b/src/main/java/bridge/domain/BridgeSize.java index 6935f45ded9..26073f0ed4d 100644 --- a/src/main/java/bridge/domain/BridgeSize.java +++ b/src/main/java/bridge/domain/BridgeSize.java @@ -24,4 +24,8 @@ private void validateIsCorrectRange(int bridgeSize) { public boolean isSame(int size) { return bridgeSize == size; } + + public int getBridgeSize() { + return bridgeSize; + } } diff --git a/src/main/java/bridge/service/BridgeGame.java b/src/main/java/bridge/service/BridgeGame.java index 74e9c85a572..b81c7bfc91e 100644 --- a/src/main/java/bridge/service/BridgeGame.java +++ b/src/main/java/bridge/service/BridgeGame.java @@ -18,10 +18,10 @@ public class BridgeGame { private final GameRecorder gameRecorder; private final BridgeMaps bridgeMaps = new BridgeMaps(); - public BridgeGame(int size) { + public BridgeGame(BridgeSize bridgeSize) { BridgeMaker bridgeMaker = new BridgeMaker(new BridgeRandomNumberGenerator()); - this.bridge = new Bridge(bridgeMaker.makeBridge(size)); - gameRecorder = new GameRecorder(new BridgeSize(size)); + this.bridge = new Bridge(bridgeMaker.makeBridge(bridgeSize.getBridgeSize())); + gameRecorder = new GameRecorder(bridgeSize); System.out.println(bridge.getBridge()); } diff --git a/src/main/java/bridge/view/InputView.java b/src/main/java/bridge/view/InputView.java index a2508e81208..5747acaebc6 100644 --- a/src/main/java/bridge/view/InputView.java +++ b/src/main/java/bridge/view/InputView.java @@ -11,18 +11,19 @@ public class InputView { private static final InputValidator inputValidator = new InputValidator(); + private static final OutputView outputView = new OutputView(); /** * 다리의 길이를 입력받는다. */ public BridgeSize readBridgeSize() { try { + outputView.printLengthMessage(); String input = Console.readLine(); - System.out.println(); inputValidator.validateIsNumber(input); return new BridgeSize(Integer.parseInt(input)); } catch (IllegalArgumentException exception) { - printExceptionMessage(exception.getMessage()); + outputView.printExceptionMessage(exception.getMessage()); return readBridgeSize(); } } @@ -32,11 +33,12 @@ public BridgeSize readBridgeSize() { */ public String readMoving() { try { + outputView.printMovingDirectionMessage(); String input = Console.readLine(); inputValidator.validateMoving(input); return input; } catch (IllegalArgumentException exception) { - printExceptionMessage(exception.getMessage()); + outputView.printExceptionMessage(exception.getMessage()); return readMoving(); } } @@ -46,15 +48,11 @@ public String readMoving() { */ public RetryCommand readGameCommand() { try { + outputView.printRetryMessage(); return RetryCommand.getCommand(Console.readLine()); } catch (IllegalArgumentException exception) { - printExceptionMessage(exception.getMessage()); + outputView.printExceptionMessage(exception.getMessage()); return readGameCommand(); } - - } - - private void printExceptionMessage(String message) { - System.out.println(message); } } diff --git a/src/main/java/bridge/view/OutputView.java b/src/main/java/bridge/view/OutputView.java index 95e866a1af4..1744060d6a1 100644 --- a/src/main/java/bridge/view/OutputView.java +++ b/src/main/java/bridge/view/OutputView.java @@ -51,4 +51,9 @@ public void printRetryMessage() { public void printEmpty() { System.out.println(); } + + public void printExceptionMessage(String message) { + System.out.println(message); + printEmpty(); + } } From f66d39760812cd4b8548a0d42de4f48793818c68 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=EA=B9=80=EC=97=B0=EC=A7=84?= Date: Tue, 22 Aug 2023 15:55:37 +0900 Subject: [PATCH 31/44] =?UTF-8?q?test(BridgeDirection):=20=EB=B0=A9?= =?UTF-8?q?=ED=96=A5=20=EB=B3=80=ED=99=98=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 --- .../bridge/model/BridgeDirectionTest.java | 27 +++++++++++++++++++ 1 file changed, 27 insertions(+) create mode 100644 src/test/java/bridge/model/BridgeDirectionTest.java diff --git a/src/test/java/bridge/model/BridgeDirectionTest.java b/src/test/java/bridge/model/BridgeDirectionTest.java new file mode 100644 index 00000000000..1ec44ae0fbf --- /dev/null +++ b/src/test/java/bridge/model/BridgeDirectionTest.java @@ -0,0 +1,27 @@ +package bridge.model; + +import bridge.constant.BridgeDirection; +import org.junit.jupiter.api.Test; + +import static org.assertj.core.api.Assertions.assertThat; + +public class BridgeDirectionTest { + + @Test + void convertDOWN() { + int value = 0; + + BridgeDirection direction = BridgeDirection.convertDirection(value); + + assertThat(direction.getDirection()).isEqualTo("D"); + } + + @Test + void convertUP() { + int value = 1; + + BridgeDirection direction = BridgeDirection.convertDirection(value); + + assertThat(direction.getDirection()).isEqualTo("U"); + } +} From fb5bc02210f5591db504fba32a32ad6b187a8920 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=EA=B9=80=EC=97=B0=EC=A7=84?= Date: Tue, 22 Aug 2023 16:05:41 +0900 Subject: [PATCH 32/44] =?UTF-8?q?test(RetryCommand):=20=EC=9E=AC=EC=8B=9C?= =?UTF-8?q?=EB=8F=84=20enum=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 --- .../java/bridge/model/RetryCommandTest.java | 57 +++++++++++++++++++ 1 file changed, 57 insertions(+) create mode 100644 src/test/java/bridge/model/RetryCommandTest.java diff --git a/src/test/java/bridge/model/RetryCommandTest.java b/src/test/java/bridge/model/RetryCommandTest.java new file mode 100644 index 00000000000..2b3419d153a --- /dev/null +++ b/src/test/java/bridge/model/RetryCommandTest.java @@ -0,0 +1,57 @@ +package bridge.model; + +import bridge.constant.RetryCommand; +import org.junit.jupiter.api.Test; + +import static org.assertj.core.api.Assertions.assertThat; +import static org.assertj.core.api.Assertions.assertThatThrownBy; + +public class RetryCommandTest { + + String ERROR_MESSAGE = "[ERROR]"; + + @Test + void getRetryCommand() { + String command = "R"; + + RetryCommand retryCommand = RetryCommand.getCommand(command); + + assertThat(retryCommand).isEqualTo(RetryCommand.RETRY); + } + + @Test + void getQuitCommand() { + String command = "Q"; + + RetryCommand retryCommand = RetryCommand.getCommand(command); + + assertThat(retryCommand).isEqualTo(RetryCommand.QUIT); + } + + @Test + void retryCommandException() { + String command = "A"; + + assertThatThrownBy(() -> RetryCommand.getCommand(command)) + .isInstanceOf(IllegalArgumentException.class) + .hasMessageContaining(ERROR_MESSAGE); + } + + @Test + void isRetryCommand() { + RetryCommand retryCommand = RetryCommand.getCommand("R"); + + boolean isRetry = retryCommand.isRetry(); + + assertThat(isRetry).isTrue(); + } + + @Test + void isNotRetryCommand() { + RetryCommand retryCommand = RetryCommand.getCommand("Q"); + + boolean isRetry = retryCommand.isRetry(); + + assertThat(isRetry).isFalse(); + } +} From c27f170dfdd4e6aee0fa1e7bfcd69a98f699c170 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=EA=B9=80=EC=97=B0=EC=A7=84?= Date: Tue, 22 Aug 2023 16:09:05 +0900 Subject: [PATCH 33/44] =?UTF-8?q?test(InputValidator):=20=EC=98=88?= =?UTF-8?q?=EC=99=B8=20=EB=B0=9C=EC=83=9D=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 --- .../java/bridge/model/InputValidatorTest.java | 30 +++++++++++++++++++ 1 file changed, 30 insertions(+) create mode 100644 src/test/java/bridge/model/InputValidatorTest.java diff --git a/src/test/java/bridge/model/InputValidatorTest.java b/src/test/java/bridge/model/InputValidatorTest.java new file mode 100644 index 00000000000..2ab99c04764 --- /dev/null +++ b/src/test/java/bridge/model/InputValidatorTest.java @@ -0,0 +1,30 @@ +package bridge.model; + +import bridge.validator.InputValidator; +import org.junit.jupiter.api.Test; + +import static org.assertj.core.api.Assertions.assertThatThrownBy; + +public class InputValidatorTest { + + String ERROR_MESSAGE = "[ERROR]"; + InputValidator inputValidator = new InputValidator(); + + @Test + void movingCommandException() { + String command = "A"; + + assertThatThrownBy(() -> inputValidator.validateMoving(command)) + .isInstanceOf(IllegalArgumentException.class) + .hasMessageContaining(ERROR_MESSAGE); + } + + @Test + void bridgeLengthException() { + String command = "A"; + + assertThatThrownBy(() -> inputValidator.validateIsNumber(command)) + .isInstanceOf(IllegalArgumentException.class) + .hasMessageContaining(ERROR_MESSAGE); + } +} From a8f346a05e8300a1112a7d716017eab9dc8230c4 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=EA=B9=80=EC=97=B0=EC=A7=84?= Date: Tue, 22 Aug 2023 16:12:53 +0900 Subject: [PATCH 34/44] =?UTF-8?q?docs:=20=ED=85=8C=EC=8A=A4=ED=8A=B8=20?= =?UTF-8?q?=EB=AA=A9=EB=A1=9D=20=EC=B6=94=EA=B0=80?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- docs/README.md | 9 +++++---- 1 file changed, 5 insertions(+), 4 deletions(-) diff --git a/docs/README.md b/docs/README.md index 93a575aeafa..32cc867e705 100644 --- a/docs/README.md +++ b/docs/README.md @@ -43,18 +43,19 @@ - [ ] 다리 길이 입력시 길이에 맞는 다리를 생성하는가 **InputValidator** -- [ ] 움직임 입력 시 U/D 이외의 문자를 입력하면 예외가 발생하는가 -- [ ] 다리 길이를 입력할 경우 문자를 입력하면 예외가 발생하는가 +- [x] 움직임 입력 시 U/D 이외의 문자를 입력하면 예외가 발생하는가 +- [x] 다리 길이를 입력할 경우 문자를 입력하면 예외가 발생하는가 **RetryCommand** -- [ ] 재시작 입력 시 R/Q 이외의 문자를 입력하면 예외가 발생하는가 +- [x] R, Q를 입력할 경우 올바른 상수를 가져오는가 +- [x] 재시작 입력 시 R/Q 이외의 문자를 입력하면 예외가 발생하는가 **BridgeSize** - [ ] 다리 길이를 입력할 경우 3~20 이외의 숫자를 입력하면 예외가 발생하는가 **BridgeDirection** -- [ ] 0 = D, 1 = U로 변환을 하는가 +- [x] 0 = D, 1 = U로 변환을 하는가 **BridgeGame** - [ ] 게임 진행 시 사용자가 입력한 내용과 다리의 내용이 일치하는지 확인 From 9a424d0e0391a314e746795df6a7811dffc13e3d Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=EA=B9=80=EC=97=B0=EC=A7=84?= Date: Tue, 22 Aug 2023 16:21:45 +0900 Subject: [PATCH 35/44] =?UTF-8?q?test(GameStatusMessage):=20=EA=B2=8C?= =?UTF-8?q?=EC=9E=84=20=EC=A7=84=ED=96=89=20=EC=83=81=ED=99=A9=20=EA=B4=80?= =?UTF-8?q?=EB=A6=AC=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 --- .../bridge/model/GameStatusMessageTest.java | 47 +++++++++++++++++++ 1 file changed, 47 insertions(+) create mode 100644 src/test/java/bridge/model/GameStatusMessageTest.java diff --git a/src/test/java/bridge/model/GameStatusMessageTest.java b/src/test/java/bridge/model/GameStatusMessageTest.java new file mode 100644 index 00000000000..a4c524c9dc0 --- /dev/null +++ b/src/test/java/bridge/model/GameStatusMessageTest.java @@ -0,0 +1,47 @@ +package bridge.model; + +import bridge.constant.GameStatus; +import bridge.constant.RetryCommand; +import bridge.domain.Bridge; +import bridge.domain.BridgeSize; +import org.junit.jupiter.api.Test; + +import java.util.List; + +import static org.assertj.core.api.Assertions.assertThat; + +public class GameStatusMessageTest { + + @Test + void checkRetryStatus() { + RetryCommand retryCommand = RetryCommand.QUIT; + + GameStatus gameStatus = GameStatus.checkStatus(retryCommand); + + assertThat(gameStatus).isEqualTo(GameStatus.GAME_QUIT); + } + + @Test + void checkClearStatus() { + int position = 3; + BridgeSize bridgeSize = new BridgeSize(3); + Bridge bridge = new Bridge(List.of("U", "U", "D")); + boolean isCorrect = bridge.isCorrectMoving("D", 2); + + GameStatus gameStatus = GameStatus.checkStatus(isCorrect, bridgeSize, position); + + assertThat(gameStatus).isEqualTo(GameStatus.GAME_SUCCESS); + } + + @Test + void checkMovingFailedStatus() { + int position = 3; + BridgeSize bridgeSize = new BridgeSize(3); + Bridge bridge = new Bridge(List.of("U", "U", "D")); + boolean isCorrect = bridge.isCorrectMoving("U", 2); + + GameStatus gameStatus = GameStatus.checkStatus(isCorrect, bridgeSize, position); + + assertThat(gameStatus).isEqualTo(GameStatus.MOVING_FAILED); + } +} From e2a72314004dd2fe2f276926840e7de499aa073b Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=EA=B9=80=EC=97=B0=EC=A7=84?= Date: Tue, 22 Aug 2023 16:29:57 +0900 Subject: [PATCH 36/44] =?UTF-8?q?test(Bridge):=20=EC=A3=BC=EC=96=B4?= =?UTF-8?q?=EC=A7=84=20=EB=B0=A9=ED=96=A5=EC=9C=BC=EB=A1=9C=20=EB=8B=A4?= =?UTF-8?q?=EB=A6=AC=EB=A5=BC=20=EA=B1=B4=EB=84=88=EA=B0=88=20=EC=88=98=20?= =?UTF-8?q?=EC=9E=88=EB=8A=94=EC=A7=80=20=ED=99=95=EC=9D=B8?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- docs/README.md | 5 ++++- src/test/java/bridge/model/BridgeTest.java | 22 ++++++++++++++++++++++ 2 files changed, 26 insertions(+), 1 deletion(-) create mode 100644 src/test/java/bridge/model/BridgeTest.java diff --git a/docs/README.md b/docs/README.md index 32cc867e705..418cbf54386 100644 --- a/docs/README.md +++ b/docs/README.md @@ -60,4 +60,7 @@ **BridgeGame** - [ ] 게임 진행 시 사용자가 입력한 내용과 다리의 내용이 일치하는지 확인 - [ ] 게임 재시작 시 재시작 카운트 증가 -- [ ] 게임 재시작 시 사용자 위치, 다리 건넌 기록 초기화 \ No newline at end of file +- [ ] 게임 재시작 시 사용자 위치, 다리 건넌 기록 초기화 + +**Bridge** +- [x] 해당 방향으로 다리를 건너갈 수 있는지 확인 \ No newline at end of file diff --git a/src/test/java/bridge/model/BridgeTest.java b/src/test/java/bridge/model/BridgeTest.java new file mode 100644 index 00000000000..e9b4908d9cd --- /dev/null +++ b/src/test/java/bridge/model/BridgeTest.java @@ -0,0 +1,22 @@ +package bridge.model; + +import bridge.domain.Bridge; +import org.junit.jupiter.api.Test; + +import java.util.List; + +import static org.assertj.core.api.Assertions.assertThat; + +public class BridgeTest { + + @Test + void isCorrectMoving() { + Bridge bridge = new Bridge(List.of("U", "U", "U")); + int position = 2; + String direction = "U"; + + boolean isCorrect = bridge.isCorrectMoving(direction, position); + + assertThat(isCorrect).isTrue(); + } +} From 05d0b3010b8387a6ea5c875bab2b0b2afdb13b08 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=EA=B9=80=EC=97=B0=EC=A7=84?= Date: Tue, 22 Aug 2023 16:32:17 +0900 Subject: [PATCH 37/44] =?UTF-8?q?test(BridgeMaker):=20=EB=8B=A4=EB=A6=AC?= =?UTF-8?q?=20=EC=83=9D=EC=84=B1=20=EA=B8=B0=EB=8A=A5=20=ED=85=8C=EC=8A=A4?= =?UTF-8?q?=ED=8A=B8?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- docs/README.md | 2 +- .../java/bridge/model/BridgeMakerTest.java | 35 +++++++++++++++++++ 2 files changed, 36 insertions(+), 1 deletion(-) create mode 100644 src/test/java/bridge/model/BridgeMakerTest.java diff --git a/docs/README.md b/docs/README.md index 418cbf54386..06bca26b2de 100644 --- a/docs/README.md +++ b/docs/README.md @@ -40,7 +40,7 @@ ### 테스트 목록 **BridgeMaker** -- [ ] 다리 길이 입력시 길이에 맞는 다리를 생성하는가 +- [x] 다리 길이 입력시 길이에 맞는 다리를 생성하는가 **InputValidator** - [x] 움직임 입력 시 U/D 이외의 문자를 입력하면 예외가 발생하는가 diff --git a/src/test/java/bridge/model/BridgeMakerTest.java b/src/test/java/bridge/model/BridgeMakerTest.java new file mode 100644 index 00000000000..8e0cf517d3a --- /dev/null +++ b/src/test/java/bridge/model/BridgeMakerTest.java @@ -0,0 +1,35 @@ +package bridge.model; + +import bridge.BridgeMaker; +import bridge.BridgeNumberGenerator; +import org.junit.jupiter.api.Test; + +import java.util.List; + +import static org.assertj.core.api.Assertions.assertThat; +import static org.assertj.core.util.Lists.newArrayList; + +public class BridgeMakerTest { + + @Test + void createBridge() { + BridgeNumberGenerator numberGenerator = new BridgeMakerTest.TestNumberGenerator(newArrayList(1, 0, 0)); + BridgeMaker bridgeMaker = new BridgeMaker(numberGenerator); + List bridge = bridgeMaker.makeBridge(3); + assertThat(bridge).containsExactly("U", "D", "D"); + } + + static class TestNumberGenerator implements BridgeNumberGenerator { + + private final List numbers; + + TestNumberGenerator(List numbers) { + this.numbers = numbers; + } + + @Override + public int generate() { + return numbers.remove(0); + } + } +} From c6a039634bc483a404fa3346b4c0ad42c268cdc8 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=EA=B9=80=EC=97=B0=EC=A7=84?= Date: Tue, 22 Aug 2023 16:34:47 +0900 Subject: [PATCH 38/44] =?UTF-8?q?test(BridgeSize):=20=EB=B2=94=EC=9C=84=20?= =?UTF-8?q?=EC=9D=B4=EC=99=B8=EC=9D=98=20=EA=B8=B8=EC=9D=B4=EA=B0=80=20?= =?UTF-8?q?=EC=9E=85=EB=A0=A5=EB=90=A0=20=EA=B2=BD=EC=9A=B0=20=EC=98=88?= =?UTF-8?q?=EC=99=B8=20=EB=B0=9C=EC=83=9D?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- docs/README.md | 2 +- .../java/bridge/model/BridgeSizeTest.java | 20 +++++++++++++++++++ 2 files changed, 21 insertions(+), 1 deletion(-) create mode 100644 src/test/java/bridge/model/BridgeSizeTest.java diff --git a/docs/README.md b/docs/README.md index 06bca26b2de..777dc1d0be8 100644 --- a/docs/README.md +++ b/docs/README.md @@ -52,7 +52,7 @@ - [x] 재시작 입력 시 R/Q 이외의 문자를 입력하면 예외가 발생하는가 **BridgeSize** -- [ ] 다리 길이를 입력할 경우 3~20 이외의 숫자를 입력하면 예외가 발생하는가 +- [x] 다리 길이를 입력할 경우 3~20 이외의 숫자를 입력하면 예외가 발생하는가 **BridgeDirection** - [x] 0 = D, 1 = U로 변환을 하는가 diff --git a/src/test/java/bridge/model/BridgeSizeTest.java b/src/test/java/bridge/model/BridgeSizeTest.java new file mode 100644 index 00000000000..93081be868a --- /dev/null +++ b/src/test/java/bridge/model/BridgeSizeTest.java @@ -0,0 +1,20 @@ +package bridge.model; + +import bridge.domain.BridgeSize; +import org.junit.jupiter.api.Test; + +import static org.assertj.core.api.Assertions.assertThatThrownBy; + +public class BridgeSizeTest { + + String ERROR_MESSAGE = "[ERROR]"; + + @Test + void movingCommandException() { + int length = 21; + + assertThatThrownBy(() -> new BridgeSize(length)) + .isInstanceOf(IllegalArgumentException.class) + .hasMessageContaining(ERROR_MESSAGE); + } +} From a899ecb65823fdceecb91e32e1a39778358ade74 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=EA=B9=80=EC=97=B0=EC=A7=84?= Date: Tue, 22 Aug 2023 16:43:39 +0900 Subject: [PATCH 39/44] =?UTF-8?q?test(BridgeMaps):=20=EA=B2=8C=EC=9E=84=20?= =?UTF-8?q?=EC=A7=84=ED=96=89=20=EA=B8=B0=EB=A1=9D=20=ED=85=8C=EC=8A=A4?= =?UTF-8?q?=ED=8A=B8?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../java/bridge/model/BridgeMapsTest.java | 21 +++++++++++++++++++ 1 file changed, 21 insertions(+) create mode 100644 src/test/java/bridge/model/BridgeMapsTest.java diff --git a/src/test/java/bridge/model/BridgeMapsTest.java b/src/test/java/bridge/model/BridgeMapsTest.java new file mode 100644 index 00000000000..b624a90e571 --- /dev/null +++ b/src/test/java/bridge/model/BridgeMapsTest.java @@ -0,0 +1,21 @@ +package bridge.model; + +import bridge.domain.BridgeMaps; +import org.junit.jupiter.api.Test; + + +import static org.assertj.core.api.Assertions.assertThat; + +public class BridgeMapsTest { + + @Test + void addResult() { + String direction = "U"; + boolean isCorrect = true; + BridgeMaps bridgeMaps = new BridgeMaps(); + + bridgeMaps.addResult(direction, isCorrect); + + assertThat(bridgeMaps.toString()).contains("[ O ]", "[ ]"); + } +} From ca4655f81dafe07a4a1e254952d67f57e6c26e9c Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=EA=B9=80=EC=97=B0=EC=A7=84?= Date: Tue, 22 Aug 2023 17:17:22 +0900 Subject: [PATCH 40/44] =?UTF-8?q?test:=EC=9E=AC=EC=8B=9C=EC=9E=91=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/main/java/bridge/service/BridgeGame.java | 1 - src/test/java/bridge/ApplicationTest.java | 19 +++++++++++++++++++ 2 files changed, 19 insertions(+), 1 deletion(-) diff --git a/src/main/java/bridge/service/BridgeGame.java b/src/main/java/bridge/service/BridgeGame.java index b81c7bfc91e..13f9c731977 100644 --- a/src/main/java/bridge/service/BridgeGame.java +++ b/src/main/java/bridge/service/BridgeGame.java @@ -22,7 +22,6 @@ public BridgeGame(BridgeSize bridgeSize) { BridgeMaker bridgeMaker = new BridgeMaker(new BridgeRandomNumberGenerator()); this.bridge = new Bridge(bridgeMaker.makeBridge(bridgeSize.getBridgeSize())); gameRecorder = new GameRecorder(bridgeSize); - System.out.println(bridge.getBridge()); } /** diff --git a/src/test/java/bridge/ApplicationTest.java b/src/test/java/bridge/ApplicationTest.java index 1a163ec0a2a..5b965cd93b6 100644 --- a/src/test/java/bridge/ApplicationTest.java +++ b/src/test/java/bridge/ApplicationTest.java @@ -39,6 +39,25 @@ class ApplicationTest extends NsTest { }, 1, 0, 1); } + @Test + void 재시작_테스트() { + assertRandomNumberInRangeTest(() -> { + run("3", "U", "D", "D", "R", "U", "D", "U"); + assertThat(output()).contains( + "게임을 다시 시도할지 여부를 입력해주세요. (재시도: R, 종료: Q)", + "최종 게임 결과", + "[ O | | O ]", + "[ | O | ]", + "게임 성공 여부: 성공", + "총 시도한 횟수: 2" + ); + + int upSideIndex = output().indexOf("[ O | | O ]"); + int downSideIndex = output().indexOf("[ | O | ]"); + assertThat(upSideIndex).isLessThan(downSideIndex); + }, 1, 0, 1); + } + @Test void 예외_테스트() { assertSimpleTest(() -> { From 52353aef8a42c7a2588447354536892e18aba916 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=EA=B9=80=EC=97=B0=EC=A7=84?= Date: Tue, 22 Aug 2023 22:38:16 +0900 Subject: [PATCH 41/44] =?UTF-8?q?refactor:=20=EB=8B=A4=EB=A6=AC=20?= =?UTF-8?q?=EA=B8=B8=EC=9D=B4=20=EC=9E=85=EB=A0=A5=20=EB=A9=94=EC=84=9C?= =?UTF-8?q?=EB=93=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/controller/BridgeController.java | 1 - src/main/java/bridge/domain/BridgeMaps.java | 2 +- src/main/java/bridge/view/InputView.java | 10 ++++++++-- 3 files changed, 9 insertions(+), 4 deletions(-) diff --git a/src/main/java/bridge/controller/BridgeController.java b/src/main/java/bridge/controller/BridgeController.java index 1c6556cea68..63bdd09e130 100644 --- a/src/main/java/bridge/controller/BridgeController.java +++ b/src/main/java/bridge/controller/BridgeController.java @@ -21,7 +21,6 @@ public void start() { private BridgeGame startGame() { outputView.printGameStart(); BridgeSize bridgeSize = inputView.readBridgeSize(); - outputView.printEmpty(); return new BridgeGame(bridgeSize); } diff --git a/src/main/java/bridge/domain/BridgeMaps.java b/src/main/java/bridge/domain/BridgeMaps.java index 388439cafcd..2ac1e4ce814 100644 --- a/src/main/java/bridge/domain/BridgeMaps.java +++ b/src/main/java/bridge/domain/BridgeMaps.java @@ -11,7 +11,7 @@ public class BridgeMaps { - private final static String BLANK = " "; + private static final String BLANK = " "; private final List upper = new ArrayList<>(); private final List lower = new ArrayList<>(); diff --git a/src/main/java/bridge/view/InputView.java b/src/main/java/bridge/view/InputView.java index 5747acaebc6..405ffae972f 100644 --- a/src/main/java/bridge/view/InputView.java +++ b/src/main/java/bridge/view/InputView.java @@ -18,8 +18,7 @@ public class InputView { */ public BridgeSize readBridgeSize() { try { - outputView.printLengthMessage(); - String input = Console.readLine(); + String input = inputBridgeSize(); inputValidator.validateIsNumber(input); return new BridgeSize(Integer.parseInt(input)); } catch (IllegalArgumentException exception) { @@ -28,6 +27,13 @@ public BridgeSize readBridgeSize() { } } + private String inputBridgeSize() { + outputView.printLengthMessage(); + String input = Console.readLine(); + outputView.printEmpty(); + return input; + } + /** * 사용자가 이동할 칸을 입력받는다. */ From 6b0719ea81a749c1bc0c289b3329a7ec90143e19 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=EA=B9=80=EC=97=B0=EC=A7=84?= Date: Tue, 22 Aug 2023 22:48:20 +0900 Subject: [PATCH 42/44] =?UTF-8?q?refactor(Bridge):=20=EB=B6=88=ED=95=84?= =?UTF-8?q?=EC=9A=94=ED=95=9C=20=EB=A9=94=EC=84=9C=EB=93=9C=20=EC=82=AD?= =?UTF-8?q?=EC=A0=9C?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- src/main/java/bridge/domain/Bridge.java | 7 ++----- 1 file changed, 2 insertions(+), 5 deletions(-) diff --git a/src/main/java/bridge/domain/Bridge.java b/src/main/java/bridge/domain/Bridge.java index e00cea1c3db..2a14b8fe342 100644 --- a/src/main/java/bridge/domain/Bridge.java +++ b/src/main/java/bridge/domain/Bridge.java @@ -1,5 +1,6 @@ package bridge.domain; +import java.util.ArrayList; import java.util.List; public class Bridge { @@ -7,11 +8,7 @@ public class Bridge { private final List bridge; public Bridge(List bridge) { - this.bridge = bridge; - } - - public List getBridge() { - return bridge; + this.bridge = new ArrayList<>(bridge); } public boolean isCorrectMoving(String moving, int position) { From 13d30125826617254d056e2a0d167618e2c5b16c Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=EA=B9=80=EC=97=B0=EC=A7=84?= Date: Tue, 22 Aug 2023 22:56:27 +0900 Subject: [PATCH 43/44] =?UTF-8?q?refactor(GameReco=EA=B1=B0der):=20?= =?UTF-8?q?=ED=95=98=EB=93=9C=EC=BD=94=EB=94=A9=20=EC=A0=9C?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- src/main/java/bridge/domain/GameRecorder.java | 12 ++++-------- 1 file changed, 4 insertions(+), 8 deletions(-) diff --git a/src/main/java/bridge/domain/GameRecorder.java b/src/main/java/bridge/domain/GameRecorder.java index f0c4fad6132..3a6f2c6a2cf 100644 --- a/src/main/java/bridge/domain/GameRecorder.java +++ b/src/main/java/bridge/domain/GameRecorder.java @@ -6,15 +6,16 @@ public class GameRecorder { + private static final int DEFAULT_POSITION = 0; private final BridgeSize bridgeSize; - private int position = 0; - private int retryCount = 1; + private int position; private GameStatus gameStatus; public GameRecorder(BridgeSize bridgeSize) { this.bridgeSize = bridgeSize; this.gameStatus = GameStatus.PROGRESS; + this.position = DEFAULT_POSITION; } public void movePosition() { @@ -33,8 +34,7 @@ public void checkGameStatus(RetryCommand restartCommand) { } private void initGame() { - position = 0; - retryCount++; + position = DEFAULT_POSITION; gameStatus = GameStatus.init(); } @@ -42,10 +42,6 @@ public int getPosition() { return position; } - public int getRetryCount() { - return retryCount; - } - public boolean isProgress() { return gameStatus.isProgress(); } From a8543d460c380cf28e0e4bb196bb0aa0145ae1b4 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=EA=B9=80=EC=97=B0=EC=A7=84?= Date: Tue, 22 Aug 2023 23:07:04 +0900 Subject: [PATCH 44/44] =?UTF-8?q?refactor(TryCount):=20=EC=9E=AC=EC=8B=9C?= =?UTF-8?q?=EC=9E=91=20=ED=9A=9F=EC=88=98=20=EC=B9=B4=EC=9A=B4=ED=8A=B8=20?= =?UTF-8?q?=EC=97=AD=ED=95=A0=20=EB=B6=84=EB=A6=AC?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../bridge/controller/BridgeController.java | 12 +++++++++--- src/main/java/bridge/domain/GameRecorder.java | 2 +- src/main/java/bridge/domain/RetryCount.java | 18 ++++++++++++++++++ src/main/java/bridge/service/BridgeGame.java | 12 +++++++----- src/main/java/bridge/view/OutputView.java | 11 +++++++---- 5 files changed, 42 insertions(+), 13 deletions(-) create mode 100644 src/main/java/bridge/domain/RetryCount.java diff --git a/src/main/java/bridge/controller/BridgeController.java b/src/main/java/bridge/controller/BridgeController.java index 63bdd09e130..d05d3c44a24 100644 --- a/src/main/java/bridge/controller/BridgeController.java +++ b/src/main/java/bridge/controller/BridgeController.java @@ -13,9 +13,9 @@ public class BridgeController { private BridgeGame bridgeGame; public void start() { - bridgeGame = startGame(); - playGame(); - outputView.printResult(bridgeGame.getBridgeMaps(), bridgeGame.getGameRecorder()); + bridgeGame = startGame(); + playGame(); + printGameResult(); } private BridgeGame startGame() { @@ -43,4 +43,10 @@ private void handleFailed() { bridgeGame.retry(inputView.readGameCommand()); } } + + private void printGameResult() { + outputView.printEndMessage(); + outputView.printMap(bridgeGame.getBridgeMaps()); + outputView.printResult(bridgeGame.getGameRecorder(), bridgeGame.getRetryCount()); + } } \ No newline at end of file diff --git a/src/main/java/bridge/domain/GameRecorder.java b/src/main/java/bridge/domain/GameRecorder.java index 3a6f2c6a2cf..6653b57e62c 100644 --- a/src/main/java/bridge/domain/GameRecorder.java +++ b/src/main/java/bridge/domain/GameRecorder.java @@ -57,4 +57,4 @@ public boolean isFailed() { public String getGameClearMessage() { return GameClearMessage.getGameClearMessage(gameStatus.isClear()); } -} +} \ No newline at end of file diff --git a/src/main/java/bridge/domain/RetryCount.java b/src/main/java/bridge/domain/RetryCount.java new file mode 100644 index 00000000000..5743b19b4be --- /dev/null +++ b/src/main/java/bridge/domain/RetryCount.java @@ -0,0 +1,18 @@ +package bridge.domain; + +import bridge.constant.RetryCommand; + +public class RetryCount { + + private int tryCount = 1; + + public void increaseTryCount(RetryCommand command) { + if (command.isRetry()){ + tryCount++; + } + } + + public int getRetryCount() { + return tryCount; + } +} diff --git a/src/main/java/bridge/service/BridgeGame.java b/src/main/java/bridge/service/BridgeGame.java index 13f9c731977..f3187d4eb70 100644 --- a/src/main/java/bridge/service/BridgeGame.java +++ b/src/main/java/bridge/service/BridgeGame.java @@ -3,11 +3,7 @@ import bridge.BridgeMaker; import bridge.BridgeRandomNumberGenerator; import bridge.constant.RetryCommand; -import bridge.domain.Bridge; -import bridge.domain.BridgeMaps; -import bridge.domain.BridgeSize; -import bridge.domain.GameRecorder; - +import bridge.domain.*; /** * 다리 건너기 게임을 관리하는 클래스 @@ -17,6 +13,7 @@ public class BridgeGame { private final Bridge bridge; private final GameRecorder gameRecorder; private final BridgeMaps bridgeMaps = new BridgeMaps(); + private final RetryCount retryCount = new RetryCount(); public BridgeGame(BridgeSize bridgeSize) { BridgeMaker bridgeMaker = new BridgeMaker(new BridgeRandomNumberGenerator()); @@ -44,6 +41,7 @@ public void move(String moving) { public void retry(RetryCommand restartCommand) { gameRecorder.checkGameStatus(restartCommand); bridgeMaps.clear(restartCommand); + retryCount.increaseTryCount(restartCommand); } public boolean isProgress() { @@ -65,4 +63,8 @@ public BridgeMaps getBridgeMaps() { public GameRecorder getGameRecorder() { return gameRecorder; } + + public RetryCount getRetryCount() { + return retryCount; + } } diff --git a/src/main/java/bridge/view/OutputView.java b/src/main/java/bridge/view/OutputView.java index 1744060d6a1..f9f50ca5496 100644 --- a/src/main/java/bridge/view/OutputView.java +++ b/src/main/java/bridge/view/OutputView.java @@ -3,6 +3,7 @@ import bridge.constant.OutputMessage; import bridge.domain.BridgeMaps; import bridge.domain.GameRecorder; +import bridge.domain.RetryCount; /** * 사용자에게 게임 진행 상황과 결과를 출력하는 역할을 한다. @@ -24,11 +25,13 @@ public void printMap(BridgeMaps bridgeMaps) { *

* 출력을 위해 필요한 메서드의 인자(parameter)는 자유롭게 추가하거나 변경할 수 있다. */ - public void printResult(BridgeMaps bridgeMaps, GameRecorder gameRecorder) { - System.out.println(OutputMessage.GAME_END_MESSAGE); - System.out.println(bridgeMaps.toString()); + public void printResult(GameRecorder gameRecorder, RetryCount tryCount) { System.out.printf((OutputMessage.GAME_STATUS.toString()), gameRecorder.getGameClearMessage()); - System.out.printf(OutputMessage.RETRY_NUMBERS.toString(), gameRecorder.getRetryCount()); + System.out.printf(OutputMessage.RETRY_NUMBERS.toString(), tryCount.getRetryCount()); + } + + public void printEndMessage() { + System.out.println(OutputMessage.GAME_END_MESSAGE); } public void printGameStart() {