From de27111f5b68e70fc2ec9e896ec79905b8e69415 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=EA=B9=80=EC=8A=B9=EC=A7=84?= Date: Sun, 20 Aug 2023 18:10:26 +0900 Subject: [PATCH 01/37] =?UTF-8?q?docs(README):=20=EA=B8=B0=EB=8A=A5=20?= =?UTF-8?q?=EB=AA=A9=EB=A1=9D=20=EC=9E=91=EC=84=B1?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit README 내용 추가 - 기능 목록 --- docs/README.md | 27 +++++++++++++++++++++++++++ 1 file changed, 27 insertions(+) diff --git a/docs/README.md b/docs/README.md index e69de29bb2d..6c57da7d696 100644 --- a/docs/README.md +++ b/docs/README.md @@ -0,0 +1,27 @@ +## 기능 목록 +- [ ] 게임 시작 + - [ ] 게임 시작 메시지 출력 +- [ ] 다리 길이 설정 + - [ ] 다리 길이 입력요청 메시지 출력 + - [ ] 다리 길이 입력 + - [ ] 입력값 숫자 여부 검증 + - [ ] 입력 숫자 3 이상 20 이하 숫자인지 검증 +- [ ] 다리 생성 + - [ ] 길이에 따른 랜덤 다리 생성 +- [ ] 플레이어 이동 + - [ ] 이동할 칸 입력 + - [ ] 입력값이 U 혹은 D 인지 검증 + - [ ] 이동 가능한 칸인 경우 O 표시 + - [ ] 이동 불가능한 칸인 경우 X 표시 + - [ ] 현황 출력 +- [ ] 게임 성공 여부 판단 + - [ ] 이동 불가능한 칸으로 이동한 경우 실패 + - [ ] 모두 이동 가능한 칸으로만 이동한 경우 성공 + - [ ] 성공 메시지 출력 + - [ ] 총 시도 횟수 출력 +- [ ] 실패시 게임 재시작 여부 판단 + - [ ] 게임 재시작 여부 입력 + - [ ] 입력값 R 혹은 Q 인지 검증 +- [ ] 게임 재시작 + - [ ] 게임 시도 횟수 증가 +- [ ] 게임 종료 From 7f15ca66991cabc38b6c191aaa380f6bdbb22788 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=EA=B9=80=EC=8A=B9=EC=A7=84?= Date: Sun, 20 Aug 2023 18:14:32 +0900 Subject: [PATCH 02/37] =?UTF-8?q?feat:=20ComponentFactory=EC=99=80=20Bridg?= =?UTF-8?q?eGameManager=20=EC=B6=94=EA=B0=80?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit 클래스 추가 - ComponentFactory - BridgeGameManager --- docs/README.md | 5 +++++ src/main/java/bridge/Application.java | 5 ++++- src/main/java/bridge/factory/ComponentFactory.java | 10 ++++++++++ src/main/java/bridge/manager/BridgeGameManager.java | 8 ++++++++ 4 files changed, 27 insertions(+), 1 deletion(-) create mode 100644 src/main/java/bridge/factory/ComponentFactory.java create mode 100644 src/main/java/bridge/manager/BridgeGameManager.java diff --git a/docs/README.md b/docs/README.md index 6c57da7d696..7638fdf2447 100644 --- a/docs/README.md +++ b/docs/README.md @@ -25,3 +25,8 @@ - [ ] 게임 재시작 - [ ] 게임 시도 횟수 증가 - [ ] 게임 종료 + +## 구현 클래스 목록 +- ComponentFactory + +- BridgeGameManager diff --git a/src/main/java/bridge/Application.java b/src/main/java/bridge/Application.java index 5cb72dfd3de..37600799fbc 100644 --- a/src/main/java/bridge/Application.java +++ b/src/main/java/bridge/Application.java @@ -1,8 +1,11 @@ package bridge; +import bridge.factory.ComponentFactory; + public class Application { public static void main(String[] args) { - // TODO: 프로그램 구현 + final ComponentFactory componentFactory = new ComponentFactory(); + componentFactory.bridgeGameManager().play(); } } diff --git a/src/main/java/bridge/factory/ComponentFactory.java b/src/main/java/bridge/factory/ComponentFactory.java new file mode 100644 index 00000000000..1aa776a1f6c --- /dev/null +++ b/src/main/java/bridge/factory/ComponentFactory.java @@ -0,0 +1,10 @@ +package bridge.factory; + +import bridge.manager.BridgeGameManager; + +public class ComponentFactory { + + public BridgeGameManager bridgeGameManager() { + return new BridgeGameManager(); + } +} diff --git a/src/main/java/bridge/manager/BridgeGameManager.java b/src/main/java/bridge/manager/BridgeGameManager.java new file mode 100644 index 00000000000..56f553af45a --- /dev/null +++ b/src/main/java/bridge/manager/BridgeGameManager.java @@ -0,0 +1,8 @@ +package bridge.manager; + +public class BridgeGameManager { + + public void play() { + + } +} From 2fa5c20931671521cad79db056a7456fbb2e4e02 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=EA=B9=80=EC=8A=B9=EC=A7=84?= Date: Sun, 20 Aug 2023 18:22:20 +0900 Subject: [PATCH 03/37] =?UTF-8?q?feat:=20InputValidator=EC=99=80=20InputMa?= =?UTF-8?q?nager=20=EC=B6=94=EA=B0=80?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit 클래스 추가 - InputValidator - InputManager --- .../java/bridge/factory/ComponentFactory.java | 27 ++++++++++++++++++- src/main/java/bridge/io/InputManager.java | 11 ++++++++ src/main/java/bridge/io/InputValidator.java | 4 +++ src/main/java/bridge/{ => io}/InputView.java | 2 +- src/main/java/bridge/{ => io}/OutputView.java | 2 +- .../bridge/manager/BridgeGameManager.java | 13 +++++++++ 6 files changed, 56 insertions(+), 3 deletions(-) create mode 100644 src/main/java/bridge/io/InputManager.java create mode 100644 src/main/java/bridge/io/InputValidator.java rename src/main/java/bridge/{ => io}/InputView.java (96%) rename src/main/java/bridge/{ => io}/OutputView.java (97%) diff --git a/src/main/java/bridge/factory/ComponentFactory.java b/src/main/java/bridge/factory/ComponentFactory.java index 1aa776a1f6c..8b0130ca7d4 100644 --- a/src/main/java/bridge/factory/ComponentFactory.java +++ b/src/main/java/bridge/factory/ComponentFactory.java @@ -1,10 +1,35 @@ package bridge.factory; +import bridge.BridgeGame; +import bridge.io.InputManager; +import bridge.io.InputValidator; +import bridge.io.InputView; +import bridge.io.OutputView; import bridge.manager.BridgeGameManager; public class ComponentFactory { public BridgeGameManager bridgeGameManager() { - return new BridgeGameManager(); + return new BridgeGameManager(inputManager(), outputView(), bridgeGame()); + } + + private BridgeGame bridgeGame() { + return new BridgeGame(); + } + + private OutputView outputView() { + return new OutputView(); + } + + private InputManager inputManager() { + return new InputManager(inputView(), inputValidator()); + } + + private InputValidator inputValidator() { + return new InputValidator(); + } + + private InputView inputView() { + return new InputView(); } } diff --git a/src/main/java/bridge/io/InputManager.java b/src/main/java/bridge/io/InputManager.java new file mode 100644 index 00000000000..68be23228d2 --- /dev/null +++ b/src/main/java/bridge/io/InputManager.java @@ -0,0 +1,11 @@ +package bridge.io; + +public class InputManager { + private final InputView inputView; + private final InputValidator inputValidator; + + public InputManager(final InputView inputView, final InputValidator inputValidator) { + this.inputView = inputView; + this.inputValidator = inputValidator; + } +} diff --git a/src/main/java/bridge/io/InputValidator.java b/src/main/java/bridge/io/InputValidator.java new file mode 100644 index 00000000000..c851247a50f --- /dev/null +++ b/src/main/java/bridge/io/InputValidator.java @@ -0,0 +1,4 @@ +package bridge.io; + +public class InputValidator { +} diff --git a/src/main/java/bridge/InputView.java b/src/main/java/bridge/io/InputView.java similarity index 96% rename from src/main/java/bridge/InputView.java rename to src/main/java/bridge/io/InputView.java index c3911c8a8e7..638240cb5d9 100644 --- a/src/main/java/bridge/InputView.java +++ b/src/main/java/bridge/io/InputView.java @@ -1,4 +1,4 @@ -package bridge; +package bridge.io; /** * 사용자로부터 입력을 받는 역할을 한다. diff --git a/src/main/java/bridge/OutputView.java b/src/main/java/bridge/io/OutputView.java similarity index 97% rename from src/main/java/bridge/OutputView.java rename to src/main/java/bridge/io/OutputView.java index 69a433a6285..b348a4ecc6c 100644 --- a/src/main/java/bridge/OutputView.java +++ b/src/main/java/bridge/io/OutputView.java @@ -1,4 +1,4 @@ -package bridge; +package bridge.io; /** * 사용자에게 게임 진행 상황과 결과를 출력하는 역할을 한다. diff --git a/src/main/java/bridge/manager/BridgeGameManager.java b/src/main/java/bridge/manager/BridgeGameManager.java index 56f553af45a..9603365fd81 100644 --- a/src/main/java/bridge/manager/BridgeGameManager.java +++ b/src/main/java/bridge/manager/BridgeGameManager.java @@ -1,6 +1,19 @@ package bridge.manager; +import bridge.BridgeGame; +import bridge.io.OutputView; +import bridge.io.InputManager; + public class BridgeGameManager { + private final InputManager inputManager; + private final OutputView outputView; + private final BridgeGame bridgeGame; + + public BridgeGameManager(final InputManager inputManager, final OutputView outputView, final BridgeGame bridgeGame) { + this.inputManager = inputManager; + this.outputView = outputView; + this.bridgeGame = bridgeGame; + } public void play() { From b582e768542e6dd8b281ef6d3bb817dd38589bd8 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=EA=B9=80=EC=8A=B9=EC=A7=84?= Date: Sun, 20 Aug 2023 18:30:25 +0900 Subject: [PATCH 04/37] =?UTF-8?q?feat:=20=EA=B2=8C=EC=9E=84=20=EC=8B=9C?= =?UTF-8?q?=EC=9E=91=20=EB=A9=94=EC=8B=9C=EC=A7=80=20=EC=B6=9C=EB=A0=A5?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit 기능 추가 - 게임 시작 메시지 출력 - enum GameMessage 추가 --- src/main/java/bridge/constant/GameMessage.java | 16 ++++++++++++++++ src/main/java/bridge/io/OutputView.java | 6 ++++++ .../java/bridge/manager/BridgeGameManager.java | 2 +- 3 files changed, 23 insertions(+), 1 deletion(-) create mode 100644 src/main/java/bridge/constant/GameMessage.java diff --git a/src/main/java/bridge/constant/GameMessage.java b/src/main/java/bridge/constant/GameMessage.java new file mode 100644 index 00000000000..bda7363b8b7 --- /dev/null +++ b/src/main/java/bridge/constant/GameMessage.java @@ -0,0 +1,16 @@ +package bridge.constant; + +public enum GameMessage { + START_GAME("다리 건너기 게임을 시작합니다.\n"); + + private final String message; + + GameMessage(String message) { + this.message = message; + } + + @Override + public String toString() { + return this.message; + } +} diff --git a/src/main/java/bridge/io/OutputView.java b/src/main/java/bridge/io/OutputView.java index b348a4ecc6c..62ed409a565 100644 --- a/src/main/java/bridge/io/OutputView.java +++ b/src/main/java/bridge/io/OutputView.java @@ -1,5 +1,7 @@ package bridge.io; +import bridge.constant.GameMessage; + /** * 사용자에게 게임 진행 상황과 결과를 출력하는 역할을 한다. */ @@ -20,4 +22,8 @@ public void printMap() { */ public void printResult() { } + + public void printGameStart() { + System.out.println(GameMessage.START_GAME); + } } diff --git a/src/main/java/bridge/manager/BridgeGameManager.java b/src/main/java/bridge/manager/BridgeGameManager.java index 9603365fd81..46185c7ff8c 100644 --- a/src/main/java/bridge/manager/BridgeGameManager.java +++ b/src/main/java/bridge/manager/BridgeGameManager.java @@ -16,6 +16,6 @@ public BridgeGameManager(final InputManager inputManager, final OutputView outpu } public void play() { - + outputView.printGameStart(); } } From d7d83680dc6514c4a36922f8f112deaefd331e96 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=EA=B9=80=EC=8A=B9=EC=A7=84?= Date: Sun, 20 Aug 2023 18:40:40 +0900 Subject: [PATCH 05/37] =?UTF-8?q?docs(README):=20=EA=B5=AC=ED=98=84=20?= =?UTF-8?q?=ED=81=B4=EB=9E=98=EC=8A=A4=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 | 33 +++++++++++++++++++++++++++++++++ 1 file changed, 33 insertions(+) diff --git a/docs/README.md b/docs/README.md index 7638fdf2447..4b2c3567295 100644 --- a/docs/README.md +++ b/docs/README.md @@ -28,5 +28,38 @@ ## 구현 클래스 목록 - ComponentFactory + - bridgeGameManager() + +- InputManager + +- InputValidator + +- InputView + - readBridgeSize() + - readMoving() + - readGameCommand() + +- OutputView + - printMap() + - printResult() + - printGameStart() + - printBridgeSizeRequest() - BridgeGameManager + - playGame() + +- Application + - main() + +- BridgeGame + - move() + - retry() + +- BridgeMaker + - makeBridge() + +- BridgeRandomNumberGenerator + - generate() + +## 구현 열거형 목록 +- GameMessage From 29db82164a3e41c7117003af574f92f6cce73e6e Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=EA=B9=80=EC=8A=B9=EC=A7=84?= Date: Sun, 20 Aug 2023 18:41:33 +0900 Subject: [PATCH 06/37] =?UTF-8?q?feat:=20=EB=8B=A4=EB=A6=AC=20=EA=B8=B8?= =?UTF-8?q?=EC=9D=B4=20=EC=9E=85=EB=A0=A5=20=EC=9A=94=EC=B2=AD=20=EB=A9=94?= =?UTF-8?q?=EC=8B=9C=EC=A7=80=20=EC=B6=9C=EB=A0=A5=20=EA=B8=B0=EB=8A=A5?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit 기능 추가 - 다리 길이 입력 요청 메시지 출력 - BridgeGameManager 메서드 명 수정 --- src/main/java/bridge/Application.java | 2 +- src/main/java/bridge/constant/GameMessage.java | 3 ++- src/main/java/bridge/io/OutputView.java | 4 ++++ src/main/java/bridge/manager/BridgeGameManager.java | 11 ++++++++++- 4 files changed, 17 insertions(+), 3 deletions(-) diff --git a/src/main/java/bridge/Application.java b/src/main/java/bridge/Application.java index 37600799fbc..1e4e15593d0 100644 --- a/src/main/java/bridge/Application.java +++ b/src/main/java/bridge/Application.java @@ -6,6 +6,6 @@ public class Application { public static void main(String[] args) { final ComponentFactory componentFactory = new ComponentFactory(); - componentFactory.bridgeGameManager().play(); + componentFactory.bridgeGameManager().playGame(); } } diff --git a/src/main/java/bridge/constant/GameMessage.java b/src/main/java/bridge/constant/GameMessage.java index bda7363b8b7..b1882cc6033 100644 --- a/src/main/java/bridge/constant/GameMessage.java +++ b/src/main/java/bridge/constant/GameMessage.java @@ -1,7 +1,8 @@ package bridge.constant; public enum GameMessage { - START_GAME("다리 건너기 게임을 시작합니다.\n"); + START_GAME("다리 건너기 게임을 시작합니다.\n"), + BRIDGE_SIZE_REQUEST("다리의 길이를 입력해주세요."); private final String message; diff --git a/src/main/java/bridge/io/OutputView.java b/src/main/java/bridge/io/OutputView.java index 62ed409a565..3fb7caccfb7 100644 --- a/src/main/java/bridge/io/OutputView.java +++ b/src/main/java/bridge/io/OutputView.java @@ -26,4 +26,8 @@ public void printResult() { public void printGameStart() { System.out.println(GameMessage.START_GAME); } + + public void printBridgeSizeRequest() { + System.out.println(GameMessage.BRIDGE_SIZE_REQUEST); + } } diff --git a/src/main/java/bridge/manager/BridgeGameManager.java b/src/main/java/bridge/manager/BridgeGameManager.java index 46185c7ff8c..5329d16234c 100644 --- a/src/main/java/bridge/manager/BridgeGameManager.java +++ b/src/main/java/bridge/manager/BridgeGameManager.java @@ -15,7 +15,16 @@ public BridgeGameManager(final InputManager inputManager, final OutputView outpu this.bridgeGame = bridgeGame; } - public void play() { + public void playGame() { outputView.printGameStart(); + play(); + } + + private void play() { + makeBridge(); + } + + private void makeBridge() { + outputView.printBridgeSizeRequest(); } } From 68be748c30822815bfc20971c4f94b9e892fd194 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=EA=B9=80=EC=8A=B9=EC=A7=84?= Date: Sun, 20 Aug 2023 18:57:55 +0900 Subject: [PATCH 07/37] =?UTF-8?q?feat:=20=EC=97=B4=EA=B1=B0=ED=98=95=20?= =?UTF-8?q?=EC=B6=94=EA=B0=80?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit 열거형 추가 - RetryCommand - MoveResult - BridgeType --- docs/README.md | 3 +++ src/main/java/bridge/constant/BridgeType.java | 5 +++++ src/main/java/bridge/constant/MoveResult.java | 13 +++++++++++++ src/main/java/bridge/constant/RetryCommand.java | 5 +++++ 4 files changed, 26 insertions(+) create mode 100644 src/main/java/bridge/constant/BridgeType.java create mode 100644 src/main/java/bridge/constant/MoveResult.java create mode 100644 src/main/java/bridge/constant/RetryCommand.java diff --git a/docs/README.md b/docs/README.md index 4b2c3567295..def373a7589 100644 --- a/docs/README.md +++ b/docs/README.md @@ -63,3 +63,6 @@ ## 구현 열거형 목록 - GameMessage +- BridgeType +- MoveResult +- RetryCommand diff --git a/src/main/java/bridge/constant/BridgeType.java b/src/main/java/bridge/constant/BridgeType.java new file mode 100644 index 00000000000..198262433fb --- /dev/null +++ b/src/main/java/bridge/constant/BridgeType.java @@ -0,0 +1,5 @@ +package bridge.constant; + +public enum BridgeType { + U, D +} diff --git a/src/main/java/bridge/constant/MoveResult.java b/src/main/java/bridge/constant/MoveResult.java new file mode 100644 index 00000000000..09eee38523b --- /dev/null +++ b/src/main/java/bridge/constant/MoveResult.java @@ -0,0 +1,13 @@ +package bridge.constant; + +public enum MoveResult { + CONTINUE, FAILED, SUCCESS; + + public boolean isNotContinue() { + return this != CONTINUE; + } + + public boolean isSuccess() { + return this == SUCCESS; + } +} diff --git a/src/main/java/bridge/constant/RetryCommand.java b/src/main/java/bridge/constant/RetryCommand.java new file mode 100644 index 00000000000..dc13ab4c3c3 --- /dev/null +++ b/src/main/java/bridge/constant/RetryCommand.java @@ -0,0 +1,5 @@ +package bridge.constant; + +public enum RetryCommand { + R, Q +} From 4c141c56768482708ea27ca73fc6063b4069e28a Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=EA=B9=80=EC=8A=B9=EC=A7=84?= Date: Sun, 20 Aug 2023 18:58:50 +0900 Subject: [PATCH 08/37] =?UTF-8?q?feat:=20=EC=B6=9C=EB=A0=A5=EB=AC=B8=20?= =?UTF-8?q?=EC=B6=94=EA=B0=80=20=EB=B0=8F=20=EC=B6=9C=EB=A0=A5=20=EA=B8=B0?= =?UTF-8?q?=EB=8A=A5?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit 기능 추가 - 출력문 GameMessage에 추가 - 출력 기능 추가 --- .../java/bridge/constant/GameMessage.java | 4 ++- src/main/java/bridge/io/OutputView.java | 8 +++++ .../bridge/manager/BridgeGameManager.java | 33 +++++++++++++++++++ 3 files changed, 44 insertions(+), 1 deletion(-) diff --git a/src/main/java/bridge/constant/GameMessage.java b/src/main/java/bridge/constant/GameMessage.java index b1882cc6033..d61b3b7ae94 100644 --- a/src/main/java/bridge/constant/GameMessage.java +++ b/src/main/java/bridge/constant/GameMessage.java @@ -2,7 +2,9 @@ public enum GameMessage { START_GAME("다리 건너기 게임을 시작합니다.\n"), - BRIDGE_SIZE_REQUEST("다리의 길이를 입력해주세요."); + BRIDGE_SIZE_REQUEST("다리의 길이를 입력해주세요."), + MOVE_DIRECTION_REQUEST(String.format("이동할 칸을 선택해주세요. (위: %s, 아래: %s)", BridgeType.U, BridgeType.D)), + RETRY_REQUEST(String.format("게임을 다시 시도할지 여부를 입력해주세요. (재시도: %s, 종료: %s)", RetryCommand.R, RetryCommand.Q)); private final String message; diff --git a/src/main/java/bridge/io/OutputView.java b/src/main/java/bridge/io/OutputView.java index 3fb7caccfb7..6ea99949156 100644 --- a/src/main/java/bridge/io/OutputView.java +++ b/src/main/java/bridge/io/OutputView.java @@ -30,4 +30,12 @@ public void printGameStart() { public void printBridgeSizeRequest() { System.out.println(GameMessage.BRIDGE_SIZE_REQUEST); } + + public void printMovingRequest() { + System.out.println(GameMessage.MOVE_DIRECTION_REQUEST); + } + + public void printRetryRequest() { + System.out.println(GameMessage.RETRY_REQUEST); + } } diff --git a/src/main/java/bridge/manager/BridgeGameManager.java b/src/main/java/bridge/manager/BridgeGameManager.java index 5329d16234c..332c91a6d88 100644 --- a/src/main/java/bridge/manager/BridgeGameManager.java +++ b/src/main/java/bridge/manager/BridgeGameManager.java @@ -1,6 +1,7 @@ package bridge.manager; import bridge.BridgeGame; +import bridge.constant.MoveResult; import bridge.io.OutputView; import bridge.io.InputManager; @@ -22,6 +23,38 @@ public void playGame() { private void play() { makeBridge(); + boolean isRunning = true; + while (isRunning) { + isRunning = moveAndCheckRetry(); + } + } + + private boolean moveAndCheckRetry() { + while (true) { + final MoveResult moveResult = tryMove(); + if (moveResult.isNotContinue()) { + return getRetryStatus(moveResult); + } + outputView.printMap(); + } + } + + private boolean getRetryStatus(final MoveResult moveResult) { + if (moveResult.isSuccess()) { + return false; + } + outputView.printMap(); + return checkRetry(); + } + + private boolean checkRetry() { + outputView.printRetryRequest(); + return false; + } + + private MoveResult tryMove() { + outputView.printMovingRequest(); + return null; } private void makeBridge() { From 9fea868af4bf2a0ffbacef8cfc814d820f7e502a Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=EA=B9=80=EC=8A=B9=EC=A7=84?= Date: Sun, 20 Aug 2023 19:28:23 +0900 Subject: [PATCH 09/37] =?UTF-8?q?feat(ErrorMessage):=20=EC=97=B4=EA=B1=B0?= =?UTF-8?q?=ED=98=95=20=EC=B6=94=EA=B0=80?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit 열거형 추가 - ErrorMessage --- docs/README.md | 5 +++-- .../java/bridge/constant/ErrorMessage.java | 18 ++++++++++++++++++ 2 files changed, 21 insertions(+), 2 deletions(-) create mode 100644 src/main/java/bridge/constant/ErrorMessage.java diff --git a/docs/README.md b/docs/README.md index def373a7589..314a1e8ffe6 100644 --- a/docs/README.md +++ b/docs/README.md @@ -1,6 +1,6 @@ ## 기능 목록 -- [ ] 게임 시작 - - [ ] 게임 시작 메시지 출력 +- [x] 게임 시작 + - [x] 게임 시작 메시지 출력 - [ ] 다리 길이 설정 - [ ] 다리 길이 입력요청 메시지 출력 - [ ] 다리 길이 입력 @@ -66,3 +66,4 @@ - BridgeType - MoveResult - RetryCommand +- ErrorMessage diff --git a/src/main/java/bridge/constant/ErrorMessage.java b/src/main/java/bridge/constant/ErrorMessage.java new file mode 100644 index 00000000000..563e2615f75 --- /dev/null +++ b/src/main/java/bridge/constant/ErrorMessage.java @@ -0,0 +1,18 @@ +package bridge.constant; + +public enum ErrorMessage { + NOT_NUMERIC_INPUT("숫자만 입력 가능합니다."), + BLANK_INPUT("입력값이 비어있습니다."); + + private final String message; + private static final String ERROR_PREFIX = "[ERROR] "; + + ErrorMessage(String message) { + this.message = message; + } + + @Override + public String toString() { + return ERROR_PREFIX + this.message; + } +} From 6220b9492aa09e5c2ee43cb7682d1e8d68b671a5 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=EA=B9=80=EC=8A=B9=EC=A7=84?= Date: Sun, 20 Aug 2023 19:32:35 +0900 Subject: [PATCH 10/37] =?UTF-8?q?refactor:=20InputValidator=20=EC=9C=84?= =?UTF-8?q?=EC=B9=98=20=EC=88=98=EC=A0=95?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit 리팩토링 - InputValidator 주입 위치 수정 --- .../java/bridge/factory/ComponentFactory.java | 4 +-- src/main/java/bridge/io/InputManager.java | 8 ++++-- src/main/java/bridge/io/InputValidator.java | 28 +++++++++++++++++++ src/main/java/bridge/io/InputView.java | 11 +++++++- 4 files changed, 45 insertions(+), 6 deletions(-) diff --git a/src/main/java/bridge/factory/ComponentFactory.java b/src/main/java/bridge/factory/ComponentFactory.java index 8b0130ca7d4..6291aec3e31 100644 --- a/src/main/java/bridge/factory/ComponentFactory.java +++ b/src/main/java/bridge/factory/ComponentFactory.java @@ -22,7 +22,7 @@ private OutputView outputView() { } private InputManager inputManager() { - return new InputManager(inputView(), inputValidator()); + return new InputManager(inputView()); } private InputValidator inputValidator() { @@ -30,6 +30,6 @@ private InputValidator inputValidator() { } private InputView inputView() { - return new InputView(); + return new InputView(inputValidator()); } } diff --git a/src/main/java/bridge/io/InputManager.java b/src/main/java/bridge/io/InputManager.java index 68be23228d2..f535e0adc8a 100644 --- a/src/main/java/bridge/io/InputManager.java +++ b/src/main/java/bridge/io/InputManager.java @@ -2,10 +2,12 @@ public class InputManager { private final InputView inputView; - private final InputValidator inputValidator; - public InputManager(final InputView inputView, final InputValidator inputValidator) { + public InputManager(final InputView inputView) { this.inputView = inputView; - this.inputValidator = inputValidator; + } + + public int bridgeSize() { + return inputView.readBridgeSize(); } } diff --git a/src/main/java/bridge/io/InputValidator.java b/src/main/java/bridge/io/InputValidator.java index c851247a50f..e4c990f5ff1 100644 --- a/src/main/java/bridge/io/InputValidator.java +++ b/src/main/java/bridge/io/InputValidator.java @@ -1,4 +1,32 @@ package bridge.io; +import bridge.constant.ErrorMessage; + public class InputValidator { + private static final Character START_NUMBER = '0'; + private static final Character END_NUMBER = '9'; + public void validateBridgeSize(final String input) { + validateNotBlank(input); + validateNumeric(input); + } + + private void validateNumeric(final String input) { + if (hasNonNumber(input)) { + throw new IllegalArgumentException(ErrorMessage.NOT_NUMERIC_INPUT.toString()); + } + } + + private boolean hasNonNumber(final String input) { + return !input.chars().allMatch(this::isNumber); + } + + private boolean isNumber(int character) { + return START_NUMBER <= character && character <= END_NUMBER; + } + + private void validateNotBlank(final String input) { + if (input.isBlank()) { + throw new IllegalArgumentException(ErrorMessage.BLANK_INPUT.toString()); + } + } } diff --git a/src/main/java/bridge/io/InputView.java b/src/main/java/bridge/io/InputView.java index 638240cb5d9..ef9c0b9260e 100644 --- a/src/main/java/bridge/io/InputView.java +++ b/src/main/java/bridge/io/InputView.java @@ -1,15 +1,24 @@ package bridge.io; +import camp.nextstep.edu.missionutils.Console; + /** * 사용자로부터 입력을 받는 역할을 한다. */ public class InputView { + private final InputValidator inputValidator; + + public InputView(final InputValidator inputValidator) { + this.inputValidator = inputValidator; + } /** * 다리의 길이를 입력받는다. */ public int readBridgeSize() { - return 0; + final String input = Console.readLine(); + inputValidator.validateBridgeSize(input); + return Integer.parseInt(input); } /** From ee54fd4e42df79ac75de772bb874504a468bfdb2 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=EA=B9=80=EC=8A=B9=EC=A7=84?= Date: Sun, 20 Aug 2023 19:33:34 +0900 Subject: [PATCH 11/37] =?UTF-8?q?feat:=20=EB=8B=A4=EB=A6=AC=20=EC=82=AC?= =?UTF-8?q?=EC=9D=B4=EC=A6=88=20=EC=9E=85=EB=A0=A5=20=EA=B8=B0=EB=8A=A5?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit 기능 추가 - 다리 사이즈 입력 --- docs/README.md | 6 +++--- src/main/java/bridge/BridgeGame.java | 4 ++++ src/main/java/bridge/manager/BridgeGameManager.java | 3 +++ 3 files changed, 10 insertions(+), 3 deletions(-) diff --git a/docs/README.md b/docs/README.md index 314a1e8ffe6..7dc31fb1887 100644 --- a/docs/README.md +++ b/docs/README.md @@ -2,9 +2,9 @@ - [x] 게임 시작 - [x] 게임 시작 메시지 출력 - [ ] 다리 길이 설정 - - [ ] 다리 길이 입력요청 메시지 출력 - - [ ] 다리 길이 입력 - - [ ] 입력값 숫자 여부 검증 + - [x] 다리 길이 입력요청 메시지 출력 + - [x] 다리 길이 입력 + - [x] 입력값 숫자 여부 검증 - [ ] 입력 숫자 3 이상 20 이하 숫자인지 검증 - [ ] 다리 생성 - [ ] 길이에 따른 랜덤 다리 생성 diff --git a/src/main/java/bridge/BridgeGame.java b/src/main/java/bridge/BridgeGame.java index 834c1c8362b..ed350de6dbe 100644 --- a/src/main/java/bridge/BridgeGame.java +++ b/src/main/java/bridge/BridgeGame.java @@ -20,4 +20,8 @@ public void move() { */ public void retry() { } + + public void makeBridge(final int bridgeSize) { + + } } diff --git a/src/main/java/bridge/manager/BridgeGameManager.java b/src/main/java/bridge/manager/BridgeGameManager.java index 332c91a6d88..58fb59de95e 100644 --- a/src/main/java/bridge/manager/BridgeGameManager.java +++ b/src/main/java/bridge/manager/BridgeGameManager.java @@ -27,6 +27,7 @@ private void play() { while (isRunning) { isRunning = moveAndCheckRetry(); } + outputView.printResult(); } private boolean moveAndCheckRetry() { @@ -59,5 +60,7 @@ private MoveResult tryMove() { private void makeBridge() { outputView.printBridgeSizeRequest(); + final int bridgeSize = inputManager.bridgeSize(); + bridgeGame.makeBridge(bridgeSize); } } From 653b7b17b36ed00fd41075e66b3bb3cdca55956c Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=EA=B9=80=EC=8A=B9=EC=A7=84?= Date: Wed, 30 Aug 2023 17:18:45 +0900 Subject: [PATCH 12/37] =?UTF-8?q?feat(MoveCommand):=20=EC=97=B4=EA=B1=B0?= =?UTF-8?q?=ED=98=95=20=EC=B6=94=EA=B0=80?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit 열거형 추가 - MoveCommand --- docs/README.md | 5 +++++ src/main/java/bridge/constant/MoveCommand.java | 9 +++++++++ 2 files changed, 14 insertions(+) create mode 100644 src/main/java/bridge/constant/MoveCommand.java diff --git a/docs/README.md b/docs/README.md index 7dc31fb1887..8e41edb4b8b 100644 --- a/docs/README.md +++ b/docs/README.md @@ -31,8 +31,12 @@ - bridgeGameManager() - InputManager + - bridgeSize() + - moveCommand() - InputValidator + - validateBridgeSize() + - validateMoving() - InputView - readBridgeSize() @@ -67,3 +71,4 @@ - MoveResult - RetryCommand - ErrorMessage +- MoveCommand diff --git a/src/main/java/bridge/constant/MoveCommand.java b/src/main/java/bridge/constant/MoveCommand.java new file mode 100644 index 00000000000..22781234884 --- /dev/null +++ b/src/main/java/bridge/constant/MoveCommand.java @@ -0,0 +1,9 @@ +package bridge.constant; + +public enum MoveCommand { + U, D; + + public static boolean isNotMoveCommand(final String input) { + return !input.equals(U.toString()) && !input.equals(D.toString()); + } +} From c6419fca0051937cd01864f445e3093f79172ef4 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=EA=B9=80=EC=8A=B9=EC=A7=84?= Date: Wed, 30 Aug 2023 17:19:38 +0900 Subject: [PATCH 13/37] =?UTF-8?q?feat:=20=EC=9B=80=EC=A7=81=EC=9D=BC=20?= =?UTF-8?q?=EB=B0=A9=ED=96=A5=20=EC=9E=85=EB=A0=A5=20=EA=B8=B0=EB=8A=A5?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit 기능 추가 - 움직일 방향 입력 --- src/main/java/bridge/constant/ErrorMessage.java | 3 ++- src/main/java/bridge/io/InputManager.java | 6 ++++++ src/main/java/bridge/io/InputValidator.java | 7 +++++++ src/main/java/bridge/io/InputView.java | 5 ++++- 4 files changed, 19 insertions(+), 2 deletions(-) diff --git a/src/main/java/bridge/constant/ErrorMessage.java b/src/main/java/bridge/constant/ErrorMessage.java index 563e2615f75..124e152d662 100644 --- a/src/main/java/bridge/constant/ErrorMessage.java +++ b/src/main/java/bridge/constant/ErrorMessage.java @@ -2,7 +2,8 @@ public enum ErrorMessage { NOT_NUMERIC_INPUT("숫자만 입력 가능합니다."), - BLANK_INPUT("입력값이 비어있습니다."); + BLANK_INPUT("입력값이 비어있습니다."), + INVALID_MOVE_COMMAND(String.format("이동 방향 입력값은 %s 혹은 %s 입니다.", MoveCommand.D, MoveCommand.U)); private final String message; private static final String ERROR_PREFIX = "[ERROR] "; diff --git a/src/main/java/bridge/io/InputManager.java b/src/main/java/bridge/io/InputManager.java index f535e0adc8a..8ab099c2f2d 100644 --- a/src/main/java/bridge/io/InputManager.java +++ b/src/main/java/bridge/io/InputManager.java @@ -1,5 +1,7 @@ package bridge.io; +import bridge.constant.MoveCommand; + public class InputManager { private final InputView inputView; @@ -10,4 +12,8 @@ public InputManager(final InputView inputView) { public int bridgeSize() { return inputView.readBridgeSize(); } + + public MoveCommand moveCommand() { + return MoveCommand.valueOf(inputView.readMoving()); + } } diff --git a/src/main/java/bridge/io/InputValidator.java b/src/main/java/bridge/io/InputValidator.java index e4c990f5ff1..18221ebecea 100644 --- a/src/main/java/bridge/io/InputValidator.java +++ b/src/main/java/bridge/io/InputValidator.java @@ -1,6 +1,7 @@ package bridge.io; import bridge.constant.ErrorMessage; +import bridge.constant.MoveCommand; public class InputValidator { private static final Character START_NUMBER = '0'; @@ -29,4 +30,10 @@ private void validateNotBlank(final String input) { throw new IllegalArgumentException(ErrorMessage.BLANK_INPUT.toString()); } } + + public void validateMoving(final String input) { + if (MoveCommand.isNotMoveCommand(input)) { + throw new IllegalArgumentException(ErrorMessage.INVALID_MOVE_COMMAND.toString()); + } + } } diff --git a/src/main/java/bridge/io/InputView.java b/src/main/java/bridge/io/InputView.java index ef9c0b9260e..dc0083d1eb4 100644 --- a/src/main/java/bridge/io/InputView.java +++ b/src/main/java/bridge/io/InputView.java @@ -1,5 +1,6 @@ package bridge.io; +import bridge.constant.MoveCommand; import camp.nextstep.edu.missionutils.Console; /** @@ -25,7 +26,9 @@ public int readBridgeSize() { * 사용자가 이동할 칸을 입력받는다. */ public String readMoving() { - return null; + final String input = Console.readLine(); + inputValidator.validateMoving(input); + return input; } /** From 933ddb38889d25148ed047165498ef645404eb09 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=EA=B9=80=EC=8A=B9=EC=A7=84?= Date: Wed, 30 Aug 2023 17:31:14 +0900 Subject: [PATCH 14/37] =?UTF-8?q?refactor:=20=EA=B8=B0=EC=A1=B4=20InputMan?= =?UTF-8?q?ager=20=EC=9D=B4=EB=A6=84=20=EC=88=98=EC=A0=95=20=EB=B0=8F=20?= =?UTF-8?q?=EC=9E=85=EB=A0=A5=20=EC=9E=AC=EC=8B=9C=EB=8F=84=20=EA=B8=B0?= =?UTF-8?q?=EB=8A=A5?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit 리팩토링 - InputManager를 InputProvider로 수정 - 잘못된 입력시 재시도 가능하도록 수정 --- docs/README.md | 2 +- .../java/bridge/factory/ComponentFactory.java | 8 +++--- src/main/java/bridge/io/InputManager.java | 19 ------------- src/main/java/bridge/io/InputProvider.java | 27 +++++++++++++++++++ src/main/java/bridge/io/InputView.java | 4 +-- 5 files changed, 34 insertions(+), 26 deletions(-) delete mode 100644 src/main/java/bridge/io/InputManager.java create mode 100644 src/main/java/bridge/io/InputProvider.java diff --git a/docs/README.md b/docs/README.md index 8e41edb4b8b..071f77afee6 100644 --- a/docs/README.md +++ b/docs/README.md @@ -30,7 +30,7 @@ - ComponentFactory - bridgeGameManager() -- InputManager +- InputProvider - bridgeSize() - moveCommand() diff --git a/src/main/java/bridge/factory/ComponentFactory.java b/src/main/java/bridge/factory/ComponentFactory.java index 6291aec3e31..564391abf4b 100644 --- a/src/main/java/bridge/factory/ComponentFactory.java +++ b/src/main/java/bridge/factory/ComponentFactory.java @@ -1,7 +1,7 @@ package bridge.factory; import bridge.BridgeGame; -import bridge.io.InputManager; +import bridge.io.InputProvider; import bridge.io.InputValidator; import bridge.io.InputView; import bridge.io.OutputView; @@ -10,7 +10,7 @@ public class ComponentFactory { public BridgeGameManager bridgeGameManager() { - return new BridgeGameManager(inputManager(), outputView(), bridgeGame()); + return new BridgeGameManager(inputProvider(), outputView(), bridgeGame()); } private BridgeGame bridgeGame() { @@ -21,8 +21,8 @@ private OutputView outputView() { return new OutputView(); } - private InputManager inputManager() { - return new InputManager(inputView()); + private InputProvider inputProvider() { + return new InputProvider(inputView()); } private InputValidator inputValidator() { diff --git a/src/main/java/bridge/io/InputManager.java b/src/main/java/bridge/io/InputManager.java deleted file mode 100644 index 8ab099c2f2d..00000000000 --- a/src/main/java/bridge/io/InputManager.java +++ /dev/null @@ -1,19 +0,0 @@ -package bridge.io; - -import bridge.constant.MoveCommand; - -public class InputManager { - private final InputView inputView; - - public InputManager(final InputView inputView) { - this.inputView = inputView; - } - - public int bridgeSize() { - return inputView.readBridgeSize(); - } - - public MoveCommand moveCommand() { - return MoveCommand.valueOf(inputView.readMoving()); - } -} diff --git a/src/main/java/bridge/io/InputProvider.java b/src/main/java/bridge/io/InputProvider.java new file mode 100644 index 00000000000..938d03edbee --- /dev/null +++ b/src/main/java/bridge/io/InputProvider.java @@ -0,0 +1,27 @@ +package bridge.io; + +import bridge.constant.MoveCommand; + +public class InputProvider { + private final InputView inputView; + + public InputProvider(final InputView inputView) { + this.inputView = inputView; + } + + public int bridgeSize() { + while (true) { + try { + return Integer.parseInt(inputView.readBridgeSize()); + } catch (final IllegalArgumentException ignored) {} + } + } + + public MoveCommand moveCommand() { + while (true) { + try { + return MoveCommand.valueOf(inputView.readMoving()); + } catch (final IllegalArgumentException ignored) {} + } + } +} diff --git a/src/main/java/bridge/io/InputView.java b/src/main/java/bridge/io/InputView.java index dc0083d1eb4..26b4bf88b62 100644 --- a/src/main/java/bridge/io/InputView.java +++ b/src/main/java/bridge/io/InputView.java @@ -16,10 +16,10 @@ public InputView(final InputValidator inputValidator) { /** * 다리의 길이를 입력받는다. */ - public int readBridgeSize() { + public String readBridgeSize() { final String input = Console.readLine(); inputValidator.validateBridgeSize(input); - return Integer.parseInt(input); + return input; } /** From f7196687b651347f28728afb347d00f62dec3150 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=EA=B9=80=EC=8A=B9=EC=A7=84?= Date: Thu, 31 Aug 2023 16:34:55 +0900 Subject: [PATCH 15/37] =?UTF-8?q?feat(TryCount):=20=EC=8B=9C=EB=8F=84?= =?UTF-8?q?=ED=9A=9F=EC=88=98=20=EB=8F=84=EB=A9=94=EC=9D=B8=20=ED=81=B4?= =?UTF-8?q?=EB=9E=98=EC=8A=A4=20=EC=B6=94=EA=B0=80?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit 클래스 추가 - TryCount --- docs/README.md | 11 +++++++++++ src/main/java/bridge/domain/TryCount.java | 18 ++++++++++++++++++ 2 files changed, 29 insertions(+) create mode 100644 src/main/java/bridge/domain/TryCount.java diff --git a/docs/README.md b/docs/README.md index 071f77afee6..95147430173 100644 --- a/docs/README.md +++ b/docs/README.md @@ -65,6 +65,17 @@ - BridgeRandomNumberGenerator - generate() +- Bridge + - getLeftSize() + +- GameResult + +- TryCount + - nextCount() + +- ResultManager + - appendResultStatus() + ## 구현 열거형 목록 - GameMessage - BridgeType diff --git a/src/main/java/bridge/domain/TryCount.java b/src/main/java/bridge/domain/TryCount.java new file mode 100644 index 00000000000..32563839c9c --- /dev/null +++ b/src/main/java/bridge/domain/TryCount.java @@ -0,0 +1,18 @@ +package bridge.domain; + +public class TryCount { + private Integer count; + + public TryCount() { + this.count = 1; + } + + public void nextCount() { + this.count++; + } + + @Override + public String toString() { + return Integer.toString(count); + } +} From 0c1d693a6367a20bb0e63b607e8b2adbee62b245 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=EA=B9=80=EC=8A=B9=EC=A7=84?= Date: Thu, 31 Aug 2023 16:35:37 +0900 Subject: [PATCH 16/37] =?UTF-8?q?feat(ResultStatus):=20=EA=B2=B0=EA=B3=BC?= =?UTF-8?q?=20=EC=83=81=ED=83=9C=20enum=20=EC=B6=94=EA=B0=80?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit 열거형 추가 - ResultStatus --- .../java/bridge/constant/ResultStatus.java | 18 ++++++++++++++++++ 1 file changed, 18 insertions(+) create mode 100644 src/main/java/bridge/constant/ResultStatus.java diff --git a/src/main/java/bridge/constant/ResultStatus.java b/src/main/java/bridge/constant/ResultStatus.java new file mode 100644 index 00000000000..0f26470160f --- /dev/null +++ b/src/main/java/bridge/constant/ResultStatus.java @@ -0,0 +1,18 @@ +package bridge.constant; + +public enum ResultStatus { + O("O"), + X("X"), + NONE(" "); + + private final String symbol; + + ResultStatus(final String symbol) { + this.symbol = symbol; + } + + @Override + public String toString() { + return this.symbol; + } +} From 11fa3068bfc0b2f24b4d8a13286871d1db195392 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=EA=B9=80=EC=8A=B9=EC=A7=84?= Date: Thu, 31 Aug 2023 16:36:05 +0900 Subject: [PATCH 17/37] =?UTF-8?q?feat(GameResult):=20=EA=B2=B0=EA=B3=BC=20?= =?UTF-8?q?=EB=8F=84=EB=A9=94=EC=9D=B8=20=ED=81=B4=EB=9E=98=EC=8A=A4=20?= =?UTF-8?q?=EC=B6=94=EA=B0=80?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit 클래스 추가 - GameResult --- src/main/java/bridge/domain/GameResult.java | 21 +++++++++++++++++++++ 1 file changed, 21 insertions(+) create mode 100644 src/main/java/bridge/domain/GameResult.java diff --git a/src/main/java/bridge/domain/GameResult.java b/src/main/java/bridge/domain/GameResult.java new file mode 100644 index 00000000000..6d423c413ed --- /dev/null +++ b/src/main/java/bridge/domain/GameResult.java @@ -0,0 +1,21 @@ +package bridge.domain; + +import bridge.constant.ResultStatus; + +import java.util.ArrayList; +import java.util.List; + +public class GameResult { + private static final String START_TAG = "[ "; + private static final String END_TAG = " ]"; + private static final String SEPARATOR = " | "; + private final List upperResult; + private final List lowerResult; + private final TryCount tryCount; + + public GameResult() { + this.upperResult = new ArrayList<>(); + this.lowerResult = new ArrayList<>(); + this.tryCount = new TryCount(); + } +} From a2bfb1f78a6a7b24dafcae8117c278e2d49d8ec1 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=EA=B9=80=EC=8A=B9=EC=A7=84?= Date: Thu, 31 Aug 2023 16:36:57 +0900 Subject: [PATCH 18/37] =?UTF-8?q?feat(ResultManager):=20=EA=B2=B0=EA=B3=BC?= =?UTF-8?q?=20=EA=B4=80=EB=A6=AC=20=ED=81=B4=EB=9E=98=EC=8A=A4=20=EC=B6=94?= =?UTF-8?q?=EA=B0=80?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit 클래스 추가 - ResultManager --- src/main/java/bridge/manager/ResultManager.java | 14 ++++++++++++++ 1 file changed, 14 insertions(+) create mode 100644 src/main/java/bridge/manager/ResultManager.java diff --git a/src/main/java/bridge/manager/ResultManager.java b/src/main/java/bridge/manager/ResultManager.java new file mode 100644 index 00000000000..292a685646f --- /dev/null +++ b/src/main/java/bridge/manager/ResultManager.java @@ -0,0 +1,14 @@ +package bridge.manager; + +import bridge.constant.MoveCommand; +import bridge.constant.MoveResult; +import bridge.constant.ResultStatus; +import bridge.domain.GameResult; + +public class ResultManager { + private GameResult gameResult; + + public MoveResult appendResultStatus(final ResultStatus resultStatus, final MoveCommand moveCommand) { + return null; + } +} From fc538d9f037ec6afd69951e4348214aff741d80a Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=EA=B9=80=EC=8A=B9=EC=A7=84?= Date: Thu, 31 Aug 2023 16:37:54 +0900 Subject: [PATCH 19/37] =?UTF-8?q?feat(Bridge):=20=EB=8B=A4=EB=A6=AC=20?= =?UTF-8?q?=EA=B4=80=EB=A6=AC=20=EC=9D=BC=EA=B8=89=20=EC=BB=AC=EB=A0=89?= =?UTF-8?q?=EC=85=98=20=EC=B6=94=EA=B0=80?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit 클래스 추가 - Bridge --- src/main/java/bridge/domain/Bridge.java | 30 +++++++++++++++++++++++++ 1 file changed, 30 insertions(+) create mode 100644 src/main/java/bridge/domain/Bridge.java diff --git a/src/main/java/bridge/domain/Bridge.java b/src/main/java/bridge/domain/Bridge.java new file mode 100644 index 00000000000..8f26021aded --- /dev/null +++ b/src/main/java/bridge/domain/Bridge.java @@ -0,0 +1,30 @@ +package bridge.domain; + +import bridge.constant.BridgeType; +import bridge.constant.ErrorMessage; + +import java.util.Collections; +import java.util.List; + +public class Bridge { + private final List directions; + + public Bridge(final List directions) { + this.directions = Collections.unmodifiableList(directions); + } + + public BridgeType getNextElement(final int currentIndex) { + validateIndex(currentIndex); + return BridgeType.valueOf(directions.get(currentIndex)); + } + + private void validateIndex(final int currentIndex) { + if (directions.size() <= currentIndex) { + throw new IllegalArgumentException(ErrorMessage.NO_ELEMENT_LEFT.toString()); + } + } + + public int getLeftSize(final int currentIndex) { + return directions.size() - currentIndex; + } +} From d9cf1c84d696271f62c808c19a140f0905e5b081 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=EA=B9=80=EC=8A=B9=EC=A7=84?= Date: Thu, 31 Aug 2023 16:38:40 +0900 Subject: [PATCH 20/37] =?UTF-8?q?feat(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?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit 기능 추가 - 다리 생성 --- src/main/java/bridge/BridgeMaker.java | 17 +++++++++++++++-- 1 file changed, 15 insertions(+), 2 deletions(-) diff --git a/src/main/java/bridge/BridgeMaker.java b/src/main/java/bridge/BridgeMaker.java index 27e9f2cfa7f..4c92c1f4c67 100644 --- a/src/main/java/bridge/BridgeMaker.java +++ b/src/main/java/bridge/BridgeMaker.java @@ -1,12 +1,18 @@ package bridge; +import bridge.constant.BridgeType; + import java.util.List; +import java.util.stream.Collectors; +import java.util.stream.IntStream; /** * 다리의 길이를 입력 받아서 다리를 생성해주는 역할을 한다. */ public class BridgeMaker { - + private static final int START_INDEX = 0; + private static final int MIN_BRIDGE_SIZE = 3; + private static final int MAX_BRIDGE_SIZE = 20; private final BridgeNumberGenerator bridgeNumberGenerator; public BridgeMaker(BridgeNumberGenerator bridgeNumberGenerator) { @@ -18,6 +24,13 @@ public BridgeMaker(BridgeNumberGenerator bridgeNumberGenerator) { * @return 입력받은 길이에 해당하는 다리 모양. 위 칸이면 "U", 아래 칸이면 "D"로 표현해야 한다. */ public List makeBridge(int size) { - return null; + return IntStream.range(START_INDEX, size) + .mapToObj(i -> getBridgeDirection()) + .collect(Collectors.toList()); + } + + private String getBridgeDirection() { + final int randomNumber = bridgeNumberGenerator.generate(); + return BridgeType.getDirectionByClassifier(randomNumber); } } From 8345a0a43a1c10f2c0861bc6058f03a2c69ba417 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=EA=B9=80=EC=8A=B9=EC=A7=84?= Date: Thu, 31 Aug 2023 16:39:52 +0900 Subject: [PATCH 21/37] =?UTF-8?q?feat(BridgeType):=20=EB=9E=9C=EB=8D=A4=20?= =?UTF-8?q?=EC=83=9D=EC=84=B1=20=EC=88=AB=EC=9E=90=20U=20=ED=98=B9?= =?UTF-8?q?=EC=9D=80=20D=EB=A1=9C=20=EB=A7=A4=ED=95=91=20=EA=B8=B0?= =?UTF-8?q?=EB=8A=A5?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit 기능 추가 - 랜덤 생성 숫자를 U 혹은 D로 매핑하는 메서드 --- src/main/java/bridge/constant/BridgeType.java | 19 ++++++++++++++++++- 1 file changed, 18 insertions(+), 1 deletion(-) diff --git a/src/main/java/bridge/constant/BridgeType.java b/src/main/java/bridge/constant/BridgeType.java index 198262433fb..9c2777319da 100644 --- a/src/main/java/bridge/constant/BridgeType.java +++ b/src/main/java/bridge/constant/BridgeType.java @@ -1,5 +1,22 @@ package bridge.constant; +import java.util.Arrays; + public enum BridgeType { - U, D + U(1), + D(0); + + private final Integer classifier; + + BridgeType(final Integer classifier) { + this.classifier = classifier; + } + + public static String getDirectionByClassifier(final int classifier) { + return Arrays.stream(BridgeType.values()) + .filter(bridgeType -> bridgeType.classifier.equals(classifier)) + .findAny() + .map(Enum::toString) + .orElseThrow(() -> new IllegalArgumentException(ErrorMessage.INVALID_CLASSIFIER.toString())); + } } From 9dc365fcf4df2b7ca47356b94df5bfcf8570c4b3 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=EA=B9=80=EC=8A=B9=EC=A7=84?= Date: Thu, 31 Aug 2023 16:40:36 +0900 Subject: [PATCH 22/37] =?UTF-8?q?feat(ComponentFactory):=20=ED=8C=A9?= =?UTF-8?q?=ED=86=A0=EB=A6=AC=20=EB=A9=94=EC=84=9C=EB=93=9C?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit 기능 추가 - 팩토리 메서드 --- .../java/bridge/factory/ComponentFactory.java | 18 +++++++++++++++++- 1 file changed, 17 insertions(+), 1 deletion(-) diff --git a/src/main/java/bridge/factory/ComponentFactory.java b/src/main/java/bridge/factory/ComponentFactory.java index 564391abf4b..08b98dc52e5 100644 --- a/src/main/java/bridge/factory/ComponentFactory.java +++ b/src/main/java/bridge/factory/ComponentFactory.java @@ -1,11 +1,15 @@ package bridge.factory; import bridge.BridgeGame; +import bridge.BridgeMaker; +import bridge.BridgeNumberGenerator; +import bridge.BridgeRandomNumberGenerator; import bridge.io.InputProvider; import bridge.io.InputValidator; import bridge.io.InputView; import bridge.io.OutputView; import bridge.manager.BridgeGameManager; +import bridge.manager.ResultManager; public class ComponentFactory { @@ -14,7 +18,7 @@ public BridgeGameManager bridgeGameManager() { } private BridgeGame bridgeGame() { - return new BridgeGame(); + return new BridgeGame(resultManager(), bridgeMaker()); } private OutputView outputView() { @@ -32,4 +36,16 @@ private InputValidator inputValidator() { private InputView inputView() { return new InputView(inputValidator()); } + + private ResultManager resultManager() { + return new ResultManager(); + } + + private BridgeMaker bridgeMaker() { + return new BridgeMaker(bridgeNumberGenerator()); + } + + private BridgeNumberGenerator bridgeNumberGenerator() { + return new BridgeRandomNumberGenerator(); + } } From 58d92fc88f17cfec6fb415cc239965135c9019a7 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=EA=B9=80=EC=8A=B9=EC=A7=84?= Date: Thu, 31 Aug 2023 16:41:24 +0900 Subject: [PATCH 23/37] =?UTF-8?q?feat(ErrorMessage):=20=EC=97=90=EB=9F=AC?= =?UTF-8?q?=20=EB=A9=94=EC=8B=9C=EC=A7=80=20=EC=B6=94=EA=B0=80?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit 열거형 상수 추가 - 에러 메시지 --- src/main/java/bridge/constant/ErrorMessage.java | 4 +++- 1 file changed, 3 insertions(+), 1 deletion(-) diff --git a/src/main/java/bridge/constant/ErrorMessage.java b/src/main/java/bridge/constant/ErrorMessage.java index 124e152d662..ecacd811aef 100644 --- a/src/main/java/bridge/constant/ErrorMessage.java +++ b/src/main/java/bridge/constant/ErrorMessage.java @@ -3,7 +3,9 @@ public enum ErrorMessage { NOT_NUMERIC_INPUT("숫자만 입력 가능합니다."), BLANK_INPUT("입력값이 비어있습니다."), - INVALID_MOVE_COMMAND(String.format("이동 방향 입력값은 %s 혹은 %s 입니다.", MoveCommand.D, MoveCommand.U)); + INVALID_MOVE_COMMAND(String.format("이동 방향 입력값은 %s 혹은 %s 입니다.", MoveCommand.D, MoveCommand.U)), + INVALID_CLASSIFIER("다리의 숫자 값이 올바르지 않습니다."), + NO_ELEMENT_LEFT("리스트의 원소가 없습니다."); private final String message; private static final String ERROR_PREFIX = "[ERROR] "; From e45fd72b3731dbd288a9dca10ac0b52af4e855c7 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=EA=B9=80=EC=8A=B9=EC=A7=84?= Date: Thu, 31 Aug 2023 17:03:50 +0900 Subject: [PATCH 24/37] =?UTF-8?q?feat(BridgeStorage):=20=EC=A0=80=EC=9E=A5?= =?UTF-8?q?=EC=86=8C=20=ED=81=B4=EB=9E=98=EC=8A=A4=20=EC=B6=94=EA=B0=80?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit 클래스 추가 - BridgeStorage --- docs/README.md | 7 ++++-- .../java/bridge/manager/ResultManager.java | 14 ----------- .../java/bridge/storage/BridgeStorage.java | 25 +++++++++++++++++++ 3 files changed, 30 insertions(+), 16 deletions(-) delete mode 100644 src/main/java/bridge/manager/ResultManager.java create mode 100644 src/main/java/bridge/storage/BridgeStorage.java diff --git a/docs/README.md b/docs/README.md index 95147430173..3b5087040db 100644 --- a/docs/README.md +++ b/docs/README.md @@ -73,8 +73,11 @@ - TryCount - nextCount() -- ResultManager - - appendResultStatus() +- BridgeStorage + - saveBridge() + - findBridge() + - saveGameResult() + - findGameResult() ## 구현 열거형 목록 - GameMessage diff --git a/src/main/java/bridge/manager/ResultManager.java b/src/main/java/bridge/manager/ResultManager.java deleted file mode 100644 index 292a685646f..00000000000 --- a/src/main/java/bridge/manager/ResultManager.java +++ /dev/null @@ -1,14 +0,0 @@ -package bridge.manager; - -import bridge.constant.MoveCommand; -import bridge.constant.MoveResult; -import bridge.constant.ResultStatus; -import bridge.domain.GameResult; - -public class ResultManager { - private GameResult gameResult; - - public MoveResult appendResultStatus(final ResultStatus resultStatus, final MoveCommand moveCommand) { - return null; - } -} diff --git a/src/main/java/bridge/storage/BridgeStorage.java b/src/main/java/bridge/storage/BridgeStorage.java new file mode 100644 index 00000000000..ac906ef995f --- /dev/null +++ b/src/main/java/bridge/storage/BridgeStorage.java @@ -0,0 +1,25 @@ +package bridge.storage; + +import bridge.domain.Bridge; +import bridge.domain.GameResult; + +public class BridgeStorage { + private GameResult gameResult; + private Bridge bridge; + + public void saveBridge(final Bridge bridge) { + this.bridge = bridge; + } + + public Bridge findBridge() { + return this.bridge; + } + + public void saveGameResult(final GameResult gameResult) { + this.gameResult = gameResult; + } + + public GameResult findGameResult() { + return this.gameResult; + } +} From fbbe984b0e67b89f1e55e5846a4f55441ee7e9bc Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=EA=B9=80=EC=8A=B9=EC=A7=84?= Date: Thu, 31 Aug 2023 17:05:02 +0900 Subject: [PATCH 25/37] =?UTF-8?q?feat:=20=EB=8B=A4=EB=A6=AC=20=EC=82=AC?= =?UTF-8?q?=EC=9D=B4=EC=A6=88=20=EC=97=B4=EA=B1=B0=ED=98=95=20=EC=B6=94?= =?UTF-8?q?=EA=B0=80=20=EB=B0=8F=20=EC=A0=81=EC=9A=A9?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit 열거형 추가 적용 - BridgeSize --- docs/README.md | 1 + src/main/java/bridge/BridgeMaker.java | 2 -- src/main/java/bridge/constant/BridgeSize.java | 15 +++++++++++++++ src/main/java/bridge/domain/Bridge.java | 9 +++++++-- 4 files changed, 23 insertions(+), 4 deletions(-) create mode 100644 src/main/java/bridge/constant/BridgeSize.java diff --git a/docs/README.md b/docs/README.md index 3b5087040db..6616a3e2531 100644 --- a/docs/README.md +++ b/docs/README.md @@ -86,3 +86,4 @@ - RetryCommand - ErrorMessage - MoveCommand +- BridgeSize diff --git a/src/main/java/bridge/BridgeMaker.java b/src/main/java/bridge/BridgeMaker.java index 4c92c1f4c67..d6ab43c6654 100644 --- a/src/main/java/bridge/BridgeMaker.java +++ b/src/main/java/bridge/BridgeMaker.java @@ -11,8 +11,6 @@ */ public class BridgeMaker { private static final int START_INDEX = 0; - private static final int MIN_BRIDGE_SIZE = 3; - private static final int MAX_BRIDGE_SIZE = 20; private final BridgeNumberGenerator bridgeNumberGenerator; public BridgeMaker(BridgeNumberGenerator bridgeNumberGenerator) { diff --git a/src/main/java/bridge/constant/BridgeSize.java b/src/main/java/bridge/constant/BridgeSize.java new file mode 100644 index 00000000000..48c2d7f3446 --- /dev/null +++ b/src/main/java/bridge/constant/BridgeSize.java @@ -0,0 +1,15 @@ +package bridge.constant; + +public enum BridgeSize { + MIN_BRIDGE_SIZE(3), + MAX_BRIDGE_SIZE(20); + private final int size; + + BridgeSize(int size) { + this.size = size; + } + + public int size() { + return this.size; + } +} diff --git a/src/main/java/bridge/domain/Bridge.java b/src/main/java/bridge/domain/Bridge.java index 8f26021aded..29d65ef36f9 100644 --- a/src/main/java/bridge/domain/Bridge.java +++ b/src/main/java/bridge/domain/Bridge.java @@ -1,15 +1,20 @@ package bridge.domain; +import bridge.constant.BridgeSize; import bridge.constant.BridgeType; import bridge.constant.ErrorMessage; import java.util.Collections; import java.util.List; -public class Bridge { +public final class Bridge { private final List directions; public Bridge(final List directions) { + final int size = directions.size(); + if (size < BridgeSize.MIN_BRIDGE_SIZE.size() || size > BridgeSize.MAX_BRIDGE_SIZE.size()) { + throw new IllegalArgumentException(ErrorMessage.INVALID_BRIDGE_SIZE.toString()); + } this.directions = Collections.unmodifiableList(directions); } @@ -24,7 +29,7 @@ private void validateIndex(final int currentIndex) { } } - public int getLeftSize(final int currentIndex) { + public int getRemainSize(final int currentIndex) { return directions.size() - currentIndex; } } From b44aec20a8a301d3d5113f73e8db59e5cb04b684 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=EA=B9=80=EC=8A=B9=EC=A7=84?= Date: Thu, 31 Aug 2023 18:55:12 +0900 Subject: [PATCH 26/37] =?UTF-8?q?refactor:=20=EC=A4=91=EB=B3=B5=20?= =?UTF-8?q?=EC=97=B4=EA=B1=B0=ED=98=95=20=EC=A0=9C=EA=B1=B0=20=EB=B0=8F=20?= =?UTF-8?q?=ED=86=B5=ED=95=A9?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit 리팩토링 - 열거형 합치는 작업 --- docs/README.md | 3 +-- src/main/java/bridge/constant/MoveCommand.java | 9 --------- src/main/java/bridge/constant/MoveResult.java | 13 ------------- src/main/java/bridge/domain/TryCount.java | 3 ++- src/main/java/bridge/factory/ComponentFactory.java | 8 ++++---- src/main/java/bridge/io/InputProvider.java | 6 +++--- src/main/java/bridge/io/InputValidator.java | 4 ++-- src/main/java/bridge/io/InputView.java | 1 - 8 files changed, 12 insertions(+), 35 deletions(-) delete mode 100644 src/main/java/bridge/constant/MoveCommand.java delete mode 100644 src/main/java/bridge/constant/MoveResult.java diff --git a/docs/README.md b/docs/README.md index 6616a3e2531..f1cd7cfc99b 100644 --- a/docs/README.md +++ b/docs/README.md @@ -81,9 +81,8 @@ ## 구현 열거형 목록 - GameMessage -- BridgeType -- MoveResult - RetryCommand - ErrorMessage - MoveCommand - BridgeSize +- BridgeType diff --git a/src/main/java/bridge/constant/MoveCommand.java b/src/main/java/bridge/constant/MoveCommand.java deleted file mode 100644 index 22781234884..00000000000 --- a/src/main/java/bridge/constant/MoveCommand.java +++ /dev/null @@ -1,9 +0,0 @@ -package bridge.constant; - -public enum MoveCommand { - U, D; - - public static boolean isNotMoveCommand(final String input) { - return !input.equals(U.toString()) && !input.equals(D.toString()); - } -} diff --git a/src/main/java/bridge/constant/MoveResult.java b/src/main/java/bridge/constant/MoveResult.java deleted file mode 100644 index 09eee38523b..00000000000 --- a/src/main/java/bridge/constant/MoveResult.java +++ /dev/null @@ -1,13 +0,0 @@ -package bridge.constant; - -public enum MoveResult { - CONTINUE, FAILED, SUCCESS; - - public boolean isNotContinue() { - return this != CONTINUE; - } - - public boolean isSuccess() { - return this == SUCCESS; - } -} diff --git a/src/main/java/bridge/domain/TryCount.java b/src/main/java/bridge/domain/TryCount.java index 32563839c9c..47daa454056 100644 --- a/src/main/java/bridge/domain/TryCount.java +++ b/src/main/java/bridge/domain/TryCount.java @@ -1,10 +1,11 @@ package bridge.domain; public class TryCount { + private static final int INITIAL_COUNT = 1; private Integer count; public TryCount() { - this.count = 1; + this.count = INITIAL_COUNT; } public void nextCount() { diff --git a/src/main/java/bridge/factory/ComponentFactory.java b/src/main/java/bridge/factory/ComponentFactory.java index 08b98dc52e5..389e5fb7a29 100644 --- a/src/main/java/bridge/factory/ComponentFactory.java +++ b/src/main/java/bridge/factory/ComponentFactory.java @@ -9,7 +9,7 @@ import bridge.io.InputView; import bridge.io.OutputView; import bridge.manager.BridgeGameManager; -import bridge.manager.ResultManager; +import bridge.storage.BridgeStorage; public class ComponentFactory { @@ -18,7 +18,7 @@ public BridgeGameManager bridgeGameManager() { } private BridgeGame bridgeGame() { - return new BridgeGame(resultManager(), bridgeMaker()); + return new BridgeGame(bridgeStorage(), bridgeMaker()); } private OutputView outputView() { @@ -37,8 +37,8 @@ private InputView inputView() { return new InputView(inputValidator()); } - private ResultManager resultManager() { - return new ResultManager(); + private BridgeStorage bridgeStorage() { + return new BridgeStorage(); } private BridgeMaker bridgeMaker() { diff --git a/src/main/java/bridge/io/InputProvider.java b/src/main/java/bridge/io/InputProvider.java index 938d03edbee..02219bd40dc 100644 --- a/src/main/java/bridge/io/InputProvider.java +++ b/src/main/java/bridge/io/InputProvider.java @@ -1,6 +1,6 @@ package bridge.io; -import bridge.constant.MoveCommand; +import bridge.constant.BridgeType; public class InputProvider { private final InputView inputView; @@ -17,10 +17,10 @@ public int bridgeSize() { } } - public MoveCommand moveCommand() { + public BridgeType moveCommand() { while (true) { try { - return MoveCommand.valueOf(inputView.readMoving()); + return BridgeType.valueOf(inputView.readMoving()); } catch (final IllegalArgumentException ignored) {} } } diff --git a/src/main/java/bridge/io/InputValidator.java b/src/main/java/bridge/io/InputValidator.java index 18221ebecea..6283fd168f2 100644 --- a/src/main/java/bridge/io/InputValidator.java +++ b/src/main/java/bridge/io/InputValidator.java @@ -1,7 +1,7 @@ package bridge.io; +import bridge.constant.BridgeType; import bridge.constant.ErrorMessage; -import bridge.constant.MoveCommand; public class InputValidator { private static final Character START_NUMBER = '0'; @@ -32,7 +32,7 @@ private void validateNotBlank(final String input) { } public void validateMoving(final String input) { - if (MoveCommand.isNotMoveCommand(input)) { + if (BridgeType.isNotMoveCommand(input)) { throw new IllegalArgumentException(ErrorMessage.INVALID_MOVE_COMMAND.toString()); } } diff --git a/src/main/java/bridge/io/InputView.java b/src/main/java/bridge/io/InputView.java index 26b4bf88b62..4a2bcd961a2 100644 --- a/src/main/java/bridge/io/InputView.java +++ b/src/main/java/bridge/io/InputView.java @@ -1,6 +1,5 @@ package bridge.io; -import bridge.constant.MoveCommand; import camp.nextstep.edu.missionutils.Console; /** From 6ee84d1e34ad1fe366550ee50aab578317f17383 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=EA=B9=80=EC=8A=B9=EC=A7=84?= Date: Thu, 31 Aug 2023 18:56:35 +0900 Subject: [PATCH 27/37] =?UTF-8?q?feat:=20=EC=A0=95=EB=8B=B5=20=EA=B2=B0?= =?UTF-8?q?=EA=B3=BC=20=EA=B3=84=EC=82=B0=20=EB=A1=9C=EC=A7=81?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit 기능 추가 - 사용자 시도 입력 기능 - 결과 계산 기능 --- docs/README.md | 16 +++---- src/main/java/bridge/BridgeGame.java | 26 ++++++++++- src/main/java/bridge/constant/BridgeType.java | 8 ++++ .../java/bridge/constant/ErrorMessage.java | 5 ++- .../java/bridge/constant/ResultStatus.java | 13 ++++++ src/main/java/bridge/domain/Bridge.java | 37 +++++++++++++--- src/main/java/bridge/domain/GameResult.java | 43 +++++++++++++++++++ .../bridge/manager/BridgeGameManager.java | 32 +++++++------- 8 files changed, 147 insertions(+), 33 deletions(-) diff --git a/docs/README.md b/docs/README.md index f1cd7cfc99b..8feb5018e6b 100644 --- a/docs/README.md +++ b/docs/README.md @@ -5,14 +5,14 @@ - [x] 다리 길이 입력요청 메시지 출력 - [x] 다리 길이 입력 - [x] 입력값 숫자 여부 검증 - - [ ] 입력 숫자 3 이상 20 이하 숫자인지 검증 -- [ ] 다리 생성 - - [ ] 길이에 따른 랜덤 다리 생성 -- [ ] 플레이어 이동 - - [ ] 이동할 칸 입력 - - [ ] 입력값이 U 혹은 D 인지 검증 - - [ ] 이동 가능한 칸인 경우 O 표시 - - [ ] 이동 불가능한 칸인 경우 X 표시 + - [x] 입력 숫자 3 이상 20 이하 숫자인지 검증 +- [x] 다리 생성 + - [x] 길이에 따른 랜덤 다리 생성 +- [x] 플레이어 이동 + - [x] 이동할 칸 입력 + - [x] 입력값이 U 혹은 D 인지 검증 + - [x] 이동 가능한 칸인 경우 O 표시 + - [x] 이동 불가능한 칸인 경우 X 표시 - [ ] 현황 출력 - [ ] 게임 성공 여부 판단 - [ ] 이동 불가능한 칸으로 이동한 경우 실패 diff --git a/src/main/java/bridge/BridgeGame.java b/src/main/java/bridge/BridgeGame.java index ed350de6dbe..dfcbb5c010b 100644 --- a/src/main/java/bridge/BridgeGame.java +++ b/src/main/java/bridge/BridgeGame.java @@ -1,16 +1,34 @@ package bridge; +import bridge.constant.BridgeType; +import bridge.constant.ResultStatus; +import bridge.domain.Bridge; +import bridge.domain.GameResult; +import bridge.storage.BridgeStorage; + /** * 다리 건너기 게임을 관리하는 클래스 */ public class BridgeGame { + private final BridgeStorage bridgeStorage; + private final BridgeMaker bridgeMaker; + + public BridgeGame(final BridgeStorage bridgeStorage, final BridgeMaker bridgeMaker) { + this.bridgeStorage = bridgeStorage; + this.bridgeMaker = bridgeMaker; + } + /** * 사용자가 칸을 이동할 때 사용하는 메서드 *

