From c9024bda550c8f12487b0c18769d4387da27d03f Mon Sep 17 00:00:00 2001 From: kilian Date: Sat, 25 May 2024 16:33:26 +0900 Subject: [PATCH 01/22] =?UTF-8?q?doc=20:=20=EA=B5=AC=ED=98=84=20=EB=AA=A9?= =?UTF-8?q?=EB=A1=9D,=20=EA=B8=B0=EB=8A=A5=20=EC=9A=94=EA=B5=AC=20?= =?UTF-8?q?=EC=82=AC=ED=95=AD=20README.md=20=EC=9E=91=EC=84=B1?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- README.md | 14 ++++++++++++-- 1 file changed, 12 insertions(+), 2 deletions(-) diff --git a/README.md b/README.md index a05a3c0ce7b..b32171e0cdc 100644 --- a/README.md +++ b/README.md @@ -1,5 +1,15 @@ # java-blackjack -블랙잭 미션 저장소 +## 기능 요구 사항 -## [미션 리드미](https://github.com/talmood/private-mission-README/tree/main/%EB%AF%B8%EC%85%98%204%20-%20%EB%B8%94%EB%9E%99%EC%9E%AD) +- 카드의 숫자 계산은 카드 숫자를 기본으로 하며, 예외로 Ace는 1 또는 11로 계산할 수 있으며, King, Queen, Jack은 각각 10으로 계산한다. +- 게임을 시작하면 플레이어는 두 장의 카드를 지급 받으며, 두 장의 카드 숫자를 합쳐 21을 초과하지 않으면서 21에 가깝게 만들면 이긴다. 21을 넘지 않을 경우 원한다면 얼마든지 카드를 계속 뽑을 수 있다. +- 딜러는 처음에 받은 2장의 합계가 16이하이면 반드시 1장의 카드를 추가로 받아야 하고, 17점 이상이면 추가로 받을 수 없다. +- 게임을 완료한 후 각 플레이어별로 승패를 출력한다. + +## 구현 목록 +- [ ] 게임의 참여할 사람을 입력받는다. +- [ ] 딜러와 플레이어들이 카드를 나눠 받는다. +- [ ] 딜러와 플레이어들이 추가 카드를 나눠 갖는다. +- [ ] 딜러와 플레이어들의 결과를 출력한다. +- [ ] 최종 결과를 출력한다. \ No newline at end of file From c1a4bf88dccd9021c25963a7216d2bf57ecfa9cb Mon Sep 17 00:00:00 2001 From: kilian Date: Sat, 25 May 2024 16:34:25 +0900 Subject: [PATCH 02/22] =?UTF-8?q?feat=20:=20BlackjackApplication.java=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/BlackjackApplication.java | 6 ++++++ 1 file changed, 6 insertions(+) create mode 100644 src/main/java/BlackjackApplication.java diff --git a/src/main/java/BlackjackApplication.java b/src/main/java/BlackjackApplication.java new file mode 100644 index 00000000000..eba76433bbd --- /dev/null +++ b/src/main/java/BlackjackApplication.java @@ -0,0 +1,6 @@ +public class BlackjackApplication { + + public static void main(String[] args) { + + } +} From 297bb0a6752e5056dce7d8dd393ba1700c89db7f Mon Sep 17 00:00:00 2001 From: kilian Date: Sat, 25 May 2024 16:47:13 +0900 Subject: [PATCH 03/22] =?UTF-8?q?feat=20:=20view=20=EC=83=9D=EC=84=B1?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- src/main/java/BlackjackApplication.java | 5 +++- .../java/Controller/BlackjackSimulator.java | 8 +++++++ .../java/view/input/ConsoleInputView.java | 23 +++++++++++++++++++ src/main/java/view/input/InputView.java | 12 ++++++++++ .../java/view/output/ConsoleOutputView.java | 13 +++++++++++ src/main/java/view/output/OutputView.java | 8 +++++++ 6 files changed, 68 insertions(+), 1 deletion(-) create mode 100644 src/main/java/Controller/BlackjackSimulator.java create mode 100644 src/main/java/view/input/ConsoleInputView.java create mode 100644 src/main/java/view/input/InputView.java create mode 100644 src/main/java/view/output/ConsoleOutputView.java create mode 100644 src/main/java/view/output/OutputView.java diff --git a/src/main/java/BlackjackApplication.java b/src/main/java/BlackjackApplication.java index eba76433bbd..66307ff410d 100644 --- a/src/main/java/BlackjackApplication.java +++ b/src/main/java/BlackjackApplication.java @@ -1,6 +1,9 @@ +import Controller.BlackjackSimulator; + public class BlackjackApplication { public static void main(String[] args) { - + BlackjackSimulator blackjackSimulator = new BlackjackSimulator(); + blackjackSimulator.run(); } } diff --git a/src/main/java/Controller/BlackjackSimulator.java b/src/main/java/Controller/BlackjackSimulator.java new file mode 100644 index 00000000000..3502ca22e8d --- /dev/null +++ b/src/main/java/Controller/BlackjackSimulator.java @@ -0,0 +1,8 @@ +package Controller; + +public class BlackjackSimulator { + + public void run() { + + } +} diff --git a/src/main/java/view/input/ConsoleInputView.java b/src/main/java/view/input/ConsoleInputView.java new file mode 100644 index 00000000000..32c3e2835d0 --- /dev/null +++ b/src/main/java/view/input/ConsoleInputView.java @@ -0,0 +1,23 @@ +package view.input; + +public class ConsoleInputView implements InputView{ + @Override + public void viewPlayers() { + + } + + @Override + public void viewInitCards() { + + } + + @Override + public void viewMoreCard() { + + } + + @Override + public void viewThresholdCard() { + + } +} diff --git a/src/main/java/view/input/InputView.java b/src/main/java/view/input/InputView.java new file mode 100644 index 00000000000..4bdeb8b9744 --- /dev/null +++ b/src/main/java/view/input/InputView.java @@ -0,0 +1,12 @@ +package view.input; + +public interface InputView { + + void viewPlayers(); + + void viewInitCards(); + + void viewMoreCard(); + + void viewThresholdCard(); +} diff --git a/src/main/java/view/output/ConsoleOutputView.java b/src/main/java/view/output/ConsoleOutputView.java new file mode 100644 index 00000000000..8aaf0fcfec2 --- /dev/null +++ b/src/main/java/view/output/ConsoleOutputView.java @@ -0,0 +1,13 @@ +package view.output; + +public class ConsoleOutputView implements OutputView { + @Override + public void viewParticipantsCards() { + + } + + @Override + public void viewWinOrLose() { + + } +} diff --git a/src/main/java/view/output/OutputView.java b/src/main/java/view/output/OutputView.java new file mode 100644 index 00000000000..e3f4f2d6216 --- /dev/null +++ b/src/main/java/view/output/OutputView.java @@ -0,0 +1,8 @@ +package view.output; + +public interface OutputView { + + void viewParticipantsCards(); + + void viewWinOrLose(); +} From 7106dc85386e392beb7b367dd85fdf1b3d9b2664 Mon Sep 17 00:00:00 2001 From: kilian Date: Sat, 25 May 2024 16:49:00 +0900 Subject: [PATCH 04/22] =?UTF-8?q?feat=20:=20view=20=EC=A3=BC=EC=9E=85?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- src/main/java/BlackjackApplication.java | 9 ++++++++- src/main/java/Controller/BlackjackSimulator.java | 11 +++++++++++ 2 files changed, 19 insertions(+), 1 deletion(-) diff --git a/src/main/java/BlackjackApplication.java b/src/main/java/BlackjackApplication.java index 66307ff410d..74e15c7e07c 100644 --- a/src/main/java/BlackjackApplication.java +++ b/src/main/java/BlackjackApplication.java @@ -1,9 +1,16 @@ import Controller.BlackjackSimulator; +import view.input.ConsoleInputView; +import view.input.InputView; +import view.output.ConsoleOutputView; +import view.output.OutputView; public class BlackjackApplication { public static void main(String[] args) { - BlackjackSimulator blackjackSimulator = new BlackjackSimulator(); + InputView inputView = new ConsoleInputView(); + OutputView outputView = new ConsoleOutputView(); + + BlackjackSimulator blackjackSimulator = new BlackjackSimulator(inputView, outputView); blackjackSimulator.run(); } } diff --git a/src/main/java/Controller/BlackjackSimulator.java b/src/main/java/Controller/BlackjackSimulator.java index 3502ca22e8d..345c12d4a8e 100644 --- a/src/main/java/Controller/BlackjackSimulator.java +++ b/src/main/java/Controller/BlackjackSimulator.java @@ -1,7 +1,18 @@ package Controller; +import view.input.InputView; +import view.output.OutputView; + public class BlackjackSimulator { + private final InputView inputView; + private final OutputView outputView; + + public BlackjackSimulator(InputView inputView, OutputView outputView) { + this.inputView = inputView; + this.outputView = outputView; + } + public void run() { } From a81caebd6af60137b9a92b97019e243ce2e361b3 Mon Sep 17 00:00:00 2001 From: kilian Date: Sat, 25 May 2024 17:34:54 +0900 Subject: [PATCH 05/22] =?UTF-8?q?feat=20:=20=ED=94=8C=EB=A0=88=EC=9D=B4?= =?UTF-8?q?=EC=96=B4=20=EC=9D=B4=EB=A6=84=20=EC=9E=85=EB=A0=A5?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- src/main/java/BlackjackApplication.java | 8 +++++- src/main/java/util/CollectionUtils.java | 11 ++++++++ src/main/java/util/Console.java | 17 +++++++++++ src/main/java/util/StringUtils.java | 20 +++++++++++++ .../java/view/input/ConsoleInputReader.java | 19 +++++++++++++ .../java/view/input/ConsoleInputView.java | 21 ++++++++++++-- src/main/java/view/input/InputReader.java | 6 ++++ src/main/java/view/input/InputView.java | 4 ++- .../java/view/input/dto/PlayersInput.java | 28 +++++++++++++++++++ .../java/view/output/ConsoleOutputWriter.java | 8 ++++++ src/main/java/view/output/OutputWriter.java | 6 ++++ 11 files changed, 144 insertions(+), 4 deletions(-) create mode 100644 src/main/java/util/CollectionUtils.java create mode 100644 src/main/java/util/Console.java create mode 100644 src/main/java/util/StringUtils.java create mode 100644 src/main/java/view/input/ConsoleInputReader.java create mode 100644 src/main/java/view/input/InputReader.java create mode 100644 src/main/java/view/input/dto/PlayersInput.java create mode 100644 src/main/java/view/output/ConsoleOutputWriter.java create mode 100644 src/main/java/view/output/OutputWriter.java diff --git a/src/main/java/BlackjackApplication.java b/src/main/java/BlackjackApplication.java index 74e15c7e07c..8aad5cd9f36 100644 --- a/src/main/java/BlackjackApplication.java +++ b/src/main/java/BlackjackApplication.java @@ -1,13 +1,19 @@ import Controller.BlackjackSimulator; +import view.input.ConsoleInputReader; import view.input.ConsoleInputView; +import view.input.InputReader; import view.input.InputView; import view.output.ConsoleOutputView; +import view.output.ConsoleOutputWriter; import view.output.OutputView; +import view.output.OutputWriter; public class BlackjackApplication { public static void main(String[] args) { - InputView inputView = new ConsoleInputView(); + InputReader inputReader = new ConsoleInputReader(); + OutputWriter outputWriter = new ConsoleOutputWriter(); + InputView inputView = new ConsoleInputView(inputReader, outputWriter); OutputView outputView = new ConsoleOutputView(); BlackjackSimulator blackjackSimulator = new BlackjackSimulator(inputView, outputView); diff --git a/src/main/java/util/CollectionUtils.java b/src/main/java/util/CollectionUtils.java new file mode 100644 index 00000000000..48e5691e23f --- /dev/null +++ b/src/main/java/util/CollectionUtils.java @@ -0,0 +1,11 @@ +package util; + +import java.util.Collection; +import java.util.Objects; + +public abstract class CollectionUtils { + + public static boolean isEmpty(Collection collection) { + return Objects.isNull(collection) || collection.isEmpty(); + } +} diff --git a/src/main/java/util/Console.java b/src/main/java/util/Console.java new file mode 100644 index 00000000000..795be66b39f --- /dev/null +++ b/src/main/java/util/Console.java @@ -0,0 +1,17 @@ +package util; + +import java.io.BufferedReader; +import java.io.IOException; +import java.io.InputStreamReader; + +public abstract class Console { + + public static String readLine() { + BufferedReader bufferedReader = new BufferedReader(new InputStreamReader(System.in)); + try { + return bufferedReader.readLine(); + } catch (IOException e) { + throw new RuntimeException(e); + } + } +} diff --git a/src/main/java/util/StringUtils.java b/src/main/java/util/StringUtils.java new file mode 100644 index 00000000000..e656057dcb4 --- /dev/null +++ b/src/main/java/util/StringUtils.java @@ -0,0 +1,20 @@ +package util; + +import java.util.Objects; + +public abstract class StringUtils { + + private static final String EMPTY_STRING = ""; + + public static boolean isEmpty(String str) { + return Objects.isNull(str) || str.isEmpty(); + } + + public static String trim(String str) { + if (Objects.isNull(str)) { + return EMPTY_STRING; + } + + return str.trim(); + } +} diff --git a/src/main/java/view/input/ConsoleInputReader.java b/src/main/java/view/input/ConsoleInputReader.java new file mode 100644 index 00000000000..f45d28c0dbf --- /dev/null +++ b/src/main/java/view/input/ConsoleInputReader.java @@ -0,0 +1,19 @@ +package view.input; + +import java.io.BufferedReader; +import java.io.IOException; +import java.io.InputStreamReader; + +public class ConsoleInputReader implements InputReader { + + private final BufferedReader bufferedReader = new BufferedReader(new InputStreamReader(System.in)); + + @Override + public String readLine() { + try { + return bufferedReader.readLine(); + } catch (IOException e) { + throw new RuntimeException(e); + } + } +} diff --git a/src/main/java/view/input/ConsoleInputView.java b/src/main/java/view/input/ConsoleInputView.java index 32c3e2835d0..f792c6c62c2 100644 --- a/src/main/java/view/input/ConsoleInputView.java +++ b/src/main/java/view/input/ConsoleInputView.java @@ -1,9 +1,26 @@ package view.input; -public class ConsoleInputView implements InputView{ +import view.input.dto.PlayersInput; +import view.output.OutputWriter; + +public class ConsoleInputView implements InputView { + + private final static String PLAYERS_NAVIGATION = "게임에 참여할 사람의 이름을 입력하세요.(쉼표 기준으로 분리)"; + + private final InputReader inputReader; + private final OutputWriter outputWriter; + + public ConsoleInputView(InputReader inputReader, OutputWriter outputWriter) { + this.inputReader = inputReader; + this.outputWriter = outputWriter; + } + @Override - public void viewPlayers() { + public PlayersInput viewPlayers() { + outputWriter.writeLine(PLAYERS_NAVIGATION); + String input = inputReader.readLine(); + return PlayersInput.from(input); } @Override diff --git a/src/main/java/view/input/InputReader.java b/src/main/java/view/input/InputReader.java new file mode 100644 index 00000000000..b7fb2d2a116 --- /dev/null +++ b/src/main/java/view/input/InputReader.java @@ -0,0 +1,6 @@ +package view.input; + +public interface InputReader { + + String readLine(); +} diff --git a/src/main/java/view/input/InputView.java b/src/main/java/view/input/InputView.java index 4bdeb8b9744..d0827714cb1 100644 --- a/src/main/java/view/input/InputView.java +++ b/src/main/java/view/input/InputView.java @@ -1,8 +1,10 @@ package view.input; +import view.input.dto.PlayersInput; + public interface InputView { - void viewPlayers(); + PlayersInput viewPlayers(); void viewInitCards(); diff --git a/src/main/java/view/input/dto/PlayersInput.java b/src/main/java/view/input/dto/PlayersInput.java new file mode 100644 index 00000000000..d91712d93b9 --- /dev/null +++ b/src/main/java/view/input/dto/PlayersInput.java @@ -0,0 +1,28 @@ +package view.input.dto; + +import util.CollectionUtils; +import util.StringUtils; + +import java.util.Arrays; +import java.util.List; +import java.util.stream.Collectors; + +public class PlayersInput { + + private final List playerNames; + + private PlayersInput(List playerNames) { + this.validateIsEmpty(playerNames); + this.playerNames = playerNames; + } + + public static PlayersInput from(String input) { + return new PlayersInput(Arrays.stream(StringUtils.trim(input).split(",")).collect(Collectors.toList())); + } + + private void validateIsEmpty(List playerNames) { + if (CollectionUtils.isEmpty(playerNames)) { + throw new IllegalArgumentException("최소 1명의 플레이어가 있어야 합니다."); + } + } +} diff --git a/src/main/java/view/output/ConsoleOutputWriter.java b/src/main/java/view/output/ConsoleOutputWriter.java new file mode 100644 index 00000000000..37135ac891d --- /dev/null +++ b/src/main/java/view/output/ConsoleOutputWriter.java @@ -0,0 +1,8 @@ +package view.output; + +public class ConsoleOutputWriter implements OutputWriter { + @Override + public void writeLine(String message) { + System.out.println(message); + } +} diff --git a/src/main/java/view/output/OutputWriter.java b/src/main/java/view/output/OutputWriter.java new file mode 100644 index 00000000000..726cd02eb56 --- /dev/null +++ b/src/main/java/view/output/OutputWriter.java @@ -0,0 +1,6 @@ +package view.output; + +public interface OutputWriter { + + void writeLine(String message); +} From 2e48e461833f84425453ac6d4001b4763214e91a Mon Sep 17 00:00:00 2001 From: kilian Date: Sat, 25 May 2024 17:59:31 +0900 Subject: [PATCH 06/22] =?UTF-8?q?feat=20:=20=ED=94=8C=EB=A0=88=EC=9D=B4?= =?UTF-8?q?=EC=96=B4=20=EB=8F=84=EB=A9=94=EC=9D=B8=20=EA=B0=9D=EC=B2=B4=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/Controller/BlackjackSimulator.java | 6 +++++- src/main/java/domain/BlackjackPlayer.java | 10 ++++++++++ src/main/java/domain/BlackjackPlayerName.java | 10 ++++++++++ src/main/java/domain/BlackjackPlayers.java | 13 +++++++++++++ src/main/java/view/input/dto/PlayersInput.java | 12 ++++++++++++ 5 files changed, 50 insertions(+), 1 deletion(-) create mode 100644 src/main/java/domain/BlackjackPlayer.java create mode 100644 src/main/java/domain/BlackjackPlayerName.java create mode 100644 src/main/java/domain/BlackjackPlayers.java diff --git a/src/main/java/Controller/BlackjackSimulator.java b/src/main/java/Controller/BlackjackSimulator.java index 345c12d4a8e..ffa54c4bb2e 100644 --- a/src/main/java/Controller/BlackjackSimulator.java +++ b/src/main/java/Controller/BlackjackSimulator.java @@ -1,6 +1,8 @@ package Controller; +import domain.BlackjackPlayers; import view.input.InputView; +import view.input.dto.PlayersInput; import view.output.OutputView; public class BlackjackSimulator { @@ -14,6 +16,8 @@ public BlackjackSimulator(InputView inputView, OutputView outputView) { } public void run() { - + PlayersInput playersInput = inputView.viewPlayers(); + BlackjackPlayers blackjackPlayers = playersInput.toBlackjackPlayers(); + } } diff --git a/src/main/java/domain/BlackjackPlayer.java b/src/main/java/domain/BlackjackPlayer.java new file mode 100644 index 00000000000..01f1d9040bc --- /dev/null +++ b/src/main/java/domain/BlackjackPlayer.java @@ -0,0 +1,10 @@ +package domain; + +public class BlackjackPlayer { + + private final BlackjackPlayerName blackjackPlayerName; + + public BlackjackPlayer(BlackjackPlayerName blackjackPlayerName) { + this.blackjackPlayerName = blackjackPlayerName; + } +} diff --git a/src/main/java/domain/BlackjackPlayerName.java b/src/main/java/domain/BlackjackPlayerName.java new file mode 100644 index 00000000000..4aab15055d3 --- /dev/null +++ b/src/main/java/domain/BlackjackPlayerName.java @@ -0,0 +1,10 @@ +package domain; + +public class BlackjackPlayerName { + + private final String name; + + public BlackjackPlayerName(String name) { + this.name = name; + } +} diff --git a/src/main/java/domain/BlackjackPlayers.java b/src/main/java/domain/BlackjackPlayers.java new file mode 100644 index 00000000000..691d3b099aa --- /dev/null +++ b/src/main/java/domain/BlackjackPlayers.java @@ -0,0 +1,13 @@ +package domain; + +import java.util.List; + +public class BlackjackPlayers { + + private final List blackjackPlayers; + + public BlackjackPlayers(List blackjackPlayers) { + this.blackjackPlayers = blackjackPlayers; + } + +} diff --git a/src/main/java/view/input/dto/PlayersInput.java b/src/main/java/view/input/dto/PlayersInput.java index d91712d93b9..8cc1bbbca9c 100644 --- a/src/main/java/view/input/dto/PlayersInput.java +++ b/src/main/java/view/input/dto/PlayersInput.java @@ -1,5 +1,8 @@ package view.input.dto; +import domain.BlackjackPlayer; +import domain.BlackjackPlayerName; +import domain.BlackjackPlayers; import util.CollectionUtils; import util.StringUtils; @@ -25,4 +28,13 @@ private void validateIsEmpty(List playerNames) { throw new IllegalArgumentException("최소 1명의 플레이어가 있어야 합니다."); } } + + public BlackjackPlayers toBlackjackPlayers() { + return new BlackjackPlayers( + this.playerNames.stream() + .map(BlackjackPlayerName::new) + .map(BlackjackPlayer::new) + .collect(Collectors.toList()) + ); + } } From c769c0c71a88fdd5e7239b8221bd7063ce68c5de Mon Sep 17 00:00:00 2001 From: kilian Date: Sat, 25 May 2024 19:07:04 +0900 Subject: [PATCH 07/22] =?UTF-8?q?feat=20:=20=ED=8A=B8=EB=9F=BC=ED=94=84=20?= =?UTF-8?q?=EC=B9=B4=EB=93=9C=20=EC=83=9D=EC=84=B1?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../java/Controller/BlackjackSimulator.java | 9 ++++-- src/main/java/domain/TrumpCard.java | 28 +++++++++++++++++++ src/main/java/domain/TrumpCardRank.java | 26 +++++++++++++++++ src/main/java/domain/TrumpCardSuit.java | 15 ++++++++++ .../java/view/input/ConsoleInputView.java | 6 +--- src/main/java/view/input/InputView.java | 2 -- .../java/view/input/dto/PlayersInput.java | 13 +++------ .../java/view/output/ConsoleOutputView.java | 8 ++++++ src/main/java/view/output/OutputView.java | 2 ++ .../view/output/dto/InitHandOutOutput.java | 15 ++++++++++ .../dto/InitHandOutParticipantOutput.java | 14 ++++++++++ 11 files changed, 119 insertions(+), 19 deletions(-) create mode 100644 src/main/java/domain/TrumpCard.java create mode 100644 src/main/java/domain/TrumpCardRank.java create mode 100644 src/main/java/domain/TrumpCardSuit.java create mode 100644 src/main/java/view/output/dto/InitHandOutOutput.java create mode 100644 src/main/java/view/output/dto/InitHandOutParticipantOutput.java diff --git a/src/main/java/Controller/BlackjackSimulator.java b/src/main/java/Controller/BlackjackSimulator.java index ffa54c4bb2e..420b24bf741 100644 --- a/src/main/java/Controller/BlackjackSimulator.java +++ b/src/main/java/Controller/BlackjackSimulator.java @@ -1,10 +1,12 @@ package Controller; -import domain.BlackjackPlayers; +import domain.BlackjackPlayerName; import view.input.InputView; import view.input.dto.PlayersInput; import view.output.OutputView; +import java.util.List; + public class BlackjackSimulator { private final InputView inputView; @@ -17,7 +19,8 @@ public BlackjackSimulator(InputView inputView, OutputView outputView) { public void run() { PlayersInput playersInput = inputView.viewPlayers(); - BlackjackPlayers blackjackPlayers = playersInput.toBlackjackPlayers(); - + List blackjackPlayerNames = playersInput.toBlackjackPlayerNames(); + + } } diff --git a/src/main/java/domain/TrumpCard.java b/src/main/java/domain/TrumpCard.java new file mode 100644 index 00000000000..1beb950a04c --- /dev/null +++ b/src/main/java/domain/TrumpCard.java @@ -0,0 +1,28 @@ +package domain; + +import java.util.Objects; + +public class TrumpCard { + + private final TrumpCardRank trumpCardRank; + + private final TrumpCardSuit trumpCardSuit; + + public TrumpCard(TrumpCardRank trumpCardRank, TrumpCardSuit trumpCardSuit) { + this.trumpCardRank = trumpCardRank; + this.trumpCardSuit = trumpCardSuit; + } + + @Override + public boolean equals(Object o) { + if (this == o) return true; + if (o == null || getClass() != o.getClass()) return false; + TrumpCard trumpCard = (TrumpCard) o; + return trumpCardRank == trumpCard.trumpCardRank && trumpCardSuit == trumpCard.trumpCardSuit; + } + + @Override + public int hashCode() { + return Objects.hash(trumpCardRank, trumpCardSuit); + } +} diff --git a/src/main/java/domain/TrumpCardRank.java b/src/main/java/domain/TrumpCardRank.java new file mode 100644 index 00000000000..12ae7d8320a --- /dev/null +++ b/src/main/java/domain/TrumpCardRank.java @@ -0,0 +1,26 @@ +package domain; + +import java.util.List; + +public enum TrumpCardRank { + ONE(List.of(1, 10)), + TWO(List.of(2)), + THREE(List.of(3)), + FOUR(List.of(4)), + FIVE(List.of(5)), + SIX(List.of(6)), + SEVEN(List.of(7)), + EIGHT(List.of(8)), + NINE(List.of(9)), + TEN(List.of(10)), + KING(List.of(10)), + QUEEN(List.of(10)), + JACK(List.of(10)); + + + private final List values; + + TrumpCardRank(List values) { + this.values = values; + } +} diff --git a/src/main/java/domain/TrumpCardSuit.java b/src/main/java/domain/TrumpCardSuit.java new file mode 100644 index 00000000000..d3fc33ae372 --- /dev/null +++ b/src/main/java/domain/TrumpCardSuit.java @@ -0,0 +1,15 @@ +package domain; + +public enum TrumpCardSuit { + + HEARTS("하트"), + DIAMONDS("다이아몬드"), + CLUBS("클로버"), + SPADES("스페이드"); + + private final String koreanName; + + TrumpCardSuit(String koreanName) { + this.koreanName = koreanName; + } +} diff --git a/src/main/java/view/input/ConsoleInputView.java b/src/main/java/view/input/ConsoleInputView.java index f792c6c62c2..4290fdb47ca 100644 --- a/src/main/java/view/input/ConsoleInputView.java +++ b/src/main/java/view/input/ConsoleInputView.java @@ -17,17 +17,13 @@ public ConsoleInputView(InputReader inputReader, OutputWriter outputWriter) { @Override public PlayersInput viewPlayers() { + outputWriter.writeLine(PLAYERS_NAVIGATION); String input = inputReader.readLine(); return PlayersInput.from(input); } - @Override - public void viewInitCards() { - - } - @Override public void viewMoreCard() { diff --git a/src/main/java/view/input/InputView.java b/src/main/java/view/input/InputView.java index d0827714cb1..965df07b830 100644 --- a/src/main/java/view/input/InputView.java +++ b/src/main/java/view/input/InputView.java @@ -6,8 +6,6 @@ public interface InputView { PlayersInput viewPlayers(); - void viewInitCards(); - void viewMoreCard(); void viewThresholdCard(); diff --git a/src/main/java/view/input/dto/PlayersInput.java b/src/main/java/view/input/dto/PlayersInput.java index 8cc1bbbca9c..732ce122f74 100644 --- a/src/main/java/view/input/dto/PlayersInput.java +++ b/src/main/java/view/input/dto/PlayersInput.java @@ -1,8 +1,6 @@ package view.input.dto; -import domain.BlackjackPlayer; import domain.BlackjackPlayerName; -import domain.BlackjackPlayers; import util.CollectionUtils; import util.StringUtils; @@ -29,12 +27,9 @@ private void validateIsEmpty(List playerNames) { } } - public BlackjackPlayers toBlackjackPlayers() { - return new BlackjackPlayers( - this.playerNames.stream() - .map(BlackjackPlayerName::new) - .map(BlackjackPlayer::new) - .collect(Collectors.toList()) - ); + public List toBlackjackPlayerNames() { + return this.playerNames.stream() + .map(BlackjackPlayerName::new) + .collect(Collectors.toList()); } } diff --git a/src/main/java/view/output/ConsoleOutputView.java b/src/main/java/view/output/ConsoleOutputView.java index 8aaf0fcfec2..f86550a0246 100644 --- a/src/main/java/view/output/ConsoleOutputView.java +++ b/src/main/java/view/output/ConsoleOutputView.java @@ -1,6 +1,14 @@ package view.output; public class ConsoleOutputView implements OutputView { + + private final static String HAND_OUT_CARDS_NAVIGATION = "딜러와 %s에게 %d장을 나누었습니다."; + + @Override + public void viewInitialParticipantsCards() { + + } + @Override public void viewParticipantsCards() { diff --git a/src/main/java/view/output/OutputView.java b/src/main/java/view/output/OutputView.java index e3f4f2d6216..aa95f850464 100644 --- a/src/main/java/view/output/OutputView.java +++ b/src/main/java/view/output/OutputView.java @@ -2,6 +2,8 @@ public interface OutputView { + void viewInitialParticipantsCards(); + void viewParticipantsCards(); void viewWinOrLose(); diff --git a/src/main/java/view/output/dto/InitHandOutOutput.java b/src/main/java/view/output/dto/InitHandOutOutput.java new file mode 100644 index 00000000000..79270e47a06 --- /dev/null +++ b/src/main/java/view/output/dto/InitHandOutOutput.java @@ -0,0 +1,15 @@ +package view.output.dto; + +import java.util.List; + +public class InitHandOutOutput { + + private final int handOutCardsCount; + + private final List initHandOutParticipantOutputs; + + public InitHandOutOutput(int handOutCardsCount, List initHandOutParticipantOutputs) { + this.handOutCardsCount = handOutCardsCount; + this.initHandOutParticipantOutputs = initHandOutParticipantOutputs; + } +} diff --git a/src/main/java/view/output/dto/InitHandOutParticipantOutput.java b/src/main/java/view/output/dto/InitHandOutParticipantOutput.java new file mode 100644 index 00000000000..6cd44d79ac5 --- /dev/null +++ b/src/main/java/view/output/dto/InitHandOutParticipantOutput.java @@ -0,0 +1,14 @@ +package view.output.dto; + +import java.util.List; + +public class InitHandOutParticipantOutput { + + private final String participantName; + private final List cards; + + public InitHandOutParticipantOutput(String participantName, List cards) { + this.participantName = participantName; + this.cards = cards; + } +} From b8077160dabac86cd6275999cb1db830fda9b748 Mon Sep 17 00:00:00 2001 From: kilian Date: Sun, 26 May 2024 20:44:58 +0900 Subject: [PATCH 08/22] =?UTF-8?q?feat=20:=20=EC=B5=9C=EC=B4=88=20=EC=B9=B4?= =?UTF-8?q?=EB=93=9C=20=EB=82=98=EB=88=84=EA=B8=B0=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/BlackjackApplication.java | 2 +- .../java/Controller/BlackjackSimulator.java | 12 ++- src/main/java/domain/BlackjackDealer.java | 27 +++++++ src/main/java/domain/BlackjackGame.java | 38 +++++++++ .../java/domain/BlackjackParticipant.java | 10 +++ .../java/domain/BlackjackParticipants.java | 53 +++++++++++++ src/main/java/domain/BlackjackPlayer.java | 22 +++++- src/main/java/domain/BlackjackPlayerName.java | 7 ++ src/main/java/domain/BlackjackPlayers.java | 14 +++- src/main/java/domain/HandOutCount.java | 21 +++++ src/main/java/domain/TrumpCard.java | 7 ++ src/main/java/domain/TrumpCardDeck.java | 24 ++++++ src/main/java/domain/TrumpCardRank.java | 38 +++++---- src/main/java/domain/TrumpCardSuit.java | 4 + src/main/java/domain/TrumpCards.java | 79 +++++++++++++++++++ .../BlackjackParticipantsValidator.java | 19 +++++ .../BlackjackPlayerNameValidator.java | 16 ++++ .../domain/validator/TrumpCardValidator.java | 23 ++++++ .../domain/validator/TrumpCardsValidator.java | 23 ++++++ .../java/view/input/ConsoleInputView.java | 1 - .../java/view/output/ConsoleOutputView.java | 34 +++++++- .../java/view/output/ConsoleOutputWriter.java | 10 +++ src/main/java/view/output/OutputView.java | 4 +- src/main/java/view/output/OutputWriter.java | 4 + .../view/output/dto/InitialHandOutOutput.java | 43 ++++++++++ .../dto/InitialHandOutParticipantOutput.java | 54 +++++++++++++ 26 files changed, 565 insertions(+), 24 deletions(-) create mode 100644 src/main/java/domain/BlackjackDealer.java create mode 100644 src/main/java/domain/BlackjackGame.java create mode 100644 src/main/java/domain/BlackjackParticipant.java create mode 100644 src/main/java/domain/BlackjackParticipants.java create mode 100644 src/main/java/domain/HandOutCount.java create mode 100644 src/main/java/domain/TrumpCardDeck.java create mode 100644 src/main/java/domain/TrumpCards.java create mode 100644 src/main/java/domain/validator/BlackjackParticipantsValidator.java create mode 100644 src/main/java/domain/validator/BlackjackPlayerNameValidator.java create mode 100644 src/main/java/domain/validator/TrumpCardValidator.java create mode 100644 src/main/java/domain/validator/TrumpCardsValidator.java create mode 100644 src/main/java/view/output/dto/InitialHandOutOutput.java create mode 100644 src/main/java/view/output/dto/InitialHandOutParticipantOutput.java diff --git a/src/main/java/BlackjackApplication.java b/src/main/java/BlackjackApplication.java index 8aad5cd9f36..0e48fabb4dc 100644 --- a/src/main/java/BlackjackApplication.java +++ b/src/main/java/BlackjackApplication.java @@ -14,7 +14,7 @@ public static void main(String[] args) { InputReader inputReader = new ConsoleInputReader(); OutputWriter outputWriter = new ConsoleOutputWriter(); InputView inputView = new ConsoleInputView(inputReader, outputWriter); - OutputView outputView = new ConsoleOutputView(); + OutputView outputView = new ConsoleOutputView(outputWriter); BlackjackSimulator blackjackSimulator = new BlackjackSimulator(inputView, outputView); blackjackSimulator.run(); diff --git a/src/main/java/Controller/BlackjackSimulator.java b/src/main/java/Controller/BlackjackSimulator.java index 420b24bf741..e70b2603920 100644 --- a/src/main/java/Controller/BlackjackSimulator.java +++ b/src/main/java/Controller/BlackjackSimulator.java @@ -1,9 +1,10 @@ package Controller; -import domain.BlackjackPlayerName; +import domain.*; import view.input.InputView; import view.input.dto.PlayersInput; import view.output.OutputView; +import view.output.dto.InitialHandOutOutput; import java.util.List; @@ -20,6 +21,15 @@ public BlackjackSimulator(InputView inputView, OutputView outputView) { public void run() { PlayersInput playersInput = inputView.viewPlayers(); List blackjackPlayerNames = playersInput.toBlackjackPlayerNames(); + BlackjackPlayers blackjackPlayers = BlackjackPlayers.fromNamesWithEmptyCards(blackjackPlayerNames); + BlackjackDealer blackjackDealer = BlackjackDealer.createWithEmptyCards(); + TrumpCardDeck trumpCardDeck = new TrumpCardDeck(); + + BlackjackGame blackjackGame = new BlackjackGame(BlackjackParticipants.of(blackjackDealer, blackjackPlayers), trumpCardDeck); + HandOutCount handOutCount = new HandOutCount(2); + BlackjackGame initialHandOutGame = blackjackGame.initialHandOut(handOutCount); + InitialHandOutOutput initialHandOutOutput = InitialHandOutOutput.of(handOutCount, initialHandOutGame.getBlackjackParticipants()); + outputView.viewInitialHandOut(initialHandOutOutput); } diff --git a/src/main/java/domain/BlackjackDealer.java b/src/main/java/domain/BlackjackDealer.java new file mode 100644 index 00000000000..d1b98ea73f0 --- /dev/null +++ b/src/main/java/domain/BlackjackDealer.java @@ -0,0 +1,27 @@ +package domain; + +import java.util.List; + +public class BlackjackDealer implements BlackjackParticipant { + + private final TrumpCards trumpCards; + + public BlackjackDealer(TrumpCards trumpCards) { + this.trumpCards = trumpCards; + } + + public static BlackjackDealer createWithEmptyCards() { + return new BlackjackDealer(TrumpCards.createEmptyCards()); + } + + + @Override + public BlackjackDealer receiveCard(TrumpCard trumpCard) { + return new BlackjackDealer(this.trumpCards.addCard(trumpCard)); + } + + @Override + public List fetchKoreanCardNames() { + return this.trumpCards.fetchKoreanNames(); + } +} diff --git a/src/main/java/domain/BlackjackGame.java b/src/main/java/domain/BlackjackGame.java new file mode 100644 index 00000000000..fb7c2679d4a --- /dev/null +++ b/src/main/java/domain/BlackjackGame.java @@ -0,0 +1,38 @@ +package domain; + +import java.util.ArrayList; + +public class BlackjackGame { + + private final BlackjackParticipants blackjackParticipants; + private final TrumpCardDeck trumpCardDeck; + + public BlackjackGame(BlackjackParticipants blackjackParticipants, TrumpCardDeck trumpCardDeck) { + this.blackjackParticipants = blackjackParticipants; + this.trumpCardDeck = trumpCardDeck; + } + + public BlackjackGame initialHandOut(HandOutCount handOutCount) { + BlackjackGame blackjackGame = this; + TrumpCardDeck trumpCardDeck = this.trumpCardDeck; + + for (int i = 0; i < handOutCount.getHandOutCount(); i++) { + ArrayList trumpCards = new ArrayList<>(); + + for (int j = 0; j < blackjackParticipants.size(); j++) { + TrumpCard trumpCard = trumpCardDeck.fetchTopOne(); + trumpCardDeck = trumpCardDeck.takeOutTopOne(); + trumpCards.add(trumpCard); + } + + BlackjackParticipants handOutParticipants = blackjackGame.getBlackjackParticipants().handOutOneCardForAll(new TrumpCards(trumpCards)); + blackjackGame = new BlackjackGame(handOutParticipants, trumpCardDeck); + } + + return blackjackGame; + } + + public BlackjackParticipants getBlackjackParticipants() { + return this.blackjackParticipants; + } +} diff --git a/src/main/java/domain/BlackjackParticipant.java b/src/main/java/domain/BlackjackParticipant.java new file mode 100644 index 00000000000..74b37a72126 --- /dev/null +++ b/src/main/java/domain/BlackjackParticipant.java @@ -0,0 +1,10 @@ +package domain; + +import java.util.List; + +public interface BlackjackParticipant { + + BlackjackParticipant receiveCard(TrumpCard trumpCard); + + List fetchKoreanCardNames(); +} diff --git a/src/main/java/domain/BlackjackParticipants.java b/src/main/java/domain/BlackjackParticipants.java new file mode 100644 index 00000000000..d24c404438c --- /dev/null +++ b/src/main/java/domain/BlackjackParticipants.java @@ -0,0 +1,53 @@ +package domain; + +import domain.validator.BlackjackParticipantsValidator; + +import java.util.ArrayList; +import java.util.List; +import java.util.stream.Collectors; +import java.util.stream.IntStream; + +public class BlackjackParticipants { + + private final List blackjackParticipants; + + public BlackjackParticipants(List blackjackParticipants) { + BlackjackParticipantsValidator.validate(blackjackParticipants); + this.blackjackParticipants = blackjackParticipants; + } + + public static BlackjackParticipants of(BlackjackDealer blackjackDealer, BlackjackPlayers blackjackPlayers) { + ArrayList participants = new ArrayList<>(); + participants.add(blackjackDealer); + participants.addAll(blackjackPlayers.fetchBlackjackParticipant()); + + return new BlackjackParticipants( + participants + ); + } + + public BlackjackParticipants handOutOneCardForAll(TrumpCards trumpCards) { + this.validateParticipantsAndTrumpCardSizeEqual(trumpCards); + List cards = trumpCards.getCards(); + + return new BlackjackParticipants( + IntStream.range(0, this.size()) + .mapToObj(index -> this.blackjackParticipants.get(index).receiveCard(cards.get(index))) + .collect(Collectors.toList()) + ); + } + + private void validateParticipantsAndTrumpCardSizeEqual(TrumpCards trumpCards) { + if (this.size() != trumpCards.size()) { + throw new IllegalArgumentException("카드는 무조건 한장씩 나눠줘야 합니다."); + } + } + + public int size() { + return this.blackjackParticipants.size(); + } + + public List getBlackjackParticipants() { + return List.copyOf(this.blackjackParticipants); + } +} diff --git a/src/main/java/domain/BlackjackPlayer.java b/src/main/java/domain/BlackjackPlayer.java index 01f1d9040bc..7a919e9c685 100644 --- a/src/main/java/domain/BlackjackPlayer.java +++ b/src/main/java/domain/BlackjackPlayer.java @@ -1,10 +1,28 @@ package domain; -public class BlackjackPlayer { +import java.util.List; + +public class BlackjackPlayer implements BlackjackParticipant { private final BlackjackPlayerName blackjackPlayerName; + private final TrumpCards trumpCards; - public BlackjackPlayer(BlackjackPlayerName blackjackPlayerName) { + public BlackjackPlayer(BlackjackPlayerName blackjackPlayerName, TrumpCards trumpCards) { this.blackjackPlayerName = blackjackPlayerName; + this.trumpCards = trumpCards; + } + + @Override + public BlackjackParticipant receiveCard(TrumpCard trumpCard) { + return new BlackjackPlayer(this.blackjackPlayerName, this.trumpCards.addCard(trumpCard)); + } + + @Override + public List fetchKoreanCardNames() { + return this.trumpCards.fetchKoreanNames(); + } + + public String getPlayerName() { + return blackjackPlayerName.getName(); } } diff --git a/src/main/java/domain/BlackjackPlayerName.java b/src/main/java/domain/BlackjackPlayerName.java index 4aab15055d3..8013314debc 100644 --- a/src/main/java/domain/BlackjackPlayerName.java +++ b/src/main/java/domain/BlackjackPlayerName.java @@ -1,10 +1,17 @@ package domain; +import domain.validator.BlackjackPlayerNameValidator; + public class BlackjackPlayerName { private final String name; public BlackjackPlayerName(String name) { + BlackjackPlayerNameValidator.validate(name); this.name = name; } + + public String getName() { + return name; + } } diff --git a/src/main/java/domain/BlackjackPlayers.java b/src/main/java/domain/BlackjackPlayers.java index 691d3b099aa..0ec9a206456 100644 --- a/src/main/java/domain/BlackjackPlayers.java +++ b/src/main/java/domain/BlackjackPlayers.java @@ -1,6 +1,7 @@ package domain; import java.util.List; +import java.util.stream.Collectors; public class BlackjackPlayers { @@ -9,5 +10,16 @@ public class BlackjackPlayers { public BlackjackPlayers(List blackjackPlayers) { this.blackjackPlayers = blackjackPlayers; } - + + public static BlackjackPlayers fromNamesWithEmptyCards(List blackjackPlayerNames) { + return new BlackjackPlayers( + blackjackPlayerNames.stream() + .map(name -> new BlackjackPlayer(name, TrumpCards.createEmptyCards())) + .collect(Collectors.toList()) + ); + } + + public List fetchBlackjackParticipant() { + return List.copyOf(this.blackjackPlayers); + } } diff --git a/src/main/java/domain/HandOutCount.java b/src/main/java/domain/HandOutCount.java new file mode 100644 index 00000000000..0de69acdd23 --- /dev/null +++ b/src/main/java/domain/HandOutCount.java @@ -0,0 +1,21 @@ +package domain; + +public class HandOutCount { + + private final int handOutCount; + + public HandOutCount(int handOutCount) { + + this.handOutCount = handOutCount; + } + + public int getHandOutCount() { + return this.handOutCount; + } + + private void validateGreaterThanZero(int handOutCount) { + if (handOutCount <= 0) { + throw new IllegalArgumentException("나눠주는 카드는 무조건 1장 이상이어야 합니다."); + } + } +} diff --git a/src/main/java/domain/TrumpCard.java b/src/main/java/domain/TrumpCard.java index 1beb950a04c..7dd5a2b18c0 100644 --- a/src/main/java/domain/TrumpCard.java +++ b/src/main/java/domain/TrumpCard.java @@ -1,5 +1,7 @@ package domain; +import domain.validator.TrumpCardValidator; + import java.util.Objects; public class TrumpCard { @@ -9,10 +11,15 @@ public class TrumpCard { private final TrumpCardSuit trumpCardSuit; public TrumpCard(TrumpCardRank trumpCardRank, TrumpCardSuit trumpCardSuit) { + TrumpCardValidator.validate(trumpCardRank, trumpCardSuit); this.trumpCardRank = trumpCardRank; this.trumpCardSuit = trumpCardSuit; } + public String fetchKoreanName() { + return this.trumpCardRank.getExpression() + this.trumpCardSuit.getKoreanName(); + } + @Override public boolean equals(Object o) { if (this == o) return true; diff --git a/src/main/java/domain/TrumpCardDeck.java b/src/main/java/domain/TrumpCardDeck.java new file mode 100644 index 00000000000..87c2871d75b --- /dev/null +++ b/src/main/java/domain/TrumpCardDeck.java @@ -0,0 +1,24 @@ +package domain; + +public class TrumpCardDeck { + + private final TrumpCards trumpCards; + + public TrumpCardDeck() { + this.trumpCards = TrumpCards.createAll().shuffle(); + } + + public TrumpCardDeck(TrumpCards trumpCards) { + this.trumpCards = trumpCards; + } + + public TrumpCard fetchTopOne() { + return this.trumpCards.fetchTopOne(); + } + + public TrumpCardDeck takeOutTopOne() { + return new TrumpCardDeck( + this.trumpCards.takeOutTopOne() + ); + } +} diff --git a/src/main/java/domain/TrumpCardRank.java b/src/main/java/domain/TrumpCardRank.java index 12ae7d8320a..5c768703789 100644 --- a/src/main/java/domain/TrumpCardRank.java +++ b/src/main/java/domain/TrumpCardRank.java @@ -3,24 +3,34 @@ import java.util.List; public enum TrumpCardRank { - ONE(List.of(1, 10)), - TWO(List.of(2)), - THREE(List.of(3)), - FOUR(List.of(4)), - FIVE(List.of(5)), - SIX(List.of(6)), - SEVEN(List.of(7)), - EIGHT(List.of(8)), - NINE(List.of(9)), - TEN(List.of(10)), - KING(List.of(10)), - QUEEN(List.of(10)), - JACK(List.of(10)); + ONE(List.of(1, 10), "1"), + TWO(List.of(2), "2"), + THREE(List.of(3), "3"), + FOUR(List.of(4), "4"), + FIVE(List.of(5), "5"), + SIX(List.of(6), "6"), + SEVEN(List.of(7), "7"), + EIGHT(List.of(8), "8"), + NINE(List.of(9), "9"), + TEN(List.of(10), "10"), + KING(List.of(10), "K"), + QUEEN(List.of(10), "Q"), + JACK(List.of(10), "J"); private final List values; + private final String expression; - TrumpCardRank(List values) { + TrumpCardRank(List values, String expression) { this.values = values; + this.expression = expression; + } + + public List getValues() { + return values; + } + + public String getExpression() { + return expression; } } diff --git a/src/main/java/domain/TrumpCardSuit.java b/src/main/java/domain/TrumpCardSuit.java index d3fc33ae372..85ddda0baca 100644 --- a/src/main/java/domain/TrumpCardSuit.java +++ b/src/main/java/domain/TrumpCardSuit.java @@ -12,4 +12,8 @@ public enum TrumpCardSuit { TrumpCardSuit(String koreanName) { this.koreanName = koreanName; } + + public String getKoreanName() { + return koreanName; + } } diff --git a/src/main/java/domain/TrumpCards.java b/src/main/java/domain/TrumpCards.java new file mode 100644 index 00000000000..d1a15a796d8 --- /dev/null +++ b/src/main/java/domain/TrumpCards.java @@ -0,0 +1,79 @@ +package domain; + +import domain.validator.TrumpCardsValidator; + +import java.util.ArrayList; +import java.util.Arrays; +import java.util.Collections; +import java.util.List; +import java.util.stream.Collectors; + +public class TrumpCards { + + private final List trumpCards; + + public TrumpCards(List trumpCards) { + TrumpCardsValidator.validate(trumpCards); + this.trumpCards = trumpCards; + } + + public static TrumpCards createAll() { + return new TrumpCards( + Arrays.stream(TrumpCardRank.values()) + .flatMap(rank -> Arrays.stream(TrumpCardSuit.values()) + .map(suit -> new TrumpCard(rank, suit)) + ).collect(Collectors.toList()) + ); + } + + public static TrumpCards createEmptyCards() { + return new TrumpCards( + Collections.emptyList() + ); + } + + public TrumpCards shuffle() { + Collections.shuffle(this.trumpCards); + + return new TrumpCards(List.copyOf(this.trumpCards)); + } + + public TrumpCard fetchTopOne() { + this.validateHasCard(); + + return this.trumpCards.get(0); + } + + public TrumpCards takeOutTopOne() { + this.validateHasCard(); + + return new TrumpCards(this.trumpCards.subList(1, this.size())); + } + + private void validateHasCard() { + if (this.trumpCards.size() == 0) { + throw new IllegalStateException("카드가 없습니다."); + } + } + + public TrumpCards addCard(TrumpCard trumpCard) { + ArrayList trumpCards = new ArrayList<>(this.trumpCards); + trumpCards.add(trumpCard); + + return new TrumpCards(Collections.unmodifiableList(trumpCards)); + } + + public List getCards() { + return List.copyOf(this.trumpCards); + } + + public int size() { + return this.trumpCards.size(); + } + + public List fetchKoreanNames() { + return this.trumpCards.stream() + .map(TrumpCard::fetchKoreanName) + .collect(Collectors.toList()); + } +} diff --git a/src/main/java/domain/validator/BlackjackParticipantsValidator.java b/src/main/java/domain/validator/BlackjackParticipantsValidator.java new file mode 100644 index 00000000000..840922e929c --- /dev/null +++ b/src/main/java/domain/validator/BlackjackParticipantsValidator.java @@ -0,0 +1,19 @@ +package domain.validator; + +import domain.BlackjackParticipant; +import util.CollectionUtils; + +import java.util.List; + +public class BlackjackParticipantsValidator { + + public static void validate(List blackjackParticipants) { + validateNotEmpty(blackjackParticipants); + } + + private static void validateNotEmpty(List blackjackParticipants) { + if (CollectionUtils.isEmpty(blackjackParticipants)) { + throw new IllegalArgumentException("블랙잭 참가자는 null이거나 empty이면 안됩니다."); + } + } +} diff --git a/src/main/java/domain/validator/BlackjackPlayerNameValidator.java b/src/main/java/domain/validator/BlackjackPlayerNameValidator.java new file mode 100644 index 00000000000..7ccf4ac0cf0 --- /dev/null +++ b/src/main/java/domain/validator/BlackjackPlayerNameValidator.java @@ -0,0 +1,16 @@ +package domain.validator; + +import util.StringUtils; + +public abstract class BlackjackPlayerNameValidator { + + public static void validate(String name) { + validateNotEmpty(name); + } + + private static void validateNotEmpty(String name) { + if (StringUtils.isEmpty(name)) { + throw new IllegalArgumentException("블랙잭 참여자의 이름은 null이거나 공백이면 안됩니다."); + } + } +} diff --git a/src/main/java/domain/validator/TrumpCardValidator.java b/src/main/java/domain/validator/TrumpCardValidator.java new file mode 100644 index 00000000000..ac32c62614f --- /dev/null +++ b/src/main/java/domain/validator/TrumpCardValidator.java @@ -0,0 +1,23 @@ +package domain.validator; + +import domain.TrumpCardRank; +import domain.TrumpCardSuit; + +import java.util.Objects; + +public abstract class TrumpCardValidator { + + public static void validate(TrumpCardRank trumpCardRank, TrumpCardSuit trumpCardSuit) { + validateNotNull(trumpCardRank, trumpCardSuit); + } + + private static void validateNotNull(TrumpCardRank trumpCardRank, TrumpCardSuit trumpCardSuit) { + if (hasNull(trumpCardRank, trumpCardSuit)) { + throw new IllegalArgumentException("트럼프 카드 모양 또는 숫자가 null이면 안됩니다."); + } + } + + private static boolean hasNull(TrumpCardRank trumpCardRank, TrumpCardSuit trumpCardSuit) { + return Objects.isNull(trumpCardRank) || Objects.isNull(trumpCardSuit); + } +} diff --git a/src/main/java/domain/validator/TrumpCardsValidator.java b/src/main/java/domain/validator/TrumpCardsValidator.java new file mode 100644 index 00000000000..3912071c2ce --- /dev/null +++ b/src/main/java/domain/validator/TrumpCardsValidator.java @@ -0,0 +1,23 @@ +package domain.validator; + +import domain.TrumpCard; + +import java.util.HashSet; +import java.util.List; + +public abstract class TrumpCardsValidator { + + public static void validate(List trumpCards) { + validateUnique(trumpCards); + } + + private static void validateUnique(List trumpCards) { + if (!isUnique(trumpCards)) { + throw new IllegalArgumentException("트럼프 카드들은 모두 달라야 합니다."); + } + } + + private static boolean isUnique(List trumpCards) { + return new HashSet<>(trumpCards).size() == trumpCards.size(); + } +} diff --git a/src/main/java/view/input/ConsoleInputView.java b/src/main/java/view/input/ConsoleInputView.java index 4290fdb47ca..c165a56a545 100644 --- a/src/main/java/view/input/ConsoleInputView.java +++ b/src/main/java/view/input/ConsoleInputView.java @@ -17,7 +17,6 @@ public ConsoleInputView(InputReader inputReader, OutputWriter outputWriter) { @Override public PlayersInput viewPlayers() { - outputWriter.writeLine(PLAYERS_NAVIGATION); String input = inputReader.readLine(); diff --git a/src/main/java/view/output/ConsoleOutputView.java b/src/main/java/view/output/ConsoleOutputView.java index f86550a0246..2f487ed4df6 100644 --- a/src/main/java/view/output/ConsoleOutputView.java +++ b/src/main/java/view/output/ConsoleOutputView.java @@ -1,12 +1,40 @@ package view.output; +import view.output.dto.InitialHandOutOutput; +import view.output.dto.InitialHandOutParticipantOutput; + +import java.util.List; + public class ConsoleOutputView implements OutputView { - private final static String HAND_OUT_CARDS_NAVIGATION = "딜러와 %s에게 %d장을 나누었습니다."; + private final static String INITIAL_HAND_OUT_CARDS_COUNT_NAVIGATION = "딜러와 %s에게 %d장을 나누었습니다."; + private final static String INITIAL_HAND_OUT_CARDS_NAVIGATION = "%s카드: %s"; + private final OutputWriter outputWriter; - @Override - public void viewInitialParticipantsCards() { + public ConsoleOutputView(OutputWriter outputWriter) { + this.outputWriter = outputWriter; + } + @Override + public void viewInitialHandOut(InitialHandOutOutput initialHandOutOutput) { + outputWriter.writeFormat( + INITIAL_HAND_OUT_CARDS_COUNT_NAVIGATION, + initialHandOutOutput.fetchJoinedPlayerNames(), + initialHandOutOutput.getHandOutCount() + ); + outputWriter.write(System.lineSeparator()); + + List initialHandOutParticipantOutput = + initialHandOutOutput.getInitialHandOutParticipantOutput(); + + for (InitialHandOutParticipantOutput handOutParticipantOutput : initialHandOutParticipantOutput) { + outputWriter.writeFormat( + INITIAL_HAND_OUT_CARDS_NAVIGATION, + handOutParticipantOutput.getParticipantName(), + handOutParticipantOutput.getJoinedCardNames() + ); + outputWriter.write(System.lineSeparator()); + } } @Override diff --git a/src/main/java/view/output/ConsoleOutputWriter.java b/src/main/java/view/output/ConsoleOutputWriter.java index 37135ac891d..7bd5e74e812 100644 --- a/src/main/java/view/output/ConsoleOutputWriter.java +++ b/src/main/java/view/output/ConsoleOutputWriter.java @@ -5,4 +5,14 @@ public class ConsoleOutputWriter implements OutputWriter { public void writeLine(String message) { System.out.println(message); } + + @Override + public void write(String message) { + System.out.print(message); + } + + @Override + public void writeFormat(String message, Object... args) { + System.out.printf(message, args); + } } diff --git a/src/main/java/view/output/OutputView.java b/src/main/java/view/output/OutputView.java index aa95f850464..ec91f75d6ac 100644 --- a/src/main/java/view/output/OutputView.java +++ b/src/main/java/view/output/OutputView.java @@ -1,8 +1,10 @@ package view.output; +import view.output.dto.InitialHandOutOutput; + public interface OutputView { - void viewInitialParticipantsCards(); + void viewInitialHandOut(InitialHandOutOutput initialHandOutOutput); void viewParticipantsCards(); diff --git a/src/main/java/view/output/OutputWriter.java b/src/main/java/view/output/OutputWriter.java index 726cd02eb56..86473bba2f4 100644 --- a/src/main/java/view/output/OutputWriter.java +++ b/src/main/java/view/output/OutputWriter.java @@ -3,4 +3,8 @@ public interface OutputWriter { void writeLine(String message); + + void write(String message); + + void writeFormat(String message, Object... args); } diff --git a/src/main/java/view/output/dto/InitialHandOutOutput.java b/src/main/java/view/output/dto/InitialHandOutOutput.java new file mode 100644 index 00000000000..0eabadfca5c --- /dev/null +++ b/src/main/java/view/output/dto/InitialHandOutOutput.java @@ -0,0 +1,43 @@ +package view.output.dto; + +import domain.BlackjackParticipants; +import domain.HandOutCount; + +import java.util.List; +import java.util.stream.Collectors; + +public class InitialHandOutOutput { + + private final int handOutCount; + + private final List initialHandOutParticipantOutput; + + public InitialHandOutOutput(int handOutCount, List initialHandOutParticipantOutput) { + this.handOutCount = handOutCount; + this.initialHandOutParticipantOutput = initialHandOutParticipantOutput; + } + + public static InitialHandOutOutput of(HandOutCount handOutCount, BlackjackParticipants blackjackParticipants) { + return new InitialHandOutOutput( + handOutCount.getHandOutCount(), + blackjackParticipants.getBlackjackParticipants().stream() + .map(InitialHandOutParticipantOutput::from) + .collect(Collectors.toList()) + ); + } + + public int getHandOutCount() { + return handOutCount; + } + + public List getInitialHandOutParticipantOutput() { + return initialHandOutParticipantOutput; + } + + public String fetchJoinedPlayerNames() { + return this.initialHandOutParticipantOutput.stream() + .filter(InitialHandOutParticipantOutput::isPlayer) + .map(InitialHandOutParticipantOutput::getParticipantName) + .collect(Collectors.joining(", ")); + } +} diff --git a/src/main/java/view/output/dto/InitialHandOutParticipantOutput.java b/src/main/java/view/output/dto/InitialHandOutParticipantOutput.java new file mode 100644 index 00000000000..bf944544d5f --- /dev/null +++ b/src/main/java/view/output/dto/InitialHandOutParticipantOutput.java @@ -0,0 +1,54 @@ +package view.output.dto; + +import domain.BlackjackDealer; +import domain.BlackjackParticipant; +import domain.BlackjackPlayer; + +import java.util.List; + +public class InitialHandOutParticipantOutput { + + private final String participantName; + + private final List cards; + + private final boolean player; + + public InitialHandOutParticipantOutput(String participantName, List cards, boolean player) { + this.participantName = participantName; + this.cards = cards; + this.player = player; + } + + public static InitialHandOutParticipantOutput from(BlackjackParticipant blackjackParticipant) { + if (blackjackParticipant instanceof BlackjackDealer) { + return new InitialHandOutParticipantOutput("딜러", blackjackParticipant.fetchKoreanCardNames(), false); + } + + if (blackjackParticipant instanceof BlackjackPlayer) { + return new InitialHandOutParticipantOutput( + ((BlackjackPlayer) blackjackParticipant).getPlayerName(), + blackjackParticipant.fetchKoreanCardNames(), + true + ); + } + + throw new IllegalArgumentException("유효하지 않은 블랙잭 참가자입니다."); + } + + public String getJoinedCardNames() { + return String.join(", ", this.cards); + } + + public String getParticipantName() { + return participantName; + } + + public List getCards() { + return cards; + } + + public boolean isPlayer() { + return player; + } +} From 9776f16babfa792ef4e978f35da9869fb41b2241 Mon Sep 17 00:00:00 2001 From: kilian Date: Tue, 28 May 2024 23:17:25 +0900 Subject: [PATCH 09/22] =?UTF-8?q?feat=20:=20=EC=B5=9C=EC=A2=85=20=EC=8A=B9?= =?UTF-8?q?=ED=8C=A8=20=EC=B6=9C=EB=A0=A5?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- README.md | 5 +- .../java/Controller/BlackjackSimulator.java | 12 ++- src/main/java/domain/BlackjackDealer.java | 18 ++++ src/main/java/domain/BlackjackGame.java | 89 ++++++++++++++++--- .../java/domain/BlackjackParticipant.java | 6 ++ .../java/domain/BlackjackParticipants.java | 35 ++++---- src/main/java/domain/BlackjackPlayer.java | 46 +++++++++- src/main/java/domain/BlackjackPlayerName.java | 15 ++++ src/main/java/domain/BlackjackPlayers.java | 4 + src/main/java/domain/BlackjackPoint.java | 65 ++++++++++++++ src/main/java/domain/DealerWinOrLose.java | 28 ++++++ src/main/java/domain/FinalWinOrLose.java | 23 +++++ src/main/java/domain/HandOutCount.java | 2 +- .../java/domain/HandOutForPlayerGame.java | 5 ++ src/main/java/domain/PlayerWinOrLose.java | 29 ++++++ src/main/java/domain/ReHandOutPlayer.java | 16 ++++ src/main/java/domain/TrumpCard.java | 10 ++- src/main/java/domain/TrumpCardDeck.java | 20 +++++ src/main/java/domain/TrumpCardHandOuter.java | 77 ++++++++++++++++ src/main/java/domain/TrumpCardRank.java | 16 +++- src/main/java/domain/TrumpCards.java | 16 ++++ src/main/java/domain/WinOrLose.java | 17 ++++ .../java/view/input/ConsoleInputView.java | 9 +- src/main/java/view/input/InputView.java | 4 +- .../view/input/dto/HandOutPlayerInput.java | 26 ++++++ .../view/input/dto/HandOutPlayerRequest.java | 20 +++++ .../java/view/output/ConsoleOutputView.java | 59 +++++++++++- src/main/java/view/output/OutputView.java | 10 ++- .../output/dto/BlackjackResultOutput.java | 51 +++++++++++ .../output/dto/BlackjackResultOutputs.java | 27 ++++++ .../output/dto/DealerWinOrLoseOutput.java | 34 +++++++ .../view/output/dto/FinalWinOrLoseOutput.java | 35 ++++++++ .../view/output/dto/HandOutDealerOutput.java | 14 +++ .../view/output/dto/HandOutPlayerOutput.java | 30 +++++++ .../output/dto/PlayerWinOrLoseOutput.java | 27 ++++++ 35 files changed, 850 insertions(+), 50 deletions(-) create mode 100644 src/main/java/domain/BlackjackPoint.java create mode 100644 src/main/java/domain/DealerWinOrLose.java create mode 100644 src/main/java/domain/FinalWinOrLose.java create mode 100644 src/main/java/domain/HandOutForPlayerGame.java create mode 100644 src/main/java/domain/PlayerWinOrLose.java create mode 100644 src/main/java/domain/ReHandOutPlayer.java create mode 100644 src/main/java/domain/TrumpCardHandOuter.java create mode 100644 src/main/java/domain/WinOrLose.java create mode 100644 src/main/java/view/input/dto/HandOutPlayerInput.java create mode 100644 src/main/java/view/input/dto/HandOutPlayerRequest.java create mode 100644 src/main/java/view/output/dto/BlackjackResultOutput.java create mode 100644 src/main/java/view/output/dto/BlackjackResultOutputs.java create mode 100644 src/main/java/view/output/dto/DealerWinOrLoseOutput.java create mode 100644 src/main/java/view/output/dto/FinalWinOrLoseOutput.java create mode 100644 src/main/java/view/output/dto/HandOutDealerOutput.java create mode 100644 src/main/java/view/output/dto/HandOutPlayerOutput.java create mode 100644 src/main/java/view/output/dto/PlayerWinOrLoseOutput.java diff --git a/README.md b/README.md index b32171e0cdc..9b9e1b7ac1a 100644 --- a/README.md +++ b/README.md @@ -8,8 +8,9 @@ - 게임을 완료한 후 각 플레이어별로 승패를 출력한다. ## 구현 목록 -- [ ] 게임의 참여할 사람을 입력받는다. -- [ ] 딜러와 플레이어들이 카드를 나눠 받는다. + +- [x] 게임의 참여할 사람을 입력받는다. +- [x] 딜러와 플레이어들이 카드를 나눠 받는다. - [ ] 딜러와 플레이어들이 추가 카드를 나눠 갖는다. - [ ] 딜러와 플레이어들의 결과를 출력한다. - [ ] 최종 결과를 출력한다. \ No newline at end of file diff --git a/src/main/java/Controller/BlackjackSimulator.java b/src/main/java/Controller/BlackjackSimulator.java index e70b2603920..a7142beeb23 100644 --- a/src/main/java/Controller/BlackjackSimulator.java +++ b/src/main/java/Controller/BlackjackSimulator.java @@ -4,6 +4,8 @@ import view.input.InputView; import view.input.dto.PlayersInput; import view.output.OutputView; +import view.output.dto.BlackjackResultOutputs; +import view.output.dto.FinalWinOrLoseOutput; import view.output.dto.InitialHandOutOutput; import java.util.List; @@ -27,10 +29,18 @@ public void run() { BlackjackGame blackjackGame = new BlackjackGame(BlackjackParticipants.of(blackjackDealer, blackjackPlayers), trumpCardDeck); HandOutCount handOutCount = new HandOutCount(2); - BlackjackGame initialHandOutGame = blackjackGame.initialHandOut(handOutCount); + TrumpCardHandOuter trumpCardHandOuter = new TrumpCardHandOuter(); + + BlackjackGame initialHandOutGame = blackjackGame.initialHandOut(trumpCardHandOuter, handOutCount); InitialHandOutOutput initialHandOutOutput = InitialHandOutOutput.of(handOutCount, initialHandOutGame.getBlackjackParticipants()); outputView.viewInitialHandOut(initialHandOutOutput); + BlackjackGame handOutAllPlayersGame = initialHandOutGame.handOutAllPlayers(trumpCardHandOuter, inputView, outputView); + BlackjackGame handOutDealerGame = handOutAllPlayersGame.handOutDealer(trumpCardHandOuter, outputView); + outputView.viewBlackjackResult(BlackjackResultOutputs.from(handOutDealerGame.getBlackjackParticipants())); + + FinalWinOrLose finalWinOrLose = handOutDealerGame.decideWinOrLose(); + outputView.viewFinalWinOrLose(FinalWinOrLoseOutput.from(finalWinOrLose)); } } diff --git a/src/main/java/domain/BlackjackDealer.java b/src/main/java/domain/BlackjackDealer.java index d1b98ea73f0..13ceb54a7ca 100644 --- a/src/main/java/domain/BlackjackDealer.java +++ b/src/main/java/domain/BlackjackDealer.java @@ -24,4 +24,22 @@ public BlackjackDealer receiveCard(TrumpCard trumpCard) { public List fetchKoreanCardNames() { return this.trumpCards.fetchKoreanNames(); } + + @Override + public boolean isDealer() { + return true; + } + + @Override + public boolean isPlayer() { + return false; + } + + @Override + public BlackjackPoint calculatePoint() { + BlackjackPoint minBlackjackPoint = trumpCards.totalMinBlackjackPoint(); + BlackjackPoint maxBlackjackPoint = trumpCards.totalMaxBlackjackPoint(); + + return minBlackjackPoint.fetchCloserPointThreshold(maxBlackjackPoint); + } } diff --git a/src/main/java/domain/BlackjackGame.java b/src/main/java/domain/BlackjackGame.java index fb7c2679d4a..845a1fc1b22 100644 --- a/src/main/java/domain/BlackjackGame.java +++ b/src/main/java/domain/BlackjackGame.java @@ -1,38 +1,101 @@ package domain; +import view.input.InputView; +import view.output.OutputView; + import java.util.ArrayList; +import java.util.List; +import java.util.Objects; + +import static domain.WinOrLose.*; -public class BlackjackGame { +public class BlackjackGame implements HandOutForPlayerGame { private final BlackjackParticipants blackjackParticipants; private final TrumpCardDeck trumpCardDeck; public BlackjackGame(BlackjackParticipants blackjackParticipants, TrumpCardDeck trumpCardDeck) { + this.validateNotNull(blackjackParticipants, trumpCardDeck); this.blackjackParticipants = blackjackParticipants; this.trumpCardDeck = trumpCardDeck; } - public BlackjackGame initialHandOut(HandOutCount handOutCount) { + public BlackjackGame initialHandOut(TrumpCardHandOuter trumpCardHandOuter, HandOutCount handOutCount) { BlackjackGame blackjackGame = this; - TrumpCardDeck trumpCardDeck = this.trumpCardDeck; for (int i = 0; i < handOutCount.getHandOutCount(); i++) { - ArrayList trumpCards = new ArrayList<>(); - - for (int j = 0; j < blackjackParticipants.size(); j++) { - TrumpCard trumpCard = trumpCardDeck.fetchTopOne(); - trumpCardDeck = trumpCardDeck.takeOutTopOne(); - trumpCards.add(trumpCard); - } - - BlackjackParticipants handOutParticipants = blackjackGame.getBlackjackParticipants().handOutOneCardForAll(new TrumpCards(trumpCards)); - blackjackGame = new BlackjackGame(handOutParticipants, trumpCardDeck); + blackjackGame = trumpCardHandOuter.handOutAllParticipants(blackjackGame); } return blackjackGame; } + public BlackjackGame handOutAllPlayers(TrumpCardHandOuter trumpCardHandOuter, InputView inputView, OutputView outputView) { + return trumpCardHandOuter.handOutAllPlayers(this, inputView, outputView); + } + + public BlackjackGame handOutDealer(TrumpCardHandOuter trumpCardHandOuter, OutputView outputView) { + return trumpCardHandOuter.handOutDealer(this, outputView); + } + public BlackjackParticipants getBlackjackParticipants() { return this.blackjackParticipants; } + + public List fetchBlackjackParticipants() { + return this.blackjackParticipants.getBlackjackParticipants(); + } + + public List fetchBlackjackPlayers() { + return this.blackjackParticipants.findPlayers().getBlackjackPlayers(); + } + + public BlackjackDealer findDealer() { + return this.blackjackParticipants.findDealer(); + } + + private void validateNotNull(BlackjackParticipants blackjackParticipants, TrumpCardDeck trumpCardDeck) { + if (Objects.isNull(blackjackParticipants) || Objects.isNull(trumpCardDeck)) { + throw new IllegalArgumentException("참가자 혹은 게임 덱은 null이면 안됩니다."); + } + } + + public TrumpCardDeck getTrumpCardDeck() { + return trumpCardDeck; + } + + public FinalWinOrLose decideWinOrLose() { + int dealerWin = 0; + int dealerLose = 0; + int dealerTie = 0; + + List playerWinOrLoses = new ArrayList<>(); + + BlackjackDealer dealer = this.blackjackParticipants.findDealer(); + BlackjackPoint dealerPoint = dealer.calculatePoint(); + + BlackjackPlayers players = this.blackjackParticipants.findPlayers(); + List blackjackPlayers = players.getBlackjackPlayers(); + + for (BlackjackPlayer blackjackPlayer : blackjackPlayers) { + BlackjackPoint playerPoint = blackjackPlayer.calculatePoint(); + + if (dealerPoint.isWin(playerPoint)) { + dealerWin++; + playerWinOrLoses.add(new PlayerWinOrLose(blackjackPlayer.getBlackjackPlayerName(), LOSE)); + } + + if (dealerPoint.isLose(playerPoint)) { + dealerLose++; + playerWinOrLoses.add(new PlayerWinOrLose(blackjackPlayer.getBlackjackPlayerName(), WIN)); + } + + if (dealerPoint.isTie(playerPoint)) { + dealerTie++; + playerWinOrLoses.add(new PlayerWinOrLose(blackjackPlayer.getBlackjackPlayerName(), TIE)); + } + } + + return new FinalWinOrLose(new DealerWinOrLose(dealerWin, dealerLose, dealerTie), playerWinOrLoses); + } } diff --git a/src/main/java/domain/BlackjackParticipant.java b/src/main/java/domain/BlackjackParticipant.java index 74b37a72126..aa20f554ee3 100644 --- a/src/main/java/domain/BlackjackParticipant.java +++ b/src/main/java/domain/BlackjackParticipant.java @@ -7,4 +7,10 @@ public interface BlackjackParticipant { BlackjackParticipant receiveCard(TrumpCard trumpCard); List fetchKoreanCardNames(); + + boolean isDealer(); + + boolean isPlayer(); + + BlackjackPoint calculatePoint(); } diff --git a/src/main/java/domain/BlackjackParticipants.java b/src/main/java/domain/BlackjackParticipants.java index d24c404438c..36bdfdc934b 100644 --- a/src/main/java/domain/BlackjackParticipants.java +++ b/src/main/java/domain/BlackjackParticipants.java @@ -5,7 +5,6 @@ import java.util.ArrayList; import java.util.List; import java.util.stream.Collectors; -import java.util.stream.IntStream; public class BlackjackParticipants { @@ -26,23 +25,6 @@ public static BlackjackParticipants of(BlackjackDealer blackjackDealer, Blackjac ); } - public BlackjackParticipants handOutOneCardForAll(TrumpCards trumpCards) { - this.validateParticipantsAndTrumpCardSizeEqual(trumpCards); - List cards = trumpCards.getCards(); - - return new BlackjackParticipants( - IntStream.range(0, this.size()) - .mapToObj(index -> this.blackjackParticipants.get(index).receiveCard(cards.get(index))) - .collect(Collectors.toList()) - ); - } - - private void validateParticipantsAndTrumpCardSizeEqual(TrumpCards trumpCards) { - if (this.size() != trumpCards.size()) { - throw new IllegalArgumentException("카드는 무조건 한장씩 나눠줘야 합니다."); - } - } - public int size() { return this.blackjackParticipants.size(); } @@ -50,4 +32,21 @@ public int size() { public List getBlackjackParticipants() { return List.copyOf(this.blackjackParticipants); } + + public BlackjackDealer findDealer() { + return this.blackjackParticipants.stream() + .filter(BlackjackParticipant::isDealer) + .findAny() + .map(BlackjackDealer.class::cast) + .orElseThrow(() -> new IllegalStateException("참가자에 딜러가 존재하지 않습니다.")); + } + + public BlackjackPlayers findPlayers() { + return new BlackjackPlayers( + this.blackjackParticipants.stream() + .filter(BlackjackParticipant::isPlayer) + .map(BlackjackPlayer.class::cast) + .collect(Collectors.toList()) + ); + } } diff --git a/src/main/java/domain/BlackjackPlayer.java b/src/main/java/domain/BlackjackPlayer.java index 7a919e9c685..6e676a82b66 100644 --- a/src/main/java/domain/BlackjackPlayer.java +++ b/src/main/java/domain/BlackjackPlayer.java @@ -2,7 +2,7 @@ import java.util.List; -public class BlackjackPlayer implements BlackjackParticipant { +public class BlackjackPlayer implements BlackjackParticipant, ReHandOutPlayer { private final BlackjackPlayerName blackjackPlayerName; private final TrumpCards trumpCards; @@ -13,16 +13,58 @@ public BlackjackPlayer(BlackjackPlayerName blackjackPlayerName, TrumpCards trump } @Override - public BlackjackParticipant receiveCard(TrumpCard trumpCard) { + public BlackjackPlayer receiveCard(TrumpCard trumpCard) { return new BlackjackPlayer(this.blackjackPlayerName, this.trumpCards.addCard(trumpCard)); } + @Override + public BlackjackPlayerName getBlackjackPlayerName() { + return this.blackjackPlayerName; + } + + @Override + public String fetchPlayerNameToString() { + return this.blackjackPlayerName.getName(); + } + + @Override + public TrumpCards getTrumpCards() { + return this.trumpCards; + } + + @Override + public List fetchCardKoreanNames() { + return this.trumpCards.fetchKoreanNames(); + } + @Override public List fetchKoreanCardNames() { return this.trumpCards.fetchKoreanNames(); } + @Override + public boolean isDealer() { + return false; + } + + @Override + public boolean isPlayer() { + return true; + } + + @Override + public BlackjackPoint calculatePoint() { + BlackjackPoint minBlackjackPoint = trumpCards.totalMinBlackjackPoint(); + BlackjackPoint maxBlackjackPoint = trumpCards.totalMaxBlackjackPoint(); + + return minBlackjackPoint.fetchCloserPointThreshold(maxBlackjackPoint); + } + public String getPlayerName() { return blackjackPlayerName.getName(); } + + public boolean isEqualName(BlackjackPlayerName blackjackPlayerName) { + return this.blackjackPlayerName.equals(blackjackPlayerName); + } } diff --git a/src/main/java/domain/BlackjackPlayerName.java b/src/main/java/domain/BlackjackPlayerName.java index 8013314debc..9094edca042 100644 --- a/src/main/java/domain/BlackjackPlayerName.java +++ b/src/main/java/domain/BlackjackPlayerName.java @@ -2,6 +2,8 @@ import domain.validator.BlackjackPlayerNameValidator; +import java.util.Objects; + public class BlackjackPlayerName { private final String name; @@ -14,4 +16,17 @@ public BlackjackPlayerName(String name) { public String getName() { return name; } + + @Override + public boolean equals(Object o) { + if (this == o) return true; + if (o == null || getClass() != o.getClass()) return false; + BlackjackPlayerName that = (BlackjackPlayerName) o; + return Objects.equals(name, that.name); + } + + @Override + public int hashCode() { + return Objects.hash(name); + } } diff --git a/src/main/java/domain/BlackjackPlayers.java b/src/main/java/domain/BlackjackPlayers.java index 0ec9a206456..cb69c4bb947 100644 --- a/src/main/java/domain/BlackjackPlayers.java +++ b/src/main/java/domain/BlackjackPlayers.java @@ -22,4 +22,8 @@ public static BlackjackPlayers fromNamesWithEmptyCards(List public List fetchBlackjackParticipant() { return List.copyOf(this.blackjackPlayers); } + + public List getBlackjackPlayers() { + return List.copyOf(this.blackjackPlayers); + } } diff --git a/src/main/java/domain/BlackjackPoint.java b/src/main/java/domain/BlackjackPoint.java new file mode 100644 index 00000000000..5cf5a90bb29 --- /dev/null +++ b/src/main/java/domain/BlackjackPoint.java @@ -0,0 +1,65 @@ +package domain; + +import java.util.Objects; + +public class BlackjackPoint { + + private static final int RESULT_POINT_THRESHOLD = 21; + private final int point; + + public BlackjackPoint(int point) { + this.point = point; + } + + public BlackjackPoint sum(BlackjackPoint blackjackPoint) { + return new BlackjackPoint(this.point + blackjackPoint.point); + } + + public boolean isLossThan(BlackjackPoint blackjackPoint) { + return this.point < blackjackPoint.point; + } + + public BlackjackPoint fetchCloserPointThreshold(BlackjackPoint blackjackPoint) { + int first = Math.abs(RESULT_POINT_THRESHOLD - this.point); + int second = Math.abs(RESULT_POINT_THRESHOLD - blackjackPoint.point); + + if (first < second) { + return this; + } + + return blackjackPoint; + } + + public int getPoint() { + return point; + } + + public boolean isWin(BlackjackPoint blackjackPoint) { + return this.fetchDiff() < blackjackPoint.fetchDiff(); + } + + public boolean isLose(BlackjackPoint blackjackPoint) { + return this.fetchDiff() > blackjackPoint.fetchDiff(); + } + + public boolean isTie(BlackjackPoint blackjackPoint) { + return this.fetchDiff() == blackjackPoint.fetchDiff(); + } + + private int fetchDiff() { + return Math.abs(RESULT_POINT_THRESHOLD - this.point); + } + + @Override + public boolean equals(Object o) { + if (this == o) return true; + if (o == null || getClass() != o.getClass()) return false; + BlackjackPoint that = (BlackjackPoint) o; + return point == that.point; + } + + @Override + public int hashCode() { + return Objects.hash(point); + } +} diff --git a/src/main/java/domain/DealerWinOrLose.java b/src/main/java/domain/DealerWinOrLose.java new file mode 100644 index 00000000000..9589cb9d57b --- /dev/null +++ b/src/main/java/domain/DealerWinOrLose.java @@ -0,0 +1,28 @@ +package domain; + +public class DealerWinOrLose { + + private final int winCount; + + private final int loseCount; + + private final int tieCount; + + public DealerWinOrLose(int winCount, int loseCount, int tieCount) { + this.winCount = winCount; + this.loseCount = loseCount; + this.tieCount = tieCount; + } + + public int getWinCount() { + return winCount; + } + + public int getLoseCount() { + return loseCount; + } + + public int getTieCount() { + return tieCount; + } +} diff --git a/src/main/java/domain/FinalWinOrLose.java b/src/main/java/domain/FinalWinOrLose.java new file mode 100644 index 00000000000..c461d2ce2c6 --- /dev/null +++ b/src/main/java/domain/FinalWinOrLose.java @@ -0,0 +1,23 @@ +package domain; + +import java.util.List; + +public class FinalWinOrLose { + + private final DealerWinOrLose dealerWinOrLose; + + private final List playerWinOrLose; + + public FinalWinOrLose(DealerWinOrLose dealerWinOrLose, List playerWinOrLose) { + this.dealerWinOrLose = dealerWinOrLose; + this.playerWinOrLose = playerWinOrLose; + } + + public DealerWinOrLose getDealerWinOrLose() { + return dealerWinOrLose; + } + + public List getPlayerWinOrLose() { + return List.copyOf(this.playerWinOrLose); + } +} diff --git a/src/main/java/domain/HandOutCount.java b/src/main/java/domain/HandOutCount.java index 0de69acdd23..357f336c65f 100644 --- a/src/main/java/domain/HandOutCount.java +++ b/src/main/java/domain/HandOutCount.java @@ -5,7 +5,7 @@ public class HandOutCount { private final int handOutCount; public HandOutCount(int handOutCount) { - + this.validateGreaterThanZero(handOutCount); this.handOutCount = handOutCount; } diff --git a/src/main/java/domain/HandOutForPlayerGame.java b/src/main/java/domain/HandOutForPlayerGame.java new file mode 100644 index 00000000000..b5ef338e23a --- /dev/null +++ b/src/main/java/domain/HandOutForPlayerGame.java @@ -0,0 +1,5 @@ +package domain; + +public interface HandOutForPlayerGame { + +} diff --git a/src/main/java/domain/PlayerWinOrLose.java b/src/main/java/domain/PlayerWinOrLose.java new file mode 100644 index 00000000000..ca29804f642 --- /dev/null +++ b/src/main/java/domain/PlayerWinOrLose.java @@ -0,0 +1,29 @@ +package domain; + +public class PlayerWinOrLose { + + private final BlackjackPlayerName blackjackPlayerName; + + private final WinOrLose winOrLose; + + public PlayerWinOrLose(BlackjackPlayerName blackjackPlayerName, WinOrLose winOrLose) { + this.blackjackPlayerName = blackjackPlayerName; + this.winOrLose = winOrLose; + } + + public BlackjackPlayerName getBlackjackPlayerName() { + return blackjackPlayerName; + } + + public WinOrLose getWinOrLose() { + return winOrLose; + } + + public String fetchPlayerName() { + return this.blackjackPlayerName.getName(); + } + + public String fetchWinOrLoseKoreanName() { + return this.winOrLose.getKoreanName(); + } +} diff --git a/src/main/java/domain/ReHandOutPlayer.java b/src/main/java/domain/ReHandOutPlayer.java new file mode 100644 index 00000000000..de4d22a91cc --- /dev/null +++ b/src/main/java/domain/ReHandOutPlayer.java @@ -0,0 +1,16 @@ +package domain; + +import java.util.List; + +public interface ReHandOutPlayer { + + ReHandOutPlayer receiveCard(TrumpCard trumpCard); + + BlackjackPlayerName getBlackjackPlayerName(); + + String fetchPlayerNameToString(); + + TrumpCards getTrumpCards(); + + List fetchCardKoreanNames(); +} diff --git a/src/main/java/domain/TrumpCard.java b/src/main/java/domain/TrumpCard.java index 7dd5a2b18c0..e14800398f2 100644 --- a/src/main/java/domain/TrumpCard.java +++ b/src/main/java/domain/TrumpCard.java @@ -19,7 +19,15 @@ public TrumpCard(TrumpCardRank trumpCardRank, TrumpCardSuit trumpCardSuit) { public String fetchKoreanName() { return this.trumpCardRank.getExpression() + this.trumpCardSuit.getKoreanName(); } - + + public BlackjackPoint fetchMaxBlackjackPoint() { + return new BlackjackPoint(trumpCardRank.fetchMaxValue()); + } + + public BlackjackPoint fetchMinBlackjackPoint() { + return new BlackjackPoint(trumpCardRank.fetchMinValue()); + } + @Override public boolean equals(Object o) { if (this == o) return true; diff --git a/src/main/java/domain/TrumpCardDeck.java b/src/main/java/domain/TrumpCardDeck.java index 87c2871d75b..89829585796 100644 --- a/src/main/java/domain/TrumpCardDeck.java +++ b/src/main/java/domain/TrumpCardDeck.java @@ -1,5 +1,7 @@ package domain; +import java.util.Objects; + public class TrumpCardDeck { private final TrumpCards trumpCards; @@ -9,9 +11,15 @@ public TrumpCardDeck() { } public TrumpCardDeck(TrumpCards trumpCards) { + this.validateNotNull(trumpCards); this.trumpCards = trumpCards; } + public TrumpCardDeck(TrumpCardDeck trumpCardDeck) { + this.validateNotNull(trumpCardDeck); + this.trumpCards = trumpCardDeck.trumpCards; + } + public TrumpCard fetchTopOne() { return this.trumpCards.fetchTopOne(); } @@ -21,4 +29,16 @@ public TrumpCardDeck takeOutTopOne() { this.trumpCards.takeOutTopOne() ); } + + private void validateNotNull(TrumpCards trumpCards) { + if (Objects.isNull(trumpCards)) { + throw new IllegalArgumentException("트럼프 카드들은 null이면 안됩니다."); + } + } + + private void validateNotNull(TrumpCardDeck trumpCardDeck) { + if (Objects.isNull(trumpCardDeck)) { + throw new IllegalArgumentException("트럼프 덱은 null이면 안됩니다."); + } + } } diff --git a/src/main/java/domain/TrumpCardHandOuter.java b/src/main/java/domain/TrumpCardHandOuter.java new file mode 100644 index 00000000000..8746924b179 --- /dev/null +++ b/src/main/java/domain/TrumpCardHandOuter.java @@ -0,0 +1,77 @@ +package domain; + +import view.input.InputView; +import view.input.dto.HandOutPlayerInput; +import view.input.dto.HandOutPlayerRequest; +import view.output.OutputView; +import view.output.dto.HandOutDealerOutput; +import view.output.dto.HandOutPlayerOutput; + +import java.util.ArrayList; +import java.util.List; + +public class TrumpCardHandOuter { + + private static final int DEALER_HAND_OUT_THRESHOLD = 17; + + public BlackjackGame handOutAllParticipants(BlackjackGame blackjackGame) { + ArrayList receivedParticipants = new ArrayList<>(); + TrumpCardDeck trumpCardDeck = blackjackGame.getTrumpCardDeck(); + + List participants = blackjackGame.fetchBlackjackParticipants(); + + for (BlackjackParticipant participant : participants) { + TrumpCard trumpCard = trumpCardDeck.fetchTopOne(); + trumpCardDeck = trumpCardDeck.takeOutTopOne(); + BlackjackParticipant receiveParticipant = participant.receiveCard(trumpCard); + receivedParticipants.add(receiveParticipant); + } + + return new BlackjackGame(new BlackjackParticipants(receivedParticipants), trumpCardDeck); + } + + public BlackjackGame handOutAllPlayers(BlackjackGame blackjackGame, InputView inputView, OutputView outputView) { + List receivedParticipants = new ArrayList<>(); + TrumpCardDeck trumpCardDeck = blackjackGame.getTrumpCardDeck(); + List blackjackPlayers = blackjackGame.fetchBlackjackPlayers(); + + for (BlackjackPlayer blackjackPlayer : blackjackPlayers) { + BlackjackPlayerName blackjackPlayerName = blackjackPlayer.getBlackjackPlayerName(); + + while (this.isHandOut(blackjackPlayerName, inputView)) { + TrumpCard trumpCard = trumpCardDeck.fetchTopOne(); + trumpCardDeck = trumpCardDeck.takeOutTopOne(); + blackjackPlayer = blackjackPlayer.receiveCard(trumpCard); + outputView.viewHandOutPlayer(HandOutPlayerOutput.of(blackjackPlayerName, blackjackPlayer)); + } + receivedParticipants.add(blackjackPlayer); + } + + receivedParticipants.add(blackjackGame.findDealer()); + + return new BlackjackGame(new BlackjackParticipants(receivedParticipants), trumpCardDeck); + } + + public BlackjackGame handOutDealer(BlackjackGame blackjackGame, OutputView outputView) { + List receivedParticipants = new ArrayList<>(blackjackGame.fetchBlackjackPlayers()); + BlackjackDealer dealer = blackjackGame.findDealer(); + BlackjackPoint blackjackPoint = dealer.calculatePoint(); + TrumpCardDeck trumpCardDeck = blackjackGame.getTrumpCardDeck(); + + if (blackjackPoint.isLossThan(new BlackjackPoint(DEALER_HAND_OUT_THRESHOLD))) { + TrumpCard trumpCard = trumpCardDeck.fetchTopOne(); + trumpCardDeck = trumpCardDeck.takeOutTopOne(); + dealer = dealer.receiveCard(trumpCard); + outputView.viewHandOutDealer(new HandOutDealerOutput(DEALER_HAND_OUT_THRESHOLD - 1)); + } + + receivedParticipants.add(dealer); + return new BlackjackGame(new BlackjackParticipants(receivedParticipants), trumpCardDeck); + } + + private boolean isHandOut(BlackjackPlayerName blackjackPlayerName, InputView inputView) { + HandOutPlayerInput handOutPlayerInput = inputView.viewHandOutCardForPlayer(HandOutPlayerRequest.from(blackjackPlayerName)); + return handOutPlayerInput.isHandOut(); + } + +} diff --git a/src/main/java/domain/TrumpCardRank.java b/src/main/java/domain/TrumpCardRank.java index 5c768703789..9e070382365 100644 --- a/src/main/java/domain/TrumpCardRank.java +++ b/src/main/java/domain/TrumpCardRank.java @@ -3,7 +3,7 @@ import java.util.List; public enum TrumpCardRank { - ONE(List.of(1, 10), "1"), + ACE(List.of(1, 11), "A"), TWO(List.of(2), "2"), THREE(List.of(3), "3"), FOUR(List.of(4), "4"), @@ -26,8 +26,18 @@ public enum TrumpCardRank { this.expression = expression; } - public List getValues() { - return values; + public int fetchMaxValue() { + return this.values.stream() + .mapToInt(x -> x) + .max() + .orElse(0); + } + + public int fetchMinValue() { + return this.values.stream() + .mapToInt(x -> x) + .min() + .orElse(0); } public String getExpression() { diff --git a/src/main/java/domain/TrumpCards.java b/src/main/java/domain/TrumpCards.java index d1a15a796d8..d563ee90c01 100644 --- a/src/main/java/domain/TrumpCards.java +++ b/src/main/java/domain/TrumpCards.java @@ -17,6 +17,10 @@ public TrumpCards(List trumpCards) { this.trumpCards = trumpCards; } + public TrumpCards(TrumpCards trumpCards) { + this.trumpCards = trumpCards.getCards(); + } + public static TrumpCards createAll() { return new TrumpCards( Arrays.stream(TrumpCardRank.values()) @@ -63,6 +67,18 @@ public TrumpCards addCard(TrumpCard trumpCard) { return new TrumpCards(Collections.unmodifiableList(trumpCards)); } + public BlackjackPoint totalMaxBlackjackPoint() { + return this.trumpCards.stream() + .map(TrumpCard::fetchMaxBlackjackPoint) + .reduce(new BlackjackPoint(0), BlackjackPoint::sum); + } + + public BlackjackPoint totalMinBlackjackPoint() { + return this.trumpCards.stream() + .map(TrumpCard::fetchMinBlackjackPoint) + .reduce(new BlackjackPoint(0), BlackjackPoint::sum); + } + public List getCards() { return List.copyOf(this.trumpCards); } diff --git a/src/main/java/domain/WinOrLose.java b/src/main/java/domain/WinOrLose.java new file mode 100644 index 00000000000..d4890f6240f --- /dev/null +++ b/src/main/java/domain/WinOrLose.java @@ -0,0 +1,17 @@ +package domain; + +public enum WinOrLose { + WIN("승"), + LOSE("패"), + TIE("무승부"); + + private final String koreanName; + + WinOrLose(String koreanName) { + this.koreanName = koreanName; + } + + public String getKoreanName() { + return koreanName; + } +} diff --git a/src/main/java/view/input/ConsoleInputView.java b/src/main/java/view/input/ConsoleInputView.java index c165a56a545..347666be4a5 100644 --- a/src/main/java/view/input/ConsoleInputView.java +++ b/src/main/java/view/input/ConsoleInputView.java @@ -1,11 +1,14 @@ package view.input; +import view.input.dto.HandOutPlayerInput; +import view.input.dto.HandOutPlayerRequest; import view.input.dto.PlayersInput; import view.output.OutputWriter; public class ConsoleInputView implements InputView { private final static String PLAYERS_NAVIGATION = "게임에 참여할 사람의 이름을 입력하세요.(쉼표 기준으로 분리)"; + private final static String HAND_OUT_PLAYER_NAVIGATION = "%s는 한장의 카드를 더 받겠습니까? (예는 y, 아니오는 n)"; private final InputReader inputReader; private final OutputWriter outputWriter; @@ -24,8 +27,12 @@ public PlayersInput viewPlayers() { } @Override - public void viewMoreCard() { + public HandOutPlayerInput viewHandOutCardForPlayer(HandOutPlayerRequest handOutPlayerRequest) { + String playerName = handOutPlayerRequest.getPlayerName(); + outputWriter.writeFormat(HAND_OUT_PLAYER_NAVIGATION, playerName); + String line = inputReader.readLine(); + return HandOutPlayerInput.from(line); } @Override diff --git a/src/main/java/view/input/InputView.java b/src/main/java/view/input/InputView.java index 965df07b830..293cc4fffdb 100644 --- a/src/main/java/view/input/InputView.java +++ b/src/main/java/view/input/InputView.java @@ -1,12 +1,14 @@ package view.input; +import view.input.dto.HandOutPlayerInput; +import view.input.dto.HandOutPlayerRequest; import view.input.dto.PlayersInput; public interface InputView { PlayersInput viewPlayers(); - void viewMoreCard(); + HandOutPlayerInput viewHandOutCardForPlayer(HandOutPlayerRequest handOutPlayerRequest); void viewThresholdCard(); } diff --git a/src/main/java/view/input/dto/HandOutPlayerInput.java b/src/main/java/view/input/dto/HandOutPlayerInput.java new file mode 100644 index 00000000000..90a00bada1e --- /dev/null +++ b/src/main/java/view/input/dto/HandOutPlayerInput.java @@ -0,0 +1,26 @@ +package view.input.dto; + +public class HandOutPlayerInput { + + private final boolean handOut; + + public HandOutPlayerInput(boolean handOut) { + this.handOut = handOut; + } + + public static HandOutPlayerInput from(String input) { + if (input.equals("y")) { + return new HandOutPlayerInput(true); + } + + if (input.equals("n")) { + return new HandOutPlayerInput(false); + } + + throw new IllegalArgumentException("카드를 더 받을 건지에 대한 응답은 y아니면 n이어야 합니다."); + } + + public boolean isHandOut() { + return handOut; + } +} diff --git a/src/main/java/view/input/dto/HandOutPlayerRequest.java b/src/main/java/view/input/dto/HandOutPlayerRequest.java new file mode 100644 index 00000000000..32285eb02e3 --- /dev/null +++ b/src/main/java/view/input/dto/HandOutPlayerRequest.java @@ -0,0 +1,20 @@ +package view.input.dto; + +import domain.BlackjackPlayerName; + +public class HandOutPlayerRequest { + + private final String playerName; + + public HandOutPlayerRequest(String playerName) { + this.playerName = playerName; + } + + public static HandOutPlayerRequest from(BlackjackPlayerName blackjackPlayerName) { + return new HandOutPlayerRequest(blackjackPlayerName.getName()); + } + + public String getPlayerName() { + return playerName; + } +} diff --git a/src/main/java/view/output/ConsoleOutputView.java b/src/main/java/view/output/ConsoleOutputView.java index 2f487ed4df6..79c555a8b43 100644 --- a/src/main/java/view/output/ConsoleOutputView.java +++ b/src/main/java/view/output/ConsoleOutputView.java @@ -1,7 +1,6 @@ package view.output; -import view.output.dto.InitialHandOutOutput; -import view.output.dto.InitialHandOutParticipantOutput; +import view.output.dto.*; import java.util.List; @@ -9,6 +8,11 @@ public class ConsoleOutputView implements OutputView { private final static String INITIAL_HAND_OUT_CARDS_COUNT_NAVIGATION = "딜러와 %s에게 %d장을 나누었습니다."; private final static String INITIAL_HAND_OUT_CARDS_NAVIGATION = "%s카드: %s"; + private final static String HAND_OUT_CARD_FOR_PLAYER_NAVIGATION = "%s카드 : %s"; + private final static String HAND_OUT_DEALER_NAVIGATION = "딜러는 %d이하라 한장의 카드를 더 받았습니다."; + private final static String DEALER_WIN_OR_LOSE_NAVIGATION = "딜러 : %d승 %d무 %d패"; + private final static String PLAYER_WIN_OR_LOSE_NAVIGATION = "%s : %s"; + private final static String BLACKJACK_RESULT_NAVIGATION = "%s 카드: %s - 결과: %d"; private final OutputWriter outputWriter; public ConsoleOutputView(OutputWriter outputWriter) { @@ -38,12 +42,59 @@ public void viewInitialHandOut(InitialHandOutOutput initialHandOutOutput) { } @Override - public void viewParticipantsCards() { + public void viewHandOutPlayer(HandOutPlayerOutput handOutPlayerOutput) { + outputWriter.writeFormat(HAND_OUT_CARD_FOR_PLAYER_NAVIGATION, handOutPlayerOutput.getPlayerName(), handOutPlayerOutput.fetchJoinedKoreanNames()); + outputWriter.write(System.lineSeparator()); + } + @Override + public void viewHandOutDealer(HandOutDealerOutput handOutDealerOutput) { + outputWriter.writeFormat(HAND_OUT_DEALER_NAVIGATION, handOutDealerOutput.getHandOutThreshold()); + outputWriter.write(System.lineSeparator()); } @Override - public void viewWinOrLose() { + public void viewBlackjackResult(BlackjackResultOutputs blackjackResultOutput) { + List blackjackResultOutputs = blackjackResultOutput.getBlackjackResultOutputs(); + blackjackResultOutputs.forEach(output -> { + outputWriter.writeFormat( + BLACKJACK_RESULT_NAVIGATION, + output.getParticipantName(), + output.fetchJoinedCardNames(), + output.getTotalPoint() + ); + outputWriter.write(System.lineSeparator()); + }); + outputWriter.write(System.lineSeparator()); + } + + @Override + public void viewFinalWinOrLose(FinalWinOrLoseOutput finalWinOrLoseOutput) { + this.printDealerWinOrLose(finalWinOrLoseOutput); + outputWriter.write(System.lineSeparator()); + this.printPlayerWinOrLose(finalWinOrLoseOutput); + } + + private void printDealerWinOrLose(FinalWinOrLoseOutput finalWinOrLoseOutput) { + DealerWinOrLoseOutput dealerWinOrLoseOutput = finalWinOrLoseOutput.getDealerWinOrLoseOutput(); + outputWriter.writeFormat( + DEALER_WIN_OR_LOSE_NAVIGATION, + dealerWinOrLoseOutput.getWinCount(), + dealerWinOrLoseOutput.getTieCount(), + dealerWinOrLoseOutput.getLoseCount() + ); + } + + private void printPlayerWinOrLose(FinalWinOrLoseOutput finalWinOrLoseOutput) { + List playerWinOrLoses = finalWinOrLoseOutput.getPlayerWinOrLoses(); + playerWinOrLoses.forEach(playerWinOrLoseOutput -> { + outputWriter.writeFormat( + PLAYER_WIN_OR_LOSE_NAVIGATION, + playerWinOrLoseOutput.getPlayerName(), + playerWinOrLoseOutput.getWinOrLose() + ); + outputWriter.write(System.lineSeparator()); + }); } } diff --git a/src/main/java/view/output/OutputView.java b/src/main/java/view/output/OutputView.java index ec91f75d6ac..0640c1adf43 100644 --- a/src/main/java/view/output/OutputView.java +++ b/src/main/java/view/output/OutputView.java @@ -1,12 +1,16 @@ package view.output; -import view.output.dto.InitialHandOutOutput; +import view.output.dto.*; public interface OutputView { void viewInitialHandOut(InitialHandOutOutput initialHandOutOutput); - void viewParticipantsCards(); + void viewHandOutPlayer(HandOutPlayerOutput handOutPlayerOutput); - void viewWinOrLose(); + void viewHandOutDealer(HandOutDealerOutput handOutDealerOutput); + + void viewBlackjackResult(BlackjackResultOutputs blackjackResultOutput); + + void viewFinalWinOrLose(FinalWinOrLoseOutput finalWinOrLoseOutput); } diff --git a/src/main/java/view/output/dto/BlackjackResultOutput.java b/src/main/java/view/output/dto/BlackjackResultOutput.java new file mode 100644 index 00000000000..659e03ce0eb --- /dev/null +++ b/src/main/java/view/output/dto/BlackjackResultOutput.java @@ -0,0 +1,51 @@ +package view.output.dto; + +import domain.BlackjackParticipant; +import domain.BlackjackPlayer; + +import java.util.List; + +public class BlackjackResultOutput { + + private final String participantName; + + private final List cardKoreanNames; + + private final int totalPoint; + + public BlackjackResultOutput(String participantName, List cardKoreanNames, int totalPoint) { + this.participantName = participantName; + this.cardKoreanNames = cardKoreanNames; + this.totalPoint = totalPoint; + } + + public static BlackjackResultOutput from(BlackjackParticipant blackjackParticipant) { + String participantName = null; + + if (blackjackParticipant.isDealer()) { + participantName = "딜러"; + } + + if (blackjackParticipant.isPlayer()) { + participantName = ((BlackjackPlayer) blackjackParticipant).getPlayerName(); + } + + return new BlackjackResultOutput(participantName, blackjackParticipant.fetchKoreanCardNames(), blackjackParticipant.calculatePoint().getPoint()); + } + + public String getParticipantName() { + return participantName; + } + + public List getCardKoreanNames() { + return cardKoreanNames; + } + + public int getTotalPoint() { + return totalPoint; + } + + public String fetchJoinedCardNames() { + return String.join(", ", this.cardKoreanNames); + } +} diff --git a/src/main/java/view/output/dto/BlackjackResultOutputs.java b/src/main/java/view/output/dto/BlackjackResultOutputs.java new file mode 100644 index 00000000000..468b2bfa38f --- /dev/null +++ b/src/main/java/view/output/dto/BlackjackResultOutputs.java @@ -0,0 +1,27 @@ +package view.output.dto; + +import domain.BlackjackParticipants; + +import java.util.List; +import java.util.stream.Collectors; + +public class BlackjackResultOutputs { + + private final List blackjackResultOutputs; + + public BlackjackResultOutputs(List blackjackResultOutputs) { + this.blackjackResultOutputs = blackjackResultOutputs; + } + + public static BlackjackResultOutputs from(BlackjackParticipants blackjackParticipants) { + return new BlackjackResultOutputs( + blackjackParticipants.getBlackjackParticipants().stream() + .map(BlackjackResultOutput::from) + .collect(Collectors.toList()) + ); + } + + public List getBlackjackResultOutputs() { + return blackjackResultOutputs; + } +} diff --git a/src/main/java/view/output/dto/DealerWinOrLoseOutput.java b/src/main/java/view/output/dto/DealerWinOrLoseOutput.java new file mode 100644 index 00000000000..39111a96ed9 --- /dev/null +++ b/src/main/java/view/output/dto/DealerWinOrLoseOutput.java @@ -0,0 +1,34 @@ +package view.output.dto; + +import domain.DealerWinOrLose; + +public class DealerWinOrLoseOutput { + + private final int winCount; + + private final int loseCount; + + private final int tieCount; + + public DealerWinOrLoseOutput(int winCount, int loseCount, int tieCount) { + this.winCount = winCount; + this.loseCount = loseCount; + this.tieCount = tieCount; + } + + public static DealerWinOrLoseOutput from(DealerWinOrLose dealerWinOrLose) { + return new DealerWinOrLoseOutput(dealerWinOrLose.getWinCount(), dealerWinOrLose.getLoseCount(), dealerWinOrLose.getTieCount()); + } + + public int getWinCount() { + return winCount; + } + + public int getLoseCount() { + return loseCount; + } + + public int getTieCount() { + return tieCount; + } +} diff --git a/src/main/java/view/output/dto/FinalWinOrLoseOutput.java b/src/main/java/view/output/dto/FinalWinOrLoseOutput.java new file mode 100644 index 00000000000..0e4a1ee04a2 --- /dev/null +++ b/src/main/java/view/output/dto/FinalWinOrLoseOutput.java @@ -0,0 +1,35 @@ +package view.output.dto; + +import domain.FinalWinOrLose; + +import java.util.List; +import java.util.stream.Collectors; + +public class FinalWinOrLoseOutput { + + private final DealerWinOrLoseOutput dealerWinOrLoseOutput; + + private final List playerWinOrLoses; + + public FinalWinOrLoseOutput(DealerWinOrLoseOutput dealerWinOrLoseOutput, List playerWinOrLoses) { + this.dealerWinOrLoseOutput = dealerWinOrLoseOutput; + this.playerWinOrLoses = playerWinOrLoses; + } + + public static FinalWinOrLoseOutput from(FinalWinOrLose finalWinOrLose) { + return new FinalWinOrLoseOutput( + DealerWinOrLoseOutput.from(finalWinOrLose.getDealerWinOrLose()), + finalWinOrLose.getPlayerWinOrLose().stream() + .map(PlayerWinOrLoseOutput::from) + .collect(Collectors.toList()) + ); + } + + public DealerWinOrLoseOutput getDealerWinOrLoseOutput() { + return dealerWinOrLoseOutput; + } + + public List getPlayerWinOrLoses() { + return List.copyOf(this.playerWinOrLoses); + } +} diff --git a/src/main/java/view/output/dto/HandOutDealerOutput.java b/src/main/java/view/output/dto/HandOutDealerOutput.java new file mode 100644 index 00000000000..d2ecdd3ecdb --- /dev/null +++ b/src/main/java/view/output/dto/HandOutDealerOutput.java @@ -0,0 +1,14 @@ +package view.output.dto; + +public class HandOutDealerOutput { + + private final int handOutThreshold; + + public HandOutDealerOutput(int handOutThreshold) { + this.handOutThreshold = handOutThreshold; + } + + public int getHandOutThreshold() { + return handOutThreshold; + } +} diff --git a/src/main/java/view/output/dto/HandOutPlayerOutput.java b/src/main/java/view/output/dto/HandOutPlayerOutput.java new file mode 100644 index 00000000000..d1f459b39f9 --- /dev/null +++ b/src/main/java/view/output/dto/HandOutPlayerOutput.java @@ -0,0 +1,30 @@ +package view.output.dto; + +import domain.BlackjackParticipant; +import domain.BlackjackPlayerName; + +import java.util.List; + +public class HandOutPlayerOutput { + + private final String playerName; + + private final List cardKoreanNames; + + public HandOutPlayerOutput(String playerName, List cardKoreanNames) { + this.playerName = playerName; + this.cardKoreanNames = cardKoreanNames; + } + + public static HandOutPlayerOutput of(BlackjackPlayerName blackjackPlayerName, BlackjackParticipant blackjackParticipant) { + return new HandOutPlayerOutput(blackjackPlayerName.getName(), blackjackParticipant.fetchKoreanCardNames()); + } + + public String getPlayerName() { + return playerName; + } + + public String fetchJoinedKoreanNames() { + return String.join(", ", this.cardKoreanNames); + } +} diff --git a/src/main/java/view/output/dto/PlayerWinOrLoseOutput.java b/src/main/java/view/output/dto/PlayerWinOrLoseOutput.java new file mode 100644 index 00000000000..03ad1ea5c86 --- /dev/null +++ b/src/main/java/view/output/dto/PlayerWinOrLoseOutput.java @@ -0,0 +1,27 @@ +package view.output.dto; + +import domain.PlayerWinOrLose; + +public class PlayerWinOrLoseOutput { + + private final String playerName; + + private final String winOrLose; + + public PlayerWinOrLoseOutput(String playerName, String winOrLose) { + this.playerName = playerName; + this.winOrLose = winOrLose; + } + + public static PlayerWinOrLoseOutput from(PlayerWinOrLose playerWinOrLose) { + return new PlayerWinOrLoseOutput(playerWinOrLose.fetchPlayerName(), playerWinOrLose.fetchWinOrLoseKoreanName()); + } + + public String getPlayerName() { + return playerName; + } + + public String getWinOrLose() { + return winOrLose; + } +} From 0f3ef580219cd9231f243d0758a637f5c3548b5c Mon Sep 17 00:00:00 2001 From: kilian Date: Sun, 2 Jun 2024 16:01:42 +0900 Subject: [PATCH 10/22] =?UTF-8?q?feat=20:=20null,=20collection=20validator?= =?UTF-8?q?=20=EB=B6=84=EB=A6=AC?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- src/main/java/BlackjackApplication.java | 7 +- .../java/Controller/BlackjackSimulator.java | 46 ----------- .../Controller/BlackjackSimulatorRunner.java | 21 +++++ src/main/java/domain/BlackjackDealer.java | 9 +++ .../java/domain/BlackjackDealerHandOuter.java | 41 ++++++++++ src/main/java/domain/BlackjackGame.java | 76 +++--------------- .../java/domain/BlackjackGameCreator.java | 26 +++++++ src/main/java/domain/BlackjackHandOuter.java | 6 ++ .../domain/BlackjackInitialHandOuter.java | 46 +++++++++++ .../java/domain/BlackjackParticipants.java | 10 ++- src/main/java/domain/BlackjackPlayer.java | 25 +----- src/main/java/domain/BlackjackPlayerName.java | 10 ++- src/main/java/domain/BlackjackPlayers.java | 3 + .../domain/BlackjackPlayersHandOuter.java | 55 +++++++++++++ src/main/java/domain/BlackjackPoint.java | 9 ++- src/main/java/domain/BlackjackSimulator.java | 54 +++++++++++++ .../domain/BlackjackWinOrLoseDecider.java | 53 +++++++++++++ src/main/java/domain/DealerWinOrLose.java | 15 ++++ src/main/java/domain/FinalWinOrLose.java | 5 ++ src/main/java/domain/HandOutCount.java | 2 +- .../java/domain/HandOutForPlayerGame.java | 5 -- src/main/java/domain/PlayerWinOrLose.java | 8 -- src/main/java/domain/ReHandOutPlayer.java | 16 ---- src/main/java/domain/TrumpCard.java | 4 +- src/main/java/domain/TrumpCardDeck.java | 21 +---- src/main/java/domain/TrumpCardHandOuter.java | 77 ------------------- .../BlackjackParticipantsValidator.java | 19 ----- .../BlackjackPlayerNameValidator.java | 16 ---- .../domain/validator/CollectionValidator.java | 18 +++++ .../domain/validator/ObjectsValidator.java | 22 ++++++ .../domain/validator/TrumpCardValidator.java | 23 ------ src/main/java/util/ObjectUtils.java | 14 ++++ .../output/dto/BlackjackResultOutputs.java | 6 +- .../view/output/dto/InitialHandOutOutput.java | 6 +- 34 files changed, 440 insertions(+), 334 deletions(-) delete mode 100644 src/main/java/Controller/BlackjackSimulator.java create mode 100644 src/main/java/Controller/BlackjackSimulatorRunner.java create mode 100644 src/main/java/domain/BlackjackDealerHandOuter.java create mode 100644 src/main/java/domain/BlackjackGameCreator.java create mode 100644 src/main/java/domain/BlackjackHandOuter.java create mode 100644 src/main/java/domain/BlackjackInitialHandOuter.java create mode 100644 src/main/java/domain/BlackjackPlayersHandOuter.java create mode 100644 src/main/java/domain/BlackjackSimulator.java create mode 100644 src/main/java/domain/BlackjackWinOrLoseDecider.java delete mode 100644 src/main/java/domain/HandOutForPlayerGame.java delete mode 100644 src/main/java/domain/ReHandOutPlayer.java delete mode 100644 src/main/java/domain/TrumpCardHandOuter.java delete mode 100644 src/main/java/domain/validator/BlackjackParticipantsValidator.java delete mode 100644 src/main/java/domain/validator/BlackjackPlayerNameValidator.java create mode 100644 src/main/java/domain/validator/CollectionValidator.java create mode 100644 src/main/java/domain/validator/ObjectsValidator.java delete mode 100644 src/main/java/domain/validator/TrumpCardValidator.java create mode 100644 src/main/java/util/ObjectUtils.java diff --git a/src/main/java/BlackjackApplication.java b/src/main/java/BlackjackApplication.java index 0e48fabb4dc..29935e94a6a 100644 --- a/src/main/java/BlackjackApplication.java +++ b/src/main/java/BlackjackApplication.java @@ -1,4 +1,5 @@ -import Controller.BlackjackSimulator; +import Controller.BlackjackSimulatorRunner; +import domain.BlackjackSimulator; import view.input.ConsoleInputReader; import view.input.ConsoleInputView; import view.input.InputReader; @@ -16,7 +17,7 @@ public static void main(String[] args) { InputView inputView = new ConsoleInputView(inputReader, outputWriter); OutputView outputView = new ConsoleOutputView(outputWriter); - BlackjackSimulator blackjackSimulator = new BlackjackSimulator(inputView, outputView); - blackjackSimulator.run(); + BlackjackSimulatorRunner blackjackSimulatorRunner = new BlackjackSimulatorRunner(new BlackjackSimulator(inputView, outputView)); + blackjackSimulatorRunner.run(); } } diff --git a/src/main/java/Controller/BlackjackSimulator.java b/src/main/java/Controller/BlackjackSimulator.java deleted file mode 100644 index a7142beeb23..00000000000 --- a/src/main/java/Controller/BlackjackSimulator.java +++ /dev/null @@ -1,46 +0,0 @@ -package Controller; - -import domain.*; -import view.input.InputView; -import view.input.dto.PlayersInput; -import view.output.OutputView; -import view.output.dto.BlackjackResultOutputs; -import view.output.dto.FinalWinOrLoseOutput; -import view.output.dto.InitialHandOutOutput; - -import java.util.List; - -public class BlackjackSimulator { - - private final InputView inputView; - private final OutputView outputView; - - public BlackjackSimulator(InputView inputView, OutputView outputView) { - this.inputView = inputView; - this.outputView = outputView; - } - - public void run() { - PlayersInput playersInput = inputView.viewPlayers(); - List blackjackPlayerNames = playersInput.toBlackjackPlayerNames(); - BlackjackPlayers blackjackPlayers = BlackjackPlayers.fromNamesWithEmptyCards(blackjackPlayerNames); - BlackjackDealer blackjackDealer = BlackjackDealer.createWithEmptyCards(); - TrumpCardDeck trumpCardDeck = new TrumpCardDeck(); - - BlackjackGame blackjackGame = new BlackjackGame(BlackjackParticipants.of(blackjackDealer, blackjackPlayers), trumpCardDeck); - HandOutCount handOutCount = new HandOutCount(2); - TrumpCardHandOuter trumpCardHandOuter = new TrumpCardHandOuter(); - - BlackjackGame initialHandOutGame = blackjackGame.initialHandOut(trumpCardHandOuter, handOutCount); - InitialHandOutOutput initialHandOutOutput = InitialHandOutOutput.of(handOutCount, initialHandOutGame.getBlackjackParticipants()); - outputView.viewInitialHandOut(initialHandOutOutput); - - BlackjackGame handOutAllPlayersGame = initialHandOutGame.handOutAllPlayers(trumpCardHandOuter, inputView, outputView); - BlackjackGame handOutDealerGame = handOutAllPlayersGame.handOutDealer(trumpCardHandOuter, outputView); - outputView.viewBlackjackResult(BlackjackResultOutputs.from(handOutDealerGame.getBlackjackParticipants())); - - FinalWinOrLose finalWinOrLose = handOutDealerGame.decideWinOrLose(); - outputView.viewFinalWinOrLose(FinalWinOrLoseOutput.from(finalWinOrLose)); - - } -} diff --git a/src/main/java/Controller/BlackjackSimulatorRunner.java b/src/main/java/Controller/BlackjackSimulatorRunner.java new file mode 100644 index 00000000000..7c650270b18 --- /dev/null +++ b/src/main/java/Controller/BlackjackSimulatorRunner.java @@ -0,0 +1,21 @@ +package Controller; + +import domain.BlackjackGame; +import domain.BlackjackSimulator; + +public class BlackjackSimulatorRunner { + + private final BlackjackSimulator blackjackSimulator; + + public BlackjackSimulatorRunner(BlackjackSimulator blackjackSimulator) { + this.blackjackSimulator = blackjackSimulator; + } + + public void run() { + BlackjackGame notPlayedGame = blackjackSimulator.createNotPlayedGame(); + BlackjackGame initializeHandOutGame = blackjackSimulator.InitialHandOutGame(notPlayedGame); + BlackjackGame handOutPlayersGame = blackjackSimulator.handOutPlayers(initializeHandOutGame); + BlackjackGame handOutDealerGame = blackjackSimulator.handOutDealer(handOutPlayersGame); + blackjackSimulator.decideWinOrLose(handOutDealerGame); + } +} diff --git a/src/main/java/domain/BlackjackDealer.java b/src/main/java/domain/BlackjackDealer.java index 13ceb54a7ca..55a795a9aee 100644 --- a/src/main/java/domain/BlackjackDealer.java +++ b/src/main/java/domain/BlackjackDealer.java @@ -1,5 +1,7 @@ package domain; +import util.ObjectUtils; + import java.util.List; public class BlackjackDealer implements BlackjackParticipant { @@ -7,6 +9,7 @@ public class BlackjackDealer implements BlackjackParticipant { private final TrumpCards trumpCards; public BlackjackDealer(TrumpCards trumpCards) { + this.validateNotNull(trumpCards); this.trumpCards = trumpCards; } @@ -42,4 +45,10 @@ public BlackjackPoint calculatePoint() { return minBlackjackPoint.fetchCloserPointThreshold(maxBlackjackPoint); } + + public void validateNotNull(TrumpCards trumpCards) { + if (ObjectUtils.hasNull(trumpCards)) { + throw new IllegalArgumentException("trumpCards는 null값이면 안됩니다."); + } + } } diff --git a/src/main/java/domain/BlackjackDealerHandOuter.java b/src/main/java/domain/BlackjackDealerHandOuter.java new file mode 100644 index 00000000000..3b15dadaf98 --- /dev/null +++ b/src/main/java/domain/BlackjackDealerHandOuter.java @@ -0,0 +1,41 @@ +package domain; + +import domain.validator.ObjectsValidator; +import view.output.OutputView; +import view.output.dto.HandOutDealerOutput; + +import java.util.ArrayList; +import java.util.List; + +public class BlackjackDealerHandOuter implements BlackjackHandOuter { + + private static final int DEALER_HAND_OUT_THRESHOLD = 17; + + private final BlackjackGame blackjackGame; + + private final OutputView outputView; + + public BlackjackDealerHandOuter(BlackjackGame blackjackGame, OutputView outputView) { + ObjectsValidator.validateNotNull(blackjackGame, outputView); + this.blackjackGame = blackjackGame; + this.outputView = outputView; + } + + @Override + public BlackjackGame handOut() { + List receivedParticipants = new ArrayList<>(this.blackjackGame.fetchBlackjackPlayers()); + BlackjackDealer dealer = this.blackjackGame.findDealer(); + BlackjackPoint blackjackPoint = dealer.calculatePoint(); + TrumpCardDeck trumpCardDeck = this.blackjackGame.getTrumpCardDeck(); + + if (blackjackPoint.isLowerThan(new BlackjackPoint(DEALER_HAND_OUT_THRESHOLD))) { + TrumpCard trumpCard = trumpCardDeck.fetchTopOne(); + trumpCardDeck = trumpCardDeck.takeOutTopOne(); + dealer = dealer.receiveCard(trumpCard); + this.outputView.viewHandOutDealer(new HandOutDealerOutput(DEALER_HAND_OUT_THRESHOLD - 1)); + } + + receivedParticipants.add(dealer); + return new BlackjackGame(new BlackjackParticipants(receivedParticipants), trumpCardDeck); + } +} diff --git a/src/main/java/domain/BlackjackGame.java b/src/main/java/domain/BlackjackGame.java index 845a1fc1b22..6a26fbf9e4f 100644 --- a/src/main/java/domain/BlackjackGame.java +++ b/src/main/java/domain/BlackjackGame.java @@ -1,45 +1,24 @@ package domain; -import view.input.InputView; -import view.output.OutputView; +import domain.validator.ObjectsValidator; -import java.util.ArrayList; import java.util.List; -import java.util.Objects; -import static domain.WinOrLose.*; - -public class BlackjackGame implements HandOutForPlayerGame { +public class BlackjackGame { private final BlackjackParticipants blackjackParticipants; private final TrumpCardDeck trumpCardDeck; public BlackjackGame(BlackjackParticipants blackjackParticipants, TrumpCardDeck trumpCardDeck) { - this.validateNotNull(blackjackParticipants, trumpCardDeck); + ObjectsValidator.validateNotNull(blackjackParticipants, trumpCardDeck); this.blackjackParticipants = blackjackParticipants; this.trumpCardDeck = trumpCardDeck; } - public BlackjackGame initialHandOut(TrumpCardHandOuter trumpCardHandOuter, HandOutCount handOutCount) { - BlackjackGame blackjackGame = this; - - for (int i = 0; i < handOutCount.getHandOutCount(); i++) { - blackjackGame = trumpCardHandOuter.handOutAllParticipants(blackjackGame); - } - - return blackjackGame; - } - - public BlackjackGame handOutAllPlayers(TrumpCardHandOuter trumpCardHandOuter, InputView inputView, OutputView outputView) { - return trumpCardHandOuter.handOutAllPlayers(this, inputView, outputView); - } - - public BlackjackGame handOutDealer(TrumpCardHandOuter trumpCardHandOuter, OutputView outputView) { - return trumpCardHandOuter.handOutDealer(this, outputView); - } - - public BlackjackParticipants getBlackjackParticipants() { - return this.blackjackParticipants; + public BlackjackGame(BlackjackGame blackjackGame) { + ObjectsValidator.validateNotNull(blackjackGame); + this.blackjackParticipants = blackjackGame.blackjackParticipants; + this.trumpCardDeck = blackjackGame.trumpCardDeck; } public List fetchBlackjackParticipants() { @@ -54,48 +33,11 @@ public BlackjackDealer findDealer() { return this.blackjackParticipants.findDealer(); } - private void validateNotNull(BlackjackParticipants blackjackParticipants, TrumpCardDeck trumpCardDeck) { - if (Objects.isNull(blackjackParticipants) || Objects.isNull(trumpCardDeck)) { - throw new IllegalArgumentException("참가자 혹은 게임 덱은 null이면 안됩니다."); - } + public BlackjackPlayers findPlayers() { + return this.blackjackParticipants.findPlayers(); } public TrumpCardDeck getTrumpCardDeck() { return trumpCardDeck; } - - public FinalWinOrLose decideWinOrLose() { - int dealerWin = 0; - int dealerLose = 0; - int dealerTie = 0; - - List playerWinOrLoses = new ArrayList<>(); - - BlackjackDealer dealer = this.blackjackParticipants.findDealer(); - BlackjackPoint dealerPoint = dealer.calculatePoint(); - - BlackjackPlayers players = this.blackjackParticipants.findPlayers(); - List blackjackPlayers = players.getBlackjackPlayers(); - - for (BlackjackPlayer blackjackPlayer : blackjackPlayers) { - BlackjackPoint playerPoint = blackjackPlayer.calculatePoint(); - - if (dealerPoint.isWin(playerPoint)) { - dealerWin++; - playerWinOrLoses.add(new PlayerWinOrLose(blackjackPlayer.getBlackjackPlayerName(), LOSE)); - } - - if (dealerPoint.isLose(playerPoint)) { - dealerLose++; - playerWinOrLoses.add(new PlayerWinOrLose(blackjackPlayer.getBlackjackPlayerName(), WIN)); - } - - if (dealerPoint.isTie(playerPoint)) { - dealerTie++; - playerWinOrLoses.add(new PlayerWinOrLose(blackjackPlayer.getBlackjackPlayerName(), TIE)); - } - } - - return new FinalWinOrLose(new DealerWinOrLose(dealerWin, dealerLose, dealerTie), playerWinOrLoses); - } } diff --git a/src/main/java/domain/BlackjackGameCreator.java b/src/main/java/domain/BlackjackGameCreator.java new file mode 100644 index 00000000000..9997967fd19 --- /dev/null +++ b/src/main/java/domain/BlackjackGameCreator.java @@ -0,0 +1,26 @@ +package domain; + +import domain.validator.ObjectsValidator; +import view.input.InputView; +import view.input.dto.PlayersInput; + +import java.util.List; + +public class BlackjackGameCreator { + private final InputView inputView; + + public BlackjackGameCreator(InputView inputView) { + ObjectsValidator.validateNotNull(inputView); + this.inputView = inputView; + } + + public BlackjackGame create() { + PlayersInput playersInput = inputView.viewPlayers(); + List blackjackPlayerNames = playersInput.toBlackjackPlayerNames(); + BlackjackPlayers blackjackPlayers = BlackjackPlayers.fromNamesWithEmptyCards(blackjackPlayerNames); + BlackjackDealer blackjackDealer = BlackjackDealer.createWithEmptyCards(); + TrumpCardDeck trumpCardDeck = new TrumpCardDeck(); + + return new BlackjackGame(BlackjackParticipants.of(blackjackDealer, blackjackPlayers), trumpCardDeck); + } +} diff --git a/src/main/java/domain/BlackjackHandOuter.java b/src/main/java/domain/BlackjackHandOuter.java new file mode 100644 index 00000000000..e2788be7cca --- /dev/null +++ b/src/main/java/domain/BlackjackHandOuter.java @@ -0,0 +1,6 @@ +package domain; + +public interface BlackjackHandOuter { + + BlackjackGame handOut(); +} diff --git a/src/main/java/domain/BlackjackInitialHandOuter.java b/src/main/java/domain/BlackjackInitialHandOuter.java new file mode 100644 index 00000000000..3e076b26a46 --- /dev/null +++ b/src/main/java/domain/BlackjackInitialHandOuter.java @@ -0,0 +1,46 @@ +package domain; + +import domain.validator.ObjectsValidator; + +import java.util.ArrayList; +import java.util.List; + +public class BlackjackInitialHandOuter implements BlackjackHandOuter { + + private final BlackjackGame blackjackGame; + + private final HandOutCount handOutCount; + + public BlackjackInitialHandOuter(BlackjackGame blackjackGame, HandOutCount handOutCount) { + ObjectsValidator.validateNotNull(blackjackGame, handOutCount); + this.blackjackGame = blackjackGame; + this.handOutCount = handOutCount; + } + + @Override + public BlackjackGame handOut() { + BlackjackGame blackjackGame = new BlackjackGame(this.blackjackGame); + + for (int i = 0; i < handOutCount.getHandOutCount(); i++) { + blackjackGame = this.handOutAllParticipants(blackjackGame); + } + + return blackjackGame; + } + + private BlackjackGame handOutAllParticipants(BlackjackGame blackjackGame) { + ArrayList receivedParticipants = new ArrayList<>(); + TrumpCardDeck trumpCardDeck = blackjackGame.getTrumpCardDeck(); + + List participants = blackjackGame.fetchBlackjackParticipants(); + + for (BlackjackParticipant participant : participants) { + TrumpCard trumpCard = trumpCardDeck.fetchTopOne(); + trumpCardDeck = trumpCardDeck.takeOutTopOne(); + BlackjackParticipant receiveParticipant = participant.receiveCard(trumpCard); + receivedParticipants.add(receiveParticipant); + } + + return new BlackjackGame(new BlackjackParticipants(receivedParticipants), trumpCardDeck); + } +} diff --git a/src/main/java/domain/BlackjackParticipants.java b/src/main/java/domain/BlackjackParticipants.java index 36bdfdc934b..fdbdde9e4c6 100644 --- a/src/main/java/domain/BlackjackParticipants.java +++ b/src/main/java/domain/BlackjackParticipants.java @@ -1,6 +1,6 @@ package domain; -import domain.validator.BlackjackParticipantsValidator; +import util.CollectionUtils; import java.util.ArrayList; import java.util.List; @@ -11,7 +11,7 @@ public class BlackjackParticipants { private final List blackjackParticipants; public BlackjackParticipants(List blackjackParticipants) { - BlackjackParticipantsValidator.validate(blackjackParticipants); + this.validateNotEmpty(blackjackParticipants); this.blackjackParticipants = blackjackParticipants; } @@ -25,6 +25,12 @@ public static BlackjackParticipants of(BlackjackDealer blackjackDealer, Blackjac ); } + private void validateNotEmpty(List blackjackParticipants) { + if (CollectionUtils.isEmpty(blackjackParticipants)) { + throw new IllegalArgumentException("블랙잭 참가자는 null이거나 empty이면 안됩니다."); + } + } + public int size() { return this.blackjackParticipants.size(); } diff --git a/src/main/java/domain/BlackjackPlayer.java b/src/main/java/domain/BlackjackPlayer.java index 6e676a82b66..cce9c77b38e 100644 --- a/src/main/java/domain/BlackjackPlayer.java +++ b/src/main/java/domain/BlackjackPlayer.java @@ -1,13 +1,16 @@ package domain; +import domain.validator.ObjectsValidator; + import java.util.List; -public class BlackjackPlayer implements BlackjackParticipant, ReHandOutPlayer { +public class BlackjackPlayer implements BlackjackParticipant { private final BlackjackPlayerName blackjackPlayerName; private final TrumpCards trumpCards; public BlackjackPlayer(BlackjackPlayerName blackjackPlayerName, TrumpCards trumpCards) { + ObjectsValidator.validateNotNull(blackjackPlayerName, trumpCards); this.blackjackPlayerName = blackjackPlayerName; this.trumpCards = trumpCards; } @@ -17,26 +20,10 @@ public BlackjackPlayer receiveCard(TrumpCard trumpCard) { return new BlackjackPlayer(this.blackjackPlayerName, this.trumpCards.addCard(trumpCard)); } - @Override public BlackjackPlayerName getBlackjackPlayerName() { return this.blackjackPlayerName; } - @Override - public String fetchPlayerNameToString() { - return this.blackjackPlayerName.getName(); - } - - @Override - public TrumpCards getTrumpCards() { - return this.trumpCards; - } - - @Override - public List fetchCardKoreanNames() { - return this.trumpCards.fetchKoreanNames(); - } - @Override public List fetchKoreanCardNames() { return this.trumpCards.fetchKoreanNames(); @@ -63,8 +50,4 @@ public BlackjackPoint calculatePoint() { public String getPlayerName() { return blackjackPlayerName.getName(); } - - public boolean isEqualName(BlackjackPlayerName blackjackPlayerName) { - return this.blackjackPlayerName.equals(blackjackPlayerName); - } } diff --git a/src/main/java/domain/BlackjackPlayerName.java b/src/main/java/domain/BlackjackPlayerName.java index 9094edca042..f4646af97f4 100644 --- a/src/main/java/domain/BlackjackPlayerName.java +++ b/src/main/java/domain/BlackjackPlayerName.java @@ -1,6 +1,6 @@ package domain; -import domain.validator.BlackjackPlayerNameValidator; +import util.StringUtils; import java.util.Objects; @@ -9,7 +9,7 @@ public class BlackjackPlayerName { private final String name; public BlackjackPlayerName(String name) { - BlackjackPlayerNameValidator.validate(name); + this.validateNotEmpty(name); this.name = name; } @@ -29,4 +29,10 @@ public boolean equals(Object o) { public int hashCode() { return Objects.hash(name); } + + private void validateNotEmpty(String name) { + if (StringUtils.isEmpty(name)) { + throw new IllegalArgumentException("블랙잭 참여자의 이름은 null이거나 공백이면 안됩니다."); + } + } } diff --git a/src/main/java/domain/BlackjackPlayers.java b/src/main/java/domain/BlackjackPlayers.java index cb69c4bb947..a528067569d 100644 --- a/src/main/java/domain/BlackjackPlayers.java +++ b/src/main/java/domain/BlackjackPlayers.java @@ -1,5 +1,7 @@ package domain; +import domain.validator.CollectionValidator; + import java.util.List; import java.util.stream.Collectors; @@ -8,6 +10,7 @@ public class BlackjackPlayers { private final List blackjackPlayers; public BlackjackPlayers(List blackjackPlayers) { + CollectionValidator.validateNotEmpty(blackjackPlayers); this.blackjackPlayers = blackjackPlayers; } diff --git a/src/main/java/domain/BlackjackPlayersHandOuter.java b/src/main/java/domain/BlackjackPlayersHandOuter.java new file mode 100644 index 00000000000..fd236c924c1 --- /dev/null +++ b/src/main/java/domain/BlackjackPlayersHandOuter.java @@ -0,0 +1,55 @@ +package domain; + +import domain.validator.ObjectsValidator; +import view.input.InputView; +import view.input.dto.HandOutPlayerInput; +import view.input.dto.HandOutPlayerRequest; +import view.output.OutputView; +import view.output.dto.HandOutPlayerOutput; + +import java.util.ArrayList; +import java.util.List; + +public class BlackjackPlayersHandOuter implements BlackjackHandOuter { + + private final BlackjackGame blackjackGame; + + private final InputView inputView; + + private final OutputView outputView; + + public BlackjackPlayersHandOuter(BlackjackGame blackjackGame, InputView inputView, OutputView outputView) { + ObjectsValidator.validateNotNull(blackjackGame, inputView, outputView); + this.blackjackGame = blackjackGame; + this.inputView = inputView; + this.outputView = outputView; + } + + @Override + public BlackjackGame handOut() { + List receivedParticipants = new ArrayList<>(); + TrumpCardDeck trumpCardDeck = this.blackjackGame.getTrumpCardDeck(); + List blackjackPlayers = this.blackjackGame.fetchBlackjackPlayers(); + + for (BlackjackPlayer blackjackPlayer : blackjackPlayers) { + BlackjackPlayerName blackjackPlayerName = blackjackPlayer.getBlackjackPlayerName(); + + while (this.isHandOut(blackjackPlayerName, this.inputView)) { + TrumpCard trumpCard = trumpCardDeck.fetchTopOne(); + trumpCardDeck = trumpCardDeck.takeOutTopOne(); + blackjackPlayer = blackjackPlayer.receiveCard(trumpCard); + this.outputView.viewHandOutPlayer(HandOutPlayerOutput.of(blackjackPlayerName, blackjackPlayer)); + } + receivedParticipants.add(blackjackPlayer); + } + + receivedParticipants.add(this.blackjackGame.findDealer()); + + return new BlackjackGame(new BlackjackParticipants(receivedParticipants), trumpCardDeck); + } + + private boolean isHandOut(BlackjackPlayerName blackjackPlayerName, InputView inputView) { + HandOutPlayerInput handOutPlayerInput = inputView.viewHandOutCardForPlayer(HandOutPlayerRequest.from(blackjackPlayerName)); + return handOutPlayerInput.isHandOut(); + } +} diff --git a/src/main/java/domain/BlackjackPoint.java b/src/main/java/domain/BlackjackPoint.java index 5cf5a90bb29..ab59c02ef9b 100644 --- a/src/main/java/domain/BlackjackPoint.java +++ b/src/main/java/domain/BlackjackPoint.java @@ -8,6 +8,7 @@ public class BlackjackPoint { private final int point; public BlackjackPoint(int point) { + this.validateLowerThanZero(point); this.point = point; } @@ -15,7 +16,7 @@ public BlackjackPoint sum(BlackjackPoint blackjackPoint) { return new BlackjackPoint(this.point + blackjackPoint.point); } - public boolean isLossThan(BlackjackPoint blackjackPoint) { + public boolean isLowerThan(BlackjackPoint blackjackPoint) { return this.point < blackjackPoint.point; } @@ -62,4 +63,10 @@ public boolean equals(Object o) { public int hashCode() { return Objects.hash(point); } + + private void validateLowerThanZero(int point) { + if (point < 0) { + throw new IllegalArgumentException("블랙잭 포인트는 음수일 수 없습니다."); + } + } } diff --git a/src/main/java/domain/BlackjackSimulator.java b/src/main/java/domain/BlackjackSimulator.java new file mode 100644 index 00000000000..6183fb25ce1 --- /dev/null +++ b/src/main/java/domain/BlackjackSimulator.java @@ -0,0 +1,54 @@ +package domain; + +import domain.validator.ObjectsValidator; +import view.input.InputView; +import view.output.OutputView; +import view.output.dto.BlackjackResultOutputs; +import view.output.dto.FinalWinOrLoseOutput; +import view.output.dto.InitialHandOutOutput; + +public class BlackjackSimulator { + + private final InputView inputView; + + private final OutputView outputView; + + public BlackjackSimulator(InputView inputView, OutputView outputView) { + ObjectsValidator.validateNotNull(inputView, outputView); + this.inputView = inputView; + this.outputView = outputView; + } + + public BlackjackGame createNotPlayedGame() { + BlackjackGameCreator blackjackGameCreator = new BlackjackGameCreator(inputView); + return blackjackGameCreator.create(); + } + + public BlackjackGame InitialHandOutGame(BlackjackGame blackjackGame) { + HandOutCount handOutCount = new HandOutCount(2); + BlackjackInitialHandOuter blackjackInitialHandOuter = new BlackjackInitialHandOuter(blackjackGame, new HandOutCount(2)); + BlackjackGame initialHandOutGame = blackjackInitialHandOuter.handOut(); + outputView.viewInitialHandOut(InitialHandOutOutput.of(handOutCount, initialHandOutGame)); + + return initialHandOutGame; + } + + public BlackjackGame handOutPlayers(BlackjackGame blackjackGame) { + BlackjackPlayersHandOuter blackjackPlayersHandOuter = new BlackjackPlayersHandOuter(blackjackGame, inputView, outputView); + return blackjackPlayersHandOuter.handOut(); + } + + public BlackjackGame handOutDealer(BlackjackGame blackjackGame) { + BlackjackDealerHandOuter blackjackDealerHandOuter = new BlackjackDealerHandOuter(blackjackGame, outputView); + BlackjackGame dealerHandOutGame = blackjackDealerHandOuter.handOut(); + outputView.viewBlackjackResult(BlackjackResultOutputs.from(dealerHandOutGame)); + + return dealerHandOutGame; + } + + public void decideWinOrLose(BlackjackGame blackjackGame) { + BlackjackWinOrLoseDecider blackjackWinOrLoseDecider = new BlackjackWinOrLoseDecider(blackjackGame); + FinalWinOrLose winOrLose = blackjackWinOrLoseDecider.decide(); + outputView.viewFinalWinOrLose(FinalWinOrLoseOutput.from(winOrLose)); + } +} diff --git a/src/main/java/domain/BlackjackWinOrLoseDecider.java b/src/main/java/domain/BlackjackWinOrLoseDecider.java new file mode 100644 index 00000000000..85ac032437f --- /dev/null +++ b/src/main/java/domain/BlackjackWinOrLoseDecider.java @@ -0,0 +1,53 @@ +package domain; + +import domain.validator.ObjectsValidator; + +import java.util.ArrayList; +import java.util.List; + +import static domain.WinOrLose.*; + +public class BlackjackWinOrLoseDecider { + + private final BlackjackGame blackjackGame; + + public BlackjackWinOrLoseDecider(BlackjackGame blackjackGame) { + ObjectsValidator.validateNotNull(blackjackGame); + this.blackjackGame = blackjackGame; + } + + public FinalWinOrLose decide() { + int dealerWin = 0; + int dealerLose = 0; + int dealerTie = 0; + + List playerWinOrLoses = new ArrayList<>(); + + BlackjackDealer dealer = blackjackGame.findDealer(); + BlackjackPoint dealerPoint = dealer.calculatePoint(); + + BlackjackPlayers players = blackjackGame.findPlayers(); + List blackjackPlayers = players.getBlackjackPlayers(); + + for (BlackjackPlayer blackjackPlayer : blackjackPlayers) { + BlackjackPoint playerPoint = blackjackPlayer.calculatePoint(); + + if (dealerPoint.isWin(playerPoint)) { + dealerWin++; + playerWinOrLoses.add(new PlayerWinOrLose(blackjackPlayer.getBlackjackPlayerName(), LOSE)); + } + + if (dealerPoint.isLose(playerPoint)) { + dealerLose++; + playerWinOrLoses.add(new PlayerWinOrLose(blackjackPlayer.getBlackjackPlayerName(), WIN)); + } + + if (dealerPoint.isTie(playerPoint)) { + dealerTie++; + playerWinOrLoses.add(new PlayerWinOrLose(blackjackPlayer.getBlackjackPlayerName(), TIE)); + } + } + + return new FinalWinOrLose(new DealerWinOrLose(dealerWin, dealerLose, dealerTie), playerWinOrLoses); + } +} diff --git a/src/main/java/domain/DealerWinOrLose.java b/src/main/java/domain/DealerWinOrLose.java index 9589cb9d57b..c5daaab4162 100644 --- a/src/main/java/domain/DealerWinOrLose.java +++ b/src/main/java/domain/DealerWinOrLose.java @@ -9,6 +9,7 @@ public class DealerWinOrLose { private final int tieCount; public DealerWinOrLose(int winCount, int loseCount, int tieCount) { + this.validateLowerThanZero(winCount, loseCount, tieCount); this.winCount = winCount; this.loseCount = loseCount; this.tieCount = tieCount; @@ -25,4 +26,18 @@ public int getLoseCount() { public int getTieCount() { return tieCount; } + + private void validateLowerThanZero(int winCount, int loseCount, int tieCount) { + if (this.hasLowerThanZero(winCount, loseCount, tieCount)) { + throw new IllegalArgumentException("dealer 승패 수는 음수일 수 없습니다."); + } + } + + private boolean isLowerThanZero(int count) { + return count < 0; + } + + private boolean hasLowerThanZero(int winCount, int loseCount, int tieCount) { + return this.isLowerThanZero(winCount) || this.isLowerThanZero(loseCount) || this.isLowerThanZero(tieCount); + } } diff --git a/src/main/java/domain/FinalWinOrLose.java b/src/main/java/domain/FinalWinOrLose.java index c461d2ce2c6..1b9d3274729 100644 --- a/src/main/java/domain/FinalWinOrLose.java +++ b/src/main/java/domain/FinalWinOrLose.java @@ -1,5 +1,8 @@ package domain; +import domain.validator.CollectionValidator; +import domain.validator.ObjectsValidator; + import java.util.List; public class FinalWinOrLose { @@ -9,6 +12,8 @@ public class FinalWinOrLose { private final List playerWinOrLose; public FinalWinOrLose(DealerWinOrLose dealerWinOrLose, List playerWinOrLose) { + ObjectsValidator.validateNotNull(dealerWinOrLose); + CollectionValidator.validateNotEmpty(playerWinOrLose); this.dealerWinOrLose = dealerWinOrLose; this.playerWinOrLose = playerWinOrLose; } diff --git a/src/main/java/domain/HandOutCount.java b/src/main/java/domain/HandOutCount.java index 357f336c65f..a6d995f6d79 100644 --- a/src/main/java/domain/HandOutCount.java +++ b/src/main/java/domain/HandOutCount.java @@ -15,7 +15,7 @@ public int getHandOutCount() { private void validateGreaterThanZero(int handOutCount) { if (handOutCount <= 0) { - throw new IllegalArgumentException("나눠주는 카드는 무조건 1장 이상이어야 합니다."); + throw new IllegalArgumentException("나눠주는 카드는 1장 이상이어야 합니다."); } } } diff --git a/src/main/java/domain/HandOutForPlayerGame.java b/src/main/java/domain/HandOutForPlayerGame.java deleted file mode 100644 index b5ef338e23a..00000000000 --- a/src/main/java/domain/HandOutForPlayerGame.java +++ /dev/null @@ -1,5 +0,0 @@ -package domain; - -public interface HandOutForPlayerGame { - -} diff --git a/src/main/java/domain/PlayerWinOrLose.java b/src/main/java/domain/PlayerWinOrLose.java index ca29804f642..97415986e4b 100644 --- a/src/main/java/domain/PlayerWinOrLose.java +++ b/src/main/java/domain/PlayerWinOrLose.java @@ -11,14 +11,6 @@ public PlayerWinOrLose(BlackjackPlayerName blackjackPlayerName, WinOrLose winOrL this.winOrLose = winOrLose; } - public BlackjackPlayerName getBlackjackPlayerName() { - return blackjackPlayerName; - } - - public WinOrLose getWinOrLose() { - return winOrLose; - } - public String fetchPlayerName() { return this.blackjackPlayerName.getName(); } diff --git a/src/main/java/domain/ReHandOutPlayer.java b/src/main/java/domain/ReHandOutPlayer.java deleted file mode 100644 index de4d22a91cc..00000000000 --- a/src/main/java/domain/ReHandOutPlayer.java +++ /dev/null @@ -1,16 +0,0 @@ -package domain; - -import java.util.List; - -public interface ReHandOutPlayer { - - ReHandOutPlayer receiveCard(TrumpCard trumpCard); - - BlackjackPlayerName getBlackjackPlayerName(); - - String fetchPlayerNameToString(); - - TrumpCards getTrumpCards(); - - List fetchCardKoreanNames(); -} diff --git a/src/main/java/domain/TrumpCard.java b/src/main/java/domain/TrumpCard.java index e14800398f2..6c794c1b2a0 100644 --- a/src/main/java/domain/TrumpCard.java +++ b/src/main/java/domain/TrumpCard.java @@ -1,6 +1,6 @@ package domain; -import domain.validator.TrumpCardValidator; +import domain.validator.ObjectsValidator; import java.util.Objects; @@ -11,7 +11,7 @@ public class TrumpCard { private final TrumpCardSuit trumpCardSuit; public TrumpCard(TrumpCardRank trumpCardRank, TrumpCardSuit trumpCardSuit) { - TrumpCardValidator.validate(trumpCardRank, trumpCardSuit); + ObjectsValidator.validateNotNull(trumpCardRank, trumpCardSuit); this.trumpCardRank = trumpCardRank; this.trumpCardSuit = trumpCardSuit; } diff --git a/src/main/java/domain/TrumpCardDeck.java b/src/main/java/domain/TrumpCardDeck.java index 89829585796..c90a1d82b7f 100644 --- a/src/main/java/domain/TrumpCardDeck.java +++ b/src/main/java/domain/TrumpCardDeck.java @@ -1,6 +1,6 @@ package domain; -import java.util.Objects; +import domain.validator.ObjectsValidator; public class TrumpCardDeck { @@ -11,15 +11,10 @@ public TrumpCardDeck() { } public TrumpCardDeck(TrumpCards trumpCards) { - this.validateNotNull(trumpCards); + ObjectsValidator.validateNotNull(trumpCards); this.trumpCards = trumpCards; } - public TrumpCardDeck(TrumpCardDeck trumpCardDeck) { - this.validateNotNull(trumpCardDeck); - this.trumpCards = trumpCardDeck.trumpCards; - } - public TrumpCard fetchTopOne() { return this.trumpCards.fetchTopOne(); } @@ -29,16 +24,4 @@ public TrumpCardDeck takeOutTopOne() { this.trumpCards.takeOutTopOne() ); } - - private void validateNotNull(TrumpCards trumpCards) { - if (Objects.isNull(trumpCards)) { - throw new IllegalArgumentException("트럼프 카드들은 null이면 안됩니다."); - } - } - - private void validateNotNull(TrumpCardDeck trumpCardDeck) { - if (Objects.isNull(trumpCardDeck)) { - throw new IllegalArgumentException("트럼프 덱은 null이면 안됩니다."); - } - } } diff --git a/src/main/java/domain/TrumpCardHandOuter.java b/src/main/java/domain/TrumpCardHandOuter.java deleted file mode 100644 index 8746924b179..00000000000 --- a/src/main/java/domain/TrumpCardHandOuter.java +++ /dev/null @@ -1,77 +0,0 @@ -package domain; - -import view.input.InputView; -import view.input.dto.HandOutPlayerInput; -import view.input.dto.HandOutPlayerRequest; -import view.output.OutputView; -import view.output.dto.HandOutDealerOutput; -import view.output.dto.HandOutPlayerOutput; - -import java.util.ArrayList; -import java.util.List; - -public class TrumpCardHandOuter { - - private static final int DEALER_HAND_OUT_THRESHOLD = 17; - - public BlackjackGame handOutAllParticipants(BlackjackGame blackjackGame) { - ArrayList receivedParticipants = new ArrayList<>(); - TrumpCardDeck trumpCardDeck = blackjackGame.getTrumpCardDeck(); - - List participants = blackjackGame.fetchBlackjackParticipants(); - - for (BlackjackParticipant participant : participants) { - TrumpCard trumpCard = trumpCardDeck.fetchTopOne(); - trumpCardDeck = trumpCardDeck.takeOutTopOne(); - BlackjackParticipant receiveParticipant = participant.receiveCard(trumpCard); - receivedParticipants.add(receiveParticipant); - } - - return new BlackjackGame(new BlackjackParticipants(receivedParticipants), trumpCardDeck); - } - - public BlackjackGame handOutAllPlayers(BlackjackGame blackjackGame, InputView inputView, OutputView outputView) { - List receivedParticipants = new ArrayList<>(); - TrumpCardDeck trumpCardDeck = blackjackGame.getTrumpCardDeck(); - List blackjackPlayers = blackjackGame.fetchBlackjackPlayers(); - - for (BlackjackPlayer blackjackPlayer : blackjackPlayers) { - BlackjackPlayerName blackjackPlayerName = blackjackPlayer.getBlackjackPlayerName(); - - while (this.isHandOut(blackjackPlayerName, inputView)) { - TrumpCard trumpCard = trumpCardDeck.fetchTopOne(); - trumpCardDeck = trumpCardDeck.takeOutTopOne(); - blackjackPlayer = blackjackPlayer.receiveCard(trumpCard); - outputView.viewHandOutPlayer(HandOutPlayerOutput.of(blackjackPlayerName, blackjackPlayer)); - } - receivedParticipants.add(blackjackPlayer); - } - - receivedParticipants.add(blackjackGame.findDealer()); - - return new BlackjackGame(new BlackjackParticipants(receivedParticipants), trumpCardDeck); - } - - public BlackjackGame handOutDealer(BlackjackGame blackjackGame, OutputView outputView) { - List receivedParticipants = new ArrayList<>(blackjackGame.fetchBlackjackPlayers()); - BlackjackDealer dealer = blackjackGame.findDealer(); - BlackjackPoint blackjackPoint = dealer.calculatePoint(); - TrumpCardDeck trumpCardDeck = blackjackGame.getTrumpCardDeck(); - - if (blackjackPoint.isLossThan(new BlackjackPoint(DEALER_HAND_OUT_THRESHOLD))) { - TrumpCard trumpCard = trumpCardDeck.fetchTopOne(); - trumpCardDeck = trumpCardDeck.takeOutTopOne(); - dealer = dealer.receiveCard(trumpCard); - outputView.viewHandOutDealer(new HandOutDealerOutput(DEALER_HAND_OUT_THRESHOLD - 1)); - } - - receivedParticipants.add(dealer); - return new BlackjackGame(new BlackjackParticipants(receivedParticipants), trumpCardDeck); - } - - private boolean isHandOut(BlackjackPlayerName blackjackPlayerName, InputView inputView) { - HandOutPlayerInput handOutPlayerInput = inputView.viewHandOutCardForPlayer(HandOutPlayerRequest.from(blackjackPlayerName)); - return handOutPlayerInput.isHandOut(); - } - -} diff --git a/src/main/java/domain/validator/BlackjackParticipantsValidator.java b/src/main/java/domain/validator/BlackjackParticipantsValidator.java deleted file mode 100644 index 840922e929c..00000000000 --- a/src/main/java/domain/validator/BlackjackParticipantsValidator.java +++ /dev/null @@ -1,19 +0,0 @@ -package domain.validator; - -import domain.BlackjackParticipant; -import util.CollectionUtils; - -import java.util.List; - -public class BlackjackParticipantsValidator { - - public static void validate(List blackjackParticipants) { - validateNotEmpty(blackjackParticipants); - } - - private static void validateNotEmpty(List blackjackParticipants) { - if (CollectionUtils.isEmpty(blackjackParticipants)) { - throw new IllegalArgumentException("블랙잭 참가자는 null이거나 empty이면 안됩니다."); - } - } -} diff --git a/src/main/java/domain/validator/BlackjackPlayerNameValidator.java b/src/main/java/domain/validator/BlackjackPlayerNameValidator.java deleted file mode 100644 index 7ccf4ac0cf0..00000000000 --- a/src/main/java/domain/validator/BlackjackPlayerNameValidator.java +++ /dev/null @@ -1,16 +0,0 @@ -package domain.validator; - -import util.StringUtils; - -public abstract class BlackjackPlayerNameValidator { - - public static void validate(String name) { - validateNotEmpty(name); - } - - private static void validateNotEmpty(String name) { - if (StringUtils.isEmpty(name)) { - throw new IllegalArgumentException("블랙잭 참여자의 이름은 null이거나 공백이면 안됩니다."); - } - } -} diff --git a/src/main/java/domain/validator/CollectionValidator.java b/src/main/java/domain/validator/CollectionValidator.java new file mode 100644 index 00000000000..a35ea14b957 --- /dev/null +++ b/src/main/java/domain/validator/CollectionValidator.java @@ -0,0 +1,18 @@ +package domain.validator; + +import util.CollectionUtils; + +import java.util.Collection; + +public abstract class CollectionValidator { + + private static final String NOT_EMPTY_MESSAGE = "%s collection은 null이거나 empty이면 안됩니다."; + + public static void validateNotEmpty(Collection collection) { + String className = collection.getClass().getName(); + + if (CollectionUtils.isEmpty(collection)) { + throw new IllegalArgumentException(String.format(NOT_EMPTY_MESSAGE, className)); + } + } +} diff --git a/src/main/java/domain/validator/ObjectsValidator.java b/src/main/java/domain/validator/ObjectsValidator.java new file mode 100644 index 00000000000..b77b056b6f4 --- /dev/null +++ b/src/main/java/domain/validator/ObjectsValidator.java @@ -0,0 +1,22 @@ +package domain.validator; + +import util.ObjectUtils; + +import java.util.stream.Collectors; +import java.util.stream.Stream; + +public class ObjectsValidator { + + private static final String NOT_NULL_MESSAGE = "%s는 null값이면 안됩니다."; + + public static void validateNotNull(Object... objects) { + String classNames = Stream.of(objects) + .map(Object::getClass) + .map(Class::getName) + .collect(Collectors.joining(", ")); + + if (ObjectUtils.hasNull(objects)) { + throw new IllegalArgumentException(String.format(NOT_NULL_MESSAGE, classNames)); + } + } +} diff --git a/src/main/java/domain/validator/TrumpCardValidator.java b/src/main/java/domain/validator/TrumpCardValidator.java deleted file mode 100644 index ac32c62614f..00000000000 --- a/src/main/java/domain/validator/TrumpCardValidator.java +++ /dev/null @@ -1,23 +0,0 @@ -package domain.validator; - -import domain.TrumpCardRank; -import domain.TrumpCardSuit; - -import java.util.Objects; - -public abstract class TrumpCardValidator { - - public static void validate(TrumpCardRank trumpCardRank, TrumpCardSuit trumpCardSuit) { - validateNotNull(trumpCardRank, trumpCardSuit); - } - - private static void validateNotNull(TrumpCardRank trumpCardRank, TrumpCardSuit trumpCardSuit) { - if (hasNull(trumpCardRank, trumpCardSuit)) { - throw new IllegalArgumentException("트럼프 카드 모양 또는 숫자가 null이면 안됩니다."); - } - } - - private static boolean hasNull(TrumpCardRank trumpCardRank, TrumpCardSuit trumpCardSuit) { - return Objects.isNull(trumpCardRank) || Objects.isNull(trumpCardSuit); - } -} diff --git a/src/main/java/util/ObjectUtils.java b/src/main/java/util/ObjectUtils.java new file mode 100644 index 00000000000..a5dc09b9958 --- /dev/null +++ b/src/main/java/util/ObjectUtils.java @@ -0,0 +1,14 @@ +package util; + +import java.util.List; +import java.util.Objects; +import java.util.stream.Stream; + +public abstract class ObjectUtils { + + public static boolean hasNull(Object... args) { + List argsList = Stream.of(args).toList(); + + return !CollectionUtils.isEmpty(argsList) && argsList.stream().anyMatch(Objects::isNull); + } +} diff --git a/src/main/java/view/output/dto/BlackjackResultOutputs.java b/src/main/java/view/output/dto/BlackjackResultOutputs.java index 468b2bfa38f..da7c340393e 100644 --- a/src/main/java/view/output/dto/BlackjackResultOutputs.java +++ b/src/main/java/view/output/dto/BlackjackResultOutputs.java @@ -1,6 +1,6 @@ package view.output.dto; -import domain.BlackjackParticipants; +import domain.BlackjackGame; import java.util.List; import java.util.stream.Collectors; @@ -13,9 +13,9 @@ public BlackjackResultOutputs(List blackjackResultOutputs this.blackjackResultOutputs = blackjackResultOutputs; } - public static BlackjackResultOutputs from(BlackjackParticipants blackjackParticipants) { + public static BlackjackResultOutputs from(BlackjackGame blackjackGame) { return new BlackjackResultOutputs( - blackjackParticipants.getBlackjackParticipants().stream() + blackjackGame.fetchBlackjackParticipants().stream() .map(BlackjackResultOutput::from) .collect(Collectors.toList()) ); diff --git a/src/main/java/view/output/dto/InitialHandOutOutput.java b/src/main/java/view/output/dto/InitialHandOutOutput.java index 0eabadfca5c..49ec49f27c9 100644 --- a/src/main/java/view/output/dto/InitialHandOutOutput.java +++ b/src/main/java/view/output/dto/InitialHandOutOutput.java @@ -1,6 +1,6 @@ package view.output.dto; -import domain.BlackjackParticipants; +import domain.BlackjackGame; import domain.HandOutCount; import java.util.List; @@ -17,10 +17,10 @@ public InitialHandOutOutput(int handOutCount, List Date: Sun, 2 Jun 2024 16:14:09 +0900 Subject: [PATCH 11/22] =?UTF-8?q?feat=20:=20List.copyof=20=EC=82=AC?= =?UTF-8?q?=EC=9A=A9=20=ED=95=A8=EC=88=98=EB=AA=85=20fetch=EB=A1=9C=20?= =?UTF-8?q?=EB=B3=80=EA=B2=BD,=20=EB=A0=88=EC=BD=94=EB=93=9C=20=EB=B3=80?= =?UTF-8?q?=EA=B2=BD=20=EA=B0=80=EB=8A=A5=20=ED=95=A8=EC=88=98=20=EB=B3=80?= =?UTF-8?q?=EA=B2=BD?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- src/main/java/domain/BlackjackDealer.java | 10 ++------ src/main/java/domain/BlackjackGame.java | 4 +-- .../domain/BlackjackInitialHandOuter.java | 2 +- .../java/domain/BlackjackParticipants.java | 2 +- src/main/java/domain/BlackjackPlayer.java | 2 +- src/main/java/domain/BlackjackPlayerName.java | 16 ++---------- src/main/java/domain/BlackjackPlayers.java | 2 +- src/main/java/domain/BlackjackPoint.java | 17 ++----------- .../domain/BlackjackWinOrLoseDecider.java | 2 +- src/main/java/domain/DealerWinOrLose.java | 25 ++----------------- src/main/java/domain/FinalWinOrLose.java | 2 +- src/main/java/domain/HandOutCount.java | 11 ++------ src/main/java/domain/PlayerWinOrLose.java | 2 +- .../view/input/dto/HandOutPlayerRequest.java | 2 +- .../output/dto/BlackjackResultOutput.java | 2 +- .../output/dto/DealerWinOrLoseOutput.java | 2 +- .../view/output/dto/FinalWinOrLoseOutput.java | 2 +- .../view/output/dto/HandOutPlayerOutput.java | 2 +- .../view/output/dto/InitialHandOutOutput.java | 2 +- 19 files changed, 25 insertions(+), 84 deletions(-) diff --git a/src/main/java/domain/BlackjackDealer.java b/src/main/java/domain/BlackjackDealer.java index 55a795a9aee..ac8d9bee650 100644 --- a/src/main/java/domain/BlackjackDealer.java +++ b/src/main/java/domain/BlackjackDealer.java @@ -1,6 +1,6 @@ package domain; -import util.ObjectUtils; +import domain.validator.ObjectsValidator; import java.util.List; @@ -9,7 +9,7 @@ public class BlackjackDealer implements BlackjackParticipant { private final TrumpCards trumpCards; public BlackjackDealer(TrumpCards trumpCards) { - this.validateNotNull(trumpCards); + ObjectsValidator.validateNotNull(trumpCards); this.trumpCards = trumpCards; } @@ -45,10 +45,4 @@ public BlackjackPoint calculatePoint() { return minBlackjackPoint.fetchCloserPointThreshold(maxBlackjackPoint); } - - public void validateNotNull(TrumpCards trumpCards) { - if (ObjectUtils.hasNull(trumpCards)) { - throw new IllegalArgumentException("trumpCards는 null값이면 안됩니다."); - } - } } diff --git a/src/main/java/domain/BlackjackGame.java b/src/main/java/domain/BlackjackGame.java index 6a26fbf9e4f..f7f60a91ac4 100644 --- a/src/main/java/domain/BlackjackGame.java +++ b/src/main/java/domain/BlackjackGame.java @@ -22,11 +22,11 @@ public BlackjackGame(BlackjackGame blackjackGame) { } public List fetchBlackjackParticipants() { - return this.blackjackParticipants.getBlackjackParticipants(); + return this.blackjackParticipants.fetchBlackjackParticipants(); } public List fetchBlackjackPlayers() { - return this.blackjackParticipants.findPlayers().getBlackjackPlayers(); + return this.blackjackParticipants.findPlayers().fetchBlackjackPlayers(); } public BlackjackDealer findDealer() { diff --git a/src/main/java/domain/BlackjackInitialHandOuter.java b/src/main/java/domain/BlackjackInitialHandOuter.java index 3e076b26a46..ba526186e5a 100644 --- a/src/main/java/domain/BlackjackInitialHandOuter.java +++ b/src/main/java/domain/BlackjackInitialHandOuter.java @@ -21,7 +21,7 @@ public BlackjackInitialHandOuter(BlackjackGame blackjackGame, HandOutCount handO public BlackjackGame handOut() { BlackjackGame blackjackGame = new BlackjackGame(this.blackjackGame); - for (int i = 0; i < handOutCount.getHandOutCount(); i++) { + for (int i = 0; i < handOutCount.handOutCount(); i++) { blackjackGame = this.handOutAllParticipants(blackjackGame); } diff --git a/src/main/java/domain/BlackjackParticipants.java b/src/main/java/domain/BlackjackParticipants.java index fdbdde9e4c6..492b8f2880c 100644 --- a/src/main/java/domain/BlackjackParticipants.java +++ b/src/main/java/domain/BlackjackParticipants.java @@ -35,7 +35,7 @@ public int size() { return this.blackjackParticipants.size(); } - public List getBlackjackParticipants() { + public List fetchBlackjackParticipants() { return List.copyOf(this.blackjackParticipants); } diff --git a/src/main/java/domain/BlackjackPlayer.java b/src/main/java/domain/BlackjackPlayer.java index cce9c77b38e..98d91db31aa 100644 --- a/src/main/java/domain/BlackjackPlayer.java +++ b/src/main/java/domain/BlackjackPlayer.java @@ -48,6 +48,6 @@ public BlackjackPoint calculatePoint() { } public String getPlayerName() { - return blackjackPlayerName.getName(); + return blackjackPlayerName.name(); } } diff --git a/src/main/java/domain/BlackjackPlayerName.java b/src/main/java/domain/BlackjackPlayerName.java index f4646af97f4..679fe23e1f8 100644 --- a/src/main/java/domain/BlackjackPlayerName.java +++ b/src/main/java/domain/BlackjackPlayerName.java @@ -4,17 +4,10 @@ import java.util.Objects; -public class BlackjackPlayerName { +public record BlackjackPlayerName(String name) { - private final String name; - - public BlackjackPlayerName(String name) { + public BlackjackPlayerName { this.validateNotEmpty(name); - this.name = name; - } - - public String getName() { - return name; } @Override @@ -25,11 +18,6 @@ public boolean equals(Object o) { return Objects.equals(name, that.name); } - @Override - public int hashCode() { - return Objects.hash(name); - } - private void validateNotEmpty(String name) { if (StringUtils.isEmpty(name)) { throw new IllegalArgumentException("블랙잭 참여자의 이름은 null이거나 공백이면 안됩니다."); diff --git a/src/main/java/domain/BlackjackPlayers.java b/src/main/java/domain/BlackjackPlayers.java index a528067569d..2f3cbc0c5a8 100644 --- a/src/main/java/domain/BlackjackPlayers.java +++ b/src/main/java/domain/BlackjackPlayers.java @@ -26,7 +26,7 @@ public List fetchBlackjackParticipant() { return List.copyOf(this.blackjackPlayers); } - public List getBlackjackPlayers() { + public List fetchBlackjackPlayers() { return List.copyOf(this.blackjackPlayers); } } diff --git a/src/main/java/domain/BlackjackPoint.java b/src/main/java/domain/BlackjackPoint.java index ab59c02ef9b..c7736f3fa97 100644 --- a/src/main/java/domain/BlackjackPoint.java +++ b/src/main/java/domain/BlackjackPoint.java @@ -1,15 +1,11 @@ package domain; -import java.util.Objects; - -public class BlackjackPoint { +public record BlackjackPoint(int point) { private static final int RESULT_POINT_THRESHOLD = 21; - private final int point; - public BlackjackPoint(int point) { + public BlackjackPoint { this.validateLowerThanZero(point); - this.point = point; } public BlackjackPoint sum(BlackjackPoint blackjackPoint) { @@ -31,10 +27,6 @@ public BlackjackPoint fetchCloserPointThreshold(BlackjackPoint blackjackPoint) { return blackjackPoint; } - public int getPoint() { - return point; - } - public boolean isWin(BlackjackPoint blackjackPoint) { return this.fetchDiff() < blackjackPoint.fetchDiff(); } @@ -59,11 +51,6 @@ public boolean equals(Object o) { return point == that.point; } - @Override - public int hashCode() { - return Objects.hash(point); - } - private void validateLowerThanZero(int point) { if (point < 0) { throw new IllegalArgumentException("블랙잭 포인트는 음수일 수 없습니다."); diff --git a/src/main/java/domain/BlackjackWinOrLoseDecider.java b/src/main/java/domain/BlackjackWinOrLoseDecider.java index 85ac032437f..40cc85bcddb 100644 --- a/src/main/java/domain/BlackjackWinOrLoseDecider.java +++ b/src/main/java/domain/BlackjackWinOrLoseDecider.java @@ -27,7 +27,7 @@ public FinalWinOrLose decide() { BlackjackPoint dealerPoint = dealer.calculatePoint(); BlackjackPlayers players = blackjackGame.findPlayers(); - List blackjackPlayers = players.getBlackjackPlayers(); + List blackjackPlayers = players.fetchBlackjackPlayers(); for (BlackjackPlayer blackjackPlayer : blackjackPlayers) { BlackjackPoint playerPoint = blackjackPlayer.calculatePoint(); diff --git a/src/main/java/domain/DealerWinOrLose.java b/src/main/java/domain/DealerWinOrLose.java index c5daaab4162..3a4aa9cb539 100644 --- a/src/main/java/domain/DealerWinOrLose.java +++ b/src/main/java/domain/DealerWinOrLose.java @@ -1,30 +1,9 @@ package domain; -public class DealerWinOrLose { +public record DealerWinOrLose(int winCount, int loseCount, int tieCount) { - private final int winCount; - - private final int loseCount; - - private final int tieCount; - - public DealerWinOrLose(int winCount, int loseCount, int tieCount) { + public DealerWinOrLose { this.validateLowerThanZero(winCount, loseCount, tieCount); - this.winCount = winCount; - this.loseCount = loseCount; - this.tieCount = tieCount; - } - - public int getWinCount() { - return winCount; - } - - public int getLoseCount() { - return loseCount; - } - - public int getTieCount() { - return tieCount; } private void validateLowerThanZero(int winCount, int loseCount, int tieCount) { diff --git a/src/main/java/domain/FinalWinOrLose.java b/src/main/java/domain/FinalWinOrLose.java index 1b9d3274729..d2d5fa6fdee 100644 --- a/src/main/java/domain/FinalWinOrLose.java +++ b/src/main/java/domain/FinalWinOrLose.java @@ -22,7 +22,7 @@ public DealerWinOrLose getDealerWinOrLose() { return dealerWinOrLose; } - public List getPlayerWinOrLose() { + public List fetchPlayerWinOrLose() { return List.copyOf(this.playerWinOrLose); } } diff --git a/src/main/java/domain/HandOutCount.java b/src/main/java/domain/HandOutCount.java index a6d995f6d79..03775eaa3e7 100644 --- a/src/main/java/domain/HandOutCount.java +++ b/src/main/java/domain/HandOutCount.java @@ -1,16 +1,9 @@ package domain; -public class HandOutCount { +public record HandOutCount(int handOutCount) { - private final int handOutCount; - - public HandOutCount(int handOutCount) { + public HandOutCount { this.validateGreaterThanZero(handOutCount); - this.handOutCount = handOutCount; - } - - public int getHandOutCount() { - return this.handOutCount; } private void validateGreaterThanZero(int handOutCount) { diff --git a/src/main/java/domain/PlayerWinOrLose.java b/src/main/java/domain/PlayerWinOrLose.java index 97415986e4b..3942705d784 100644 --- a/src/main/java/domain/PlayerWinOrLose.java +++ b/src/main/java/domain/PlayerWinOrLose.java @@ -12,7 +12,7 @@ public PlayerWinOrLose(BlackjackPlayerName blackjackPlayerName, WinOrLose winOrL } public String fetchPlayerName() { - return this.blackjackPlayerName.getName(); + return this.blackjackPlayerName.name(); } public String fetchWinOrLoseKoreanName() { diff --git a/src/main/java/view/input/dto/HandOutPlayerRequest.java b/src/main/java/view/input/dto/HandOutPlayerRequest.java index 32285eb02e3..91b1ee39a95 100644 --- a/src/main/java/view/input/dto/HandOutPlayerRequest.java +++ b/src/main/java/view/input/dto/HandOutPlayerRequest.java @@ -11,7 +11,7 @@ public HandOutPlayerRequest(String playerName) { } public static HandOutPlayerRequest from(BlackjackPlayerName blackjackPlayerName) { - return new HandOutPlayerRequest(blackjackPlayerName.getName()); + return new HandOutPlayerRequest(blackjackPlayerName.name()); } public String getPlayerName() { diff --git a/src/main/java/view/output/dto/BlackjackResultOutput.java b/src/main/java/view/output/dto/BlackjackResultOutput.java index 659e03ce0eb..f4485a7576c 100644 --- a/src/main/java/view/output/dto/BlackjackResultOutput.java +++ b/src/main/java/view/output/dto/BlackjackResultOutput.java @@ -30,7 +30,7 @@ public static BlackjackResultOutput from(BlackjackParticipant blackjackParticipa participantName = ((BlackjackPlayer) blackjackParticipant).getPlayerName(); } - return new BlackjackResultOutput(participantName, blackjackParticipant.fetchKoreanCardNames(), blackjackParticipant.calculatePoint().getPoint()); + return new BlackjackResultOutput(participantName, blackjackParticipant.fetchKoreanCardNames(), blackjackParticipant.calculatePoint().point()); } public String getParticipantName() { diff --git a/src/main/java/view/output/dto/DealerWinOrLoseOutput.java b/src/main/java/view/output/dto/DealerWinOrLoseOutput.java index 39111a96ed9..e4c84730692 100644 --- a/src/main/java/view/output/dto/DealerWinOrLoseOutput.java +++ b/src/main/java/view/output/dto/DealerWinOrLoseOutput.java @@ -17,7 +17,7 @@ public DealerWinOrLoseOutput(int winCount, int loseCount, int tieCount) { } public static DealerWinOrLoseOutput from(DealerWinOrLose dealerWinOrLose) { - return new DealerWinOrLoseOutput(dealerWinOrLose.getWinCount(), dealerWinOrLose.getLoseCount(), dealerWinOrLose.getTieCount()); + return new DealerWinOrLoseOutput(dealerWinOrLose.winCount(), dealerWinOrLose.loseCount(), dealerWinOrLose.tieCount()); } public int getWinCount() { diff --git a/src/main/java/view/output/dto/FinalWinOrLoseOutput.java b/src/main/java/view/output/dto/FinalWinOrLoseOutput.java index 0e4a1ee04a2..c4e24685a9f 100644 --- a/src/main/java/view/output/dto/FinalWinOrLoseOutput.java +++ b/src/main/java/view/output/dto/FinalWinOrLoseOutput.java @@ -19,7 +19,7 @@ public FinalWinOrLoseOutput(DealerWinOrLoseOutput dealerWinOrLoseOutput, List cardKoreanNames) { } public static HandOutPlayerOutput of(BlackjackPlayerName blackjackPlayerName, BlackjackParticipant blackjackParticipant) { - return new HandOutPlayerOutput(blackjackPlayerName.getName(), blackjackParticipant.fetchKoreanCardNames()); + return new HandOutPlayerOutput(blackjackPlayerName.name(), blackjackParticipant.fetchKoreanCardNames()); } public String getPlayerName() { diff --git a/src/main/java/view/output/dto/InitialHandOutOutput.java b/src/main/java/view/output/dto/InitialHandOutOutput.java index 49ec49f27c9..d2483c52225 100644 --- a/src/main/java/view/output/dto/InitialHandOutOutput.java +++ b/src/main/java/view/output/dto/InitialHandOutOutput.java @@ -19,7 +19,7 @@ public InitialHandOutOutput(int handOutCount, List Date: Sun, 2 Jun 2024 16:15:11 +0900 Subject: [PATCH 12/22] =?UTF-8?q?feat=20:=20ObjectsValidator=20=EC=B6=94?= =?UTF-8?q?=EC=83=81=20=ED=81=B4=EB=9E=98=EC=8A=A4=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 --- src/main/java/domain/validator/ObjectsValidator.java | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/main/java/domain/validator/ObjectsValidator.java b/src/main/java/domain/validator/ObjectsValidator.java index b77b056b6f4..064866bead9 100644 --- a/src/main/java/domain/validator/ObjectsValidator.java +++ b/src/main/java/domain/validator/ObjectsValidator.java @@ -5,7 +5,7 @@ import java.util.stream.Collectors; import java.util.stream.Stream; -public class ObjectsValidator { +public abstract class ObjectsValidator { private static final String NOT_NULL_MESSAGE = "%s는 null값이면 안됩니다."; From 79085064f8253fee1b090d698d2d39c1d1084c5f Mon Sep 17 00:00:00 2001 From: kilian Date: Sun, 2 Jun 2024 16:37:40 +0900 Subject: [PATCH 13/22] =?UTF-8?q?feat=20:=20dto=20record=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 --- .../java/domain/BlackjackGameCreator.java | 1 + .../java/view/output/ConsoleOutputView.java | 18 ++++++------- .../output/dto/BlackjackResultOutput.java | 4 --- .../output/dto/BlackjackResultOutputs.java | 12 +-------- .../output/dto/DealerWinOrLoseOutput.java | 26 +------------------ .../view/output/dto/FinalWinOrLoseOutput.java | 2 +- .../view/output/dto/HandOutDealerOutput.java | 11 +------- .../view/output/dto/InitHandOutOutput.java | 15 ----------- .../dto/InitHandOutParticipantOutput.java | 14 ---------- .../view/output/dto/InitialHandOutOutput.java | 4 +-- .../dto/InitialHandOutParticipantOutput.java | 4 --- .../output/dto/PlayerWinOrLoseOutput.java | 19 +------------- 12 files changed, 17 insertions(+), 113 deletions(-) delete mode 100644 src/main/java/view/output/dto/InitHandOutOutput.java delete mode 100644 src/main/java/view/output/dto/InitHandOutParticipantOutput.java diff --git a/src/main/java/domain/BlackjackGameCreator.java b/src/main/java/domain/BlackjackGameCreator.java index 9997967fd19..7b258b21525 100644 --- a/src/main/java/domain/BlackjackGameCreator.java +++ b/src/main/java/domain/BlackjackGameCreator.java @@ -7,6 +7,7 @@ import java.util.List; public class BlackjackGameCreator { + private final InputView inputView; public BlackjackGameCreator(InputView inputView) { diff --git a/src/main/java/view/output/ConsoleOutputView.java b/src/main/java/view/output/ConsoleOutputView.java index 79c555a8b43..6bb77476e0a 100644 --- a/src/main/java/view/output/ConsoleOutputView.java +++ b/src/main/java/view/output/ConsoleOutputView.java @@ -29,7 +29,7 @@ public void viewInitialHandOut(InitialHandOutOutput initialHandOutOutput) { outputWriter.write(System.lineSeparator()); List initialHandOutParticipantOutput = - initialHandOutOutput.getInitialHandOutParticipantOutput(); + initialHandOutOutput.fetchInitialHandOutParticipantOutput(); for (InitialHandOutParticipantOutput handOutParticipantOutput : initialHandOutParticipantOutput) { outputWriter.writeFormat( @@ -49,13 +49,13 @@ public void viewHandOutPlayer(HandOutPlayerOutput handOutPlayerOutput) { @Override public void viewHandOutDealer(HandOutDealerOutput handOutDealerOutput) { - outputWriter.writeFormat(HAND_OUT_DEALER_NAVIGATION, handOutDealerOutput.getHandOutThreshold()); + outputWriter.writeFormat(HAND_OUT_DEALER_NAVIGATION, handOutDealerOutput.handOutThreshold()); outputWriter.write(System.lineSeparator()); } @Override public void viewBlackjackResult(BlackjackResultOutputs blackjackResultOutput) { - List blackjackResultOutputs = blackjackResultOutput.getBlackjackResultOutputs(); + List blackjackResultOutputs = blackjackResultOutput.blackjackResultOutputs(); blackjackResultOutputs.forEach(output -> { outputWriter.writeFormat( BLACKJACK_RESULT_NAVIGATION, @@ -80,19 +80,19 @@ private void printDealerWinOrLose(FinalWinOrLoseOutput finalWinOrLoseOutput) { DealerWinOrLoseOutput dealerWinOrLoseOutput = finalWinOrLoseOutput.getDealerWinOrLoseOutput(); outputWriter.writeFormat( DEALER_WIN_OR_LOSE_NAVIGATION, - dealerWinOrLoseOutput.getWinCount(), - dealerWinOrLoseOutput.getTieCount(), - dealerWinOrLoseOutput.getLoseCount() + dealerWinOrLoseOutput.winCount(), + dealerWinOrLoseOutput.tieCount(), + dealerWinOrLoseOutput.loseCount() ); } private void printPlayerWinOrLose(FinalWinOrLoseOutput finalWinOrLoseOutput) { - List playerWinOrLoses = finalWinOrLoseOutput.getPlayerWinOrLoses(); + List playerWinOrLoses = finalWinOrLoseOutput.fetchPlayerWinOrLoses(); playerWinOrLoses.forEach(playerWinOrLoseOutput -> { outputWriter.writeFormat( PLAYER_WIN_OR_LOSE_NAVIGATION, - playerWinOrLoseOutput.getPlayerName(), - playerWinOrLoseOutput.getWinOrLose() + playerWinOrLoseOutput.playerName(), + playerWinOrLoseOutput.winOrLose() ); outputWriter.write(System.lineSeparator()); }); diff --git a/src/main/java/view/output/dto/BlackjackResultOutput.java b/src/main/java/view/output/dto/BlackjackResultOutput.java index f4485a7576c..7535617bf87 100644 --- a/src/main/java/view/output/dto/BlackjackResultOutput.java +++ b/src/main/java/view/output/dto/BlackjackResultOutput.java @@ -37,10 +37,6 @@ public String getParticipantName() { return participantName; } - public List getCardKoreanNames() { - return cardKoreanNames; - } - public int getTotalPoint() { return totalPoint; } diff --git a/src/main/java/view/output/dto/BlackjackResultOutputs.java b/src/main/java/view/output/dto/BlackjackResultOutputs.java index da7c340393e..6a2d761f0e9 100644 --- a/src/main/java/view/output/dto/BlackjackResultOutputs.java +++ b/src/main/java/view/output/dto/BlackjackResultOutputs.java @@ -5,13 +5,7 @@ import java.util.List; import java.util.stream.Collectors; -public class BlackjackResultOutputs { - - private final List blackjackResultOutputs; - - public BlackjackResultOutputs(List blackjackResultOutputs) { - this.blackjackResultOutputs = blackjackResultOutputs; - } +public record BlackjackResultOutputs(List blackjackResultOutputs) { public static BlackjackResultOutputs from(BlackjackGame blackjackGame) { return new BlackjackResultOutputs( @@ -20,8 +14,4 @@ public static BlackjackResultOutputs from(BlackjackGame blackjackGame) { .collect(Collectors.toList()) ); } - - public List getBlackjackResultOutputs() { - return blackjackResultOutputs; - } } diff --git a/src/main/java/view/output/dto/DealerWinOrLoseOutput.java b/src/main/java/view/output/dto/DealerWinOrLoseOutput.java index e4c84730692..8de62ca88b3 100644 --- a/src/main/java/view/output/dto/DealerWinOrLoseOutput.java +++ b/src/main/java/view/output/dto/DealerWinOrLoseOutput.java @@ -2,33 +2,9 @@ import domain.DealerWinOrLose; -public class DealerWinOrLoseOutput { - - private final int winCount; - - private final int loseCount; - - private final int tieCount; - - public DealerWinOrLoseOutput(int winCount, int loseCount, int tieCount) { - this.winCount = winCount; - this.loseCount = loseCount; - this.tieCount = tieCount; - } +public record DealerWinOrLoseOutput(int winCount, int loseCount, int tieCount) { public static DealerWinOrLoseOutput from(DealerWinOrLose dealerWinOrLose) { return new DealerWinOrLoseOutput(dealerWinOrLose.winCount(), dealerWinOrLose.loseCount(), dealerWinOrLose.tieCount()); } - - public int getWinCount() { - return winCount; - } - - public int getLoseCount() { - return loseCount; - } - - public int getTieCount() { - return tieCount; - } } diff --git a/src/main/java/view/output/dto/FinalWinOrLoseOutput.java b/src/main/java/view/output/dto/FinalWinOrLoseOutput.java index c4e24685a9f..896e90daaba 100644 --- a/src/main/java/view/output/dto/FinalWinOrLoseOutput.java +++ b/src/main/java/view/output/dto/FinalWinOrLoseOutput.java @@ -29,7 +29,7 @@ public DealerWinOrLoseOutput getDealerWinOrLoseOutput() { return dealerWinOrLoseOutput; } - public List getPlayerWinOrLoses() { + public List fetchPlayerWinOrLoses() { return List.copyOf(this.playerWinOrLoses); } } diff --git a/src/main/java/view/output/dto/HandOutDealerOutput.java b/src/main/java/view/output/dto/HandOutDealerOutput.java index d2ecdd3ecdb..cda062c06d4 100644 --- a/src/main/java/view/output/dto/HandOutDealerOutput.java +++ b/src/main/java/view/output/dto/HandOutDealerOutput.java @@ -1,14 +1,5 @@ package view.output.dto; -public class HandOutDealerOutput { +public record HandOutDealerOutput(int handOutThreshold) { - private final int handOutThreshold; - - public HandOutDealerOutput(int handOutThreshold) { - this.handOutThreshold = handOutThreshold; - } - - public int getHandOutThreshold() { - return handOutThreshold; - } } diff --git a/src/main/java/view/output/dto/InitHandOutOutput.java b/src/main/java/view/output/dto/InitHandOutOutput.java deleted file mode 100644 index 79270e47a06..00000000000 --- a/src/main/java/view/output/dto/InitHandOutOutput.java +++ /dev/null @@ -1,15 +0,0 @@ -package view.output.dto; - -import java.util.List; - -public class InitHandOutOutput { - - private final int handOutCardsCount; - - private final List initHandOutParticipantOutputs; - - public InitHandOutOutput(int handOutCardsCount, List initHandOutParticipantOutputs) { - this.handOutCardsCount = handOutCardsCount; - this.initHandOutParticipantOutputs = initHandOutParticipantOutputs; - } -} diff --git a/src/main/java/view/output/dto/InitHandOutParticipantOutput.java b/src/main/java/view/output/dto/InitHandOutParticipantOutput.java deleted file mode 100644 index 6cd44d79ac5..00000000000 --- a/src/main/java/view/output/dto/InitHandOutParticipantOutput.java +++ /dev/null @@ -1,14 +0,0 @@ -package view.output.dto; - -import java.util.List; - -public class InitHandOutParticipantOutput { - - private final String participantName; - private final List cards; - - public InitHandOutParticipantOutput(String participantName, List cards) { - this.participantName = participantName; - this.cards = cards; - } -} diff --git a/src/main/java/view/output/dto/InitialHandOutOutput.java b/src/main/java/view/output/dto/InitialHandOutOutput.java index d2483c52225..fd2e0d0660e 100644 --- a/src/main/java/view/output/dto/InitialHandOutOutput.java +++ b/src/main/java/view/output/dto/InitialHandOutOutput.java @@ -30,8 +30,8 @@ public int getHandOutCount() { return handOutCount; } - public List getInitialHandOutParticipantOutput() { - return initialHandOutParticipantOutput; + public List fetchInitialHandOutParticipantOutput() { + return List.copyOf(this.initialHandOutParticipantOutput); } public String fetchJoinedPlayerNames() { diff --git a/src/main/java/view/output/dto/InitialHandOutParticipantOutput.java b/src/main/java/view/output/dto/InitialHandOutParticipantOutput.java index bf944544d5f..e8ae833dd42 100644 --- a/src/main/java/view/output/dto/InitialHandOutParticipantOutput.java +++ b/src/main/java/view/output/dto/InitialHandOutParticipantOutput.java @@ -44,10 +44,6 @@ public String getParticipantName() { return participantName; } - public List getCards() { - return cards; - } - public boolean isPlayer() { return player; } diff --git a/src/main/java/view/output/dto/PlayerWinOrLoseOutput.java b/src/main/java/view/output/dto/PlayerWinOrLoseOutput.java index 03ad1ea5c86..94c41a3e42a 100644 --- a/src/main/java/view/output/dto/PlayerWinOrLoseOutput.java +++ b/src/main/java/view/output/dto/PlayerWinOrLoseOutput.java @@ -2,26 +2,9 @@ import domain.PlayerWinOrLose; -public class PlayerWinOrLoseOutput { - - private final String playerName; - - private final String winOrLose; - - public PlayerWinOrLoseOutput(String playerName, String winOrLose) { - this.playerName = playerName; - this.winOrLose = winOrLose; - } +public record PlayerWinOrLoseOutput(String playerName, String winOrLose) { public static PlayerWinOrLoseOutput from(PlayerWinOrLose playerWinOrLose) { return new PlayerWinOrLoseOutput(playerWinOrLose.fetchPlayerName(), playerWinOrLose.fetchWinOrLoseKoreanName()); } - - public String getPlayerName() { - return playerName; - } - - public String getWinOrLose() { - return winOrLose; - } } From d2ac4f337d781451ed36bec1d9ae14abb4c5e51b Mon Sep 17 00:00:00 2001 From: kilian Date: Sun, 2 Jun 2024 17:14:55 +0900 Subject: [PATCH 14/22] =?UTF-8?q?feat=20:=20ObjectsValidatorTest=20hasNull?= =?UTF-8?q?=20=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/main/java/domain/BlackjackSimulator.java | 10 +++--- src/main/java/util/ObjectUtils.java | 9 +++-- .../java/domain/BlackjackGameCreatorTest.java | 5 +++ .../validator/ObjectsValidatorTest.java | 35 +++++++++++++++++++ 4 files changed, 52 insertions(+), 7 deletions(-) create mode 100644 src/test/java/domain/BlackjackGameCreatorTest.java create mode 100644 src/test/java/domain/validator/ObjectsValidatorTest.java diff --git a/src/main/java/domain/BlackjackSimulator.java b/src/main/java/domain/BlackjackSimulator.java index 6183fb25ce1..401ed7f35eb 100644 --- a/src/main/java/domain/BlackjackSimulator.java +++ b/src/main/java/domain/BlackjackSimulator.java @@ -9,6 +9,8 @@ public class BlackjackSimulator { + private static final int INITIAL_HANDOUT_COUNT = 2; + private final InputView inputView; private final OutputView outputView; @@ -25,8 +27,8 @@ public BlackjackGame createNotPlayedGame() { } public BlackjackGame InitialHandOutGame(BlackjackGame blackjackGame) { - HandOutCount handOutCount = new HandOutCount(2); - BlackjackInitialHandOuter blackjackInitialHandOuter = new BlackjackInitialHandOuter(blackjackGame, new HandOutCount(2)); + HandOutCount handOutCount = new HandOutCount(INITIAL_HANDOUT_COUNT); + BlackjackHandOuter blackjackInitialHandOuter = new BlackjackInitialHandOuter(blackjackGame, handOutCount); BlackjackGame initialHandOutGame = blackjackInitialHandOuter.handOut(); outputView.viewInitialHandOut(InitialHandOutOutput.of(handOutCount, initialHandOutGame)); @@ -34,12 +36,12 @@ public BlackjackGame InitialHandOutGame(BlackjackGame blackjackGame) { } public BlackjackGame handOutPlayers(BlackjackGame blackjackGame) { - BlackjackPlayersHandOuter blackjackPlayersHandOuter = new BlackjackPlayersHandOuter(blackjackGame, inputView, outputView); + BlackjackHandOuter blackjackPlayersHandOuter = new BlackjackPlayersHandOuter(blackjackGame, inputView, outputView); return blackjackPlayersHandOuter.handOut(); } public BlackjackGame handOutDealer(BlackjackGame blackjackGame) { - BlackjackDealerHandOuter blackjackDealerHandOuter = new BlackjackDealerHandOuter(blackjackGame, outputView); + BlackjackHandOuter blackjackDealerHandOuter = new BlackjackDealerHandOuter(blackjackGame, outputView); BlackjackGame dealerHandOutGame = blackjackDealerHandOuter.handOut(); outputView.viewBlackjackResult(BlackjackResultOutputs.from(dealerHandOutGame)); diff --git a/src/main/java/util/ObjectUtils.java b/src/main/java/util/ObjectUtils.java index a5dc09b9958..320cec85899 100644 --- a/src/main/java/util/ObjectUtils.java +++ b/src/main/java/util/ObjectUtils.java @@ -1,14 +1,17 @@ package util; +import java.util.Arrays; import java.util.List; import java.util.Objects; -import java.util.stream.Stream; public abstract class ObjectUtils { public static boolean hasNull(Object... args) { - List argsList = Stream.of(args).toList(); + return Objects.isNull(args) || + (!CollectionUtils.isEmpty(toList(args)) && toList(args).stream().anyMatch(Objects::isNull)); + } - return !CollectionUtils.isEmpty(argsList) && argsList.stream().anyMatch(Objects::isNull); + private static List toList(Object... args) { + return Arrays.stream(args).toList(); } } diff --git a/src/test/java/domain/BlackjackGameCreatorTest.java b/src/test/java/domain/BlackjackGameCreatorTest.java new file mode 100644 index 00000000000..429e2ea0041 --- /dev/null +++ b/src/test/java/domain/BlackjackGameCreatorTest.java @@ -0,0 +1,5 @@ +package domain; + +class BlackjackGameCreatorTest { + +} \ No newline at end of file diff --git a/src/test/java/domain/validator/ObjectsValidatorTest.java b/src/test/java/domain/validator/ObjectsValidatorTest.java new file mode 100644 index 00000000000..945871af5ff --- /dev/null +++ b/src/test/java/domain/validator/ObjectsValidatorTest.java @@ -0,0 +1,35 @@ +package domain.validator; + +import org.junit.jupiter.params.ParameterizedTest; +import org.junit.jupiter.params.provider.Arguments; +import org.junit.jupiter.params.provider.MethodSource; +import util.ObjectUtils; + +import java.util.stream.Stream; + +import static org.junit.jupiter.api.Assertions.assertFalse; +import static org.junit.jupiter.api.Assertions.assertTrue; + +class ObjectsValidatorTest { + + static Stream nullValuesParameter() { + return Stream.of( + Arguments.of(new Object[]{null}, true), + Arguments.of(new Object[]{1, 2, 3, null}, true), + Arguments.of(new Object[]{1, 2, 3}, false), + Arguments.of(new Object[]{}, false), + Arguments.of(null, true) + ); + } + + @ParameterizedTest + @MethodSource("nullValuesParameter") + void hasNull(Object[] input, boolean expected) { + boolean result = ObjectUtils.hasNull(input); + if (expected) { + assertTrue(result); + } else { + assertFalse(result); + } + } +} \ No newline at end of file From 2b9c7960275005beeaac1e06ec2fd4e2e9d909fb Mon Sep 17 00:00:00 2001 From: kilian Date: Sun, 2 Jun 2024 17:36:23 +0900 Subject: [PATCH 15/22] =?UTF-8?q?feat=20:=20BlackjackGameCreatorTest=20?= =?UTF-8?q?=EC=83=9D=EC=84=B1?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../java/domain/BlackjackGameCreatorTest.java | 64 +++++++++++++++++++ 1 file changed, 64 insertions(+) diff --git a/src/test/java/domain/BlackjackGameCreatorTest.java b/src/test/java/domain/BlackjackGameCreatorTest.java index 429e2ea0041..e3cee2ab9f7 100644 --- a/src/test/java/domain/BlackjackGameCreatorTest.java +++ b/src/test/java/domain/BlackjackGameCreatorTest.java @@ -1,5 +1,69 @@ package domain; +import org.junit.jupiter.api.DisplayName; +import org.junit.jupiter.params.ParameterizedTest; +import org.junit.jupiter.params.provider.Arguments; +import org.junit.jupiter.params.provider.MethodSource; +import view.input.InputView; +import view.input.dto.HandOutPlayerInput; +import view.input.dto.HandOutPlayerRequest; +import view.input.dto.PlayersInput; + +import java.util.List; +import java.util.stream.Stream; + +import static org.junit.jupiter.api.Assertions.assertTrue; + class BlackjackGameCreatorTest { + static Stream playerNamesParameter() { + return Stream.of( + Arguments.arguments("pobi,jason"), + Arguments.arguments("pobi, jason") + ); + } + + @ParameterizedTest + @MethodSource(value = "playerNamesParameter") + @DisplayName("플레이어 이름 입력을 받으면 입력한 플레이어들이 참여하는 blackjackGame이 생성된다") + void createTest(String playerNamesInput) { + FakeInputView fakeInputView = new FakeInputView(playerNamesInput); + + BlackjackGameCreator blackjackGameCreator = new BlackjackGameCreator(fakeInputView); + BlackjackGame blackjackGame = blackjackGameCreator.create(); + + BlackjackPlayers players = blackjackGame.findPlayers(); + List blackjackPlayers = players.fetchBlackjackPlayers(); + + for (BlackjackPlayer blackjackPlayer : blackjackPlayers) { + String playerName = blackjackPlayer.getPlayerName(); + + assertTrue(playerNamesInput.contains(playerName)); + } + } + + + static class FakeInputView implements InputView { + + private final String playerNameInput; + + public FakeInputView(String playerNameInput) { + this.playerNameInput = playerNameInput; + } + + @Override + public PlayersInput viewPlayers() { + return PlayersInput.from(playerNameInput); + } + + @Override + public HandOutPlayerInput viewHandOutCardForPlayer(HandOutPlayerRequest handOutPlayerRequest) { + return null; + } + + @Override + public void viewThresholdCard() { + + } + } } \ No newline at end of file From 9c36d0e81222cb199ce4a0a3a957f6a5164979bf Mon Sep 17 00:00:00 2001 From: kilian Date: Sun, 2 Jun 2024 17:59:49 +0900 Subject: [PATCH 16/22] =?UTF-8?q?feat=20:=20PlayersInput.java=20=EC=82=AC?= =?UTF-8?q?=EC=9A=A9=EC=9E=90=20=EC=9E=85=EB=A0=A5=20=ED=8C=A8=ED=84=B4=20?= =?UTF-8?q?=ED=85=8C=EC=8A=A4=ED=8A=B8?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- src/main/java/util/PatternUtils.java | 10 +++++++ src/main/java/util/StringUtils.java | 4 +-- .../java/view/input/dto/PlayersInput.java | 16 ++++++++++- .../java/domain/BlackjackGameCreatorTest.java | 5 +++- .../java/view/input/dto/PlayersInputTest.java | 27 +++++++++++++++++++ 5 files changed, 58 insertions(+), 4 deletions(-) create mode 100644 src/main/java/util/PatternUtils.java create mode 100644 src/test/java/view/input/dto/PlayersInputTest.java diff --git a/src/main/java/util/PatternUtils.java b/src/main/java/util/PatternUtils.java new file mode 100644 index 00000000000..546b362e36d --- /dev/null +++ b/src/main/java/util/PatternUtils.java @@ -0,0 +1,10 @@ +package util; + +import java.util.Objects; + +public abstract class PatternUtils { + + public static boolean matches(String regex, String str) { + return Objects.nonNull(str) && str.matches(regex); + } +} diff --git a/src/main/java/util/StringUtils.java b/src/main/java/util/StringUtils.java index e656057dcb4..540dd3e0cfb 100644 --- a/src/main/java/util/StringUtils.java +++ b/src/main/java/util/StringUtils.java @@ -10,11 +10,11 @@ public static boolean isEmpty(String str) { return Objects.isNull(str) || str.isEmpty(); } - public static String trim(String str) { + public static String removeWhiteSpace(String str) { if (Objects.isNull(str)) { return EMPTY_STRING; } - return str.trim(); + return str.replace(" ", ""); } } diff --git a/src/main/java/view/input/dto/PlayersInput.java b/src/main/java/view/input/dto/PlayersInput.java index 732ce122f74..cb50a85be00 100644 --- a/src/main/java/view/input/dto/PlayersInput.java +++ b/src/main/java/view/input/dto/PlayersInput.java @@ -2,6 +2,7 @@ import domain.BlackjackPlayerName; import util.CollectionUtils; +import util.PatternUtils; import util.StringUtils; import java.util.Arrays; @@ -10,6 +11,8 @@ public class PlayersInput { + private static final String USER_INPUT_PATTERN = "^[a-zA-Z]+(\\s*,\\s*[a-zA-Z]+)*$"; + private final List playerNames; private PlayersInput(List playerNames) { @@ -18,7 +21,18 @@ private PlayersInput(List playerNames) { } public static PlayersInput from(String input) { - return new PlayersInput(Arrays.stream(StringUtils.trim(input).split(",")).collect(Collectors.toList())); + validateMatchesPattern(input); + return new PlayersInput(Arrays.stream(StringUtils.removeWhiteSpace(input).split(",")).collect(Collectors.toList())); + } + + private static void validateMatchesPattern(String input) { + if (!PatternUtils.matches(USER_INPUT_PATTERN, input)) { + throw new IllegalArgumentException("사용자 입력이 올바르지 않습니다."); + } + } + + public List getPlayerNames() { + return playerNames; } private void validateIsEmpty(List playerNames) { diff --git a/src/test/java/domain/BlackjackGameCreatorTest.java b/src/test/java/domain/BlackjackGameCreatorTest.java index e3cee2ab9f7..c2e97117a14 100644 --- a/src/test/java/domain/BlackjackGameCreatorTest.java +++ b/src/test/java/domain/BlackjackGameCreatorTest.java @@ -12,6 +12,7 @@ import java.util.List; import java.util.stream.Stream; +import static org.junit.jupiter.api.Assertions.assertEquals; import static org.junit.jupiter.api.Assertions.assertTrue; class BlackjackGameCreatorTest { @@ -27,7 +28,7 @@ static Stream playerNamesParameter() { @MethodSource(value = "playerNamesParameter") @DisplayName("플레이어 이름 입력을 받으면 입력한 플레이어들이 참여하는 blackjackGame이 생성된다") void createTest(String playerNamesInput) { - FakeInputView fakeInputView = new FakeInputView(playerNamesInput); + InputView fakeInputView = new FakeInputView(playerNamesInput); BlackjackGameCreator blackjackGameCreator = new BlackjackGameCreator(fakeInputView); BlackjackGame blackjackGame = blackjackGameCreator.create(); @@ -35,11 +36,13 @@ void createTest(String playerNamesInput) { BlackjackPlayers players = blackjackGame.findPlayers(); List blackjackPlayers = players.fetchBlackjackPlayers(); + assertEquals(blackjackPlayers.size(), playerNamesInput.split(",").length); for (BlackjackPlayer blackjackPlayer : blackjackPlayers) { String playerName = blackjackPlayer.getPlayerName(); assertTrue(playerNamesInput.contains(playerName)); } + } diff --git a/src/test/java/view/input/dto/PlayersInputTest.java b/src/test/java/view/input/dto/PlayersInputTest.java new file mode 100644 index 00000000000..9178bc4dd2f --- /dev/null +++ b/src/test/java/view/input/dto/PlayersInputTest.java @@ -0,0 +1,27 @@ +package view.input.dto; + +import org.junit.jupiter.api.Assertions; +import org.junit.jupiter.api.DisplayName; +import org.junit.jupiter.params.ParameterizedTest; +import org.junit.jupiter.params.provider.Arguments; +import org.junit.jupiter.params.provider.MethodSource; + +import java.util.stream.Stream; + +class PlayersInputTest { + + static Stream userInputParameter() { + return Stream.of( + Arguments.arguments("pobi//jason"), + Arguments.arguments("pobi-jason"), + Arguments.arguments("pobi;jason") + ); + } + + @ParameterizedTest + @MethodSource("userInputParameter") + @DisplayName("사용자 입력이 pobi,jason같은 형태가 아니면 IllegalArgumentException이 발생한다.") + void test_validate_user_input_pattern(String input) { + Assertions.assertThrows(IllegalArgumentException.class, () -> PlayersInput.from(input)); + } +} \ No newline at end of file From 4690cecb4bfdb261225cb482da527d8e4b0ad76d Mon Sep 17 00:00:00 2001 From: kilian Date: Sun, 2 Jun 2024 18:19:11 +0900 Subject: [PATCH 17/22] =?UTF-8?q?test=20:=20BlackjackInitialHandOuter=20ha?= =?UTF-8?q?ndOut=20=ED=85=8C=EC=8A=A4=ED=8A=B8?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- src/main/java/domain/BlackjackDealer.java | 5 ++ .../java/domain/BlackjackParticipant.java | 2 + src/main/java/domain/BlackjackPlayer.java | 5 ++ .../domain/BlackjackInitialHandOuterTest.java | 49 +++++++++++++++++++ 4 files changed, 61 insertions(+) create mode 100644 src/test/java/domain/BlackjackInitialHandOuterTest.java diff --git a/src/main/java/domain/BlackjackDealer.java b/src/main/java/domain/BlackjackDealer.java index ac8d9bee650..8b4970f124a 100644 --- a/src/main/java/domain/BlackjackDealer.java +++ b/src/main/java/domain/BlackjackDealer.java @@ -45,4 +45,9 @@ public BlackjackPoint calculatePoint() { return minBlackjackPoint.fetchCloserPointThreshold(maxBlackjackPoint); } + + @Override + public int fetchCardSize() { + return this.trumpCards.size(); + } } diff --git a/src/main/java/domain/BlackjackParticipant.java b/src/main/java/domain/BlackjackParticipant.java index aa20f554ee3..bf28468023b 100644 --- a/src/main/java/domain/BlackjackParticipant.java +++ b/src/main/java/domain/BlackjackParticipant.java @@ -13,4 +13,6 @@ public interface BlackjackParticipant { boolean isPlayer(); BlackjackPoint calculatePoint(); + + int fetchCardSize(); } diff --git a/src/main/java/domain/BlackjackPlayer.java b/src/main/java/domain/BlackjackPlayer.java index 98d91db31aa..84c349c236f 100644 --- a/src/main/java/domain/BlackjackPlayer.java +++ b/src/main/java/domain/BlackjackPlayer.java @@ -47,6 +47,11 @@ public BlackjackPoint calculatePoint() { return minBlackjackPoint.fetchCloserPointThreshold(maxBlackjackPoint); } + @Override + public int fetchCardSize() { + return this.trumpCards.size(); + } + public String getPlayerName() { return blackjackPlayerName.name(); } diff --git a/src/test/java/domain/BlackjackInitialHandOuterTest.java b/src/test/java/domain/BlackjackInitialHandOuterTest.java new file mode 100644 index 00000000000..3d5c9bed804 --- /dev/null +++ b/src/test/java/domain/BlackjackInitialHandOuterTest.java @@ -0,0 +1,49 @@ +package domain; + +import org.assertj.core.api.Assertions; +import org.junit.jupiter.api.Test; +import view.input.InputView; +import view.input.dto.HandOutPlayerInput; +import view.input.dto.HandOutPlayerRequest; +import view.input.dto.PlayersInput; + +import java.util.List; + +class BlackjackInitialHandOuterTest { + + @Test + void handOut() { + BlackjackGameCreator blackjackGameCreator = new BlackjackGameCreator(new FakeInputView("pobi, jason")); + BlackjackGame blackjackGame = blackjackGameCreator.create(); + + BlackjackInitialHandOuter blackjackInitialHandOuter = new BlackjackInitialHandOuter(blackjackGame, new HandOutCount(2)); + BlackjackGame handOutGame = blackjackInitialHandOuter.handOut(); + + List participants = handOutGame.fetchBlackjackParticipants(); + Assertions.assertThat(participants).map(BlackjackParticipant::fetchCardSize).allMatch(size -> size == 2); + } + + static class FakeInputView implements InputView { + + private final String playerNameInput; + + public FakeInputView(String playerNameInput) { + this.playerNameInput = playerNameInput; + } + + @Override + public PlayersInput viewPlayers() { + return PlayersInput.from(playerNameInput); + } + + @Override + public HandOutPlayerInput viewHandOutCardForPlayer(HandOutPlayerRequest handOutPlayerRequest) { + return null; + } + + @Override + public void viewThresholdCard() { + + } + } +} \ No newline at end of file From 518abb0f69b8c1e3c4710379964562c0d2139f9f Mon Sep 17 00:00:00 2001 From: kilian Date: Sun, 2 Jun 2024 18:38:22 +0900 Subject: [PATCH 18/22] =?UTF-8?q?test=20:=20BlackjackPlayersHandOuter=20ha?= =?UTF-8?q?ndOut=20=ED=85=8C=EC=8A=A4=ED=8A=B8?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- src/main/java/domain/TrumpCardDeck.java | 4 + .../domain/BlackjackInitialHandOuterTest.java | 9 +- .../domain/BlackjackPlayersHandOuterTest.java | 100 ++++++++++++++++++ 3 files changed, 112 insertions(+), 1 deletion(-) create mode 100644 src/test/java/domain/BlackjackPlayersHandOuterTest.java diff --git a/src/main/java/domain/TrumpCardDeck.java b/src/main/java/domain/TrumpCardDeck.java index c90a1d82b7f..812ff4914b0 100644 --- a/src/main/java/domain/TrumpCardDeck.java +++ b/src/main/java/domain/TrumpCardDeck.java @@ -24,4 +24,8 @@ public TrumpCardDeck takeOutTopOne() { this.trumpCards.takeOutTopOne() ); } + + public int size() { + return this.trumpCards.size(); + } } diff --git a/src/test/java/domain/BlackjackInitialHandOuterTest.java b/src/test/java/domain/BlackjackInitialHandOuterTest.java index 3d5c9bed804..35d02f96580 100644 --- a/src/test/java/domain/BlackjackInitialHandOuterTest.java +++ b/src/test/java/domain/BlackjackInitialHandOuterTest.java @@ -9,6 +9,8 @@ import java.util.List; +import static org.junit.jupiter.api.Assertions.assertAll; + class BlackjackInitialHandOuterTest { @Test @@ -20,7 +22,12 @@ void handOut() { BlackjackGame handOutGame = blackjackInitialHandOuter.handOut(); List participants = handOutGame.fetchBlackjackParticipants(); - Assertions.assertThat(participants).map(BlackjackParticipant::fetchCardSize).allMatch(size -> size == 2); + TrumpCardDeck trumpCardDeck = handOutGame.getTrumpCardDeck(); + + assertAll( + () -> Assertions.assertThat(trumpCardDeck.size()).isEqualTo(46), + () -> Assertions.assertThat(participants).map(BlackjackParticipant::fetchCardSize).allMatch(size -> size == 2) + ); } static class FakeInputView implements InputView { diff --git a/src/test/java/domain/BlackjackPlayersHandOuterTest.java b/src/test/java/domain/BlackjackPlayersHandOuterTest.java new file mode 100644 index 00000000000..05717999f51 --- /dev/null +++ b/src/test/java/domain/BlackjackPlayersHandOuterTest.java @@ -0,0 +1,100 @@ +package domain; + +import org.assertj.core.api.Assertions; +import org.junit.jupiter.api.Test; +import view.input.InputView; +import view.input.dto.HandOutPlayerInput; +import view.input.dto.HandOutPlayerRequest; +import view.input.dto.PlayersInput; +import view.output.OutputView; +import view.output.dto.*; + +import java.util.List; + +import static org.junit.jupiter.api.Assertions.assertAll; + +class BlackjackPlayersHandOuterTest { + + @Test + void handOut() { + BlackjackGameCreator blackjackGameCreator = new BlackjackGameCreator(new BlackjackInitialHandOuterTest.FakeInputView("pobi, jason")); + BlackjackGame blackjackGame = blackjackGameCreator.create(); + + BlackjackPlayersHandOuter blackjackPlayersHandOuter = + new BlackjackPlayersHandOuter(blackjackGame, new FakeInputView("pobi,jason"), new FakeOutputView()); + + BlackjackGame handOutGame = blackjackPlayersHandOuter.handOut(); + TrumpCardDeck trumpCardDeck = handOutGame.getTrumpCardDeck(); + List blackjackPlayers = handOutGame.fetchBlackjackPlayers(); + + assertAll( + () -> Assertions.assertThat(trumpCardDeck.size()).isEqualTo(50), + () -> Assertions.assertThat(blackjackPlayers).map(BlackjackPlayer::fetchCardSize).allMatch(size -> size == 1) + ); + } + + static class FakeInputView implements InputView { + + private final String playerNameInput; + private int count = 0; + + public FakeInputView(String playerNameInput) { + this.playerNameInput = playerNameInput; + } + + @Override + public PlayersInput viewPlayers() { + return PlayersInput.from(playerNameInput); + } + + @Override + public HandOutPlayerInput viewHandOutCardForPlayer(HandOutPlayerRequest handOutPlayerRequest) { + + if (count % 2 == 0) { + count++; + return new HandOutPlayerInput(true); + } + + if (count % 2 == 1) { + count++; + return new HandOutPlayerInput(false); + } + + return null; + } + + @Override + public void viewThresholdCard() { + + } + } + + static class FakeOutputView implements OutputView { + + @Override + public void viewInitialHandOut(InitialHandOutOutput initialHandOutOutput) { + + } + + @Override + public void viewHandOutPlayer(HandOutPlayerOutput handOutPlayerOutput) { + + } + + @Override + public void viewHandOutDealer(HandOutDealerOutput handOutDealerOutput) { + + } + + @Override + public void viewBlackjackResult(BlackjackResultOutputs blackjackResultOutput) { + + } + + @Override + public void viewFinalWinOrLose(FinalWinOrLoseOutput finalWinOrLoseOutput) { + + } + } + +} \ No newline at end of file From 65a16615e0e3794955bf2b839069669ad9d1edc3 Mon Sep 17 00:00:00 2001 From: kilian Date: Sun, 2 Jun 2024 19:03:15 +0900 Subject: [PATCH 19/22] =?UTF-8?q?test=20:=20BlackjackDealerHandOuter=20han?= =?UTF-8?q?dOut=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 --- .../domain/BlackjackDealerHandOuterTest.java | 93 +++++++++++++++++++ 1 file changed, 93 insertions(+) create mode 100644 src/test/java/domain/BlackjackDealerHandOuterTest.java diff --git a/src/test/java/domain/BlackjackDealerHandOuterTest.java b/src/test/java/domain/BlackjackDealerHandOuterTest.java new file mode 100644 index 00000000000..82d9acc9516 --- /dev/null +++ b/src/test/java/domain/BlackjackDealerHandOuterTest.java @@ -0,0 +1,93 @@ +package domain; + +import org.junit.jupiter.api.DisplayName; +import org.junit.jupiter.params.ParameterizedTest; +import org.junit.jupiter.params.provider.Arguments; +import org.junit.jupiter.params.provider.MethodSource; +import view.output.OutputView; +import view.output.dto.*; + +import java.util.List; +import java.util.stream.Stream; + +import static org.junit.jupiter.api.Assertions.assertAll; +import static org.junit.jupiter.api.Assertions.assertEquals; + +class BlackjackDealerHandOuterTest { + + static Stream blackjackDealerParameter() { + return Stream.of( + Arguments.arguments( + new BlackjackDealer( + new TrumpCards( + List.of( + new TrumpCard(TrumpCardRank.JACK, TrumpCardSuit.DIAMONDS), + new TrumpCard(TrumpCardRank.SEVEN, TrumpCardSuit.DIAMONDS) + ) + ) + ), 2, 52 + ), + Arguments.arguments( + new BlackjackDealer( + new TrumpCards( + List.of( + new TrumpCard(TrumpCardRank.JACK, TrumpCardSuit.DIAMONDS), + new TrumpCard(TrumpCardRank.SIX, TrumpCardSuit.DIAMONDS) + ) + ) + ), 3, 51 + ) + ); + } + + @DisplayName("블랙잭 점수가 임계값보다 작으면 딜러는 한장 받는다.") + @ParameterizedTest + @MethodSource(value = "blackjackDealerParameter") + void handOut(BlackjackDealer blackjackDealer, int expectCardCount, int expectDeckCount) { + BlackjackPlayers blackjackPlayers = new BlackjackPlayers(List.of( + new BlackjackPlayer(new BlackjackPlayerName("pobi"), TrumpCards.createEmptyCards()), + new BlackjackPlayer(new BlackjackPlayerName("jason"), TrumpCards.createEmptyCards()) + ) + ); + + BlackjackGame blackjackGame = + new BlackjackGame(BlackjackParticipants.of(blackjackDealer, blackjackPlayers), new TrumpCardDeck()); + BlackjackDealerHandOuter blackjackDealerHandOuter = new BlackjackDealerHandOuter(blackjackGame, new FakeOutputView()); + BlackjackGame actualBlackjackGame = blackjackDealerHandOuter.handOut(); + + TrumpCardDeck trumpCardDeck = actualBlackjackGame.getTrumpCardDeck(); + BlackjackDealer dealer = actualBlackjackGame.findDealer(); + assertAll( + () -> assertEquals(expectCardCount, dealer.fetchCardSize()), + () -> assertEquals(expectDeckCount, trumpCardDeck.size()) + ); + } + + static class FakeOutputView implements OutputView { + + @Override + public void viewInitialHandOut(InitialHandOutOutput initialHandOutOutput) { + + } + + @Override + public void viewHandOutPlayer(HandOutPlayerOutput handOutPlayerOutput) { + + } + + @Override + public void viewHandOutDealer(HandOutDealerOutput handOutDealerOutput) { + + } + + @Override + public void viewBlackjackResult(BlackjackResultOutputs blackjackResultOutput) { + + } + + @Override + public void viewFinalWinOrLose(FinalWinOrLoseOutput finalWinOrLoseOutput) { + + } + } +} \ No newline at end of file From 2a6ade33536208c8a789540caf3d96a18316e28f Mon Sep 17 00:00:00 2001 From: kilian Date: Sun, 2 Jun 2024 19:42:40 +0900 Subject: [PATCH 20/22] =?UTF-8?q?test=20:=20BlackjackWinOrLoseDeciderTest.?= =?UTF-8?q?java=20decide=20=ED=85=8C=EC=8A=A4=ED=8A=B8?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- src/main/java/domain/FinalWinOrLose.java | 14 ++++ src/main/java/domain/PlayerWinOrLose.java | 15 ++++ .../domain/BlackjackDealerHandOuterTest.java | 11 +-- .../domain/BlackjackWinOrLoseDeciderTest.java | 83 +++++++++++++++++++ 4 files changed, 118 insertions(+), 5 deletions(-) create mode 100644 src/test/java/domain/BlackjackWinOrLoseDeciderTest.java diff --git a/src/main/java/domain/FinalWinOrLose.java b/src/main/java/domain/FinalWinOrLose.java index d2d5fa6fdee..bc9e7dc82c9 100644 --- a/src/main/java/domain/FinalWinOrLose.java +++ b/src/main/java/domain/FinalWinOrLose.java @@ -4,6 +4,7 @@ import domain.validator.ObjectsValidator; import java.util.List; +import java.util.Objects; public class FinalWinOrLose { @@ -25,4 +26,17 @@ public DealerWinOrLose getDealerWinOrLose() { public List fetchPlayerWinOrLose() { return List.copyOf(this.playerWinOrLose); } + + @Override + public boolean equals(Object o) { + if (this == o) return true; + if (o == null || getClass() != o.getClass()) return false; + FinalWinOrLose that = (FinalWinOrLose) o; + return Objects.equals(dealerWinOrLose, that.dealerWinOrLose) && Objects.equals(playerWinOrLose, that.playerWinOrLose); + } + + @Override + public int hashCode() { + return Objects.hash(dealerWinOrLose, playerWinOrLose); + } } diff --git a/src/main/java/domain/PlayerWinOrLose.java b/src/main/java/domain/PlayerWinOrLose.java index 3942705d784..9fe4e801f5c 100644 --- a/src/main/java/domain/PlayerWinOrLose.java +++ b/src/main/java/domain/PlayerWinOrLose.java @@ -1,5 +1,7 @@ package domain; +import java.util.Objects; + public class PlayerWinOrLose { private final BlackjackPlayerName blackjackPlayerName; @@ -18,4 +20,17 @@ public String fetchPlayerName() { public String fetchWinOrLoseKoreanName() { return this.winOrLose.getKoreanName(); } + + @Override + public boolean equals(Object o) { + if (this == o) return true; + if (o == null || getClass() != o.getClass()) return false; + PlayerWinOrLose that = (PlayerWinOrLose) o; + return Objects.equals(blackjackPlayerName, that.blackjackPlayerName) && winOrLose == that.winOrLose; + } + + @Override + public int hashCode() { + return Objects.hash(blackjackPlayerName, winOrLose); + } } diff --git a/src/test/java/domain/BlackjackDealerHandOuterTest.java b/src/test/java/domain/BlackjackDealerHandOuterTest.java index 82d9acc9516..04082d2df5c 100644 --- a/src/test/java/domain/BlackjackDealerHandOuterTest.java +++ b/src/test/java/domain/BlackjackDealerHandOuterTest.java @@ -14,7 +14,7 @@ import static org.junit.jupiter.api.Assertions.assertEquals; class BlackjackDealerHandOuterTest { - + static Stream blackjackDealerParameter() { return Stream.of( Arguments.arguments( @@ -44,10 +44,11 @@ static Stream blackjackDealerParameter() { @ParameterizedTest @MethodSource(value = "blackjackDealerParameter") void handOut(BlackjackDealer blackjackDealer, int expectCardCount, int expectDeckCount) { - BlackjackPlayers blackjackPlayers = new BlackjackPlayers(List.of( - new BlackjackPlayer(new BlackjackPlayerName("pobi"), TrumpCards.createEmptyCards()), - new BlackjackPlayer(new BlackjackPlayerName("jason"), TrumpCards.createEmptyCards()) - ) + BlackjackPlayers blackjackPlayers = new BlackjackPlayers( + List.of( + new BlackjackPlayer(new BlackjackPlayerName("pobi"), TrumpCards.createEmptyCards()), + new BlackjackPlayer(new BlackjackPlayerName("jason"), TrumpCards.createEmptyCards()) + ) ); BlackjackGame blackjackGame = diff --git a/src/test/java/domain/BlackjackWinOrLoseDeciderTest.java b/src/test/java/domain/BlackjackWinOrLoseDeciderTest.java new file mode 100644 index 00000000000..dc6bc20202a --- /dev/null +++ b/src/test/java/domain/BlackjackWinOrLoseDeciderTest.java @@ -0,0 +1,83 @@ +package domain; + +import org.junit.jupiter.api.DisplayName; +import org.junit.jupiter.params.ParameterizedTest; +import org.junit.jupiter.params.provider.Arguments; +import org.junit.jupiter.params.provider.MethodSource; + +import java.util.List; +import java.util.stream.Stream; + +import static org.assertj.core.api.Assertions.assertThat; + +class BlackjackWinOrLoseDeciderTest { + + static Stream blackjackDealerAndPlayersAndWinOrLoseParameters() { + return Stream.of( + Arguments.arguments( + new BlackjackDealer( + new TrumpCards( + List.of( + new TrumpCard(TrumpCardRank.JACK, TrumpCardSuit.DIAMONDS), + new TrumpCard(TrumpCardRank.NINE, TrumpCardSuit.DIAMONDS) + ) + ) + ), + new BlackjackPlayers( + List.of( + new BlackjackPlayer( + new BlackjackPlayerName("pobi"), + new TrumpCards( + List.of( + new TrumpCard(TrumpCardRank.JACK, TrumpCardSuit.CLUBS), + new TrumpCard(TrumpCardRank.SEVEN, TrumpCardSuit.CLUBS) + ) + ) + ) + ) + ), + new FinalWinOrLose(new DealerWinOrLose(1, 0, 0), + List.of(new PlayerWinOrLose(new BlackjackPlayerName("pobi"), WinOrLose.LOSE)) + ) + ), + Arguments.arguments( + new BlackjackDealer( + new TrumpCards( + List.of( + new TrumpCard(TrumpCardRank.JACK, TrumpCardSuit.DIAMONDS), + new TrumpCard(TrumpCardRank.NINE, TrumpCardSuit.DIAMONDS) + ) + ) + ), + new BlackjackPlayers( + List.of( + new BlackjackPlayer( + new BlackjackPlayerName("pobi"), + new TrumpCards( + List.of( + new TrumpCard(TrumpCardRank.JACK, TrumpCardSuit.CLUBS), + new TrumpCard(TrumpCardRank.KING, TrumpCardSuit.CLUBS) + ) + ) + ) + ) + ), + new FinalWinOrLose(new DealerWinOrLose(0, 1, 0), + List.of(new PlayerWinOrLose(new BlackjackPlayerName("pobi"), WinOrLose.WIN)) + ) + ) + ); + } + + @DisplayName("플레이어가 딜러보다 21에 더 가까우면 승리한다.") + @ParameterizedTest + @MethodSource(value = "blackjackDealerAndPlayersAndWinOrLoseParameters") + void decideTest(BlackjackDealer blackjackDealer, BlackjackPlayers blackjackPlayers, FinalWinOrLose finalWinOrLose) { + BlackjackGame blackjackGame = new BlackjackGame(BlackjackParticipants.of(blackjackDealer, blackjackPlayers), new TrumpCardDeck()); + BlackjackWinOrLoseDecider blackjackWinOrLoseDecider = new BlackjackWinOrLoseDecider(blackjackGame); + + FinalWinOrLose actual = blackjackWinOrLoseDecider.decide(); + + assertThat(actual).isEqualTo(finalWinOrLose); + } +} \ No newline at end of file From 30a99c5ab313419220f804b82328c10ef9fff87e Mon Sep 17 00:00:00 2001 From: kilian Date: Sun, 2 Jun 2024 19:55:01 +0900 Subject: [PATCH 21/22] =?UTF-8?q?refactor=20:=20=ED=8C=A8=ED=82=A4?= =?UTF-8?q?=EC=A7=80=20=EC=A0=95=EB=A6=AC?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- README.md | 6 +++--- src/main/java/BlackjackApplication.java | 2 +- .../java/Controller/BlackjackSimulatorRunner.java | 4 ++-- src/main/java/domain/{ => game}/BlackjackGame.java | 4 +++- .../java/domain/{ => game}/BlackjackGameCreator.java | 7 ++++++- .../java/domain/{ => game}/BlackjackSimulator.java | 5 ++++- .../{ => handouter}/BlackjackDealerHandOuter.java | 11 +++++++++-- .../domain/{ => handouter}/BlackjackHandOuter.java | 4 +++- .../{ => handouter}/BlackjackInitialHandOuter.java | 7 ++++++- .../{ => handouter}/BlackjackPlayersHandOuter.java | 11 +++++++++-- .../java/domain/{ => handouter}/HandOutCount.java | 2 +- .../domain/{ => participant}/BlackjackDealer.java | 5 ++++- .../{ => participant}/BlackjackParticipant.java | 5 ++++- .../{ => participant}/BlackjackParticipants.java | 2 +- .../domain/{ => participant}/BlackjackPlayer.java | 5 ++++- .../domain/{ => participant}/BlackjackPlayerName.java | 2 +- .../domain/{ => participant}/BlackjackPlayers.java | 3 ++- src/main/java/domain/{ => trumpcard}/TrumpCard.java | 3 ++- .../java/domain/{ => trumpcard}/TrumpCardDeck.java | 2 +- .../java/domain/{ => trumpcard}/TrumpCardRank.java | 2 +- .../java/domain/{ => trumpcard}/TrumpCardSuit.java | 2 +- src/main/java/domain/{ => trumpcard}/TrumpCards.java | 11 ++--------- src/main/java/domain/{ => trumpcard}/WinOrLose.java | 2 +- .../java/domain/validator/TrumpCardsValidator.java | 2 +- .../java/domain/{ => winorlose}/BlackjackPoint.java | 2 +- .../{ => winorlose}/BlackjackWinOrLoseDecider.java | 8 ++++++-- .../java/domain/{ => winorlose}/DealerWinOrLose.java | 2 +- .../java/domain/{ => winorlose}/FinalWinOrLose.java | 2 +- .../java/domain/{ => winorlose}/PlayerWinOrLose.java | 5 ++++- .../java/view/input/dto/HandOutPlayerRequest.java | 2 +- src/main/java/view/input/dto/PlayersInput.java | 2 +- .../java/view/output/dto/BlackjackResultOutput.java | 4 ++-- .../java/view/output/dto/BlackjackResultOutputs.java | 2 +- .../java/view/output/dto/DealerWinOrLoseOutput.java | 2 +- .../java/view/output/dto/FinalWinOrLoseOutput.java | 2 +- .../java/view/output/dto/HandOutPlayerOutput.java | 4 ++-- .../java/view/output/dto/InitialHandOutOutput.java | 4 ++-- .../output/dto/InitialHandOutParticipantOutput.java | 6 +++--- .../java/view/output/dto/PlayerWinOrLoseOutput.java | 2 +- .../java/domain/BlackjackDealerHandOuterTest.java | 4 ++++ src/test/java/domain/BlackjackGameCreatorTest.java | 4 ++++ .../java/domain/BlackjackInitialHandOuterTest.java | 6 ++++++ .../java/domain/BlackjackPlayersHandOuterTest.java | 5 +++++ .../java/domain/BlackjackWinOrLoseDeciderTest.java | 7 +++++++ 44 files changed, 126 insertions(+), 58 deletions(-) rename src/main/java/domain/{ => game}/BlackjackGame.java (93%) rename src/main/java/domain/{ => game}/BlackjackGameCreator.java (79%) rename src/main/java/domain/{ => game}/BlackjackSimulator.java (94%) rename src/main/java/domain/{ => handouter}/BlackjackDealerHandOuter.java (83%) rename src/main/java/domain/{ => handouter}/BlackjackHandOuter.java (53%) rename src/main/java/domain/{ => handouter}/BlackjackInitialHandOuter.java (87%) rename src/main/java/domain/{ => handouter}/BlackjackPlayersHandOuter.java (87%) rename src/main/java/domain/{ => handouter}/HandOutCount.java (93%) rename src/main/java/domain/{ => participant}/BlackjackDealer.java (90%) rename src/main/java/domain/{ => participant}/BlackjackParticipant.java (73%) rename src/main/java/domain/{ => participant}/BlackjackParticipants.java (98%) rename src/main/java/domain/{ => participant}/BlackjackPlayer.java (91%) rename src/main/java/domain/{ => participant}/BlackjackPlayerName.java (96%) rename src/main/java/domain/{ => participant}/BlackjackPlayers.java (93%) rename src/main/java/domain/{ => trumpcard}/TrumpCard.java (94%) rename src/main/java/domain/{ => trumpcard}/TrumpCardDeck.java (96%) rename src/main/java/domain/{ => trumpcard}/TrumpCardRank.java (97%) rename src/main/java/domain/{ => trumpcard}/TrumpCardSuit.java (92%) rename src/main/java/domain/{ => trumpcard}/TrumpCards.java (92%) rename src/main/java/domain/{ => trumpcard}/WinOrLose.java (91%) rename src/main/java/domain/{ => winorlose}/BlackjackPoint.java (98%) rename src/main/java/domain/{ => winorlose}/BlackjackWinOrLoseDecider.java (87%) rename src/main/java/domain/{ => winorlose}/DealerWinOrLose.java (96%) rename src/main/java/domain/{ => winorlose}/FinalWinOrLose.java (97%) rename src/main/java/domain/{ => winorlose}/PlayerWinOrLose.java (89%) diff --git a/README.md b/README.md index 9b9e1b7ac1a..a053a9f0c8d 100644 --- a/README.md +++ b/README.md @@ -11,6 +11,6 @@ - [x] 게임의 참여할 사람을 입력받는다. - [x] 딜러와 플레이어들이 카드를 나눠 받는다. -- [ ] 딜러와 플레이어들이 추가 카드를 나눠 갖는다. -- [ ] 딜러와 플레이어들의 결과를 출력한다. -- [ ] 최종 결과를 출력한다. \ No newline at end of file +- [x] 딜러와 플레이어들이 추가 카드를 나눠 갖는다. +- [x] 딜러와 플레이어들의 결과를 출력한다. +- [x] 최종 결과를 출력한다. \ No newline at end of file diff --git a/src/main/java/BlackjackApplication.java b/src/main/java/BlackjackApplication.java index 29935e94a6a..14f26c8dde0 100644 --- a/src/main/java/BlackjackApplication.java +++ b/src/main/java/BlackjackApplication.java @@ -1,5 +1,5 @@ import Controller.BlackjackSimulatorRunner; -import domain.BlackjackSimulator; +import domain.game.BlackjackSimulator; import view.input.ConsoleInputReader; import view.input.ConsoleInputView; import view.input.InputReader; diff --git a/src/main/java/Controller/BlackjackSimulatorRunner.java b/src/main/java/Controller/BlackjackSimulatorRunner.java index 7c650270b18..cbd4d6526cb 100644 --- a/src/main/java/Controller/BlackjackSimulatorRunner.java +++ b/src/main/java/Controller/BlackjackSimulatorRunner.java @@ -1,7 +1,7 @@ package Controller; -import domain.BlackjackGame; -import domain.BlackjackSimulator; +import domain.game.BlackjackGame; +import domain.game.BlackjackSimulator; public class BlackjackSimulatorRunner { diff --git a/src/main/java/domain/BlackjackGame.java b/src/main/java/domain/game/BlackjackGame.java similarity index 93% rename from src/main/java/domain/BlackjackGame.java rename to src/main/java/domain/game/BlackjackGame.java index f7f60a91ac4..5e0b204ab05 100644 --- a/src/main/java/domain/BlackjackGame.java +++ b/src/main/java/domain/game/BlackjackGame.java @@ -1,5 +1,7 @@ -package domain; +package domain.game; +import domain.participant.*; +import domain.trumpcard.TrumpCardDeck; import domain.validator.ObjectsValidator; import java.util.List; diff --git a/src/main/java/domain/BlackjackGameCreator.java b/src/main/java/domain/game/BlackjackGameCreator.java similarity index 79% rename from src/main/java/domain/BlackjackGameCreator.java rename to src/main/java/domain/game/BlackjackGameCreator.java index 7b258b21525..3d610c9e467 100644 --- a/src/main/java/domain/BlackjackGameCreator.java +++ b/src/main/java/domain/game/BlackjackGameCreator.java @@ -1,5 +1,10 @@ -package domain; +package domain.game; +import domain.participant.BlackjackDealer; +import domain.participant.BlackjackParticipants; +import domain.participant.BlackjackPlayerName; +import domain.participant.BlackjackPlayers; +import domain.trumpcard.TrumpCardDeck; import domain.validator.ObjectsValidator; import view.input.InputView; import view.input.dto.PlayersInput; diff --git a/src/main/java/domain/BlackjackSimulator.java b/src/main/java/domain/game/BlackjackSimulator.java similarity index 94% rename from src/main/java/domain/BlackjackSimulator.java rename to src/main/java/domain/game/BlackjackSimulator.java index 401ed7f35eb..f1afa544e9b 100644 --- a/src/main/java/domain/BlackjackSimulator.java +++ b/src/main/java/domain/game/BlackjackSimulator.java @@ -1,6 +1,9 @@ -package domain; +package domain.game; +import domain.handouter.*; import domain.validator.ObjectsValidator; +import domain.winorlose.BlackjackWinOrLoseDecider; +import domain.winorlose.FinalWinOrLose; import view.input.InputView; import view.output.OutputView; import view.output.dto.BlackjackResultOutputs; diff --git a/src/main/java/domain/BlackjackDealerHandOuter.java b/src/main/java/domain/handouter/BlackjackDealerHandOuter.java similarity index 83% rename from src/main/java/domain/BlackjackDealerHandOuter.java rename to src/main/java/domain/handouter/BlackjackDealerHandOuter.java index 3b15dadaf98..63287f95386 100644 --- a/src/main/java/domain/BlackjackDealerHandOuter.java +++ b/src/main/java/domain/handouter/BlackjackDealerHandOuter.java @@ -1,6 +1,13 @@ -package domain; - +package domain.handouter; + +import domain.game.BlackjackGame; +import domain.participant.BlackjackDealer; +import domain.participant.BlackjackParticipant; +import domain.participant.BlackjackParticipants; +import domain.trumpcard.TrumpCard; +import domain.trumpcard.TrumpCardDeck; import domain.validator.ObjectsValidator; +import domain.winorlose.BlackjackPoint; import view.output.OutputView; import view.output.dto.HandOutDealerOutput; diff --git a/src/main/java/domain/BlackjackHandOuter.java b/src/main/java/domain/handouter/BlackjackHandOuter.java similarity index 53% rename from src/main/java/domain/BlackjackHandOuter.java rename to src/main/java/domain/handouter/BlackjackHandOuter.java index e2788be7cca..8eb351143f1 100644 --- a/src/main/java/domain/BlackjackHandOuter.java +++ b/src/main/java/domain/handouter/BlackjackHandOuter.java @@ -1,4 +1,6 @@ -package domain; +package domain.handouter; + +import domain.game.BlackjackGame; public interface BlackjackHandOuter { diff --git a/src/main/java/domain/BlackjackInitialHandOuter.java b/src/main/java/domain/handouter/BlackjackInitialHandOuter.java similarity index 87% rename from src/main/java/domain/BlackjackInitialHandOuter.java rename to src/main/java/domain/handouter/BlackjackInitialHandOuter.java index ba526186e5a..d7800b07aac 100644 --- a/src/main/java/domain/BlackjackInitialHandOuter.java +++ b/src/main/java/domain/handouter/BlackjackInitialHandOuter.java @@ -1,5 +1,10 @@ -package domain; +package domain.handouter; +import domain.game.BlackjackGame; +import domain.participant.BlackjackParticipant; +import domain.participant.BlackjackParticipants; +import domain.trumpcard.TrumpCard; +import domain.trumpcard.TrumpCardDeck; import domain.validator.ObjectsValidator; import java.util.ArrayList; diff --git a/src/main/java/domain/BlackjackPlayersHandOuter.java b/src/main/java/domain/handouter/BlackjackPlayersHandOuter.java similarity index 87% rename from src/main/java/domain/BlackjackPlayersHandOuter.java rename to src/main/java/domain/handouter/BlackjackPlayersHandOuter.java index fd236c924c1..e370e616057 100644 --- a/src/main/java/domain/BlackjackPlayersHandOuter.java +++ b/src/main/java/domain/handouter/BlackjackPlayersHandOuter.java @@ -1,5 +1,12 @@ -package domain; - +package domain.handouter; + +import domain.game.BlackjackGame; +import domain.participant.BlackjackParticipant; +import domain.participant.BlackjackParticipants; +import domain.participant.BlackjackPlayer; +import domain.participant.BlackjackPlayerName; +import domain.trumpcard.TrumpCard; +import domain.trumpcard.TrumpCardDeck; import domain.validator.ObjectsValidator; import view.input.InputView; import view.input.dto.HandOutPlayerInput; diff --git a/src/main/java/domain/HandOutCount.java b/src/main/java/domain/handouter/HandOutCount.java similarity index 93% rename from src/main/java/domain/HandOutCount.java rename to src/main/java/domain/handouter/HandOutCount.java index 03775eaa3e7..ef1d7a1d9d2 100644 --- a/src/main/java/domain/HandOutCount.java +++ b/src/main/java/domain/handouter/HandOutCount.java @@ -1,4 +1,4 @@ -package domain; +package domain.handouter; public record HandOutCount(int handOutCount) { diff --git a/src/main/java/domain/BlackjackDealer.java b/src/main/java/domain/participant/BlackjackDealer.java similarity index 90% rename from src/main/java/domain/BlackjackDealer.java rename to src/main/java/domain/participant/BlackjackDealer.java index 8b4970f124a..fd3eba4219b 100644 --- a/src/main/java/domain/BlackjackDealer.java +++ b/src/main/java/domain/participant/BlackjackDealer.java @@ -1,6 +1,9 @@ -package domain; +package domain.participant; +import domain.trumpcard.TrumpCard; +import domain.trumpcard.TrumpCards; import domain.validator.ObjectsValidator; +import domain.winorlose.BlackjackPoint; import java.util.List; diff --git a/src/main/java/domain/BlackjackParticipant.java b/src/main/java/domain/participant/BlackjackParticipant.java similarity index 73% rename from src/main/java/domain/BlackjackParticipant.java rename to src/main/java/domain/participant/BlackjackParticipant.java index bf28468023b..ab54037b056 100644 --- a/src/main/java/domain/BlackjackParticipant.java +++ b/src/main/java/domain/participant/BlackjackParticipant.java @@ -1,4 +1,7 @@ -package domain; +package domain.participant; + +import domain.trumpcard.TrumpCard; +import domain.winorlose.BlackjackPoint; import java.util.List; diff --git a/src/main/java/domain/BlackjackParticipants.java b/src/main/java/domain/participant/BlackjackParticipants.java similarity index 98% rename from src/main/java/domain/BlackjackParticipants.java rename to src/main/java/domain/participant/BlackjackParticipants.java index 492b8f2880c..c837781c741 100644 --- a/src/main/java/domain/BlackjackParticipants.java +++ b/src/main/java/domain/participant/BlackjackParticipants.java @@ -1,4 +1,4 @@ -package domain; +package domain.participant; import util.CollectionUtils; diff --git a/src/main/java/domain/BlackjackPlayer.java b/src/main/java/domain/participant/BlackjackPlayer.java similarity index 91% rename from src/main/java/domain/BlackjackPlayer.java rename to src/main/java/domain/participant/BlackjackPlayer.java index 84c349c236f..4a156e8a5e0 100644 --- a/src/main/java/domain/BlackjackPlayer.java +++ b/src/main/java/domain/participant/BlackjackPlayer.java @@ -1,6 +1,9 @@ -package domain; +package domain.participant; +import domain.trumpcard.TrumpCard; +import domain.trumpcard.TrumpCards; import domain.validator.ObjectsValidator; +import domain.winorlose.BlackjackPoint; import java.util.List; diff --git a/src/main/java/domain/BlackjackPlayerName.java b/src/main/java/domain/participant/BlackjackPlayerName.java similarity index 96% rename from src/main/java/domain/BlackjackPlayerName.java rename to src/main/java/domain/participant/BlackjackPlayerName.java index 679fe23e1f8..7bca7095b24 100644 --- a/src/main/java/domain/BlackjackPlayerName.java +++ b/src/main/java/domain/participant/BlackjackPlayerName.java @@ -1,4 +1,4 @@ -package domain; +package domain.participant; import util.StringUtils; diff --git a/src/main/java/domain/BlackjackPlayers.java b/src/main/java/domain/participant/BlackjackPlayers.java similarity index 93% rename from src/main/java/domain/BlackjackPlayers.java rename to src/main/java/domain/participant/BlackjackPlayers.java index 2f3cbc0c5a8..7ed4291b34e 100644 --- a/src/main/java/domain/BlackjackPlayers.java +++ b/src/main/java/domain/participant/BlackjackPlayers.java @@ -1,5 +1,6 @@ -package domain; +package domain.participant; +import domain.trumpcard.TrumpCards; import domain.validator.CollectionValidator; import java.util.List; diff --git a/src/main/java/domain/TrumpCard.java b/src/main/java/domain/trumpcard/TrumpCard.java similarity index 94% rename from src/main/java/domain/TrumpCard.java rename to src/main/java/domain/trumpcard/TrumpCard.java index 6c794c1b2a0..fa51ed582a2 100644 --- a/src/main/java/domain/TrumpCard.java +++ b/src/main/java/domain/trumpcard/TrumpCard.java @@ -1,6 +1,7 @@ -package domain; +package domain.trumpcard; import domain.validator.ObjectsValidator; +import domain.winorlose.BlackjackPoint; import java.util.Objects; diff --git a/src/main/java/domain/TrumpCardDeck.java b/src/main/java/domain/trumpcard/TrumpCardDeck.java similarity index 96% rename from src/main/java/domain/TrumpCardDeck.java rename to src/main/java/domain/trumpcard/TrumpCardDeck.java index 812ff4914b0..f735bfce94b 100644 --- a/src/main/java/domain/TrumpCardDeck.java +++ b/src/main/java/domain/trumpcard/TrumpCardDeck.java @@ -1,4 +1,4 @@ -package domain; +package domain.trumpcard; import domain.validator.ObjectsValidator; diff --git a/src/main/java/domain/TrumpCardRank.java b/src/main/java/domain/trumpcard/TrumpCardRank.java similarity index 97% rename from src/main/java/domain/TrumpCardRank.java rename to src/main/java/domain/trumpcard/TrumpCardRank.java index 9e070382365..a8071197a67 100644 --- a/src/main/java/domain/TrumpCardRank.java +++ b/src/main/java/domain/trumpcard/TrumpCardRank.java @@ -1,4 +1,4 @@ -package domain; +package domain.trumpcard; import java.util.List; diff --git a/src/main/java/domain/TrumpCardSuit.java b/src/main/java/domain/trumpcard/TrumpCardSuit.java similarity index 92% rename from src/main/java/domain/TrumpCardSuit.java rename to src/main/java/domain/trumpcard/TrumpCardSuit.java index 85ddda0baca..efb2f401ab8 100644 --- a/src/main/java/domain/TrumpCardSuit.java +++ b/src/main/java/domain/trumpcard/TrumpCardSuit.java @@ -1,4 +1,4 @@ -package domain; +package domain.trumpcard; public enum TrumpCardSuit { diff --git a/src/main/java/domain/TrumpCards.java b/src/main/java/domain/trumpcard/TrumpCards.java similarity index 92% rename from src/main/java/domain/TrumpCards.java rename to src/main/java/domain/trumpcard/TrumpCards.java index d563ee90c01..0670c29cd54 100644 --- a/src/main/java/domain/TrumpCards.java +++ b/src/main/java/domain/trumpcard/TrumpCards.java @@ -1,6 +1,7 @@ -package domain; +package domain.trumpcard; import domain.validator.TrumpCardsValidator; +import domain.winorlose.BlackjackPoint; import java.util.ArrayList; import java.util.Arrays; @@ -17,10 +18,6 @@ public TrumpCards(List trumpCards) { this.trumpCards = trumpCards; } - public TrumpCards(TrumpCards trumpCards) { - this.trumpCards = trumpCards.getCards(); - } - public static TrumpCards createAll() { return new TrumpCards( Arrays.stream(TrumpCardRank.values()) @@ -79,10 +76,6 @@ public BlackjackPoint totalMinBlackjackPoint() { .reduce(new BlackjackPoint(0), BlackjackPoint::sum); } - public List getCards() { - return List.copyOf(this.trumpCards); - } - public int size() { return this.trumpCards.size(); } diff --git a/src/main/java/domain/WinOrLose.java b/src/main/java/domain/trumpcard/WinOrLose.java similarity index 91% rename from src/main/java/domain/WinOrLose.java rename to src/main/java/domain/trumpcard/WinOrLose.java index d4890f6240f..12a8913610a 100644 --- a/src/main/java/domain/WinOrLose.java +++ b/src/main/java/domain/trumpcard/WinOrLose.java @@ -1,4 +1,4 @@ -package domain; +package domain.trumpcard; public enum WinOrLose { WIN("승"), diff --git a/src/main/java/domain/validator/TrumpCardsValidator.java b/src/main/java/domain/validator/TrumpCardsValidator.java index 3912071c2ce..58dc88d2612 100644 --- a/src/main/java/domain/validator/TrumpCardsValidator.java +++ b/src/main/java/domain/validator/TrumpCardsValidator.java @@ -1,6 +1,6 @@ package domain.validator; -import domain.TrumpCard; +import domain.trumpcard.TrumpCard; import java.util.HashSet; import java.util.List; diff --git a/src/main/java/domain/BlackjackPoint.java b/src/main/java/domain/winorlose/BlackjackPoint.java similarity index 98% rename from src/main/java/domain/BlackjackPoint.java rename to src/main/java/domain/winorlose/BlackjackPoint.java index c7736f3fa97..365f8d89f07 100644 --- a/src/main/java/domain/BlackjackPoint.java +++ b/src/main/java/domain/winorlose/BlackjackPoint.java @@ -1,4 +1,4 @@ -package domain; +package domain.winorlose; public record BlackjackPoint(int point) { diff --git a/src/main/java/domain/BlackjackWinOrLoseDecider.java b/src/main/java/domain/winorlose/BlackjackWinOrLoseDecider.java similarity index 87% rename from src/main/java/domain/BlackjackWinOrLoseDecider.java rename to src/main/java/domain/winorlose/BlackjackWinOrLoseDecider.java index 40cc85bcddb..4b119b0fe5c 100644 --- a/src/main/java/domain/BlackjackWinOrLoseDecider.java +++ b/src/main/java/domain/winorlose/BlackjackWinOrLoseDecider.java @@ -1,11 +1,15 @@ -package domain; +package domain.winorlose; +import domain.game.BlackjackGame; +import domain.participant.BlackjackDealer; +import domain.participant.BlackjackPlayer; +import domain.participant.BlackjackPlayers; import domain.validator.ObjectsValidator; import java.util.ArrayList; import java.util.List; -import static domain.WinOrLose.*; +import static domain.trumpcard.WinOrLose.*; public class BlackjackWinOrLoseDecider { diff --git a/src/main/java/domain/DealerWinOrLose.java b/src/main/java/domain/winorlose/DealerWinOrLose.java similarity index 96% rename from src/main/java/domain/DealerWinOrLose.java rename to src/main/java/domain/winorlose/DealerWinOrLose.java index 3a4aa9cb539..204402aeda5 100644 --- a/src/main/java/domain/DealerWinOrLose.java +++ b/src/main/java/domain/winorlose/DealerWinOrLose.java @@ -1,4 +1,4 @@ -package domain; +package domain.winorlose; public record DealerWinOrLose(int winCount, int loseCount, int tieCount) { diff --git a/src/main/java/domain/FinalWinOrLose.java b/src/main/java/domain/winorlose/FinalWinOrLose.java similarity index 97% rename from src/main/java/domain/FinalWinOrLose.java rename to src/main/java/domain/winorlose/FinalWinOrLose.java index bc9e7dc82c9..c979ae59c1f 100644 --- a/src/main/java/domain/FinalWinOrLose.java +++ b/src/main/java/domain/winorlose/FinalWinOrLose.java @@ -1,4 +1,4 @@ -package domain; +package domain.winorlose; import domain.validator.CollectionValidator; import domain.validator.ObjectsValidator; diff --git a/src/main/java/domain/PlayerWinOrLose.java b/src/main/java/domain/winorlose/PlayerWinOrLose.java similarity index 89% rename from src/main/java/domain/PlayerWinOrLose.java rename to src/main/java/domain/winorlose/PlayerWinOrLose.java index 9fe4e801f5c..673554c6452 100644 --- a/src/main/java/domain/PlayerWinOrLose.java +++ b/src/main/java/domain/winorlose/PlayerWinOrLose.java @@ -1,4 +1,7 @@ -package domain; +package domain.winorlose; + +import domain.participant.BlackjackPlayerName; +import domain.trumpcard.WinOrLose; import java.util.Objects; diff --git a/src/main/java/view/input/dto/HandOutPlayerRequest.java b/src/main/java/view/input/dto/HandOutPlayerRequest.java index 91b1ee39a95..8de1c6ff053 100644 --- a/src/main/java/view/input/dto/HandOutPlayerRequest.java +++ b/src/main/java/view/input/dto/HandOutPlayerRequest.java @@ -1,6 +1,6 @@ package view.input.dto; -import domain.BlackjackPlayerName; +import domain.participant.BlackjackPlayerName; public class HandOutPlayerRequest { diff --git a/src/main/java/view/input/dto/PlayersInput.java b/src/main/java/view/input/dto/PlayersInput.java index cb50a85be00..693d2447c7f 100644 --- a/src/main/java/view/input/dto/PlayersInput.java +++ b/src/main/java/view/input/dto/PlayersInput.java @@ -1,6 +1,6 @@ package view.input.dto; -import domain.BlackjackPlayerName; +import domain.participant.BlackjackPlayerName; import util.CollectionUtils; import util.PatternUtils; import util.StringUtils; diff --git a/src/main/java/view/output/dto/BlackjackResultOutput.java b/src/main/java/view/output/dto/BlackjackResultOutput.java index 7535617bf87..af2f1a5213d 100644 --- a/src/main/java/view/output/dto/BlackjackResultOutput.java +++ b/src/main/java/view/output/dto/BlackjackResultOutput.java @@ -1,7 +1,7 @@ package view.output.dto; -import domain.BlackjackParticipant; -import domain.BlackjackPlayer; +import domain.participant.BlackjackParticipant; +import domain.participant.BlackjackPlayer; import java.util.List; diff --git a/src/main/java/view/output/dto/BlackjackResultOutputs.java b/src/main/java/view/output/dto/BlackjackResultOutputs.java index 6a2d761f0e9..b022ce6cb5f 100644 --- a/src/main/java/view/output/dto/BlackjackResultOutputs.java +++ b/src/main/java/view/output/dto/BlackjackResultOutputs.java @@ -1,6 +1,6 @@ package view.output.dto; -import domain.BlackjackGame; +import domain.game.BlackjackGame; import java.util.List; import java.util.stream.Collectors; diff --git a/src/main/java/view/output/dto/DealerWinOrLoseOutput.java b/src/main/java/view/output/dto/DealerWinOrLoseOutput.java index 8de62ca88b3..806d5bd419e 100644 --- a/src/main/java/view/output/dto/DealerWinOrLoseOutput.java +++ b/src/main/java/view/output/dto/DealerWinOrLoseOutput.java @@ -1,6 +1,6 @@ package view.output.dto; -import domain.DealerWinOrLose; +import domain.winorlose.DealerWinOrLose; public record DealerWinOrLoseOutput(int winCount, int loseCount, int tieCount) { diff --git a/src/main/java/view/output/dto/FinalWinOrLoseOutput.java b/src/main/java/view/output/dto/FinalWinOrLoseOutput.java index 896e90daaba..4a1489c5f5f 100644 --- a/src/main/java/view/output/dto/FinalWinOrLoseOutput.java +++ b/src/main/java/view/output/dto/FinalWinOrLoseOutput.java @@ -1,6 +1,6 @@ package view.output.dto; -import domain.FinalWinOrLose; +import domain.winorlose.FinalWinOrLose; import java.util.List; import java.util.stream.Collectors; diff --git a/src/main/java/view/output/dto/HandOutPlayerOutput.java b/src/main/java/view/output/dto/HandOutPlayerOutput.java index 190c406624f..d21713730bd 100644 --- a/src/main/java/view/output/dto/HandOutPlayerOutput.java +++ b/src/main/java/view/output/dto/HandOutPlayerOutput.java @@ -1,7 +1,7 @@ package view.output.dto; -import domain.BlackjackParticipant; -import domain.BlackjackPlayerName; +import domain.participant.BlackjackParticipant; +import domain.participant.BlackjackPlayerName; import java.util.List; diff --git a/src/main/java/view/output/dto/InitialHandOutOutput.java b/src/main/java/view/output/dto/InitialHandOutOutput.java index fd2e0d0660e..bb0e76f6e93 100644 --- a/src/main/java/view/output/dto/InitialHandOutOutput.java +++ b/src/main/java/view/output/dto/InitialHandOutOutput.java @@ -1,7 +1,7 @@ package view.output.dto; -import domain.BlackjackGame; -import domain.HandOutCount; +import domain.game.BlackjackGame; +import domain.handouter.HandOutCount; import java.util.List; import java.util.stream.Collectors; diff --git a/src/main/java/view/output/dto/InitialHandOutParticipantOutput.java b/src/main/java/view/output/dto/InitialHandOutParticipantOutput.java index e8ae833dd42..3f3b577572f 100644 --- a/src/main/java/view/output/dto/InitialHandOutParticipantOutput.java +++ b/src/main/java/view/output/dto/InitialHandOutParticipantOutput.java @@ -1,8 +1,8 @@ package view.output.dto; -import domain.BlackjackDealer; -import domain.BlackjackParticipant; -import domain.BlackjackPlayer; +import domain.participant.BlackjackDealer; +import domain.participant.BlackjackParticipant; +import domain.participant.BlackjackPlayer; import java.util.List; diff --git a/src/main/java/view/output/dto/PlayerWinOrLoseOutput.java b/src/main/java/view/output/dto/PlayerWinOrLoseOutput.java index 94c41a3e42a..5a5021c3890 100644 --- a/src/main/java/view/output/dto/PlayerWinOrLoseOutput.java +++ b/src/main/java/view/output/dto/PlayerWinOrLoseOutput.java @@ -1,6 +1,6 @@ package view.output.dto; -import domain.PlayerWinOrLose; +import domain.winorlose.PlayerWinOrLose; public record PlayerWinOrLoseOutput(String playerName, String winOrLose) { diff --git a/src/test/java/domain/BlackjackDealerHandOuterTest.java b/src/test/java/domain/BlackjackDealerHandOuterTest.java index 04082d2df5c..29ab34e5c1c 100644 --- a/src/test/java/domain/BlackjackDealerHandOuterTest.java +++ b/src/test/java/domain/BlackjackDealerHandOuterTest.java @@ -1,5 +1,9 @@ package domain; +import domain.game.BlackjackGame; +import domain.handouter.BlackjackDealerHandOuter; +import domain.participant.*; +import domain.trumpcard.*; import org.junit.jupiter.api.DisplayName; import org.junit.jupiter.params.ParameterizedTest; import org.junit.jupiter.params.provider.Arguments; diff --git a/src/test/java/domain/BlackjackGameCreatorTest.java b/src/test/java/domain/BlackjackGameCreatorTest.java index c2e97117a14..e0868b4795d 100644 --- a/src/test/java/domain/BlackjackGameCreatorTest.java +++ b/src/test/java/domain/BlackjackGameCreatorTest.java @@ -1,5 +1,9 @@ package domain; +import domain.game.BlackjackGame; +import domain.game.BlackjackGameCreator; +import domain.participant.BlackjackPlayer; +import domain.participant.BlackjackPlayers; import org.junit.jupiter.api.DisplayName; import org.junit.jupiter.params.ParameterizedTest; import org.junit.jupiter.params.provider.Arguments; diff --git a/src/test/java/domain/BlackjackInitialHandOuterTest.java b/src/test/java/domain/BlackjackInitialHandOuterTest.java index 35d02f96580..31eb7bcada1 100644 --- a/src/test/java/domain/BlackjackInitialHandOuterTest.java +++ b/src/test/java/domain/BlackjackInitialHandOuterTest.java @@ -1,5 +1,11 @@ package domain; +import domain.game.BlackjackGame; +import domain.game.BlackjackGameCreator; +import domain.handouter.BlackjackInitialHandOuter; +import domain.handouter.HandOutCount; +import domain.participant.BlackjackParticipant; +import domain.trumpcard.TrumpCardDeck; import org.assertj.core.api.Assertions; import org.junit.jupiter.api.Test; import view.input.InputView; diff --git a/src/test/java/domain/BlackjackPlayersHandOuterTest.java b/src/test/java/domain/BlackjackPlayersHandOuterTest.java index 05717999f51..60a2828a384 100644 --- a/src/test/java/domain/BlackjackPlayersHandOuterTest.java +++ b/src/test/java/domain/BlackjackPlayersHandOuterTest.java @@ -1,5 +1,10 @@ package domain; +import domain.game.BlackjackGame; +import domain.game.BlackjackGameCreator; +import domain.handouter.BlackjackPlayersHandOuter; +import domain.participant.BlackjackPlayer; +import domain.trumpcard.TrumpCardDeck; import org.assertj.core.api.Assertions; import org.junit.jupiter.api.Test; import view.input.InputView; diff --git a/src/test/java/domain/BlackjackWinOrLoseDeciderTest.java b/src/test/java/domain/BlackjackWinOrLoseDeciderTest.java index dc6bc20202a..dcee76ecc52 100644 --- a/src/test/java/domain/BlackjackWinOrLoseDeciderTest.java +++ b/src/test/java/domain/BlackjackWinOrLoseDeciderTest.java @@ -1,5 +1,12 @@ package domain; +import domain.game.BlackjackGame; +import domain.participant.*; +import domain.trumpcard.*; +import domain.winorlose.BlackjackWinOrLoseDecider; +import domain.winorlose.DealerWinOrLose; +import domain.winorlose.FinalWinOrLose; +import domain.winorlose.PlayerWinOrLose; import org.junit.jupiter.api.DisplayName; import org.junit.jupiter.params.ParameterizedTest; import org.junit.jupiter.params.provider.Arguments; From dec2fb7ccaffdb568ab26b24a76a32c04b282af5 Mon Sep 17 00:00:00 2001 From: kilian Date: Sun, 2 Jun 2024 20:01:14 +0900 Subject: [PATCH 22/22] =?UTF-8?q?refactor=20:=20=EC=95=88=EC=93=B0?= =?UTF-8?q?=EB=8A=94=20=ED=95=A8=EC=88=98=20=EC=A0=95=EB=A6=AC?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../java/domain/participant/BlackjackParticipants.java | 10 ++-------- src/main/java/view/input/ConsoleInputView.java | 6 +----- src/main/java/view/input/InputView.java | 1 - src/main/java/view/input/dto/PlayersInput.java | 4 ---- src/test/java/domain/BlackjackGameCreatorTest.java | 5 ----- .../java/domain/BlackjackInitialHandOuterTest.java | 5 ----- .../java/domain/BlackjackPlayersHandOuterTest.java | 5 ----- 7 files changed, 3 insertions(+), 33 deletions(-) diff --git a/src/main/java/domain/participant/BlackjackParticipants.java b/src/main/java/domain/participant/BlackjackParticipants.java index c837781c741..306a4e3a645 100644 --- a/src/main/java/domain/participant/BlackjackParticipants.java +++ b/src/main/java/domain/participant/BlackjackParticipants.java @@ -1,6 +1,6 @@ package domain.participant; -import util.CollectionUtils; +import domain.validator.CollectionValidator; import java.util.ArrayList; import java.util.List; @@ -11,7 +11,7 @@ public class BlackjackParticipants { private final List blackjackParticipants; public BlackjackParticipants(List blackjackParticipants) { - this.validateNotEmpty(blackjackParticipants); + CollectionValidator.validateNotEmpty(blackjackParticipants); this.blackjackParticipants = blackjackParticipants; } @@ -25,12 +25,6 @@ public static BlackjackParticipants of(BlackjackDealer blackjackDealer, Blackjac ); } - private void validateNotEmpty(List blackjackParticipants) { - if (CollectionUtils.isEmpty(blackjackParticipants)) { - throw new IllegalArgumentException("블랙잭 참가자는 null이거나 empty이면 안됩니다."); - } - } - public int size() { return this.blackjackParticipants.size(); } diff --git a/src/main/java/view/input/ConsoleInputView.java b/src/main/java/view/input/ConsoleInputView.java index 347666be4a5..b01adc7e375 100644 --- a/src/main/java/view/input/ConsoleInputView.java +++ b/src/main/java/view/input/ConsoleInputView.java @@ -5,6 +5,7 @@ import view.input.dto.PlayersInput; import view.output.OutputWriter; + public class ConsoleInputView implements InputView { private final static String PLAYERS_NAVIGATION = "게임에 참여할 사람의 이름을 입력하세요.(쉼표 기준으로 분리)"; @@ -34,9 +35,4 @@ public HandOutPlayerInput viewHandOutCardForPlayer(HandOutPlayerRequest handOutP return HandOutPlayerInput.from(line); } - - @Override - public void viewThresholdCard() { - - } } diff --git a/src/main/java/view/input/InputView.java b/src/main/java/view/input/InputView.java index 293cc4fffdb..0a08c88ea09 100644 --- a/src/main/java/view/input/InputView.java +++ b/src/main/java/view/input/InputView.java @@ -10,5 +10,4 @@ public interface InputView { HandOutPlayerInput viewHandOutCardForPlayer(HandOutPlayerRequest handOutPlayerRequest); - void viewThresholdCard(); } diff --git a/src/main/java/view/input/dto/PlayersInput.java b/src/main/java/view/input/dto/PlayersInput.java index 693d2447c7f..98518386b52 100644 --- a/src/main/java/view/input/dto/PlayersInput.java +++ b/src/main/java/view/input/dto/PlayersInput.java @@ -31,10 +31,6 @@ private static void validateMatchesPattern(String input) { } } - public List getPlayerNames() { - return playerNames; - } - private void validateIsEmpty(List playerNames) { if (CollectionUtils.isEmpty(playerNames)) { throw new IllegalArgumentException("최소 1명의 플레이어가 있어야 합니다."); diff --git a/src/test/java/domain/BlackjackGameCreatorTest.java b/src/test/java/domain/BlackjackGameCreatorTest.java index e0868b4795d..c5743b11b13 100644 --- a/src/test/java/domain/BlackjackGameCreatorTest.java +++ b/src/test/java/domain/BlackjackGameCreatorTest.java @@ -67,10 +67,5 @@ public PlayersInput viewPlayers() { public HandOutPlayerInput viewHandOutCardForPlayer(HandOutPlayerRequest handOutPlayerRequest) { return null; } - - @Override - public void viewThresholdCard() { - - } } } \ No newline at end of file diff --git a/src/test/java/domain/BlackjackInitialHandOuterTest.java b/src/test/java/domain/BlackjackInitialHandOuterTest.java index 31eb7bcada1..ee0dcf47a24 100644 --- a/src/test/java/domain/BlackjackInitialHandOuterTest.java +++ b/src/test/java/domain/BlackjackInitialHandOuterTest.java @@ -53,10 +53,5 @@ public PlayersInput viewPlayers() { public HandOutPlayerInput viewHandOutCardForPlayer(HandOutPlayerRequest handOutPlayerRequest) { return null; } - - @Override - public void viewThresholdCard() { - - } } } \ No newline at end of file diff --git a/src/test/java/domain/BlackjackPlayersHandOuterTest.java b/src/test/java/domain/BlackjackPlayersHandOuterTest.java index 60a2828a384..25ce8b73533 100644 --- a/src/test/java/domain/BlackjackPlayersHandOuterTest.java +++ b/src/test/java/domain/BlackjackPlayersHandOuterTest.java @@ -67,11 +67,6 @@ public HandOutPlayerInput viewHandOutCardForPlayer(HandOutPlayerRequest handOutP return null; } - - @Override - public void viewThresholdCard() { - - } } static class FakeOutputView implements OutputView {