From cfb5d7b7207f260825618fa49779e078c95334d2 Mon Sep 17 00:00:00 2001 From: sun Date: Thu, 12 Mar 2026 11:00:16 +0900 Subject: [PATCH 01/29] =?UTF-8?q?fix:=20=EC=B9=B4=EB=93=9C=20=EB=BD=91?= =?UTF-8?q?=EA=B8=B0=20=EC=A4=91=20bust=EB=90=98=EB=A9=B4=20=EC=A6=89?= =?UTF-8?q?=EC=8B=9C=20=ED=95=B4=EB=8B=B9=20=ED=84=B4=20=EC=A2=85=EB=A3=8C?= =?UTF-8?q?=ED=95=98=EB=8F=84=EB=A1=9D=20=EC=88=98=EC=A0=95?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- src/main/java/blackjack/controller/BlackjackController.java | 5 ++++- 1 file changed, 4 insertions(+), 1 deletion(-) diff --git a/src/main/java/blackjack/controller/BlackjackController.java b/src/main/java/blackjack/controller/BlackjackController.java index 861c8653bb7..08508744ff5 100644 --- a/src/main/java/blackjack/controller/BlackjackController.java +++ b/src/main/java/blackjack/controller/BlackjackController.java @@ -85,8 +85,11 @@ private void processPlayerTurn(Player player) { } private boolean canContinueTurn(Player player) { + if (player.isBust()) { + return false; + } String hitOrStand = InputView.askHitOrStand(player.getName()); - return isHit(hitOrStand) && !player.isBust(); + return isHit(hitOrStand); } private void drawCard(Player player) { From 72fbe0afa2970e5b47e540b7e746d6df0d680e16 Mon Sep 17 00:00:00 2001 From: sun Date: Thu, 12 Mar 2026 11:45:51 +0900 Subject: [PATCH 02/29] =?UTF-8?q?docs:=20=EB=B0=B0=ED=8C=85=20=EA=B8=B0?= =?UTF-8?q?=EB=8A=A5=20=EB=AA=A9=EB=A1=9D=20=EC=B6=94=EA=B0=80?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- README.md | 12 +++++++++++- 1 file changed, 11 insertions(+), 1 deletion(-) diff --git a/README.md b/README.md index 2f845848790..41ee94bd3b1 100644 --- a/README.md +++ b/README.md @@ -20,17 +20,27 @@ - [x] 버스트인 사람 패배 - 둘다 버스트인 경우 - [x] 무승부 +- [ ] 수익 계산 + - [ ] 플레이어는 승리시 배팅금액 만큼 수익을 얻는다. + - [ ] 플레이어가 블랙잭인지 판단할 수 있다. + - [ ] 참가자가 블랙잭인 경우 배팅금액의 1.5배 수익을 얻는다. + - [ ] 플레이어는 패배시 배팅금액 만큼 손해를 본다 + - [ ] 플레이어는 무승부시 배팅금액 만큼 수익도 손해도 보지 않는다. + - [ ] 딜러는 플레이어들이 패배한 금액 만큼 수익을 얻는다. + - [ ] 딜러는 플레이어들이 승리한 금액 만큼 손해를 본다. - [x] 게임진행 - [x] 초기 시작시 인당 카드 2장씩 지급 - [x] 참가자 한명이 버스트가 되거나 카드를 안받는다 선택한 경우 다음 참가자 차례로 넘어감 - [x] 마지막 참가자가 버스트가 되거나 카드를 안받을 경우 게임 종료 - [x] 전체 플레이어 승패 결과 계산 + - [ ] 전체 참가자 수익 계산 -[x] 입력 - [x] 게임 참가자 이름 입력 + - [ ] 게임 배팅 금액 입력 - [x] 카드 더받기 유무 입력 - [x] 출력 - [x] 분배 받은 카드 목록 출력 - [x] 딜러와 참가자 카드 합계 결과 출력 - - [x] 최종 승패 결과 출력 \ No newline at end of file + - [ ] 최종 수익 출력 \ No newline at end of file From 152762a8310f8ed72466831dec7aa741f8ad5f70 Mon Sep 17 00:00:00 2001 From: sun Date: Thu, 12 Mar 2026 11:58:14 +0900 Subject: [PATCH 03/29] =?UTF-8?q?test:=20=ED=94=8C=EB=A0=88=EC=9D=B4?= =?UTF-8?q?=EC=96=B4=20=EB=B8=94=EB=9E=99=EC=9E=AD=20=ED=8C=90=EB=8B=A8?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- src/test/java/PlayerTest.java | 16 ++++++++++++++++ 1 file changed, 16 insertions(+) diff --git a/src/test/java/PlayerTest.java b/src/test/java/PlayerTest.java index 5b3575a954d..257e7ce6f82 100644 --- a/src/test/java/PlayerTest.java +++ b/src/test/java/PlayerTest.java @@ -17,4 +17,20 @@ void calculate_player_total_score() { player2.receiveOneCard(new Card("10", "스페이드")); assertThat(player2.calculateTotalScore()).isEqualTo(13); } + + @Test + void player_is_blackjack_when_score_is_21() { + Player player = new Player("player"); + player.receiveOneCard(new Card("A", "하트")); + player.receiveOneCard(new Card("J", "스페이드")); + assertThat(player.isBlackjack()).isTrue(); + } + + @Test + void player_is_not_blackjack_when_score_is_20() { + Player player = new Player("player"); + player.receiveOneCard(new Card("Q", "하트")); + player.receiveOneCard(new Card("J", "스페이드")); + assertThat(player.isBlackjack()).isFalse(); + } } From f7b8de794c9b0d2049a40d6c83ad19741907582a Mon Sep 17 00:00:00 2001 From: sun Date: Thu, 12 Mar 2026 13:06:07 +0900 Subject: [PATCH 04/29] =?UTF-8?q?feat:=20=ED=94=8C=EB=A0=88=EC=9D=B4?= =?UTF-8?q?=EC=96=B4=EA=B0=80=20=EB=B8=94=EB=9E=99=EC=9E=AD=EC=9D=B8?= =?UTF-8?q?=EC=A7=80=20=ED=8C=90=EB=8B=A8?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- README.md | 2 +- src/main/java/blackjack/domain/Player.java | 6 ++++++ 2 files changed, 7 insertions(+), 1 deletion(-) diff --git a/README.md b/README.md index 41ee94bd3b1..dee4a747099 100644 --- a/README.md +++ b/README.md @@ -22,7 +22,7 @@ - [x] 무승부 - [ ] 수익 계산 - [ ] 플레이어는 승리시 배팅금액 만큼 수익을 얻는다. - - [ ] 플레이어가 블랙잭인지 판단할 수 있다. + - [x] 플레이어가 블랙잭인지 판단할 수 있다. - [ ] 참가자가 블랙잭인 경우 배팅금액의 1.5배 수익을 얻는다. - [ ] 플레이어는 패배시 배팅금액 만큼 손해를 본다 - [ ] 플레이어는 무승부시 배팅금액 만큼 수익도 손해도 보지 않는다. diff --git a/src/main/java/blackjack/domain/Player.java b/src/main/java/blackjack/domain/Player.java index dec8a1a9d54..2a01e35cebd 100644 --- a/src/main/java/blackjack/domain/Player.java +++ b/src/main/java/blackjack/domain/Player.java @@ -2,6 +2,8 @@ public class Player extends Participant { + private static final int BLACKJACK_SCORE = 21; + private final String name; public Player(String name) { @@ -12,4 +14,8 @@ public String getName() { return name; } + public boolean isBlackjack() { + return calculateTotalScore() == BLACKJACK_SCORE; + } + } From 386cdfaaaf49962583797e9e18445cc46544a4c3 Mon Sep 17 00:00:00 2001 From: sun Date: Thu, 12 Mar 2026 13:16:21 +0900 Subject: [PATCH 05/29] =?UTF-8?q?refactor:=20Game=EB=82=B4=20=EC=9D=BC?= =?UTF-8?q?=EB=B6=80=20=ED=8C=90=EC=A0=95=20=EB=A9=94=EC=84=9C=EB=93=9C=20?= =?UTF-8?q?static=EC=9C=BC=EB=A1=9C=20=EC=88=98=EC=A0=95?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- src/main/java/blackjack/service/Game.java | 12 ++++++------ 1 file changed, 6 insertions(+), 6 deletions(-) diff --git a/src/main/java/blackjack/service/Game.java b/src/main/java/blackjack/service/Game.java index f2e9e10f4b8..5e7c64fde84 100644 --- a/src/main/java/blackjack/service/Game.java +++ b/src/main/java/blackjack/service/Game.java @@ -23,7 +23,7 @@ public void dealerDrawsCardsUntilDone(Dealer dealer) { } } - public GameResult judgeTotalGameResult(List players, Dealer dealer) { + public static GameResult judgeTotalGameResult(List players, Dealer dealer) { Map dealerResult = new HashMap<>(); LinkedHashMap playerResults = new LinkedHashMap<>(); @@ -36,14 +36,14 @@ public GameResult judgeTotalGameResult(List players, Dealer dealer) { return new GameResult(dealerResult, playerResults); } - private ScoreCompareResult toPlayerResult(ScoreCompareResult result) { + private static ScoreCompareResult toPlayerResult(ScoreCompareResult result) { if (result == ScoreCompareResult.DEALER_WIN) { return ScoreCompareResult.PLAYER_LOSS; } return result; } - private ScoreCompareResult toDealerKey(ScoreCompareResult result) { + private static ScoreCompareResult toDealerKey(ScoreCompareResult result) { if (result == ScoreCompareResult.PLAYER_WIN) { return ScoreCompareResult.DEALER_LOSS; } @@ -51,7 +51,7 @@ private ScoreCompareResult toDealerKey(ScoreCompareResult result) { } - public ScoreCompareResult compareScore(Player player, Dealer dealer) { + public static ScoreCompareResult compareScore(Player player, Dealer dealer) { boolean isPlayerBust = player.isBust(); boolean isDealerBust = dealer.isBust(); @@ -63,7 +63,7 @@ public ScoreCompareResult compareScore(Player player, Dealer dealer) { } - private ScoreCompareResult compareScoreWhenBust(boolean isPlayerBust, boolean isDealerBust) { + private static ScoreCompareResult compareScoreWhenBust(boolean isPlayerBust, boolean isDealerBust) { if (isPlayerBust && isDealerBust) { return ScoreCompareResult.PUSH; } @@ -76,7 +76,7 @@ private ScoreCompareResult compareScoreWhenBust(boolean isPlayerBust, boolean is throw new IllegalArgumentException("버스트인 사람이 1명은 포함되어야 합니다."); } - private ScoreCompareResult compareScoreWhenNotBust(int playerTotalScore, int dealerTotalScore) { + private static ScoreCompareResult compareScoreWhenNotBust(int playerTotalScore, int dealerTotalScore) { if (playerTotalScore > dealerTotalScore) { return ScoreCompareResult.PLAYER_WIN; } From 5a9a8d37483dae2f2b2b1aa85ddfcb0dff702e91 Mon Sep 17 00:00:00 2001 From: sun Date: Thu, 12 Mar 2026 14:46:57 +0900 Subject: [PATCH 06/29] =?UTF-8?q?test:=20=ED=94=8C=EB=A0=88=EC=9D=B4?= =?UTF-8?q?=EC=96=B4=EA=B0=80=20=EB=B8=94=EB=9E=99=EC=9E=AD=EC=9D=B4=20?= =?UTF-8?q?=EC=95=84=EB=8B=8C=20=EC=A0=90=EC=88=98=EB=A1=9C=20=EC=8A=B9?= =?UTF-8?q?=EB=A6=AC=EC=8B=9C=20=EC=88=98=EC=9D=B5=20=EA=B3=84=EC=82=B0?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- src/test/java/PlayerBetTest.java | 16 ++++++++++++++++ 1 file changed, 16 insertions(+) create mode 100644 src/test/java/PlayerBetTest.java diff --git a/src/test/java/PlayerBetTest.java b/src/test/java/PlayerBetTest.java new file mode 100644 index 00000000000..72849fed833 --- /dev/null +++ b/src/test/java/PlayerBetTest.java @@ -0,0 +1,16 @@ +import static org.assertj.core.api.AssertionsForClassTypes.assertThat; + +import blackjack.domain.Player; +import blackjack.domain.ScoreCompareResult; +import org.junit.jupiter.api.Test; + +public class PlayerBetTest { + @Test + void calculate_profit_when_player_win_except_blackjack() { + Player player = new Player("player"); + + PlayerBetting playerBetting = new PlayerBetting(player, 1000); + + assertThat(playerBetting.calculateProfit(ScoreCompareResult.PLAYER_WIN)).isEqualTo(1000); + } +} From 4780292d383e88e543b33cbefb32287cdade578a Mon Sep 17 00:00:00 2001 From: sun Date: Thu, 12 Mar 2026 14:59:21 +0900 Subject: [PATCH 07/29] =?UTF-8?q?feat:=20=ED=94=8C=EB=A0=88=EC=9D=B4?= =?UTF-8?q?=EC=96=B4=EA=B0=80=20=EB=B8=94=EB=9E=99=EC=9E=AD=EC=9D=B4=20?= =?UTF-8?q?=EC=95=84=EB=8B=8C=20=EC=A0=90=EC=88=98=EB=A1=9C=20=EC=8A=B9?= =?UTF-8?q?=EB=A6=AC=EC=8B=9C=20=EC=88=98=EC=9D=B5=20=EA=B3=84=EC=82=B0?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- README.md | 2 +- .../java/blackjack/domain/PlayerBetting.java | 18 ++++++++++++++++++ src/test/java/PlayerBetTest.java | 1 + 3 files changed, 20 insertions(+), 1 deletion(-) create mode 100644 src/main/java/blackjack/domain/PlayerBetting.java diff --git a/README.md b/README.md index dee4a747099..a4fe22cab7a 100644 --- a/README.md +++ b/README.md @@ -21,7 +21,7 @@ - 둘다 버스트인 경우 - [x] 무승부 - [ ] 수익 계산 - - [ ] 플레이어는 승리시 배팅금액 만큼 수익을 얻는다. + - [x] 플레이어는 승리시 배팅금액 만큼 수익을 얻는다. - [x] 플레이어가 블랙잭인지 판단할 수 있다. - [ ] 참가자가 블랙잭인 경우 배팅금액의 1.5배 수익을 얻는다. - [ ] 플레이어는 패배시 배팅금액 만큼 손해를 본다 diff --git a/src/main/java/blackjack/domain/PlayerBetting.java b/src/main/java/blackjack/domain/PlayerBetting.java new file mode 100644 index 00000000000..994178c4854 --- /dev/null +++ b/src/main/java/blackjack/domain/PlayerBetting.java @@ -0,0 +1,18 @@ +package blackjack.domain; + +public class PlayerBetting { + private final Player player; + private final int bettingAmount; + + public PlayerBetting(Player player, int bettingAmount) { + this.player = player; + this.bettingAmount = bettingAmount; + } + + public int calculateProfit(ScoreCompareResult compareResult) { + if (compareResult == ScoreCompareResult.PLAYER_WIN) { + return bettingAmount; + } + return 0; + } +} diff --git a/src/test/java/PlayerBetTest.java b/src/test/java/PlayerBetTest.java index 72849fed833..6cbf67a26a0 100644 --- a/src/test/java/PlayerBetTest.java +++ b/src/test/java/PlayerBetTest.java @@ -1,6 +1,7 @@ import static org.assertj.core.api.AssertionsForClassTypes.assertThat; import blackjack.domain.Player; +import blackjack.domain.PlayerBetting; import blackjack.domain.ScoreCompareResult; import org.junit.jupiter.api.Test; From 50455df8020a785c070863598b3b5f287cf2e667 Mon Sep 17 00:00:00 2001 From: sun Date: Thu, 12 Mar 2026 15:02:34 +0900 Subject: [PATCH 08/29] =?UTF-8?q?test:=20=ED=94=8C=EB=A0=88=EC=9D=B4?= =?UTF-8?q?=EC=96=B4=EA=B0=80=20=EB=B8=94=EB=9E=99=EC=9E=AD=EC=9C=BC?= =?UTF-8?q?=EB=A1=9C=20=EC=8A=B9=EB=A6=AC=EC=8B=9C=20=EC=88=98=EC=9D=B5?= =?UTF-8?q?=EC=9D=80=20=EB=B0=B0=ED=8C=85=EA=B8=88=EC=95=A1=EC=9D=98=201.5?= =?UTF-8?q?=EB=B0=B0?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- src/test/java/PlayerBetTest.java | 19 +++++++++++++++++++ 1 file changed, 19 insertions(+) diff --git a/src/test/java/PlayerBetTest.java b/src/test/java/PlayerBetTest.java index 6cbf67a26a0..4b8601be70e 100644 --- a/src/test/java/PlayerBetTest.java +++ b/src/test/java/PlayerBetTest.java @@ -1,5 +1,6 @@ import static org.assertj.core.api.AssertionsForClassTypes.assertThat; +import blackjack.domain.Card; import blackjack.domain.Player; import blackjack.domain.PlayerBetting; import blackjack.domain.ScoreCompareResult; @@ -14,4 +15,22 @@ void calculate_profit_when_player_win_except_blackjack() { assertThat(playerBetting.calculateProfit(ScoreCompareResult.PLAYER_WIN)).isEqualTo(1000); } + + @Test + void calculate_profit_when_player_win_with_blackjack() { + Player player = createPlayer("player", "A:스페이드", "10:하트"); + + PlayerBetting playerBetting = new PlayerBetting(player, 1000); + + assertThat(playerBetting.calculateProfit(ScoreCompareResult.PLAYER_WIN)).isEqualTo(1500); + } + + private Player createPlayer(String name, String... cards) { + Player player = new Player(name); + for (String card : cards) { + String[] parts = card.split(":"); + player.receiveOneCard(new Card(parts[0], parts[1])); + } + return player; + } } From bf80e3e4418e5e46e5ce9591f7bd33029aafdff2 Mon Sep 17 00:00:00 2001 From: sun Date: Thu, 12 Mar 2026 15:12:22 +0900 Subject: [PATCH 09/29] =?UTF-8?q?feat:=20=ED=94=8C=EB=A0=88=EC=9D=B4?= =?UTF-8?q?=EC=96=B4=EA=B0=80=20=EB=B8=94=EB=9E=99=EC=9E=AD=EC=9C=BC?= =?UTF-8?q?=EB=A1=9C=20=EC=8A=B9=EB=A6=AC=EC=8B=9C=20=EC=88=98=EC=9D=B5?= =?UTF-8?q?=EC=9D=80=20=EB=B0=B0=ED=8C=85=EA=B8=88=EC=95=A1=EC=9D=98=201.5?= =?UTF-8?q?=EB=B0=B0?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- README.md | 4 ++-- src/main/java/blackjack/domain/PlayerBetting.java | 11 +++++++++-- 2 files changed, 11 insertions(+), 4 deletions(-) diff --git a/README.md b/README.md index a4fe22cab7a..55a9674d557 100644 --- a/README.md +++ b/README.md @@ -23,9 +23,9 @@ - [ ] 수익 계산 - [x] 플레이어는 승리시 배팅금액 만큼 수익을 얻는다. - [x] 플레이어가 블랙잭인지 판단할 수 있다. - - [ ] 참가자가 블랙잭인 경우 배팅금액의 1.5배 수익을 얻는다. + - [x] 참가자가 블랙잭인 경우 배팅금액의 1.5배 수익을 얻는다. - [ ] 플레이어는 패배시 배팅금액 만큼 손해를 본다 - - [ ] 플레이어는 무승부시 배팅금액 만큼 수익도 손해도 보지 않는다. + - [x] 플레이어는 무승부시 배팅금액 만큼 수익도 손해도 보지 않는다. - [ ] 딜러는 플레이어들이 패배한 금액 만큼 수익을 얻는다. - [ ] 딜러는 플레이어들이 승리한 금액 만큼 손해를 본다. diff --git a/src/main/java/blackjack/domain/PlayerBetting.java b/src/main/java/blackjack/domain/PlayerBetting.java index 994178c4854..5f42814851e 100644 --- a/src/main/java/blackjack/domain/PlayerBetting.java +++ b/src/main/java/blackjack/domain/PlayerBetting.java @@ -9,10 +9,17 @@ public PlayerBetting(Player player, int bettingAmount) { this.bettingAmount = bettingAmount; } - public int calculateProfit(ScoreCompareResult compareResult) { + public double calculateProfit(ScoreCompareResult compareResult) { if (compareResult == ScoreCompareResult.PLAYER_WIN) { - return bettingAmount; + return calculateProfitWhenPlayerWins(); } return 0; } + + private double calculateProfitWhenPlayerWins() { + if (player.isBlackjack()) { + return (bettingAmount * 1.5); + } + return bettingAmount; + } } From cafc93247ee8ae11c2b4710819d73b8c2312610d Mon Sep 17 00:00:00 2001 From: sun Date: Thu, 12 Mar 2026 15:15:25 +0900 Subject: [PATCH 10/29] =?UTF-8?q?style:=20LOSE=20=EC=98=A4=ED=83=80=20?= =?UTF-8?q?=EC=88=98=EC=A0=95?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- src/main/java/blackjack/domain/PlayerBetting.java | 3 +++ src/main/java/blackjack/domain/ScoreCompareResult.java | 4 ++-- src/main/java/blackjack/service/Game.java | 4 ++-- src/main/java/blackjack/view/OutputView.java | 6 +++--- src/test/java/GameTest.java | 4 ++-- 5 files changed, 12 insertions(+), 9 deletions(-) diff --git a/src/main/java/blackjack/domain/PlayerBetting.java b/src/main/java/blackjack/domain/PlayerBetting.java index 5f42814851e..1cd4bdcac59 100644 --- a/src/main/java/blackjack/domain/PlayerBetting.java +++ b/src/main/java/blackjack/domain/PlayerBetting.java @@ -13,6 +13,9 @@ public double calculateProfit(ScoreCompareResult compareResult) { if (compareResult == ScoreCompareResult.PLAYER_WIN) { return calculateProfitWhenPlayerWins(); } + if (compareResult == ScoreCompareResult.PLAYER_LOSE) { + return -bettingAmount; + } return 0; } diff --git a/src/main/java/blackjack/domain/ScoreCompareResult.java b/src/main/java/blackjack/domain/ScoreCompareResult.java index d7553eefeb1..726cf9e3cd1 100644 --- a/src/main/java/blackjack/domain/ScoreCompareResult.java +++ b/src/main/java/blackjack/domain/ScoreCompareResult.java @@ -3,7 +3,7 @@ public enum ScoreCompareResult { PLAYER_WIN, DEALER_WIN, - PLAYER_LOSS, - DEALER_LOSS, + PLAYER_LOSE, + DEALER_LOSE, PUSH } diff --git a/src/main/java/blackjack/service/Game.java b/src/main/java/blackjack/service/Game.java index 5e7c64fde84..731714cdef9 100644 --- a/src/main/java/blackjack/service/Game.java +++ b/src/main/java/blackjack/service/Game.java @@ -38,14 +38,14 @@ public static GameResult judgeTotalGameResult(List players, Dealer deale private static ScoreCompareResult toPlayerResult(ScoreCompareResult result) { if (result == ScoreCompareResult.DEALER_WIN) { - return ScoreCompareResult.PLAYER_LOSS; + return ScoreCompareResult.PLAYER_LOSE; } return result; } private static ScoreCompareResult toDealerKey(ScoreCompareResult result) { if (result == ScoreCompareResult.PLAYER_WIN) { - return ScoreCompareResult.DEALER_LOSS; + return ScoreCompareResult.DEALER_LOSE; } return result; } diff --git a/src/main/java/blackjack/view/OutputView.java b/src/main/java/blackjack/view/OutputView.java index 9bf9776ebf6..54afe0cbb60 100644 --- a/src/main/java/blackjack/view/OutputView.java +++ b/src/main/java/blackjack/view/OutputView.java @@ -57,9 +57,9 @@ public static void printFinalResult( System.out.println(); System.out.println("## 최종 승패"); int wins = dealerResult.getOrDefault(ScoreCompareResult.DEALER_WIN, 0); - int losses = dealerResult.getOrDefault(ScoreCompareResult.DEALER_LOSS, 0); + int loses = dealerResult.getOrDefault(ScoreCompareResult.DEALER_LOSE, 0); int pushes = dealerResult.getOrDefault(ScoreCompareResult.PUSH, 0); - System.out.printf("딜러: %d승 %d무 %d패%n", wins, pushes, losses); + System.out.printf("딜러: %d승 %d무 %d패%n", wins, pushes, loses); for (PlayerFinalResult playerResult : playerResults) { System.out.println(playerResult.name() + ": " + toKorean(playerResult.scoreCompareResult())); @@ -70,7 +70,7 @@ private static String toKorean(ScoreCompareResult result) { if (result == ScoreCompareResult.PLAYER_WIN) { return "승"; } - if (result == ScoreCompareResult.PLAYER_LOSS) { + if (result == ScoreCompareResult.PLAYER_LOSE) { return "패"; } return "무"; diff --git a/src/test/java/GameTest.java b/src/test/java/GameTest.java index e61e2f85507..2aff0ca7e26 100644 --- a/src/test/java/GameTest.java +++ b/src/test/java/GameTest.java @@ -90,13 +90,13 @@ void judge_total_winner_result() { Map dealerResult = Map.of( ScoreCompareResult.DEALER_WIN, 1, - ScoreCompareResult.DEALER_LOSS, 1, + ScoreCompareResult.DEALER_LOSE, 1, ScoreCompareResult.PUSH, 1 ); LinkedHashMap playerResults = new LinkedHashMap<>(); playerResults.put(pobi, ScoreCompareResult.PLAYER_WIN); - playerResults.put(jason, ScoreCompareResult.PLAYER_LOSS); + playerResults.put(jason, ScoreCompareResult.PLAYER_LOSE); playerResults.put(brown, ScoreCompareResult.PUSH); GameResult expected = new GameResult( From 193dfd2ce8d0a9676fa1870c730beb051a3523d8 Mon Sep 17 00:00:00 2001 From: sun Date: Thu, 12 Mar 2026 15:17:02 +0900 Subject: [PATCH 11/29] =?UTF-8?q?test:=20=ED=94=8C=EB=A0=88=EC=9D=B4?= =?UTF-8?q?=EC=96=B4=20=ED=8C=A8=EB=B0=B0=EC=8B=9C=20=EC=88=98=EC=9D=B5=20?= =?UTF-8?q?=EA=B3=84=EC=82=B0?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- README.md | 2 +- src/test/java/PlayerBetTest.java | 10 ++++++++++ 2 files changed, 11 insertions(+), 1 deletion(-) diff --git a/README.md b/README.md index 55a9674d557..cd83685c681 100644 --- a/README.md +++ b/README.md @@ -24,7 +24,7 @@ - [x] 플레이어는 승리시 배팅금액 만큼 수익을 얻는다. - [x] 플레이어가 블랙잭인지 판단할 수 있다. - [x] 참가자가 블랙잭인 경우 배팅금액의 1.5배 수익을 얻는다. - - [ ] 플레이어는 패배시 배팅금액 만큼 손해를 본다 + - [x] 플레이어는 패배시 배팅금액 만큼 손해를 본다 - [x] 플레이어는 무승부시 배팅금액 만큼 수익도 손해도 보지 않는다. - [ ] 딜러는 플레이어들이 패배한 금액 만큼 수익을 얻는다. - [ ] 딜러는 플레이어들이 승리한 금액 만큼 손해를 본다. diff --git a/src/test/java/PlayerBetTest.java b/src/test/java/PlayerBetTest.java index 4b8601be70e..d070e441375 100644 --- a/src/test/java/PlayerBetTest.java +++ b/src/test/java/PlayerBetTest.java @@ -25,6 +25,16 @@ void calculate_profit_when_player_win_with_blackjack() { assertThat(playerBetting.calculateProfit(ScoreCompareResult.PLAYER_WIN)).isEqualTo(1500); } + @Test + void calculate_profit_when_player_lose() { + Player player = new Player("player"); + + PlayerBetting playerBetting = new PlayerBetting(player, 1000); + + assertThat(playerBetting.calculateProfit(ScoreCompareResult.PLAYER_LOSE)).isEqualTo(-1000); + } + + private Player createPlayer(String name, String... cards) { Player player = new Player(name); for (String card : cards) { From 0955ddbdbaca461ce20f0ba9f552bddf023de05b Mon Sep 17 00:00:00 2001 From: sun Date: Thu, 12 Mar 2026 15:18:39 +0900 Subject: [PATCH 12/29] =?UTF-8?q?test:=20=EB=AC=B4=EC=8A=B9=EB=B6=80?= =?UTF-8?q?=EC=8B=9C=20=EC=88=98=EC=9D=B5=EC=9D=80=200?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- src/test/java/PlayerBetTest.java | 9 +++++++++ 1 file changed, 9 insertions(+) diff --git a/src/test/java/PlayerBetTest.java b/src/test/java/PlayerBetTest.java index d070e441375..6d1a0b6f504 100644 --- a/src/test/java/PlayerBetTest.java +++ b/src/test/java/PlayerBetTest.java @@ -34,6 +34,15 @@ void calculate_profit_when_player_lose() { assertThat(playerBetting.calculateProfit(ScoreCompareResult.PLAYER_LOSE)).isEqualTo(-1000); } + @Test + void calculate_profit_when_player_draw() { + Player player = new Player("player"); + + PlayerBetting playerBetting = new PlayerBetting(player, 1000); + + assertThat(playerBetting.calculateProfit(ScoreCompareResult.PUSH)).isEqualTo(0); + } + private Player createPlayer(String name, String... cards) { Player player = new Player(name); From 37b1b7a0966b8e3e89d2cd3e384217fd96145b2c Mon Sep 17 00:00:00 2001 From: sun Date: Thu, 12 Mar 2026 16:30:47 +0900 Subject: [PATCH 13/29] =?UTF-8?q?refactor:=20=EC=B9=B4=EB=93=9C=20?= =?UTF-8?q?=EB=B6=84=EB=B0=B0=20=EC=9D=98=EC=A1=B4=EC=84=B1=20=EB=B0=8F=20?= =?UTF-8?q?=EC=B1=85=EC=9E=84=20=EB=B3=80=EA=B2=BD?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../controller/BlackjackController.java | 10 ++++---- .../blackjack/service/CardDistributor.java | 25 ++++++------------- src/main/java/blackjack/service/Game.java | 12 +++------ src/test/java/GameTest.java | 13 +++++----- 4 files changed, 21 insertions(+), 39 deletions(-) diff --git a/src/main/java/blackjack/controller/BlackjackController.java b/src/main/java/blackjack/controller/BlackjackController.java index 08508744ff5..7ccc010f746 100644 --- a/src/main/java/blackjack/controller/BlackjackController.java +++ b/src/main/java/blackjack/controller/BlackjackController.java @@ -26,7 +26,7 @@ public class BlackjackController { public BlackjackController(CardDistributor cardDistributor) { this.cardDistributor = cardDistributor; - this.game = new Game(cardDistributor); + this.game = new Game(); } public void startGame() { @@ -68,7 +68,7 @@ private void calculateFinalGameResult(List players, Dealer dealer) { } private void playDealerTurn(Dealer dealer) { - game.dealerDrawsCardsUntilDone(dealer); + cardDistributor.distributeCardsToDealerUntilScoreAtLeast(dealer); OutputView.printDealerCardDrawnResult(dealer.getAdditionalDrawnCardCount()); } @@ -93,7 +93,7 @@ private boolean canContinueTurn(Player player) { } private void drawCard(Player player) { - cardDistributor.distributeCardToPlayer(player); + cardDistributor.distributeCardsToParticipant(player, 1); OutputView.printDrawnCards(player.getName(), player.getCardNames()); } @@ -128,9 +128,9 @@ private void calculateFinalScore(List players, Dealer dealer) { private void distributeInitialCards(List players, Dealer dealer) { for (Player player : players) { - cardDistributor.distributeTwoCardsToPlayer(player); + cardDistributor.distributeCardsToParticipant(player, 2); } - cardDistributor.distributeTwoCardsToDealer(dealer); + cardDistributor.distributeCardsToParticipant(dealer, 2); } private boolean isHit(String hitOrStand) { diff --git a/src/main/java/blackjack/service/CardDistributor.java b/src/main/java/blackjack/service/CardDistributor.java index ab63e7d2c9b..e415e944837 100644 --- a/src/main/java/blackjack/service/CardDistributor.java +++ b/src/main/java/blackjack/service/CardDistributor.java @@ -2,7 +2,7 @@ import blackjack.domain.Card; import blackjack.domain.Dealer; -import blackjack.domain.Player; +import blackjack.domain.Participant; public class CardDistributor { @@ -12,27 +12,16 @@ public CardDistributor(RandomCardPicker randomCardPicker) { this.randomCardPicker = randomCardPicker; } - public void distributeCardToPlayer(Player player) { - Card card = randomCardPicker.drawCard(); - player.receiveOneCard(card); - } - - public void distributeCardToDealer(Dealer dealer) { - Card card = randomCardPicker.drawCard(); - dealer.receiveOneCard(card); - } - - public void distributeTwoCardsToPlayer(Player player) { - for (int i = 0; i < 2; i++) { + public void distributeCardsToParticipant(Participant participant, int numberOfCards) { + for (int i = 0; i < numberOfCards; i++) { Card card = randomCardPicker.drawCard(); - player.receiveOneCard(card); + participant.receiveOneCard(card); } } - public void distributeTwoCardsToDealer(Dealer dealer) { - for (int i = 0; i < 2; i++) { - Card card = randomCardPicker.drawCard(); - dealer.receiveOneCard(card); + public void distributeCardsToDealerUntilScoreAtLeast(Dealer dealer) { + while (!dealer.isDealerDone()) { + distributeCardsToParticipant(dealer, 1); } } } diff --git a/src/main/java/blackjack/service/Game.java b/src/main/java/blackjack/service/Game.java index 731714cdef9..75766cbb848 100644 --- a/src/main/java/blackjack/service/Game.java +++ b/src/main/java/blackjack/service/Game.java @@ -10,17 +10,11 @@ import java.util.Map; public class Game { +// private final List players; +// private final Dealer dealer; - private final CardDistributor cardDistributor; - public Game(CardDistributor cardDistributor) { - this.cardDistributor = cardDistributor; - } - - public void dealerDrawsCardsUntilDone(Dealer dealer) { - while (!dealer.isDealerDone()) { - cardDistributor.distributeCardToDealer(dealer); - } + public Game() { } public static GameResult judgeTotalGameResult(List players, Dealer dealer) { diff --git a/src/test/java/GameTest.java b/src/test/java/GameTest.java index 2aff0ca7e26..ff0afd86aa5 100644 --- a/src/test/java/GameTest.java +++ b/src/test/java/GameTest.java @@ -19,7 +19,7 @@ public class GameTest { @Test - void dealer_should_draw_card_until_score_at_least_17() { + void dealer_should_draw_card_until_score_at_least_17() { // TODO: 책임 CardDistributor로 이동 Dealer dealer = new Dealer(); Random mockRandom = mock(Random.class); RandomCardPicker randomCardPicker = new RandomCardPicker(mockRandom); @@ -28,8 +28,7 @@ void dealer_should_draw_card_until_score_at_least_17() { // 2 하트, 2 스페이드, 2 클로버, 2 다이아몬드, 3 하트, 3 스페이드, 3 클로버, 3 다이아몬드, ... when(mockRandom.nextInt(52)).thenReturn(0); - Game game = new Game(cardDistributor); - game.dealerDrawsCardsUntilDone(dealer); + cardDistributor.distributeCardsToDealerUntilScoreAtLeast(dealer); assertThat(dealer.calculateTotalScore()).isEqualTo(17); } @@ -45,7 +44,7 @@ void compare_score_when_player_win() { dealer.receiveOneCard(new Card("10", "하트")); dealer.receiveOneCard(new Card("7", "스페이드")); - Game game = new Game(null); + Game game = new Game(); assertThat(game.compareScore(player, dealer)).isEqualTo(ScoreCompareResult.PLAYER_WIN); } @@ -60,7 +59,7 @@ void compare_score_when_dealer_win() { dealer.receiveOneCard(new Card("10", "하트")); dealer.receiveOneCard(new Card("9", "스페이드")); - Game game = new Game(null); + Game game = new Game(); assertThat(game.compareScore(player, dealer)).isEqualTo(ScoreCompareResult.DEALER_WIN); } @@ -75,7 +74,7 @@ void compare_score_when_push() { dealer.receiveOneCard(new Card("10", "하트")); dealer.receiveOneCard(new Card("A", "스페이드")); - Game game = new Game(null); + Game game = new Game(); assertThat(game.compareScore(player, dealer)).isEqualTo(ScoreCompareResult.PUSH); } @@ -86,7 +85,7 @@ void judge_total_winner_result() { Player brown = createPlayer("brown", "10:하트", "10:클로버"); Dealer dealer = createDealer("3:다이아몬드", "9:클로버", "8:다이아몬드"); - Game game = new Game(null); + Game game = new Game(); Map dealerResult = Map.of( ScoreCompareResult.DEALER_WIN, 1, From d28edad1bf9c1111eafc83f8e7e76b8986682571 Mon Sep 17 00:00:00 2001 From: sun Date: Thu, 12 Mar 2026 16:45:39 +0900 Subject: [PATCH 14/29] =?UTF-8?q?refactor:=20=EA=B2=8C=EC=9E=84=20?= =?UTF-8?q?=EA=B0=9D=EC=B2=B4=20=EC=B1=85=EC=9E=84=20=EC=B6=94=EA=B0=80?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../blackjack/controller/BlackjackController.java | 12 ++++++------ src/main/java/blackjack/service/Game.java | 10 ++++++---- src/test/java/GameTest.java | 13 +++++-------- 3 files changed, 17 insertions(+), 18 deletions(-) diff --git a/src/main/java/blackjack/controller/BlackjackController.java b/src/main/java/blackjack/controller/BlackjackController.java index 7ccc010f746..6a9fc904128 100644 --- a/src/main/java/blackjack/controller/BlackjackController.java +++ b/src/main/java/blackjack/controller/BlackjackController.java @@ -20,13 +20,11 @@ import blackjack.view.OutputView; public class BlackjackController { - private final CardDistributor cardDistributor; - private final Game game; private static final RetryInput retryInput = new RetryInput(); + private final CardDistributor cardDistributor; public BlackjackController(CardDistributor cardDistributor) { this.cardDistributor = cardDistributor; - this.game = new Game(); } public void startGame() { @@ -39,8 +37,10 @@ public void startGame() { processTurn(players); // 플레이어 hit or stand playDealerTurn(dealer); + Game game = new Game(players, dealer); + calculateFinalScore(players, dealer); - calculateFinalGameResult(players, dealer); + calculateFinalGameResult(game); } private void setupInitialHand(List players, Dealer dealer, List playerNames) { @@ -55,8 +55,8 @@ private static List getPlayerNames() { ); } - private void calculateFinalGameResult(List players, Dealer dealer) { - GameResult gameResult = game.judgeTotalGameResult(players, dealer); + private void calculateFinalGameResult(Game game) { + GameResult gameResult = game.judgeTotalGameResult(); Map dealerResult = gameResult.dealerResult(); LinkedHashMap playerResult = gameResult.playerResults(); diff --git a/src/main/java/blackjack/service/Game.java b/src/main/java/blackjack/service/Game.java index 75766cbb848..b18c2e32d9f 100644 --- a/src/main/java/blackjack/service/Game.java +++ b/src/main/java/blackjack/service/Game.java @@ -10,14 +10,16 @@ import java.util.Map; public class Game { -// private final List players; -// private final Dealer dealer; + private final List players; + private final Dealer dealer; - public Game() { + public Game(List players, Dealer dealer) { + this.players = players; + this.dealer = dealer; } - public static GameResult judgeTotalGameResult(List players, Dealer dealer) { + public GameResult judgeTotalGameResult() { Map dealerResult = new HashMap<>(); LinkedHashMap playerResults = new LinkedHashMap<>(); diff --git a/src/test/java/GameTest.java b/src/test/java/GameTest.java index ff0afd86aa5..9b570f398ee 100644 --- a/src/test/java/GameTest.java +++ b/src/test/java/GameTest.java @@ -44,8 +44,7 @@ void compare_score_when_player_win() { dealer.receiveOneCard(new Card("10", "하트")); dealer.receiveOneCard(new Card("7", "스페이드")); - Game game = new Game(); - assertThat(game.compareScore(player, dealer)).isEqualTo(ScoreCompareResult.PLAYER_WIN); + assertThat(Game.compareScore(player, dealer)).isEqualTo(ScoreCompareResult.PLAYER_WIN); } @Test @@ -59,8 +58,7 @@ void compare_score_when_dealer_win() { dealer.receiveOneCard(new Card("10", "하트")); dealer.receiveOneCard(new Card("9", "스페이드")); - Game game = new Game(); - assertThat(game.compareScore(player, dealer)).isEqualTo(ScoreCompareResult.DEALER_WIN); + assertThat(Game.compareScore(player, dealer)).isEqualTo(ScoreCompareResult.DEALER_WIN); } @Test @@ -74,8 +72,7 @@ void compare_score_when_push() { dealer.receiveOneCard(new Card("10", "하트")); dealer.receiveOneCard(new Card("A", "스페이드")); - Game game = new Game(); - assertThat(game.compareScore(player, dealer)).isEqualTo(ScoreCompareResult.PUSH); + assertThat(Game.compareScore(player, dealer)).isEqualTo(ScoreCompareResult.PUSH); } @Test @@ -85,7 +82,7 @@ void judge_total_winner_result() { Player brown = createPlayer("brown", "10:하트", "10:클로버"); Dealer dealer = createDealer("3:다이아몬드", "9:클로버", "8:다이아몬드"); - Game game = new Game(); + Game game = new Game(List.of(pobi, jason, brown), dealer); Map dealerResult = Map.of( ScoreCompareResult.DEALER_WIN, 1, @@ -103,7 +100,7 @@ void judge_total_winner_result() { playerResults ); - GameResult actual = game.judgeTotalGameResult(List.of(pobi, jason, brown), dealer); + GameResult actual = game.judgeTotalGameResult(); assertThat(actual).usingRecursiveComparison().isEqualTo(expected); } From 590b60218f230de42fffac39d9b885810e2f9b9d Mon Sep 17 00:00:00 2001 From: sun Date: Thu, 12 Mar 2026 17:04:46 +0900 Subject: [PATCH 15/29] =?UTF-8?q?test:=20=EC=A0=84=EC=B2=B4=20=EC=B0=B8?= =?UTF-8?q?=EA=B0=80=EC=9E=90=20=EC=88=98=EC=9D=B5=20=EA=B3=84=EC=82=B0?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- src/test/java/PlayerBetTest.java | 41 ++++++++++++++++++++++++++++++++ 1 file changed, 41 insertions(+) diff --git a/src/test/java/PlayerBetTest.java b/src/test/java/PlayerBetTest.java index 6d1a0b6f504..cf4846c91f5 100644 --- a/src/test/java/PlayerBetTest.java +++ b/src/test/java/PlayerBetTest.java @@ -1,9 +1,16 @@ import static org.assertj.core.api.AssertionsForClassTypes.assertThat; import blackjack.domain.Card; +import blackjack.domain.Dealer; +import blackjack.domain.GameResult; +import blackjack.domain.Participant; import blackjack.domain.Player; import blackjack.domain.PlayerBetting; import blackjack.domain.ScoreCompareResult; +import blackjack.service.Game; +import java.util.HashMap; +import java.util.List; +import java.util.Map; import org.junit.jupiter.api.Test; public class PlayerBetTest { @@ -43,6 +50,31 @@ void calculate_profit_when_player_draw() { assertThat(playerBetting.calculateProfit(ScoreCompareResult.PUSH)).isEqualTo(0); } + @Test + void calculate_total_profit_result() { + Player winningPlayer = createPlayer("winningPlayer", "Q:스페이드", "10:하트"); + Player losingPlayer = createPlayer("losingPlayer", "9:스페이드", "8:하트"); + Dealer dealer = createDealer("10:스페이드", "8:하트"); + + PlayerBetting winningPlayerBetting = new PlayerBetting(winningPlayer, 1000); + PlayerBetting losingPlayerBetting = new PlayerBetting(losingPlayer, 1500); + + List playersBetting = List.of(winningPlayerBetting, losingPlayerBetting); + + Game game = new Game(playersBetting, dealer); + GameResult gameResult = game.judgeTotalGameResult(); + + ProfitResults actualProfitResults = game.calculateTotalProfitResults(gameResult); + Map expectedProfitMap = new HashMap<>() {{ + put(dealer, 500); + put(winningPlayer, 1000); + put(losingPlayer, -1500); + }}; + ProfitResults expectedProfitResults = new ProfitResults(expectedProfitMap); + + assertThat(actualProfitResults).isEqualTo(expectedProfitResults); + } + private Player createPlayer(String name, String... cards) { Player player = new Player(name); @@ -52,4 +84,13 @@ private Player createPlayer(String name, String... cards) { } return player; } + + private Dealer createDealer(String... cards) { + Dealer dealer = new Dealer(); + for (String card : cards) { + String[] parts = card.split(":"); + dealer.receiveOneCard(new Card(parts[0], parts[1])); + } + return dealer; + } } From b62c34458ed79812cc2c1ac95c3b5e101501a37f Mon Sep 17 00:00:00 2001 From: sun Date: Thu, 12 Mar 2026 17:40:23 +0900 Subject: [PATCH 16/29] =?UTF-8?q?refactor:=20=EB=B0=B0=ED=8C=85=20?= =?UTF-8?q?=EA=B8=88=EC=95=A1=20=EB=B0=8F=20=EC=88=98=EC=9D=B5=20=EA=B3=84?= =?UTF-8?q?=EC=82=B0=20=EC=B1=85=EC=9E=84=20Player=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/blackjack/domain/Player.java | 24 +++++++++-- .../java/blackjack/domain/PlayerBetting.java | 28 ------------- src/test/java/PlayerBetTest.java | 41 +++++++------------ 3 files changed, 35 insertions(+), 58 deletions(-) delete mode 100644 src/main/java/blackjack/domain/PlayerBetting.java diff --git a/src/main/java/blackjack/domain/Player.java b/src/main/java/blackjack/domain/Player.java index 2a01e35cebd..465a7bc3b36 100644 --- a/src/main/java/blackjack/domain/Player.java +++ b/src/main/java/blackjack/domain/Player.java @@ -5,17 +5,35 @@ public class Player extends Participant { private static final int BLACKJACK_SCORE = 21; private final String name; + private final int bettingAmount; - public Player(String name) { + public Player(String name, int bettingAmount) { this.name = name; + this.bettingAmount = bettingAmount; } public String getName() { return name; } - public boolean isBlackjack() { - return calculateTotalScore() == BLACKJACK_SCORE; + public double calculateProfit(ScoreCompareResult compareResult) { + if (compareResult == ScoreCompareResult.PLAYER_WIN) { + return calculateProfitWhenPlayerWins(); + } + if (compareResult == ScoreCompareResult.PLAYER_LOSE) { + return -bettingAmount; + } + return 0; + } + + private double calculateProfitWhenPlayerWins() { + if (isBlackjack()) { + return (bettingAmount * 1.5); + } + return bettingAmount; } + private boolean isBlackjack() { + return calculateTotalScore() == BLACKJACK_SCORE; + } } diff --git a/src/main/java/blackjack/domain/PlayerBetting.java b/src/main/java/blackjack/domain/PlayerBetting.java deleted file mode 100644 index 1cd4bdcac59..00000000000 --- a/src/main/java/blackjack/domain/PlayerBetting.java +++ /dev/null @@ -1,28 +0,0 @@ -package blackjack.domain; - -public class PlayerBetting { - private final Player player; - private final int bettingAmount; - - public PlayerBetting(Player player, int bettingAmount) { - this.player = player; - this.bettingAmount = bettingAmount; - } - - public double calculateProfit(ScoreCompareResult compareResult) { - if (compareResult == ScoreCompareResult.PLAYER_WIN) { - return calculateProfitWhenPlayerWins(); - } - if (compareResult == ScoreCompareResult.PLAYER_LOSE) { - return -bettingAmount; - } - return 0; - } - - private double calculateProfitWhenPlayerWins() { - if (player.isBlackjack()) { - return (bettingAmount * 1.5); - } - return bettingAmount; - } -} diff --git a/src/test/java/PlayerBetTest.java b/src/test/java/PlayerBetTest.java index cf4846c91f5..6f1428cd3b0 100644 --- a/src/test/java/PlayerBetTest.java +++ b/src/test/java/PlayerBetTest.java @@ -5,7 +5,7 @@ import blackjack.domain.GameResult; import blackjack.domain.Participant; import blackjack.domain.Player; -import blackjack.domain.PlayerBetting; +import blackjack.domain.ProfitResults; import blackjack.domain.ScoreCompareResult; import blackjack.service.Game; import java.util.HashMap; @@ -16,52 +16,39 @@ public class PlayerBetTest { @Test void calculate_profit_when_player_win_except_blackjack() { - Player player = new Player("player"); + Player player = new Player("player", 1000); - PlayerBetting playerBetting = new PlayerBetting(player, 1000); - - assertThat(playerBetting.calculateProfit(ScoreCompareResult.PLAYER_WIN)).isEqualTo(1000); + assertThat(player.calculateProfit(ScoreCompareResult.PLAYER_WIN)).isEqualTo(1000); } @Test void calculate_profit_when_player_win_with_blackjack() { - Player player = createPlayer("player", "A:스페이드", "10:하트"); - - PlayerBetting playerBetting = new PlayerBetting(player, 1000); + Player player = createPlayer("player", 1000, "A:스페이드", "10:하트"); - assertThat(playerBetting.calculateProfit(ScoreCompareResult.PLAYER_WIN)).isEqualTo(1500); + assertThat(player.calculateProfit(ScoreCompareResult.PLAYER_WIN)).isEqualTo(1500); } @Test void calculate_profit_when_player_lose() { - Player player = new Player("player"); - - PlayerBetting playerBetting = new PlayerBetting(player, 1000); + Player player = new Player("player", 1000); - assertThat(playerBetting.calculateProfit(ScoreCompareResult.PLAYER_LOSE)).isEqualTo(-1000); + assertThat(player.calculateProfit(ScoreCompareResult.PLAYER_LOSE)).isEqualTo(-1000); } @Test void calculate_profit_when_player_draw() { - Player player = new Player("player"); + Player player = new Player("player", 1000); - PlayerBetting playerBetting = new PlayerBetting(player, 1000); - - assertThat(playerBetting.calculateProfit(ScoreCompareResult.PUSH)).isEqualTo(0); + assertThat(player.calculateProfit(ScoreCompareResult.PUSH)).isEqualTo(0); } @Test void calculate_total_profit_result() { - Player winningPlayer = createPlayer("winningPlayer", "Q:스페이드", "10:하트"); - Player losingPlayer = createPlayer("losingPlayer", "9:스페이드", "8:하트"); + Player winningPlayer = createPlayer("winningPlayer", 1000, "Q:스페이드", "10:하트"); + Player losingPlayer = createPlayer("losingPlayer", 1500, "9:스페이드", "8:하트"); Dealer dealer = createDealer("10:스페이드", "8:하트"); - PlayerBetting winningPlayerBetting = new PlayerBetting(winningPlayer, 1000); - PlayerBetting losingPlayerBetting = new PlayerBetting(losingPlayer, 1500); - - List playersBetting = List.of(winningPlayerBetting, losingPlayerBetting); - - Game game = new Game(playersBetting, dealer); + Game game = new Game(List.of(winningPlayer, losingPlayer), dealer); GameResult gameResult = game.judgeTotalGameResult(); ProfitResults actualProfitResults = game.calculateTotalProfitResults(gameResult); @@ -76,8 +63,8 @@ void calculate_total_profit_result() { } - private Player createPlayer(String name, String... cards) { - Player player = new Player(name); + private Player createPlayer(String name, int bettingAmount, String... cards) { + Player player = new Player(name, bettingAmount); for (String card : cards) { String[] parts = card.split(":"); player.receiveOneCard(new Card(parts[0], parts[1])); From 7f65b27aaafee1618edf6bd014737e5fe62492da Mon Sep 17 00:00:00 2001 From: sun Date: Thu, 12 Mar 2026 17:52:35 +0900 Subject: [PATCH 17/29] =?UTF-8?q?refactor:=20=EB=B8=94=EB=9E=99=EC=9E=AD?= =?UTF-8?q?=20=ED=8C=90=EB=B3=84=20=EC=B1=85=EC=9E=84=20=EC=9D=B4=EB=8F=99?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- src/main/java/blackjack/domain/Cards.java | 4 ++++ src/main/java/blackjack/domain/Participant.java | 9 +++++++++ src/main/java/blackjack/domain/Player.java | 12 ++++++------ 3 files changed, 19 insertions(+), 6 deletions(-) diff --git a/src/main/java/blackjack/domain/Cards.java b/src/main/java/blackjack/domain/Cards.java index 75989eec445..528da9d60c6 100644 --- a/src/main/java/blackjack/domain/Cards.java +++ b/src/main/java/blackjack/domain/Cards.java @@ -41,6 +41,10 @@ public List getCardNames() { return cardNames; } + public int getCardCount() { + return cards.size(); + } + private int countAces() { int count = 0; for (Card card : cards) { diff --git a/src/main/java/blackjack/domain/Participant.java b/src/main/java/blackjack/domain/Participant.java index af62a9f4d14..9b4b4d9dfd1 100644 --- a/src/main/java/blackjack/domain/Participant.java +++ b/src/main/java/blackjack/domain/Participant.java @@ -4,6 +4,8 @@ public abstract class Participant { private static final int BUST_SCORE = 21; + private static final int BLACKJACK_SCORE = 21; + private static final int BLACKJACK_CARD_COUNT = 2; private final Cards drawnCards; @@ -26,4 +28,11 @@ public boolean isBust() { public int calculateTotalScore() { return drawnCards.sumScore(); } + + public boolean isBlackjack() { + if (drawnCards.getCardCount() != BLACKJACK_CARD_COUNT) { + return false; + } + return drawnCards.sumScore() == BLACKJACK_SCORE; + } } diff --git a/src/main/java/blackjack/domain/Player.java b/src/main/java/blackjack/domain/Player.java index 465a7bc3b36..3bcd9eba840 100644 --- a/src/main/java/blackjack/domain/Player.java +++ b/src/main/java/blackjack/domain/Player.java @@ -2,11 +2,15 @@ public class Player extends Participant { - private static final int BLACKJACK_SCORE = 21; + private static final double BLACKJACK_PROFIT_RATE = 1.5; private final String name; private final int bettingAmount; + public Player(String name) { + this(name, 0); + } + public Player(String name, int bettingAmount) { this.name = name; this.bettingAmount = bettingAmount; @@ -28,12 +32,8 @@ public double calculateProfit(ScoreCompareResult compareResult) { private double calculateProfitWhenPlayerWins() { if (isBlackjack()) { - return (bettingAmount * 1.5); + return (bettingAmount * BLACKJACK_PROFIT_RATE); } return bettingAmount; } - - private boolean isBlackjack() { - return calculateTotalScore() == BLACKJACK_SCORE; - } } From e36594e6c1dfc8257181bf7a246e7807abbccf9f Mon Sep 17 00:00:00 2001 From: sun Date: Fri, 13 Mar 2026 00:14:54 +0900 Subject: [PATCH 18/29] =?UTF-8?q?feat:=20=EC=A0=84=EC=B2=B4=20=EC=88=98?= =?UTF-8?q?=EC=9D=B5=20=EA=B3=84=EC=82=B0?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- README.md | 8 ++++---- .../java/blackjack/domain/ProfitResults.java | 6 ++++++ src/main/java/blackjack/service/Game.java | 20 +++++++++++++++++++ src/test/java/PlayerBetTest.java | 13 ++++-------- 4 files changed, 34 insertions(+), 13 deletions(-) create mode 100644 src/main/java/blackjack/domain/ProfitResults.java diff --git a/README.md b/README.md index cd83685c681..b5ee23dcbd1 100644 --- a/README.md +++ b/README.md @@ -20,21 +20,21 @@ - [x] 버스트인 사람 패배 - 둘다 버스트인 경우 - [x] 무승부 -- [ ] 수익 계산 +- [x] 수익 계산 - [x] 플레이어는 승리시 배팅금액 만큼 수익을 얻는다. - [x] 플레이어가 블랙잭인지 판단할 수 있다. - [x] 참가자가 블랙잭인 경우 배팅금액의 1.5배 수익을 얻는다. - [x] 플레이어는 패배시 배팅금액 만큼 손해를 본다 - [x] 플레이어는 무승부시 배팅금액 만큼 수익도 손해도 보지 않는다. - - [ ] 딜러는 플레이어들이 패배한 금액 만큼 수익을 얻는다. - - [ ] 딜러는 플레이어들이 승리한 금액 만큼 손해를 본다. + - [x] 딜러는 플레이어들이 패배한 금액 만큼 수익을 얻는다. + - [x] 딜러는 플레이어들이 승리한 금액 만큼 손해를 본다. - [x] 게임진행 - [x] 초기 시작시 인당 카드 2장씩 지급 - [x] 참가자 한명이 버스트가 되거나 카드를 안받는다 선택한 경우 다음 참가자 차례로 넘어감 - [x] 마지막 참가자가 버스트가 되거나 카드를 안받을 경우 게임 종료 - [x] 전체 플레이어 승패 결과 계산 - - [ ] 전체 참가자 수익 계산 + - [x] 전체 참가자 수익 계산 -[x] 입력 - [x] 게임 참가자 이름 입력 diff --git a/src/main/java/blackjack/domain/ProfitResults.java b/src/main/java/blackjack/domain/ProfitResults.java new file mode 100644 index 00000000000..3d3ed9adc5c --- /dev/null +++ b/src/main/java/blackjack/domain/ProfitResults.java @@ -0,0 +1,6 @@ +package blackjack.domain; + +import java.util.Map; + +public record ProfitResults(Double dealerProfit, Map playerProfit) { +} diff --git a/src/main/java/blackjack/service/Game.java b/src/main/java/blackjack/service/Game.java index b18c2e32d9f..a190c1bb15b 100644 --- a/src/main/java/blackjack/service/Game.java +++ b/src/main/java/blackjack/service/Game.java @@ -2,12 +2,15 @@ import blackjack.domain.Dealer; import blackjack.domain.GameResult; +import blackjack.domain.Participant; import blackjack.domain.Player; +import blackjack.domain.ProfitResults; import blackjack.domain.ScoreCompareResult; import java.util.HashMap; import java.util.LinkedHashMap; import java.util.List; import java.util.Map; +import java.util.Map.Entry; public class Game { private final List players; @@ -32,6 +35,23 @@ public GameResult judgeTotalGameResult() { return new GameResult(dealerResult, playerResults); } + public ProfitResults calculateTotalProfitResults(GameResult gameResult) { + LinkedHashMap playerResults = gameResult.playerResults(); + + double dealerProfit = 0; + Map playerProfits = new LinkedHashMap<>(); + for (Map.Entry entry : playerResults.entrySet()) { + Player player = entry.getKey(); + ScoreCompareResult result = entry.getValue(); + + double profit = player.calculateProfit(result); + dealerProfit += profit * -1.0; + playerProfits.put(player, profit); + } + + return new ProfitResults(dealerProfit, playerProfits); + } + private static ScoreCompareResult toPlayerResult(ScoreCompareResult result) { if (result == ScoreCompareResult.DEALER_WIN) { return ScoreCompareResult.PLAYER_LOSE; diff --git a/src/test/java/PlayerBetTest.java b/src/test/java/PlayerBetTest.java index 6f1428cd3b0..c8a344c7bbe 100644 --- a/src/test/java/PlayerBetTest.java +++ b/src/test/java/PlayerBetTest.java @@ -3,12 +3,10 @@ import blackjack.domain.Card; import blackjack.domain.Dealer; import blackjack.domain.GameResult; -import blackjack.domain.Participant; import blackjack.domain.Player; import blackjack.domain.ProfitResults; import blackjack.domain.ScoreCompareResult; import blackjack.service.Game; -import java.util.HashMap; import java.util.List; import java.util.Map; import org.junit.jupiter.api.Test; @@ -52,13 +50,10 @@ void calculate_total_profit_result() { GameResult gameResult = game.judgeTotalGameResult(); ProfitResults actualProfitResults = game.calculateTotalProfitResults(gameResult); - Map expectedProfitMap = new HashMap<>() {{ - put(dealer, 500); - put(winningPlayer, 1000); - put(losingPlayer, -1500); - }}; - ProfitResults expectedProfitResults = new ProfitResults(expectedProfitMap); - + ProfitResults expectedProfitResults = new ProfitResults(500.0, Map.of( + winningPlayer, 1000.0, + losingPlayer, -1500.0 + )); assertThat(actualProfitResults).isEqualTo(expectedProfitResults); } From 8fb3ad3c2b79b30948e497d6c8e652b87705cf1d Mon Sep 17 00:00:00 2001 From: sun Date: Fri, 13 Mar 2026 00:22:48 +0900 Subject: [PATCH 19/29] =?UTF-8?q?docs:=20=EB=B8=94=EB=9E=99=EC=9E=AD=20?= =?UTF-8?q?=ED=8C=90=EB=8B=A8=20=EA=B8=B0=EB=8A=A5=20=EB=AA=85=EC=84=B8=20?= =?UTF-8?q?=EC=B6=94=EA=B0=80?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- README.md | 1 + 1 file changed, 1 insertion(+) diff --git a/README.md b/README.md index b5ee23dcbd1..f4376979a8a 100644 --- a/README.md +++ b/README.md @@ -23,6 +23,7 @@ - [x] 수익 계산 - [x] 플레이어는 승리시 배팅금액 만큼 수익을 얻는다. - [x] 플레이어가 블랙잭인지 판단할 수 있다. + - 처음 받은 2개의 카드가 21인 경우 블랙잭으로 판단 - [x] 참가자가 블랙잭인 경우 배팅금액의 1.5배 수익을 얻는다. - [x] 플레이어는 패배시 배팅금액 만큼 손해를 본다 - [x] 플레이어는 무승부시 배팅금액 만큼 수익도 손해도 보지 않는다. From feb159e0e74d56e382fd02c16c8f687a6a55fd59 Mon Sep 17 00:00:00 2001 From: sun Date: Fri, 13 Mar 2026 10:40:36 +0900 Subject: [PATCH 20/29] =?UTF-8?q?feat:=20=EB=B0=B0=ED=8C=85=20=EA=B8=88?= =?UTF-8?q?=EC=95=A1=20=EC=9E=85=EB=A0=A5=20=EC=B6=94=EA=B0=80?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- README.md | 2 +- .../blackjack/controller/BlackjackController.java | 10 ++++++---- src/main/java/blackjack/utils/InputParser.java | 12 ++++++++++++ src/main/java/blackjack/view/InputView.java | 6 ++++++ 4 files changed, 25 insertions(+), 5 deletions(-) diff --git a/README.md b/README.md index f4376979a8a..95c0e61a09d 100644 --- a/README.md +++ b/README.md @@ -39,7 +39,7 @@ -[x] 입력 - [x] 게임 참가자 이름 입력 - - [ ] 게임 배팅 금액 입력 + - [x] 게임 배팅 금액 입력 - [x] 카드 더받기 유무 입력 - [x] 출력 - [x] 분배 받은 카드 목록 출력 diff --git a/src/main/java/blackjack/controller/BlackjackController.java b/src/main/java/blackjack/controller/BlackjackController.java index 6a9fc904128..a3e242b253b 100644 --- a/src/main/java/blackjack/controller/BlackjackController.java +++ b/src/main/java/blackjack/controller/BlackjackController.java @@ -29,7 +29,7 @@ public BlackjackController(CardDistributor cardDistributor) { public void startGame() { List playerNames = getPlayerNames(); - List players = getPlayers(playerNames); + List players = createPlayersWithBettingAmounts(playerNames); Dealer dealer = new Dealer(); setupInitialHand(players, dealer, playerNames); // 2장씩 카드 분배 @@ -105,10 +105,13 @@ private static void printInitialCards(List players, Dealer dealer) { OutputView.printAllUserCards(playersCardsName, dealer.getOneCardName()); } - private List getPlayers(List playerNames) { + private List createPlayersWithBettingAmounts(List playerNames) { List players = new ArrayList<>(); for (String playerName : playerNames) { - players.add(new Player(playerName)); + String bettingAmountInput = InputView.askToPlayerBettingAmount(playerName); + int bettingAmount = retryInput.read( + () -> InputParser.parseBetAmount(bettingAmountInput)); + players.add(new Player(playerName, bettingAmount)); } return players; } @@ -142,5 +145,4 @@ private boolean isHit(String hitOrStand) { } throw new IllegalArgumentException("잘못된 입력입니다. y 또는 n을 입력해주세요"); } - } diff --git a/src/main/java/blackjack/utils/InputParser.java b/src/main/java/blackjack/utils/InputParser.java index 754578910d3..9076898ca81 100644 --- a/src/main/java/blackjack/utils/InputParser.java +++ b/src/main/java/blackjack/utils/InputParser.java @@ -19,4 +19,16 @@ public static List splitPlayerNames(String input) { .map(String::trim) .toList(); } + + public static int parseBetAmount(String input) { + try { + int amount = Integer.parseInt(input.trim()); + if (amount <= 0) { + throw new IllegalArgumentException("[ERROR] 베팅 금액은 양수여야 합니다. 다시 입력해주세요."); + } + return amount; + } catch (NumberFormatException e) { + throw new IllegalArgumentException("[ERROR] 유효한 숫자를 입력해주세요. 다시 입력해주세요."); + } + } } diff --git a/src/main/java/blackjack/view/InputView.java b/src/main/java/blackjack/view/InputView.java index fad744f5fd1..42dbc3d7cc0 100644 --- a/src/main/java/blackjack/view/InputView.java +++ b/src/main/java/blackjack/view/InputView.java @@ -6,6 +6,7 @@ public class InputView { private static final String ASK_PLAYER_NAMES = "게임에 참여할 사람의 이름을 입력하세요.(쉼표 기준으로 분리)"; private static final String ASK_HIT_OR_STAND = "%s는 한장의 카드를 더 받겠습니까?(예는 y, 아니오는 n)\n"; + private static final String ASK_TO_PLAYER_BETTING_AMOUNT = "%s의 베팅 금액은?\n"; private static final Scanner scanner = new Scanner(System.in); public static String askPlayerNames() { @@ -17,4 +18,9 @@ public static String askHitOrStand(String playerName) { System.out.printf(ASK_HIT_OR_STAND, playerName); return scanner.nextLine(); } + + public static String askToPlayerBettingAmount(String playerName) { + System.out.printf(ASK_TO_PLAYER_BETTING_AMOUNT, playerName); + return scanner.nextLine(); + } } From 42c92e0fd1966e2b76a89ec586b66a6cb040d1b6 Mon Sep 17 00:00:00 2001 From: sun Date: Fri, 13 Mar 2026 10:44:23 +0900 Subject: [PATCH 21/29] =?UTF-8?q?fix:=20=EB=B0=B0=ED=8C=85=EA=B8=88?= =?UTF-8?q?=EC=95=A1=20=EC=9E=AC=EC=9E=85=EB=A0=A5=20=EC=B2=98=EB=A6=AC?= =?UTF-8?q?=EC=8B=9C=20input=20=EB=8B=A4=EC=8B=9C=20=EC=95=88=EB=B0=9B?= =?UTF-8?q?=EC=95=84=20=EB=AC=B4=ED=95=9C=EB=A3=A8=ED=94=84=20=EB=B0=9C?= =?UTF-8?q?=EC=83=9D=20=EC=88=98=EC=A0=95?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- src/main/java/blackjack/controller/BlackjackController.java | 3 +-- src/main/java/blackjack/utils/InputParser.java | 2 +- 2 files changed, 2 insertions(+), 3 deletions(-) diff --git a/src/main/java/blackjack/controller/BlackjackController.java b/src/main/java/blackjack/controller/BlackjackController.java index a3e242b253b..1ca9e5e28e7 100644 --- a/src/main/java/blackjack/controller/BlackjackController.java +++ b/src/main/java/blackjack/controller/BlackjackController.java @@ -108,9 +108,8 @@ private static void printInitialCards(List players, Dealer dealer) { private List createPlayersWithBettingAmounts(List playerNames) { List players = new ArrayList<>(); for (String playerName : playerNames) { - String bettingAmountInput = InputView.askToPlayerBettingAmount(playerName); int bettingAmount = retryInput.read( - () -> InputParser.parseBetAmount(bettingAmountInput)); + () -> InputParser.parseBetAmount(InputView.askToPlayerBettingAmount(playerName))); players.add(new Player(playerName, bettingAmount)); } return players; diff --git a/src/main/java/blackjack/utils/InputParser.java b/src/main/java/blackjack/utils/InputParser.java index 9076898ca81..2dc9e34f933 100644 --- a/src/main/java/blackjack/utils/InputParser.java +++ b/src/main/java/blackjack/utils/InputParser.java @@ -22,7 +22,7 @@ public static List splitPlayerNames(String input) { public static int parseBetAmount(String input) { try { - int amount = Integer.parseInt(input.trim()); + int amount = Integer.parseInt(input); if (amount <= 0) { throw new IllegalArgumentException("[ERROR] 베팅 금액은 양수여야 합니다. 다시 입력해주세요."); } From 23997d6d6104fa85e021c373d380ac20777dab69 Mon Sep 17 00:00:00 2001 From: sun Date: Fri, 13 Mar 2026 11:09:00 +0900 Subject: [PATCH 22/29] =?UTF-8?q?feat:=20=EC=B5=9C=EC=A2=85=20=EC=88=98?= =?UTF-8?q?=EC=9D=B5=20=EA=B2=B0=EA=B3=BC=20=EC=B6=9C=EB=A0=A5?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- README.md | 2 +- .../controller/BlackjackController.java | 21 ++++++------ .../domain/PlayerProfitResultDto.java | 8 +++++ src/main/java/blackjack/view/OutputView.java | 32 +++++-------------- 4 files changed, 29 insertions(+), 34 deletions(-) create mode 100644 src/main/java/blackjack/domain/PlayerProfitResultDto.java diff --git a/README.md b/README.md index 95c0e61a09d..d08ad3c6ef4 100644 --- a/README.md +++ b/README.md @@ -44,4 +44,4 @@ - [x] 출력 - [x] 분배 받은 카드 목록 출력 - [x] 딜러와 참가자 카드 합계 결과 출력 - - [ ] 최종 수익 출력 \ No newline at end of file + - [x] 최종 수익 출력 \ No newline at end of file diff --git a/src/main/java/blackjack/controller/BlackjackController.java b/src/main/java/blackjack/controller/BlackjackController.java index 1ca9e5e28e7..f7702da30c7 100644 --- a/src/main/java/blackjack/controller/BlackjackController.java +++ b/src/main/java/blackjack/controller/BlackjackController.java @@ -6,13 +6,14 @@ import blackjack.domain.PlayerCardsName; import blackjack.domain.PlayerFinalCardsScore; import blackjack.domain.PlayerFinalResult; +import blackjack.domain.PlayerProfitResultDto; +import blackjack.domain.ProfitResults; import blackjack.domain.ScoreCompareResult; import blackjack.service.CardDistributor; import blackjack.service.Game; import blackjack.utils.InputParser; import blackjack.utils.RetryInput; import java.util.ArrayList; -import java.util.LinkedHashMap; import java.util.List; import java.util.Map; import java.util.Map.Entry; @@ -40,7 +41,7 @@ public void startGame() { Game game = new Game(players, dealer); calculateFinalScore(players, dealer); - calculateFinalGameResult(game); + calculateFinalGameProfitResult(game); } private void setupInitialHand(List players, Dealer dealer, List playerNames) { @@ -55,16 +56,18 @@ private static List getPlayerNames() { ); } - private void calculateFinalGameResult(Game game) { + private void calculateFinalGameProfitResult(Game game) { GameResult gameResult = game.judgeTotalGameResult(); - Map dealerResult = gameResult.dealerResult(); + ProfitResults profitResults = game.calculateTotalProfitResults(gameResult); - LinkedHashMap playerResult = gameResult.playerResults(); - List playerNameResult = new ArrayList<>(); - for (Entry entry : playerResult.entrySet()) { - playerNameResult.add(new PlayerFinalResult(entry.getKey().getName(), entry.getValue())); + double dealerProfit = profitResults.dealerProfit(); + Map playerProfit = profitResults.playerProfit(); + + List playerNameProfitResult = new ArrayList<>(); + for (Entry entry : playerProfit.entrySet()) { + playerNameProfitResult.add(PlayerProfitResultDto.from(entry.getKey(), entry.getValue())); } - OutputView.printFinalResult(dealerResult, playerNameResult); + OutputView.printFinalProfitResult(dealerProfit, playerNameProfitResult); } private void playDealerTurn(Dealer dealer) { diff --git a/src/main/java/blackjack/domain/PlayerProfitResultDto.java b/src/main/java/blackjack/domain/PlayerProfitResultDto.java new file mode 100644 index 00000000000..8522200284a --- /dev/null +++ b/src/main/java/blackjack/domain/PlayerProfitResultDto.java @@ -0,0 +1,8 @@ +package blackjack.domain; + +public record PlayerProfitResultDto(String playerName, double profit) { + + public static PlayerProfitResultDto from(Player player, Double profit) { + return new PlayerProfitResultDto(player.getName(), profit); + } +} diff --git a/src/main/java/blackjack/view/OutputView.java b/src/main/java/blackjack/view/OutputView.java index 54afe0cbb60..6ff40c307b7 100644 --- a/src/main/java/blackjack/view/OutputView.java +++ b/src/main/java/blackjack/view/OutputView.java @@ -2,10 +2,9 @@ import blackjack.domain.PlayerCardsName; import blackjack.domain.PlayerFinalCardsScore; -import blackjack.domain.PlayerFinalResult; +import blackjack.domain.PlayerProfitResultDto; import blackjack.domain.ScoreCompareResult; import java.util.List; -import java.util.Map; public class OutputView { @@ -51,30 +50,15 @@ public static void printFinalCardScores(List playerFinalC } } - public static void printFinalResult( - Map dealerResult, - List playerResults) { + public static void printFinalProfitResult( + double dealerProfit, + List playersProfitResults) { System.out.println(); - System.out.println("## 최종 승패"); - int wins = dealerResult.getOrDefault(ScoreCompareResult.DEALER_WIN, 0); - int loses = dealerResult.getOrDefault(ScoreCompareResult.DEALER_LOSE, 0); - int pushes = dealerResult.getOrDefault(ScoreCompareResult.PUSH, 0); - System.out.printf("딜러: %d승 %d무 %d패%n", wins, pushes, loses); + System.out.println("## 최종 수익"); + System.out.printf("딜러: %d%n", (int) dealerProfit); - for (PlayerFinalResult playerResult : playerResults) { - System.out.println(playerResult.name() + ": " + toKorean(playerResult.scoreCompareResult())); + for (PlayerProfitResultDto playerProfitResult : playersProfitResults) { + System.out.println(playerProfitResult.playerName() + ": " + (int) playerProfitResult.profit()); } } - - private static String toKorean(ScoreCompareResult result) { - if (result == ScoreCompareResult.PLAYER_WIN) { - return "승"; - } - if (result == ScoreCompareResult.PLAYER_LOSE) { - return "패"; - } - return "무"; - } - - } From 780658fc9245aecd8ccb8a07853c2ef2cd22408f Mon Sep 17 00:00:00 2001 From: sun Date: Fri, 13 Mar 2026 11:11:16 +0900 Subject: [PATCH 23/29] =?UTF-8?q?chore:=20=EB=AF=B8=EC=82=AC=EC=9A=A9=20?= =?UTF-8?q?=ED=81=B4=EB=9E=98=EC=8A=A4=20=EB=B0=8F=20import=EB=AC=B8=20?= =?UTF-8?q?=EC=82=AD=EC=A0=9C?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../java/blackjack/controller/BlackjackController.java | 2 -- src/main/java/blackjack/domain/Card.java | 6 +++--- src/main/java/blackjack/domain/PlayerFinalResult.java | 5 ----- src/main/java/blackjack/service/Game.java | 2 -- src/main/java/blackjack/view/OutputView.java | 1 - src/test/java/CardDistributorTest.java | 10 ---------- 6 files changed, 3 insertions(+), 23 deletions(-) delete mode 100644 src/main/java/blackjack/domain/PlayerFinalResult.java delete mode 100644 src/test/java/CardDistributorTest.java diff --git a/src/main/java/blackjack/controller/BlackjackController.java b/src/main/java/blackjack/controller/BlackjackController.java index f7702da30c7..9b405ad875e 100644 --- a/src/main/java/blackjack/controller/BlackjackController.java +++ b/src/main/java/blackjack/controller/BlackjackController.java @@ -5,10 +5,8 @@ import blackjack.domain.Player; import blackjack.domain.PlayerCardsName; import blackjack.domain.PlayerFinalCardsScore; -import blackjack.domain.PlayerFinalResult; import blackjack.domain.PlayerProfitResultDto; import blackjack.domain.ProfitResults; -import blackjack.domain.ScoreCompareResult; import blackjack.service.CardDistributor; import blackjack.service.Game; import blackjack.utils.InputParser; diff --git a/src/main/java/blackjack/domain/Card.java b/src/main/java/blackjack/domain/Card.java index 32dc033ac68..a1bad4fe0d1 100644 --- a/src/main/java/blackjack/domain/Card.java +++ b/src/main/java/blackjack/domain/Card.java @@ -36,11 +36,11 @@ public boolean equals(Object o) { if (this == o) { return true; } - if (!(o instanceof Card card)) { + if (!(o instanceof Card(String rank1, String shape1))) { return false; } - return rank.equals(card.rank) && - shape.equals(card.shape); + return rank.equals(rank1) && + shape.equals(shape1); } } diff --git a/src/main/java/blackjack/domain/PlayerFinalResult.java b/src/main/java/blackjack/domain/PlayerFinalResult.java deleted file mode 100644 index e8961d583ef..00000000000 --- a/src/main/java/blackjack/domain/PlayerFinalResult.java +++ /dev/null @@ -1,5 +0,0 @@ -package blackjack.domain; - -public record PlayerFinalResult(String name, ScoreCompareResult scoreCompareResult) { - -} diff --git a/src/main/java/blackjack/service/Game.java b/src/main/java/blackjack/service/Game.java index a190c1bb15b..277003bbe18 100644 --- a/src/main/java/blackjack/service/Game.java +++ b/src/main/java/blackjack/service/Game.java @@ -2,7 +2,6 @@ import blackjack.domain.Dealer; import blackjack.domain.GameResult; -import blackjack.domain.Participant; import blackjack.domain.Player; import blackjack.domain.ProfitResults; import blackjack.domain.ScoreCompareResult; @@ -10,7 +9,6 @@ import java.util.LinkedHashMap; import java.util.List; import java.util.Map; -import java.util.Map.Entry; public class Game { private final List players; diff --git a/src/main/java/blackjack/view/OutputView.java b/src/main/java/blackjack/view/OutputView.java index 6ff40c307b7..046fc23adf3 100644 --- a/src/main/java/blackjack/view/OutputView.java +++ b/src/main/java/blackjack/view/OutputView.java @@ -3,7 +3,6 @@ import blackjack.domain.PlayerCardsName; import blackjack.domain.PlayerFinalCardsScore; import blackjack.domain.PlayerProfitResultDto; -import blackjack.domain.ScoreCompareResult; import java.util.List; public class OutputView { diff --git a/src/test/java/CardDistributorTest.java b/src/test/java/CardDistributorTest.java deleted file mode 100644 index 9e8ea25f416..00000000000 --- a/src/test/java/CardDistributorTest.java +++ /dev/null @@ -1,10 +0,0 @@ -import static org.assertj.core.api.Assertions.assertThat; -import static org.mockito.Mockito.mock; -import static org.mockito.Mockito.when; - -import java.util.Random; -import org.junit.jupiter.api.Test; - -public class CardDistributorTest { - -} From 4daa2107f90d61e61379db6893d7166bac55b6da Mon Sep 17 00:00:00 2001 From: sun Date: Fri, 13 Mar 2026 13:55:52 +0900 Subject: [PATCH 24/29] =?UTF-8?q?chore:=20record=20=EC=82=AC=EC=9A=A9?= =?UTF-8?q?=EC=9C=BC=EB=A1=9C=20=EB=B6=88=ED=95=84=EC=9A=94=20=EB=A9=94?= =?UTF-8?q?=EC=84=9C=EB=93=9C=20=EC=A0=9C=EA=B1=B0?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- src/main/java/blackjack/domain/Card.java | 13 ------------- 1 file changed, 13 deletions(-) diff --git a/src/main/java/blackjack/domain/Card.java b/src/main/java/blackjack/domain/Card.java index a1bad4fe0d1..908b95c5654 100644 --- a/src/main/java/blackjack/domain/Card.java +++ b/src/main/java/blackjack/domain/Card.java @@ -30,17 +30,4 @@ private static int convertToNumber(String rank) { } return score; } - - @Override - public boolean equals(Object o) { - if (this == o) { - return true; - } - if (!(o instanceof Card(String rank1, String shape1))) { - return false; - } - return rank.equals(rank1) && - shape.equals(shape1); - } - } From 63b8ebd59451421924f51f80b4bd373c32b537ee Mon Sep 17 00:00:00 2001 From: sun Date: Fri, 13 Mar 2026 13:56:47 +0900 Subject: [PATCH 25/29] =?UTF-8?q?refactor:=20countAces=20=EB=A9=94?= =?UTF-8?q?=EC=84=9C=EB=93=9C=20depth=EC=B4=88=EA=B3=BC=20=EC=8A=A4?= =?UTF-8?q?=ED=8A=B8=EB=A6=BC=20=EC=82=AC=EC=9A=A9=EC=9C=BC=EB=A1=9C=20?= =?UTF-8?q?=EB=B3=80=EA=B2=BD?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- src/main/java/blackjack/domain/Cards.java | 8 +------- 1 file changed, 1 insertion(+), 7 deletions(-) diff --git a/src/main/java/blackjack/domain/Cards.java b/src/main/java/blackjack/domain/Cards.java index 528da9d60c6..f6e80721fdc 100644 --- a/src/main/java/blackjack/domain/Cards.java +++ b/src/main/java/blackjack/domain/Cards.java @@ -46,12 +46,6 @@ public int getCardCount() { } private int countAces() { - int count = 0; - for (Card card : cards) { - if (card.rank().equals("A")) { - count++; - } - } - return count; + return (int) cards.stream().filter(card -> card.rank().equals("A")).count(); } } \ No newline at end of file From 795f55f0e7ad50fe27f9a43e9f3bb536aa3e71d1 Mon Sep 17 00:00:00 2001 From: sun Date: Sun, 15 Mar 2026 10:22:06 +0900 Subject: [PATCH 26/29] =?UTF-8?q?refactor:=20rank,=20shape=20String=20->?= =?UTF-8?q?=20Enum=20=EC=82=AC=EC=9A=A9=20=EB=B3=80=EA=B2=BD?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- src/main/java/blackjack/domain/Card.java | 26 ++------- src/main/java/blackjack/domain/Cards.java | 2 +- src/main/java/blackjack/domain/Rank.java | 33 ++++++++++++ src/main/java/blackjack/domain/Shape.java | 18 +++++++ .../blackjack/service/RandomCardPicker.java | 21 +++++--- src/test/java/BustTest.java | 26 ++++----- src/test/java/CardTest.java | 22 +++----- src/test/java/CardsSumTest.java | 34 ++++++------ src/test/java/DealerTest.java | 18 ++++--- src/test/java/GameTest.java | 53 ++++++++++--------- src/test/java/PlayerBetTest.java | 28 +++++----- src/test/java/PlayerTest.java | 18 ++++--- src/test/java/RandomCardPickerTest.java | 8 +-- 13 files changed, 177 insertions(+), 130 deletions(-) create mode 100644 src/main/java/blackjack/domain/Rank.java create mode 100644 src/main/java/blackjack/domain/Shape.java diff --git a/src/main/java/blackjack/domain/Card.java b/src/main/java/blackjack/domain/Card.java index 908b95c5654..30d8d00b6e0 100644 --- a/src/main/java/blackjack/domain/Card.java +++ b/src/main/java/blackjack/domain/Card.java @@ -1,33 +1,13 @@ package blackjack.domain; -public record Card(String rank, String shape) { +public record Card(Rank rank, Shape shape) { public String getDisplayName() { - return rank + shape; + return rank.getName() + shape.getName(); } public int translateToScore() { - if (rank.equals("J") || rank.equals("Q") || rank.equals("K")) { - return 10; - } - if (rank.equals("A")) { - return 11; - } - - return convertToNumber(rank); + return rank.getScore(); } - private static int convertToNumber(String rank) { - int score; - try { - score = Integer.parseInt(rank); - } catch (IllegalArgumentException e) { - throw new IllegalArgumentException("J,Q,K 외의 문자열 입력은 불가능합니다."); - } - - if (score > 10 || score < 2) { - throw new IllegalArgumentException("2~10 사이의 숫자만 가능합니다."); - } - return score; - } } diff --git a/src/main/java/blackjack/domain/Cards.java b/src/main/java/blackjack/domain/Cards.java index f6e80721fdc..1b55dcfee10 100644 --- a/src/main/java/blackjack/domain/Cards.java +++ b/src/main/java/blackjack/domain/Cards.java @@ -46,6 +46,6 @@ public int getCardCount() { } private int countAces() { - return (int) cards.stream().filter(card -> card.rank().equals("A")).count(); + return (int) cards.stream().filter(card -> card.rank().equals(Rank.ACE)).count(); } } \ No newline at end of file diff --git a/src/main/java/blackjack/domain/Rank.java b/src/main/java/blackjack/domain/Rank.java new file mode 100644 index 00000000000..0421c5ff3db --- /dev/null +++ b/src/main/java/blackjack/domain/Rank.java @@ -0,0 +1,33 @@ +package blackjack.domain; + +public enum Rank { + TWO("2", 2), + THREE("3", 3), + FOUR("4", 4), + FIVE("5", 5), + SIX("6", 6), + SEVEN("7", 7), + EIGHT("8", 8), + NINE("9", 9), + TEN("10", 10), + JACK("J", 10), + QUEEN("Q", 10), + KING("K", 10), + ACE("A", 11); + + private final String name; + private final int score; + + Rank(String name, int score) { + this.name = name; + this.score = score; + } + + public String getName() { + return name; + } + + public int getScore() { + return score; + } +} diff --git a/src/main/java/blackjack/domain/Shape.java b/src/main/java/blackjack/domain/Shape.java new file mode 100644 index 00000000000..2d871615ddd --- /dev/null +++ b/src/main/java/blackjack/domain/Shape.java @@ -0,0 +1,18 @@ +package blackjack.domain; + +public enum Shape { + HEART("하트"), + DIAMOND("다이아몬드"), + CLUB("클로버"), + SPADE("스페이드"); + + private final String name; + + Shape(String name) { + this.name = name; + } + + public String getName() { + return name; + } +} diff --git a/src/main/java/blackjack/service/RandomCardPicker.java b/src/main/java/blackjack/service/RandomCardPicker.java index 46f056b47e5..a65bf80d20f 100644 --- a/src/main/java/blackjack/service/RandomCardPicker.java +++ b/src/main/java/blackjack/service/RandomCardPicker.java @@ -1,6 +1,8 @@ package blackjack.service; import blackjack.domain.Card; +import blackjack.domain.Rank; +import blackjack.domain.Shape; import java.util.ArrayList; import java.util.List; import java.util.Random; @@ -20,17 +22,22 @@ public Card drawCard() { } private List initializeNotDrawnCards() { - List ranks = List.of("2", "3", "4", "5", "6", "7", "8", "9", "10", "J", "Q", "K", "A"); - List shapes = List.of("하트", "스페이드", "다이아몬드", "클로버"); - + List ranks = List.of(Rank.values()); List notDrawnCards = new ArrayList<>(); - for (String rank : ranks) { - for (String shape : shapes) { - notDrawnCards.add(new Card(rank, shape)); - } + for (Rank rank : ranks) { + notDrawnCards.addAll(createCardsByRank(rank)); } return notDrawnCards; } + private List createCardsByRank(Rank rank) { + List shapes = List.of(Shape.values()); + List cardsByRank = new ArrayList<>(); + for (Shape shape : shapes) { + cardsByRank.add(new Card(rank, shape)); + } + return cardsByRank; + } + } diff --git a/src/test/java/BustTest.java b/src/test/java/BustTest.java index 3b49e58dd0e..8461ab8b73e 100644 --- a/src/test/java/BustTest.java +++ b/src/test/java/BustTest.java @@ -3,6 +3,8 @@ import blackjack.domain.Card; import blackjack.domain.Dealer; import blackjack.domain.Player; +import blackjack.domain.Rank; +import blackjack.domain.Shape; import org.junit.jupiter.api.Test; public class BustTest { @@ -10,9 +12,9 @@ public class BustTest { @Test void player_busts_when_sum_exceeds_21() { Player player = new Player("Alice"); - player.receiveOneCard(new Card("2", "하트")); - player.receiveOneCard(new Card("Q", "스페이드")); - player.receiveOneCard(new Card("10", "클로버")); + player.receiveOneCard(new Card(Rank.TWO, Shape.HEART)); + player.receiveOneCard(new Card(Rank.QUEEN, Shape.SPADE)); + player.receiveOneCard(new Card(Rank.TEN, Shape.CLUB)); assertThat(player.isBust()).isEqualTo(true); } @@ -20,9 +22,9 @@ void player_busts_when_sum_exceeds_21() { @Test void dealer_busts_when_sum_exceeds_21() { Dealer dealer = new Dealer(); - dealer.receiveOneCard(new Card("2", "하트")); - dealer.receiveOneCard(new Card("Q", "스페이드")); - dealer.receiveOneCard(new Card("10", "클로버")); + dealer.receiveOneCard(new Card(Rank.TWO, Shape.HEART)); + dealer.receiveOneCard(new Card(Rank.QUEEN, Shape.SPADE)); + dealer.receiveOneCard(new Card(Rank.TEN, Shape.CLUB)); assertThat(dealer.isBust()).isEqualTo(true); } @@ -30,9 +32,9 @@ void dealer_busts_when_sum_exceeds_21() { @Test void player_not_busts_when_sum_21_or_less() { Player player = new Player("Alice"); - player.receiveOneCard(new Card("A", "하트")); - player.receiveOneCard(new Card("Q", "스페이드")); - player.receiveOneCard(new Card("10", "클로버")); + player.receiveOneCard(new Card(Rank.ACE, Shape.HEART)); + player.receiveOneCard(new Card(Rank.QUEEN, Shape.SPADE)); + player.receiveOneCard(new Card(Rank.TEN, Shape.CLUB)); assertThat(player.isBust()).isEqualTo(false); } @@ -40,9 +42,9 @@ void player_not_busts_when_sum_21_or_less() { @Test void dealer_not_busts_when_sum_21_or_less() { Dealer dealer = new Dealer(); - dealer.receiveOneCard(new Card("A", "하트")); - dealer.receiveOneCard(new Card("Q", "스페이드")); - dealer.receiveOneCard(new Card("10", "클로버")); + dealer.receiveOneCard(new Card(Rank.ACE, Shape.HEART)); + dealer.receiveOneCard(new Card(Rank.QUEEN, Shape.SPADE)); + dealer.receiveOneCard(new Card(Rank.TEN, Shape.CLUB)); assertThat(dealer.isBust()).isEqualTo(false); } diff --git a/src/test/java/CardTest.java b/src/test/java/CardTest.java index 1d758ae03b0..d6ec2b04dee 100644 --- a/src/test/java/CardTest.java +++ b/src/test/java/CardTest.java @@ -2,18 +2,17 @@ import static org.assertj.core.api.Assertions.assertThatThrownBy; import blackjack.domain.Card; +import blackjack.domain.Rank; +import blackjack.domain.Shape; import org.junit.jupiter.api.DisplayName; import org.junit.jupiter.api.Test; public class CardTest { - Card card2 = new Card("2", "하트"); - Card cardJ = new Card("J", "스페이드"); - Card cardQ = new Card("Q", "다이아몬드"); - Card cardK = new Card("K", "클로버"); - - Card cardException1 = new Card("B", "하트"); - Card cardException2 = new Card("-1", "스페이드"); + Card card2 = new Card(Rank.TWO, Shape.HEART); + Card cardJ = new Card(Rank.JACK, Shape.SPADE); + Card cardQ = new Card(Rank.QUEEN, Shape.DIAMOND); + Card cardK = new Card(Rank.KING, Shape.CLUB); @Test @@ -24,13 +23,4 @@ void calculate_card_score() { assertThat(cardQ.translateToScore()).isEqualTo(10); assertThat(cardK.translateToScore()).isEqualTo(10); } - - @Test - @DisplayName("카드 점수 계산 예외 처리") - void calculate_card_score_exception() { - assertThatThrownBy(() -> cardException1.translateToScore()) - .isInstanceOf(IllegalArgumentException.class); - assertThatThrownBy(() -> cardException2.translateToScore()) - .isInstanceOf(IllegalArgumentException.class); - } } diff --git a/src/test/java/CardsSumTest.java b/src/test/java/CardsSumTest.java index 6fa20a7326c..554caac38a8 100644 --- a/src/test/java/CardsSumTest.java +++ b/src/test/java/CardsSumTest.java @@ -2,6 +2,8 @@ import blackjack.domain.Card; import blackjack.domain.Cards; +import blackjack.domain.Rank; +import blackjack.domain.Shape; import java.util.List; import org.junit.jupiter.api.Test; @@ -10,30 +12,30 @@ public class CardsSumTest { @Test void cards_sum_without_ace() { Cards cards = new Cards(List.of( - new Card("2", "하트"), - new Card("3", "스페이드"), - new Card("J", "다이아몬드"), - new Card("Q", "클로버"))); + new Card(Rank.TWO, Shape.HEART), + new Card(Rank.THREE, Shape.SPADE), + new Card(Rank.JACK, Shape.DIAMOND), + new Card(Rank.QUEEN, Shape.CLUB))); assertThat(cards.sumScore()).isEqualTo(25); } @Test void cards_sum_with_ace() { Cards cards1 = new Cards(List.of( - new Card("2", "하트"), - new Card("3", "스페이드"), - new Card("A", "다이아몬드"), - new Card("J", "클로버"), - new Card("Q", "하트"))); + new Card(Rank.TWO, Shape.HEART), + new Card(Rank.THREE, Shape.SPADE), + new Card(Rank.ACE, Shape.DIAMOND), + new Card(Rank.JACK, Shape.CLUB), + new Card(Rank.QUEEN, Shape.HEART))); Cards cards2 = new Cards(List.of( - new Card("2", "하트"), - new Card("3", "스페이드"), - new Card("A", "다이아몬드"))); + new Card(Rank.TWO, Shape.HEART), + new Card(Rank.THREE, Shape.SPADE), + new Card(Rank.ACE, Shape.DIAMOND))); Cards cards3 = new Cards(List.of( - new Card("2", "하트"), - new Card("3", "스페이드"), - new Card("A", "다이아몬드"), - new Card("A", "클로버"))); + new Card(Rank.TWO, Shape.HEART), + new Card(Rank.THREE, Shape.SPADE), + new Card(Rank.ACE, Shape.DIAMOND), + new Card(Rank.ACE, Shape.CLUB))); assertThat(cards1.sumScore()).isEqualTo(26); assertThat(cards2.sumScore()).isEqualTo(16); assertThat(cards3.sumScore()).isEqualTo(17); diff --git a/src/test/java/DealerTest.java b/src/test/java/DealerTest.java index b8e30e27d55..2617605ed43 100644 --- a/src/test/java/DealerTest.java +++ b/src/test/java/DealerTest.java @@ -2,6 +2,8 @@ import blackjack.domain.Card; import blackjack.domain.Dealer; +import blackjack.domain.Rank; +import blackjack.domain.Shape; import org.junit.jupiter.api.Test; public class DealerTest { @@ -9,26 +11,26 @@ public class DealerTest { @Test void calculate_dealer_total_score() { Dealer dealer1 = new Dealer(); - dealer1.receiveOneCard(new Card("A", "하트")); - dealer1.receiveOneCard(new Card("Q", "스페이드")); + dealer1.receiveOneCard(new Card(Rank.ACE, Shape.HEART)); + dealer1.receiveOneCard(new Card(Rank.QUEEN, Shape.SPADE)); assertThat(dealer1.calculateTotalScore()).isEqualTo(21); Dealer dealer2 = new Dealer(); - dealer2.receiveOneCard(new Card("3", "하트")); - dealer2.receiveOneCard(new Card("10", "스페이드")); + dealer2.receiveOneCard(new Card(Rank.THREE, Shape.HEART)); + dealer2.receiveOneCard(new Card(Rank.TEN, Shape.SPADE)); assertThat(dealer2.calculateTotalScore()).isEqualTo(13); } @Test void is_dealer_done_when_total_score_is_17_or_more() { Dealer dealer1 = new Dealer(); - dealer1.receiveOneCard(new Card("10", "하트")); - dealer1.receiveOneCard(new Card("7", "스페이드")); + dealer1.receiveOneCard(new Card(Rank.TEN, Shape.HEART)); + dealer1.receiveOneCard(new Card(Rank.SEVEN, Shape.SPADE)); assertThat(dealer1.isDealerDone()).isEqualTo(true); Dealer dealer2 = new Dealer(); - dealer2.receiveOneCard(new Card("2", "하트")); - dealer2.receiveOneCard(new Card("7", "스페이드")); + dealer2.receiveOneCard(new Card(Rank.TWO, Shape.HEART)); + dealer2.receiveOneCard(new Card(Rank.SEVEN, Shape.SPADE)); assertThat(dealer2.isDealerDone()).isEqualTo(false); } } diff --git a/src/test/java/GameTest.java b/src/test/java/GameTest.java index 9b570f398ee..3d1657bf30c 100644 --- a/src/test/java/GameTest.java +++ b/src/test/java/GameTest.java @@ -2,11 +2,13 @@ import static org.mockito.Mockito.mock; import static org.mockito.Mockito.when; +import blackjack.domain.Rank; import blackjack.domain.ScoreCompareResult; import blackjack.domain.Card; import blackjack.domain.Dealer; import blackjack.domain.GameResult; import blackjack.domain.Player; +import blackjack.domain.Shape; import blackjack.service.CardDistributor; import blackjack.service.Game; import java.util.LinkedHashMap; @@ -38,11 +40,11 @@ void compare_score_when_player_win() { Player player = new Player("player1"); Dealer dealer = new Dealer(); - player.receiveOneCard(new Card("A", "하트")); - player.receiveOneCard(new Card("Q", "스페이드")); + player.receiveOneCard(new Card(Rank.ACE, Shape.HEART)); + player.receiveOneCard(new Card(Rank.QUEEN, Shape.SPADE)); - dealer.receiveOneCard(new Card("10", "하트")); - dealer.receiveOneCard(new Card("7", "스페이드")); + dealer.receiveOneCard(new Card(Rank.TEN, Shape.HEART)); + dealer.receiveOneCard(new Card(Rank.SEVEN, Shape.SPADE)); assertThat(Game.compareScore(player, dealer)).isEqualTo(ScoreCompareResult.PLAYER_WIN); } @@ -52,11 +54,11 @@ void compare_score_when_dealer_win() { Player player = new Player("player1"); Dealer dealer = new Dealer(); - player.receiveOneCard(new Card("A", "하트")); - player.receiveOneCard(new Card("4", "스페이드")); + player.receiveOneCard(new Card(Rank.ACE, Shape.HEART)); + player.receiveOneCard(new Card(Rank.FOUR, Shape.SPADE)); - dealer.receiveOneCard(new Card("10", "하트")); - dealer.receiveOneCard(new Card("9", "스페이드")); + dealer.receiveOneCard(new Card(Rank.TEN, Shape.HEART)); + dealer.receiveOneCard(new Card(Rank.NINE, Shape.SPADE)); assertThat(Game.compareScore(player, dealer)).isEqualTo(ScoreCompareResult.DEALER_WIN); } @@ -66,21 +68,26 @@ void compare_score_when_push() { Player player = new Player("player1"); Dealer dealer = new Dealer(); - player.receiveOneCard(new Card("A", "하트")); - player.receiveOneCard(new Card("Q", "스페이드")); + player.receiveOneCard(new Card(Rank.ACE, Shape.HEART)); + player.receiveOneCard(new Card(Rank.QUEEN, Shape.SPADE)); - dealer.receiveOneCard(new Card("10", "하트")); - dealer.receiveOneCard(new Card("A", "스페이드")); + dealer.receiveOneCard(new Card(Rank.TEN, Shape.HEART)); + dealer.receiveOneCard(new Card(Rank.ACE, Shape.SPADE)); assertThat(Game.compareScore(player, dealer)).isEqualTo(ScoreCompareResult.PUSH); } @Test void judge_total_winner_result() { - Player pobi = createPlayer("pobi", "2:하트", "8:스페이드", "A:클로버"); - Player jason = createPlayer("jason", "7:클로버", "K:스페이드"); - Player brown = createPlayer("brown", "10:하트", "10:클로버"); - Dealer dealer = createDealer("3:다이아몬드", "9:클로버", "8:다이아몬드"); + Player pobi = createPlayer("pobi", + new Card(Rank.TWO, Shape.HEART), new Card(Rank.EIGHT, Shape.SPADE), new Card(Rank.ACE, Shape.CLUB)); + Player jason = createPlayer("jason", + new Card(Rank.SEVEN, Shape.CLUB), new Card(Rank.KING, Shape.SPADE)); + Player brown = createPlayer("brown", + new Card(Rank.TEN, Shape.HEART), new Card(Rank.TEN, Shape.CLUB)); + Dealer dealer = createDealer( + new Card(Rank.THREE, Shape.DIAMOND), new Card(Rank.NINE, Shape.CLUB), + new Card(Rank.EIGHT, Shape.DIAMOND)); Game game = new Game(List.of(pobi, jason, brown), dealer); @@ -105,20 +112,18 @@ void judge_total_winner_result() { assertThat(actual).usingRecursiveComparison().isEqualTo(expected); } - private Player createPlayer(String name, String... cards) { + private Player createPlayer(String name, Card... cards) { Player player = new Player(name); - for (String card : cards) { - String[] parts = card.split(":"); - player.receiveOneCard(new Card(parts[0], parts[1])); + for (Card card : cards) { + player.receiveOneCard(card); } return player; } - private Dealer createDealer(String... cards) { + private Dealer createDealer(Card... cards) { Dealer dealer = new Dealer(); - for (String card : cards) { - String[] parts = card.split(":"); - dealer.receiveOneCard(new Card(parts[0], parts[1])); + for (Card card : cards) { + dealer.receiveOneCard(card); } return dealer; } diff --git a/src/test/java/PlayerBetTest.java b/src/test/java/PlayerBetTest.java index c8a344c7bbe..a3493af9113 100644 --- a/src/test/java/PlayerBetTest.java +++ b/src/test/java/PlayerBetTest.java @@ -5,7 +5,9 @@ import blackjack.domain.GameResult; import blackjack.domain.Player; import blackjack.domain.ProfitResults; +import blackjack.domain.Rank; import blackjack.domain.ScoreCompareResult; +import blackjack.domain.Shape; import blackjack.service.Game; import java.util.List; import java.util.Map; @@ -21,7 +23,8 @@ void calculate_profit_when_player_win_except_blackjack() { @Test void calculate_profit_when_player_win_with_blackjack() { - Player player = createPlayer("player", 1000, "A:스페이드", "10:하트"); + Player player = createPlayer("player", 1000, + new Card(Rank.ACE, Shape.SPADE), new Card(Rank.TEN, Shape.HEART)); assertThat(player.calculateProfit(ScoreCompareResult.PLAYER_WIN)).isEqualTo(1500); } @@ -42,9 +45,12 @@ void calculate_profit_when_player_draw() { @Test void calculate_total_profit_result() { - Player winningPlayer = createPlayer("winningPlayer", 1000, "Q:스페이드", "10:하트"); - Player losingPlayer = createPlayer("losingPlayer", 1500, "9:스페이드", "8:하트"); - Dealer dealer = createDealer("10:스페이드", "8:하트"); + Player winningPlayer = createPlayer("winningPlayer", 1000, + new Card(Rank.QUEEN, Shape.SPADE), new Card(Rank.TEN, Shape.HEART)); + Player losingPlayer = createPlayer("losingPlayer", 1500, + new Card(Rank.NINE, Shape.SPADE), new Card(Rank.EIGHT, Shape.HEART)); + Dealer dealer = createDealer( + new Card(Rank.TEN, Shape.SPADE), new Card(Rank.EIGHT, Shape.HEART)); Game game = new Game(List.of(winningPlayer, losingPlayer), dealer); GameResult gameResult = game.judgeTotalGameResult(); @@ -58,20 +64,18 @@ void calculate_total_profit_result() { } - private Player createPlayer(String name, int bettingAmount, String... cards) { + private Player createPlayer(String name, int bettingAmount, Card... cards) { Player player = new Player(name, bettingAmount); - for (String card : cards) { - String[] parts = card.split(":"); - player.receiveOneCard(new Card(parts[0], parts[1])); + for (Card card : cards) { + player.receiveOneCard(card); } return player; } - private Dealer createDealer(String... cards) { + private Dealer createDealer(Card... cards) { Dealer dealer = new Dealer(); - for (String card : cards) { - String[] parts = card.split(":"); - dealer.receiveOneCard(new Card(parts[0], parts[1])); + for (Card card : cards) { + dealer.receiveOneCard(card); } return dealer; } diff --git a/src/test/java/PlayerTest.java b/src/test/java/PlayerTest.java index 257e7ce6f82..7f1efeccf9c 100644 --- a/src/test/java/PlayerTest.java +++ b/src/test/java/PlayerTest.java @@ -2,35 +2,37 @@ import blackjack.domain.Card; import blackjack.domain.Player; +import blackjack.domain.Rank; +import blackjack.domain.Shape; import org.junit.jupiter.api.Test; public class PlayerTest { @Test void calculate_player_total_score() { Player player1 = new Player("player1"); - player1.receiveOneCard(new Card("A", "하트")); - player1.receiveOneCard(new Card("Q", "스페이드")); + player1.receiveOneCard(new Card(Rank.ACE, Shape.HEART)); + player1.receiveOneCard(new Card(Rank.QUEEN, Shape.SPADE)); assertThat(player1.calculateTotalScore()).isEqualTo(21); Player player2 = new Player("player2"); - player2.receiveOneCard(new Card("3", "하트")); - player2.receiveOneCard(new Card("10", "스페이드")); + player2.receiveOneCard(new Card(Rank.THREE, Shape.HEART)); + player2.receiveOneCard(new Card(Rank.TEN, Shape.SPADE)); assertThat(player2.calculateTotalScore()).isEqualTo(13); } @Test void player_is_blackjack_when_score_is_21() { Player player = new Player("player"); - player.receiveOneCard(new Card("A", "하트")); - player.receiveOneCard(new Card("J", "스페이드")); + player.receiveOneCard(new Card(Rank.ACE, Shape.HEART)); + player.receiveOneCard(new Card(Rank.JACK, Shape.SPADE)); assertThat(player.isBlackjack()).isTrue(); } @Test void player_is_not_blackjack_when_score_is_20() { Player player = new Player("player"); - player.receiveOneCard(new Card("Q", "하트")); - player.receiveOneCard(new Card("J", "스페이드")); + player.receiveOneCard(new Card(Rank.QUEEN, Shape.HEART)); + player.receiveOneCard(new Card(Rank.JACK, Shape.SPADE)); assertThat(player.isBlackjack()).isFalse(); } } diff --git a/src/test/java/RandomCardPickerTest.java b/src/test/java/RandomCardPickerTest.java index 8bdddb6c974..2f5cc8f8c05 100644 --- a/src/test/java/RandomCardPickerTest.java +++ b/src/test/java/RandomCardPickerTest.java @@ -3,6 +3,8 @@ import static org.mockito.Mockito.when; import blackjack.domain.Card; +import blackjack.domain.Rank; +import blackjack.domain.Shape; import java.util.HashSet; import java.util.Random; import java.util.Set; @@ -15,10 +17,10 @@ void draw_random_card() { Random mockRandom = mock(Random.class); RandomCardPicker randomCardPicker = new RandomCardPicker(mockRandom); - when(mockRandom.nextInt(13)).thenReturn(0); // "2" - when(mockRandom.nextInt(4)).thenReturn(0); // "하트" + when(mockRandom.nextInt(13)).thenReturn(0); // Rank.TWO + when(mockRandom.nextInt(4)).thenReturn(0); // Shape.HEART - assertThat(randomCardPicker.drawCard()).isEqualTo(new Card("2", "하트")); + assertThat(randomCardPicker.drawCard()).isEqualTo(new Card(Rank.TWO, Shape.HEART)); } @Test From 53852e21d7510925e89a07a946bf97283029de50 Mon Sep 17 00:00:00 2001 From: sun Date: Sun, 15 Mar 2026 10:23:15 +0900 Subject: [PATCH 27/29] =?UTF-8?q?refactor:=20card=20ace=ED=99=95=EC=9D=B8?= =?UTF-8?q?=20=EC=B1=85=EC=9E=84=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/blackjack/domain/Card.java | 4 ++++ src/main/java/blackjack/domain/Cards.java | 2 +- 2 files changed, 5 insertions(+), 1 deletion(-) diff --git a/src/main/java/blackjack/domain/Card.java b/src/main/java/blackjack/domain/Card.java index 30d8d00b6e0..92ce368c3d8 100644 --- a/src/main/java/blackjack/domain/Card.java +++ b/src/main/java/blackjack/domain/Card.java @@ -10,4 +10,8 @@ public int translateToScore() { return rank.getScore(); } + public boolean isAce() { + return rank == Rank.ACE; + } + } diff --git a/src/main/java/blackjack/domain/Cards.java b/src/main/java/blackjack/domain/Cards.java index 1b55dcfee10..157a33c837b 100644 --- a/src/main/java/blackjack/domain/Cards.java +++ b/src/main/java/blackjack/domain/Cards.java @@ -46,6 +46,6 @@ public int getCardCount() { } private int countAces() { - return (int) cards.stream().filter(card -> card.rank().equals(Rank.ACE)).count(); + return (int) cards.stream().filter(Card::isAce).count(); } } \ No newline at end of file From aca7d157e9151755b442a5574e5ef401b76099da Mon Sep 17 00:00:00 2001 From: sun Date: Sun, 15 Mar 2026 23:52:28 +0900 Subject: [PATCH 28/29] =?UTF-8?q?refactor:=20dto=20=ED=8C=A8=ED=82=A4?= =?UTF-8?q?=EC=A7=80=20=EB=B6=84=EB=A6=AC?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../java/blackjack/controller/BlackjackController.java | 10 +++++----- .../java/blackjack/domain/PlayerProfitResultDto.java | 8 -------- .../blackjack/{domain => dto}/PlayerCardsName.java | 2 +- .../{domain => dto}/PlayerFinalCardsScore.java | 2 +- src/main/java/blackjack/dto/PlayerProfitResult.java | 10 ++++++++++ src/main/java/blackjack/view/OutputView.java | 10 +++++----- 6 files changed, 22 insertions(+), 20 deletions(-) delete mode 100644 src/main/java/blackjack/domain/PlayerProfitResultDto.java rename src/main/java/blackjack/{domain => dto}/PlayerCardsName.java (79%) rename src/main/java/blackjack/{domain => dto}/PlayerFinalCardsScore.java (82%) create mode 100644 src/main/java/blackjack/dto/PlayerProfitResult.java diff --git a/src/main/java/blackjack/controller/BlackjackController.java b/src/main/java/blackjack/controller/BlackjackController.java index 9b405ad875e..9e5f819d510 100644 --- a/src/main/java/blackjack/controller/BlackjackController.java +++ b/src/main/java/blackjack/controller/BlackjackController.java @@ -3,9 +3,9 @@ import blackjack.domain.Dealer; import blackjack.domain.GameResult; import blackjack.domain.Player; -import blackjack.domain.PlayerCardsName; -import blackjack.domain.PlayerFinalCardsScore; -import blackjack.domain.PlayerProfitResultDto; +import blackjack.dto.PlayerCardsName; +import blackjack.dto.PlayerFinalCardsScore; +import blackjack.dto.PlayerProfitResult; import blackjack.domain.ProfitResults; import blackjack.service.CardDistributor; import blackjack.service.Game; @@ -61,9 +61,9 @@ private void calculateFinalGameProfitResult(Game game) { double dealerProfit = profitResults.dealerProfit(); Map playerProfit = profitResults.playerProfit(); - List playerNameProfitResult = new ArrayList<>(); + List playerNameProfitResult = new ArrayList<>(); for (Entry entry : playerProfit.entrySet()) { - playerNameProfitResult.add(PlayerProfitResultDto.from(entry.getKey(), entry.getValue())); + playerNameProfitResult.add(PlayerProfitResult.from(entry.getKey(), entry.getValue())); } OutputView.printFinalProfitResult(dealerProfit, playerNameProfitResult); } diff --git a/src/main/java/blackjack/domain/PlayerProfitResultDto.java b/src/main/java/blackjack/domain/PlayerProfitResultDto.java deleted file mode 100644 index 8522200284a..00000000000 --- a/src/main/java/blackjack/domain/PlayerProfitResultDto.java +++ /dev/null @@ -1,8 +0,0 @@ -package blackjack.domain; - -public record PlayerProfitResultDto(String playerName, double profit) { - - public static PlayerProfitResultDto from(Player player, Double profit) { - return new PlayerProfitResultDto(player.getName(), profit); - } -} diff --git a/src/main/java/blackjack/domain/PlayerCardsName.java b/src/main/java/blackjack/dto/PlayerCardsName.java similarity index 79% rename from src/main/java/blackjack/domain/PlayerCardsName.java rename to src/main/java/blackjack/dto/PlayerCardsName.java index cbb22683e3a..5355880d75c 100644 --- a/src/main/java/blackjack/domain/PlayerCardsName.java +++ b/src/main/java/blackjack/dto/PlayerCardsName.java @@ -1,4 +1,4 @@ -package blackjack.domain; +package blackjack.dto; import java.util.List; diff --git a/src/main/java/blackjack/domain/PlayerFinalCardsScore.java b/src/main/java/blackjack/dto/PlayerFinalCardsScore.java similarity index 82% rename from src/main/java/blackjack/domain/PlayerFinalCardsScore.java rename to src/main/java/blackjack/dto/PlayerFinalCardsScore.java index 5bdcd606297..b9bc4e8cb81 100644 --- a/src/main/java/blackjack/domain/PlayerFinalCardsScore.java +++ b/src/main/java/blackjack/dto/PlayerFinalCardsScore.java @@ -1,4 +1,4 @@ -package blackjack.domain; +package blackjack.dto; import java.util.List; diff --git a/src/main/java/blackjack/dto/PlayerProfitResult.java b/src/main/java/blackjack/dto/PlayerProfitResult.java new file mode 100644 index 00000000000..a118c1ab95e --- /dev/null +++ b/src/main/java/blackjack/dto/PlayerProfitResult.java @@ -0,0 +1,10 @@ +package blackjack.dto; + +import blackjack.domain.Player; + +public record PlayerProfitResult(String playerName, double profit) { + + public static PlayerProfitResult from(Player player, Double profit) { + return new PlayerProfitResult(player.getName(), profit); + } +} diff --git a/src/main/java/blackjack/view/OutputView.java b/src/main/java/blackjack/view/OutputView.java index 046fc23adf3..3f4ef66004b 100644 --- a/src/main/java/blackjack/view/OutputView.java +++ b/src/main/java/blackjack/view/OutputView.java @@ -1,8 +1,8 @@ package blackjack.view; -import blackjack.domain.PlayerCardsName; -import blackjack.domain.PlayerFinalCardsScore; -import blackjack.domain.PlayerProfitResultDto; +import blackjack.dto.PlayerCardsName; +import blackjack.dto.PlayerFinalCardsScore; +import blackjack.dto.PlayerProfitResult; import java.util.List; public class OutputView { @@ -51,12 +51,12 @@ public static void printFinalCardScores(List playerFinalC public static void printFinalProfitResult( double dealerProfit, - List playersProfitResults) { + List playersProfitResults) { System.out.println(); System.out.println("## 최종 수익"); System.out.printf("딜러: %d%n", (int) dealerProfit); - for (PlayerProfitResultDto playerProfitResult : playersProfitResults) { + for (PlayerProfitResult playerProfitResult : playersProfitResults) { System.out.println(playerProfitResult.playerName() + ": " + (int) playerProfitResult.profit()); } } From 0d7cf27d31a77ff6761d0e9ed6d01a4b7240a720 Mon Sep 17 00:00:00 2001 From: sun Date: Mon, 16 Mar 2026 00:57:06 +0900 Subject: [PATCH 29/29] =?UTF-8?q?refactor:=20=EB=B0=B0=ED=8C=85=20?= =?UTF-8?q?=EB=B0=8F=20=EC=88=98=EC=9D=B5=EA=B8=88=20=EA=B3=84=EC=82=B0=20?= =?UTF-8?q?BigDecimal=20=EC=82=AC=EC=9A=A9=EC=9C=BC=EB=A1=9C=20=EB=B3=80?= =?UTF-8?q?=EA=B2=BD?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../controller/BlackjackController.java | 9 ++--- src/main/java/blackjack/domain/Player.java | 20 ++++++----- .../java/blackjack/domain/ProfitResults.java | 5 +-- .../blackjack/dto/PlayerProfitResult.java | 5 +-- src/main/java/blackjack/service/Game.java | 9 ++--- .../java/blackjack/utils/InputParser.java | 7 ++-- src/main/java/blackjack/view/OutputView.java | 7 ++-- src/test/java/PlayerBetTest.java | 35 ++++++++++--------- 8 files changed, 54 insertions(+), 43 deletions(-) diff --git a/src/main/java/blackjack/controller/BlackjackController.java b/src/main/java/blackjack/controller/BlackjackController.java index 9e5f819d510..e82f2ec8bde 100644 --- a/src/main/java/blackjack/controller/BlackjackController.java +++ b/src/main/java/blackjack/controller/BlackjackController.java @@ -11,6 +11,7 @@ import blackjack.service.Game; import blackjack.utils.InputParser; import blackjack.utils.RetryInput; +import java.math.BigDecimal; import java.util.ArrayList; import java.util.List; import java.util.Map; @@ -58,11 +59,11 @@ private void calculateFinalGameProfitResult(Game game) { GameResult gameResult = game.judgeTotalGameResult(); ProfitResults profitResults = game.calculateTotalProfitResults(gameResult); - double dealerProfit = profitResults.dealerProfit(); - Map playerProfit = profitResults.playerProfit(); + BigDecimal dealerProfit = profitResults.dealerProfit(); + Map playerProfit = profitResults.playerProfit(); List playerNameProfitResult = new ArrayList<>(); - for (Entry entry : playerProfit.entrySet()) { + for (Entry entry : playerProfit.entrySet()) { playerNameProfitResult.add(PlayerProfitResult.from(entry.getKey(), entry.getValue())); } OutputView.printFinalProfitResult(dealerProfit, playerNameProfitResult); @@ -109,7 +110,7 @@ private static void printInitialCards(List players, Dealer dealer) { private List createPlayersWithBettingAmounts(List playerNames) { List players = new ArrayList<>(); for (String playerName : playerNames) { - int bettingAmount = retryInput.read( + BigDecimal bettingAmount = retryInput.read( () -> InputParser.parseBetAmount(InputView.askToPlayerBettingAmount(playerName))); players.add(new Player(playerName, bettingAmount)); } diff --git a/src/main/java/blackjack/domain/Player.java b/src/main/java/blackjack/domain/Player.java index 3bcd9eba840..d09a9395e3a 100644 --- a/src/main/java/blackjack/domain/Player.java +++ b/src/main/java/blackjack/domain/Player.java @@ -1,17 +1,19 @@ package blackjack.domain; +import java.math.BigDecimal; + public class Player extends Participant { - private static final double BLACKJACK_PROFIT_RATE = 1.5; + private static final BigDecimal BLACKJACK_PROFIT_RATE = BigDecimal.valueOf(1.5); private final String name; - private final int bettingAmount; + private final BigDecimal bettingAmount; public Player(String name) { - this(name, 0); + this(name, BigDecimal.valueOf(0)); } - public Player(String name, int bettingAmount) { + public Player(String name, BigDecimal bettingAmount) { this.name = name; this.bettingAmount = bettingAmount; } @@ -20,19 +22,19 @@ public String getName() { return name; } - public double calculateProfit(ScoreCompareResult compareResult) { + public BigDecimal calculateProfit(ScoreCompareResult compareResult) { if (compareResult == ScoreCompareResult.PLAYER_WIN) { return calculateProfitWhenPlayerWins(); } if (compareResult == ScoreCompareResult.PLAYER_LOSE) { - return -bettingAmount; + return bettingAmount.negate(); } - return 0; + return BigDecimal.ZERO; } - private double calculateProfitWhenPlayerWins() { + private BigDecimal calculateProfitWhenPlayerWins() { if (isBlackjack()) { - return (bettingAmount * BLACKJACK_PROFIT_RATE); + return (bettingAmount.multiply(BLACKJACK_PROFIT_RATE)); } return bettingAmount; } diff --git a/src/main/java/blackjack/domain/ProfitResults.java b/src/main/java/blackjack/domain/ProfitResults.java index 3d3ed9adc5c..e3e96af2381 100644 --- a/src/main/java/blackjack/domain/ProfitResults.java +++ b/src/main/java/blackjack/domain/ProfitResults.java @@ -1,6 +1,7 @@ package blackjack.domain; +import java.math.BigDecimal; import java.util.Map; -public record ProfitResults(Double dealerProfit, Map playerProfit) { -} +public record ProfitResults(BigDecimal dealerProfit, Map playerProfit) { +} \ No newline at end of file diff --git a/src/main/java/blackjack/dto/PlayerProfitResult.java b/src/main/java/blackjack/dto/PlayerProfitResult.java index a118c1ab95e..646fb81a6ad 100644 --- a/src/main/java/blackjack/dto/PlayerProfitResult.java +++ b/src/main/java/blackjack/dto/PlayerProfitResult.java @@ -1,10 +1,11 @@ package blackjack.dto; import blackjack.domain.Player; +import java.math.BigDecimal; -public record PlayerProfitResult(String playerName, double profit) { +public record PlayerProfitResult(String playerName, BigDecimal profit) { - public static PlayerProfitResult from(Player player, Double profit) { + public static PlayerProfitResult from(Player player, BigDecimal profit) { return new PlayerProfitResult(player.getName(), profit); } } diff --git a/src/main/java/blackjack/service/Game.java b/src/main/java/blackjack/service/Game.java index 277003bbe18..70aadc43c6c 100644 --- a/src/main/java/blackjack/service/Game.java +++ b/src/main/java/blackjack/service/Game.java @@ -5,6 +5,7 @@ import blackjack.domain.Player; import blackjack.domain.ProfitResults; import blackjack.domain.ScoreCompareResult; +import java.math.BigDecimal; import java.util.HashMap; import java.util.LinkedHashMap; import java.util.List; @@ -36,14 +37,14 @@ public GameResult judgeTotalGameResult() { public ProfitResults calculateTotalProfitResults(GameResult gameResult) { LinkedHashMap playerResults = gameResult.playerResults(); - double dealerProfit = 0; - Map playerProfits = new LinkedHashMap<>(); + BigDecimal dealerProfit = BigDecimal.ZERO; + Map playerProfits = new LinkedHashMap<>(); for (Map.Entry entry : playerResults.entrySet()) { Player player = entry.getKey(); ScoreCompareResult result = entry.getValue(); - double profit = player.calculateProfit(result); - dealerProfit += profit * -1.0; + BigDecimal profit = player.calculateProfit(result); + dealerProfit = dealerProfit.subtract(profit); playerProfits.put(player, profit); } diff --git a/src/main/java/blackjack/utils/InputParser.java b/src/main/java/blackjack/utils/InputParser.java index 2dc9e34f933..b035741d28b 100644 --- a/src/main/java/blackjack/utils/InputParser.java +++ b/src/main/java/blackjack/utils/InputParser.java @@ -1,5 +1,6 @@ package blackjack.utils; +import java.math.BigDecimal; import java.util.List; import java.util.stream.Stream; @@ -20,10 +21,10 @@ public static List splitPlayerNames(String input) { .toList(); } - public static int parseBetAmount(String input) { + public static BigDecimal parseBetAmount(String input) { try { - int amount = Integer.parseInt(input); - if (amount <= 0) { + BigDecimal amount = new BigDecimal(input); + if (amount.compareTo(BigDecimal.ZERO) <= 0) { throw new IllegalArgumentException("[ERROR] 베팅 금액은 양수여야 합니다. 다시 입력해주세요."); } return amount; diff --git a/src/main/java/blackjack/view/OutputView.java b/src/main/java/blackjack/view/OutputView.java index 3f4ef66004b..92267d0a59d 100644 --- a/src/main/java/blackjack/view/OutputView.java +++ b/src/main/java/blackjack/view/OutputView.java @@ -3,6 +3,7 @@ import blackjack.dto.PlayerCardsName; import blackjack.dto.PlayerFinalCardsScore; import blackjack.dto.PlayerProfitResult; +import java.math.BigDecimal; import java.util.List; public class OutputView { @@ -50,14 +51,14 @@ public static void printFinalCardScores(List playerFinalC } public static void printFinalProfitResult( - double dealerProfit, + BigDecimal dealerProfit, List playersProfitResults) { System.out.println(); System.out.println("## 최종 수익"); - System.out.printf("딜러: %d%n", (int) dealerProfit); + System.out.printf("딜러: %d%n", dealerProfit.intValue()); for (PlayerProfitResult playerProfitResult : playersProfitResults) { - System.out.println(playerProfitResult.playerName() + ": " + (int) playerProfitResult.profit()); + System.out.println(playerProfitResult.playerName() + ": " + playerProfitResult.profit().intValue()); } } } diff --git a/src/test/java/PlayerBetTest.java b/src/test/java/PlayerBetTest.java index a3493af9113..69ead9c7337 100644 --- a/src/test/java/PlayerBetTest.java +++ b/src/test/java/PlayerBetTest.java @@ -9,6 +9,7 @@ import blackjack.domain.ScoreCompareResult; import blackjack.domain.Shape; import blackjack.service.Game; +import java.math.BigDecimal; import java.util.List; import java.util.Map; import org.junit.jupiter.api.Test; @@ -16,38 +17,38 @@ public class PlayerBetTest { @Test void calculate_profit_when_player_win_except_blackjack() { - Player player = new Player("player", 1000); + Player player = new Player("player", BigDecimal.valueOf(1000)); - assertThat(player.calculateProfit(ScoreCompareResult.PLAYER_WIN)).isEqualTo(1000); + assertThat(player.calculateProfit(ScoreCompareResult.PLAYER_WIN)).isEqualByComparingTo(BigDecimal.valueOf(1000)); } @Test void calculate_profit_when_player_win_with_blackjack() { - Player player = createPlayer("player", 1000, + Player player = createPlayer("player", BigDecimal.valueOf(1000), new Card(Rank.ACE, Shape.SPADE), new Card(Rank.TEN, Shape.HEART)); - assertThat(player.calculateProfit(ScoreCompareResult.PLAYER_WIN)).isEqualTo(1500); + assertThat(player.calculateProfit(ScoreCompareResult.PLAYER_WIN)).isEqualByComparingTo(BigDecimal.valueOf(1500)); } @Test void calculate_profit_when_player_lose() { - Player player = new Player("player", 1000); + Player player = new Player("player", BigDecimal.valueOf(1000)); - assertThat(player.calculateProfit(ScoreCompareResult.PLAYER_LOSE)).isEqualTo(-1000); + assertThat(player.calculateProfit(ScoreCompareResult.PLAYER_LOSE)).isEqualByComparingTo(BigDecimal.valueOf(-1000)); } @Test void calculate_profit_when_player_draw() { - Player player = new Player("player", 1000); + Player player = new Player("player", BigDecimal.valueOf(1000)); - assertThat(player.calculateProfit(ScoreCompareResult.PUSH)).isEqualTo(0); + assertThat(player.calculateProfit(ScoreCompareResult.PUSH)).isEqualByComparingTo(BigDecimal.ZERO); } @Test void calculate_total_profit_result() { - Player winningPlayer = createPlayer("winningPlayer", 1000, + Player winningPlayer = createPlayer("winningPlayer", BigDecimal.valueOf(1000), new Card(Rank.QUEEN, Shape.SPADE), new Card(Rank.TEN, Shape.HEART)); - Player losingPlayer = createPlayer("losingPlayer", 1500, + Player losingPlayer = createPlayer("losingPlayer", BigDecimal.valueOf(1500), new Card(Rank.NINE, Shape.SPADE), new Card(Rank.EIGHT, Shape.HEART)); Dealer dealer = createDealer( new Card(Rank.TEN, Shape.SPADE), new Card(Rank.EIGHT, Shape.HEART)); @@ -56,15 +57,17 @@ void calculate_total_profit_result() { GameResult gameResult = game.judgeTotalGameResult(); ProfitResults actualProfitResults = game.calculateTotalProfitResults(gameResult); - ProfitResults expectedProfitResults = new ProfitResults(500.0, Map.of( - winningPlayer, 1000.0, - losingPlayer, -1500.0 + ProfitResults expectedProfitResults = new ProfitResults(BigDecimal.valueOf(500), Map.of( + winningPlayer, BigDecimal.valueOf(1000), + losingPlayer, BigDecimal.valueOf(-1500) )); - assertThat(actualProfitResults).isEqualTo(expectedProfitResults); + assertThat(actualProfitResults).usingRecursiveComparison() + .withComparatorForType(BigDecimal::compareTo, BigDecimal.class) + .isEqualTo(expectedProfitResults); } - private Player createPlayer(String name, int bettingAmount, Card... cards) { + private Player createPlayer(String name, BigDecimal bettingAmount, Card... cards) { Player player = new Player(name, bettingAmount); for (Card card : cards) { player.receiveOneCard(card); @@ -79,4 +82,4 @@ private Dealer createDealer(Card... cards) { } return dealer; } -} +} \ No newline at end of file