* 이동을 위해 필요한 메서드의 반환 타입(return type), 인자(parameter)는 자유롭게 추가하거나 변경할 수 있다. */ - public void move() { + public ResultStatus move(final BridgeType bridgeType) { + final Bridge bridge = bridgeStorage.findBridge(); + final GameResult gameResult = bridgeStorage.findGameResult(); + + return gameResult.addResultStatus(bridge, bridgeType); } /** @@ -22,6 +40,12 @@ public void retry() { } public void makeBridge(final int bridgeSize) { + final Bridge bridge = new Bridge(bridgeMaker.makeBridge(bridgeSize)); + bridgeStorage.saveBridge(bridge); + bridgeStorage.saveGameResult(new GameResult()); + } + public GameResult findGameResult() { + return bridgeStorage.findGameResult(); } } diff --git a/src/main/java/bridge/constant/BridgeType.java b/src/main/java/bridge/constant/BridgeType.java index 9c2777319da..76ec1ac43fb 100644 --- a/src/main/java/bridge/constant/BridgeType.java +++ b/src/main/java/bridge/constant/BridgeType.java @@ -19,4 +19,12 @@ public static String getDirectionByClassifier(final int classifier) { .map(Enum::toString) .orElseThrow(() -> new IllegalArgumentException(ErrorMessage.INVALID_CLASSIFIER.toString())); } + + public static boolean isNotMoveCommand(final String input) { + return !input.equals(U.toString()) && !input.equals(D.toString()); + } + + public boolean isUp() { + return this == U; + } } diff --git a/src/main/java/bridge/constant/ErrorMessage.java b/src/main/java/bridge/constant/ErrorMessage.java index ecacd811aef..5d3fc51efdc 100644 --- a/src/main/java/bridge/constant/ErrorMessage.java +++ b/src/main/java/bridge/constant/ErrorMessage.java @@ -3,12 +3,13 @@ public enum ErrorMessage { NOT_NUMERIC_INPUT("숫자만 입력 가능합니다."), BLANK_INPUT("입력값이 비어있습니다."), - INVALID_MOVE_COMMAND(String.format("이동 방향 입력값은 %s 혹은 %s 입니다.", MoveCommand.D, MoveCommand.U)), + INVALID_MOVE_COMMAND(String.format("이동 방향 입력값은 %s 혹은 %s 입니다.", BridgeType.D, BridgeType.U)), INVALID_CLASSIFIER("다리의 숫자 값이 올바르지 않습니다."), + INVALID_BRIDGE_SIZE(String.format("다리의 길이는 %d 이상, %d 이하입니다.", BridgeSize.MIN_BRIDGE_SIZE.size(), BridgeSize.MAX_BRIDGE_SIZE.size())), NO_ELEMENT_LEFT("리스트의 원소가 없습니다."); - private final String message; private static final String ERROR_PREFIX = "[ERROR] "; + private final String message; ErrorMessage(String message) { this.message = message; diff --git a/src/main/java/bridge/constant/ResultStatus.java b/src/main/java/bridge/constant/ResultStatus.java index 0f26470160f..960065a19a8 100644 --- a/src/main/java/bridge/constant/ResultStatus.java +++ b/src/main/java/bridge/constant/ResultStatus.java @@ -3,6 +3,7 @@ public enum ResultStatus { O("O"), X("X"), + CONTINUE("O"), NONE(" "); private final String symbol; @@ -15,4 +16,16 @@ public enum ResultStatus { public String toString() { return this.symbol; } + + public boolean isContinue() { + return this == CONTINUE; + } + + public boolean isSuccess() { + return this == O; + } + + public boolean isCorrect() { + return isContinue() || isSuccess(); + } } diff --git a/src/main/java/bridge/domain/Bridge.java b/src/main/java/bridge/domain/Bridge.java index 29d65ef36f9..f553ca3c7ca 100644 --- a/src/main/java/bridge/domain/Bridge.java +++ b/src/main/java/bridge/domain/Bridge.java @@ -1,14 +1,15 @@ package bridge.domain; -import bridge.constant.BridgeSize; -import bridge.constant.BridgeType; -import bridge.constant.ErrorMessage; +import bridge.constant.*; import java.util.Collections; import java.util.List; public final class Bridge { + private static final int NO_LEFT_ELEMENT = 0; + private static final int INITIAL_INDEX = 0; private final List directions; + private int currentIndex; public Bridge(final List directions) { final int size = directions.size(); @@ -16,11 +17,12 @@ public Bridge(final List directions) { throw new IllegalArgumentException(ErrorMessage.INVALID_BRIDGE_SIZE.toString()); } this.directions = Collections.unmodifiableList(directions); + this.currentIndex = INITIAL_INDEX; } - public BridgeType getNextElement(final int currentIndex) { + public BridgeType getCurrentElement() { validateIndex(currentIndex); - return BridgeType.valueOf(directions.get(currentIndex)); + return BridgeType.valueOf(directions.get(currentIndex++)); } private void validateIndex(final int currentIndex) { @@ -29,7 +31,28 @@ private void validateIndex(final int currentIndex) { } } - public int getRemainSize(final int currentIndex) { - return directions.size() - currentIndex; + private boolean hasNoRemainElement() { + return directions.size() - currentIndex == NO_LEFT_ELEMENT; + } + + public ResultStatus compareToInput(final BridgeType input, final BridgeType answer) { + if (hasNoRemainElement()) { + return checkSuccess(input, answer); + } + return checkContinue(input, answer); + } + + private ResultStatus checkContinue(final BridgeType input, final BridgeType answer) { + if (input == answer) { + return ResultStatus.CONTINUE; + } + return ResultStatus.X; + } + + private ResultStatus checkSuccess(final BridgeType input, final BridgeType answer) { + if (input == answer) { + return ResultStatus.O; + } + return ResultStatus.X; } } diff --git a/src/main/java/bridge/domain/GameResult.java b/src/main/java/bridge/domain/GameResult.java index 6d423c413ed..c5b6e6993c1 100644 --- a/src/main/java/bridge/domain/GameResult.java +++ b/src/main/java/bridge/domain/GameResult.java @@ -1,11 +1,14 @@ package bridge.domain; +import bridge.constant.BridgeType; import bridge.constant.ResultStatus; import java.util.ArrayList; import java.util.List; +import java.util.stream.Collectors; public class GameResult { + private static final String LINE_DELIMITER = "\n"; private static final String START_TAG = "[ "; private static final String END_TAG = " ]"; private static final String SEPARATOR = " | "; @@ -18,4 +21,44 @@ public GameResult() { this.lowerResult = new ArrayList<>(); this.tryCount = new TryCount(); } + + public ResultStatus addResultStatus(final Bridge bridge, final BridgeType input) { + final BridgeType answer = bridge.getCurrentElement(); + final ResultStatus resultStatus = bridge.compareToInput(input, answer); + + classifyResultStatus(answer, resultStatus); + return resultStatus; + } + + private void classifyResultStatus(final BridgeType answer, final ResultStatus resultStatus) { + if (resultStatus.isCorrect()) { + addByAnswerCase(answer, resultStatus, ResultStatus.NONE); + return; + } + addByAnswerCase(answer, ResultStatus.NONE, resultStatus); + } + + private void addByAnswerCase(final BridgeType answer, final ResultStatus resultStatus, final ResultStatus oppositeStatus) { + if (answer.isUp()) { + upperResult.add(resultStatus); + lowerResult.add(oppositeStatus); + return; + } + upperResult.add(oppositeStatus); + lowerResult.add(resultStatus); + } + + @Override + public String toString() { + return toLineString(upperResult) + + LINE_DELIMITER + + toLineString(lowerResult); + } + + private String toLineString(final List line) { + return START_TAG + line.stream() + .map(ResultStatus::toString) + .collect(Collectors.joining(SEPARATOR)) + + END_TAG; + } } diff --git a/src/main/java/bridge/manager/BridgeGameManager.java b/src/main/java/bridge/manager/BridgeGameManager.java index 58fb59de95e..ab0856236a1 100644 --- a/src/main/java/bridge/manager/BridgeGameManager.java +++ b/src/main/java/bridge/manager/BridgeGameManager.java @@ -1,17 +1,18 @@ package bridge.manager; import bridge.BridgeGame; -import bridge.constant.MoveResult; +import bridge.constant.BridgeType; +import bridge.constant.ResultStatus; import bridge.io.OutputView; -import bridge.io.InputManager; +import bridge.io.InputProvider; public class BridgeGameManager { - private final InputManager inputManager; + private final InputProvider inputProvider; private final OutputView outputView; private final BridgeGame bridgeGame; - public BridgeGameManager(final InputManager inputManager, final OutputView outputView, final BridgeGame bridgeGame) { - this.inputManager = inputManager; + public BridgeGameManager(final InputProvider inputProvider, final OutputView outputView, final BridgeGame bridgeGame) { + this.inputProvider = inputProvider; this.outputView = outputView; this.bridgeGame = bridgeGame; } @@ -32,19 +33,19 @@ private void play() { private boolean moveAndCheckRetry() { while (true) { - final MoveResult moveResult = tryMove(); - if (moveResult.isNotContinue()) { - return getRetryStatus(moveResult); + final ResultStatus resultStatus = tryMove(); + if (!resultStatus.isContinue()) { + return getRetryStatus(resultStatus); } - outputView.printMap(); + outputView.printMap(bridgeGame.findGameResult()); } } - private boolean getRetryStatus(final MoveResult moveResult) { - if (moveResult.isSuccess()) { + private boolean getRetryStatus(final ResultStatus resultStatus) { + if (resultStatus.isSuccess()) { return false; } - outputView.printMap(); + outputView.printMap(bridgeGame.findGameResult()); return checkRetry(); } @@ -53,14 +54,15 @@ private boolean checkRetry() { return false; } - private MoveResult tryMove() { + private ResultStatus tryMove() { outputView.printMovingRequest(); - return null; + final BridgeType bridgeType = inputProvider.moveCommand(); + return bridgeGame.move(bridgeType); } private void makeBridge() { outputView.printBridgeSizeRequest(); - final int bridgeSize = inputManager.bridgeSize(); + final int bridgeSize = inputProvider.bridgeSize(); bridgeGame.makeBridge(bridgeSize); } } From 6aea15e5840a1a9711258a8a5667d74676fc12b9 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=EA=B9=80=EC=8A=B9=EC=A7=84?= Date: Thu, 31 Aug 2023 18:57:01 +0900 Subject: [PATCH 28/37] =?UTF-8?q?feat:=20=EB=A7=A4=20=EC=8B=9C=EB=8F=84=20?= =?UTF-8?q?=EA=B2=B0=EA=B3=BC=20=EC=B6=9C=EB=A0=A5=20=EA=B8=B0=EB=8A=A5?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit 기능 추가 - map 출력 기능 --- src/main/java/bridge/io/OutputView.java | 4 +++- 1 file changed, 3 insertions(+), 1 deletion(-) diff --git a/src/main/java/bridge/io/OutputView.java b/src/main/java/bridge/io/OutputView.java index 6ea99949156..a9818e9dcc2 100644 --- a/src/main/java/bridge/io/OutputView.java +++ b/src/main/java/bridge/io/OutputView.java @@ -1,6 +1,7 @@ package bridge.io; import bridge.constant.GameMessage; +import bridge.domain.GameResult; /** * 사용자에게 게임 진행 상황과 결과를 출력하는 역할을 한다. @@ -12,7 +13,8 @@ public class OutputView { *

* 출력을 위해 필요한 메서드의 인자(parameter)는 자유롭게 추가하거나 변경할 수 있다. */ - public void printMap() { + public void printMap(final GameResult gameResult) { + System.out.println(gameResult); } /** From c25bc717e26c33c84ecd38b49d357ff4ca7bc9bb Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=EA=B9=80=EC=8A=B9=EC=A7=84?= Date: Thu, 31 Aug 2023 19:08:49 +0900 Subject: [PATCH 29/37] =?UTF-8?q?feat:=20=EC=9E=AC=EC=8B=9C=EB=8F=84=20?= =?UTF-8?q?=EA=B8=B0=EB=8A=A5?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit 기능 추가 - 재시도 입력 - 재시도 기능 --- docs/README.md | 18 +++++++++--------- src/main/java/bridge/BridgeGame.java | 2 ++ .../java/bridge/constant/ErrorMessage.java | 3 ++- .../java/bridge/constant/RetryCommand.java | 10 +++++++++- src/main/java/bridge/domain/Bridge.java | 4 ++++ src/main/java/bridge/domain/GameResult.java | 6 ++++++ src/main/java/bridge/io/InputProvider.java | 9 +++++++++ src/main/java/bridge/io/InputValidator.java | 7 +++++++ src/main/java/bridge/io/InputView.java | 4 +++- .../java/bridge/manager/BridgeGameManager.java | 5 ++++- 10 files changed, 55 insertions(+), 13 deletions(-) diff --git a/docs/README.md b/docs/README.md index 8feb5018e6b..fdba66c4d4c 100644 --- a/docs/README.md +++ b/docs/README.md @@ -13,17 +13,17 @@ - [x] 입력값이 U 혹은 D 인지 검증 - [x] 이동 가능한 칸인 경우 O 표시 - [x] 이동 불가능한 칸인 경우 X 표시 - - [ ] 현황 출력 -- [ ] 게임 성공 여부 판단 - - [ ] 이동 불가능한 칸으로 이동한 경우 실패 - - [ ] 모두 이동 가능한 칸으로만 이동한 경우 성공 + - [x] 현황 출력 +- [x] 게임 성공 여부 판단 + - [x] 이동 불가능한 칸으로 이동한 경우 실패 + - [x] 모두 이동 가능한 칸으로만 이동한 경우 성공 - [ ] 성공 메시지 출력 - [ ] 총 시도 횟수 출력 -- [ ] 실패시 게임 재시작 여부 판단 - - [ ] 게임 재시작 여부 입력 - - [ ] 입력값 R 혹은 Q 인지 검증 -- [ ] 게임 재시작 - - [ ] 게임 시도 횟수 증가 +- [x] 실패시 게임 재시작 여부 판단 + - [x] 게임 재시작 여부 입력 + - [x] 입력값 R 혹은 Q 인지 검증 +- [x] 게임 재시작 + - [x] 게임 시도 횟수 증가 - [ ] 게임 종료 ## 구현 클래스 목록 diff --git a/src/main/java/bridge/BridgeGame.java b/src/main/java/bridge/BridgeGame.java index dfcbb5c010b..3d245c78c8d 100644 --- a/src/main/java/bridge/BridgeGame.java +++ b/src/main/java/bridge/BridgeGame.java @@ -37,6 +37,8 @@ public ResultStatus move(final BridgeType bridgeType) { * 재시작을 위해 필요한 메서드의 반환 타입(return type), 인자(parameter)는 자유롭게 추가하거나 변경할 수 있다. */ public void retry() { + bridgeStorage.findGameResult().clearAndAddCount(); + bridgeStorage.findBridge().clearIndex(); } public void makeBridge(final int bridgeSize) { diff --git a/src/main/java/bridge/constant/ErrorMessage.java b/src/main/java/bridge/constant/ErrorMessage.java index 5d3fc51efdc..9236633bc69 100644 --- a/src/main/java/bridge/constant/ErrorMessage.java +++ b/src/main/java/bridge/constant/ErrorMessage.java @@ -6,12 +6,13 @@ public enum ErrorMessage { INVALID_MOVE_COMMAND(String.format("이동 방향 입력값은 %s 혹은 %s 입니다.", BridgeType.D, BridgeType.U)), INVALID_CLASSIFIER("다리의 숫자 값이 올바르지 않습니다."), INVALID_BRIDGE_SIZE(String.format("다리의 길이는 %d 이상, %d 이하입니다.", BridgeSize.MIN_BRIDGE_SIZE.size(), BridgeSize.MAX_BRIDGE_SIZE.size())), + INVALID_RETRY_COMMAND(String.format("재시도 여부 입력값은 %s 혹은 %s 입니다.", RetryCommand.R, RetryCommand.Q)), NO_ELEMENT_LEFT("리스트의 원소가 없습니다."); private static final String ERROR_PREFIX = "[ERROR] "; private final String message; - ErrorMessage(String message) { + ErrorMessage(final String message) { this.message = message; } diff --git a/src/main/java/bridge/constant/RetryCommand.java b/src/main/java/bridge/constant/RetryCommand.java index dc13ab4c3c3..583afdce7cb 100644 --- a/src/main/java/bridge/constant/RetryCommand.java +++ b/src/main/java/bridge/constant/RetryCommand.java @@ -1,5 +1,13 @@ package bridge.constant; public enum RetryCommand { - R, Q + R, Q; + + public static boolean isNotRetryCommand(final String input) { + return !input.equals(R.toString()) && !input.equals(Q.toString()); + } + + public boolean isRetry() { + return this == R; + } } diff --git a/src/main/java/bridge/domain/Bridge.java b/src/main/java/bridge/domain/Bridge.java index f553ca3c7ca..3e5bc703a30 100644 --- a/src/main/java/bridge/domain/Bridge.java +++ b/src/main/java/bridge/domain/Bridge.java @@ -55,4 +55,8 @@ private ResultStatus checkSuccess(final BridgeType input, final BridgeType answe } return ResultStatus.X; } + + public void clearIndex() { + currentIndex = INITIAL_INDEX; + } } diff --git a/src/main/java/bridge/domain/GameResult.java b/src/main/java/bridge/domain/GameResult.java index c5b6e6993c1..d9b66ee27b8 100644 --- a/src/main/java/bridge/domain/GameResult.java +++ b/src/main/java/bridge/domain/GameResult.java @@ -61,4 +61,10 @@ private String toLineString(final List line) { .collect(Collectors.joining(SEPARATOR)) + END_TAG; } + + public void clearAndAddCount() { + upperResult.clear(); + lowerResult.clear(); + tryCount.nextCount(); + } } diff --git a/src/main/java/bridge/io/InputProvider.java b/src/main/java/bridge/io/InputProvider.java index 02219bd40dc..1a881da708e 100644 --- a/src/main/java/bridge/io/InputProvider.java +++ b/src/main/java/bridge/io/InputProvider.java @@ -1,6 +1,7 @@ package bridge.io; import bridge.constant.BridgeType; +import bridge.constant.RetryCommand; public class InputProvider { private final InputView inputView; @@ -24,4 +25,12 @@ public BridgeType moveCommand() { } catch (final IllegalArgumentException ignored) {} } } + + public RetryCommand retryCommand() { + while (true) { + try { + return RetryCommand.valueOf(inputView.readGameCommand()); + } catch (final IllegalArgumentException ignored) {} + } + } } diff --git a/src/main/java/bridge/io/InputValidator.java b/src/main/java/bridge/io/InputValidator.java index 6283fd168f2..fb6d0412c24 100644 --- a/src/main/java/bridge/io/InputValidator.java +++ b/src/main/java/bridge/io/InputValidator.java @@ -2,6 +2,7 @@ import bridge.constant.BridgeType; import bridge.constant.ErrorMessage; +import bridge.constant.RetryCommand; public class InputValidator { private static final Character START_NUMBER = '0'; @@ -36,4 +37,10 @@ public void validateMoving(final String input) { throw new IllegalArgumentException(ErrorMessage.INVALID_MOVE_COMMAND.toString()); } } + + public void validateRetryCommand(final String input) { + if (RetryCommand.isNotRetryCommand(input)) { + throw new IllegalArgumentException(ErrorMessage.INVALID_RETRY_COMMAND.toString()); + } + } } diff --git a/src/main/java/bridge/io/InputView.java b/src/main/java/bridge/io/InputView.java index 4a2bcd961a2..5cacaad3276 100644 --- a/src/main/java/bridge/io/InputView.java +++ b/src/main/java/bridge/io/InputView.java @@ -34,6 +34,8 @@ public String readMoving() { * 사용자가 게임을 다시 시도할지 종료할지 여부를 입력받는다. */ public String readGameCommand() { - return null; + final String input = Console.readLine(); + inputValidator.validateRetryCommand(input); + return input; } } diff --git a/src/main/java/bridge/manager/BridgeGameManager.java b/src/main/java/bridge/manager/BridgeGameManager.java index ab0856236a1..bcbbc6538df 100644 --- a/src/main/java/bridge/manager/BridgeGameManager.java +++ b/src/main/java/bridge/manager/BridgeGameManager.java @@ -3,6 +3,7 @@ import bridge.BridgeGame; import bridge.constant.BridgeType; import bridge.constant.ResultStatus; +import bridge.constant.RetryCommand; import bridge.io.OutputView; import bridge.io.InputProvider; @@ -27,6 +28,7 @@ private void play() { boolean isRunning = true; while (isRunning) { isRunning = moveAndCheckRetry(); + bridgeGame.retry(); } outputView.printResult(); } @@ -51,7 +53,8 @@ private boolean getRetryStatus(final ResultStatus resultStatus) { private boolean checkRetry() { outputView.printRetryRequest(); - return false; + final RetryCommand retryCommand = inputProvider.retryCommand(); + return retryCommand.isRetry(); } private ResultStatus tryMove() { From 56b91528712d1636c934c3777dc76c75eae5903b Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=EA=B9=80=EC=8A=B9=EC=A7=84?= Date: Thu, 31 Aug 2023 19:11:16 +0900 Subject: [PATCH 30/37] =?UTF-8?q?feat:=20=EC=9E=85=EB=A0=A5=20=EC=97=90?= =?UTF-8?q?=EB=9F=AC=20=EB=A9=94=EC=8B=9C=EC=A7=80=20=EC=B6=9C=EB=A0=A5=20?= =?UTF-8?q?=EA=B8=B0=EB=8A=A5?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit 기능 추가 - 잘못된 값 입력시 재입력 에러 메시지 출력 --- src/main/java/bridge/io/InputProvider.java | 13 ++++++++++--- 1 file changed, 10 insertions(+), 3 deletions(-) diff --git a/src/main/java/bridge/io/InputProvider.java b/src/main/java/bridge/io/InputProvider.java index 1a881da708e..0762ef74c85 100644 --- a/src/main/java/bridge/io/InputProvider.java +++ b/src/main/java/bridge/io/InputProvider.java @@ -1,6 +1,7 @@ package bridge.io; import bridge.constant.BridgeType; +import bridge.constant.ErrorMessage; import bridge.constant.RetryCommand; public class InputProvider { @@ -14,7 +15,9 @@ public int bridgeSize() { while (true) { try { return Integer.parseInt(inputView.readBridgeSize()); - } catch (final IllegalArgumentException ignored) {} + } catch (final IllegalArgumentException ignored) { + System.out.println(ErrorMessage.INVALID_BRIDGE_SIZE); + } } } @@ -22,7 +25,9 @@ public BridgeType moveCommand() { while (true) { try { return BridgeType.valueOf(inputView.readMoving()); - } catch (final IllegalArgumentException ignored) {} + } catch (final IllegalArgumentException ignored) { + System.out.println(ErrorMessage.INVALID_MOVE_COMMAND); + } } } @@ -30,7 +35,9 @@ public RetryCommand retryCommand() { while (true) { try { return RetryCommand.valueOf(inputView.readGameCommand()); - } catch (final IllegalArgumentException ignored) {} + } catch (final IllegalArgumentException ignored) { + System.out.println(ErrorMessage.INVALID_RETRY_COMMAND); + } } } } From b5d9c8d8b645b39d100b9760782ee89353833b1c Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=EA=B9=80=EC=8A=B9=EC=A7=84?= Date: Thu, 31 Aug 2023 19:20:04 +0900 Subject: [PATCH 31/37] =?UTF-8?q?feat:=20=EA=B2=B0=EA=B3=BC=20=EC=B6=9C?= =?UTF-8?q?=EB=A0=A5=20=EA=B8=B0=EB=8A=A5?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit 기능 추가 - 결과 출력 및 시도 횟수 출력 --- src/main/java/bridge/constant/GameMessage.java | 2 ++ src/main/java/bridge/domain/GameResult.java | 4 ++++ src/main/java/bridge/io/OutputView.java | 5 ++++- src/main/java/bridge/manager/BridgeGameManager.java | 6 ++++-- 4 files changed, 14 insertions(+), 3 deletions(-) diff --git a/src/main/java/bridge/constant/GameMessage.java b/src/main/java/bridge/constant/GameMessage.java index d61b3b7ae94..03002920e02 100644 --- a/src/main/java/bridge/constant/GameMessage.java +++ b/src/main/java/bridge/constant/GameMessage.java @@ -3,6 +3,8 @@ public enum GameMessage { START_GAME("다리 건너기 게임을 시작합니다.\n"), BRIDGE_SIZE_REQUEST("다리의 길이를 입력해주세요."), + FINAL_RESULT("최종 게임 결과"), + SUCCESS("게임 성공 여부: 성공\n총 시도한 횟수: %s"), MOVE_DIRECTION_REQUEST(String.format("이동할 칸을 선택해주세요. (위: %s, 아래: %s)", BridgeType.U, BridgeType.D)), RETRY_REQUEST(String.format("게임을 다시 시도할지 여부를 입력해주세요. (재시도: %s, 종료: %s)", RetryCommand.R, RetryCommand.Q)); diff --git a/src/main/java/bridge/domain/GameResult.java b/src/main/java/bridge/domain/GameResult.java index d9b66ee27b8..b392e353dc7 100644 --- a/src/main/java/bridge/domain/GameResult.java +++ b/src/main/java/bridge/domain/GameResult.java @@ -67,4 +67,8 @@ public void clearAndAddCount() { lowerResult.clear(); tryCount.nextCount(); } + + public TryCount findTryCount() { + return this.tryCount; + } } diff --git a/src/main/java/bridge/io/OutputView.java b/src/main/java/bridge/io/OutputView.java index a9818e9dcc2..2e7e20c3b2b 100644 --- a/src/main/java/bridge/io/OutputView.java +++ b/src/main/java/bridge/io/OutputView.java @@ -22,7 +22,10 @@ public void printMap(final GameResult gameResult) { *

* 출력을 위해 필요한 메서드의 인자(parameter)는 자유롭게 추가하거나 변경할 수 있다. */ - public void printResult() { + public void printResult(final GameResult gameResult) { + System.out.println(GameMessage.FINAL_RESULT); + printMap(gameResult); + System.out.println(String.format(GameMessage.SUCCESS.toString(), gameResult.findTryCount())); } public void printGameStart() { diff --git a/src/main/java/bridge/manager/BridgeGameManager.java b/src/main/java/bridge/manager/BridgeGameManager.java index bcbbc6538df..28d25101028 100644 --- a/src/main/java/bridge/manager/BridgeGameManager.java +++ b/src/main/java/bridge/manager/BridgeGameManager.java @@ -28,9 +28,11 @@ private void play() { boolean isRunning = true; while (isRunning) { isRunning = moveAndCheckRetry(); - bridgeGame.retry(); + if (isRunning) { + bridgeGame.retry(); + } } - outputView.printResult(); + outputView.printResult(bridgeGame.findGameResult()); } private boolean moveAndCheckRetry() { From 689a59e201da9d541dd2c52bfed7073562a1e7e7 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=EA=B9=80=EC=8A=B9=EC=A7=84?= Date: Thu, 31 Aug 2023 19:22:20 +0900 Subject: [PATCH 32/37] =?UTF-8?q?refactor:=20BridgeGame=20=ED=8C=A8?= =?UTF-8?q?=ED=82=A4=EC=A7=80=20=EC=9D=B4=EB=8F=99?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit 리팩토링 - BridgeGame service 패키지로 이동 --- src/main/java/bridge/factory/ComponentFactory.java | 2 +- src/main/java/bridge/manager/BridgeGameManager.java | 2 +- src/main/java/bridge/{ => service}/BridgeGame.java | 3 ++- 3 files changed, 4 insertions(+), 3 deletions(-) rename src/main/java/bridge/{ => service}/BridgeGame.java (97%) diff --git a/src/main/java/bridge/factory/ComponentFactory.java b/src/main/java/bridge/factory/ComponentFactory.java index 389e5fb7a29..8577674c9ac 100644 --- a/src/main/java/bridge/factory/ComponentFactory.java +++ b/src/main/java/bridge/factory/ComponentFactory.java @@ -1,6 +1,6 @@ package bridge.factory; -import bridge.BridgeGame; +import bridge.service.BridgeGame; import bridge.BridgeMaker; import bridge.BridgeNumberGenerator; import bridge.BridgeRandomNumberGenerator; diff --git a/src/main/java/bridge/manager/BridgeGameManager.java b/src/main/java/bridge/manager/BridgeGameManager.java index 28d25101028..895349309a8 100644 --- a/src/main/java/bridge/manager/BridgeGameManager.java +++ b/src/main/java/bridge/manager/BridgeGameManager.java @@ -1,6 +1,6 @@ package bridge.manager; -import bridge.BridgeGame; +import bridge.service.BridgeGame; import bridge.constant.BridgeType; import bridge.constant.ResultStatus; import bridge.constant.RetryCommand; diff --git a/src/main/java/bridge/BridgeGame.java b/src/main/java/bridge/service/BridgeGame.java similarity index 97% rename from src/main/java/bridge/BridgeGame.java rename to src/main/java/bridge/service/BridgeGame.java index 3d245c78c8d..718e27fc7b5 100644 --- a/src/main/java/bridge/BridgeGame.java +++ b/src/main/java/bridge/service/BridgeGame.java @@ -1,5 +1,6 @@ -package bridge; +package bridge.service; +import bridge.BridgeMaker; import bridge.constant.BridgeType; import bridge.constant.ResultStatus; import bridge.domain.Bridge; From 08673156f17e0dce1f0e33163e792222e122867f Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=EA=B9=80=EC=8A=B9=EC=A7=84?= Date: Thu, 31 Aug 2023 19:27:41 +0900 Subject: [PATCH 33/37] =?UTF-8?q?docs(README):=20=EB=A6=AC=EB=93=9C?= =?UTF-8?q?=EB=AF=B8=20=EB=82=B4=EC=9A=A9=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 | 23 ++++++++++++++++++----- 1 file changed, 18 insertions(+), 5 deletions(-) diff --git a/docs/README.md b/docs/README.md index fdba66c4d4c..779f741f6e1 100644 --- a/docs/README.md +++ b/docs/README.md @@ -1,7 +1,7 @@ ## 기능 목록 - [x] 게임 시작 - [x] 게임 시작 메시지 출력 -- [ ] 다리 길이 설정 +- [x] 다리 길이 설정 - [x] 다리 길이 입력요청 메시지 출력 - [x] 다리 길이 입력 - [x] 입력값 숫자 여부 검증 @@ -17,14 +17,14 @@ - [x] 게임 성공 여부 판단 - [x] 이동 불가능한 칸으로 이동한 경우 실패 - [x] 모두 이동 가능한 칸으로만 이동한 경우 성공 - - [ ] 성공 메시지 출력 - - [ ] 총 시도 횟수 출력 + - [x] 성공 메시지 출력 + - [x] 총 시도 횟수 출력 - [x] 실패시 게임 재시작 여부 판단 - [x] 게임 재시작 여부 입력 - [x] 입력값 R 혹은 Q 인지 검증 - [x] 게임 재시작 - [x] 게임 시도 횟수 증가 -- [ ] 게임 종료 +- [x] 게임 종료 ## 구현 클래스 목록 - ComponentFactory @@ -33,10 +33,12 @@ - InputProvider - bridgeSize() - moveCommand() + - retryCommand() - InputValidator - validateBridgeSize() - validateMoving() + - validateRetryCommand() - InputView - readBridgeSize() @@ -48,6 +50,8 @@ - printResult() - printGameStart() - printBridgeSizeRequest() + - printMovingRequest() + - printRetryRequest() - BridgeGameManager - playGame() @@ -58,6 +62,8 @@ - BridgeGame - move() - retry() + - makeBridge() + - findGameResult() - BridgeMaker - makeBridge() @@ -66,12 +72,19 @@ - generate() - Bridge - - getLeftSize() + - getCurrentElement() + - compareToInput() + - clearIndex() - GameResult + - addResultStatus() + - toString() + - clearAndAddCount() + - findTryCount() - TryCount - nextCount() + - toString() - BridgeStorage - saveBridge() From 812d1f14a306fb170d37c78908982dd365374c4b Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=EA=B9=80=EC=8A=B9=EC=A7=84?= Date: Thu, 31 Aug 2023 19:44:10 +0900 Subject: [PATCH 34/37] =?UTF-8?q?refactor:=20=EC=97=90=EB=9F=AC=20?= =?UTF-8?q?=EB=A9=94=EC=8B=9C=EC=A7=80=20=EC=B6=9C=EB=A0=A5=20=EA=B3=B5?= =?UTF-8?q?=ED=86=B5=20=EB=A1=9C=EC=A7=81=20=EB=A9=94=EC=84=9C=EB=93=9C=20?= =?UTF-8?q?=EC=B6=94=EC=B6=9C?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit 리팩토링 - 공통 로직 메서드로 추가 --- src/main/java/bridge/io/InputProvider.java | 29 ++++++++-------------- 1 file changed, 11 insertions(+), 18 deletions(-) diff --git a/src/main/java/bridge/io/InputProvider.java b/src/main/java/bridge/io/InputProvider.java index 0762ef74c85..1967ce54074 100644 --- a/src/main/java/bridge/io/InputProvider.java +++ b/src/main/java/bridge/io/InputProvider.java @@ -1,9 +1,10 @@ package bridge.io; import bridge.constant.BridgeType; -import bridge.constant.ErrorMessage; import bridge.constant.RetryCommand; +import java.util.function.Supplier; + public class InputProvider { private final InputView inputView; @@ -12,31 +13,23 @@ public InputProvider(final InputView inputView) { } public int bridgeSize() { - while (true) { - try { - return Integer.parseInt(inputView.readBridgeSize()); - } catch (final IllegalArgumentException ignored) { - System.out.println(ErrorMessage.INVALID_BRIDGE_SIZE); - } - } + return read(() -> Integer.parseInt(inputView.readBridgeSize())); } public BridgeType moveCommand() { - while (true) { - try { - return BridgeType.valueOf(inputView.readMoving()); - } catch (final IllegalArgumentException ignored) { - System.out.println(ErrorMessage.INVALID_MOVE_COMMAND); - } - } + return read(() -> BridgeType.valueOf(inputView.readMoving())); } public RetryCommand retryCommand() { + return read(() -> RetryCommand.valueOf(inputView.readGameCommand())); + } + + private T read(final Supplier supplier) { while (true) { try { - return RetryCommand.valueOf(inputView.readGameCommand()); - } catch (final IllegalArgumentException ignored) { - System.out.println(ErrorMessage.INVALID_RETRY_COMMAND); + return supplier.get(); + } catch (final IllegalArgumentException e) { + System.out.println(e.getMessage()); } } } From 03cbfd1ad2fe12f814fa8a2d3e276cdaff84bfa1 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=EA=B9=80=EC=8A=B9=EC=A7=84?= Date: Fri, 1 Sep 2023 17:57:56 +0900 Subject: [PATCH 35/37] =?UTF-8?q?refactor:=20final=20=EB=A7=A4=EA=B0=9C?= =?UTF-8?q?=EB=B3=80=EC=88=98=EC=97=90=20=EC=B6=94=EA=B0=80?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit 리팩토링 - final 추가 --- src/main/java/bridge/BridgeMaker.java | 4 ++-- src/main/java/bridge/constant/ErrorMessage.java | 1 - src/main/java/bridge/domain/Bridge.java | 8 ++++++-- src/main/java/bridge/io/InputValidator.java | 9 +-------- 4 files changed, 9 insertions(+), 13 deletions(-) diff --git a/src/main/java/bridge/BridgeMaker.java b/src/main/java/bridge/BridgeMaker.java index d6ab43c6654..11e7508f67a 100644 --- a/src/main/java/bridge/BridgeMaker.java +++ b/src/main/java/bridge/BridgeMaker.java @@ -13,7 +13,7 @@ public class BridgeMaker { private static final int START_INDEX = 0; private final BridgeNumberGenerator bridgeNumberGenerator; - public BridgeMaker(BridgeNumberGenerator bridgeNumberGenerator) { + public BridgeMaker(final BridgeNumberGenerator bridgeNumberGenerator) { this.bridgeNumberGenerator = bridgeNumberGenerator; } @@ -21,7 +21,7 @@ public BridgeMaker(BridgeNumberGenerator bridgeNumberGenerator) { * @param size 다리의 길이 * @return 입력받은 길이에 해당하는 다리 모양. 위 칸이면 "U", 아래 칸이면 "D"로 표현해야 한다. */ - public List makeBridge(int size) { + public List makeBridge(final int size) { return IntStream.range(START_INDEX, size) .mapToObj(i -> getBridgeDirection()) .collect(Collectors.toList()); diff --git a/src/main/java/bridge/constant/ErrorMessage.java b/src/main/java/bridge/constant/ErrorMessage.java index 9236633bc69..d5bb0447b5e 100644 --- a/src/main/java/bridge/constant/ErrorMessage.java +++ b/src/main/java/bridge/constant/ErrorMessage.java @@ -2,7 +2,6 @@ public enum ErrorMessage { NOT_NUMERIC_INPUT("숫자만 입력 가능합니다."), - BLANK_INPUT("입력값이 비어있습니다."), INVALID_MOVE_COMMAND(String.format("이동 방향 입력값은 %s 혹은 %s 입니다.", BridgeType.D, BridgeType.U)), INVALID_CLASSIFIER("다리의 숫자 값이 올바르지 않습니다."), INVALID_BRIDGE_SIZE(String.format("다리의 길이는 %d 이상, %d 이하입니다.", BridgeSize.MIN_BRIDGE_SIZE.size(), BridgeSize.MAX_BRIDGE_SIZE.size())), diff --git a/src/main/java/bridge/domain/Bridge.java b/src/main/java/bridge/domain/Bridge.java index 3e5bc703a30..9be5f977eb4 100644 --- a/src/main/java/bridge/domain/Bridge.java +++ b/src/main/java/bridge/domain/Bridge.java @@ -12,12 +12,16 @@ public final class Bridge { private int currentIndex; public Bridge(final List directions) { + validateSize(directions); + this.directions = Collections.unmodifiableList(directions); + this.currentIndex = INITIAL_INDEX; + } + + private void validateSize(final List directions) { final int size = directions.size(); if (size < BridgeSize.MIN_BRIDGE_SIZE.size() || size > BridgeSize.MAX_BRIDGE_SIZE.size()) { throw new IllegalArgumentException(ErrorMessage.INVALID_BRIDGE_SIZE.toString()); } - this.directions = Collections.unmodifiableList(directions); - this.currentIndex = INITIAL_INDEX; } public BridgeType getCurrentElement() { diff --git a/src/main/java/bridge/io/InputValidator.java b/src/main/java/bridge/io/InputValidator.java index fb6d0412c24..783c1f8a3e4 100644 --- a/src/main/java/bridge/io/InputValidator.java +++ b/src/main/java/bridge/io/InputValidator.java @@ -8,7 +8,6 @@ public class InputValidator { private static final Character START_NUMBER = '0'; private static final Character END_NUMBER = '9'; public void validateBridgeSize(final String input) { - validateNotBlank(input); validateNumeric(input); } @@ -22,16 +21,10 @@ private boolean hasNonNumber(final String input) { return !input.chars().allMatch(this::isNumber); } - private boolean isNumber(int character) { + private boolean isNumber(final int character) { return START_NUMBER <= character && character <= END_NUMBER; } - private void validateNotBlank(final String input) { - if (input.isBlank()) { - throw new IllegalArgumentException(ErrorMessage.BLANK_INPUT.toString()); - } - } - public void validateMoving(final String input) { if (BridgeType.isNotMoveCommand(input)) { throw new IllegalArgumentException(ErrorMessage.INVALID_MOVE_COMMAND.toString()); From 8832bdd18c87fb4f752f4033cf030b0536f1e7b8 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=EA=B9=80=EC=8A=B9=EC=A7=84?= Date: Fri, 1 Sep 2023 17:58:10 +0900 Subject: [PATCH 36/37] =?UTF-8?q?test:=20=ED=85=8C=EC=8A=A4=ED=8A=B8=20?= =?UTF-8?q?=EC=B6=94=EA=B0=80?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit 테스트 - 유닛 테스트 --- src/test/java/bridge/BridgeMakerTest.java | 25 ++++ src/test/java/bridge/domain/BridgeTest.java | 136 ++++++++++++++++++ .../java/bridge/io/InputValidatorTest.java | 34 +++++ .../java/bridge/service/BridgeGameTest.java | 113 +++++++++++++++ .../bridge/storage/BridgeStorageTest.java | 71 +++++++++ 5 files changed, 379 insertions(+) create mode 100644 src/test/java/bridge/BridgeMakerTest.java create mode 100644 src/test/java/bridge/domain/BridgeTest.java create mode 100644 src/test/java/bridge/io/InputValidatorTest.java create mode 100644 src/test/java/bridge/service/BridgeGameTest.java create mode 100644 src/test/java/bridge/storage/BridgeStorageTest.java diff --git a/src/test/java/bridge/BridgeMakerTest.java b/src/test/java/bridge/BridgeMakerTest.java new file mode 100644 index 00000000000..16badf0e44e --- /dev/null +++ b/src/test/java/bridge/BridgeMakerTest.java @@ -0,0 +1,25 @@ +package bridge; + +import org.junit.jupiter.api.DisplayName; +import org.junit.jupiter.api.Test; + +import java.util.List; + +import static org.assertj.core.api.Assertions.assertThat; + +@DisplayName("BridgeMaker의") +class BridgeMakerTest { + private final BridgeMaker bridgeMaker = new BridgeMaker(() -> 0); + + @Test + @DisplayName("다리 만들기가 수행되는가") + void makeBridge() { + //given + + //when + final List bridge = bridgeMaker.makeBridge(3); + + //then + assertThat(bridge).containsExactly("D", "D", "D"); + } +} diff --git a/src/test/java/bridge/domain/BridgeTest.java b/src/test/java/bridge/domain/BridgeTest.java new file mode 100644 index 00000000000..be5e0049450 --- /dev/null +++ b/src/test/java/bridge/domain/BridgeTest.java @@ -0,0 +1,136 @@ +package bridge.domain; + +import bridge.constant.BridgeType; +import bridge.constant.ResultStatus; +import org.junit.jupiter.api.Assertions; +import org.junit.jupiter.api.DisplayName; +import org.junit.jupiter.api.Nested; +import org.junit.jupiter.api.Test; + +import java.util.List; + +import static org.assertj.core.api.Assertions.assertThat; +import static org.assertj.core.api.Assertions.assertThatThrownBy; +import static org.junit.jupiter.api.Assertions.*; + +@DisplayName("Bridge의") +class BridgeTest { + + @Nested + @DisplayName("사이즈 검증 중") + class Validate { + @Test + @DisplayName("3 이하의 size의 리스트가 들어올시 예외가 던져지는가") + void validateSizeLessThan3() { + assertThatThrownBy(() -> new Bridge(List.of("U", "U"))) + .isInstanceOf(IllegalArgumentException.class); + } + + @Test + @DisplayName("3 이하의 size의 리스트가 들어올시 예외가 던져지는가") + void validateSizeGreaterThan20() { + assertThatThrownBy(() -> new Bridge( + List.of("U", "U", "U", "U", "U", + "U", "U", "U", "U", "U", + "U", "U", "U", "U", "U", + "U", "U", "U", "U", "U", + "U"))) + .isInstanceOf(IllegalArgumentException.class); + } + } + + @Nested + @DisplayName("현재 원소 조회 중") + class GetCurrentElement { + @Test + @DisplayName("횟수 내 조회가 수행되는가") + void getCurrentElement() { + //given + final Bridge bridge = new Bridge(List.of("U", "D", "U")); + + //when + final BridgeType U1 = bridge.getCurrentElement(); + final BridgeType D = bridge.getCurrentElement(); + final BridgeType U2 = bridge.getCurrentElement(); + + //then + assertThat(List.of(U1, D, U2)).containsExactly(BridgeType.U, BridgeType.D, BridgeType.U); + } + + @Test + @DisplayName("현재 원소 조회 횟수 초과시 예외가 던져지는가") + void getCurrentElementException() { + //given + final Bridge bridge = new Bridge(List.of("U", "D", "U")); + + final BridgeType U1 = bridge.getCurrentElement(); + final BridgeType D = bridge.getCurrentElement(); + final BridgeType U2 = bridge.getCurrentElement(); + + //when + //then + assertThatThrownBy(bridge::getCurrentElement) + .isInstanceOf(IllegalArgumentException.class); + } + } + + @Nested + @DisplayName("입력값 비교 중") + class CompareToInput { + @Test + @DisplayName("정답과 다른 입력값 비교가 수행되는가") + void compareToInput1() { + //given + final Bridge bridge = new Bridge(List.of("U", "D", "U")); + + //when + final ResultStatus resultStatus = bridge.compareToInput(BridgeType.U, BridgeType.D); + + //then + assertThat(resultStatus).isEqualTo(ResultStatus.X); + } + + @Test + @DisplayName("정답과 동일한 입력값 비교가 수행되는가") + void compareToInput2() { + //given + final Bridge bridge = new Bridge(List.of("U", "D", "U")); + + //when + final ResultStatus resultStatus = bridge.compareToInput(BridgeType.U, BridgeType.U); + + //then + assertThat(resultStatus).isEqualTo(ResultStatus.CONTINUE); + } + + @Test + @DisplayName("정답과 동일한 입력값 비교가 수행되는가") + void compareToInput3() { + //given + final Bridge bridge = new Bridge(List.of("U", "D", "U")); + + //when + final ResultStatus resultStatus1 = bridge.compareToInput(BridgeType.U, BridgeType.U); + final ResultStatus resultStatus2 = bridge.compareToInput(BridgeType.U, BridgeType.U); + final ResultStatus resultStatus3 = bridge.compareToInput(BridgeType.D, BridgeType.U); + + //then + assertThat(resultStatus3).isEqualTo(ResultStatus.X); + } + } + + @Test + @DisplayName("Bridge의") + void clearIndex() { + //given + final Bridge bridge = new Bridge(List.of("U", "D", "U")); + bridge.getCurrentElement(); + + //when + bridge.clearIndex(); + + //then + final BridgeType U = bridge.getCurrentElement(); + assertThat(U).isEqualTo(BridgeType.U); + } +} diff --git a/src/test/java/bridge/io/InputValidatorTest.java b/src/test/java/bridge/io/InputValidatorTest.java new file mode 100644 index 00000000000..1fd02afa5d9 --- /dev/null +++ b/src/test/java/bridge/io/InputValidatorTest.java @@ -0,0 +1,34 @@ +package bridge.io; + +import org.junit.jupiter.api.Test; + +import static org.assertj.core.api.Assertions.assertThatThrownBy; + +class InputValidatorTest { + + private final InputValidator inputValidator = new InputValidator(); + + @Test + void validateBridgeSizeBlank() { + assertThatThrownBy(() -> inputValidator.validateBridgeSize(" ")) + .isInstanceOf(IllegalArgumentException.class); + } + + @Test + void validateBridgeSizeCharacter() { + assertThatThrownBy(() -> inputValidator.validateBridgeSize("s")) + .isInstanceOf(IllegalArgumentException.class); + } + + @Test + void validateMoving() { + assertThatThrownBy(() -> inputValidator.validateMoving("A")) + .isInstanceOf(IllegalArgumentException.class); + } + + @Test + void validateRetryCommand() { + assertThatThrownBy(() -> inputValidator.validateRetryCommand("A")) + .isInstanceOf(IllegalArgumentException.class); + } +} diff --git a/src/test/java/bridge/service/BridgeGameTest.java b/src/test/java/bridge/service/BridgeGameTest.java new file mode 100644 index 00000000000..2bc91bc1baf --- /dev/null +++ b/src/test/java/bridge/service/BridgeGameTest.java @@ -0,0 +1,113 @@ +package bridge.service; + +import bridge.BridgeMaker; +import bridge.constant.BridgeType; +import bridge.constant.ResultStatus; +import bridge.domain.Bridge; +import bridge.domain.GameResult; +import bridge.domain.TryCount; +import bridge.storage.BridgeStorage; +import org.junit.jupiter.api.DisplayName; +import org.junit.jupiter.api.Nested; +import org.junit.jupiter.api.Test; + +import java.util.List; + +import static org.assertj.core.api.Assertions.assertThat; + +@DisplayName("BridgeGame의") +class BridgeGameTest { + private final BridgeStorage bridgeStorage = new BridgeStorage(); + private final BridgeGame bridgeGame = new BridgeGame(bridgeStorage, new BridgeMaker(() -> 1)); + + @Nested + @DisplayName("유저의 이동 시도 중") + class Move { + @Test + @DisplayName("유저의 이동 시도가 수행되는가") + void moveD() { + //given + bridgeGame.makeBridge(3); + + //when + final ResultStatus resultStatus = bridgeGame.move(BridgeType.D); + + //then + assertThat(resultStatus).isEqualTo(ResultStatus.X); + } + + @Test + @DisplayName("유저의 이동 시도가 수행되는가") + void moveU() { + //given + bridgeGame.makeBridge(3); + + //when + final ResultStatus resultStatus = bridgeGame.move(BridgeType.U); + + //then + assertThat(resultStatus).isEqualTo(ResultStatus.CONTINUE); + } + + @Test + @DisplayName("유저의 이동 시도가 수행되는가") + void moveUUU() { + //given + bridgeGame.makeBridge(3); + + //when + final ResultStatus resultStatus1 = bridgeGame.move(BridgeType.U); + final ResultStatus resultStatus2 = bridgeGame.move(BridgeType.U); + final ResultStatus resultStatus3 = bridgeGame.move(BridgeType.U); + + //then + assertThat(resultStatus3).isEqualTo(ResultStatus.O); + } + } + + @Test + @DisplayName("재시도 로직이 수행되는가") + void retry() { + //given + bridgeGame.makeBridge(3); + bridgeGame.move(BridgeType.U); + + //when + bridgeGame.retry(); + + //then + final GameResult gameResult = bridgeGame.findGameResult(); + final TryCount tryCount = gameResult.findTryCount(); + assertThat(tryCount).hasToString(Integer.toString(2)); + } + + @Test + @DisplayName("다리 생성이 수행되는가") + void makeBridge() { + //given + + //when + bridgeGame.makeBridge(3); + + //then + final Bridge bridge = bridgeStorage.findBridge(); + final BridgeType bt1 = bridge.getCurrentElement(); + final BridgeType bt2 = bridge.getCurrentElement(); + final BridgeType bt3 = bridge.getCurrentElement(); + assertThat(List.of(bt1, bt2, bt3)).containsExactly(BridgeType.U, BridgeType.U, BridgeType.U); + } + + @Test + @DisplayName("결과 조회가 수행되는가") + void findGameResult() { + //given + final GameResult expected = new GameResult(); + bridgeStorage.saveGameResult(expected); + + //when + final GameResult gameResult = bridgeGame.findGameResult(); + + //then + assertThat(gameResult).isEqualTo(expected); + } +} diff --git a/src/test/java/bridge/storage/BridgeStorageTest.java b/src/test/java/bridge/storage/BridgeStorageTest.java new file mode 100644 index 00000000000..c4384d8fee6 --- /dev/null +++ b/src/test/java/bridge/storage/BridgeStorageTest.java @@ -0,0 +1,71 @@ +package bridge.storage; + +import bridge.domain.Bridge; +import bridge.domain.GameResult; +import org.junit.jupiter.api.DisplayName; +import org.junit.jupiter.api.Test; + +import java.util.List; + +import static org.assertj.core.api.Assertions.assertThat; + +@DisplayName("BridgeStorage의") +class BridgeStorageTest { + private final BridgeStorage bridgeStorage = new BridgeStorage(); + + @Test + @DisplayName("Bridge 저장이 수행되는가") + void saveBridge() { + //given + final Bridge bridge = new Bridge(List.of("D", "U", "D")); + + //when + bridgeStorage.saveBridge(bridge); + + //then + final Bridge expected = bridgeStorage.findBridge(); + assertThat(bridge).isEqualTo(expected); + } + + @Test + @DisplayName("Bridge 조회가 수행되는가") + void findBridge() { + //given + final Bridge expected = new Bridge(List.of("D", "U", "D")); + bridgeStorage.saveBridge(expected); + + //when + final Bridge bridge = bridgeStorage.findBridge(); + + //then + assertThat(bridge).isEqualTo(expected); + } + + @Test + @DisplayName("GameResult 저장이 수행되는가") + void saveGameResult() { + //given + final GameResult gameResult = new GameResult(); + + //when + bridgeStorage.saveGameResult(gameResult); + + //then + final GameResult expected = bridgeStorage.findGameResult(); + assertThat(gameResult).isEqualTo(expected); + } + + @Test + @DisplayName("GameResult 조회가 수행되는가") + void findGameResult() { + //given + final GameResult expected = new GameResult(); + bridgeStorage.saveGameResult(expected); + + //when + final GameResult gameResult = bridgeStorage.findGameResult(); + + //then + assertThat(gameResult).isEqualTo(expected); + } +} From f08402f8d3abd49c25162d9c8b4b43aae170d616 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=EA=B9=80=EC=8A=B9=EC=A7=84?= Date: Sun, 3 Sep 2023 01:30:29 +0900 Subject: [PATCH 37/37] =?UTF-8?q?test:=20=EC=9E=AC=EC=8B=9C=EB=8F=84=20?= =?UTF-8?q?=ED=85=8C=EC=8A=A4=ED=8A=B8=20=EC=B6=94=EA=B0=80?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit 테스트 추가 - 재시도 테스트 --- src/test/java/bridge/ApplicationTest.java | 18 ++++++++++++++++++ 1 file changed, 18 insertions(+) diff --git a/src/test/java/bridge/ApplicationTest.java b/src/test/java/bridge/ApplicationTest.java index 1a163ec0a2a..6a7df4f16ac 100644 --- a/src/test/java/bridge/ApplicationTest.java +++ b/src/test/java/bridge/ApplicationTest.java @@ -39,6 +39,24 @@ class ApplicationTest extends NsTest { }, 1, 0, 1); } + @Test + void 재시도_기능_테스트() { + assertRandomNumberInRangeTest(() -> { + run("3", "U", "D", "D", "R", "U", "D", "U"); + assertThat(output()).contains( + "최종 게임 결과", + "[ 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(() -> {