From e298f02358d3fb9155aea8e90c370aac5529daba Mon Sep 17 00:00:00 2001 From: MingyeomKim Date: Tue, 12 Dec 2023 19:19:48 +0900 Subject: [PATCH 01/28] =?UTF-8?q?docs:=20=EA=B5=AC=ED=98=84=20=EA=B8=B0?= =?UTF-8?q?=EB=8A=A5=20=EB=AA=A9=EB=A1=9D=20=EC=83=9D=EC=84=B1?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- build.gradle | 2 +- docs/README.md | 47 +++++++++++++++++++++++++++++++++++++++++++++++ 2 files changed, 48 insertions(+), 1 deletion(-) diff --git a/build.gradle b/build.gradle index 9d087b142e3..ee0f309f09d 100644 --- a/build.gradle +++ b/build.gradle @@ -13,7 +13,7 @@ dependencies { java { toolchain { - languageVersion = JavaLanguageVersion.of(11) + languageVersion = JavaLanguageVersion.of(17) } } diff --git a/docs/README.md b/docs/README.md index e69de29bb2d..b2ee5be7ee4 100644 --- a/docs/README.md +++ b/docs/README.md @@ -0,0 +1,47 @@ +# πŸ’ͺ ν”„λ‘œμ νŠΈ κ°œμš” + +건널 수 μžˆλŠ” 닀리λ₯Ό μƒμ„±ν•˜κ³ , ν”Œλ ˆμ΄μ–΄κ°€ 닀리λ₯Ό κ±΄λ„ˆλŠ” κ²Œμž„μ„ κ΅¬ν˜„ν•œλ‹€. + +# πŸ“ κ΅¬ν˜„ κΈ°λŠ₯ λͺ©λ‘ + +### κ²Œμž„ μ‹œμž‘ 문ꡬλ₯Ό 좜λ ₯ν•˜λŠ” κΈ°λŠ₯ + +- [ ] `닀리 κ±΄λ„ˆκΈ° κ²Œμž„μ„ μ‹œμž‘ν•©λ‹ˆλ‹€.`λ₯Ό 좜λ ₯ν•œλ‹€. + +### μžλ™μœΌλ‘œ 닀리λ₯Ό μƒμ„±ν•˜λŠ” κΈ°λŠ₯ + +- [ ] λ‹€λ¦¬μ˜ 길이λ₯Ό μž…λ ₯ν•œλ‹€. + - [ ] `λ‹€λ¦¬μ˜ 길이λ₯Ό μž…λ ₯ν•΄μ£Όμ„Έμš”.`λ₯Ό 좜λ ₯ν•œλ‹€. + - [ ] λ‹€λ¦¬μ˜ 길이λ₯Ό μž…λ ₯λ°›λŠ”λ‹€. + - [ ] 빈 λ¬Έμžμ—΄μ΄ μ•„λ‹˜μ„ κ²€μ¦ν•œλ‹€. + - [ ] 숫자 μž…λ ₯μž„μ„ κ²€μ¦ν•œλ‹€. + - [ ] 3 이상 20μ΄ν•˜μž„μ„ κ²€μ¦ν•œλ‹€. +- [ ] 닀리λ₯Ό μƒμ„±ν•œλ‹€. + - [ ] λ‹€λ¦¬μ˜ 길이만큼 0κ³Ό 1 쀑 λ¬΄μž‘μœ„ 값을 μƒμ„±ν•œλ‹€. + - [ ] 0인 경우 μ•„λž˜ μΉΈ, 1인 경우 μœ„ 칸을 건널 수 μžˆλŠ” 칸으둜 μ €μž₯ν•œλ‹€. + +### ν”Œλ ˆμ΄μ–΄κ°€ 닀리λ₯Ό μ΄λ™ν•˜λŠ” κΈ°λŠ₯ + +- [ ] `이동할 칸을 μ„ νƒν•΄μ£Όμ„Έμš”. (μœ„: U, μ•„λž˜: D)`λ₯Ό 좜λ ₯ν•œλ‹€. +- [ ] ν”Œλ ˆμ΄μ–΄κ°€ 이동할 칸을 μž…λ ₯ν•œλ‹€. + - [ ] 빈 λ¬Έμžμ—΄μ΄ μ•„λ‹˜μ„ κ²€μ¦ν•œλ‹€. + - [ ] U ν˜Ήμ€ D의 μž…λ ₯μž„μ„ κ²€μ¦ν•œλ‹€. +- [ ] ν”Œλ ˆμ΄μ–΄κ°€ μ΄λ™ν•œ 칸이 이동할 수 μžˆλŠ” 칸인지 κ²€μ‚¬ν•œλ‹€. + - [ ] 이동할 수 μžˆλŠ” 칸을 μ„ νƒν•œ 경우 Oλ₯Ό ν‘œμ‹œν•œλ‹€. + - [ ] 이동할 수 μ—†λŠ” 칸을 μ„ νƒν•œ 경우 Xλ₯Ό ν‘œμ‹œν•œλ‹€. + +### κ²Œμž„μ„ μ’…λ£Œν•˜λŠ” κΈ°λŠ₯ + +- [ ] `μ΅œμ’… κ²Œμž„ κ²°κ³Ό`λ₯Ό 좜λ ₯ν•œλ‹€. +- [ ] μ΅œμ’…μ μœΌλ‘œ λ§Œλ“€μ–΄μ§„ λ‹€λ¦¬μ˜ μƒνƒœλ₯Ό 좜λ ₯ν•œλ‹€. +- [ ] `κ²Œμž„ 성곡 μ—¬λΆ€: 성곡`와 같이 κ²Œμž„ 성곡 μ—¬λΆ€λ₯Ό 좜λ ₯ν•œλ‹€. +- [ ] `총 μ‹œλ„ν•œ 횟수: 2`와 같이 총 μ‹œλ„ν•œ 횟수λ₯Ό 좜λ ₯ν•œλ‹€. + +### μΉΈ 이동에 μ‹€νŒ¨ν•œ 경우 μž¬μ‹œλ„ ν˜Ήμ€ μ’…λ£Œ μ—¬λΆ€λ₯Ό μ„ νƒν•˜λŠ” κΈ°λŠ₯ + +- [ ] `κ²Œμž„μ„ λ‹€μ‹œ μ‹œλ„ν• μ§€ μ—¬λΆ€λ₯Ό μž…λ ₯ν•΄μ£Όμ„Έμš”. (μž¬μ‹œλ„: R, μ’…λ£Œ: Q)`λ₯Ό 좜λ ₯ν•œλ‹€. +- [ ] ν”Œλ ˆμ΄μ–΄λŠ” μž¬μ‹œλ„ ν˜Ήμ€ μ’…λ£Œ μ—¬λΆ€λ₯Ό μž…λ ₯ν•œλ‹€. + - [ ] 빈 λ¬Έμžμ—΄μ΄ μ•„λ‹˜μ„ κ²€μ¦ν•œλ‹€. + - [ ] R ν˜Ήμ€ Q의 μž…λ ₯μž„μ„ κ²€μ¦ν•œλ‹€. +- [ ] μž¬μ‹œλ„λ₯Ό μ„ νƒν•œ 경우, μ²˜μŒλΆ€ν„° λ‹€μ‹œ 닀리λ₯Ό μ΄λ™ν•œλ‹€. +- [ ] μ’…λ£Œλ₯Ό μ„ νƒν•œ 경우, κ²Œμž„μ„ μ’…λ£Œν•œλ‹€. From 4ee7441784d0b5e0212229d55864c1b0c544bae7 Mon Sep 17 00:00:00 2001 From: MingyeomKim Date: Tue, 12 Dec 2023 19:25:19 +0900 Subject: [PATCH 02/28] =?UTF-8?q?feat:=20=EC=BB=A4=EC=8A=A4=ED=85=80=20?= =?UTF-8?q?=EC=98=88=EC=99=B8=EC=B2=98=EB=A6=AC=EB=A5=BC=20=EC=9C=84?= =?UTF-8?q?=ED=95=9C=20=ED=81=B4=EB=9E=98=EC=8A=A4=20=EC=83=9D=EC=84=B1?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../bridge/global/exception/CustomException.java | 13 +++++++++++++ .../bridge/global/exception/ErrorMessage.java | 15 +++++++++++++++ 2 files changed, 28 insertions(+) create mode 100644 src/main/java/bridge/global/exception/CustomException.java create mode 100644 src/main/java/bridge/global/exception/ErrorMessage.java diff --git a/src/main/java/bridge/global/exception/CustomException.java b/src/main/java/bridge/global/exception/CustomException.java new file mode 100644 index 00000000000..759725c904b --- /dev/null +++ b/src/main/java/bridge/global/exception/CustomException.java @@ -0,0 +1,13 @@ +package bridge.global.exception; + +public class CustomException extends IllegalArgumentException { + private static final String PREFIX = "[ERROR] "; + + private CustomException(ErrorMessage errorMessage) { + super(PREFIX + errorMessage.getMessage()); + } + + public static CustomException from(ErrorMessage errorMessage) { + return new CustomException(errorMessage); + } +} diff --git a/src/main/java/bridge/global/exception/ErrorMessage.java b/src/main/java/bridge/global/exception/ErrorMessage.java new file mode 100644 index 00000000000..703073982b6 --- /dev/null +++ b/src/main/java/bridge/global/exception/ErrorMessage.java @@ -0,0 +1,15 @@ +package bridge.global.exception; + +public enum ErrorMessage { + BLANK_INPUT_ERROR("빈 λ¬Έμžμ—΄μ΄ μž…λ ₯λ˜μ—ˆμŠ΅λ‹ˆλ‹€."); + + private final String message; + + ErrorMessage(String message) { + this.message = message; + } + + public String getMessage() { + return this.message; + } +} From fb08f8b77381b0c96dd7c7225db49c7fbb4e53bb Mon Sep 17 00:00:00 2001 From: MingyeomKim Date: Tue, 12 Dec 2023 19:25:40 +0900 Subject: [PATCH 03/28] =?UTF-8?q?feat:=20=EC=BD=98=EC=86=94=EC=9D=98=20?= =?UTF-8?q?=EC=9E=85=EC=B6=9C=EB=A0=A5=EC=9D=84=20=EB=8B=B4=EB=8B=B9?= =?UTF-8?q?=ED=95=98=EB=8A=94=20=ED=81=B4=EB=9E=98=EC=8A=A4=20=EC=83=9D?= =?UTF-8?q?=EC=84=B1?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../bridge/view/console/ConsoleReader.java | 24 +++++++++++++++++++ .../bridge/view/console/ConsoleWriter.java | 11 +++++++++ 2 files changed, 35 insertions(+) create mode 100644 src/main/java/bridge/view/console/ConsoleReader.java create mode 100644 src/main/java/bridge/view/console/ConsoleWriter.java diff --git a/src/main/java/bridge/view/console/ConsoleReader.java b/src/main/java/bridge/view/console/ConsoleReader.java new file mode 100644 index 00000000000..78e0c8f72a6 --- /dev/null +++ b/src/main/java/bridge/view/console/ConsoleReader.java @@ -0,0 +1,24 @@ +package bridge.view.console; + +import bridge.global.exception.CustomException; +import bridge.global.exception.ErrorMessage; +import camp.nextstep.edu.missionutils.Console; + +public final class ConsoleReader { + public static String enterMessage() { + return Validator.validate(Console.readLine()); + } + + private static class Validator { + public static String validate(String message) { + validateBlankInput(message); + return message; + } + + private static void validateBlankInput(String message) { + if (message.isBlank()) { + throw CustomException.from(ErrorMessage.BLANK_INPUT_ERROR); + } + } + } +} diff --git a/src/main/java/bridge/view/console/ConsoleWriter.java b/src/main/java/bridge/view/console/ConsoleWriter.java new file mode 100644 index 00000000000..253f9fb5af2 --- /dev/null +++ b/src/main/java/bridge/view/console/ConsoleWriter.java @@ -0,0 +1,11 @@ +package bridge.view.console; + +public final class ConsoleWriter { + public static void printlnMessage(String message) { + System.out.println(message); + } + + public static void printlnFormat(String message, Object... args) { + printlnMessage(String.format(message, args)); + } +} From cfb112cc4c801fbf5e8284859568b7eca025d5a9 Mon Sep 17 00:00:00 2001 From: MingyeomKim Date: Tue, 12 Dec 2023 19:26:17 +0900 Subject: [PATCH 04/28] =?UTF-8?q?feat:=20=EA=B2=8C=EC=9E=84=20=EC=8B=9C?= =?UTF-8?q?=EC=9E=91=20=EB=AC=B8=EA=B5=AC=EB=A5=BC=20=EC=B6=9C=EB=A0=A5?= =?UTF-8?q?=ED=95=98=EB=8A=94=20=EA=B8=B0=EB=8A=A5=20=EA=B5=AC=ED=98=84?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- docs/README.md | 2 +- .../bridge/{ => controller}/BridgeGame.java | 18 +++++++++++++++++- src/main/java/bridge/{ => view}/InputView.java | 2 +- .../java/bridge/{ => view}/OutputView.java | 12 +++++++----- 4 files changed, 26 insertions(+), 8 deletions(-) rename src/main/java/bridge/{ => controller}/BridgeGame.java (61%) rename src/main/java/bridge/{ => view}/InputView.java (96%) rename src/main/java/bridge/{ => view}/OutputView.java (58%) diff --git a/docs/README.md b/docs/README.md index b2ee5be7ee4..a3185bfab95 100644 --- a/docs/README.md +++ b/docs/README.md @@ -6,7 +6,7 @@ ### κ²Œμž„ μ‹œμž‘ 문ꡬλ₯Ό 좜λ ₯ν•˜λŠ” κΈ°λŠ₯ -- [ ] `닀리 κ±΄λ„ˆκΈ° κ²Œμž„μ„ μ‹œμž‘ν•©λ‹ˆλ‹€.`λ₯Ό 좜λ ₯ν•œλ‹€. +- [x] `닀리 κ±΄λ„ˆκΈ° κ²Œμž„μ„ μ‹œμž‘ν•©λ‹ˆλ‹€.`λ₯Ό 좜λ ₯ν•œλ‹€. ### μžλ™μœΌλ‘œ 닀리λ₯Ό μƒμ„±ν•˜λŠ” κΈ°λŠ₯ diff --git a/src/main/java/bridge/BridgeGame.java b/src/main/java/bridge/controller/BridgeGame.java similarity index 61% rename from src/main/java/bridge/BridgeGame.java rename to src/main/java/bridge/controller/BridgeGame.java index 834c1c8362b..c5749ed53da 100644 --- a/src/main/java/bridge/BridgeGame.java +++ b/src/main/java/bridge/controller/BridgeGame.java @@ -1,10 +1,26 @@ -package bridge; +package bridge.controller; + +import bridge.view.InputView; +import bridge.view.OutputView; /** * 닀리 κ±΄λ„ˆκΈ° κ²Œμž„μ„ κ΄€λ¦¬ν•˜λŠ” 클래슀 */ public class BridgeGame { + private final InputView inputView; + private final OutputView outputView; + + public BridgeGame(InputView _inputView, OutputView _outputView) { + this.inputView = _inputView; + this.outputView = _outputView; + outputView.printStartMessage(); + } + + public void run() { + + } + /** * μ‚¬μš©μžκ°€ 칸을 이동할 λ•Œ μ‚¬μš©ν•˜λŠ” λ©”μ„œλ“œ *

diff --git a/src/main/java/bridge/InputView.java b/src/main/java/bridge/view/InputView.java similarity index 96% rename from src/main/java/bridge/InputView.java rename to src/main/java/bridge/view/InputView.java index c3911c8a8e7..4571893fab0 100644 --- a/src/main/java/bridge/InputView.java +++ b/src/main/java/bridge/view/InputView.java @@ -1,4 +1,4 @@ -package bridge; +package bridge.view; /** * μ‚¬μš©μžλ‘œλΆ€ν„° μž…λ ₯을 λ°›λŠ” 역할을 ν•œλ‹€. diff --git a/src/main/java/bridge/OutputView.java b/src/main/java/bridge/view/OutputView.java similarity index 58% rename from src/main/java/bridge/OutputView.java rename to src/main/java/bridge/view/OutputView.java index 69a433a6285..6bf43422c92 100644 --- a/src/main/java/bridge/OutputView.java +++ b/src/main/java/bridge/view/OutputView.java @@ -1,22 +1,24 @@ -package bridge; +package bridge.view; + +import bridge.view.console.ConsoleWriter; /** * μ‚¬μš©μžμ—κ²Œ κ²Œμž„ 진행 상황과 κ²°κ³Όλ₯Ό 좜λ ₯ν•˜λŠ” 역할을 ν•œλ‹€. */ public class OutputView { + public void printStartMessage() { + ConsoleWriter.printlnMessage("닀리 κ±΄λ„ˆκΈ° κ²Œμž„μ„ μ‹œμž‘ν•©λ‹ˆλ‹€."); + } + /** * ν˜„μž¬κΉŒμ§€ μ΄λ™ν•œ λ‹€λ¦¬μ˜ μƒνƒœλ₯Ό 정해진 ν˜•μ‹μ— 맞좰 좜λ ₯ν•œλ‹€. - *

- * 좜λ ₯을 μœ„ν•΄ ν•„μš”ν•œ λ©”μ„œλ“œμ˜ 인자(parameter)λŠ” 자유둭게 μΆ”κ°€ν•˜κ±°λ‚˜ λ³€κ²½ν•  수 μžˆλ‹€. */ public void printMap() { } /** * κ²Œμž„μ˜ μ΅œμ’… κ²°κ³Όλ₯Ό 정해진 ν˜•μ‹μ— 맞좰 좜λ ₯ν•œλ‹€. - *

- * 좜λ ₯을 μœ„ν•΄ ν•„μš”ν•œ λ©”μ„œλ“œμ˜ 인자(parameter)λŠ” 자유둭게 μΆ”κ°€ν•˜κ±°λ‚˜ λ³€κ²½ν•  수 μžˆλ‹€. */ public void printResult() { } From 1b0c0276c5c6af91450a3403ab801f4489b301e9 Mon Sep 17 00:00:00 2001 From: MingyeomKim Date: Tue, 12 Dec 2023 19:41:59 +0900 Subject: [PATCH 05/28] =?UTF-8?q?feat:=20=EB=AC=B4=EC=9E=91=EC=9C=84=20?= =?UTF-8?q?=EA=B0=92=EC=9D=84=20=ED=86=B5=ED=95=B4=20=EB=8B=A4=EB=A6=AC?= =?UTF-8?q?=EB=A5=BC=20=EC=83=9D=EC=84=B1=ED=95=98=EB=8A=94=20=EA=B8=B0?= =?UTF-8?q?=EB=8A=A5=20=EA=B5=AC=ED=98=84?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- docs/README.md | 6 +++--- .../java/bridge/{ => domain}/BridgeMaker.java | 16 ++++++++++++++-- .../bridge/{ => util}/BridgeNumberGenerator.java | 2 +- .../{ => util}/BridgeRandomNumberGenerator.java | 2 +- 4 files changed, 19 insertions(+), 7 deletions(-) rename src/main/java/bridge/{ => domain}/BridgeMaker.java (56%) rename src/main/java/bridge/{ => util}/BridgeNumberGenerator.java (80%) rename src/main/java/bridge/{ => util}/BridgeRandomNumberGenerator.java (94%) diff --git a/docs/README.md b/docs/README.md index a3185bfab95..88f6b0fdbdd 100644 --- a/docs/README.md +++ b/docs/README.md @@ -16,9 +16,9 @@ - [ ] 빈 λ¬Έμžμ—΄μ΄ μ•„λ‹˜μ„ κ²€μ¦ν•œλ‹€. - [ ] 숫자 μž…λ ₯μž„μ„ κ²€μ¦ν•œλ‹€. - [ ] 3 이상 20μ΄ν•˜μž„μ„ κ²€μ¦ν•œλ‹€. -- [ ] 닀리λ₯Ό μƒμ„±ν•œλ‹€. - - [ ] λ‹€λ¦¬μ˜ 길이만큼 0κ³Ό 1 쀑 λ¬΄μž‘μœ„ 값을 μƒμ„±ν•œλ‹€. - - [ ] 0인 경우 μ•„λž˜ μΉΈ, 1인 경우 μœ„ 칸을 건널 수 μžˆλŠ” 칸으둜 μ €μž₯ν•œλ‹€. +- [x] 닀리λ₯Ό μƒμ„±ν•œλ‹€. + - [x] λ‹€λ¦¬μ˜ 길이만큼 0κ³Ό 1 쀑 λ¬΄μž‘μœ„ 값을 μƒμ„±ν•œλ‹€. + - [x] 0인 경우 μ•„λž˜ μΉΈ, 1인 경우 μœ„ 칸을 건널 수 μžˆλŠ” 칸으둜 μ €μž₯ν•œλ‹€. ### ν”Œλ ˆμ΄μ–΄κ°€ 닀리λ₯Ό μ΄λ™ν•˜λŠ” κΈ°λŠ₯ diff --git a/src/main/java/bridge/BridgeMaker.java b/src/main/java/bridge/domain/BridgeMaker.java similarity index 56% rename from src/main/java/bridge/BridgeMaker.java rename to src/main/java/bridge/domain/BridgeMaker.java index 27e9f2cfa7f..b73255b111f 100644 --- a/src/main/java/bridge/BridgeMaker.java +++ b/src/main/java/bridge/domain/BridgeMaker.java @@ -1,5 +1,7 @@ -package bridge; +package bridge.domain; +import bridge.util.BridgeNumberGenerator; +import java.util.ArrayList; import java.util.List; /** @@ -18,6 +20,16 @@ public BridgeMaker(BridgeNumberGenerator bridgeNumberGenerator) { * @return μž…λ ₯받은 길이에 ν•΄λ‹Ήν•˜λŠ” 닀리 λͺ¨μ–‘. μœ„ 칸이면 "U", μ•„λž˜ 칸이면 "D"둜 ν‘œν˜„ν•΄μ•Ό ν•œλ‹€. */ public List makeBridge(int size) { - return null; + List result = new ArrayList<>(); + for (int i = 0; i < size; i++) { + int number = bridgeNumberGenerator.generate(); + if (number == 1) { // μœ„ + result.add("U"); + } + if (number == 0) { // μ•„λž˜ + result.add("D"); + } + } + return result; } } diff --git a/src/main/java/bridge/BridgeNumberGenerator.java b/src/main/java/bridge/util/BridgeNumberGenerator.java similarity index 80% rename from src/main/java/bridge/BridgeNumberGenerator.java rename to src/main/java/bridge/util/BridgeNumberGenerator.java index 56187b71d2d..325bff3c4be 100644 --- a/src/main/java/bridge/BridgeNumberGenerator.java +++ b/src/main/java/bridge/util/BridgeNumberGenerator.java @@ -1,4 +1,4 @@ -package bridge; +package bridge.util; @FunctionalInterface public interface BridgeNumberGenerator { diff --git a/src/main/java/bridge/BridgeRandomNumberGenerator.java b/src/main/java/bridge/util/BridgeRandomNumberGenerator.java similarity index 94% rename from src/main/java/bridge/BridgeRandomNumberGenerator.java rename to src/main/java/bridge/util/BridgeRandomNumberGenerator.java index 4c9cb53e03a..917f6b4eb4f 100644 --- a/src/main/java/bridge/BridgeRandomNumberGenerator.java +++ b/src/main/java/bridge/util/BridgeRandomNumberGenerator.java @@ -1,4 +1,4 @@ -package bridge; +package bridge.util; import camp.nextstep.edu.missionutils.Randoms; From ae08f399173d5781258a9c27d67fabc34921c093 Mon Sep 17 00:00:00 2001 From: MingyeomKim Date: Tue, 12 Dec 2023 19:44:08 +0900 Subject: [PATCH 06/28] =?UTF-8?q?feat:=20`=EB=8B=A4=EB=A6=AC=EC=9D=98=20?= =?UTF-8?q?=EA=B8=B8=EC=9D=B4=EB=A5=BC=20=EC=9E=85=EB=A0=A5=ED=95=B4?= =?UTF-8?q?=EC=A3=BC=EC=84=B8=EC=9A=94.`=20=EC=B6=9C=EB=A0=A5=ED=95=98?= =?UTF-8?q?=EB=8A=94=20=EA=B8=B0=EB=8A=A5=20=EA=B5=AC=ED=98=84?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- docs/README.md | 2 +- src/main/java/bridge/view/InputView.java | 5 ++++- 2 files changed, 5 insertions(+), 2 deletions(-) diff --git a/docs/README.md b/docs/README.md index 88f6b0fdbdd..1731a57d27a 100644 --- a/docs/README.md +++ b/docs/README.md @@ -11,7 +11,7 @@ ### μžλ™μœΌλ‘œ 닀리λ₯Ό μƒμ„±ν•˜λŠ” κΈ°λŠ₯ - [ ] λ‹€λ¦¬μ˜ 길이λ₯Ό μž…λ ₯ν•œλ‹€. - - [ ] `λ‹€λ¦¬μ˜ 길이λ₯Ό μž…λ ₯ν•΄μ£Όμ„Έμš”.`λ₯Ό 좜λ ₯ν•œλ‹€. + - [x] `λ‹€λ¦¬μ˜ 길이λ₯Ό μž…λ ₯ν•΄μ£Όμ„Έμš”.`λ₯Ό 좜λ ₯ν•œλ‹€. - [ ] λ‹€λ¦¬μ˜ 길이λ₯Ό μž…λ ₯λ°›λŠ”λ‹€. - [ ] 빈 λ¬Έμžμ—΄μ΄ μ•„λ‹˜μ„ κ²€μ¦ν•œλ‹€. - [ ] 숫자 μž…λ ₯μž„μ„ κ²€μ¦ν•œλ‹€. diff --git a/src/main/java/bridge/view/InputView.java b/src/main/java/bridge/view/InputView.java index 4571893fab0..c867c8efe99 100644 --- a/src/main/java/bridge/view/InputView.java +++ b/src/main/java/bridge/view/InputView.java @@ -1,5 +1,7 @@ package bridge.view; +import bridge.view.console.ConsoleWriter; + /** * μ‚¬μš©μžλ‘œλΆ€ν„° μž…λ ₯을 λ°›λŠ” 역할을 ν•œλ‹€. */ @@ -9,7 +11,8 @@ public class InputView { * λ‹€λ¦¬μ˜ 길이λ₯Ό μž…λ ₯λ°›λŠ”λ‹€. */ public int readBridgeSize() { - return 0; + ConsoleWriter.printlnMessage("λ‹€λ¦¬μ˜ 길이λ₯Ό μž…λ ₯ν•΄μ£Όμ„Έμš”."); + } /** From a617354788970bf2745232e57a080053b066d11f Mon Sep 17 00:00:00 2001 From: MingyeomKim Date: Tue, 12 Dec 2023 19:48:51 +0900 Subject: [PATCH 07/28] =?UTF-8?q?feat:=20=EC=A0=84=EC=97=AD=EC=9C=BC?= =?UTF-8?q?=EB=A1=9C=20=EC=82=AC=EC=9A=A9=EB=90=98=EB=8A=94=20Vaildator=20?= =?UTF-8?q?=EC=83=9D=EC=84=B1?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../bridge/global/validator/Validator.java | 31 +++++++++++++++++++ 1 file changed, 31 insertions(+) create mode 100644 src/main/java/bridge/global/validator/Validator.java diff --git a/src/main/java/bridge/global/validator/Validator.java b/src/main/java/bridge/global/validator/Validator.java new file mode 100644 index 00000000000..b808fb960a8 --- /dev/null +++ b/src/main/java/bridge/global/validator/Validator.java @@ -0,0 +1,31 @@ +package bridge.global.validator; + +import bridge.global.exception.CustomException; +import bridge.global.exception.ErrorMessage; + +public final class Validator { + public static void validateNumber(String message, ErrorMessage errorMessage) { + if (isNotNumber(message)) { + throw CustomException.from(errorMessage); + } + } + + public static boolean isNotNumber(String str) { + return !str.matches("\\d+"); + } + + private static void validateRange( + int number, + int start, + int end, + ErrorMessage errorMessage + ) { + if (isInvalidRange(number, start, end)) { + throw CustomException.from(errorMessage); + } + } + + private static boolean isInvalidRange(int number, int start, int end) { + return number < start || number > end; + } +} From 99114731940849b9cb1f062e74e131f4d51289f8 Mon Sep 17 00:00:00 2001 From: MingyeomKim Date: Tue, 12 Dec 2023 19:53:22 +0900 Subject: [PATCH 08/28] =?UTF-8?q?feat:=20=EB=8B=A4=EB=A6=AC=EC=9D=98=20?= =?UTF-8?q?=EA=B8=B8=EC=9D=B4=EB=A5=BC=20=EC=9E=85=EB=A0=A5=EB=B0=9B?= =?UTF-8?q?=EB=8A=94=20=EA=B8=B0=EB=8A=A5=20=EA=B5=AC=ED=98=84?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- docs/README.md | 10 +++++----- .../bridge/global/exception/ErrorMessage.java | 4 +++- .../java/bridge/global/validator/Validator.java | 7 ++++--- src/main/java/bridge/view/InputView.java | 16 ++++++++++++++++ 4 files changed, 28 insertions(+), 9 deletions(-) diff --git a/docs/README.md b/docs/README.md index 1731a57d27a..a6991251b05 100644 --- a/docs/README.md +++ b/docs/README.md @@ -10,12 +10,12 @@ ### μžλ™μœΌλ‘œ 닀리λ₯Ό μƒμ„±ν•˜λŠ” κΈ°λŠ₯ -- [ ] λ‹€λ¦¬μ˜ 길이λ₯Ό μž…λ ₯ν•œλ‹€. +- [x] λ‹€λ¦¬μ˜ 길이λ₯Ό μž…λ ₯ν•œλ‹€. - [x] `λ‹€λ¦¬μ˜ 길이λ₯Ό μž…λ ₯ν•΄μ£Όμ„Έμš”.`λ₯Ό 좜λ ₯ν•œλ‹€. - - [ ] λ‹€λ¦¬μ˜ 길이λ₯Ό μž…λ ₯λ°›λŠ”λ‹€. - - [ ] 빈 λ¬Έμžμ—΄μ΄ μ•„λ‹˜μ„ κ²€μ¦ν•œλ‹€. - - [ ] 숫자 μž…λ ₯μž„μ„ κ²€μ¦ν•œλ‹€. - - [ ] 3 이상 20μ΄ν•˜μž„μ„ κ²€μ¦ν•œλ‹€. + - [x] λ‹€λ¦¬μ˜ 길이λ₯Ό μž…λ ₯λ°›λŠ”λ‹€. + - [x] 빈 λ¬Έμžμ—΄μ΄ μ•„λ‹˜μ„ κ²€μ¦ν•œλ‹€. + - [x] 숫자 μž…λ ₯μž„μ„ κ²€μ¦ν•œλ‹€. + - [x] 3 이상 20μ΄ν•˜μž„μ„ κ²€μ¦ν•œλ‹€. - [x] 닀리λ₯Ό μƒμ„±ν•œλ‹€. - [x] λ‹€λ¦¬μ˜ 길이만큼 0κ³Ό 1 쀑 λ¬΄μž‘μœ„ 값을 μƒμ„±ν•œλ‹€. - [x] 0인 경우 μ•„λž˜ μΉΈ, 1인 경우 μœ„ 칸을 건널 수 μžˆλŠ” 칸으둜 μ €μž₯ν•œλ‹€. diff --git a/src/main/java/bridge/global/exception/ErrorMessage.java b/src/main/java/bridge/global/exception/ErrorMessage.java index 703073982b6..a21da30a137 100644 --- a/src/main/java/bridge/global/exception/ErrorMessage.java +++ b/src/main/java/bridge/global/exception/ErrorMessage.java @@ -1,7 +1,9 @@ package bridge.global.exception; public enum ErrorMessage { - BLANK_INPUT_ERROR("빈 λ¬Έμžμ—΄μ΄ μž…λ ₯λ˜μ—ˆμŠ΅λ‹ˆλ‹€."); + BLANK_INPUT_ERROR("빈 λ¬Έμžμ—΄μ΄ μž…λ ₯λ˜μ—ˆμŠ΅λ‹ˆλ‹€."), + NOT_NUMBER_ERROR("μ˜¬λ°”λ₯Έ 숫자λ₯Ό μž…λ ₯ν•΄μ£Όμ„Έμš”."), + BRIDGE_SIZE_RANGE_ERROR("닀리 κΈΈμ΄λŠ” 3λΆ€ν„° 20 μ‚¬μ΄μ˜ μˆ«μžμ—¬μ•Ό ν•©λ‹ˆλ‹€."); private final String message; diff --git a/src/main/java/bridge/global/validator/Validator.java b/src/main/java/bridge/global/validator/Validator.java index b808fb960a8..d6a5fb12522 100644 --- a/src/main/java/bridge/global/validator/Validator.java +++ b/src/main/java/bridge/global/validator/Validator.java @@ -4,17 +4,18 @@ import bridge.global.exception.ErrorMessage; public final class Validator { - public static void validateNumber(String message, ErrorMessage errorMessage) { + public static int validateNumber(String message, ErrorMessage errorMessage) { if (isNotNumber(message)) { throw CustomException.from(errorMessage); } + return Integer.parseInt(message); } - public static boolean isNotNumber(String str) { + private static boolean isNotNumber(String str) { return !str.matches("\\d+"); } - private static void validateRange( + public static void validateRange( int number, int start, int end, diff --git a/src/main/java/bridge/view/InputView.java b/src/main/java/bridge/view/InputView.java index c867c8efe99..c6d3984d858 100644 --- a/src/main/java/bridge/view/InputView.java +++ b/src/main/java/bridge/view/InputView.java @@ -1,5 +1,8 @@ package bridge.view; +import bridge.global.exception.ErrorMessage; +import bridge.global.validator.Validator; +import bridge.view.console.ConsoleReader; import bridge.view.console.ConsoleWriter; /** @@ -12,7 +15,20 @@ public class InputView { */ public int readBridgeSize() { ConsoleWriter.printlnMessage("λ‹€λ¦¬μ˜ 길이λ₯Ό μž…λ ₯ν•΄μ£Όμ„Έμš”."); + return validateBridgeSize(ConsoleReader.enterMessage()); + } + private int validateBridgeSize(String message) { + int size = Validator.validateNumber( + message, + ErrorMessage.NOT_NUMBER_ERROR + ); + Validator.validateRange(size, + 3, + 20, + ErrorMessage.BRIDGE_SIZE_RANGE_ERROR + ); + return size; } /** From 67f1e0bdb0c3db55bc9ae1be89ee75dddd4ea973 Mon Sep 17 00:00:00 2001 From: MingyeomKim Date: Tue, 12 Dec 2023 20:05:28 +0900 Subject: [PATCH 09/28] =?UTF-8?q?feat:=20=ED=94=8C=EB=A0=88=EC=9D=B4?= =?UTF-8?q?=EC=96=B4=EA=B0=80=20=EC=9D=B4=EB=8F=99=ED=95=A0=20=EC=B9=B8?= =?UTF-8?q?=EC=9D=84=20=EC=9E=85=EB=A0=A5=ED=95=98=EB=8A=94=20=EA=B8=B0?= =?UTF-8?q?=EB=8A=A5=20=EA=B5=AC=ED=98=84?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- docs/README.md | 8 ++++---- .../bridge/global/exception/ErrorMessage.java | 3 ++- src/main/java/bridge/view/InputView.java | 15 ++++++++++++++- 3 files changed, 20 insertions(+), 6 deletions(-) diff --git a/docs/README.md b/docs/README.md index a6991251b05..8f27b766bbc 100644 --- a/docs/README.md +++ b/docs/README.md @@ -22,10 +22,10 @@ ### ν”Œλ ˆμ΄μ–΄κ°€ 닀리λ₯Ό μ΄λ™ν•˜λŠ” κΈ°λŠ₯ -- [ ] `이동할 칸을 μ„ νƒν•΄μ£Όμ„Έμš”. (μœ„: U, μ•„λž˜: D)`λ₯Ό 좜λ ₯ν•œλ‹€. -- [ ] ν”Œλ ˆμ΄μ–΄κ°€ 이동할 칸을 μž…λ ₯ν•œλ‹€. - - [ ] 빈 λ¬Έμžμ—΄μ΄ μ•„λ‹˜μ„ κ²€μ¦ν•œλ‹€. - - [ ] U ν˜Ήμ€ D의 μž…λ ₯μž„μ„ κ²€μ¦ν•œλ‹€. +- [x] `이동할 칸을 μ„ νƒν•΄μ£Όμ„Έμš”. (μœ„: U, μ•„λž˜: D)`λ₯Ό 좜λ ₯ν•œλ‹€. +- [x] ν”Œλ ˆμ΄μ–΄κ°€ 이동할 칸을 μž…λ ₯ν•œλ‹€. + - [x] 빈 λ¬Έμžμ—΄μ΄ μ•„λ‹˜μ„ κ²€μ¦ν•œλ‹€. + - [x] U ν˜Ήμ€ D의 μž…λ ₯μž„μ„ κ²€μ¦ν•œλ‹€. - [ ] ν”Œλ ˆμ΄μ–΄κ°€ μ΄λ™ν•œ 칸이 이동할 수 μžˆλŠ” 칸인지 κ²€μ‚¬ν•œλ‹€. - [ ] 이동할 수 μžˆλŠ” 칸을 μ„ νƒν•œ 경우 Oλ₯Ό ν‘œμ‹œν•œλ‹€. - [ ] 이동할 수 μ—†λŠ” 칸을 μ„ νƒν•œ 경우 Xλ₯Ό ν‘œμ‹œν•œλ‹€. diff --git a/src/main/java/bridge/global/exception/ErrorMessage.java b/src/main/java/bridge/global/exception/ErrorMessage.java index a21da30a137..67ede3e0a81 100644 --- a/src/main/java/bridge/global/exception/ErrorMessage.java +++ b/src/main/java/bridge/global/exception/ErrorMessage.java @@ -3,7 +3,8 @@ public enum ErrorMessage { BLANK_INPUT_ERROR("빈 λ¬Έμžμ—΄μ΄ μž…λ ₯λ˜μ—ˆμŠ΅λ‹ˆλ‹€."), NOT_NUMBER_ERROR("μ˜¬λ°”λ₯Έ 숫자λ₯Ό μž…λ ₯ν•΄μ£Όμ„Έμš”."), - BRIDGE_SIZE_RANGE_ERROR("닀리 κΈΈμ΄λŠ” 3λΆ€ν„° 20 μ‚¬μ΄μ˜ μˆ«μžμ—¬μ•Ό ν•©λ‹ˆλ‹€."); + BRIDGE_SIZE_RANGE_ERROR("닀리 κΈΈμ΄λŠ” 3λΆ€ν„° 20 μ‚¬μ΄μ˜ μˆ«μžμ—¬μ•Ό ν•©λ‹ˆλ‹€."), + INVALID_MOVING_MESSAGE("이동할 칸을 잘λͺ» μž…λ ₯ν•˜μ˜€μŠ΅λ‹ˆλ‹€."); private final String message; diff --git a/src/main/java/bridge/view/InputView.java b/src/main/java/bridge/view/InputView.java index c6d3984d858..7eacb610c67 100644 --- a/src/main/java/bridge/view/InputView.java +++ b/src/main/java/bridge/view/InputView.java @@ -1,5 +1,6 @@ package bridge.view; +import bridge.global.exception.CustomException; import bridge.global.exception.ErrorMessage; import bridge.global.validator.Validator; import bridge.view.console.ConsoleReader; @@ -35,7 +36,19 @@ private int validateBridgeSize(String message) { * μ‚¬μš©μžκ°€ 이동할 칸을 μž…λ ₯λ°›λŠ”λ‹€. */ public String readMoving() { - return null; + ConsoleWriter.printlnMessage("이동할 칸을 μ„ νƒν•΄μ£Όμ„Έμš”. (μœ„: U, μ•„λž˜: D)"); + return validateMoving(ConsoleReader.enterMessage()); + } + + private String validateMoving(String message) { + if (isNotMatch(message, "U") && isNotMatch(message, "D")) { + throw CustomException.from(ErrorMessage.INVALID_MOVING_MESSAGE); + } + return message; + } + + private boolean isNotMatch(String actual, String expected) { + return actual.equals(expected); } /** From 4717b5e2109d248f1596afa4be4458dcad68ca90 Mon Sep 17 00:00:00 2001 From: MingyeomKim Date: Tue, 12 Dec 2023 20:16:19 +0900 Subject: [PATCH 10/28] =?UTF-8?q?docs:=20=EA=B5=AC=ED=98=84=20=EA=B8=B0?= =?UTF-8?q?=EB=8A=A5=20=EB=AA=A9=EB=A1=9D=20=EC=88=98=EC=A0=95?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- docs/README.md | 5 ++++- 1 file changed, 4 insertions(+), 1 deletion(-) diff --git a/docs/README.md b/docs/README.md index 8f27b766bbc..7b030c71248 100644 --- a/docs/README.md +++ b/docs/README.md @@ -28,7 +28,10 @@ - [x] U ν˜Ήμ€ D의 μž…λ ₯μž„μ„ κ²€μ¦ν•œλ‹€. - [ ] ν”Œλ ˆμ΄μ–΄κ°€ μ΄λ™ν•œ 칸이 이동할 수 μžˆλŠ” 칸인지 κ²€μ‚¬ν•œλ‹€. - [ ] 이동할 수 μžˆλŠ” 칸을 μ„ νƒν•œ 경우 Oλ₯Ό ν‘œμ‹œν•œλ‹€. - - [ ] 이동할 수 μ—†λŠ” 칸을 μ„ νƒν•œ 경우 Xλ₯Ό ν‘œμ‹œν•œλ‹€. + - [ ] λͺ¨λ“  닀리λ₯Ό μ΄λ™ν•œ 경우 κ²°κ³Όλ₯Ό λ°˜ν™˜ν•œλ‹€. + - [ ] 이동할 수 μ—†λŠ” 칸을 μ„ νƒν•œ 경우 + - [ ] μž¬μ‹œλ„ ν˜Ήμ€ μ’…λ£Œ μ—¬λΆ€λ₯Ό μ„ νƒν•œλ‹€. + - [ ] μ’…λ£Œλ₯Ό μ„ νƒν•œ 경우 κ²°κ³Όλ₯Ό λ°˜ν™˜ν•œλ‹€. ### κ²Œμž„μ„ μ’…λ£Œν•˜λŠ” κΈ°λŠ₯ From 4bec71e97113910b4d52d1ad8d9b2f3fab92b2c8 Mon Sep 17 00:00:00 2001 From: MingyeomKim Date: Tue, 12 Dec 2023 20:40:36 +0900 Subject: [PATCH 11/28] =?UTF-8?q?feat:=20=ED=94=8C=EB=A0=88=EC=9D=B4?= =?UTF-8?q?=EC=96=B4=EA=B0=80=20=EC=9D=B4=EB=8F=99=ED=95=9C=20=EA=B2=B0?= =?UTF-8?q?=EA=B3=BC=EB=A5=BC=20=EC=B6=9C=EB=A0=A5=ED=95=98=EA=B8=B0=20?= =?UTF-8?q?=EC=9C=84=ED=95=9C=20DTO=20=ED=81=B4=EB=9E=98=EC=8A=A4=20?= =?UTF-8?q?=EC=83=9D=EC=84=B1?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- src/main/java/bridge/controller/dto/MovingResult.java | 10 ++++++++++ src/main/java/bridge/controller/dto/SingleMove.java | 7 +++++++ 2 files changed, 17 insertions(+) create mode 100644 src/main/java/bridge/controller/dto/MovingResult.java create mode 100644 src/main/java/bridge/controller/dto/SingleMove.java diff --git a/src/main/java/bridge/controller/dto/MovingResult.java b/src/main/java/bridge/controller/dto/MovingResult.java new file mode 100644 index 00000000000..fd89bd41efb --- /dev/null +++ b/src/main/java/bridge/controller/dto/MovingResult.java @@ -0,0 +1,10 @@ +package bridge.controller.dto; + +import java.util.List; + +public record MovingResult( + List singleMoves, + boolean success, + int count +) { +} diff --git a/src/main/java/bridge/controller/dto/SingleMove.java b/src/main/java/bridge/controller/dto/SingleMove.java new file mode 100644 index 00000000000..a4128858700 --- /dev/null +++ b/src/main/java/bridge/controller/dto/SingleMove.java @@ -0,0 +1,7 @@ +package bridge.controller.dto; + +public record SingleMove( + String direction, // U, D + String success // O, X +) { +} From 6ba9d3a7b832f41e0c42b973d38ce91dd8c21824 Mon Sep 17 00:00:00 2001 From: MingyeomKim Date: Tue, 12 Dec 2023 20:40:51 +0900 Subject: [PATCH 12/28] =?UTF-8?q?feat:=20=ED=94=8C=EB=A0=88=EC=9D=B4?= =?UTF-8?q?=EC=96=B4=EA=B0=80=20=EB=8B=A4=EB=A6=AC=EB=A5=BC=20=EC=9D=B4?= =?UTF-8?q?=EB=8F=99=ED=95=98=EB=8A=94=20=EA=B8=B0=EB=8A=A5=20=EA=B5=AC?= =?UTF-8?q?=ED=98=84?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- docs/README.md | 12 +-- .../java/bridge/controller/BridgeGame.java | 80 ++++++++++++++++++- 2 files changed, 82 insertions(+), 10 deletions(-) diff --git a/docs/README.md b/docs/README.md index 7b030c71248..2f3e745d291 100644 --- a/docs/README.md +++ b/docs/README.md @@ -26,12 +26,12 @@ - [x] ν”Œλ ˆμ΄μ–΄κ°€ 이동할 칸을 μž…λ ₯ν•œλ‹€. - [x] 빈 λ¬Έμžμ—΄μ΄ μ•„λ‹˜μ„ κ²€μ¦ν•œλ‹€. - [x] U ν˜Ήμ€ D의 μž…λ ₯μž„μ„ κ²€μ¦ν•œλ‹€. -- [ ] ν”Œλ ˆμ΄μ–΄κ°€ μ΄λ™ν•œ 칸이 이동할 수 μžˆλŠ” 칸인지 κ²€μ‚¬ν•œλ‹€. - - [ ] 이동할 수 μžˆλŠ” 칸을 μ„ νƒν•œ 경우 Oλ₯Ό ν‘œμ‹œν•œλ‹€. - - [ ] λͺ¨λ“  닀리λ₯Ό μ΄λ™ν•œ 경우 κ²°κ³Όλ₯Ό λ°˜ν™˜ν•œλ‹€. - - [ ] 이동할 수 μ—†λŠ” 칸을 μ„ νƒν•œ 경우 - - [ ] μž¬μ‹œλ„ ν˜Ήμ€ μ’…λ£Œ μ—¬λΆ€λ₯Ό μ„ νƒν•œλ‹€. - - [ ] μ’…λ£Œλ₯Ό μ„ νƒν•œ 경우 κ²°κ³Όλ₯Ό λ°˜ν™˜ν•œλ‹€. +- [x] ν”Œλ ˆμ΄μ–΄κ°€ μ΄λ™ν•œ 칸이 이동할 수 μžˆλŠ” 칸인지 κ²€μ‚¬ν•œλ‹€. + - [x] 이동할 수 μžˆλŠ” 칸을 μ„ νƒν•œ 경우 Oλ₯Ό ν‘œμ‹œν•œλ‹€. + - [x] λͺ¨λ“  닀리λ₯Ό μ΄λ™ν•œ 경우 κ²°κ³Όλ₯Ό λ°˜ν™˜ν•œλ‹€. + - [x] 이동할 수 μ—†λŠ” 칸을 μ„ νƒν•œ 경우 + - [x] μž¬μ‹œλ„ ν˜Ήμ€ μ’…λ£Œ μ—¬λΆ€λ₯Ό μ„ νƒν•œλ‹€. + - [x] μ’…λ£Œλ₯Ό μ„ νƒν•œ 경우 κ²°κ³Όλ₯Ό λ°˜ν™˜ν•œλ‹€. ### κ²Œμž„μ„ μ’…λ£Œν•˜λŠ” κΈ°λŠ₯ diff --git a/src/main/java/bridge/controller/BridgeGame.java b/src/main/java/bridge/controller/BridgeGame.java index c5749ed53da..4d7f5965418 100644 --- a/src/main/java/bridge/controller/BridgeGame.java +++ b/src/main/java/bridge/controller/BridgeGame.java @@ -1,7 +1,14 @@ package bridge.controller; +import bridge.controller.dto.MovingResult; +import bridge.controller.dto.SingleMove; +import bridge.domain.BridgeMaker; import bridge.view.InputView; import bridge.view.OutputView; +import bridge.view.console.ConsoleWriter; +import java.util.ArrayList; +import java.util.List; +import java.util.function.Supplier; /** * 닀리 κ±΄λ„ˆκΈ° κ²Œμž„μ„ κ΄€λ¦¬ν•˜λŠ” 클래슀 @@ -10,23 +17,78 @@ public class BridgeGame { private final InputView inputView; private final OutputView outputView; + private final BridgeMaker bridgeMaker; - public BridgeGame(InputView _inputView, OutputView _outputView) { + public BridgeGame(InputView _inputView, OutputView _outputView, BridgeMaker bridgeMaker) { this.inputView = _inputView; this.outputView = _outputView; + this.bridgeMaker = bridgeMaker; outputView.printStartMessage(); } public void run() { + List bridges = prepare(); + MovingResult movingResult = move(bridges); + outputView.printResult(movingResult); + } + /** + * 닀리λ₯Ό μžλ™μœΌλ‘œ μƒμ„±ν•˜λŠ” λ©”μ„œλ“œ + */ + public List prepare() { + int bridgeSize = retryUntilSuccess(() -> { + return inputView.readBridgeSize(); + }); + return bridgeMaker.makeBridge(bridgeSize); } /** * μ‚¬μš©μžκ°€ 칸을 이동할 λ•Œ μ‚¬μš©ν•˜λŠ” λ©”μ„œλ“œ - *

- * 이동을 μœ„ν•΄ ν•„μš”ν•œ λ©”μ„œλ“œμ˜ λ°˜ν™˜ νƒ€μž…(return type), 인자(parameter)λŠ” 자유둭게 μΆ”κ°€ν•˜κ±°λ‚˜ λ³€κ²½ν•  수 μžˆλ‹€. */ - public void move() { + public MovingResult move(List bridges) { + int count = 0; + while (true) { + List result = tryMove(bridges); + + int size = result.size(); + if (result.get(size - 1).equals("O")) { // 성곡 μ‹œ κ²°κ³Ό λ°˜ν™˜ + return new MovingResult( + result, + true, + count + ); + } + // μ‹€νŒ¨ μ‹œ λ‹€μ‹œ μ‹œλ„ν•  지 μ—¬λΆ€λ₯Ό μž…λ ₯ν•œλ‹€. + String retry = inputView.readGameCommand(); + + // μ‹€νŒ¨ ν›„ μ’…λ£Œλ₯Ό μž…λ ₯ν–ˆμ„ μ‹œ κ²°κ³Όλ₯Ό λ°˜ν™˜ν•œλ‹€. + if (retry.equals("Q")) { + return new MovingResult( + result, + false, + count + ); + } + count++; + } + } + + private List tryMove(List bridges) { + List moves = new ArrayList<>(); + + for (String bridge : bridges) { + String direction = inputView.readMoving(); + if (bridge.equals(direction)) { // μ§€λ‚˜κ°ˆ 수 μžˆλŠ” 경우 + moves.add(new SingleMove(direction, "O")); + outputView.printMap(moves); + continue; + } + // μ§€λ‚˜κ°ˆ 수 μ—†λŠ” 닀리λ₯Ό μ„ νƒν•œ 경우 + moves.add(new SingleMove(direction, "X")); + outputView.printMap(moves); + return moves; + } + return moves; } /** @@ -36,4 +98,14 @@ public void move() { */ public void retry() { } + + private static T retryUntilSuccess(Supplier supplier) { + while (true) { + try { + return supplier.get(); + } catch (IllegalArgumentException e) { + ConsoleWriter.printlnMessage(e.getMessage()); + } + } + } } From b9867bd60aa5da118cf885cba50c0c01670eff25 Mon Sep 17 00:00:00 2001 From: MingyeomKim Date: Tue, 12 Dec 2023 21:01:33 +0900 Subject: [PATCH 13/28] =?UTF-8?q?feat:=20=ED=98=84=EC=9E=AC=20=EB=8B=A4?= =?UTF-8?q?=EB=A6=AC=20=EC=9D=B4=EB=8F=99=20=EC=83=81=ED=83=9C=EB=A5=BC=20?= =?UTF-8?q?=EC=B6=9C=EB=A0=A5=ED=95=98=EB=8A=94=20=EA=B8=B0=EB=8A=A5=20?= =?UTF-8?q?=EA=B5=AC=ED=98=84?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- src/main/java/bridge/view/OutputView.java | 37 +++++++++++++++++++++-- 1 file changed, 35 insertions(+), 2 deletions(-) diff --git a/src/main/java/bridge/view/OutputView.java b/src/main/java/bridge/view/OutputView.java index 6bf43422c92..e1ed900f056 100644 --- a/src/main/java/bridge/view/OutputView.java +++ b/src/main/java/bridge/view/OutputView.java @@ -1,12 +1,19 @@ package bridge.view; +import bridge.controller.dto.MovingResult; +import bridge.controller.dto.SingleMove; import bridge.view.console.ConsoleWriter; +import java.util.ArrayList; +import java.util.List; /** * μ‚¬μš©μžμ—κ²Œ κ²Œμž„ 진행 상황과 κ²°κ³Όλ₯Ό 좜λ ₯ν•˜λŠ” 역할을 ν•œλ‹€. */ public class OutputView { + private static final String NONE = " "; + private static final String SINGLE_MAP_FORMAT = " | %s"; + public void printStartMessage() { ConsoleWriter.printlnMessage("닀리 κ±΄λ„ˆκΈ° κ²Œμž„μ„ μ‹œμž‘ν•©λ‹ˆλ‹€."); } @@ -14,12 +21,38 @@ public void printStartMessage() { /** * ν˜„μž¬κΉŒμ§€ μ΄λ™ν•œ λ‹€λ¦¬μ˜ μƒνƒœλ₯Ό 정해진 ν˜•μ‹μ— 맞좰 좜λ ₯ν•œλ‹€. */ - public void printMap() { + public void printMap(List moves) { + List up = new ArrayList<>(); + List down = new ArrayList<>(); + for (SingleMove move : moves) { + if (move.direction() == "U") { + up.add(move.success()); + down.add(NONE); + } + if (move.direction() == "D") { + up.add(NONE); + down.add(move.success()); + } + } + ConsoleWriter.printlnMessage(generateSingleMapRow(up)); + ConsoleWriter.printlnMessage(generateSingleMapRow(down)); + } + + public String generateSingleMapRow(List map) { + int size = map.size(); + if (size == 1) { + return "[ " + map.get(0) + " ]"; + } + String head = "[ " + map.get(0); + for (int i = 1; i < size; i++) { + head += String.format(SINGLE_MAP_FORMAT, map.get(i)); + } + return head + " ]"; } /** * κ²Œμž„μ˜ μ΅œμ’… κ²°κ³Όλ₯Ό 정해진 ν˜•μ‹μ— 맞좰 좜λ ₯ν•œλ‹€. */ - public void printResult() { + public void printResult(MovingResult result) { } } From 6c73a481df571b86919eb50f54696ab7dd8337ba Mon Sep 17 00:00:00 2001 From: MingyeomKim Date: Tue, 12 Dec 2023 21:05:47 +0900 Subject: [PATCH 14/28] =?UTF-8?q?feat:=20=EA=B2=8C=EC=9E=84=EC=9D=84=20?= =?UTF-8?q?=EC=A2=85=EB=A3=8C=ED=95=98=EA=B3=A0=20=EA=B2=B0=EA=B3=BC?= =?UTF-8?q?=EB=A5=BC=20=EC=B6=9C=EB=A0=A5=ED=95=98=EB=8A=94=20=EA=B8=B0?= =?UTF-8?q?=EB=8A=A5=20=EA=B5=AC=ED=98=84?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- docs/README.md | 8 ++++---- src/main/java/bridge/controller/BridgeGame.java | 4 ++-- src/main/java/bridge/controller/dto/MovingResult.java | 2 +- src/main/java/bridge/view/OutputView.java | 6 ++++++ 4 files changed, 13 insertions(+), 7 deletions(-) diff --git a/docs/README.md b/docs/README.md index 2f3e745d291..8d21237b3e3 100644 --- a/docs/README.md +++ b/docs/README.md @@ -35,10 +35,10 @@ ### κ²Œμž„μ„ μ’…λ£Œν•˜λŠ” κΈ°λŠ₯ -- [ ] `μ΅œμ’… κ²Œμž„ κ²°κ³Ό`λ₯Ό 좜λ ₯ν•œλ‹€. -- [ ] μ΅œμ’…μ μœΌλ‘œ λ§Œλ“€μ–΄μ§„ λ‹€λ¦¬μ˜ μƒνƒœλ₯Ό 좜λ ₯ν•œλ‹€. -- [ ] `κ²Œμž„ 성곡 μ—¬λΆ€: 성곡`와 같이 κ²Œμž„ 성곡 μ—¬λΆ€λ₯Ό 좜λ ₯ν•œλ‹€. -- [ ] `총 μ‹œλ„ν•œ 횟수: 2`와 같이 총 μ‹œλ„ν•œ 횟수λ₯Ό 좜λ ₯ν•œλ‹€. +- [x] `μ΅œμ’… κ²Œμž„ κ²°κ³Ό`λ₯Ό 좜λ ₯ν•œλ‹€. +- [x] μ΅œμ’…μ μœΌλ‘œ λ§Œλ“€μ–΄μ§„ λ‹€λ¦¬μ˜ μƒνƒœλ₯Ό 좜λ ₯ν•œλ‹€. +- [x] `κ²Œμž„ 성곡 μ—¬λΆ€: 성곡`와 같이 κ²Œμž„ 성곡 μ—¬λΆ€λ₯Ό 좜λ ₯ν•œλ‹€. +- [x] `총 μ‹œλ„ν•œ 횟수: 2`와 같이 총 μ‹œλ„ν•œ 횟수λ₯Ό 좜λ ₯ν•œλ‹€. ### μΉΈ 이동에 μ‹€νŒ¨ν•œ 경우 μž¬μ‹œλ„ ν˜Ήμ€ μ’…λ£Œ μ—¬λΆ€λ₯Ό μ„ νƒν•˜λŠ” κΈ°λŠ₯ diff --git a/src/main/java/bridge/controller/BridgeGame.java b/src/main/java/bridge/controller/BridgeGame.java index 4d7f5965418..953bdc55ada 100644 --- a/src/main/java/bridge/controller/BridgeGame.java +++ b/src/main/java/bridge/controller/BridgeGame.java @@ -54,7 +54,7 @@ public MovingResult move(List bridges) { if (result.get(size - 1).equals("O")) { // 성곡 μ‹œ κ²°κ³Ό λ°˜ν™˜ return new MovingResult( result, - true, + "성곡", count ); } @@ -65,7 +65,7 @@ public MovingResult move(List bridges) { if (retry.equals("Q")) { return new MovingResult( result, - false, + "μ‹€νŒ¨", count ); } diff --git a/src/main/java/bridge/controller/dto/MovingResult.java b/src/main/java/bridge/controller/dto/MovingResult.java index fd89bd41efb..62bdb4dd14d 100644 --- a/src/main/java/bridge/controller/dto/MovingResult.java +++ b/src/main/java/bridge/controller/dto/MovingResult.java @@ -4,7 +4,7 @@ public record MovingResult( List singleMoves, - boolean success, + String success, int count ) { } diff --git a/src/main/java/bridge/view/OutputView.java b/src/main/java/bridge/view/OutputView.java index e1ed900f056..42dd310b9ef 100644 --- a/src/main/java/bridge/view/OutputView.java +++ b/src/main/java/bridge/view/OutputView.java @@ -13,6 +13,8 @@ public class OutputView { private static final String NONE = " "; private static final String SINGLE_MAP_FORMAT = " | %s"; + private static final String GAME_RESULT_MESSAGE = "κ²Œμž„ 성곡 μ—¬λΆ€ : %s"; + private static final String TRY_COUNT_MESSAGE = "총 μ‹œλ„ν•œ 횟수 : %d"; public void printStartMessage() { ConsoleWriter.printlnMessage("닀리 κ±΄λ„ˆκΈ° κ²Œμž„μ„ μ‹œμž‘ν•©λ‹ˆλ‹€."); @@ -54,5 +56,9 @@ public String generateSingleMapRow(List map) { * κ²Œμž„μ˜ μ΅œμ’… κ²°κ³Όλ₯Ό 정해진 ν˜•μ‹μ— 맞좰 좜λ ₯ν•œλ‹€. */ public void printResult(MovingResult result) { + ConsoleWriter.printlnMessage("μ΅œμ’… κ²Œμž„ κ²°κ³Ό"); + printMap(result.singleMoves()); + ConsoleWriter.printlnFormat(GAME_RESULT_MESSAGE, result.success()); + ConsoleWriter.printlnFormat(TRY_COUNT_MESSAGE, result.count()); } } From 10d5d9169da8348f55910f3a01df770a08885179 Mon Sep 17 00:00:00 2001 From: MingyeomKim Date: Tue, 12 Dec 2023 21:08:54 +0900 Subject: [PATCH 15/28] =?UTF-8?q?feat:=20=EA=B2=8C=EC=9E=84=EC=9D=98=20?= =?UTF-8?q?=EC=9E=AC=EC=8B=9C=EB=8F=84=20=ED=98=B9=EC=9D=80=20=EC=A2=85?= =?UTF-8?q?=EB=A3=8C=20=EC=97=AC=EB=B6=80=EB=A5=BC=20=EC=9E=85=EB=A0=A5?= =?UTF-8?q?=ED=95=98=EB=8A=94=20=EA=B8=B0=EB=8A=A5=20=EA=B5=AC=ED=98=84?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- docs/README.md | 8 ++++---- .../java/bridge/global/exception/ErrorMessage.java | 3 ++- src/main/java/bridge/view/InputView.java | 10 +++++++++- 3 files changed, 15 insertions(+), 6 deletions(-) diff --git a/docs/README.md b/docs/README.md index 8d21237b3e3..8822d08c741 100644 --- a/docs/README.md +++ b/docs/README.md @@ -42,9 +42,9 @@ ### μΉΈ 이동에 μ‹€νŒ¨ν•œ 경우 μž¬μ‹œλ„ ν˜Ήμ€ μ’…λ£Œ μ—¬λΆ€λ₯Ό μ„ νƒν•˜λŠ” κΈ°λŠ₯ -- [ ] `κ²Œμž„μ„ λ‹€μ‹œ μ‹œλ„ν• μ§€ μ—¬λΆ€λ₯Ό μž…λ ₯ν•΄μ£Όμ„Έμš”. (μž¬μ‹œλ„: R, μ’…λ£Œ: Q)`λ₯Ό 좜λ ₯ν•œλ‹€. -- [ ] ν”Œλ ˆμ΄μ–΄λŠ” μž¬μ‹œλ„ ν˜Ήμ€ μ’…λ£Œ μ—¬λΆ€λ₯Ό μž…λ ₯ν•œλ‹€. - - [ ] 빈 λ¬Έμžμ—΄μ΄ μ•„λ‹˜μ„ κ²€μ¦ν•œλ‹€. - - [ ] R ν˜Ήμ€ Q의 μž…λ ₯μž„μ„ κ²€μ¦ν•œλ‹€. +- [x] `κ²Œμž„μ„ λ‹€μ‹œ μ‹œλ„ν• μ§€ μ—¬λΆ€λ₯Ό μž…λ ₯ν•΄μ£Όμ„Έμš”. (μž¬μ‹œλ„: R, μ’…λ£Œ: Q)`λ₯Ό 좜λ ₯ν•œλ‹€. +- [x] ν”Œλ ˆμ΄μ–΄λŠ” μž¬μ‹œλ„ ν˜Ήμ€ μ’…λ£Œ μ—¬λΆ€λ₯Ό μž…λ ₯ν•œλ‹€. + - [x] 빈 λ¬Έμžμ—΄μ΄ μ•„λ‹˜μ„ κ²€μ¦ν•œλ‹€. + - [x] R ν˜Ήμ€ Q의 μž…λ ₯μž„μ„ κ²€μ¦ν•œλ‹€. - [ ] μž¬μ‹œλ„λ₯Ό μ„ νƒν•œ 경우, μ²˜μŒλΆ€ν„° λ‹€μ‹œ 닀리λ₯Ό μ΄λ™ν•œλ‹€. - [ ] μ’…λ£Œλ₯Ό μ„ νƒν•œ 경우, κ²Œμž„μ„ μ’…λ£Œν•œλ‹€. diff --git a/src/main/java/bridge/global/exception/ErrorMessage.java b/src/main/java/bridge/global/exception/ErrorMessage.java index 67ede3e0a81..9bb9d7840b0 100644 --- a/src/main/java/bridge/global/exception/ErrorMessage.java +++ b/src/main/java/bridge/global/exception/ErrorMessage.java @@ -4,7 +4,8 @@ public enum ErrorMessage { BLANK_INPUT_ERROR("빈 λ¬Έμžμ—΄μ΄ μž…λ ₯λ˜μ—ˆμŠ΅λ‹ˆλ‹€."), NOT_NUMBER_ERROR("μ˜¬λ°”λ₯Έ 숫자λ₯Ό μž…λ ₯ν•΄μ£Όμ„Έμš”."), BRIDGE_SIZE_RANGE_ERROR("닀리 κΈΈμ΄λŠ” 3λΆ€ν„° 20 μ‚¬μ΄μ˜ μˆ«μžμ—¬μ•Ό ν•©λ‹ˆλ‹€."), - INVALID_MOVING_MESSAGE("이동할 칸을 잘λͺ» μž…λ ₯ν•˜μ˜€μŠ΅λ‹ˆλ‹€."); + INVALID_MOVING_MESSAGE("이동할 칸을 잘λͺ» μž…λ ₯ν•˜μ˜€μŠ΅λ‹ˆλ‹€."), + INVALID_GAME_COMMAND("μž¬μ‹œλ„ ν˜Ήμ€ μ’…λ£Œ μ—¬λΆ€λ₯Ό 잘λͺ» μž…λ ₯ν•˜μ˜€μŠ΅λ‹ˆλ‹€."); private final String message; diff --git a/src/main/java/bridge/view/InputView.java b/src/main/java/bridge/view/InputView.java index 7eacb610c67..e244e21efe9 100644 --- a/src/main/java/bridge/view/InputView.java +++ b/src/main/java/bridge/view/InputView.java @@ -55,6 +55,14 @@ private boolean isNotMatch(String actual, String expected) { * μ‚¬μš©μžκ°€ κ²Œμž„μ„ λ‹€μ‹œ μ‹œλ„ν• μ§€ μ’…λ£Œν• μ§€ μ—¬λΆ€λ₯Ό μž…λ ₯λ°›λŠ”λ‹€. */ public String readGameCommand() { - return null; + ConsoleWriter.printlnMessage("κ²Œμž„μ„ λ‹€μ‹œ μ‹œλ„ν• μ§€ μ—¬λΆ€λ₯Ό μž…λ ₯ν•΄μ£Όμ„Έμš”. (μž¬μ‹œλ„: R, μ’…λ£Œ: Q)"); + return validateGameCommand(ConsoleReader.enterMessage()); + } + + private String validateGameCommand(String message) { + if (isNotMatch(message, "R") && isNotMatch(message, "Q")) { + throw CustomException.from(ErrorMessage.INVALID_GAME_COMMAND); + } + return message; } } From 7a1d7cdc027a262feebbf97b8dd9d4d10a0871c2 Mon Sep 17 00:00:00 2001 From: MingyeomKim Date: Tue, 12 Dec 2023 21:48:15 +0900 Subject: [PATCH 16/28] =?UTF-8?q?feat:=20=EA=B8=B0=EB=8A=A5=20=EA=B5=AC?= =?UTF-8?q?=ED=98=84=20=EB=AA=A9=EB=A1=9D=20=EC=B2=B4=ED=81=AC=20=EB=B0=8F?= =?UTF-8?q?=20=EA=B2=8C=EC=9E=84=20=EC=8B=A4=ED=96=89?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- docs/README.md | 4 ++-- src/main/java/bridge/Application.java | 13 ++++++++++++- 2 files changed, 14 insertions(+), 3 deletions(-) diff --git a/docs/README.md b/docs/README.md index 8822d08c741..897edaf2007 100644 --- a/docs/README.md +++ b/docs/README.md @@ -46,5 +46,5 @@ - [x] ν”Œλ ˆμ΄μ–΄λŠ” μž¬μ‹œλ„ ν˜Ήμ€ μ’…λ£Œ μ—¬λΆ€λ₯Ό μž…λ ₯ν•œλ‹€. - [x] 빈 λ¬Έμžμ—΄μ΄ μ•„λ‹˜μ„ κ²€μ¦ν•œλ‹€. - [x] R ν˜Ήμ€ Q의 μž…λ ₯μž„μ„ κ²€μ¦ν•œλ‹€. -- [ ] μž¬μ‹œλ„λ₯Ό μ„ νƒν•œ 경우, μ²˜μŒλΆ€ν„° λ‹€μ‹œ 닀리λ₯Ό μ΄λ™ν•œλ‹€. -- [ ] μ’…λ£Œλ₯Ό μ„ νƒν•œ 경우, κ²Œμž„μ„ μ’…λ£Œν•œλ‹€. +- [x] μž¬μ‹œλ„λ₯Ό μ„ νƒν•œ 경우, μ²˜μŒλΆ€ν„° λ‹€μ‹œ 닀리λ₯Ό μ΄λ™ν•œλ‹€. +- [x] μ’…λ£Œλ₯Ό μ„ νƒν•œ 경우, κ²Œμž„μ„ μ’…λ£Œν•œλ‹€. diff --git a/src/main/java/bridge/Application.java b/src/main/java/bridge/Application.java index 5cb72dfd3de..96353888e0f 100644 --- a/src/main/java/bridge/Application.java +++ b/src/main/java/bridge/Application.java @@ -1,8 +1,19 @@ package bridge; +import bridge.controller.BridgeGame; +import bridge.domain.BridgeMaker; +import bridge.util.BridgeRandomNumberGenerator; +import bridge.view.InputView; +import bridge.view.OutputView; + public class Application { public static void main(String[] args) { - // TODO: ν”„λ‘œκ·Έλž¨ κ΅¬ν˜„ + BridgeGame bridgeGame = new BridgeGame( + new InputView(), + new OutputView(), + new BridgeMaker(new BridgeRandomNumberGenerator()) + ); + bridgeGame.run(); } } From 9d0d6bd59bd0224ae9d5f2e170188c971b0630c7 Mon Sep 17 00:00:00 2001 From: MingyeomKim Date: Tue, 12 Dec 2023 21:48:33 +0900 Subject: [PATCH 17/28] =?UTF-8?q?feat:=20=EC=98=A4=EB=A5=98=20=EB=B0=9C?= =?UTF-8?q?=EC=83=9D=20=EC=8B=9C=20=EB=8B=A4=EC=8B=9C=20=EC=9E=85=EB=A0=A5?= =?UTF-8?q?=EB=B0=9B=EB=8A=94=20=EA=B8=B0=EB=8A=A5=20=EA=B5=AC=ED=98=84?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../java/bridge/controller/BridgeGame.java | 32 +++++++++---------- 1 file changed, 16 insertions(+), 16 deletions(-) diff --git a/src/main/java/bridge/controller/BridgeGame.java b/src/main/java/bridge/controller/BridgeGame.java index 953bdc55ada..bbceba32419 100644 --- a/src/main/java/bridge/controller/BridgeGame.java +++ b/src/main/java/bridge/controller/BridgeGame.java @@ -28,7 +28,7 @@ public BridgeGame(InputView _inputView, OutputView _outputView, BridgeMaker brid public void run() { List bridges = prepare(); - MovingResult movingResult = move(bridges); + MovingResult movingResult = retry(bridges); outputView.printResult(movingResult); } @@ -43,15 +43,15 @@ public List prepare() { } /** - * μ‚¬μš©μžκ°€ 칸을 이동할 λ•Œ μ‚¬μš©ν•˜λŠ” λ©”μ„œλ“œ + * μ‚¬μš©μžκ°€ κ²Œμž„μ„ λ‹€μ‹œ μ‹œλ„ν•  λ•Œ μ‚¬μš©ν•˜λŠ” λ©”μ„œλ“œ */ - public MovingResult move(List bridges) { + public MovingResult retry(List bridges) { int count = 0; while (true) { - List result = tryMove(bridges); + List result = move(bridges); int size = result.size(); - if (result.get(size - 1).equals("O")) { // 성곡 μ‹œ κ²°κ³Ό λ°˜ν™˜ + if (result.get(size - 1).success().equals("O")) { // 성곡 μ‹œ κ²°κ³Ό λ°˜ν™˜ return new MovingResult( result, "성곡", @@ -59,7 +59,9 @@ public MovingResult move(List bridges) { ); } // μ‹€νŒ¨ μ‹œ λ‹€μ‹œ μ‹œλ„ν•  지 μ—¬λΆ€λ₯Ό μž…λ ₯ν•œλ‹€. - String retry = inputView.readGameCommand(); + String retry = retryUntilSuccess(() -> { + return inputView.readGameCommand(); + }); // μ‹€νŒ¨ ν›„ μ’…λ£Œλ₯Ό μž…λ ₯ν–ˆμ„ μ‹œ κ²°κ³Όλ₯Ό λ°˜ν™˜ν•œλ‹€. if (retry.equals("Q")) { @@ -73,11 +75,17 @@ public MovingResult move(List bridges) { } } - private List tryMove(List bridges) { + /** + * μ‚¬μš©μžκ°€ 칸을 이동할 λ•Œ μ‚¬μš©ν•˜λŠ” λ©”μ„œλ“œ + */ + public List move(List bridges) { + List moves = new ArrayList<>(); for (String bridge : bridges) { - String direction = inputView.readMoving(); + String direction = retryUntilSuccess(() -> { + return inputView.readMoving(); + }); if (bridge.equals(direction)) { // μ§€λ‚˜κ°ˆ 수 μžˆλŠ” 경우 moves.add(new SingleMove(direction, "O")); outputView.printMap(moves); @@ -91,14 +99,6 @@ private List tryMove(List bridges) { return moves; } - /** - * μ‚¬μš©μžκ°€ κ²Œμž„μ„ λ‹€μ‹œ μ‹œλ„ν•  λ•Œ μ‚¬μš©ν•˜λŠ” λ©”μ„œλ“œ - *

- * μž¬μ‹œμž‘μ„ μœ„ν•΄ ν•„μš”ν•œ λ©”μ„œλ“œμ˜ λ°˜ν™˜ νƒ€μž…(return type), 인자(parameter)λŠ” 자유둭게 μΆ”κ°€ν•˜κ±°λ‚˜ λ³€κ²½ν•  수 μžˆλ‹€. - */ - public void retry() { - } - private static T retryUntilSuccess(Supplier supplier) { while (true) { try { From d4a55e8da5f84bdb35850707a140e9fa74a3ae0c Mon Sep 17 00:00:00 2001 From: MingyeomKim Date: Tue, 12 Dec 2023 21:48:55 +0900 Subject: [PATCH 18/28] =?UTF-8?q?feat:=20record=EB=A5=BC=20class=EB=A1=9C?= =?UTF-8?q?=20=EA=B5=AC=ED=98=84?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../bridge/controller/dto/MovingResult.java | 27 +++++++++++++++---- .../bridge/controller/dto/SingleMove.java | 20 +++++++++++--- 2 files changed, 38 insertions(+), 9 deletions(-) diff --git a/src/main/java/bridge/controller/dto/MovingResult.java b/src/main/java/bridge/controller/dto/MovingResult.java index 62bdb4dd14d..201dccbfb08 100644 --- a/src/main/java/bridge/controller/dto/MovingResult.java +++ b/src/main/java/bridge/controller/dto/MovingResult.java @@ -2,9 +2,26 @@ import java.util.List; -public record MovingResult( - List singleMoves, - String success, - int count -) { +public class MovingResult { + private List singleMoves; + private String success; + private int count; + + public MovingResult(List singleMoves, String success, int count) { + this.singleMoves = singleMoves; + this.success = success; + this.count = count; + } + + public List singleMoves() { + return singleMoves; + } + + public String success() { + return success; + } + + public int count() { + return count; + } } diff --git a/src/main/java/bridge/controller/dto/SingleMove.java b/src/main/java/bridge/controller/dto/SingleMove.java index a4128858700..1a6169edb7b 100644 --- a/src/main/java/bridge/controller/dto/SingleMove.java +++ b/src/main/java/bridge/controller/dto/SingleMove.java @@ -1,7 +1,19 @@ package bridge.controller.dto; -public record SingleMove( - String direction, // U, D - String success // O, X -) { +public class SingleMove { + private String direction; // U, D + private String success; // O, X + + public SingleMove(String direction, String success) { + this.direction = direction; + this.success = success; + } + + public String direction() { + return direction; + } + + public String success() { + return success; + } } From a1de624cc64216cc0bc8d7e07afc6943c168e3a8 Mon Sep 17 00:00:00 2001 From: MingyeomKim Date: Tue, 12 Dec 2023 21:49:12 +0900 Subject: [PATCH 19/28] =?UTF-8?q?feat:=20=EA=B3=B5=EB=B0=B1=20=EB=A9=94?= =?UTF-8?q?=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/view/InputView.java | 2 ++ src/main/java/bridge/view/console/ConsoleWriter.java | 4 ++++ 2 files changed, 6 insertions(+) diff --git a/src/main/java/bridge/view/InputView.java b/src/main/java/bridge/view/InputView.java index e244e21efe9..c2ffc5d082d 100644 --- a/src/main/java/bridge/view/InputView.java +++ b/src/main/java/bridge/view/InputView.java @@ -15,6 +15,7 @@ public class InputView { * λ‹€λ¦¬μ˜ 길이λ₯Ό μž…λ ₯λ°›λŠ”λ‹€. */ public int readBridgeSize() { + ConsoleWriter.println(); ConsoleWriter.printlnMessage("λ‹€λ¦¬μ˜ 길이λ₯Ό μž…λ ₯ν•΄μ£Όμ„Έμš”."); return validateBridgeSize(ConsoleReader.enterMessage()); } @@ -55,6 +56,7 @@ private boolean isNotMatch(String actual, String expected) { * μ‚¬μš©μžκ°€ κ²Œμž„μ„ λ‹€μ‹œ μ‹œλ„ν• μ§€ μ’…λ£Œν• μ§€ μ—¬λΆ€λ₯Ό μž…λ ₯λ°›λŠ”λ‹€. */ public String readGameCommand() { + ConsoleWriter.println(); ConsoleWriter.printlnMessage("κ²Œμž„μ„ λ‹€μ‹œ μ‹œλ„ν• μ§€ μ—¬λΆ€λ₯Ό μž…λ ₯ν•΄μ£Όμ„Έμš”. (μž¬μ‹œλ„: R, μ’…λ£Œ: Q)"); return validateGameCommand(ConsoleReader.enterMessage()); } diff --git a/src/main/java/bridge/view/console/ConsoleWriter.java b/src/main/java/bridge/view/console/ConsoleWriter.java index 253f9fb5af2..7ab7f8d6580 100644 --- a/src/main/java/bridge/view/console/ConsoleWriter.java +++ b/src/main/java/bridge/view/console/ConsoleWriter.java @@ -1,6 +1,10 @@ package bridge.view.console; public final class ConsoleWriter { + public static void println() { + System.out.println(); + } + public static void printlnMessage(String message) { System.out.println(message); } From fbac95bd199cf525e27ba02005a00279c08dce31 Mon Sep 17 00:00:00 2001 From: MingyeomKim Date: Tue, 12 Dec 2023 21:50:01 +0900 Subject: [PATCH 20/28] =?UTF-8?q?refactor:=20=EC=B2=98=EC=9D=8C=20?= =?UTF-8?q?=EC=8B=9C=EC=9E=91=EC=9D=84=201=EB=A1=9C=20=ED=95=98=EB=8F=84?= =?UTF-8?q?=EB=A1=9D=20=EC=88=98=EC=A0=95?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- src/main/java/bridge/controller/BridgeGame.java | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/main/java/bridge/controller/BridgeGame.java b/src/main/java/bridge/controller/BridgeGame.java index bbceba32419..bed98adda7b 100644 --- a/src/main/java/bridge/controller/BridgeGame.java +++ b/src/main/java/bridge/controller/BridgeGame.java @@ -46,7 +46,7 @@ public List prepare() { * μ‚¬μš©μžκ°€ κ²Œμž„μ„ λ‹€μ‹œ μ‹œλ„ν•  λ•Œ μ‚¬μš©ν•˜λŠ” λ©”μ„œλ“œ */ public MovingResult retry(List bridges) { - int count = 0; + int count = 1; while (true) { List result = move(bridges); From 5997c4429a2c34bc4bb809446a6100e0eb2164c9 Mon Sep 17 00:00:00 2001 From: MingyeomKim Date: Tue, 12 Dec 2023 21:50:16 +0900 Subject: [PATCH 21/28] =?UTF-8?q?refactor:=20=EB=AC=B8=EC=9E=90=EC=97=B4?= =?UTF-8?q?=20=EC=9D=BC=EC=B9=98=20=EC=97=AC=EB=B6=80=EB=A5=BC=20equals=20?= =?UTF-8?q?=EB=A9=94=EC=86=8C=EB=93=9C=EB=A5=BC=20=EC=82=AC=EC=9A=A9?= =?UTF-8?q?=ED=95=B4=20=EA=B5=AC=ED=98=84?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- src/main/java/bridge/view/OutputView.java | 9 +++++---- 1 file changed, 5 insertions(+), 4 deletions(-) diff --git a/src/main/java/bridge/view/OutputView.java b/src/main/java/bridge/view/OutputView.java index 42dd310b9ef..7b4e95d4875 100644 --- a/src/main/java/bridge/view/OutputView.java +++ b/src/main/java/bridge/view/OutputView.java @@ -13,8 +13,8 @@ public class OutputView { private static final String NONE = " "; private static final String SINGLE_MAP_FORMAT = " | %s"; - private static final String GAME_RESULT_MESSAGE = "κ²Œμž„ 성곡 μ—¬λΆ€ : %s"; - private static final String TRY_COUNT_MESSAGE = "총 μ‹œλ„ν•œ 횟수 : %d"; + private static final String GAME_RESULT_MESSAGE = "κ²Œμž„ 성곡 μ—¬λΆ€: %s"; + private static final String TRY_COUNT_MESSAGE = "총 μ‹œλ„ν•œ 횟수: %d"; public void printStartMessage() { ConsoleWriter.printlnMessage("닀리 κ±΄λ„ˆκΈ° κ²Œμž„μ„ μ‹œμž‘ν•©λ‹ˆλ‹€."); @@ -27,17 +27,18 @@ public void printMap(List moves) { List up = new ArrayList<>(); List down = new ArrayList<>(); for (SingleMove move : moves) { - if (move.direction() == "U") { + if (move.direction().equals("U")) { up.add(move.success()); down.add(NONE); } - if (move.direction() == "D") { + if (move.direction().equals("D")) { up.add(NONE); down.add(move.success()); } } ConsoleWriter.printlnMessage(generateSingleMapRow(up)); ConsoleWriter.printlnMessage(generateSingleMapRow(down)); + ConsoleWriter.println(); } public String generateSingleMapRow(List map) { From 91c8d37d013c1fb1b27760cf443a694e60789259 Mon Sep 17 00:00:00 2001 From: MingyeomKim Date: Tue, 12 Dec 2023 21:50:37 +0900 Subject: [PATCH 22/28] =?UTF-8?q?fix:=20build.gradle=EC=9D=98=20=EC=9E=90?= =?UTF-8?q?=EB=B0=94=EB=A5=BC=2011=20=EB=B2=84=EC=A0=84=EC=9C=BC=EB=A1=9C?= =?UTF-8?q?=20=EC=88=98=EC=A0=95?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- build.gradle | 2 +- src/test/java/bridge/ApplicationTest.java | 12 +++++++----- 2 files changed, 8 insertions(+), 6 deletions(-) diff --git a/build.gradle b/build.gradle index ee0f309f09d..9d087b142e3 100644 --- a/build.gradle +++ b/build.gradle @@ -13,7 +13,7 @@ dependencies { java { toolchain { - languageVersion = JavaLanguageVersion.of(17) + languageVersion = JavaLanguageVersion.of(11) } } diff --git a/src/test/java/bridge/ApplicationTest.java b/src/test/java/bridge/ApplicationTest.java index 1a163ec0a2a..6ce58c196c8 100644 --- a/src/test/java/bridge/ApplicationTest.java +++ b/src/test/java/bridge/ApplicationTest.java @@ -5,6 +5,8 @@ import static org.assertj.core.api.Assertions.assertThat; import static org.assertj.core.util.Lists.newArrayList; +import bridge.domain.BridgeMaker; +import bridge.util.BridgeNumberGenerator; import camp.nextstep.edu.missionutils.test.NsTest; import java.util.List; import org.junit.jupiter.api.Test; @@ -26,11 +28,11 @@ class ApplicationTest extends NsTest { assertRandomNumberInRangeTest(() -> { run("3", "U", "D", "U"); assertThat(output()).contains( - "μ΅œμ’… κ²Œμž„ κ²°κ³Ό", - "[ O | | O ]", - "[ | O | ]", - "κ²Œμž„ 성곡 μ—¬λΆ€: 성곡", - "총 μ‹œλ„ν•œ 횟수: 1" + "μ΅œμ’… κ²Œμž„ κ²°κ³Ό", + "[ O | | O ]", + "[ | O | ]", + "κ²Œμž„ 성곡 μ—¬λΆ€: 성곡", + "총 μ‹œλ„ν•œ 횟수: 1" ); int upSideIndex = output().indexOf("[ O | | O ]"); From 1c3b05be83df12122b604635fc239e7190efc354 Mon Sep 17 00:00:00 2001 From: MingyeomKim Date: Tue, 12 Dec 2023 22:10:18 +0900 Subject: [PATCH 23/28] =?UTF-8?q?refactor:=20=EC=BD=94=EB=93=9C=20?= =?UTF-8?q?=EA=B0=80=EB=8F=85=EC=84=B1=20=ED=96=A5=EC=83=81?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../java/bridge/controller/BridgeGame.java | 47 +++++++++---------- src/main/java/bridge/view/InputView.java | 2 +- 2 files changed, 22 insertions(+), 27 deletions(-) diff --git a/src/main/java/bridge/controller/BridgeGame.java b/src/main/java/bridge/controller/BridgeGame.java index bed98adda7b..bdf7c9089be 100644 --- a/src/main/java/bridge/controller/BridgeGame.java +++ b/src/main/java/bridge/controller/BridgeGame.java @@ -49,56 +49,51 @@ public MovingResult retry(List bridges) { int count = 1; while (true) { List result = move(bridges); - - int size = result.size(); - if (result.get(size - 1).success().equals("O")) { // 성곡 μ‹œ κ²°κ³Ό λ°˜ν™˜ - return new MovingResult( - result, - "성곡", - count - ); + if (isSucceed(result)) { + return new MovingResult(result, "성곡", count); } - // μ‹€νŒ¨ μ‹œ λ‹€μ‹œ μ‹œλ„ν•  지 μ—¬λΆ€λ₯Ό μž…λ ₯ν•œλ‹€. String retry = retryUntilSuccess(() -> { return inputView.readGameCommand(); }); - - // μ‹€νŒ¨ ν›„ μ’…λ£Œλ₯Ό μž…λ ₯ν–ˆμ„ μ‹œ κ²°κ³Όλ₯Ό λ°˜ν™˜ν•œλ‹€. if (retry.equals("Q")) { - return new MovingResult( - result, - "μ‹€νŒ¨", - count - ); + return new MovingResult(result, "μ‹€νŒ¨", count); } count++; } } + private boolean isSucceed(List result) { + int size = result.size(); + return cannotMove(result.get(size - 1).success(), "O"); + } + /** * μ‚¬μš©μžκ°€ 칸을 이동할 λ•Œ μ‚¬μš©ν•˜λŠ” λ©”μ„œλ“œ */ public List move(List bridges) { - List moves = new ArrayList<>(); - for (String bridge : bridges) { String direction = retryUntilSuccess(() -> { return inputView.readMoving(); }); - if (bridge.equals(direction)) { // μ§€λ‚˜κ°ˆ 수 μžˆλŠ” 경우 - moves.add(new SingleMove(direction, "O")); - outputView.printMap(moves); - continue; + if (cannotMove(bridge, direction)) { + addMove(moves, direction, "X"); + return moves; } - // μ§€λ‚˜κ°ˆ 수 μ—†λŠ” 닀리λ₯Ό μ„ νƒν•œ 경우 - moves.add(new SingleMove(direction, "X")); - outputView.printMap(moves); - return moves; + addMove(moves, direction, "O"); } return moves; } + private boolean cannotMove(String bridge, String direction) { + return !bridge.equals(direction); + } + + private void addMove(List moves, String direction, String success) { + moves.add(new SingleMove(direction, success)); + outputView.printMap(moves); + } + private static T retryUntilSuccess(Supplier supplier) { while (true) { try { diff --git a/src/main/java/bridge/view/InputView.java b/src/main/java/bridge/view/InputView.java index c2ffc5d082d..5bf8a78309b 100644 --- a/src/main/java/bridge/view/InputView.java +++ b/src/main/java/bridge/view/InputView.java @@ -49,7 +49,7 @@ private String validateMoving(String message) { } private boolean isNotMatch(String actual, String expected) { - return actual.equals(expected); + return !actual.equals(expected); } /** From 4b794776c28c4836c6048ddccedf47581f6723fa Mon Sep 17 00:00:00 2001 From: MingyeomKim Date: Tue, 12 Dec 2023 22:34:14 +0900 Subject: [PATCH 24/28] =?UTF-8?q?refactor:=20SingleMove=20=EB=84=A4?= =?UTF-8?q?=EC=9D=B4=EB=B0=8D=EC=9D=84=20Move=EB=A1=9C=20=EB=B3=80?= =?UTF-8?q?=EA=B2=BD?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../controller/dto/{SingleMove.java => Move.java} | 4 ++-- src/main/java/bridge/controller/dto/MovingResult.java | 10 +++++----- src/main/java/bridge/view/OutputView.java | 6 +++--- 3 files changed, 10 insertions(+), 10 deletions(-) rename src/main/java/bridge/controller/dto/{SingleMove.java => Move.java} (78%) diff --git a/src/main/java/bridge/controller/dto/SingleMove.java b/src/main/java/bridge/controller/dto/Move.java similarity index 78% rename from src/main/java/bridge/controller/dto/SingleMove.java rename to src/main/java/bridge/controller/dto/Move.java index 1a6169edb7b..e01b24844a4 100644 --- a/src/main/java/bridge/controller/dto/SingleMove.java +++ b/src/main/java/bridge/controller/dto/Move.java @@ -1,10 +1,10 @@ package bridge.controller.dto; -public class SingleMove { +public class Move { private String direction; // U, D private String success; // O, X - public SingleMove(String direction, String success) { + public Move(String direction, String success) { this.direction = direction; this.success = success; } diff --git a/src/main/java/bridge/controller/dto/MovingResult.java b/src/main/java/bridge/controller/dto/MovingResult.java index 201dccbfb08..bf0ec3eea11 100644 --- a/src/main/java/bridge/controller/dto/MovingResult.java +++ b/src/main/java/bridge/controller/dto/MovingResult.java @@ -3,18 +3,18 @@ import java.util.List; public class MovingResult { - private List singleMoves; + private List moves; private String success; private int count; - public MovingResult(List singleMoves, String success, int count) { - this.singleMoves = singleMoves; + public MovingResult(List moves, String success, int count) { + this.moves = moves; this.success = success; this.count = count; } - public List singleMoves() { - return singleMoves; + public List singleMoves() { + return moves; } public String success() { diff --git a/src/main/java/bridge/view/OutputView.java b/src/main/java/bridge/view/OutputView.java index 7b4e95d4875..fc8df27190e 100644 --- a/src/main/java/bridge/view/OutputView.java +++ b/src/main/java/bridge/view/OutputView.java @@ -1,7 +1,7 @@ package bridge.view; +import bridge.controller.dto.Move; import bridge.controller.dto.MovingResult; -import bridge.controller.dto.SingleMove; import bridge.view.console.ConsoleWriter; import java.util.ArrayList; import java.util.List; @@ -23,10 +23,10 @@ public void printStartMessage() { /** * ν˜„μž¬κΉŒμ§€ μ΄λ™ν•œ λ‹€λ¦¬μ˜ μƒνƒœλ₯Ό 정해진 ν˜•μ‹μ— 맞좰 좜λ ₯ν•œλ‹€. */ - public void printMap(List moves) { + public void printMap(List moves) { List up = new ArrayList<>(); List down = new ArrayList<>(); - for (SingleMove move : moves) { + for (Move move : moves) { if (move.direction().equals("U")) { up.add(move.success()); down.add(NONE); From 75eb1b3b6ee75eec3f024c58b42b8e9a24bef3e8 Mon Sep 17 00:00:00 2001 From: MingyeomKim Date: Tue, 12 Dec 2023 22:35:04 +0900 Subject: [PATCH 25/28] =?UTF-8?q?feat:=20BridgeGame=EC=9D=98=20Move=20?= =?UTF-8?q?=ED=95=A8=EC=88=98=EB=A5=BC=20=EB=B6=84=EB=A6=AC?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../java/bridge/controller/BridgeGame.java | 39 +++++++++++-------- 1 file changed, 23 insertions(+), 16 deletions(-) diff --git a/src/main/java/bridge/controller/BridgeGame.java b/src/main/java/bridge/controller/BridgeGame.java index bdf7c9089be..0d154257234 100644 --- a/src/main/java/bridge/controller/BridgeGame.java +++ b/src/main/java/bridge/controller/BridgeGame.java @@ -1,7 +1,7 @@ package bridge.controller; +import bridge.controller.dto.Move; import bridge.controller.dto.MovingResult; -import bridge.controller.dto.SingleMove; import bridge.domain.BridgeMaker; import bridge.view.InputView; import bridge.view.OutputView; @@ -48,7 +48,7 @@ public List prepare() { public MovingResult retry(List bridges) { int count = 1; while (true) { - List result = move(bridges); + List result = move(bridges); if (isSucceed(result)) { return new MovingResult(result, "성곡", count); } @@ -62,7 +62,7 @@ public MovingResult retry(List bridges) { } } - private boolean isSucceed(List result) { + private boolean isSucceed(List result) { int size = result.size(); return cannotMove(result.get(size - 1).success(), "O"); } @@ -70,28 +70,35 @@ private boolean isSucceed(List result) { /** * μ‚¬μš©μžκ°€ 칸을 이동할 λ•Œ μ‚¬μš©ν•˜λŠ” λ©”μ„œλ“œ */ - public List move(List bridges) { - List moves = new ArrayList<>(); + public List move(List bridges) { + List moves = new ArrayList<>(); for (String bridge : bridges) { - String direction = retryUntilSuccess(() -> { - return inputView.readMoving(); - }); - if (cannotMove(bridge, direction)) { - addMove(moves, direction, "X"); + Move move = createSingleMove(bridge); + moves.add(move); + outputView.printMap(moves); + if (move.direction().equals("X")) { return moves; } - addMove(moves, direction, "O"); } return moves; } - private boolean cannotMove(String bridge, String direction) { - return !bridge.equals(direction); + private Move createSingleMove(String bridge) { + String direction = getDirection(); + if (cannotMove(bridge, direction)) { + return new Move(direction, "X"); + } + return new Move(direction, "O"); } - private void addMove(List moves, String direction, String success) { - moves.add(new SingleMove(direction, success)); - outputView.printMap(moves); + private String getDirection() { + return retryUntilSuccess(() -> { + return inputView.readMoving(); + }); + } + + private boolean cannotMove(String bridge, String direction) { + return !bridge.equals(direction); } private static T retryUntilSuccess(Supplier supplier) { From adcb58d9b2a258cb197bfc87b8bd1a151ab9ae04 Mon Sep 17 00:00:00 2001 From: MingyeomKim Date: Tue, 12 Dec 2023 23:06:44 +0900 Subject: [PATCH 26/28] =?UTF-8?q?feat:=20BridgeGame=EC=9D=98=20=EC=97=AD?= =?UTF-8?q?=ED=95=A0=EC=9D=84=20=EB=91=90=20=EA=B0=9C=EC=9D=98=20Controlle?= =?UTF-8?q?r=EB=A1=9C=20=EB=B6=84=EC=82=B0?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- src/main/java/bridge/Application.java | 31 ++++- .../bridge/controller/BridgeController.java | 23 ++++ .../java/bridge/controller/BridgeGame.java | 112 +++--------------- .../bridge/controller/MoveController.java | 80 +++++++++++++ .../{MovingResult.java => MoveResult.java} | 9 +- .../java/bridge/domain/constants/Result.java | 16 +++ src/main/java/bridge/util/RetryExecutor.java | 16 +++ src/main/java/bridge/view/OutputView.java | 4 +- 8 files changed, 184 insertions(+), 107 deletions(-) create mode 100644 src/main/java/bridge/controller/BridgeController.java create mode 100644 src/main/java/bridge/controller/MoveController.java rename src/main/java/bridge/controller/dto/{MovingResult.java => MoveResult.java} (65%) create mode 100644 src/main/java/bridge/domain/constants/Result.java create mode 100644 src/main/java/bridge/util/RetryExecutor.java diff --git a/src/main/java/bridge/Application.java b/src/main/java/bridge/Application.java index 96353888e0f..a0ba72cae0d 100644 --- a/src/main/java/bridge/Application.java +++ b/src/main/java/bridge/Application.java @@ -1,6 +1,8 @@ package bridge; +import bridge.controller.BridgeController; import bridge.controller.BridgeGame; +import bridge.controller.MoveController; import bridge.domain.BridgeMaker; import bridge.util.BridgeRandomNumberGenerator; import bridge.view.InputView; @@ -9,11 +11,32 @@ public class Application { public static void main(String[] args) { - BridgeGame bridgeGame = new BridgeGame( - new InputView(), - new OutputView(), + InputView inputView = new InputView(); + BridgeController bridgeController = getBridgeController(inputView); + MoveController moveController = getMoveController(inputView); + BridgeGame bridgeGame = getBridgeGame(bridgeController, moveController); + bridgeGame.run(); + } + + private static BridgeController getBridgeController(InputView inputView) { + return new BridgeController( + inputView, new BridgeMaker(new BridgeRandomNumberGenerator()) ); - bridgeGame.run(); + } + + private static MoveController getMoveController(InputView inputView) { + return new MoveController( + inputView, + new OutputView() + ); + } + + private static BridgeGame getBridgeGame(BridgeController bridgeController, MoveController moveController) { + return new BridgeGame( + new OutputView(), + bridgeController, + moveController + ); } } diff --git a/src/main/java/bridge/controller/BridgeController.java b/src/main/java/bridge/controller/BridgeController.java new file mode 100644 index 00000000000..7fe48ef61c1 --- /dev/null +++ b/src/main/java/bridge/controller/BridgeController.java @@ -0,0 +1,23 @@ +package bridge.controller; + +import bridge.domain.BridgeMaker; +import bridge.util.RetryExecutor; +import bridge.view.InputView; +import java.util.List; + +public class BridgeController { + private final InputView inputView; + private final BridgeMaker bridgeMaker; + + public BridgeController(InputView inputView, BridgeMaker bridgeMaker) { + this.inputView = inputView; + this.bridgeMaker = bridgeMaker; + } + + public List prepare() { + int bridgeSize = RetryExecutor.retryUntilSuccess(() -> { + return inputView.readBridgeSize(); + }); + return bridgeMaker.makeBridge(bridgeSize); + } +} diff --git a/src/main/java/bridge/controller/BridgeGame.java b/src/main/java/bridge/controller/BridgeGame.java index 0d154257234..656d496bd70 100644 --- a/src/main/java/bridge/controller/BridgeGame.java +++ b/src/main/java/bridge/controller/BridgeGame.java @@ -1,113 +1,31 @@ package bridge.controller; -import bridge.controller.dto.Move; -import bridge.controller.dto.MovingResult; -import bridge.domain.BridgeMaker; -import bridge.view.InputView; +import bridge.controller.dto.MoveResult; import bridge.view.OutputView; -import bridge.view.console.ConsoleWriter; -import java.util.ArrayList; import java.util.List; -import java.util.function.Supplier; /** * 닀리 κ±΄λ„ˆκΈ° κ²Œμž„μ„ κ΄€λ¦¬ν•˜λŠ” 클래슀 */ public class BridgeGame { - - private final InputView inputView; private final OutputView outputView; - private final BridgeMaker bridgeMaker; + private final BridgeController bridgeController; + private final MoveController moveController; - public BridgeGame(InputView _inputView, OutputView _outputView, BridgeMaker bridgeMaker) { - this.inputView = _inputView; - this.outputView = _outputView; - this.bridgeMaker = bridgeMaker; - outputView.printStartMessage(); + public BridgeGame( + OutputView outputView, + BridgeController bridgeController, + MoveController moveController + ) { + this.outputView = outputView; + this.bridgeController = bridgeController; + this.moveController = moveController; + this.outputView.printStartMessage(); } public void run() { - List bridges = prepare(); - MovingResult movingResult = retry(bridges); - outputView.printResult(movingResult); - } - - /** - * 닀리λ₯Ό μžλ™μœΌλ‘œ μƒμ„±ν•˜λŠ” λ©”μ„œλ“œ - */ - public List prepare() { - int bridgeSize = retryUntilSuccess(() -> { - return inputView.readBridgeSize(); - }); - return bridgeMaker.makeBridge(bridgeSize); - } - - /** - * μ‚¬μš©μžκ°€ κ²Œμž„μ„ λ‹€μ‹œ μ‹œλ„ν•  λ•Œ μ‚¬μš©ν•˜λŠ” λ©”μ„œλ“œ - */ - public MovingResult retry(List bridges) { - int count = 1; - while (true) { - List result = move(bridges); - if (isSucceed(result)) { - return new MovingResult(result, "성곡", count); - } - String retry = retryUntilSuccess(() -> { - return inputView.readGameCommand(); - }); - if (retry.equals("Q")) { - return new MovingResult(result, "μ‹€νŒ¨", count); - } - count++; - } - } - - private boolean isSucceed(List result) { - int size = result.size(); - return cannotMove(result.get(size - 1).success(), "O"); - } - - /** - * μ‚¬μš©μžκ°€ 칸을 이동할 λ•Œ μ‚¬μš©ν•˜λŠ” λ©”μ„œλ“œ - */ - public List move(List bridges) { - List moves = new ArrayList<>(); - for (String bridge : bridges) { - Move move = createSingleMove(bridge); - moves.add(move); - outputView.printMap(moves); - if (move.direction().equals("X")) { - return moves; - } - } - return moves; - } - - private Move createSingleMove(String bridge) { - String direction = getDirection(); - if (cannotMove(bridge, direction)) { - return new Move(direction, "X"); - } - return new Move(direction, "O"); - } - - private String getDirection() { - return retryUntilSuccess(() -> { - return inputView.readMoving(); - }); - } - - private boolean cannotMove(String bridge, String direction) { - return !bridge.equals(direction); - } - - private static T retryUntilSuccess(Supplier supplier) { - while (true) { - try { - return supplier.get(); - } catch (IllegalArgumentException e) { - ConsoleWriter.printlnMessage(e.getMessage()); - } - } + List bridges = bridgeController.prepare(); + MoveResult moveResult = moveController.retry(bridges); + outputView.printResult(moveResult); } } diff --git a/src/main/java/bridge/controller/MoveController.java b/src/main/java/bridge/controller/MoveController.java new file mode 100644 index 00000000000..6a039b924a6 --- /dev/null +++ b/src/main/java/bridge/controller/MoveController.java @@ -0,0 +1,80 @@ +package bridge.controller; + +import bridge.controller.dto.Move; +import bridge.controller.dto.MoveResult; +import bridge.domain.constants.Result; +import bridge.util.RetryExecutor; +import bridge.view.InputView; +import bridge.view.OutputView; +import java.util.ArrayList; +import java.util.List; +import java.util.Optional; + +public class MoveController { + private final InputView inputView; + private final OutputView outputView; + + public MoveController(InputView inputView, OutputView outputView) { + this.inputView = inputView; + this.outputView = outputView; + } + + /** + * μ‚¬μš©μžκ°€ κ²Œμž„μ„ λ‹€μ‹œ μ‹œλ„ν•  λ•Œ μ‚¬μš©ν•˜λŠ” λ©”μ„œλ“œ + */ + public MoveResult retry(List bridges) { + int count = 1; + while (true) { + List moves = move(bridges); + Optional moveResult = createMoveResult(moves, count); + if (moveResult.isPresent()) { + return moveResult.get(); + } + count++; + } + } + + private Optional createMoveResult(List moves, int count) { + if (isSucceed(moves)) { // λκΉŒμ§€ 이동에 μ„±κ³΅ν•œ 경우 + return Optional.of(new MoveResult(moves, Result.SUCCESS, count)); + } + String retry = RetryExecutor.retryUntilSuccess(inputView::readGameCommand); + if ("Q".equals(retry)) { // μ’…λ£Œ + return Optional.of(new MoveResult(moves, Result.FAIL, count)); + } + return Optional.empty(); // μž¬μ‹œμž‘ + } + + private boolean isSucceed(List result) { + int size = result.size(); + return result.get(size - 1).success().equals("O"); + } + + /** + * μ‚¬μš©μžκ°€ 칸을 이동할 λ•Œ μ‚¬μš©ν•˜λŠ” λ©”μ„œλ“œ + */ + public List move(List bridges) { + List moves = new ArrayList<>(); + for (String bridge : bridges) { + Move move = createSingleMove(bridge); + moves.add(move); + outputView.printMap(moves); + if (move.direction().equals("X")) { + return moves; + } + } + return moves; + } + + private Move createSingleMove(String bridge) { + String direction = RetryExecutor.retryUntilSuccess(inputView::readMoving); + if (cannotMove(bridge, direction)) { + return new Move(direction, "X"); + } + return new Move(direction, "O"); + } + + private boolean cannotMove(String bridge, String direction) { + return !bridge.equals(direction); + } +} diff --git a/src/main/java/bridge/controller/dto/MovingResult.java b/src/main/java/bridge/controller/dto/MoveResult.java similarity index 65% rename from src/main/java/bridge/controller/dto/MovingResult.java rename to src/main/java/bridge/controller/dto/MoveResult.java index bf0ec3eea11..33a6e4f7172 100644 --- a/src/main/java/bridge/controller/dto/MovingResult.java +++ b/src/main/java/bridge/controller/dto/MoveResult.java @@ -1,13 +1,14 @@ package bridge.controller.dto; +import bridge.domain.constants.Result; import java.util.List; -public class MovingResult { +public class MoveResult { private List moves; - private String success; + private Result success; private int count; - public MovingResult(List moves, String success, int count) { + public MoveResult(List moves, Result success, int count) { this.moves = moves; this.success = success; this.count = count; @@ -17,7 +18,7 @@ public List singleMoves() { return moves; } - public String success() { + public Result success() { return success; } diff --git a/src/main/java/bridge/domain/constants/Result.java b/src/main/java/bridge/domain/constants/Result.java new file mode 100644 index 00000000000..9cc21ce4abe --- /dev/null +++ b/src/main/java/bridge/domain/constants/Result.java @@ -0,0 +1,16 @@ +package bridge.domain.constants; + +public enum Result { + SUCCESS("성곡"), + FAIL("μ‹€νŒ¨"); + + private final String name; + + Result(String name) { + this.name = name; + } + + public String getName() { + return name; + } +} diff --git a/src/main/java/bridge/util/RetryExecutor.java b/src/main/java/bridge/util/RetryExecutor.java new file mode 100644 index 00000000000..58a227d8a37 --- /dev/null +++ b/src/main/java/bridge/util/RetryExecutor.java @@ -0,0 +1,16 @@ +package bridge.util; + +import bridge.view.console.ConsoleWriter; +import java.util.function.Supplier; + +public final class RetryExecutor { + public static T retryUntilSuccess(Supplier supplier) { + while (true) { + try { + return supplier.get(); + } catch (IllegalArgumentException e) { + ConsoleWriter.printlnMessage(e.getMessage()); + } + } + } +} diff --git a/src/main/java/bridge/view/OutputView.java b/src/main/java/bridge/view/OutputView.java index fc8df27190e..dc6293850a6 100644 --- a/src/main/java/bridge/view/OutputView.java +++ b/src/main/java/bridge/view/OutputView.java @@ -1,7 +1,7 @@ package bridge.view; import bridge.controller.dto.Move; -import bridge.controller.dto.MovingResult; +import bridge.controller.dto.MoveResult; import bridge.view.console.ConsoleWriter; import java.util.ArrayList; import java.util.List; @@ -56,7 +56,7 @@ public String generateSingleMapRow(List map) { /** * κ²Œμž„μ˜ μ΅œμ’… κ²°κ³Όλ₯Ό 정해진 ν˜•μ‹μ— 맞좰 좜λ ₯ν•œλ‹€. */ - public void printResult(MovingResult result) { + public void printResult(MoveResult result) { ConsoleWriter.printlnMessage("μ΅œμ’… κ²Œμž„ κ²°κ³Ό"); printMap(result.singleMoves()); ConsoleWriter.printlnFormat(GAME_RESULT_MESSAGE, result.success()); From 5890c9639862efc78958841fdc6fb1041238ebd6 Mon Sep 17 00:00:00 2001 From: MingyeomKim Date: Tue, 12 Dec 2023 23:13:25 +0900 Subject: [PATCH 27/28] =?UTF-8?q?fix:=20=EC=B6=9C=EB=A0=A5=20=EC=83=81?= =?UTF-8?q?=EC=9D=98=20=EC=98=A4=EB=A5=98=20=EC=88=98=EC=A0=95?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- src/main/java/bridge/controller/MoveController.java | 2 +- src/main/java/bridge/view/OutputView.java | 2 +- 2 files changed, 2 insertions(+), 2 deletions(-) diff --git a/src/main/java/bridge/controller/MoveController.java b/src/main/java/bridge/controller/MoveController.java index 6a039b924a6..270caa2c9df 100644 --- a/src/main/java/bridge/controller/MoveController.java +++ b/src/main/java/bridge/controller/MoveController.java @@ -59,7 +59,7 @@ public List move(List bridges) { Move move = createSingleMove(bridge); moves.add(move); outputView.printMap(moves); - if (move.direction().equals("X")) { + if (move.success().equals("X")) { return moves; } } diff --git a/src/main/java/bridge/view/OutputView.java b/src/main/java/bridge/view/OutputView.java index dc6293850a6..71b4d61b7ec 100644 --- a/src/main/java/bridge/view/OutputView.java +++ b/src/main/java/bridge/view/OutputView.java @@ -59,7 +59,7 @@ public String generateSingleMapRow(List map) { public void printResult(MoveResult result) { ConsoleWriter.printlnMessage("μ΅œμ’… κ²Œμž„ κ²°κ³Ό"); printMap(result.singleMoves()); - ConsoleWriter.printlnFormat(GAME_RESULT_MESSAGE, result.success()); + ConsoleWriter.printlnFormat(GAME_RESULT_MESSAGE, result.success().getName()); ConsoleWriter.printlnFormat(TRY_COUNT_MESSAGE, result.count()); } } From 523cf65ead0d552c99c1303dd951c5c3d1528455 Mon Sep 17 00:00:00 2001 From: MingyeomKim Date: Tue, 12 Dec 2023 23:18:52 +0900 Subject: [PATCH 28/28] =?UTF-8?q?test:=20BridgeMaker=EC=9D=98=20Bridge=20?= =?UTF-8?q?=EC=83=9D=EC=84=B1=20=ED=85=8C=EC=8A=A4=ED=8A=B8?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../java/bridge/domain/BridgeMakerTest.java | 46 +++++++++++++++++++ 1 file changed, 46 insertions(+) create mode 100644 src/test/java/bridge/domain/BridgeMakerTest.java diff --git a/src/test/java/bridge/domain/BridgeMakerTest.java b/src/test/java/bridge/domain/BridgeMakerTest.java new file mode 100644 index 00000000000..ab0ad2db8ff --- /dev/null +++ b/src/test/java/bridge/domain/BridgeMakerTest.java @@ -0,0 +1,46 @@ +package bridge.domain; + +import static org.junit.jupiter.api.Assertions.assertEquals; +import static org.mockito.Mockito.when; + +import bridge.util.BridgeNumberGenerator; +import java.util.List; +import org.junit.jupiter.api.BeforeEach; +import org.junit.jupiter.api.Test; +import org.mockito.InjectMocks; +import org.mockito.Mock; +import org.mockito.MockitoAnnotations; + +class BridgeMakerTest { + + @Mock + private BridgeNumberGenerator bridgeNumberGenerator; + + @InjectMocks + private BridgeMaker bridgeMaker; + + @BeforeEach + void setUp() { + MockitoAnnotations.openMocks(this); + } + + @Test + void makeBridgeTestWithUp() { + when(bridgeNumberGenerator.generate()).thenReturn(1); + + List result = bridgeMaker.makeBridge(5); + + assertEquals(5, result.size()); + assertEquals("U", result.get(0)); + } + + @Test + void makeBridgeTestWithDown() { + when(bridgeNumberGenerator.generate()).thenReturn(0); + + List result = bridgeMaker.makeBridge(5); + + assertEquals(5, result.size()); + assertEquals("D", result.get(0)); + } +}