From 138c0f287cc5f5771a2cef73e70c607cae0ee0d3 Mon Sep 17 00:00:00 2001 From: xxbeann Date: Thu, 12 Mar 2026 23:49:03 +0900 Subject: [PATCH 01/44] =?UTF-8?q?docs:=20=EA=B8=B0=EB=8A=A5=EB=AA=85?= =?UTF-8?q?=EC=84=B8=20=EC=B6=94=EA=B0=80?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- README.md | 105 +++++++++++++++++++++++++++++++++--------------------- 1 file changed, 65 insertions(+), 40 deletions(-) diff --git a/README.md b/README.md index 16874b3f2b..e3f1019622 100644 --- a/README.md +++ b/README.md @@ -2,62 +2,87 @@ 자바 언어를 활용하여 구현한 객체 지향 블랙잭 게임 프로젝트입니다. ---- - ## 🚀 프로젝트 개요 -이 프로젝트는 **MVC(Model-View-Controller) 패턴**을 기반으로 설계되었으며, 블랙잭 게임의 복잡한 도메인 로직을 객체 간의 협력으로 해결하는 데 중점을 두었습니다.
-리뷰어분들이 전체적인 도메인 설계를 쉽게 이해할 수 있도록 구조와 규칙을 정리했습니다. + +이 프로젝트는 MVC(Model–View–Controller) 패턴을 기반으로 설계되었습니다. + +* Model : 블랙잭 게임의 핵심 도메인 로직 +* View : 사용자 입출력 처리 +* Controller : 게임 흐름 제어s ### ⚖️ 핵심 도메인 규칙 -1. **점수 계산**: + +1. **점수 계산** - K, Q, J는 모두 10으로 계산합니다. - 에이스(Ace)는 기본 11로 계산하되, 총합이 21을 초과하면 1로 자동 전환하여 최적의 점수를 산출합니다. -2. **승패 판정**: - - 21을 초과(Burst)한 참가자는 패배합니다. +2. **승패 판정** + - 21을 초과하면 Burst - 딜러가 Burst되면 남은 플레이어는 모두 승리합니다. - 딜러와 점수가 같을 경우, 현재 로직상 딜러가 승리하는 규칙을 따릅니다 (무승부 없음). - ---- + - 딜러 카드 합이 **16 이하이면 카드 추가** + - 딜러 카드 합이 **17 이상이면 카드 추가 불가** +3. **배팅 규칙** + - 플레이어는 게임 시작 시 **배팅 금액을 입력** + - **Burst 발생 시 배팅 금액을 모두 잃음** + - **블랙잭(처음 두 장이 21)** + → 배팅 금액의 **1.5배 수익** + - **딜러와 플레이어 모두 블랙잭** + → 배팅 금액 **환불** + - **딜러 Burst** + → 남아있는 플레이어는 **배팅 금액만큼 승리** ## 📋 기능 요구사항 ### 1. 게임 준비 단계 -- 참가자 이름을 쉼표 기준으로 입력받는다. -- 이름 입력값의 앞 뒤 공백을 제거한다. (trim) -- **[Exception]** 이름을 빈칸으로 입력할 경우 예외를 던진다. -- **[Exception]** 이름은 2글자 이상 5글자 이하만 허용한다. -- **[Exception]** 중복되는 이름은 허용하지 않는다. -- 52장의 중복 없는 트럼프 카드 덱을 생성한다. -- 트럼프 카드를 무작위로 섞는다. -- 줄어든 카드를 관리하는 덱이 있어야 한다. -- 참가자에게 2장의 카드를 나눠준다. -- 나눠 준 카드를 출력한다. + +- [x] 참가자 이름을 쉼표 기준으로 입력받는다. +- [x] 이름 입력값의 앞뒤 공백을 제거한다. (`trim`) +- [x] 이름이 빈 값일 경우 예외를 발생시킨다. +- [x] 이름은 **2자 이상 5자 이하**만 허용한다. +- [x] 중복되는 이름은 허용하지 않는다. + +- [x] 52장의 중복 없는 트럼프 카드 덱을 생성한다. +- [x] 트럼프 카드를 무작위로 섞는다. +- [x] 카드를 뽑을 때마다 덱에서 제거된다. + +- [x] 참가자에게 **배팅 금액을 입력받는다** + ```shell + pobi의 배팅 금액은? + 10000 + ``` +- [X] 배팅 금액은 **음수가 될 수 없다** + +- [x] 참가자에게 **2장의 카드를 나눠준다** +- [x] 나눠준 카드를 출력한다 ### 2. 게임 진행 단계 -- 참가자에게 카드 속행 여부를 출력한다. -- 참가자에게 카드 속행 여부를 입력받는다. (`y` / `n`) -- **[Exception]** `y`, `n` 이외의 입력이 들어올 경우 예외를 던진다. -- 카드를 새로 받을 경우 새로 뽑은 카드를 합쳐 출력한다. -- 두 장의 카드 합계가 21을 넘지 않을 경우, 원한다면 얼마든지 카드를 계속 뽑을 수 있다. -- 참가자의 모든 턴이 끝난 후, 딜러의 카드 합이 **16 이하**이면 1장을 더 받는다. -- 딜러가 한 장 더 받았다는 결과를 출력한다. -- 딜러의 카드 합이 **17 이상**이면 추가로 받을 수 없다. -### 3. 결과 집계 단계 -- 딜러 → 참가자 순으로 최종 결과를 출력한다. - - 보유 카드 목록과 카드 합계를 함께 출력한다. -- 승패 통계를 함께 출력한다. +- [x] 참가자에게 카드 추가 여부를 출력한다 +- [x] 참가자에게 카드 추가 여부를 입력받는다 (`y / n`) +- [x] `y`, `n` 이외의 입력이 들어오면 예외를 발생시킨다 + +- [x] 카드를 새로 받을 경우 기존 카드와 함께 출력한다 +- [x] 카드 합이 21 이하이면 원하는 만큼 카드를 받을 수 있다 ---- +- [x] 모든 플레이어 턴 종료 후 딜러 턴 진행 +- [x] 딜러 카드 합이 **16 이하이면 카드 1장 추가** +- [x] 딜러 카드 합이 **17 이상이면 카드 추가 불가** -## ✨ 설계 의도 및 특징 +- [ ] 플레이어가 추가로 카드를 뽑아 21을 초과할 경우(Burst될 경우) 배팅 금액을 모두 잃는다. +- [ ] 처음 두 장의 카드 합이 21일 경우 블랙잭이되면 베팅 금액의 1.5배를 딜러에게 받는다. +- [ ] 딜러와 플레이어가 모두 동시에 블랙잭인 경우 플레이어는 베팅한 금액을 돌려받는다. +- [ ] 딜러가 21을 초과하면 그 시점까지 남아있던 플레이어들은 승리해 베팅 금액을 받는다. -### 1. MVC 패턴 및 DTO 활용 -- `Controller`가 도메인 모델과 뷰 사이의 흐름을 제어합니다. -- `ParticipantCardsDto` (Record)를 활용하여 도메인 객체의 캡슐화를 깨뜨리지 않고 UI 계층에 데이터를 안전하게 전달합니다. +### 3. 결과 집계 단계 -### 2. 원시값 포장 (Value Object) -- `Name`, `Shape`, `Number` 등 도메인에서 중요한 의미를 갖는 값들을 객체로 포장하여 유효성 검사를 수행하고 자기 자신의 상태를 책임지게 했습니다. +- [x] 딜러 → 플레이어 순으로 카드와 점수를 출력한다 +- [x] 각 참가자의 승패를 판정한다 +- [ ] 배팅 금액을 기준으로 **최종 수익을 계산한다** +- [ ] 참가자들의 최종 수익을 출력한다 + ```shell + ## 최종 수익 + 딜러: 10000 + pobi: 10000 + jason: -20000 + ``` -### 3. 전략적인 테스트 코드 -- `CardsTest`, `DeckTest`, `ResultTest` 등을 통해 핵심 도메인 로직(점수 계산, 승패 판정)의 신뢰성을 확보했습니다. From 1018af9ddb01398a14d8cd4edfc675f75906bfd4 Mon Sep 17 00:00:00 2001 From: xxbeann Date: Thu, 12 Mar 2026 23:53:58 +0900 Subject: [PATCH 02/44] =?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=EB=B0=8F=20=EC=98=88=EC=99=B8?= =?UTF-8?q?=EC=B2=98=EB=A6=AC=20=EA=B8=B0=EB=8A=A5=20=EA=B5=AC=ED=98=84?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- src/main/java/domain/BettingAmount.java | 16 +++++++++++ src/main/java/view/InputView.java | 7 +++++ src/test/java/domain/BettingAmountTest.java | 30 +++++++++++++++++++++ src/test/java/view/InputViewTest.java | 10 +++++++ 4 files changed, 63 insertions(+) create mode 100644 src/main/java/domain/BettingAmount.java create mode 100644 src/test/java/domain/BettingAmountTest.java diff --git a/src/main/java/domain/BettingAmount.java b/src/main/java/domain/BettingAmount.java new file mode 100644 index 0000000000..b78303a965 --- /dev/null +++ b/src/main/java/domain/BettingAmount.java @@ -0,0 +1,16 @@ +package domain; + +public class BettingAmount { + private final Integer bettingAmount; + + public BettingAmount(Integer bettingAmount) { + validateMinus(bettingAmount); + this.bettingAmount = bettingAmount; + } + + private static void validateMinus(Integer bettingAmount) { + if (bettingAmount <= 0) { + throw new IllegalArgumentException("베팅 금액은 음수일 없습니다."); + } + } +} diff --git a/src/main/java/view/InputView.java b/src/main/java/view/InputView.java index 6546ee0285..e40c4d7c89 100644 --- a/src/main/java/view/InputView.java +++ b/src/main/java/view/InputView.java @@ -26,6 +26,13 @@ public static String askContinue(String player) { return input; } + public static Integer askBettingAmount(String player) { + System.out.println(player + "의 배팅 금액은?"); + Scanner sc = new Scanner(System.in); + Integer input = sc.nextInt(); + return input; + } + private static List getPlayerNames(String input) { List playerNames = Arrays.stream(input.split(",")) .map(String::trim) diff --git a/src/test/java/domain/BettingAmountTest.java b/src/test/java/domain/BettingAmountTest.java new file mode 100644 index 0000000000..7da3695bb6 --- /dev/null +++ b/src/test/java/domain/BettingAmountTest.java @@ -0,0 +1,30 @@ +package domain; + +import static org.junit.jupiter.api.Assertions.*; + +import org.junit.jupiter.api.DisplayName; +import org.junit.jupiter.api.Test; + +class BettingAmountTest { + + @Test + @DisplayName("베팅 금액이 0일때 예외를 던진다.") + void validateMinus_InputZero_ThrowsException() { + Integer testBettingAmount = 0; + IllegalArgumentException exception = assertThrows(IllegalArgumentException.class, () -> { + new BettingAmount(testBettingAmount); + }); + assertEquals("베팅 금액은 음수일 없습니다.", exception.getMessage()); + } + + @Test + @DisplayName("베팅 금액이 음수일 때 예외를 던진다..") + void validateMinus_InputMinus_ThrowsException() { + Integer testBettingAmount = -1000; + IllegalArgumentException exception = assertThrows(IllegalArgumentException.class, () -> { + new BettingAmount(testBettingAmount); + }); + assertEquals("베팅 금액은 음수일 없습니다.", exception.getMessage()); + } + +} diff --git a/src/test/java/view/InputViewTest.java b/src/test/java/view/InputViewTest.java index f82c99447d..3a51e0b6f9 100644 --- a/src/test/java/view/InputViewTest.java +++ b/src/test/java/view/InputViewTest.java @@ -33,4 +33,14 @@ void askContinue_InputOtherThanYAndN_ThrowsException() { InputView.askContinue(player); }); } + + @Test + @DisplayName("입력은 정수만 허용한다.") + void askBettingAmount_ReturnInteger() { + command("1000"); + String player = "JeongKong"; + Integer result = InputView.askBettingAmount(player); + assertEquals(1000, result); + } } + From 1c1094e3d9650fb37243561d09daaebbc40fa64d Mon Sep 17 00:00:00 2001 From: xxbeann Date: Fri, 13 Mar 2026 20:54:41 +0900 Subject: [PATCH 03/44] chore: code formatting --- src/main/java/domain/Card.java | 24 +----------------------- src/main/java/domain/Participant.java | 4 ++-- 2 files changed, 3 insertions(+), 25 deletions(-) diff --git a/src/main/java/domain/Card.java b/src/main/java/domain/Card.java index baef574abb..e9dcfeda4b 100644 --- a/src/main/java/domain/Card.java +++ b/src/main/java/domain/Card.java @@ -1,23 +1 @@ -package domain; - -public class Card { - private final Shape shape; - private final Number number; - - public Card(Shape shape, Number number) { - this.shape = shape; - this.number = number; - } - - public int getScore() { - return number.getValue(); - } - - public String getCardInfo() { - return number.getDisplayName() + shape.getShape(); - } - - public boolean isAce() { - return this.number.equals(Number.ACE); - } -} +package domain; public class Card { private final Shape shape; private final Number number; public Card(Shape shape, Number number) { this.shape = shape; this.number = number; } public int getScore() { return number.getValue(); } public String getCardInfo() { return number.getDisplayName() + shape.getShape(); } public boolean isAce() { return this.number.equals(Number.ACE); } } \ No newline at end of file diff --git a/src/main/java/domain/Participant.java b/src/main/java/domain/Participant.java index 52dd61c1bf..1c52984a91 100644 --- a/src/main/java/domain/Participant.java +++ b/src/main/java/domain/Participant.java @@ -5,7 +5,7 @@ import java.util.ArrayList; public abstract class Participant { - private static final int BURST_THRESHOLD = 21; + private static final int BUST_THRESHOLD = 21; private final Name name; protected final Cards cards; @@ -29,7 +29,7 @@ public int getScore() { } public boolean isBust() { - if (this.getScore() > BURST_THRESHOLD) { + if (this.getScore() > BUST_THRESHOLD) { return true; } return false; From 0e5535a73fe6cc41f32a6826fe5463f6e812212b Mon Sep 17 00:00:00 2001 From: xxbeann Date: Fri, 13 Mar 2026 21:22:49 +0900 Subject: [PATCH 04/44] =?UTF-8?q?refactor:=20players=20=EC=9D=BC=EA=B8=89?= =?UTF-8?q?=20=EC=BB=AC=EB=A0=89=EC=85=98=20=EB=8F=84=EC=9E=85?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit players일급 컬렉션을 도입해 도메인 객체 스스로 검증하게 구현했습니다. input view 에서 도메인 규칙을 모르게끔 리팩토링하였고, gameManager에 흩어져 있던 검증로직을 관련 도메인으로 끌어왔습니다. --- src/main/java/domain/GameManager.java | 26 -------------- src/main/java/domain/Players.java | 44 +++++++++++++++++++++++ src/main/java/view/InputView.java | 4 --- src/test/java/domain/GameManagerTest.java | 25 ++++++------- src/test/java/view/InputViewTest.java | 9 ----- 5 files changed, 57 insertions(+), 51 deletions(-) create mode 100644 src/main/java/domain/Players.java diff --git a/src/main/java/domain/GameManager.java b/src/main/java/domain/GameManager.java index 83a40c1912..31fb4495c8 100644 --- a/src/main/java/domain/GameManager.java +++ b/src/main/java/domain/GameManager.java @@ -9,7 +9,6 @@ import java.util.Set; public class GameManager { - private static final int MAX_PLAYER = 8; private final Dealer dealer; private final List players; @@ -77,29 +76,4 @@ public Map getGameResult() { } return gameResult; } - - public static void validatePlayersNumber(List playerNames) { - validateMinimumPlayers(playerNames); - validateMaximumPlayers(playerNames); - validateDuplicateName(playerNames); - } - - private static void validateMaximumPlayers(List playerNames) { - if (playerNames.size() > MAX_PLAYER) { - throw new IllegalArgumentException("플레이어의 수는 8명을 초과할 수 없습니다."); - } - } - - private static void validateMinimumPlayers(List playerNames) { - if (playerNames.isEmpty()) { - throw new IllegalArgumentException("플레이어의 수는 1명 이상이어야 합니다."); - } - } - - private static void validateDuplicateName(List names) { - Set uniqueNames = new HashSet<>(names); - if (names.size() != uniqueNames.size()) { - throw new IllegalArgumentException("중복된 참가자 이름이 있습니다!"); - } - } } diff --git a/src/main/java/domain/Players.java b/src/main/java/domain/Players.java new file mode 100644 index 0000000000..54842c7ea3 --- /dev/null +++ b/src/main/java/domain/Players.java @@ -0,0 +1,44 @@ +package domain; + +import java.util.ArrayList; +import java.util.List; + +public class Players { + private static final int MAX_PLAYER = 8; + + private final List players; + + public Players(List players) { + validatePlayersNumber(players); + this.players = new ArrayList<>(players); + } + + public static void validatePlayersNumber(List players) { + validateMinimumPlayers(players); + validateMaximumPlayers(players); + validateDuplicateName(players); + } + + private static void validateMaximumPlayers(List players) { + if (players.size() > MAX_PLAYER) { + throw new IllegalArgumentException("플레이어의 수는 8명을 초과할 수 없습니다."); + } + } + + private static void validateMinimumPlayers(List players) { + if (players.isEmpty()) { + throw new IllegalArgumentException("플레이어의 수는 1명 이상이어야 합니다."); + } + } + + private static void validateDuplicateName(List players) { + long uniqueCount = players.stream() + .map(Player::getName) + .distinct() + .count(); + + if (players.size() != uniqueCount) { + throw new IllegalArgumentException("중복된 참가자 이름이 있습니다!"); + } + } +} diff --git a/src/main/java/view/InputView.java b/src/main/java/view/InputView.java index e40c4d7c89..8627c58dff 100644 --- a/src/main/java/view/InputView.java +++ b/src/main/java/view/InputView.java @@ -1,7 +1,5 @@ package view; -import static domain.GameManager.validatePlayersNumber; - import java.util.Arrays; import java.util.List; import java.util.Scanner; @@ -13,8 +11,6 @@ public static List askPlayerNames() { Scanner sc = new Scanner(System.in); String input = sc.nextLine(); List playerNames = getPlayerNames(input); - validatePlayersNumber(playerNames); - return playerNames; } diff --git a/src/test/java/domain/GameManagerTest.java b/src/test/java/domain/GameManagerTest.java index 6a37cf9b1f..3dc8ff8b6b 100644 --- a/src/test/java/domain/GameManagerTest.java +++ b/src/test/java/domain/GameManagerTest.java @@ -5,6 +5,7 @@ import java.util.ArrayList; import java.util.List; import java.util.Map; +import org.junit.jupiter.api.Disabled; import org.junit.jupiter.api.DisplayName; import org.junit.jupiter.api.Test; @@ -36,16 +37,16 @@ void getGameResult_ReturnMap() { assertEquals(GameResult.LOSE, crongResult); } - @Test - @DisplayName("플레이어들의 이름에 중복이 있는지 검사한다.") - void validateDuplicateName_DuplicateName_ThrowsException() { - List name = new ArrayList<>(); - name.add("pobi"); - name.add("jason"); - name.add("pobi"); - IllegalArgumentException exception = assertThrows(IllegalArgumentException.class, () -> { - GameManager.validatePlayersNumber(name); - }); - assertEquals("중복된 참가자 이름이 있습니다!", exception.getMessage()); - } +// @Test +// @DisplayName("플레이어들의 이름에 중복이 있는지 검사한다.") +// void validateDuplicateName_DuplicateName_ThrowsException() { +// List name = new ArrayList<>(); +// name.add("pobi"); +// name.add("jason"); +// name.add("pobi"); +// IllegalArgumentException exception = assertThrows(IllegalArgumentException.class, () -> { +// GameManager.validatePlayersNumber(name); +// }); +// assertEquals("중복된 참가자 이름이 있습니다!", exception.getMessage()); +// } } diff --git a/src/test/java/view/InputViewTest.java b/src/test/java/view/InputViewTest.java index 3a51e0b6f9..c11dbfca9d 100644 --- a/src/test/java/view/InputViewTest.java +++ b/src/test/java/view/InputViewTest.java @@ -15,15 +15,6 @@ private void command(String input) { System.setIn(in); } - @Test - @DisplayName("플레이어의 수는 8명을 넘을 수 없다.") - void askPlayerNames_NinePlayers_ThrowsException() { - command("가,나,다,라,마,바,사,아,차"); - assertThrows(IllegalArgumentException.class, () -> { - InputView.askPlayerNames(); - }); - } - @Test @DisplayName("입력은 y와 n만 허용한다.") void askContinue_InputOtherThanYAndN_ThrowsException() { From f6c17555bf68bbee9579f7680d22687166fba4a3 Mon Sep 17 00:00:00 2001 From: xxbeann Date: Fri, 13 Mar 2026 22:03:35 +0900 Subject: [PATCH 05/44] =?UTF-8?q?test:=20playersTest=20=EC=B6=94=EA=B0=80?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- src/test/java/domain/PlayersTest.java | 50 +++++++++++++++++++++++++++ 1 file changed, 50 insertions(+) create mode 100644 src/test/java/domain/PlayersTest.java diff --git a/src/test/java/domain/PlayersTest.java b/src/test/java/domain/PlayersTest.java new file mode 100644 index 0000000000..2d49f81035 --- /dev/null +++ b/src/test/java/domain/PlayersTest.java @@ -0,0 +1,50 @@ +package domain; + +import static org.junit.jupiter.api.Assertions.*; + +import java.util.ArrayList; +import java.util.List; +import org.junit.jupiter.api.Test; + +class PlayersTest { + + @Test + void 플레이어가_0명이면_예외가_발생한다() { + List players = new ArrayList<>(); + assertThrows(IllegalArgumentException.class, () -> { + new Players(players); + }); + } + + @Test + void 플레이어가_8명을_초과하면_예외가_발생한다() { + List players = List.of( + new Player(new Name("aa")), new Player(new Name("bb")), new Player(new Name("cc")), + new Player(new Name("dd")), new Player(new Name("ee")), new Player(new Name("ff")), + new Player(new Name("gg")), new Player(new Name("hh")), new Player(new Name("ii")) + ); + assertThrows(IllegalArgumentException.class, () -> { + new Players(players); + }); + } + + @Test + void 플레이어_이름이_중복되면_예외가_발생한다() { + List players = List.of( + new Player(new Name("aa")), new Player(new Name("bb")), new Player(new Name("aa")) + ); + assertThrows(IllegalArgumentException.class, () -> { + new Players(players); + }); + } + + @Test + void 정상적인_플레이어_목록이면_생성된다() { + List players = List.of( + new Player(new Name("aa")), new Player(new Name("bb")), new Player(new Name("cc")) + ); + assertDoesNotThrow(() -> { + new Players(players); + }); + } +} From 903f3e993be83b4e0d255c6e195e444e3fa31f77 Mon Sep 17 00:00:00 2001 From: xxbeann Date: Fri, 13 Mar 2026 22:04:23 +0900 Subject: [PATCH 06/44] =?UTF-8?q?chore:=20=EC=A3=BC=EC=84=9D=20=EC=B6=94?= =?UTF-8?q?=EA=B0=80?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- src/test/java/domain/NameTest.java | 2 +- src/test/java/domain/PlayersTest.java | 2 +- 2 files changed, 2 insertions(+), 2 deletions(-) diff --git a/src/test/java/domain/NameTest.java b/src/test/java/domain/NameTest.java index 26f46f826d..2989ff6f4f 100644 --- a/src/test/java/domain/NameTest.java +++ b/src/test/java/domain/NameTest.java @@ -6,7 +6,7 @@ import org.junit.jupiter.api.Test; class NameTest { - + // TODO: 나중에 커스텀 예외로 변경. 현재는 예외가 터지는 것만 검증됨. @Test @DisplayName("이름은 비어있거나 공백일 수 없다.") void validateBlank_InputBlank_ThrowsException() { diff --git a/src/test/java/domain/PlayersTest.java b/src/test/java/domain/PlayersTest.java index 2d49f81035..8551468824 100644 --- a/src/test/java/domain/PlayersTest.java +++ b/src/test/java/domain/PlayersTest.java @@ -7,7 +7,7 @@ import org.junit.jupiter.api.Test; class PlayersTest { - + // TODO: 나중에 커스텀 예외로 변경. 현재는 예외가 터지는 것만 검증됨. @Test void 플레이어가_0명이면_예외가_발생한다() { List players = new ArrayList<>(); From 33fa3b5c5c1faaf744c0b2e18ac75e9b05347b35 Mon Sep 17 00:00:00 2001 From: xxbeann Date: Fri, 13 Mar 2026 22:13:20 +0900 Subject: [PATCH 07/44] =?UTF-8?q?test:=20BettingAmountTest=20=EB=A6=AC?= =?UTF-8?q?=ED=8C=A9=ED=86=A0=EB=A7=81?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- src/test/java/domain/BettingAmountTest.java | 20 +++++++++++--------- 1 file changed, 11 insertions(+), 9 deletions(-) diff --git a/src/test/java/domain/BettingAmountTest.java b/src/test/java/domain/BettingAmountTest.java index 7da3695bb6..95c6c39d12 100644 --- a/src/test/java/domain/BettingAmountTest.java +++ b/src/test/java/domain/BettingAmountTest.java @@ -2,29 +2,31 @@ import static org.junit.jupiter.api.Assertions.*; -import org.junit.jupiter.api.DisplayName; import org.junit.jupiter.api.Test; class BettingAmountTest { @Test - @DisplayName("베팅 금액이 0일때 예외를 던진다.") - void validateMinus_InputZero_ThrowsException() { + void 베팅_금액이_0원이면_예외가_발생한다() { Integer testBettingAmount = 0; - IllegalArgumentException exception = assertThrows(IllegalArgumentException.class, () -> { + assertThrows(IllegalArgumentException.class, () -> { new BettingAmount(testBettingAmount); }); - assertEquals("베팅 금액은 음수일 없습니다.", exception.getMessage()); } @Test - @DisplayName("베팅 금액이 음수일 때 예외를 던진다..") - void validateMinus_InputMinus_ThrowsException() { + void 베팅_금액이_음수면_예외가_발생한다() { Integer testBettingAmount = -1000; - IllegalArgumentException exception = assertThrows(IllegalArgumentException.class, () -> { + assertThrows(IllegalArgumentException.class, () -> { new BettingAmount(testBettingAmount); }); - assertEquals("베팅 금액은 음수일 없습니다.", exception.getMessage()); } + @Test + void 베팅_금액이_양수이면_생성된다() { + Integer testBettingAmount = 1000; + assertDoesNotThrow(() -> { + new BettingAmount(testBettingAmount); + }); + } } From c7be435ba6ebfdea3efdd18ca4765864f1a07ff2 Mon Sep 17 00:00:00 2001 From: xxbeann Date: Fri, 13 Mar 2026 22:47:49 +0900 Subject: [PATCH 08/44] =?UTF-8?q?test:=20=ED=85=8C=EC=8A=A4=ED=8A=B8=20?= =?UTF-8?q?=EC=BD=94=EB=93=9C=20=EB=A6=AC=ED=8C=A9=ED=86=A0=EB=A7=81=20?= =?UTF-8?q?=EB=B0=8F=20inputView=20=EA=B2=80=EC=A6=9D=20=ED=85=8C=EC=8A=A4?= =?UTF-8?q?=ED=8A=B8=20=EC=B6=94=EA=B0=80?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit - inputView 테스트를 위해 기존에 쓰던 inputStream을 제거하고, validator를 분리 이를 테스트 했습니다. - 기존 exception의 메시지를 테스트 하던 방식을 예외 타입 검증으로 변경했습니다. 추후 커스텀 예외를 통해 메시지 타입까지 비교할 예정입니다. - 기존에 있던 DisplayName과 영어 메서드명을 한글 메서드명으로 변경했습니다. --- src/main/java/view/InputValidator.java | 9 ++++++ src/main/java/view/InputView.java | 8 +---- src/test/java/domain/CardsTest.java | 7 ++-- src/test/java/domain/DealerTest.java | 9 ++---- src/test/java/domain/DeckTest.java | 4 +-- src/test/java/domain/GameManagerTest.java | 19 +---------- src/test/java/domain/NameTest.java | 19 ++++------- src/test/java/domain/PlayerTest.java | 30 ++++++------------ src/test/java/view/InputValidatorTest.java | 14 ++++++++ src/test/java/view/InputViewTest.java | 37 ---------------------- 10 files changed, 45 insertions(+), 111 deletions(-) create mode 100644 src/main/java/view/InputValidator.java create mode 100644 src/test/java/view/InputValidatorTest.java delete mode 100644 src/test/java/view/InputViewTest.java diff --git a/src/main/java/view/InputValidator.java b/src/main/java/view/InputValidator.java new file mode 100644 index 0000000000..c8cac249b4 --- /dev/null +++ b/src/main/java/view/InputValidator.java @@ -0,0 +1,9 @@ +package view; + +public class InputValidator { + public static void validateContinueResponse(String input) { + if (!input.matches("[yn]")) { + throw new IllegalArgumentException("응답은 y와 n만 허용됩니다."); + } + } +} diff --git a/src/main/java/view/InputView.java b/src/main/java/view/InputView.java index 8627c58dff..4994f1868a 100644 --- a/src/main/java/view/InputView.java +++ b/src/main/java/view/InputView.java @@ -18,7 +18,7 @@ public static String askContinue(String player) { System.out.println(player + "는 한장의 카드를 더 받겠습니까? (예는 y, 아니오는 n)"); Scanner sc = new Scanner(System.in); String input = sc.nextLine(); - validateContinueResponse(input); + InputValidator.validateContinueResponse(input); return input; } @@ -35,10 +35,4 @@ private static List getPlayerNames(String input) { .toList(); return playerNames; } - - private static void validateContinueResponse(String input) { - if (!input.matches("[yn]")) { - throw new IllegalArgumentException("응답은 y와 n만 허용됩니다."); - } - } } diff --git a/src/test/java/domain/CardsTest.java b/src/test/java/domain/CardsTest.java index 749beeeefc..75ccb38e53 100644 --- a/src/test/java/domain/CardsTest.java +++ b/src/test/java/domain/CardsTest.java @@ -4,14 +4,12 @@ import java.util.ArrayList; import java.util.List; -import org.junit.jupiter.api.DisplayName; import org.junit.jupiter.api.Test; class CardsTest { @Test - @DisplayName("카드 합계를 계산한다.") - void calculateScore_ContainsNonAce_ReturnSum() { + void 에이스가_없으면_카드_숫자의_합을_반환한다() { Card card1 = new Card(Shape.SPADE, Number.EIGHT); Card card2 = new Card(Shape.HEART, Number.EIGHT); @@ -25,8 +23,7 @@ void calculateScore_ContainsNonAce_ReturnSum() { } @Test - @DisplayName("ACE가 포함되었을 때 카드 합계를 계산한다.") - void calculateScore_ContainsAce_ReturnSum() { + void 에이스가_있으면_상황에_맞는_최대_합을_반환한다() { Card card1 = new Card(Shape.SPADE, Number.ACE); Card card2 = new Card(Shape.HEART, Number.FIVE); Card card3 = new Card(Shape.CLUB, Number.EIGHT); diff --git a/src/test/java/domain/DealerTest.java b/src/test/java/domain/DealerTest.java index 17ec814c6a..8a52b233a6 100644 --- a/src/test/java/domain/DealerTest.java +++ b/src/test/java/domain/DealerTest.java @@ -2,15 +2,12 @@ import static org.junit.jupiter.api.Assertions.*; -import org.junit.jupiter.api.DisplayName; import org.junit.jupiter.api.Test; class DealerTest { @Test - @DisplayName("딜러는 점수가 16점 이하일 때 카드를 더 받을 수 있다.") - void isContinueGame_UnderScore16_ReturnTrue() { - + void 점수가_16점_이하이면_카드를_추가로_받을_수_있다() { Dealer dealer = new Dealer(new Name("딜러")); dealer.receiveCard(new Card(Shape.SPADE, Number.TEN)); dealer.receiveCard(new Card(Shape.HEART, Number.SIX)); @@ -20,9 +17,7 @@ void isContinueGame_UnderScore16_ReturnTrue() { } @Test - @DisplayName("딜러는 점수가 17점 이상일 때 카드를 더 받을 수 없다.") - void isContinueGame_OverScore17_ReturnFalse() { - + void 점수가_17점_이상이면_카드를_추가로_받을_수_없다() { Dealer dealer = new Dealer(new Name("딜러")); dealer.receiveCard(new Card(Shape.SPADE, Number.TEN)); dealer.receiveCard(new Card(Shape.HEART, Number.SEVEN)); diff --git a/src/test/java/domain/DeckTest.java b/src/test/java/domain/DeckTest.java index e1b47e1c3b..60e20833cd 100644 --- a/src/test/java/domain/DeckTest.java +++ b/src/test/java/domain/DeckTest.java @@ -2,15 +2,13 @@ import static org.junit.jupiter.api.Assertions.*; -import org.junit.jupiter.api.DisplayName; import org.junit.jupiter.api.Test; class DeckTest { private final static Integer DECK_SIZE = 52; @Test - @DisplayName("덱에서는 52장까지 뽑을 수 있고, 53번째에는 예외가 발생한다.") - void drawCard_After52Draws_ThrowsException() { + void 카드를_52장_초과해_뽑으면_예외가_발생한다() { Deck deck = new Deck(); for (int i = 0; i < DECK_SIZE; i++) { assertDoesNotThrow(deck::drawCard); diff --git a/src/test/java/domain/GameManagerTest.java b/src/test/java/domain/GameManagerTest.java index 3dc8ff8b6b..f8bc36527a 100644 --- a/src/test/java/domain/GameManagerTest.java +++ b/src/test/java/domain/GameManagerTest.java @@ -2,17 +2,13 @@ import static org.junit.jupiter.api.Assertions.*; -import java.util.ArrayList; import java.util.List; import java.util.Map; -import org.junit.jupiter.api.Disabled; -import org.junit.jupiter.api.DisplayName; import org.junit.jupiter.api.Test; class GameManagerTest { @Test - @DisplayName("플레이어들의 승패 결과를 딜러의 점수와 비교하여 정확히 Map으로 반환한다.") - void getGameResult_ReturnMap() { + void 플레이어들의_점수를_딜러와_비교해_승패를_반환한다() { Player pobi = new Player(new Name("pobi")); Player crong = new Player(new Name("crong")); GameManager gameManager = new GameManager(List.of(pobi, crong)); @@ -36,17 +32,4 @@ void getGameResult_ReturnMap() { assertEquals(GameResult.WIN, pobiResult); assertEquals(GameResult.LOSE, crongResult); } - -// @Test -// @DisplayName("플레이어들의 이름에 중복이 있는지 검사한다.") -// void validateDuplicateName_DuplicateName_ThrowsException() { -// List name = new ArrayList<>(); -// name.add("pobi"); -// name.add("jason"); -// name.add("pobi"); -// IllegalArgumentException exception = assertThrows(IllegalArgumentException.class, () -> { -// GameManager.validatePlayersNumber(name); -// }); -// assertEquals("중복된 참가자 이름이 있습니다!", exception.getMessage()); -// } } diff --git a/src/test/java/domain/NameTest.java b/src/test/java/domain/NameTest.java index 2989ff6f4f..1246cb58df 100644 --- a/src/test/java/domain/NameTest.java +++ b/src/test/java/domain/NameTest.java @@ -2,38 +2,31 @@ import static org.junit.jupiter.api.Assertions.*; -import org.junit.jupiter.api.DisplayName; import org.junit.jupiter.api.Test; class NameTest { // TODO: 나중에 커스텀 예외로 변경. 현재는 예외가 터지는 것만 검증됨. @Test - @DisplayName("이름은 비어있거나 공백일 수 없다.") - void validateBlank_InputBlank_ThrowsException() { + void 이름이_비어있거나_공백이면_예외가_발생한다() { String name = " "; - IllegalArgumentException exception = assertThrows(IllegalArgumentException.class, () -> { + assertThrows(IllegalArgumentException.class, () -> { new Name(name); }); - assertEquals("이름은 비어있거나 공백일 수 없습니다.", exception.getMessage()); } @Test - @DisplayName("이름은 2글자 이상이어야한다.") - void validateLength_InputOneLength_ThrowsException() { + void 이름이_2글자_미만이면_예외가_발생한다() { String name = "a"; - IllegalArgumentException exception = assertThrows(IllegalArgumentException.class, () -> { + assertThrows(IllegalArgumentException.class, () -> { new Name(name); }); - assertEquals("이름은 2~5글자만 허용됩니다.", exception.getMessage()); } @Test - @DisplayName("이름은 5글자 이하여야한다.") - void validateLength_InputSixLength_ThrowsException() { + void 이름이_5글자를_초과하면_예외가_발생한다() { String name = "abcdefg"; - IllegalArgumentException exception = assertThrows(IllegalArgumentException.class, () -> { + assertThrows(IllegalArgumentException.class, () -> { new Name(name); }); - assertEquals("이름은 2~5글자만 허용됩니다.", exception.getMessage()); } } diff --git a/src/test/java/domain/PlayerTest.java b/src/test/java/domain/PlayerTest.java index e2395d3962..fea0eb8ff1 100644 --- a/src/test/java/domain/PlayerTest.java +++ b/src/test/java/domain/PlayerTest.java @@ -2,14 +2,12 @@ import static org.junit.jupiter.api.Assertions.*; -import org.junit.jupiter.api.DisplayName; import org.junit.jupiter.api.Test; class PlayerTest { @Test - @DisplayName("플레이어의 점수가 21점을 초과하면 isBust는 true를 반환한다.") - void isBust_Score22_ReturnTrue() { + void 점수가_21점을_초과하면_버스트이다() { Player player = new Player(new Name("pobi")); player.receiveCard(new Card(Shape.SPADE, Number.TEN)); player.receiveCard(new Card(Shape.HEART, Number.JACK)); @@ -21,8 +19,7 @@ void isBust_Score22_ReturnTrue() { } @Test - @DisplayName("플레이어의 점수가 21점이면 isBust는 false를 반환한다.") - void isBust_Score21_ReturnFalse() { + void 점수가_21점이면_버스트가_아니다() { Player player = new Player(new Name("pobi")); player.receiveCard(new Card(Shape.SPADE, Number.NINE)); player.receiveCard(new Card(Shape.HEART, Number.JACK)); @@ -34,9 +31,7 @@ void isBust_Score21_ReturnFalse() { } @Test - @DisplayName("플레이어는 점수가 21점 미만일 때 카드를 더 받을 수 있다.") - void isContinueGame_UnderScore21_ReturnTrue() { - + void 점수가_21점_미만이면_카드를_추가로_받을_수_있다() { Player player = new Player(new Name("pobi")); player.receiveCard(new Card(Shape.SPADE, Number.EIGHT)); player.receiveCard(new Card(Shape.HEART, Number.JACK)); @@ -48,9 +43,7 @@ void isContinueGame_UnderScore21_ReturnTrue() { } @Test - @DisplayName("플레이어는 점수가 21점 이상일 때 카드를 더 받을 수 없다.") - void isContinueGame_OverScore21_ReturnFalse() { - + void 점수가_21점_이상이면_카드를_추가로_받을_수_없다() { Player player = new Player(new Name("pobi")); player.receiveCard(new Card(Shape.SPADE, Number.NINE)); player.receiveCard(new Card(Shape.HEART, Number.JACK)); @@ -62,8 +55,7 @@ void isContinueGame_OverScore21_ReturnFalse() { } @Test - @DisplayName("둘 다 버스트되지 않고, 플레이어 점수가 딜러 점수보다 높으면 플레이어가 승리한다.") - void judgeResult_PlayerScoreHigher_ReturnTrue() { + void 딜러보다_점수가_높으면_승리한다() { Player player = new Player(new Name("pobi")); Dealer dealer = new Dealer(new Name("딜러")); @@ -79,8 +71,7 @@ void judgeResult_PlayerScoreHigher_ReturnTrue() { } @Test - @DisplayName("둘 다 버스트되지 않고, 플레이어 점수와 딜러 점수가 같으면 비긴다.") - void judgeResult_PlayerScoreSame_ReturnTrue() { + void 딜러와_점수가_같으면_무승부이다() { Player player = new Player(new Name("pobi")); Dealer dealer = new Dealer(new Name("딜러")); @@ -96,8 +87,7 @@ void judgeResult_PlayerScoreSame_ReturnTrue() { } @Test - @DisplayName("둘 다 버스트되지 않고, 플레이어 점수보다 딜러 점수가 높으면 플레이어가 패배한다.") - void judgeResult_DealerScoreHigher_ReturnFalse() { + void 딜러보다_점수가_낮으면_패배한다() { Player player = new Player(new Name("pobi")); Dealer dealer = new Dealer(new Name("딜러")); @@ -112,8 +102,7 @@ void judgeResult_DealerScoreHigher_ReturnFalse() { } @Test - @DisplayName("플레이어가 버스트 되면, 딜러 점수 상관없이 패배한다.") - void judgeResult_PlayerBurst_ReturnFalse() { + void 플레이어가_버스트이면_패배한다() { Player player = new Player(new Name("pobi")); Dealer dealer = new Dealer(new Name("딜러")); @@ -130,8 +119,7 @@ void judgeResult_PlayerBurst_ReturnFalse() { } @Test - @DisplayName("플레이어가 버스트 되지 않을 때, 딜러가 버스트되면 플레이어가 승리한다.") - void judgeResult_DealerBurst_ReturnTrue() { + void 딜러가_버스트이면_승리한다() { Player player = new Player(new Name("pobi")); Dealer dealer = new Dealer(new Name("딜러")); diff --git a/src/test/java/view/InputValidatorTest.java b/src/test/java/view/InputValidatorTest.java new file mode 100644 index 0000000000..d8bd4a7f7e --- /dev/null +++ b/src/test/java/view/InputValidatorTest.java @@ -0,0 +1,14 @@ +package view; + +import static org.junit.jupiter.api.Assertions.*; + +import org.junit.jupiter.api.Test; + +class InputValidatorTest { + @Test + void 게임_진행_응답이_y_또는_n이_아니면_예외가_발생한다() { + assertThrows(IllegalArgumentException.class, () -> { + InputValidator.validateContinueResponse("dongkey"); + }); + } +} diff --git a/src/test/java/view/InputViewTest.java b/src/test/java/view/InputViewTest.java deleted file mode 100644 index c11dbfca9d..0000000000 --- a/src/test/java/view/InputViewTest.java +++ /dev/null @@ -1,37 +0,0 @@ -package view; - -import org.junit.jupiter.api.DisplayName; -import org.junit.jupiter.api.Test; - -import java.io.ByteArrayInputStream; -import java.io.InputStream; - -import static org.junit.jupiter.api.Assertions.*; - -class InputViewTest { - - private void command(String input) { - InputStream in = new ByteArrayInputStream(input.getBytes()); - System.setIn(in); - } - - @Test - @DisplayName("입력은 y와 n만 허용한다.") - void askContinue_InputOtherThanYAndN_ThrowsException() { - command("dongkey"); - String player = "JeongKong"; - assertThrows(IllegalArgumentException.class, () -> { - InputView.askContinue(player); - }); - } - - @Test - @DisplayName("입력은 정수만 허용한다.") - void askBettingAmount_ReturnInteger() { - command("1000"); - String player = "JeongKong"; - Integer result = InputView.askBettingAmount(player); - assertEquals(1000, result); - } -} - From a21dc806093082ab37fcefd1374b693af49b6405 Mon Sep 17 00:00:00 2001 From: xxbeann Date: Sat, 14 Mar 2026 00:15:26 +0900 Subject: [PATCH 09/44] =?UTF-8?q?refactor:=20Players=EC=97=90=20forEach=20?= =?UTF-8?q?=EB=A9=94=EC=84=9C=EB=93=9C=20=EB=8F=84=EC=9E=85=20=EB=B0=8F=20?= =?UTF-8?q?=EA=B4=80=EB=A0=A8=20=EB=A1=9C=EC=A7=81=20=EB=A6=AC=ED=8C=A9?= =?UTF-8?q?=ED=86=A0=EB=A7=81?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit - Players 일급 컬렉션을 생성한 후 순회하는 로직을 구현하기 위해 일급 컬렉션 안에 forEach 순회 메서드를 만들었습니다. 이는, player 리스트의 forEach를 위임한 역할입니다. - 처음에는 getPlayers를 통해 순회를 해결하려 했으나, 그럴 경우 캡슐화가 약해져 외부가 Players내부 표현 방식에 의존한다는 걸 알았습니다. 외부가 players 내부 구현을 알 경우 변경에 취약하고, 책임이 새어나가 확장에 불리하다 판단해 forEach를 도입했습니다. - 실제로 리팩터링 과정 중 눈에 띄게 가독성이 향상됨을 체감했습니다. --- .../controller/BlackJackGameController.java | 29 ++++++++++--------- src/main/java/domain/GameManager.java | 24 +++++++-------- src/main/java/domain/Players.java | 7 +++++ src/test/java/domain/GameManagerTest.java | 3 +- 4 files changed, 35 insertions(+), 28 deletions(-) diff --git a/src/main/java/controller/BlackJackGameController.java b/src/main/java/controller/BlackJackGameController.java index 7ff9d7e527..c843c26fcd 100644 --- a/src/main/java/controller/BlackJackGameController.java +++ b/src/main/java/controller/BlackJackGameController.java @@ -10,6 +10,7 @@ import java.util.Map; import static view.OutputView.printCards; +import static view.OutputView.printFinalCards; public class BlackJackGameController { @@ -17,7 +18,7 @@ public BlackJackGameController() { } public void run() { - List players = initPlayer(); + Players players = initPlayer(); GameManager gameManager = new GameManager(players); List playersNames = getPlayerNames(players); @@ -33,10 +34,8 @@ public void run() { endGame(gameManager, players, gameResult); } - private void playGame(List players, GameManager gameManager) { - for (Player player : players) { - playGameWithPlayer(player, gameManager); - } + private void playGame(Players players, GameManager gameManager) { + players.forEach(player -> playGameWithPlayer(player, gameManager)); playGameWithDealer(gameManager); } @@ -78,23 +77,25 @@ private void printParticipantCards(GameManager gameManager) { } } - private void endGame(GameManager gameManager, List players, Map gameResult) { + private void endGame(GameManager gameManager, Players players, Map gameResult) { OutputView.printFinalCards(gameManager.getDealerDto()); printFinalScores(players); OutputView.printGameResult(gameResult); } - private void printFinalScores(List players) { - for (Player player : players) { - OutputView.printFinalCards(player.getParticipantCardsDto()); - } + private void printFinalScores(Players players) { + // TODO: 나중에 getParticipantCardsDto 책임 분리하면 좋을 듯 + players.forEach(player -> printFinalCards(player.getParticipantCardsDto())); } - private List getPlayerNames(List players) { - return players.stream().map(Participant::getName).toList(); + private List getPlayerNames(Players players) { + List playerNames = new ArrayList<>(); + players.forEach(player -> playerNames.add(player.getName())); + return playerNames; + } - private List initPlayer() { + private Players initPlayer() { List players = new ArrayList<>(); List playerNames = getPlayerNames(); @@ -102,7 +103,7 @@ private List initPlayer() { Name playerName = new Name(name); players.add(new Player(playerName)); } - return players; + return new Players(players); } private List getPlayerNames() { diff --git a/src/main/java/domain/GameManager.java b/src/main/java/domain/GameManager.java index 31fb4495c8..5511631bde 100644 --- a/src/main/java/domain/GameManager.java +++ b/src/main/java/domain/GameManager.java @@ -11,10 +11,10 @@ public class GameManager { private final Dealer dealer; - private final List players; + private final Players players; private final Deck deck; - public GameManager(List players) { + public GameManager(Players players) { this.dealer = initDealer(); this.players = players; this.deck = new Deck(); @@ -39,10 +39,10 @@ private void distributeCardToDealer(Dealer dealer) { distributeInitialCards(dealer); } - private void distributeCardToPlayers(List players) { - for (Player player : players) { - distributeInitialCards(player); - } + private void distributeCardToPlayers(Players players) { + // ToDo: getPlayers를 쓰면 캡슐화가 약해진다. 바깥에서 내부구현 List에 의존하게 된다. + // TODO: 그래서 Iterable이나 forEach 순회 메서드를 만드는 게 낫다. + players.forEach(this::distributeInitialCards); } private void distributeInitialCards(Participant participant) { @@ -55,11 +55,9 @@ public ParticipantCardsDto getDealerDto() { } public List getPlayerDtos() { + // ToDo: 추후 책임 분리 하면 좋을 듯 List participantCardsDtos = new ArrayList<>(); - for (Player player : players) { - participantCardsDtos.add(player.getParticipantCardsDto()); - } - + players.forEach(player -> participantCardsDtos.add(player.getParticipantCardsDto())); return participantCardsDtos; } @@ -70,10 +68,10 @@ public void drawCardTo(Participant participant) { public Map getGameResult() { Map gameResult = new HashMap<>(); - for (Player player : players) { - GameResult result = player.judgeResult(this.dealer); + players.forEach(player -> { + GameResult result = player.judgeResult(dealer); gameResult.put(player.getName(), result); - } + }); return gameResult; } } diff --git a/src/main/java/domain/Players.java b/src/main/java/domain/Players.java index 54842c7ea3..03e9b06643 100644 --- a/src/main/java/domain/Players.java +++ b/src/main/java/domain/Players.java @@ -2,6 +2,7 @@ import java.util.ArrayList; import java.util.List; +import java.util.function.Consumer; public class Players { private static final int MAX_PLAYER = 8; @@ -13,6 +14,12 @@ public Players(List players) { this.players = new ArrayList<>(players); } + public void forEach(Consumer action) { + //TODO: Player 객체 리스트의 forEach를 위임. + //TODO: Consumer-값을 받아서 소비만하고 아무것도 반환하지 않는 함수. action은 각각의 player에 대해 수행할 행위 그 자체. + players.forEach(action); + } + public static void validatePlayersNumber(List players) { validateMinimumPlayers(players); validateMaximumPlayers(players); diff --git a/src/test/java/domain/GameManagerTest.java b/src/test/java/domain/GameManagerTest.java index f8bc36527a..6dcae94c47 100644 --- a/src/test/java/domain/GameManagerTest.java +++ b/src/test/java/domain/GameManagerTest.java @@ -11,7 +11,8 @@ class GameManagerTest { void 플레이어들의_점수를_딜러와_비교해_승패를_반환한다() { Player pobi = new Player(new Name("pobi")); Player crong = new Player(new Name("crong")); - GameManager gameManager = new GameManager(List.of(pobi, crong)); + Players players = new Players(List.of(pobi, crong)); + GameManager gameManager = new GameManager(players); Dealer dealer = gameManager.getDealer(); From e80746df37c70585fc9b745111d80f5120c91d0a Mon Sep 17 00:00:00 2001 From: xxbeann Date: Sat, 14 Mar 2026 01:44:35 +0900 Subject: [PATCH 10/44] =?UTF-8?q?refactor:=20Cards=20=ED=81=B4=EB=9E=98?= =?UTF-8?q?=EC=8A=A4=20ParticipantCards=EB=A1=9C=20rename?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../controller/BlackJackGameController.java | 1 + src/main/java/domain/Dealer.java | 2 +- src/main/java/domain/Deck.java | 12 +++++------ src/main/java/domain/Participant.java | 10 +++++----- .../{Cards.java => ParticipantCards.java} | 5 ++--- src/main/java/domain/Player.java | 2 +- ...rdsTest.java => ParticipantCardsTest.java} | 20 +++++++++---------- 7 files changed, 26 insertions(+), 26 deletions(-) rename src/main/java/domain/{Cards.java => ParticipantCards.java} (92%) rename src/test/java/domain/{CardsTest.java => ParticipantCardsTest.java} (57%) diff --git a/src/main/java/controller/BlackJackGameController.java b/src/main/java/controller/BlackJackGameController.java index c843c26fcd..57b9a5cee1 100644 --- a/src/main/java/controller/BlackJackGameController.java +++ b/src/main/java/controller/BlackJackGameController.java @@ -22,6 +22,7 @@ public void run() { GameManager gameManager = new GameManager(players); List playersNames = getPlayerNames(players); + // TODO: 베팅금액 입력 로직 OutputView.printGameInitialMessage(playersNames); gameManager.distributeInitialCards(); diff --git a/src/main/java/domain/Dealer.java b/src/main/java/domain/Dealer.java index 1a7d540f37..a6f7a5c4d9 100644 --- a/src/main/java/domain/Dealer.java +++ b/src/main/java/domain/Dealer.java @@ -8,7 +8,7 @@ public Dealer(Name name) { } public boolean isContinueGame() { - if (cards.calculateScore() >= CAN_RECEIVE_CARD_THRESHOLD) { + if (participantCards.calculateScore() >= CAN_RECEIVE_CARD_THRESHOLD) { return false; } return true; diff --git a/src/main/java/domain/Deck.java b/src/main/java/domain/Deck.java index f776369400..c03bed9a0e 100644 --- a/src/main/java/domain/Deck.java +++ b/src/main/java/domain/Deck.java @@ -5,25 +5,25 @@ import java.util.List; public class Deck { - private final Cards cards; + private final ParticipantCards participantCards; public Deck() { - this.cards = createDeck(); + this.participantCards = createDeck(); } public Card drawCard() { validateDeckSize(); - Card card = cards.removeFirst(); + Card card = participantCards.removeFirst(); return card; } private void validateDeckSize() { - if (cards.getSize() == 0) { + if (participantCards.getSize() == 0) { throw new IllegalArgumentException("덱에 카드가 없습니다."); } } - private Cards createDeck() { + private ParticipantCards createDeck() { List cards = new ArrayList<>(); for (Shape shape : Shape.values()) { for (Number number : Number.values()) { @@ -31,6 +31,6 @@ private Cards createDeck() { } } Collections.shuffle(cards); - return new Cards(cards); + return new ParticipantCards(cards); } } diff --git a/src/main/java/domain/Participant.java b/src/main/java/domain/Participant.java index 1c52984a91..7c1024dc0d 100644 --- a/src/main/java/domain/Participant.java +++ b/src/main/java/domain/Participant.java @@ -7,15 +7,15 @@ public abstract class Participant { private static final int BUST_THRESHOLD = 21; private final Name name; - protected final Cards cards; + protected final ParticipantCards participantCards; public Participant(Name name) { this.name = name; - cards = new Cards(new ArrayList<>()); + participantCards = new ParticipantCards(new ArrayList<>()); } public void receiveCard(Card card) { - cards.addCard(card); + participantCards.addCard(card); } public abstract boolean isContinueGame(); @@ -25,7 +25,7 @@ public String getName() { } public int getScore() { - return cards.calculateScore(); + return participantCards.calculateScore(); } public boolean isBust() { @@ -36,6 +36,6 @@ public boolean isBust() { } public ParticipantCardsDto getParticipantCardsDto() { - return new ParticipantCardsDto(name.getName(), cards.getCardsInfo(), getScore()); + return new ParticipantCardsDto(name.getName(), participantCards.getCardsInfo(), getScore()); } } diff --git a/src/main/java/domain/Cards.java b/src/main/java/domain/ParticipantCards.java similarity index 92% rename from src/main/java/domain/Cards.java rename to src/main/java/domain/ParticipantCards.java index db0a7b6f23..669ad08ee4 100644 --- a/src/main/java/domain/Cards.java +++ b/src/main/java/domain/ParticipantCards.java @@ -1,14 +1,13 @@ package domain; import java.util.ArrayList; -import java.util.Collections; import java.util.List; -public class Cards { +public class ParticipantCards { private final List cards; private int changeAvailableAceCount; - public Cards(List cards) { + public ParticipantCards(List cards) { this.cards = new ArrayList<>(cards); changeAvailableAceCount = 0; } diff --git a/src/main/java/domain/Player.java b/src/main/java/domain/Player.java index 86e7174e08..d61fe347c1 100644 --- a/src/main/java/domain/Player.java +++ b/src/main/java/domain/Player.java @@ -8,7 +8,7 @@ public Player(Name name) { } public boolean isContinueGame() { - if (cards.calculateScore() >= CAN_RECEIVE_CARD_THRESHOLD) { + if (participantCards.calculateScore() >= CAN_RECEIVE_CARD_THRESHOLD) { return false; } return true; diff --git a/src/test/java/domain/CardsTest.java b/src/test/java/domain/ParticipantCardsTest.java similarity index 57% rename from src/test/java/domain/CardsTest.java rename to src/test/java/domain/ParticipantCardsTest.java index 75ccb38e53..0da78f900b 100644 --- a/src/test/java/domain/CardsTest.java +++ b/src/test/java/domain/ParticipantCardsTest.java @@ -6,7 +6,7 @@ import java.util.List; import org.junit.jupiter.api.Test; -class CardsTest { +class ParticipantCardsTest { @Test void 에이스가_없으면_카드_숫자의_합을_반환한다() { @@ -14,12 +14,12 @@ class CardsTest { Card card2 = new Card(Shape.HEART, Number.EIGHT); List cards = new ArrayList<>(); - Cards testCards = new Cards(cards); + ParticipantCards testParticipantCards = new ParticipantCards(cards); - testCards.addCard(card1); - testCards.addCard(card2); + testParticipantCards.addCard(card1); + testParticipantCards.addCard(card2); - assertEquals(16, testCards.calculateScore()); + assertEquals(16, testParticipantCards.calculateScore()); } @Test @@ -29,12 +29,12 @@ class CardsTest { Card card3 = new Card(Shape.CLUB, Number.EIGHT); List cards = new ArrayList<>(); - Cards testCards = new Cards(cards); + ParticipantCards testParticipantCards = new ParticipantCards(cards); - testCards.addCard(card1); - testCards.addCard(card2); - testCards.addCard(card3); + testParticipantCards.addCard(card1); + testParticipantCards.addCard(card2); + testParticipantCards.addCard(card3); - assertEquals(14, testCards.calculateScore()); + assertEquals(14, testParticipantCards.calculateScore()); } } From f78112cabee6720164ebc7834beb590f4982f875 Mon Sep 17 00:00:00 2001 From: xxbeann Date: Sat, 14 Mar 2026 02:11:32 +0900 Subject: [PATCH 11/44] =?UTF-8?q?refactor:=20ParticipantCards=20=EB=8F=84?= =?UTF-8?q?=EC=9E=85?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit - Cards를 일급 컬렉션으로 생성후, 이 Cards를 ParticipantCards와 Deck이 필드로 갖게 했습니다. 기존 저는 card는 단일 1장, cards는 card의 복수형, Deck은 cards의 특수한 상황(52장 + shuffle)으로 생각했습니다. cards가 일급 컬렉션의 의도였으나 changeAvailableAceCount필드를 추가하게 되면서 player가 들고 있는 Cards로 일급 컬렉션이 전락했습니다. 영이의 말대로 Deck과 Cards가 각각 카드 리스트를 가지는 일급 컬렉션의 구조를 생각해 보았으나, 저는 순수하게 카드 리스트를 가지는 일급 컬렉션 cards를 고려했고. 이를 다시 Deck과 ParticipantCards에서 사용되게 했습니다. 기존에 있던 Cards를 ParticipantCards로 메서드 명을 바꾸면서 최대한 전체 구조에 수정을 줄이고자 했습니다. 실제로 순수한 일급 컬렉션 Cards를 도입해보니 ParticipantCards와 Cards의 책임이 어느정도 분리됨을 확인할 수 있었습니다. 다만, 영이의 설계와 제가 한 설계중 뭐가 더 나은 방향인지 궁금합니다! 제가 처음에 ParticipantCards에 getSize등의 메서드 들이 있었다가, 안써서 지웠는데, 굳이 꼽자면 나중에 확장성이 있겠다...정도...? --- src/main/java/domain/Cards.java | 38 +++++++++++++++++++ src/main/java/domain/Deck.java | 12 +++--- src/main/java/domain/Participant.java | 2 +- src/main/java/domain/ParticipantCards.java | 33 +++------------- .../java/domain/ParticipantCardsTest.java | 4 +- 5 files changed, 53 insertions(+), 36 deletions(-) create mode 100644 src/main/java/domain/Cards.java diff --git a/src/main/java/domain/Cards.java b/src/main/java/domain/Cards.java new file mode 100644 index 0000000000..3f0e4d6944 --- /dev/null +++ b/src/main/java/domain/Cards.java @@ -0,0 +1,38 @@ +package domain; + +import java.util.ArrayList; +import java.util.List; + +public class Cards { + private final List cards; + + public Cards(List cards) { + this.cards = new ArrayList<>(cards); + } + + public int getSize() { + return cards.size(); + } + + public List getCardsInfo() { + return cards.stream() + .map(Card::getCardInfo) + .toList(); + } + + public Card removeFirst() { + return cards.removeFirst(); + } + + public int sumScore() { + int sum = 0; + for (Card card : cards) { + sum += card.getScore(); + } + return sum; + } + + public void add(Card card) { + cards.add(card); + } +} diff --git a/src/main/java/domain/Deck.java b/src/main/java/domain/Deck.java index c03bed9a0e..f776369400 100644 --- a/src/main/java/domain/Deck.java +++ b/src/main/java/domain/Deck.java @@ -5,25 +5,25 @@ import java.util.List; public class Deck { - private final ParticipantCards participantCards; + private final Cards cards; public Deck() { - this.participantCards = createDeck(); + this.cards = createDeck(); } public Card drawCard() { validateDeckSize(); - Card card = participantCards.removeFirst(); + Card card = cards.removeFirst(); return card; } private void validateDeckSize() { - if (participantCards.getSize() == 0) { + if (cards.getSize() == 0) { throw new IllegalArgumentException("덱에 카드가 없습니다."); } } - private ParticipantCards createDeck() { + private Cards createDeck() { List cards = new ArrayList<>(); for (Shape shape : Shape.values()) { for (Number number : Number.values()) { @@ -31,6 +31,6 @@ private ParticipantCards createDeck() { } } Collections.shuffle(cards); - return new ParticipantCards(cards); + return new Cards(cards); } } diff --git a/src/main/java/domain/Participant.java b/src/main/java/domain/Participant.java index 7c1024dc0d..cc05034ca0 100644 --- a/src/main/java/domain/Participant.java +++ b/src/main/java/domain/Participant.java @@ -11,7 +11,7 @@ public abstract class Participant { public Participant(Name name) { this.name = name; - participantCards = new ParticipantCards(new ArrayList<>()); + participantCards = new ParticipantCards(new Cards(new ArrayList<>())); } public void receiveCard(Card card) { diff --git a/src/main/java/domain/ParticipantCards.java b/src/main/java/domain/ParticipantCards.java index 669ad08ee4..d335ccc49c 100644 --- a/src/main/java/domain/ParticipantCards.java +++ b/src/main/java/domain/ParticipantCards.java @@ -1,48 +1,27 @@ package domain; -import java.util.ArrayList; import java.util.List; public class ParticipantCards { - private final List cards; + private final Cards cards; private int changeAvailableAceCount; - public ParticipantCards(List cards) { - this.cards = new ArrayList<>(cards); - changeAvailableAceCount = 0; - } - - public Integer getSize() { - return this.cards.size(); - } - - public List getCards() { - return cards.stream() - .toList(); + public ParticipantCards(Cards cards) { + this.cards = cards; + this.changeAvailableAceCount = 0; } public List getCardsInfo() { - return cards.stream() - .map(Card::getCardInfo) - .toList(); - } - - public Card removeFirst() { - return cards.removeFirst(); + return cards.getCardsInfo(); } public int calculateScore() { - int sum = 0; - for (Card card : cards) { - sum += card.getScore(); - } - + int sum = cards.sumScore(); int availableAceCount = changeAvailableAceCount; while (availableAceCount > 0 && sum > 21) { sum -= 10; availableAceCount -= 1; } - return sum; } diff --git a/src/test/java/domain/ParticipantCardsTest.java b/src/test/java/domain/ParticipantCardsTest.java index 0da78f900b..0f1bce84d8 100644 --- a/src/test/java/domain/ParticipantCardsTest.java +++ b/src/test/java/domain/ParticipantCardsTest.java @@ -14,7 +14,7 @@ class ParticipantCardsTest { Card card2 = new Card(Shape.HEART, Number.EIGHT); List cards = new ArrayList<>(); - ParticipantCards testParticipantCards = new ParticipantCards(cards); + ParticipantCards testParticipantCards = new ParticipantCards(new Cards(new ArrayList<>())); testParticipantCards.addCard(card1); testParticipantCards.addCard(card2); @@ -29,7 +29,7 @@ class ParticipantCardsTest { Card card3 = new Card(Shape.CLUB, Number.EIGHT); List cards = new ArrayList<>(); - ParticipantCards testParticipantCards = new ParticipantCards(cards); + ParticipantCards testParticipantCards = new ParticipantCards(new Cards(new ArrayList<>())); testParticipantCards.addCard(card1); testParticipantCards.addCard(card2); From cd5ed7c5c200c7ffd6d3d7dd0c4a7ee7bbe8fdb3 Mon Sep 17 00:00:00 2001 From: xxbeann Date: Sat, 14 Mar 2026 02:32:41 +0900 Subject: [PATCH 12/44] =?UTF-8?q?chore:=20=EC=A3=BC=EC=84=9D=20=EC=B6=94?= =?UTF-8?q?=EA=B0=80?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- src/main/java/domain/Card.java | 2 +- src/test/java/domain/GameManagerTest.java | 1 + 2 files changed, 2 insertions(+), 1 deletion(-) diff --git a/src/main/java/domain/Card.java b/src/main/java/domain/Card.java index e9dcfeda4b..f93f34acb3 100644 --- a/src/main/java/domain/Card.java +++ b/src/main/java/domain/Card.java @@ -1 +1 @@ -package domain; public class Card { private final Shape shape; private final Number number; public Card(Shape shape, Number number) { this.shape = shape; this.number = number; } public int getScore() { return number.getValue(); } public String getCardInfo() { return number.getDisplayName() + shape.getShape(); } public boolean isAce() { return this.number.equals(Number.ACE); } } \ No newline at end of file +package domain; public class Card { private final Shape shape; private final Number number; public Card(Shape shape, Number number) { this.shape = shape; this.number = number; } public int getScore() { return number.getValue(); } // TODO: 카드 출력이 바뀌면 domain이 바뀐다. public String getCardInfo() { return number.getDisplayName() + shape.getShape(); } public boolean isAce() { return this.number.equals(Number.ACE); } } \ No newline at end of file diff --git a/src/test/java/domain/GameManagerTest.java b/src/test/java/domain/GameManagerTest.java index 6dcae94c47..62072b9ee3 100644 --- a/src/test/java/domain/GameManagerTest.java +++ b/src/test/java/domain/GameManagerTest.java @@ -9,6 +9,7 @@ class GameManagerTest { @Test void 플레이어들의_점수를_딜러와_비교해_승패를_반환한다() { + // TODO: 단위 테스트라기보다 얇은 통합 테스트 느낌 추후 리팩토링 예정 Player pobi = new Player(new Name("pobi")); Player crong = new Player(new Name("crong")); Players players = new Players(List.of(pobi, crong)); From ebdedf403df3e2ff775387472e3adfa503b631f0 Mon Sep 17 00:00:00 2001 From: xxbeann Date: Sat, 14 Mar 2026 02:55:28 +0900 Subject: [PATCH 13/44] =?UTF-8?q?refactor:=20Participant=20Domain=EC=97=90?= =?UTF-8?q?=EC=84=9C=20DTO=EC=9D=98=EC=A1=B4=EC=84=B1=20=EC=A0=9C=EA=B1=B0?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../java/controller/BlackJackGameController.java | 14 +++++++++++--- src/main/java/domain/Participant.java | 7 +++---- 2 files changed, 14 insertions(+), 7 deletions(-) diff --git a/src/main/java/controller/BlackJackGameController.java b/src/main/java/controller/BlackJackGameController.java index 57b9a5cee1..edc63ca8b8 100644 --- a/src/main/java/controller/BlackJackGameController.java +++ b/src/main/java/controller/BlackJackGameController.java @@ -56,14 +56,14 @@ public void playGameWithPlayer(Player player, GameManager gameManager) { break; } gameManager.drawCardTo(player); - printCards(player.getParticipantCardsDto()); + printCards(toParticipantCardsDto(player)); } } private boolean isStopGame(Player player) { String response = InputView.askContinue(player.getName()); if (response.equals("n")) { - printCards(player.getParticipantCardsDto()); + printCards(toParticipantCardsDto(player)); return true; } return false; @@ -86,7 +86,7 @@ private void endGame(GameManager gameManager, Players players, Map printFinalCards(player.getParticipantCardsDto())); + players.forEach(player -> printFinalCards(toParticipantCardsDto(player))); } private List getPlayerNames(Players players) { @@ -110,4 +110,12 @@ private Players initPlayer() { private List getPlayerNames() { return InputView.askPlayerNames(); } + + private ParticipantCardsDto toParticipantCardsDto(Participant participant) { + return new ParticipantCardsDto( + participant.getName(), + participant.getCardsInfo(), + participant.getScore() + ); + } } diff --git a/src/main/java/domain/Participant.java b/src/main/java/domain/Participant.java index cc05034ca0..dc9674026b 100644 --- a/src/main/java/domain/Participant.java +++ b/src/main/java/domain/Participant.java @@ -1,8 +1,7 @@ package domain; -import dto.ParticipantCardsDto; - import java.util.ArrayList; +import java.util.List; public abstract class Participant { private static final int BUST_THRESHOLD = 21; @@ -35,7 +34,7 @@ public boolean isBust() { return false; } - public ParticipantCardsDto getParticipantCardsDto() { - return new ParticipantCardsDto(name.getName(), participantCards.getCardsInfo(), getScore()); + public List getCardsInfo() { + return participantCards.getCardsInfo(); } } From 4c4739db60fbe9d395b8963bbc346345233ae809 Mon Sep 17 00:00:00 2001 From: xxbeann Date: Sat, 14 Mar 2026 02:59:17 +0900 Subject: [PATCH 14/44] =?UTF-8?q?chore:=20=EC=A3=BC=EC=84=9D=20=EC=A0=9C?= =?UTF-8?q?=EA=B1=B0?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- src/main/java/controller/BlackJackGameController.java | 1 - src/main/java/domain/Card.java | 2 +- 2 files changed, 1 insertion(+), 2 deletions(-) diff --git a/src/main/java/controller/BlackJackGameController.java b/src/main/java/controller/BlackJackGameController.java index edc63ca8b8..20018d4b68 100644 --- a/src/main/java/controller/BlackJackGameController.java +++ b/src/main/java/controller/BlackJackGameController.java @@ -85,7 +85,6 @@ private void endGame(GameManager gameManager, Players players, Map printFinalCards(toParticipantCardsDto(player))); } diff --git a/src/main/java/domain/Card.java b/src/main/java/domain/Card.java index f93f34acb3..e9dcfeda4b 100644 --- a/src/main/java/domain/Card.java +++ b/src/main/java/domain/Card.java @@ -1 +1 @@ -package domain; public class Card { private final Shape shape; private final Number number; public Card(Shape shape, Number number) { this.shape = shape; this.number = number; } public int getScore() { return number.getValue(); } // TODO: 카드 출력이 바뀌면 domain이 바뀐다. public String getCardInfo() { return number.getDisplayName() + shape.getShape(); } public boolean isAce() { return this.number.equals(Number.ACE); } } \ No newline at end of file +package domain; public class Card { private final Shape shape; private final Number number; public Card(Shape shape, Number number) { this.shape = shape; this.number = number; } public int getScore() { return number.getValue(); } public String getCardInfo() { return number.getDisplayName() + shape.getShape(); } public boolean isAce() { return this.number.equals(Number.ACE); } } \ No newline at end of file From 8fda4dc03f6fe39ec64d34f44caf8d8bf5f31d75 Mon Sep 17 00:00:00 2001 From: xxbeann Date: Sat, 14 Mar 2026 03:23:02 +0900 Subject: [PATCH 15/44] =?UTF-8?q?refactor:=20gameManager=20=EC=97=90?= =?UTF-8?q?=EC=84=9C=20DTO=20=EC=9D=98=EC=A1=B4=20=EB=B6=84=EB=A6=AC?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../java/controller/BlackJackGameController.java | 14 +++++--------- src/main/java/domain/Card.java | 2 +- src/main/java/domain/GameManager.java | 11 ----------- 3 files changed, 6 insertions(+), 21 deletions(-) diff --git a/src/main/java/controller/BlackJackGameController.java b/src/main/java/controller/BlackJackGameController.java index 20018d4b68..884bbf0cc3 100644 --- a/src/main/java/controller/BlackJackGameController.java +++ b/src/main/java/controller/BlackJackGameController.java @@ -26,7 +26,7 @@ public void run() { OutputView.printGameInitialMessage(playersNames); gameManager.distributeInitialCards(); - printParticipantCards(gameManager); + printParticipantCards(gameManager.getDealer(), players); playGame(players, gameManager); @@ -69,17 +69,13 @@ private boolean isStopGame(Player player) { return false; } - private void printParticipantCards(GameManager gameManager) { - ParticipantCardsDto dealerDto = gameManager.getDealerDto(); - OutputView.printCards(dealerDto); - List playerDtos = gameManager.getPlayerDtos(); - for (ParticipantCardsDto playerDto : playerDtos) { - OutputView.printCards(playerDto); - } + private void printParticipantCards(Dealer dealer, Players players) { + OutputView.printCards(toParticipantCardsDto(dealer)); + players.forEach(player -> OutputView.printCards(toParticipantCardsDto(player))); } private void endGame(GameManager gameManager, Players players, Map gameResult) { - OutputView.printFinalCards(gameManager.getDealerDto()); + OutputView.printFinalCards(toParticipantCardsDto(gameManager.getDealer())); printFinalScores(players); OutputView.printGameResult(gameResult); } diff --git a/src/main/java/domain/Card.java b/src/main/java/domain/Card.java index e9dcfeda4b..0a4802f1d6 100644 --- a/src/main/java/domain/Card.java +++ b/src/main/java/domain/Card.java @@ -1 +1 @@ -package domain; public class Card { private final Shape shape; private final Number number; public Card(Shape shape, Number number) { this.shape = shape; this.number = number; } public int getScore() { return number.getValue(); } public String getCardInfo() { return number.getDisplayName() + shape.getShape(); } public boolean isAce() { return this.number.equals(Number.ACE); } } \ No newline at end of file +package domain; public class Card { private final Shape shape; private final Number number; public Card(Shape shape, Number number) { this.shape = shape; this.number = number; } public int getScore() { return number.getValue(); } // TODO: DTO 책임 분리 public String getCardInfo() { return number.getDisplayName() + shape.getShape(); } public boolean isAce() { return this.number.equals(Number.ACE); } } \ No newline at end of file diff --git a/src/main/java/domain/GameManager.java b/src/main/java/domain/GameManager.java index 5511631bde..cc61d8d45b 100644 --- a/src/main/java/domain/GameManager.java +++ b/src/main/java/domain/GameManager.java @@ -50,17 +50,6 @@ private void distributeInitialCards(Participant participant) { drawCardTo(participant); } - public ParticipantCardsDto getDealerDto() { - return dealer.getParticipantCardsDto(); - } - - public List getPlayerDtos() { - // ToDo: 추후 책임 분리 하면 좋을 듯 - List participantCardsDtos = new ArrayList<>(); - players.forEach(player -> participantCardsDtos.add(player.getParticipantCardsDto())); - return participantCardsDtos; - } - public void drawCardTo(Participant participant) { Card card = deck.drawCard(); participant.receiveCard(card); From b7aeb26d4266914fe097d8f538ec6c65fe435088 Mon Sep 17 00:00:00 2001 From: xxbeann Date: Sat, 14 Mar 2026 12:13:56 +0900 Subject: [PATCH 16/44] chore: code formatting --- src/main/java/Application.java | 1 - src/main/java/domain/GameManager.java | 7 ------- src/main/java/domain/Players.java | 2 -- 3 files changed, 10 deletions(-) diff --git a/src/main/java/Application.java b/src/main/java/Application.java index 27474ebbed..863d606dc2 100644 --- a/src/main/java/Application.java +++ b/src/main/java/Application.java @@ -4,6 +4,5 @@ public class Application { public static void main(String[] args) { BlackJackGameController blackJackGameController = new BlackJackGameController(); blackJackGameController.run(); - } } diff --git a/src/main/java/domain/GameManager.java b/src/main/java/domain/GameManager.java index cc61d8d45b..ab740863f7 100644 --- a/src/main/java/domain/GameManager.java +++ b/src/main/java/domain/GameManager.java @@ -1,12 +1,7 @@ package domain; -import dto.ParticipantCardsDto; -import java.util.ArrayList; import java.util.HashMap; -import java.util.HashSet; -import java.util.List; import java.util.Map; -import java.util.Set; public class GameManager { @@ -40,8 +35,6 @@ private void distributeCardToDealer(Dealer dealer) { } private void distributeCardToPlayers(Players players) { - // ToDo: getPlayers를 쓰면 캡슐화가 약해진다. 바깥에서 내부구현 List에 의존하게 된다. - // TODO: 그래서 Iterable이나 forEach 순회 메서드를 만드는 게 낫다. players.forEach(this::distributeInitialCards); } diff --git a/src/main/java/domain/Players.java b/src/main/java/domain/Players.java index 03e9b06643..12a8b77344 100644 --- a/src/main/java/domain/Players.java +++ b/src/main/java/domain/Players.java @@ -15,8 +15,6 @@ public Players(List players) { } public void forEach(Consumer action) { - //TODO: Player 객체 리스트의 forEach를 위임. - //TODO: Consumer-값을 받아서 소비만하고 아무것도 반환하지 않는 함수. action은 각각의 player에 대해 수행할 행위 그 자체. players.forEach(action); } From 9f4454863ee66201c0c729a4c0c23d9a667f898c Mon Sep 17 00:00:00 2001 From: xxbeann Date: Sat, 14 Mar 2026 12:22:20 +0900 Subject: [PATCH 17/44] =?UTF-8?q?feat:=20controller=EC=97=90=20askBettingA?= =?UTF-8?q?mount=20=EC=97=B0=EA=B2=B0?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- src/main/java/controller/BlackJackGameController.java | 1 + src/main/java/view/InputView.java | 1 + src/main/java/view/OutputView.java | 1 + 3 files changed, 3 insertions(+) diff --git a/src/main/java/controller/BlackJackGameController.java b/src/main/java/controller/BlackJackGameController.java index 884bbf0cc3..3e94e72c93 100644 --- a/src/main/java/controller/BlackJackGameController.java +++ b/src/main/java/controller/BlackJackGameController.java @@ -23,6 +23,7 @@ public void run() { List playersNames = getPlayerNames(players); // TODO: 베팅금액 입력 로직 + players.forEach(player -> InputView.askBettingAmount(player.getName())); OutputView.printGameInitialMessage(playersNames); gameManager.distributeInitialCards(); diff --git a/src/main/java/view/InputView.java b/src/main/java/view/InputView.java index 4994f1868a..205413ce59 100644 --- a/src/main/java/view/InputView.java +++ b/src/main/java/view/InputView.java @@ -23,6 +23,7 @@ public static String askContinue(String player) { } public static Integer askBettingAmount(String player) { + System.out.println(); System.out.println(player + "의 배팅 금액은?"); Scanner sc = new Scanner(System.in); Integer input = sc.nextInt(); diff --git a/src/main/java/view/OutputView.java b/src/main/java/view/OutputView.java index 85e8338303..d8c78d8ce8 100644 --- a/src/main/java/view/OutputView.java +++ b/src/main/java/view/OutputView.java @@ -11,6 +11,7 @@ public class OutputView { public static void printGameInitialMessage(List playersNames) { String playersNamesMessage = String.join(",", playersNames); + System.out.println(); System.out.printf(DEALER + "와 %s에게 2장을 나누었습니다.%n", playersNamesMessage); } From 7a419effaa4d12f2afb71c5f692c472a4054677d Mon Sep 17 00:00:00 2001 From: xxbeann Date: Sat, 14 Mar 2026 12:28:00 +0900 Subject: [PATCH 18/44] =?UTF-8?q?chore:=20=EC=B6=9C=EB=A0=A5=20=EA=B0=9C?= =?UTF-8?q?=ED=96=89=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/controller/BlackJackGameController.java | 2 +- src/main/java/view/InputView.java | 1 + src/main/java/view/OutputView.java | 3 ++- 3 files changed, 4 insertions(+), 2 deletions(-) diff --git a/src/main/java/controller/BlackJackGameController.java b/src/main/java/controller/BlackJackGameController.java index 3e94e72c93..99bfb8c036 100644 --- a/src/main/java/controller/BlackJackGameController.java +++ b/src/main/java/controller/BlackJackGameController.java @@ -22,7 +22,7 @@ public void run() { GameManager gameManager = new GameManager(players); List playersNames = getPlayerNames(players); - // TODO: 베팅금액 입력 로직 + // TODO: 베팅금액 입력 로직 - return 값 아직 활용 안함 players.forEach(player -> InputView.askBettingAmount(player.getName())); OutputView.printGameInitialMessage(playersNames); diff --git a/src/main/java/view/InputView.java b/src/main/java/view/InputView.java index 205413ce59..d88abbd899 100644 --- a/src/main/java/view/InputView.java +++ b/src/main/java/view/InputView.java @@ -15,6 +15,7 @@ public static List askPlayerNames() { } public static String askContinue(String player) { + System.out.println(); System.out.println(player + "는 한장의 카드를 더 받겠습니까? (예는 y, 아니오는 n)"); Scanner sc = new Scanner(System.in); String input = sc.nextLine(); diff --git a/src/main/java/view/OutputView.java b/src/main/java/view/OutputView.java index d8c78d8ce8..0b95d0a50c 100644 --- a/src/main/java/view/OutputView.java +++ b/src/main/java/view/OutputView.java @@ -27,6 +27,7 @@ public static void printFinalCards(ParticipantCardsDto participantCardsDto) { } public static void printDealerMessage() { + System.out.println(); System.out.println(DEALER + "는 16이하라 한장의 카드를 더 받았습니다."); } @@ -45,7 +46,7 @@ public static void printGameResult(Map gameResult) { resultMessage.append(entry.getKey()).append(": ").append("패%n"); loseCount += 1; } - + System.out.println(); System.out.println("## 최종 승패"); System.out.println(DEALER + ": " + loseCount + "승" + " " + winCount + "패"); System.out.printf(resultMessage.toString()); From 8545f7a3955daca3287952b77f4ff662ab85bdd1 Mon Sep 17 00:00:00 2001 From: xxbeann Date: Sat, 14 Mar 2026 16:33:06 +0900 Subject: [PATCH 19/44] =?UTF-8?q?feat:=20=EC=B0=B8=EA=B0=80=EC=9E=90=20?= =?UTF-8?q?=EB=B0=B0=ED=8C=85=20=EA=B8=88=EC=95=A1=20=EA=B4=80=EB=A6=AC=20?= =?UTF-8?q?=EA=B8=B0=EB=8A=A5=20=EC=B6=94=EA=B0=80?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit - BettingManager 도입으로 참가자별 배팅 금액 관리 - BettingAmount에 0원/승리 배팅 금액 계산 로직 추가 - Participant의 이름 반환 타입을 Name 객체로 변경 - 배팅 금액 관련 단위 테스트 추가 --- .../controller/BlackJackGameController.java | 13 +++---- src/main/java/domain/BettingAmount.java | 18 ++++++++-- src/main/java/domain/BettingManager.java | 25 +++++++++++++ src/main/java/domain/GameManager.java | 2 +- src/main/java/domain/Participant.java | 4 +-- src/main/java/domain/Player.java | 10 +++--- src/test/java/domain/BettingAmountTest.java | 8 ----- src/test/java/domain/BettingManagerTest.java | 35 +++++++++++++++++++ 8 files changed, 87 insertions(+), 28 deletions(-) create mode 100644 src/main/java/domain/BettingManager.java create mode 100644 src/test/java/domain/BettingManagerTest.java diff --git a/src/main/java/controller/BlackJackGameController.java b/src/main/java/controller/BlackJackGameController.java index 99bfb8c036..d9868821b5 100644 --- a/src/main/java/controller/BlackJackGameController.java +++ b/src/main/java/controller/BlackJackGameController.java @@ -20,19 +20,14 @@ public BlackJackGameController() { public void run() { Players players = initPlayer(); GameManager gameManager = new GameManager(players); - List playersNames = getPlayerNames(players); // TODO: 베팅금액 입력 로직 - return 값 아직 활용 안함 - players.forEach(player -> InputView.askBettingAmount(player.getName())); + players.forEach(player -> InputView.askBettingAmount(player.getName().getName())); OutputView.printGameInitialMessage(playersNames); - gameManager.distributeInitialCards(); printParticipantCards(gameManager.getDealer(), players); - playGame(players, gameManager); - Map gameResult = gameManager.getGameResult(); - endGame(gameManager, players, gameResult); } @@ -62,7 +57,7 @@ public void playGameWithPlayer(Player player, GameManager gameManager) { } private boolean isStopGame(Player player) { - String response = InputView.askContinue(player.getName()); + String response = InputView.askContinue(player.getName().getName()); if (response.equals("n")) { printCards(toParticipantCardsDto(player)); return true; @@ -87,7 +82,7 @@ private void printFinalScores(Players players) { private List getPlayerNames(Players players) { List playerNames = new ArrayList<>(); - players.forEach(player -> playerNames.add(player.getName())); + players.forEach(player -> playerNames.add(player.getName().getName())); return playerNames; } @@ -109,7 +104,7 @@ private List getPlayerNames() { private ParticipantCardsDto toParticipantCardsDto(Participant participant) { return new ParticipantCardsDto( - participant.getName(), + participant.getName().getName(), participant.getCardsInfo(), participant.getScore() ); diff --git a/src/main/java/domain/BettingAmount.java b/src/main/java/domain/BettingAmount.java index b78303a965..b3ba6794c8 100644 --- a/src/main/java/domain/BettingAmount.java +++ b/src/main/java/domain/BettingAmount.java @@ -1,16 +1,28 @@ package domain; public class BettingAmount { - private final Integer bettingAmount; + private final Integer money; public BettingAmount(Integer bettingAmount) { validateMinus(bettingAmount); - this.bettingAmount = bettingAmount; + this.money = bettingAmount; } private static void validateMinus(Integer bettingAmount) { - if (bettingAmount <= 0) { + if (bettingAmount < 0) { throw new IllegalArgumentException("베팅 금액은 음수일 없습니다."); } } + + public Integer getMoney() { + return money; + } + + public static BettingAmount zero() { + return new BettingAmount(0); + } + + public BettingAmount doubleAmount() { + return new BettingAmount(money * 2); + } } diff --git a/src/main/java/domain/BettingManager.java b/src/main/java/domain/BettingManager.java new file mode 100644 index 0000000000..75628868aa --- /dev/null +++ b/src/main/java/domain/BettingManager.java @@ -0,0 +1,25 @@ +package domain; + +import java.util.HashMap; +import java.util.Map; + +public class BettingManager { + private final Map bettingAmounts; + + public BettingManager(Map playerBettingAmountMap) { + this.bettingAmounts = new HashMap<>(playerBettingAmountMap); + } + + public BettingAmount getAmount(Name name) { + return bettingAmounts.get(name); + } + + public void lose(Name name) { + bettingAmounts.put(name, BettingAmount.zero()); + } + + public void win(Name name) { + BettingAmount amount = getAmount(name); + bettingAmounts.put(name, amount.doubleAmount()); + } +} diff --git a/src/main/java/domain/GameManager.java b/src/main/java/domain/GameManager.java index ab740863f7..77c1c1ef3f 100644 --- a/src/main/java/domain/GameManager.java +++ b/src/main/java/domain/GameManager.java @@ -52,7 +52,7 @@ public Map getGameResult() { Map gameResult = new HashMap<>(); players.forEach(player -> { GameResult result = player.judgeResult(dealer); - gameResult.put(player.getName(), result); + gameResult.put(player.getName().getName(), result); }); return gameResult; } diff --git a/src/main/java/domain/Participant.java b/src/main/java/domain/Participant.java index dc9674026b..53e04ff165 100644 --- a/src/main/java/domain/Participant.java +++ b/src/main/java/domain/Participant.java @@ -19,8 +19,8 @@ public void receiveCard(Card card) { public abstract boolean isContinueGame(); - public String getName() { - return name.getName(); + public Name getName() { + return this.name; } public int getScore() { diff --git a/src/main/java/domain/Player.java b/src/main/java/domain/Player.java index d61fe347c1..b4cad89e18 100644 --- a/src/main/java/domain/Player.java +++ b/src/main/java/domain/Player.java @@ -15,18 +15,18 @@ public boolean isContinueGame() { } public GameResult judgeResult(Dealer dealer) { - if (this.isBust()) { + if (this.isBust()) { // TODO: 배팅 금액을 모두 잃는다. return GameResult.LOSE; } - if (dealer.isBust()) { + if (dealer.isBust()) { // TODO: 배팅 금액을 받는다. return GameResult.WIN; } if (this.getScore() > dealer.getScore()) { - return GameResult.WIN; + return GameResult.WIN; // TODO: 배팅 금액을 받는다. } if (this.getScore() < dealer.getScore()) { - return GameResult.LOSE; + return GameResult.LOSE; // TODO: 배팅 금액을 모두 잃는다. } - return GameResult.DRAW; + return GameResult.DRAW; // TODO: 배팅 금액을 돌려 받는다. } } diff --git a/src/test/java/domain/BettingAmountTest.java b/src/test/java/domain/BettingAmountTest.java index 95c6c39d12..a947d12bea 100644 --- a/src/test/java/domain/BettingAmountTest.java +++ b/src/test/java/domain/BettingAmountTest.java @@ -6,14 +6,6 @@ class BettingAmountTest { - @Test - void 베팅_금액이_0원이면_예외가_발생한다() { - Integer testBettingAmount = 0; - assertThrows(IllegalArgumentException.class, () -> { - new BettingAmount(testBettingAmount); - }); - } - @Test void 베팅_금액이_음수면_예외가_발생한다() { Integer testBettingAmount = -1000; diff --git a/src/test/java/domain/BettingManagerTest.java b/src/test/java/domain/BettingManagerTest.java new file mode 100644 index 0000000000..e21ca4cd32 --- /dev/null +++ b/src/test/java/domain/BettingManagerTest.java @@ -0,0 +1,35 @@ +package domain; + +import static org.junit.jupiter.api.Assertions.assertEquals; + +import java.util.HashMap; +import java.util.Map; +import org.junit.jupiter.api.Test; + +public class BettingManagerTest { + + @Test + void 참가자가_패배하면_배팅금액은_0원이_된다() { + Player player = new Player(new Name("pobi")); + Map amountMap = new HashMap<>(); + amountMap.put(player.getName(), new BettingAmount(1000)); + BettingManager bettingManager = new BettingManager(amountMap); + bettingManager.lose(player.getName()); + int expected = 0; + int actual = bettingManager.getAmount(player.getName()).getMoney(); + assertEquals(expected, actual); + } + + @Test + void 참가자가_승리하면_배팅금액을_받는다() { + Player player = new Player(new Name("pobi")); + Map amountMap = new HashMap<>(); + BettingAmount bettingAmount = new BettingAmount(1000); + amountMap.put(player.getName(), bettingAmount); + BettingManager bettingManager = new BettingManager(amountMap); + bettingManager.win(player.getName()); + int expected = 2000; + int actual = bettingManager.getAmount(player.getName()).getMoney(); + assertEquals(expected, actual); + } +} From b2c5f8b9e2dbe71816313f5c6cf2b48d33ddaf2f Mon Sep 17 00:00:00 2001 From: xxbeann Date: Sat, 14 Mar 2026 20:51:05 +0900 Subject: [PATCH 20/44] =?UTF-8?q?feat:=20=EB=B8=94=EB=9E=99=EC=9E=AD=20?= =?UTF-8?q?=ED=8C=90=EC=A0=95=20=EB=B0=8F=20=EB=B0=B0=ED=8C=85=20=EC=A0=95?= =?UTF-8?q?=EC=82=B0=20=EB=A1=9C=EC=A7=81=20=EC=B6=94=EA=B0=80?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit - Participant에 블랙잭 판정 로직 추가 - ParticipantCards에 카드 개수 조회 기능 추가 - BettingManager에 블랙잭 승리 정산 기능 추가 - BettingAmount에 1.5배 계산 로직 추가 - 블랙잭 및 배팅 정산 관련 테스트 보강 --- src/main/java/domain/BettingAmount.java | 4 +-- src/main/java/domain/BettingManager.java | 7 +++- src/main/java/domain/GameManager.java | 1 + src/main/java/domain/Participant.java | 4 +++ src/main/java/domain/ParticipantCards.java | 4 +++ src/test/java/domain/BettingManagerTest.java | 15 +++++++- .../java/domain/ParticipantCardsTest.java | 2 -- src/test/java/domain/PlayerTest.java | 34 +++++++++++++++++++ 8 files changed, 65 insertions(+), 6 deletions(-) diff --git a/src/main/java/domain/BettingAmount.java b/src/main/java/domain/BettingAmount.java index b3ba6794c8..7e426accf1 100644 --- a/src/main/java/domain/BettingAmount.java +++ b/src/main/java/domain/BettingAmount.java @@ -22,7 +22,7 @@ public static BettingAmount zero() { return new BettingAmount(0); } - public BettingAmount doubleAmount() { - return new BettingAmount(money * 2); + public BettingAmount oneAndAHalfAmount() { + return new BettingAmount(money * 3 / 2); } } diff --git a/src/main/java/domain/BettingManager.java b/src/main/java/domain/BettingManager.java index 75628868aa..35712079f9 100644 --- a/src/main/java/domain/BettingManager.java +++ b/src/main/java/domain/BettingManager.java @@ -20,6 +20,11 @@ public void lose(Name name) { public void win(Name name) { BettingAmount amount = getAmount(name); - bettingAmounts.put(name, amount.doubleAmount()); + bettingAmounts.put(name, amount); + } + + public void blackJackWin(Name name) { + BettingAmount amount = getAmount(name); + bettingAmounts.put(name, amount.oneAndAHalfAmount()); } } diff --git a/src/main/java/domain/GameManager.java b/src/main/java/domain/GameManager.java index 77c1c1ef3f..7ffbb01ebd 100644 --- a/src/main/java/domain/GameManager.java +++ b/src/main/java/domain/GameManager.java @@ -48,6 +48,7 @@ public void drawCardTo(Participant participant) { participant.receiveCard(card); } + //TODO: 나중에 getGameResult랑 judgeResult와 함께하는 클래스를 하나 만들어야 할듯 public Map getGameResult() { Map gameResult = new HashMap<>(); players.forEach(player -> { diff --git a/src/main/java/domain/Participant.java b/src/main/java/domain/Participant.java index 53e04ff165..966f430ced 100644 --- a/src/main/java/domain/Participant.java +++ b/src/main/java/domain/Participant.java @@ -34,6 +34,10 @@ public boolean isBust() { return false; } + public boolean isBlackJack() { + return participantCards.getCardSize() == 2 && getScore() == 21; + } + public List getCardsInfo() { return participantCards.getCardsInfo(); } diff --git a/src/main/java/domain/ParticipantCards.java b/src/main/java/domain/ParticipantCards.java index d335ccc49c..b93897d786 100644 --- a/src/main/java/domain/ParticipantCards.java +++ b/src/main/java/domain/ParticipantCards.java @@ -31,4 +31,8 @@ public void addCard(Card card) { } cards.add(card); } + + public int getCardSize() { + return cards.getSize(); + } } diff --git a/src/test/java/domain/BettingManagerTest.java b/src/test/java/domain/BettingManagerTest.java index e21ca4cd32..2171edf4b5 100644 --- a/src/test/java/domain/BettingManagerTest.java +++ b/src/test/java/domain/BettingManagerTest.java @@ -28,7 +28,20 @@ public class BettingManagerTest { amountMap.put(player.getName(), bettingAmount); BettingManager bettingManager = new BettingManager(amountMap); bettingManager.win(player.getName()); - int expected = 2000; + int expected = 1000; + int actual = bettingManager.getAmount(player.getName()).getMoney(); + assertEquals(expected, actual); + } + + @Test + void 참가자가_블랙잭이면_배팅금액을_받는다() { + Player player = new Player(new Name("pobi")); + Map amountMap = new HashMap<>(); + BettingAmount bettingAmount = new BettingAmount(1000); + amountMap.put(player.getName(), bettingAmount); + BettingManager bettingManager = new BettingManager(amountMap); + bettingManager.blackJackWin(player.getName()); + int expected = 1500; int actual = bettingManager.getAmount(player.getName()).getMoney(); assertEquals(expected, actual); } diff --git a/src/test/java/domain/ParticipantCardsTest.java b/src/test/java/domain/ParticipantCardsTest.java index 0f1bce84d8..f2f7e94184 100644 --- a/src/test/java/domain/ParticipantCardsTest.java +++ b/src/test/java/domain/ParticipantCardsTest.java @@ -13,7 +13,6 @@ class ParticipantCardsTest { Card card1 = new Card(Shape.SPADE, Number.EIGHT); Card card2 = new Card(Shape.HEART, Number.EIGHT); - List cards = new ArrayList<>(); ParticipantCards testParticipantCards = new ParticipantCards(new Cards(new ArrayList<>())); testParticipantCards.addCard(card1); @@ -28,7 +27,6 @@ class ParticipantCardsTest { Card card2 = new Card(Shape.HEART, Number.FIVE); Card card3 = new Card(Shape.CLUB, Number.EIGHT); - List cards = new ArrayList<>(); ParticipantCards testParticipantCards = new ParticipantCards(new Cards(new ArrayList<>())); testParticipantCards.addCard(card1); diff --git a/src/test/java/domain/PlayerTest.java b/src/test/java/domain/PlayerTest.java index fea0eb8ff1..93f4f99722 100644 --- a/src/test/java/domain/PlayerTest.java +++ b/src/test/java/domain/PlayerTest.java @@ -30,6 +30,40 @@ class PlayerTest { assertEquals(false, result); } + @Test + void 에이스와_10점카드를_받으면_블랙잭이다() { + Player player = new Player(new Name("pobi")); + player.receiveCard(new Card(Shape.SPADE, Number.ACE)); + player.receiveCard(new Card(Shape.HEART, Number.JACK)); + + boolean result = player.isBlackJack(); + + assertEquals(true, result); + } + + @Test + void 두장의_합이_21이아니면_블랙잭이_아니다() { + Player player = new Player(new Name("pobi")); + player.receiveCard(new Card(Shape.SPADE, Number.JACK)); + player.receiveCard(new Card(Shape.HEART, Number.JACK)); + + boolean result = player.isBlackJack(); + + assertEquals(false, result); + } + + @Test + void 세장의_합이_21이어도_블랙잭이_아니다() { + Player player = new Player(new Name("pobi")); + player.receiveCard(new Card(Shape.SPADE, Number.EIGHT)); + player.receiveCard(new Card(Shape.HEART, Number.JACK)); + player.receiveCard(new Card(Shape.HEART, Number.THREE)); + + boolean result = player.isBlackJack(); + + assertEquals(false, result); + } + @Test void 점수가_21점_미만이면_카드를_추가로_받을_수_있다() { Player player = new Player(new Name("pobi")); From 0112326b6c61260d7a4cd003b77f1c6eeffa08ae Mon Sep 17 00:00:00 2001 From: xxbeann Date: Sat, 14 Mar 2026 20:58:55 +0900 Subject: [PATCH 21/44] =?UTF-8?q?refactor:=20=ED=8C=A8=ED=82=A4=EC=A7=80?= =?UTF-8?q?=20=EB=8F=84=EC=9E=85?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../controller/BlackJackGameController.java | 8 +- src/main/java/domain/Card.java | 1 - .../domain/{ => betting}/BettingAmount.java | 2 +- .../domain/{ => betting}/BettingManager.java | 3 +- src/main/java/domain/card/Card.java | 1 + src/main/java/domain/{ => card}/Cards.java | 2 +- src/main/java/domain/{ => card}/Deck.java | 2 +- src/main/java/domain/{ => card}/Number.java | 2 +- src/main/java/domain/{ => card}/Shape.java | 2 +- .../java/domain/{ => game}/GameManager.java | 8 +- .../java/domain/{ => game}/GameResult.java | 2 +- .../java/domain/game/GameResultManager.java | 7 ++ .../java/domain/{ => participant}/Dealer.java | 2 +- .../java/domain/{ => participant}/Name.java | 2 +- .../domain/{ => participant}/Participant.java | 4 +- .../{ => participant}/ParticipantCards.java | 4 +- .../java/domain/{ => participant}/Player.java | 4 +- .../domain/{ => participant}/Players.java | 2 +- src/main/java/view/OutputView.java | 2 +- src/test/java/domain/BettingAmountTest.java | 1 + src/test/java/domain/BettingManagerTest.java | 4 + src/test/java/domain/DealerTest.java | 11 ++- src/test/java/domain/DeckTest.java | 1 + src/test/java/domain/GameManagerTest.java | 19 +++-- src/test/java/domain/NameTest.java | 1 + .../java/domain/ParticipantCardsTest.java | 14 +-- src/test/java/domain/PlayerTest.java | 85 ++++++++++--------- src/test/java/domain/PlayersTest.java | 3 + 28 files changed, 130 insertions(+), 69 deletions(-) delete mode 100644 src/main/java/domain/Card.java rename src/main/java/domain/{ => betting}/BettingAmount.java (96%) rename src/main/java/domain/{ => betting}/BettingManager.java (93%) create mode 100644 src/main/java/domain/card/Card.java rename src/main/java/domain/{ => card}/Cards.java (97%) rename src/main/java/domain/{ => card}/Deck.java (97%) rename src/main/java/domain/{ => card}/Number.java (96%) rename src/main/java/domain/{ => card}/Shape.java (94%) rename src/main/java/domain/{ => game}/GameManager.java (88%) rename src/main/java/domain/{ => game}/GameResult.java (93%) create mode 100644 src/main/java/domain/game/GameResultManager.java rename src/main/java/domain/{ => participant}/Dealer.java (92%) rename src/main/java/domain/{ => participant}/Name.java (97%) rename src/main/java/domain/{ => participant}/Participant.java (92%) rename src/main/java/domain/{ => participant}/ParticipantCards.java (91%) rename src/main/java/domain/{ => participant}/Player.java (94%) rename src/main/java/domain/{ => participant}/Players.java (98%) diff --git a/src/main/java/controller/BlackJackGameController.java b/src/main/java/controller/BlackJackGameController.java index d9868821b5..f1d2355cc3 100644 --- a/src/main/java/controller/BlackJackGameController.java +++ b/src/main/java/controller/BlackJackGameController.java @@ -1,6 +1,12 @@ package controller; -import domain.*; +import domain.game.GameManager; +import domain.game.GameResult; +import domain.participant.Dealer; +import domain.participant.Name; +import domain.participant.Participant; +import domain.participant.Player; +import domain.participant.Players; import dto.ParticipantCardsDto; import view.InputView; import view.OutputView; diff --git a/src/main/java/domain/Card.java b/src/main/java/domain/Card.java deleted file mode 100644 index 0a4802f1d6..0000000000 --- a/src/main/java/domain/Card.java +++ /dev/null @@ -1 +0,0 @@ -package domain; public class Card { private final Shape shape; private final Number number; public Card(Shape shape, Number number) { this.shape = shape; this.number = number; } public int getScore() { return number.getValue(); } // TODO: DTO 책임 분리 public String getCardInfo() { return number.getDisplayName() + shape.getShape(); } public boolean isAce() { return this.number.equals(Number.ACE); } } \ No newline at end of file diff --git a/src/main/java/domain/BettingAmount.java b/src/main/java/domain/betting/BettingAmount.java similarity index 96% rename from src/main/java/domain/BettingAmount.java rename to src/main/java/domain/betting/BettingAmount.java index 7e426accf1..84954732ff 100644 --- a/src/main/java/domain/BettingAmount.java +++ b/src/main/java/domain/betting/BettingAmount.java @@ -1,4 +1,4 @@ -package domain; +package domain.betting; public class BettingAmount { private final Integer money; diff --git a/src/main/java/domain/BettingManager.java b/src/main/java/domain/betting/BettingManager.java similarity index 93% rename from src/main/java/domain/BettingManager.java rename to src/main/java/domain/betting/BettingManager.java index 35712079f9..8cc366c091 100644 --- a/src/main/java/domain/BettingManager.java +++ b/src/main/java/domain/betting/BettingManager.java @@ -1,5 +1,6 @@ -package domain; +package domain.betting; +import domain.participant.Name; import java.util.HashMap; import java.util.Map; diff --git a/src/main/java/domain/card/Card.java b/src/main/java/domain/card/Card.java new file mode 100644 index 0000000000..e9637731ce --- /dev/null +++ b/src/main/java/domain/card/Card.java @@ -0,0 +1 @@ +package domain.card; public class Card { private final Shape shape; private final Number number; public Card(Shape shape, Number number) { this.shape = shape; this.number = number; } public int getScore() { return number.getValue(); } // TODO: DTO 책임 분리 public String getCardInfo() { return number.getDisplayName() + shape.getShape(); } public boolean isAce() { return this.number.equals(Number.ACE); } } \ No newline at end of file diff --git a/src/main/java/domain/Cards.java b/src/main/java/domain/card/Cards.java similarity index 97% rename from src/main/java/domain/Cards.java rename to src/main/java/domain/card/Cards.java index 3f0e4d6944..be6a94cb88 100644 --- a/src/main/java/domain/Cards.java +++ b/src/main/java/domain/card/Cards.java @@ -1,4 +1,4 @@ -package domain; +package domain.card; import java.util.ArrayList; import java.util.List; diff --git a/src/main/java/domain/Deck.java b/src/main/java/domain/card/Deck.java similarity index 97% rename from src/main/java/domain/Deck.java rename to src/main/java/domain/card/Deck.java index f776369400..ee49ce2ae1 100644 --- a/src/main/java/domain/Deck.java +++ b/src/main/java/domain/card/Deck.java @@ -1,4 +1,4 @@ -package domain; +package domain.card; import java.util.ArrayList; import java.util.Collections; diff --git a/src/main/java/domain/Number.java b/src/main/java/domain/card/Number.java similarity index 96% rename from src/main/java/domain/Number.java rename to src/main/java/domain/card/Number.java index c07e5d803e..6417764467 100644 --- a/src/main/java/domain/Number.java +++ b/src/main/java/domain/card/Number.java @@ -1,4 +1,4 @@ -package domain; +package domain.card; public enum Number { ACE(11, "A"), diff --git a/src/main/java/domain/Shape.java b/src/main/java/domain/card/Shape.java similarity index 94% rename from src/main/java/domain/Shape.java rename to src/main/java/domain/card/Shape.java index 364bc0402f..46cc1150a3 100644 --- a/src/main/java/domain/Shape.java +++ b/src/main/java/domain/card/Shape.java @@ -1,4 +1,4 @@ -package domain; +package domain.card; public enum Shape { HEART("하트"), diff --git a/src/main/java/domain/GameManager.java b/src/main/java/domain/game/GameManager.java similarity index 88% rename from src/main/java/domain/GameManager.java rename to src/main/java/domain/game/GameManager.java index 7ffbb01ebd..e693aa4c3c 100644 --- a/src/main/java/domain/GameManager.java +++ b/src/main/java/domain/game/GameManager.java @@ -1,5 +1,11 @@ -package domain; +package domain.game; +import domain.card.Card; +import domain.participant.Dealer; +import domain.card.Deck; +import domain.participant.Name; +import domain.participant.Participant; +import domain.participant.Players; import java.util.HashMap; import java.util.Map; diff --git a/src/main/java/domain/GameResult.java b/src/main/java/domain/game/GameResult.java similarity index 93% rename from src/main/java/domain/GameResult.java rename to src/main/java/domain/game/GameResult.java index 853f9a75b2..f2343ae947 100644 --- a/src/main/java/domain/GameResult.java +++ b/src/main/java/domain/game/GameResult.java @@ -1,4 +1,4 @@ -package domain; +package domain.game; public enum GameResult { WIN("승"), diff --git a/src/main/java/domain/game/GameResultManager.java b/src/main/java/domain/game/GameResultManager.java new file mode 100644 index 0000000000..d8b0242dff --- /dev/null +++ b/src/main/java/domain/game/GameResultManager.java @@ -0,0 +1,7 @@ +package domain.game; + +import domain.betting.BettingManager; + +public class GameResultManager { + BettingManager bettingManager; +} diff --git a/src/main/java/domain/Dealer.java b/src/main/java/domain/participant/Dealer.java similarity index 92% rename from src/main/java/domain/Dealer.java rename to src/main/java/domain/participant/Dealer.java index a6f7a5c4d9..165bc9dc1a 100644 --- a/src/main/java/domain/Dealer.java +++ b/src/main/java/domain/participant/Dealer.java @@ -1,4 +1,4 @@ -package domain; +package domain.participant; public class Dealer extends Participant { private static final int CAN_RECEIVE_CARD_THRESHOLD = 17; diff --git a/src/main/java/domain/Name.java b/src/main/java/domain/participant/Name.java similarity index 97% rename from src/main/java/domain/Name.java rename to src/main/java/domain/participant/Name.java index f5cc277df8..253ed05568 100644 --- a/src/main/java/domain/Name.java +++ b/src/main/java/domain/participant/Name.java @@ -1,4 +1,4 @@ -package domain; +package domain.participant; import java.util.Objects; diff --git a/src/main/java/domain/Participant.java b/src/main/java/domain/participant/Participant.java similarity index 92% rename from src/main/java/domain/Participant.java rename to src/main/java/domain/participant/Participant.java index 966f430ced..6ec3ea50df 100644 --- a/src/main/java/domain/Participant.java +++ b/src/main/java/domain/participant/Participant.java @@ -1,5 +1,7 @@ -package domain; +package domain.participant; +import domain.card.Card; +import domain.card.Cards; import java.util.ArrayList; import java.util.List; diff --git a/src/main/java/domain/ParticipantCards.java b/src/main/java/domain/participant/ParticipantCards.java similarity index 91% rename from src/main/java/domain/ParticipantCards.java rename to src/main/java/domain/participant/ParticipantCards.java index b93897d786..6e41495948 100644 --- a/src/main/java/domain/ParticipantCards.java +++ b/src/main/java/domain/participant/ParticipantCards.java @@ -1,5 +1,7 @@ -package domain; +package domain.participant; +import domain.card.Card; +import domain.card.Cards; import java.util.List; public class ParticipantCards { diff --git a/src/main/java/domain/Player.java b/src/main/java/domain/participant/Player.java similarity index 94% rename from src/main/java/domain/Player.java rename to src/main/java/domain/participant/Player.java index b4cad89e18..443b617d6f 100644 --- a/src/main/java/domain/Player.java +++ b/src/main/java/domain/participant/Player.java @@ -1,4 +1,6 @@ -package domain; +package domain.participant; + +import domain.game.GameResult; public class Player extends Participant { private static final int CAN_RECEIVE_CARD_THRESHOLD = 21; diff --git a/src/main/java/domain/Players.java b/src/main/java/domain/participant/Players.java similarity index 98% rename from src/main/java/domain/Players.java rename to src/main/java/domain/participant/Players.java index 12a8b77344..e9cb70a164 100644 --- a/src/main/java/domain/Players.java +++ b/src/main/java/domain/participant/Players.java @@ -1,4 +1,4 @@ -package domain; +package domain.participant; import java.util.ArrayList; import java.util.List; diff --git a/src/main/java/view/OutputView.java b/src/main/java/view/OutputView.java index 0b95d0a50c..ba52adbca3 100644 --- a/src/main/java/view/OutputView.java +++ b/src/main/java/view/OutputView.java @@ -1,6 +1,6 @@ package view; -import domain.GameResult; +import domain.game.GameResult; import dto.ParticipantCardsDto; import java.util.List; diff --git a/src/test/java/domain/BettingAmountTest.java b/src/test/java/domain/BettingAmountTest.java index a947d12bea..0567e9e6b1 100644 --- a/src/test/java/domain/BettingAmountTest.java +++ b/src/test/java/domain/BettingAmountTest.java @@ -2,6 +2,7 @@ import static org.junit.jupiter.api.Assertions.*; +import domain.betting.BettingAmount; import org.junit.jupiter.api.Test; class BettingAmountTest { diff --git a/src/test/java/domain/BettingManagerTest.java b/src/test/java/domain/BettingManagerTest.java index 2171edf4b5..f0ae1bce92 100644 --- a/src/test/java/domain/BettingManagerTest.java +++ b/src/test/java/domain/BettingManagerTest.java @@ -2,6 +2,10 @@ import static org.junit.jupiter.api.Assertions.assertEquals; +import domain.betting.BettingAmount; +import domain.betting.BettingManager; +import domain.participant.Name; +import domain.participant.Player; import java.util.HashMap; import java.util.Map; import org.junit.jupiter.api.Test; diff --git a/src/test/java/domain/DealerTest.java b/src/test/java/domain/DealerTest.java index 8a52b233a6..ce9a017ed1 100644 --- a/src/test/java/domain/DealerTest.java +++ b/src/test/java/domain/DealerTest.java @@ -2,6 +2,11 @@ import static org.junit.jupiter.api.Assertions.*; +import domain.card.Card; +import domain.card.Number; +import domain.card.Shape; +import domain.participant.Dealer; +import domain.participant.Name; import org.junit.jupiter.api.Test; class DealerTest { @@ -9,8 +14,8 @@ class DealerTest { @Test void 점수가_16점_이하이면_카드를_추가로_받을_수_있다() { Dealer dealer = new Dealer(new Name("딜러")); - dealer.receiveCard(new Card(Shape.SPADE, Number.TEN)); - dealer.receiveCard(new Card(Shape.HEART, Number.SIX)); + dealer.receiveCard(new Card(Shape.SPADE, domain.card.Number.TEN)); + dealer.receiveCard(new Card(Shape.HEART, domain.card.Number.SIX)); boolean result = dealer.isContinueGame(); assertEquals(true, result); @@ -19,7 +24,7 @@ class DealerTest { @Test void 점수가_17점_이상이면_카드를_추가로_받을_수_없다() { Dealer dealer = new Dealer(new Name("딜러")); - dealer.receiveCard(new Card(Shape.SPADE, Number.TEN)); + dealer.receiveCard(new Card(Shape.SPADE, domain.card.Number.TEN)); dealer.receiveCard(new Card(Shape.HEART, Number.SEVEN)); boolean result = dealer.isContinueGame(); diff --git a/src/test/java/domain/DeckTest.java b/src/test/java/domain/DeckTest.java index 60e20833cd..02bd002f00 100644 --- a/src/test/java/domain/DeckTest.java +++ b/src/test/java/domain/DeckTest.java @@ -2,6 +2,7 @@ import static org.junit.jupiter.api.Assertions.*; +import domain.card.Deck; import org.junit.jupiter.api.Test; class DeckTest { diff --git a/src/test/java/domain/GameManagerTest.java b/src/test/java/domain/GameManagerTest.java index 62072b9ee3..40f741ac4f 100644 --- a/src/test/java/domain/GameManagerTest.java +++ b/src/test/java/domain/GameManagerTest.java @@ -2,6 +2,15 @@ import static org.junit.jupiter.api.Assertions.*; +import domain.card.Card; +import domain.card.Number; +import domain.card.Shape; +import domain.game.GameManager; +import domain.game.GameResult; +import domain.participant.Dealer; +import domain.participant.Name; +import domain.participant.Player; +import domain.participant.Players; import java.util.List; import java.util.Map; import org.junit.jupiter.api.Test; @@ -17,13 +26,13 @@ class GameManagerTest { Dealer dealer = gameManager.getDealer(); - dealer.receiveCard(new Card(Shape.SPADE, Number.TEN)); - dealer.receiveCard(new Card(Shape.HEART, Number.EIGHT)); + dealer.receiveCard(new Card(Shape.SPADE, domain.card.Number.TEN)); + dealer.receiveCard(new Card(Shape.HEART, domain.card.Number.EIGHT)); - pobi.receiveCard(new Card(Shape.DIAMOND, Number.TEN)); - pobi.receiveCard(new Card(Shape.CLUB, Number.TEN)); + pobi.receiveCard(new Card(Shape.DIAMOND, domain.card.Number.TEN)); + pobi.receiveCard(new Card(Shape.CLUB, domain.card.Number.TEN)); - crong.receiveCard(new Card(Shape.SPADE, Number.NINE)); + crong.receiveCard(new Card(Shape.SPADE, domain.card.Number.NINE)); crong.receiveCard(new Card(Shape.HEART, Number.SEVEN)); Map result = gameManager.getGameResult(); diff --git a/src/test/java/domain/NameTest.java b/src/test/java/domain/NameTest.java index 1246cb58df..942af9dc1a 100644 --- a/src/test/java/domain/NameTest.java +++ b/src/test/java/domain/NameTest.java @@ -2,6 +2,7 @@ import static org.junit.jupiter.api.Assertions.*; +import domain.participant.Name; import org.junit.jupiter.api.Test; class NameTest { diff --git a/src/test/java/domain/ParticipantCardsTest.java b/src/test/java/domain/ParticipantCardsTest.java index f2f7e94184..be107cd204 100644 --- a/src/test/java/domain/ParticipantCardsTest.java +++ b/src/test/java/domain/ParticipantCardsTest.java @@ -2,16 +2,20 @@ import static org.junit.jupiter.api.Assertions.*; +import domain.card.Card; +import domain.card.Cards; +import domain.card.Number; +import domain.card.Shape; +import domain.participant.ParticipantCards; import java.util.ArrayList; -import java.util.List; import org.junit.jupiter.api.Test; class ParticipantCardsTest { @Test void 에이스가_없으면_카드_숫자의_합을_반환한다() { - Card card1 = new Card(Shape.SPADE, Number.EIGHT); - Card card2 = new Card(Shape.HEART, Number.EIGHT); + Card card1 = new Card(Shape.SPADE, domain.card.Number.EIGHT); + Card card2 = new Card(Shape.HEART, domain.card.Number.EIGHT); ParticipantCards testParticipantCards = new ParticipantCards(new Cards(new ArrayList<>())); @@ -23,8 +27,8 @@ class ParticipantCardsTest { @Test void 에이스가_있으면_상황에_맞는_최대_합을_반환한다() { - Card card1 = new Card(Shape.SPADE, Number.ACE); - Card card2 = new Card(Shape.HEART, Number.FIVE); + Card card1 = new Card(Shape.SPADE, domain.card.Number.ACE); + Card card2 = new Card(Shape.HEART, domain.card.Number.FIVE); Card card3 = new Card(Shape.CLUB, Number.EIGHT); ParticipantCards testParticipantCards = new ParticipantCards(new Cards(new ArrayList<>())); diff --git a/src/test/java/domain/PlayerTest.java b/src/test/java/domain/PlayerTest.java index 93f4f99722..dddd656719 100644 --- a/src/test/java/domain/PlayerTest.java +++ b/src/test/java/domain/PlayerTest.java @@ -2,6 +2,13 @@ import static org.junit.jupiter.api.Assertions.*; +import domain.card.Card; +import domain.card.Number; +import domain.card.Shape; +import domain.game.GameResult; +import domain.participant.Dealer; +import domain.participant.Name; +import domain.participant.Player; import org.junit.jupiter.api.Test; class PlayerTest { @@ -9,9 +16,9 @@ class PlayerTest { @Test void 점수가_21점을_초과하면_버스트이다() { Player player = new Player(new Name("pobi")); - player.receiveCard(new Card(Shape.SPADE, Number.TEN)); - player.receiveCard(new Card(Shape.HEART, Number.JACK)); - player.receiveCard(new Card(Shape.DIAMOND, Number.TWO)); + player.receiveCard(new Card(Shape.SPADE, domain.card.Number.TEN)); + player.receiveCard(new Card(Shape.HEART, domain.card.Number.JACK)); + player.receiveCard(new Card(Shape.DIAMOND, domain.card.Number.TWO)); boolean result = player.isBust(); @@ -21,9 +28,9 @@ class PlayerTest { @Test void 점수가_21점이면_버스트가_아니다() { Player player = new Player(new Name("pobi")); - player.receiveCard(new Card(Shape.SPADE, Number.NINE)); - player.receiveCard(new Card(Shape.HEART, Number.JACK)); - player.receiveCard(new Card(Shape.DIAMOND, Number.TWO)); + player.receiveCard(new Card(Shape.SPADE, domain.card.Number.NINE)); + player.receiveCard(new Card(Shape.HEART, domain.card.Number.JACK)); + player.receiveCard(new Card(Shape.DIAMOND, domain.card.Number.TWO)); boolean result = player.isBust(); @@ -33,8 +40,8 @@ class PlayerTest { @Test void 에이스와_10점카드를_받으면_블랙잭이다() { Player player = new Player(new Name("pobi")); - player.receiveCard(new Card(Shape.SPADE, Number.ACE)); - player.receiveCard(new Card(Shape.HEART, Number.JACK)); + player.receiveCard(new Card(Shape.SPADE, domain.card.Number.ACE)); + player.receiveCard(new Card(Shape.HEART, domain.card.Number.JACK)); boolean result = player.isBlackJack(); @@ -44,8 +51,8 @@ class PlayerTest { @Test void 두장의_합이_21이아니면_블랙잭이_아니다() { Player player = new Player(new Name("pobi")); - player.receiveCard(new Card(Shape.SPADE, Number.JACK)); - player.receiveCard(new Card(Shape.HEART, Number.JACK)); + player.receiveCard(new Card(Shape.SPADE, domain.card.Number.JACK)); + player.receiveCard(new Card(Shape.HEART, domain.card.Number.JACK)); boolean result = player.isBlackJack(); @@ -55,9 +62,9 @@ class PlayerTest { @Test void 세장의_합이_21이어도_블랙잭이_아니다() { Player player = new Player(new Name("pobi")); - player.receiveCard(new Card(Shape.SPADE, Number.EIGHT)); - player.receiveCard(new Card(Shape.HEART, Number.JACK)); - player.receiveCard(new Card(Shape.HEART, Number.THREE)); + player.receiveCard(new Card(Shape.SPADE, domain.card.Number.EIGHT)); + player.receiveCard(new Card(Shape.HEART, domain.card.Number.JACK)); + player.receiveCard(new Card(Shape.HEART, domain.card.Number.THREE)); boolean result = player.isBlackJack(); @@ -67,9 +74,9 @@ class PlayerTest { @Test void 점수가_21점_미만이면_카드를_추가로_받을_수_있다() { Player player = new Player(new Name("pobi")); - player.receiveCard(new Card(Shape.SPADE, Number.EIGHT)); - player.receiveCard(new Card(Shape.HEART, Number.JACK)); - player.receiveCard(new Card(Shape.DIAMOND, Number.TWO)); + player.receiveCard(new Card(Shape.SPADE, domain.card.Number.EIGHT)); + player.receiveCard(new Card(Shape.HEART, domain.card.Number.JACK)); + player.receiveCard(new Card(Shape.DIAMOND, domain.card.Number.TWO)); boolean result = player.isContinueGame(); @@ -79,9 +86,9 @@ class PlayerTest { @Test void 점수가_21점_이상이면_카드를_추가로_받을_수_없다() { Player player = new Player(new Name("pobi")); - player.receiveCard(new Card(Shape.SPADE, Number.NINE)); - player.receiveCard(new Card(Shape.HEART, Number.JACK)); - player.receiveCard(new Card(Shape.DIAMOND, Number.TWO)); + player.receiveCard(new Card(Shape.SPADE, domain.card.Number.NINE)); + player.receiveCard(new Card(Shape.HEART, domain.card.Number.JACK)); + player.receiveCard(new Card(Shape.DIAMOND, domain.card.Number.TWO)); boolean result = player.isContinueGame(); @@ -93,11 +100,11 @@ class PlayerTest { Player player = new Player(new Name("pobi")); Dealer dealer = new Dealer(new Name("딜러")); - player.receiveCard(new Card(Shape.SPADE, Number.TEN)); - player.receiveCard(new Card(Shape.HEART, Number.JACK)); + player.receiveCard(new Card(Shape.SPADE, domain.card.Number.TEN)); + player.receiveCard(new Card(Shape.HEART, domain.card.Number.JACK)); - dealer.receiveCard(new Card(Shape.DIAMOND, Number.TEN)); - dealer.receiveCard(new Card(Shape.CLUB, Number.EIGHT)); + dealer.receiveCard(new Card(Shape.DIAMOND, domain.card.Number.TEN)); + dealer.receiveCard(new Card(Shape.CLUB, domain.card.Number.EIGHT)); GameResult result = player.judgeResult(dealer); @@ -109,11 +116,11 @@ class PlayerTest { Player player = new Player(new Name("pobi")); Dealer dealer = new Dealer(new Name("딜러")); - player.receiveCard(new Card(Shape.SPADE, Number.TEN)); - player.receiveCard(new Card(Shape.HEART, Number.JACK)); + player.receiveCard(new Card(Shape.SPADE, domain.card.Number.TEN)); + player.receiveCard(new Card(Shape.HEART, domain.card.Number.JACK)); - dealer.receiveCard(new Card(Shape.DIAMOND, Number.TEN)); - dealer.receiveCard(new Card(Shape.CLUB, Number.JACK)); + dealer.receiveCard(new Card(Shape.DIAMOND, domain.card.Number.TEN)); + dealer.receiveCard(new Card(Shape.CLUB, domain.card.Number.JACK)); GameResult result = player.judgeResult(dealer); @@ -125,10 +132,10 @@ class PlayerTest { Player player = new Player(new Name("pobi")); Dealer dealer = new Dealer(new Name("딜러")); - player.receiveCard(new Card(Shape.SPADE, Number.TEN)); + player.receiveCard(new Card(Shape.SPADE, domain.card.Number.TEN)); - dealer.receiveCard(new Card(Shape.DIAMOND, Number.TEN)); - dealer.receiveCard(new Card(Shape.CLUB, Number.JACK)); + dealer.receiveCard(new Card(Shape.DIAMOND, domain.card.Number.TEN)); + dealer.receiveCard(new Card(Shape.CLUB, domain.card.Number.JACK)); GameResult result = player.judgeResult(dealer); @@ -140,12 +147,12 @@ class PlayerTest { Player player = new Player(new Name("pobi")); Dealer dealer = new Dealer(new Name("딜러")); - player.receiveCard(new Card(Shape.SPADE, Number.TWO)); - player.receiveCard(new Card(Shape.HEART, Number.JACK)); - player.receiveCard(new Card(Shape.CLUB, Number.JACK)); + player.receiveCard(new Card(Shape.SPADE, domain.card.Number.TWO)); + player.receiveCard(new Card(Shape.HEART, domain.card.Number.JACK)); + player.receiveCard(new Card(Shape.CLUB, domain.card.Number.JACK)); - dealer.receiveCard(new Card(Shape.DIAMOND, Number.TEN)); - dealer.receiveCard(new Card(Shape.CLUB, Number.EIGHT)); + dealer.receiveCard(new Card(Shape.DIAMOND, domain.card.Number.TEN)); + dealer.receiveCard(new Card(Shape.CLUB, domain.card.Number.EIGHT)); GameResult result = player.judgeResult(dealer); @@ -157,11 +164,11 @@ class PlayerTest { Player player = new Player(new Name("pobi")); Dealer dealer = new Dealer(new Name("딜러")); - player.receiveCard(new Card(Shape.SPADE, Number.TEN)); - player.receiveCard(new Card(Shape.HEART, Number.JACK)); + player.receiveCard(new Card(Shape.SPADE, domain.card.Number.TEN)); + player.receiveCard(new Card(Shape.HEART, domain.card.Number.JACK)); - dealer.receiveCard(new Card(Shape.DIAMOND, Number.TEN)); - dealer.receiveCard(new Card(Shape.CLUB, Number.TWO)); + dealer.receiveCard(new Card(Shape.DIAMOND, domain.card.Number.TEN)); + dealer.receiveCard(new Card(Shape.CLUB, domain.card.Number.TWO)); dealer.receiveCard(new Card(Shape.HEART, Number.TEN)); GameResult result = player.judgeResult(dealer); diff --git a/src/test/java/domain/PlayersTest.java b/src/test/java/domain/PlayersTest.java index 8551468824..7f9b139254 100644 --- a/src/test/java/domain/PlayersTest.java +++ b/src/test/java/domain/PlayersTest.java @@ -2,6 +2,9 @@ import static org.junit.jupiter.api.Assertions.*; +import domain.participant.Name; +import domain.participant.Player; +import domain.participant.Players; import java.util.ArrayList; import java.util.List; import org.junit.jupiter.api.Test; From be39c87a53a98a0cba73ff1706289e231084b708 Mon Sep 17 00:00:00 2001 From: xxbeann Date: Sun, 15 Mar 2026 01:36:21 +0900 Subject: [PATCH 22/44] =?UTF-8?q?refactor:=20=EB=B0=B0=ED=8C=85=20?= =?UTF-8?q?=EC=83=81=ED=83=9C=EC=99=80=20=EB=B8=94=EB=9E=99=EC=9E=AD=20?= =?UTF-8?q?=EA=B2=B0=EA=B3=BC=20=EC=B2=98=EB=A6=AC=20=EC=B1=85=EC=9E=84=20?= =?UTF-8?q?=EB=B6=84=EB=A6=AC?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit - BettingAmount와 BettingManager에서 정산 관련 메서드 제거 - GameResult에 BLACKJACK 결과 추가 - Player에 블랙잭 결과 판정 로직 반영 - 수익 계산용 CalculateProfit, Revenue 도메인 추가 준비 --- .../java/domain/betting/BettingAmount.java | 8 ----- .../java/domain/betting/BettingManager.java | 14 -------- .../java/domain/betting/CalculateProfit.java | 32 +++++++++++++++++++ src/main/java/domain/betting/Revenue.java | 25 +++++++++++++++ src/main/java/domain/game/GameResult.java | 3 +- src/main/java/domain/participant/Player.java | 6 ++++ 6 files changed, 65 insertions(+), 23 deletions(-) create mode 100644 src/main/java/domain/betting/CalculateProfit.java create mode 100644 src/main/java/domain/betting/Revenue.java diff --git a/src/main/java/domain/betting/BettingAmount.java b/src/main/java/domain/betting/BettingAmount.java index 84954732ff..57e46d2f0f 100644 --- a/src/main/java/domain/betting/BettingAmount.java +++ b/src/main/java/domain/betting/BettingAmount.java @@ -17,12 +17,4 @@ private static void validateMinus(Integer bettingAmount) { public Integer getMoney() { return money; } - - public static BettingAmount zero() { - return new BettingAmount(0); - } - - public BettingAmount oneAndAHalfAmount() { - return new BettingAmount(money * 3 / 2); - } } diff --git a/src/main/java/domain/betting/BettingManager.java b/src/main/java/domain/betting/BettingManager.java index 8cc366c091..0d3863cf60 100644 --- a/src/main/java/domain/betting/BettingManager.java +++ b/src/main/java/domain/betting/BettingManager.java @@ -14,18 +14,4 @@ public BettingManager(Map playerBettingAmountMap) { public BettingAmount getAmount(Name name) { return bettingAmounts.get(name); } - - public void lose(Name name) { - bettingAmounts.put(name, BettingAmount.zero()); - } - - public void win(Name name) { - BettingAmount amount = getAmount(name); - bettingAmounts.put(name, amount); - } - - public void blackJackWin(Name name) { - BettingAmount amount = getAmount(name); - bettingAmounts.put(name, amount.oneAndAHalfAmount()); - } } diff --git a/src/main/java/domain/betting/CalculateProfit.java b/src/main/java/domain/betting/CalculateProfit.java new file mode 100644 index 0000000000..0f31a347d2 --- /dev/null +++ b/src/main/java/domain/betting/CalculateProfit.java @@ -0,0 +1,32 @@ +package domain.betting; + +import domain.game.GameResult; +import domain.participant.Name; + +public class CalculateProfit { + private final Revenue revenue; + private final BettingManager bettingManager; + + public CalculateProfit(Revenue revenue, BettingManager bettingManager) { + this.revenue = revenue; + this.bettingManager = bettingManager; + } + + public Revenue calculate(Name name, GameResult gameResult) { + BettingAmount amount = bettingManager.getAmount(name); + return calculateRevenue(gameResult, amount); + } + + private static Revenue calculateRevenue(GameResult gameResult, BettingAmount amount) { + if (gameResult == GameResult.BLACKJACK) { + return new Revenue(amount.getMoney() / 2); + } + if (gameResult == GameResult.WIN) { + return new Revenue(amount.getMoney()); + } + if (gameResult == GameResult.LOSE) { + return new Revenue(-amount.getMoney()); + } + return new Revenue(0); + } +} diff --git a/src/main/java/domain/betting/Revenue.java b/src/main/java/domain/betting/Revenue.java new file mode 100644 index 0000000000..4a98793be6 --- /dev/null +++ b/src/main/java/domain/betting/Revenue.java @@ -0,0 +1,25 @@ +package domain.betting; + +import java.util.Objects; + +public class Revenue { + private final int money; + + public Revenue(int money) { + this.money = money; + } + + @Override + public boolean equals(Object o) { + if (o == null || getClass() != o.getClass()) { + return false; + } + Revenue revenue = (Revenue) o; + return money == revenue.money; + } + + @Override + public int hashCode() { + return Objects.hashCode(money); + } +} diff --git a/src/main/java/domain/game/GameResult.java b/src/main/java/domain/game/GameResult.java index f2343ae947..da192c8bb5 100644 --- a/src/main/java/domain/game/GameResult.java +++ b/src/main/java/domain/game/GameResult.java @@ -3,7 +3,8 @@ public enum GameResult { WIN("승"), LOSE("패"), - DRAW("무"); + DRAW("무"), + BLACKJACK("블랙잭"); private final String resultKoreanName; diff --git a/src/main/java/domain/participant/Player.java b/src/main/java/domain/participant/Player.java index 443b617d6f..efc7de5cac 100644 --- a/src/main/java/domain/participant/Player.java +++ b/src/main/java/domain/participant/Player.java @@ -17,6 +17,12 @@ public boolean isContinueGame() { } public GameResult judgeResult(Dealer dealer) { + if(this.isBlackJack() && dealer.isBlackJack()) { + return GameResult.BLACKJACK; + } + if(this.isBlackJack()) { + return GameResult.BLACKJACK; + } if (this.isBust()) { // TODO: 배팅 금액을 모두 잃는다. return GameResult.LOSE; } From 12d98bd6761243ce1e188ee478910c350b924a27 Mon Sep 17 00:00:00 2001 From: xxbeann Date: Sun, 15 Mar 2026 03:25:45 +0900 Subject: [PATCH 23/44] =?UTF-8?q?feat:=20=EC=88=98=EC=9D=B5=20=EA=B3=84?= =?UTF-8?q?=EC=82=B0=20=EB=A1=9C=EC=A7=81=20=EC=B6=94=EA=B0=80=20=EB=B0=8F?= =?UTF-8?q?=20=EB=8F=84=EB=A9=94=EC=9D=B8=20=ED=85=8C=EC=8A=A4=ED=8A=B8=20?= =?UTF-8?q?=EC=9E=AC=EA=B5=AC=EC=84=B1?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit - CalculateProfit과 GameResultManager로 참가자 수익 계산 로직 추가 - BettingAmount와 Revenue를 값 객체로 보강 - RevenueManager 도입으로 수익 집계 기반 마련 - 테스트 패키지를 도메인 구조에 맞게 재배치 - CalculateProfit 테스트 추가 및 기존 배팅 테스트 정리 --- .../java/domain/betting/BettingAmount.java | 16 +++++ .../java/domain/betting/CalculateProfit.java | 7 +-- src/main/java/domain/betting/Revenue.java | 4 ++ .../java/domain/betting/RevenueManager.java | 13 ++++ .../java/domain/game/GameResultManager.java | 24 +++++++- src/test/java/domain/BettingManagerTest.java | 52 ---------------- .../{ => betting}/BettingAmountTest.java | 3 +- .../domain/betting/CalculateProfitTest.java | 61 +++++++++++++++++++ src/test/java/domain/{ => card}/DeckTest.java | 3 +- .../domain/{ => game}/GameManagerTest.java | 4 +- .../domain/{ => participant}/DealerTest.java | 4 +- .../domain/{ => participant}/NameTest.java | 3 +- .../ParticipantCardsTest.java | 3 +- .../domain/{ => participant}/PlayerTest.java | 5 +- .../domain/{ => participant}/PlayersTest.java | 5 +- 15 files changed, 127 insertions(+), 80 deletions(-) create mode 100644 src/main/java/domain/betting/RevenueManager.java delete mode 100644 src/test/java/domain/BettingManagerTest.java rename src/test/java/domain/{ => betting}/BettingAmountTest.java (91%) create mode 100644 src/test/java/domain/betting/CalculateProfitTest.java rename src/test/java/domain/{ => card}/DeckTest.java (92%) rename src/test/java/domain/{ => game}/GameManagerTest.java (95%) rename src/test/java/domain/{ => participant}/DealerTest.java (92%) rename src/test/java/domain/{ => participant}/NameTest.java (94%) rename src/test/java/domain/{ => participant}/ParticipantCardsTest.java (95%) rename src/test/java/domain/{ => participant}/PlayerTest.java (98%) rename src/test/java/domain/{ => participant}/PlayersTest.java (93%) diff --git a/src/main/java/domain/betting/BettingAmount.java b/src/main/java/domain/betting/BettingAmount.java index 57e46d2f0f..ed8656ef7e 100644 --- a/src/main/java/domain/betting/BettingAmount.java +++ b/src/main/java/domain/betting/BettingAmount.java @@ -1,5 +1,7 @@ package domain.betting; +import java.util.Objects; + public class BettingAmount { private final Integer money; @@ -17,4 +19,18 @@ private static void validateMinus(Integer bettingAmount) { public Integer getMoney() { return money; } + + @Override + public boolean equals(Object o) { + if (o == null || getClass() != o.getClass()) { + return false; + } + BettingAmount that = (BettingAmount) o; + return Objects.equals(money, that.money); + } + + @Override + public int hashCode() { + return Objects.hashCode(money); + } } diff --git a/src/main/java/domain/betting/CalculateProfit.java b/src/main/java/domain/betting/CalculateProfit.java index 0f31a347d2..e5266d62f2 100644 --- a/src/main/java/domain/betting/CalculateProfit.java +++ b/src/main/java/domain/betting/CalculateProfit.java @@ -4,11 +4,10 @@ import domain.participant.Name; public class CalculateProfit { - private final Revenue revenue; + private static final Integer PROFIT_RATE = 3 / 2; private final BettingManager bettingManager; - public CalculateProfit(Revenue revenue, BettingManager bettingManager) { - this.revenue = revenue; + public CalculateProfit(BettingManager bettingManager) { this.bettingManager = bettingManager; } @@ -19,7 +18,7 @@ public Revenue calculate(Name name, GameResult gameResult) { private static Revenue calculateRevenue(GameResult gameResult, BettingAmount amount) { if (gameResult == GameResult.BLACKJACK) { - return new Revenue(amount.getMoney() / 2); + return new Revenue(amount.getMoney() * PROFIT_RATE); } if (gameResult == GameResult.WIN) { return new Revenue(amount.getMoney()); diff --git a/src/main/java/domain/betting/Revenue.java b/src/main/java/domain/betting/Revenue.java index 4a98793be6..d7c76f5283 100644 --- a/src/main/java/domain/betting/Revenue.java +++ b/src/main/java/domain/betting/Revenue.java @@ -9,6 +9,10 @@ public Revenue(int money) { this.money = money; } + public int getMoney() { + return money; + } + @Override public boolean equals(Object o) { if (o == null || getClass() != o.getClass()) { diff --git a/src/main/java/domain/betting/RevenueManager.java b/src/main/java/domain/betting/RevenueManager.java new file mode 100644 index 0000000000..3706832da4 --- /dev/null +++ b/src/main/java/domain/betting/RevenueManager.java @@ -0,0 +1,13 @@ +package domain.betting; + +import domain.participant.Name; +import java.util.HashMap; +import java.util.Map; + +public class RevenueManager { + private final Map finalRevenue; + + public RevenueManager(Map finalRevenue) { + this.finalRevenue = new HashMap<>(finalRevenue); + } +} diff --git a/src/main/java/domain/game/GameResultManager.java b/src/main/java/domain/game/GameResultManager.java index d8b0242dff..d09d85b5e1 100644 --- a/src/main/java/domain/game/GameResultManager.java +++ b/src/main/java/domain/game/GameResultManager.java @@ -1,7 +1,27 @@ package domain.game; -import domain.betting.BettingManager; +import domain.betting.CalculateProfit; +import domain.betting.Revenue; +import domain.participant.Dealer; +import domain.participant.Name; +import domain.participant.Players; +import java.util.HashMap; +import java.util.Map; public class GameResultManager { - BettingManager bettingManager; + private final CalculateProfit calculateProfit; + + public GameResultManager(CalculateProfit calculateProfit) { + this.calculateProfit = calculateProfit; + } + + public Map getParticipantsProfit(Players players, Dealer dealer) { + Map finalRevenues = new HashMap<>(); + players.forEach(player -> { + GameResult result = player.judgeResult(dealer); + Revenue revenue = calculateProfit.calculate(player.getName(), result); + finalRevenues.put(player.getName(), revenue); + }); + return finalRevenues; + } } diff --git a/src/test/java/domain/BettingManagerTest.java b/src/test/java/domain/BettingManagerTest.java deleted file mode 100644 index f0ae1bce92..0000000000 --- a/src/test/java/domain/BettingManagerTest.java +++ /dev/null @@ -1,52 +0,0 @@ -package domain; - -import static org.junit.jupiter.api.Assertions.assertEquals; - -import domain.betting.BettingAmount; -import domain.betting.BettingManager; -import domain.participant.Name; -import domain.participant.Player; -import java.util.HashMap; -import java.util.Map; -import org.junit.jupiter.api.Test; - -public class BettingManagerTest { - - @Test - void 참가자가_패배하면_배팅금액은_0원이_된다() { - Player player = new Player(new Name("pobi")); - Map amountMap = new HashMap<>(); - amountMap.put(player.getName(), new BettingAmount(1000)); - BettingManager bettingManager = new BettingManager(amountMap); - bettingManager.lose(player.getName()); - int expected = 0; - int actual = bettingManager.getAmount(player.getName()).getMoney(); - assertEquals(expected, actual); - } - - @Test - void 참가자가_승리하면_배팅금액을_받는다() { - Player player = new Player(new Name("pobi")); - Map amountMap = new HashMap<>(); - BettingAmount bettingAmount = new BettingAmount(1000); - amountMap.put(player.getName(), bettingAmount); - BettingManager bettingManager = new BettingManager(amountMap); - bettingManager.win(player.getName()); - int expected = 1000; - int actual = bettingManager.getAmount(player.getName()).getMoney(); - assertEquals(expected, actual); - } - - @Test - void 참가자가_블랙잭이면_배팅금액을_받는다() { - Player player = new Player(new Name("pobi")); - Map amountMap = new HashMap<>(); - BettingAmount bettingAmount = new BettingAmount(1000); - amountMap.put(player.getName(), bettingAmount); - BettingManager bettingManager = new BettingManager(amountMap); - bettingManager.blackJackWin(player.getName()); - int expected = 1500; - int actual = bettingManager.getAmount(player.getName()).getMoney(); - assertEquals(expected, actual); - } -} diff --git a/src/test/java/domain/BettingAmountTest.java b/src/test/java/domain/betting/BettingAmountTest.java similarity index 91% rename from src/test/java/domain/BettingAmountTest.java rename to src/test/java/domain/betting/BettingAmountTest.java index 0567e9e6b1..4f44a7096f 100644 --- a/src/test/java/domain/BettingAmountTest.java +++ b/src/test/java/domain/betting/BettingAmountTest.java @@ -1,8 +1,7 @@ -package domain; +package domain.betting; import static org.junit.jupiter.api.Assertions.*; -import domain.betting.BettingAmount; import org.junit.jupiter.api.Test; class BettingAmountTest { diff --git a/src/test/java/domain/betting/CalculateProfitTest.java b/src/test/java/domain/betting/CalculateProfitTest.java new file mode 100644 index 0000000000..c9dce8f037 --- /dev/null +++ b/src/test/java/domain/betting/CalculateProfitTest.java @@ -0,0 +1,61 @@ +package domain.betting; + +import static org.junit.jupiter.api.Assertions.*; + +import domain.game.GameResult; +import domain.participant.Name; +import domain.participant.Player; +import java.util.HashMap; +import java.util.Map; +import org.junit.jupiter.api.Test; + +class CalculateProfitTest { + + @Test + void 참가자가_패배하면_수익은_배팅금액만큼_감소한다() { + Name name = new Name("pobi"); + Player player = new Player(name); + Map amountMap = new HashMap<>(); + amountMap.put(player.getName(), new BettingAmount(1000)); + BettingManager bettingManager = new BettingManager(amountMap); + CalculateProfit calculateProfit = new CalculateProfit(bettingManager); + int expected = -1000; + assertEquals(expected, calculateProfit.calculate(name, GameResult.LOSE).getMoney()); + } + + @Test + void 참가자가_승리하면_수익은_배팅금액만큼_증가한다() { + Name name = new Name("pobi"); + Player player = new Player(name); + Map amountMap = new HashMap<>(); + amountMap.put(player.getName(), new BettingAmount(1000)); + BettingManager bettingManager = new BettingManager(amountMap); + CalculateProfit calculateProfit = new CalculateProfit(bettingManager); + int expected = 1000; + assertEquals(expected, calculateProfit.calculate(name, GameResult.WIN).getMoney()); + } + + @Test + void 참가자가_블랙잭이면_수익은_배팅금액의_1_5배가_된다() { + Name name = new Name("pobi"); + Player player = new Player(name); + Map amountMap = new HashMap<>(); + amountMap.put(player.getName(), new BettingAmount(1000)); + BettingManager bettingManager = new BettingManager(amountMap); + CalculateProfit calculateProfit = new CalculateProfit(bettingManager); + int expected = 1500; + assertEquals(expected, calculateProfit.calculate(name, GameResult.BLACKJACK).getMoney()); + } + + @Test + void 참가자가_비기면_수익은_0원이다() { + Name name = new Name("pobi"); + Player player = new Player(name); + Map amountMap = new HashMap<>(); + amountMap.put(player.getName(), new BettingAmount(1000)); + BettingManager bettingManager = new BettingManager(amountMap); + CalculateProfit calculateProfit = new CalculateProfit(bettingManager); + int expected = 0; + assertEquals(expected, calculateProfit.calculate(name, GameResult.DRAW).getMoney()); + } +} diff --git a/src/test/java/domain/DeckTest.java b/src/test/java/domain/card/DeckTest.java similarity index 92% rename from src/test/java/domain/DeckTest.java rename to src/test/java/domain/card/DeckTest.java index 02bd002f00..3710b9384c 100644 --- a/src/test/java/domain/DeckTest.java +++ b/src/test/java/domain/card/DeckTest.java @@ -1,8 +1,7 @@ -package domain; +package domain.card; import static org.junit.jupiter.api.Assertions.*; -import domain.card.Deck; import org.junit.jupiter.api.Test; class DeckTest { diff --git a/src/test/java/domain/GameManagerTest.java b/src/test/java/domain/game/GameManagerTest.java similarity index 95% rename from src/test/java/domain/GameManagerTest.java rename to src/test/java/domain/game/GameManagerTest.java index 40f741ac4f..93fe0c28cb 100644 --- a/src/test/java/domain/GameManagerTest.java +++ b/src/test/java/domain/game/GameManagerTest.java @@ -1,12 +1,10 @@ -package domain; +package domain.game; import static org.junit.jupiter.api.Assertions.*; import domain.card.Card; import domain.card.Number; import domain.card.Shape; -import domain.game.GameManager; -import domain.game.GameResult; import domain.participant.Dealer; import domain.participant.Name; import domain.participant.Player; diff --git a/src/test/java/domain/DealerTest.java b/src/test/java/domain/participant/DealerTest.java similarity index 92% rename from src/test/java/domain/DealerTest.java rename to src/test/java/domain/participant/DealerTest.java index ce9a017ed1..414fefc2bb 100644 --- a/src/test/java/domain/DealerTest.java +++ b/src/test/java/domain/participant/DealerTest.java @@ -1,12 +1,10 @@ -package domain; +package domain.participant; import static org.junit.jupiter.api.Assertions.*; import domain.card.Card; import domain.card.Number; import domain.card.Shape; -import domain.participant.Dealer; -import domain.participant.Name; import org.junit.jupiter.api.Test; class DealerTest { diff --git a/src/test/java/domain/NameTest.java b/src/test/java/domain/participant/NameTest.java similarity index 94% rename from src/test/java/domain/NameTest.java rename to src/test/java/domain/participant/NameTest.java index 942af9dc1a..15799e4007 100644 --- a/src/test/java/domain/NameTest.java +++ b/src/test/java/domain/participant/NameTest.java @@ -1,8 +1,7 @@ -package domain; +package domain.participant; import static org.junit.jupiter.api.Assertions.*; -import domain.participant.Name; import org.junit.jupiter.api.Test; class NameTest { diff --git a/src/test/java/domain/ParticipantCardsTest.java b/src/test/java/domain/participant/ParticipantCardsTest.java similarity index 95% rename from src/test/java/domain/ParticipantCardsTest.java rename to src/test/java/domain/participant/ParticipantCardsTest.java index be107cd204..3d0448d799 100644 --- a/src/test/java/domain/ParticipantCardsTest.java +++ b/src/test/java/domain/participant/ParticipantCardsTest.java @@ -1,4 +1,4 @@ -package domain; +package domain.participant; import static org.junit.jupiter.api.Assertions.*; @@ -6,7 +6,6 @@ import domain.card.Cards; import domain.card.Number; import domain.card.Shape; -import domain.participant.ParticipantCards; import java.util.ArrayList; import org.junit.jupiter.api.Test; diff --git a/src/test/java/domain/PlayerTest.java b/src/test/java/domain/participant/PlayerTest.java similarity index 98% rename from src/test/java/domain/PlayerTest.java rename to src/test/java/domain/participant/PlayerTest.java index dddd656719..f8343b4a8b 100644 --- a/src/test/java/domain/PlayerTest.java +++ b/src/test/java/domain/participant/PlayerTest.java @@ -1,4 +1,4 @@ -package domain; +package domain.participant; import static org.junit.jupiter.api.Assertions.*; @@ -6,9 +6,6 @@ import domain.card.Number; import domain.card.Shape; import domain.game.GameResult; -import domain.participant.Dealer; -import domain.participant.Name; -import domain.participant.Player; import org.junit.jupiter.api.Test; class PlayerTest { diff --git a/src/test/java/domain/PlayersTest.java b/src/test/java/domain/participant/PlayersTest.java similarity index 93% rename from src/test/java/domain/PlayersTest.java rename to src/test/java/domain/participant/PlayersTest.java index 7f9b139254..f7e0559662 100644 --- a/src/test/java/domain/PlayersTest.java +++ b/src/test/java/domain/participant/PlayersTest.java @@ -1,10 +1,7 @@ -package domain; +package domain.participant; import static org.junit.jupiter.api.Assertions.*; -import domain.participant.Name; -import domain.participant.Player; -import domain.participant.Players; import java.util.ArrayList; import java.util.List; import org.junit.jupiter.api.Test; From beb9ba93830b7e72928c1a7df0eaf1b5ad2f84a1 Mon Sep 17 00:00:00 2001 From: xxbeann Date: Sun, 15 Mar 2026 03:33:19 +0900 Subject: [PATCH 24/44] =?UTF-8?q?bugfix:=20PROFIT=5FRATE=20=EC=83=81?= =?UTF-8?q?=EC=88=98=20=ED=98=95=EB=B3=80=ED=99=98?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- src/main/java/domain/betting/CalculateProfit.java | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/src/main/java/domain/betting/CalculateProfit.java b/src/main/java/domain/betting/CalculateProfit.java index e5266d62f2..161d0931de 100644 --- a/src/main/java/domain/betting/CalculateProfit.java +++ b/src/main/java/domain/betting/CalculateProfit.java @@ -4,7 +4,7 @@ import domain.participant.Name; public class CalculateProfit { - private static final Integer PROFIT_RATE = 3 / 2; + private static final double PROFIT_RATE = 1.5; private final BettingManager bettingManager; public CalculateProfit(BettingManager bettingManager) { @@ -18,7 +18,7 @@ public Revenue calculate(Name name, GameResult gameResult) { private static Revenue calculateRevenue(GameResult gameResult, BettingAmount amount) { if (gameResult == GameResult.BLACKJACK) { - return new Revenue(amount.getMoney() * PROFIT_RATE); + return new Revenue((int) (amount.getMoney() * PROFIT_RATE)); } if (gameResult == GameResult.WIN) { return new Revenue(amount.getMoney()); From 4602410c2c534c5b5a0eea6fd8ba1c40b1423daf Mon Sep 17 00:00:00 2001 From: xxbeann Date: Sun, 15 Mar 2026 04:05:40 +0900 Subject: [PATCH 25/44] =?UTF-8?q?refactor:=20=EA=B2=8C=EC=9E=84=20?= =?UTF-8?q?=EA=B2=B0=EA=B3=BC=20=EA=B3=84=EC=82=B0=20=EC=B1=85=EC=9E=84?= =?UTF-8?q?=EC=9D=84=20GameResultManager=EB=A1=9C=20=EC=9D=B4=EB=8F=99?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit - BlackJackGameController에서 BettingManager 초기화 로직 추가 - GameManager의 결과 조회 책임을 GameResultManager로 이동 - GameResultManager에 플레이어/딜러 기반 결과 계산 로직 추가 - GameResultManager 테스트 추가 및 기존 GameManager 테스트 정리 --- .../controller/BlackJackGameController.java | 22 ++++++++++++++++--- src/main/java/domain/game/GameManager.java | 16 +++++++------- .../java/domain/game/GameResultManager.java | 17 ++++++++++++-- ...erTest.java => GameResultManagerTest.java} | 22 ++++++++++++------- 4 files changed, 56 insertions(+), 21 deletions(-) rename src/test/java/domain/game/{GameManagerTest.java => GameResultManagerTest.java} (60%) diff --git a/src/main/java/controller/BlackJackGameController.java b/src/main/java/controller/BlackJackGameController.java index f1d2355cc3..5a29d17d56 100644 --- a/src/main/java/controller/BlackJackGameController.java +++ b/src/main/java/controller/BlackJackGameController.java @@ -1,13 +1,18 @@ package controller; +import domain.betting.BettingAmount; +import domain.betting.BettingManager; +import domain.betting.CalculateProfit; import domain.game.GameManager; import domain.game.GameResult; +import domain.game.GameResultManager; import domain.participant.Dealer; import domain.participant.Name; import domain.participant.Participant; import domain.participant.Player; import domain.participant.Players; import dto.ParticipantCardsDto; +import java.util.HashMap; import view.InputView; import view.OutputView; @@ -27,16 +32,27 @@ public void run() { Players players = initPlayer(); GameManager gameManager = new GameManager(players); List playersNames = getPlayerNames(players); - // TODO: 베팅금액 입력 로직 - return 값 아직 활용 안함 - players.forEach(player -> InputView.askBettingAmount(player.getName().getName())); + BettingManager bettingManager = initBettingManager(players); OutputView.printGameInitialMessage(playersNames); gameManager.distributeInitialCards(); printParticipantCards(gameManager.getDealer(), players); playGame(players, gameManager); - Map gameResult = gameManager.getGameResult(); + CalculateProfit calculateProfit = new CalculateProfit(bettingManager); + GameResultManager gameResultManager = + new GameResultManager(calculateProfit, players, gameManager.getDealer()); + Map gameResult = gameResultManager.getGameResult(); endGame(gameManager, players, gameResult); } + private BettingManager initBettingManager(Players players) { + Map bettingAmounts = new HashMap<>(); + players.forEach(player -> { + int amount = InputView.askBettingAmount(player.getName().getName()); + bettingAmounts.put(player.getName(), new BettingAmount(amount)); + }); + return new BettingManager(bettingAmounts); + } + private void playGame(Players players, GameManager gameManager) { players.forEach(player -> playGameWithPlayer(player, gameManager)); playGameWithDealer(gameManager); diff --git a/src/main/java/domain/game/GameManager.java b/src/main/java/domain/game/GameManager.java index e693aa4c3c..48b13ba29b 100644 --- a/src/main/java/domain/game/GameManager.java +++ b/src/main/java/domain/game/GameManager.java @@ -55,12 +55,12 @@ public void drawCardTo(Participant participant) { } //TODO: 나중에 getGameResult랑 judgeResult와 함께하는 클래스를 하나 만들어야 할듯 - public Map getGameResult() { - Map gameResult = new HashMap<>(); - players.forEach(player -> { - GameResult result = player.judgeResult(dealer); - gameResult.put(player.getName().getName(), result); - }); - return gameResult; - } +// public Map getGameResult() { +// Map gameResult = new HashMap<>(); +// players.forEach(player -> { +// GameResult result = player.judgeResult(dealer); +// gameResult.put(player.getName().getName(), result); +// }); +// return gameResult; +// } } diff --git a/src/main/java/domain/game/GameResultManager.java b/src/main/java/domain/game/GameResultManager.java index d09d85b5e1..5e8f4c76cf 100644 --- a/src/main/java/domain/game/GameResultManager.java +++ b/src/main/java/domain/game/GameResultManager.java @@ -10,12 +10,25 @@ public class GameResultManager { private final CalculateProfit calculateProfit; + private final Players players; + private final Dealer dealer; - public GameResultManager(CalculateProfit calculateProfit) { + public GameResultManager(CalculateProfit calculateProfit, Players players, Dealer dealer) { this.calculateProfit = calculateProfit; + this.players = players; + this.dealer = dealer; } - public Map getParticipantsProfit(Players players, Dealer dealer) { + public Map getGameResult() { + Map gameResult = new HashMap<>(); + players.forEach(player -> { + GameResult result = player.judgeResult(dealer); + gameResult.put(player.getName().getName(), result); + }); + return gameResult; + } + + public Map getParticipantsProfit() { Map finalRevenues = new HashMap<>(); players.forEach(player -> { GameResult result = player.judgeResult(dealer); diff --git a/src/test/java/domain/game/GameManagerTest.java b/src/test/java/domain/game/GameResultManagerTest.java similarity index 60% rename from src/test/java/domain/game/GameManagerTest.java rename to src/test/java/domain/game/GameResultManagerTest.java index 93fe0c28cb..1d25ce0b60 100644 --- a/src/test/java/domain/game/GameManagerTest.java +++ b/src/test/java/domain/game/GameResultManagerTest.java @@ -2,6 +2,9 @@ import static org.junit.jupiter.api.Assertions.*; +import domain.betting.BettingAmount; +import domain.betting.BettingManager; +import domain.betting.CalculateProfit; import domain.card.Card; import domain.card.Number; import domain.card.Shape; @@ -9,19 +12,18 @@ import domain.participant.Name; import domain.participant.Player; import domain.participant.Players; +import java.util.HashMap; import java.util.List; import java.util.Map; import org.junit.jupiter.api.Test; -class GameManagerTest { +class GameResultManagerTest { @Test void 플레이어들의_점수를_딜러와_비교해_승패를_반환한다() { - // TODO: 단위 테스트라기보다 얇은 통합 테스트 느낌 추후 리팩토링 예정 Player pobi = new Player(new Name("pobi")); Player crong = new Player(new Name("crong")); Players players = new Players(List.of(pobi, crong)); GameManager gameManager = new GameManager(players); - Dealer dealer = gameManager.getDealer(); dealer.receiveCard(new Card(Shape.SPADE, domain.card.Number.TEN)); @@ -33,12 +35,16 @@ class GameManagerTest { crong.receiveCard(new Card(Shape.SPADE, domain.card.Number.NINE)); crong.receiveCard(new Card(Shape.HEART, Number.SEVEN)); - Map result = gameManager.getGameResult(); + Map bettingAmounts = new HashMap<>(); + players.forEach(player -> bettingAmounts.put(player.getName(), new BettingAmount(1000))); + + BettingManager bettingManager = new BettingManager(bettingAmounts); + CalculateProfit calculateProfit = new CalculateProfit(bettingManager); + GameResultManager gameResultManager = new GameResultManager(calculateProfit, players, dealer); - GameResult pobiResult = result.get("pobi"); - GameResult crongResult = result.get("crong"); + Map result = gameResultManager.getGameResult(); - assertEquals(GameResult.WIN, pobiResult); - assertEquals(GameResult.LOSE, crongResult); + assertEquals(GameResult.WIN, result.get("pobi")); + assertEquals(GameResult.LOSE, result.get("crong")); } } From ef41d19d410987b614d9e30fa121e00f8950379c Mon Sep 17 00:00:00 2001 From: xxbeann Date: Sun, 15 Mar 2026 04:10:00 +0900 Subject: [PATCH 26/44] =?UTF-8?q?fix:=20=EB=94=9C=EB=9F=AC=20=ED=94=8C?= =?UTF-8?q?=EB=A0=88=EC=9D=B4=EC=96=B4=20=EB=8F=99=EC=8B=9C=20=EB=B8=94?= =?UTF-8?q?=EB=9E=99=EC=9E=AD=EC=9D=BC=EA=B2=BD=EC=9A=B0=20=EB=B9=84?= =?UTF-8?q?=EA=B9=80=ED=8C=90=EC=A0=95?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- src/main/java/domain/participant/Player.java | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/src/main/java/domain/participant/Player.java b/src/main/java/domain/participant/Player.java index efc7de5cac..aae3594b00 100644 --- a/src/main/java/domain/participant/Player.java +++ b/src/main/java/domain/participant/Player.java @@ -18,10 +18,10 @@ public boolean isContinueGame() { public GameResult judgeResult(Dealer dealer) { if(this.isBlackJack() && dealer.isBlackJack()) { - return GameResult.BLACKJACK; + return GameResult.DRAW; // TODO: 배팅 금액을 돌려 받는다 } if(this.isBlackJack()) { - return GameResult.BLACKJACK; + return GameResult.BLACKJACK; // TODO: 배팅 금액 1.5배 } if (this.isBust()) { // TODO: 배팅 금액을 모두 잃는다. return GameResult.LOSE; From 925ab93c0daafbd7d60bbcda96b05232580d9f44 Mon Sep 17 00:00:00 2001 From: xxbeann Date: Sun, 15 Mar 2026 04:48:34 +0900 Subject: [PATCH 27/44] =?UTF-8?q?feat:=20=EC=B0=B8=EA=B0=80=EC=9E=90=20?= =?UTF-8?q?=EC=B5=9C=EC=A2=85=20=EC=88=98=EC=9D=B5=20=EC=B6=9C=EB=A0=A5=20?= =?UTF-8?q?=EA=B8=B0=EB=8A=A5=20=EC=B6=94=EA=B0=80?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit - ParticipantRevenueDto 추가 - 컨트롤러에서 도메인 수익 결과를 DTO로 변환하도록 변경 - GameResultManager에서 참가자 및 딜러 수익 집계 로직 추가 - OutputView에 최종 수익 출력 기능 추가 - Dealer 이름을 고정값으로 관리하도록 정리 --- .../controller/BlackJackGameController.java | 28 ++++++++++++++++--- src/main/java/domain/game/GameManager.java | 6 +--- .../java/domain/game/GameResultManager.java | 14 ++++++++-- src/main/java/domain/participant/Dealer.java | 5 ++-- src/main/java/dto/ParticipantCardsDto.java | 5 +++- src/main/java/dto/ParticipantRevenueDto.java | 7 +++++ src/main/java/view/OutputView.java | 13 +++++++++ .../java/domain/participant/DealerTest.java | 4 +-- .../java/domain/participant/PlayerTest.java | 10 +++---- 9 files changed, 71 insertions(+), 21 deletions(-) create mode 100644 src/main/java/dto/ParticipantRevenueDto.java diff --git a/src/main/java/controller/BlackJackGameController.java b/src/main/java/controller/BlackJackGameController.java index 5a29d17d56..cbefab1ba5 100644 --- a/src/main/java/controller/BlackJackGameController.java +++ b/src/main/java/controller/BlackJackGameController.java @@ -3,6 +3,7 @@ import domain.betting.BettingAmount; import domain.betting.BettingManager; import domain.betting.CalculateProfit; +import domain.betting.Revenue; import domain.game.GameManager; import domain.game.GameResult; import domain.game.GameResultManager; @@ -12,6 +13,7 @@ import domain.participant.Player; import domain.participant.Players; import dto.ParticipantCardsDto; +import dto.ParticipantRevenueDto; import java.util.HashMap; import view.InputView; import view.OutputView; @@ -40,8 +42,12 @@ public void run() { CalculateProfit calculateProfit = new CalculateProfit(bettingManager); GameResultManager gameResultManager = new GameResultManager(calculateProfit, players, gameManager.getDealer()); - Map gameResult = gameResultManager.getGameResult(); - endGame(gameManager, players, gameResult); + //TODO: 여기 아래 가 변경되어야 함. 지금 gameResuㅣㅅ + //Map gameResult = gameResultManager.getGameResult(); + Map profits = gameResultManager.getParticipantsProfit(); + List revenueDtos = toParticipantRevenueDtos(profits); + + endGame(gameManager, players, revenueDtos); } private BettingManager initBettingManager(Players players) { @@ -53,6 +59,19 @@ private BettingManager initBettingManager(Players players) { return new BettingManager(bettingAmounts); } + private List toParticipantRevenueDtos(Map profits) { + List revenueDtos = new ArrayList<>(); + for (Map.Entry entry : profits.entrySet()) { + revenueDtos.add(new ParticipantRevenueDto( + entry.getKey().getName(), + entry.getValue().getMoney() + )); + } + return revenueDtos; + } + + + private void playGame(Players players, GameManager gameManager) { players.forEach(player -> playGameWithPlayer(player, gameManager)); playGameWithDealer(gameManager); @@ -92,10 +111,11 @@ private void printParticipantCards(Dealer dealer, Players players) { players.forEach(player -> OutputView.printCards(toParticipantCardsDto(player))); } - private void endGame(GameManager gameManager, Players players, Map gameResult) { + private void endGame(GameManager gameManager, Players players, List participantRevenueDtos) { OutputView.printFinalCards(toParticipantCardsDto(gameManager.getDealer())); printFinalScores(players); - OutputView.printGameResult(gameResult); + // OutputView.printGameResult(gameResult); + OutputView.printParticipantRevenues(participantRevenueDtos); } private void printFinalScores(Players players) { diff --git a/src/main/java/domain/game/GameManager.java b/src/main/java/domain/game/GameManager.java index 48b13ba29b..40c115c786 100644 --- a/src/main/java/domain/game/GameManager.java +++ b/src/main/java/domain/game/GameManager.java @@ -3,11 +3,8 @@ import domain.card.Card; import domain.participant.Dealer; import domain.card.Deck; -import domain.participant.Name; import domain.participant.Participant; import domain.participant.Players; -import java.util.HashMap; -import java.util.Map; public class GameManager { @@ -26,8 +23,7 @@ public Dealer getDealer() { } private Dealer initDealer() { - Name name = new Name("딜러"); - Dealer dealer = new Dealer(name); + Dealer dealer = new Dealer(); return dealer; } diff --git a/src/main/java/domain/game/GameResultManager.java b/src/main/java/domain/game/GameResultManager.java index 5e8f4c76cf..f2ae827738 100644 --- a/src/main/java/domain/game/GameResultManager.java +++ b/src/main/java/domain/game/GameResultManager.java @@ -6,6 +6,7 @@ import domain.participant.Name; import domain.participant.Players; import java.util.HashMap; +import java.util.LinkedHashMap; import java.util.Map; public class GameResultManager { @@ -28,13 +29,22 @@ public Map getGameResult() { return gameResult; } - public Map getParticipantsProfit() { - Map finalRevenues = new HashMap<>(); + public LinkedHashMap getParticipantsProfit() { + LinkedHashMap finalRevenues = new LinkedHashMap<>(); players.forEach(player -> { GameResult result = player.judgeResult(dealer); Revenue revenue = calculateProfit.calculate(player.getName(), result); finalRevenues.put(player.getName(), revenue); }); + finalRevenues.put(dealer.getName(), calculateDealerRevenue(finalRevenues)); return finalRevenues; } + + private Revenue calculateDealerRevenue(Map revenues) { + int dealerRevenue = -revenues.values().stream() + .mapToInt(Revenue::getMoney) + .sum(); + return new Revenue(dealerRevenue); + } + } diff --git a/src/main/java/domain/participant/Dealer.java b/src/main/java/domain/participant/Dealer.java index 165bc9dc1a..ca35605906 100644 --- a/src/main/java/domain/participant/Dealer.java +++ b/src/main/java/domain/participant/Dealer.java @@ -2,9 +2,10 @@ public class Dealer extends Participant { private static final int CAN_RECEIVE_CARD_THRESHOLD = 17; + private static final String DEALER = "딜러"; - public Dealer(Name name) { - super(name); + public Dealer() { + super(new Name(DEALER)); } public boolean isContinueGame() { diff --git a/src/main/java/dto/ParticipantCardsDto.java b/src/main/java/dto/ParticipantCardsDto.java index 175a3e11f0..2c7444ff2c 100644 --- a/src/main/java/dto/ParticipantCardsDto.java +++ b/src/main/java/dto/ParticipantCardsDto.java @@ -2,5 +2,8 @@ import java.util.List; -public record ParticipantCardsDto(String name, List cardsInfo, int totalScore) { +public record ParticipantCardsDto( + String name, + List cardsInfo, + int totalScore) { }; diff --git a/src/main/java/dto/ParticipantRevenueDto.java b/src/main/java/dto/ParticipantRevenueDto.java new file mode 100644 index 0000000000..fcdfd4f04e --- /dev/null +++ b/src/main/java/dto/ParticipantRevenueDto.java @@ -0,0 +1,7 @@ +package dto; + +public record ParticipantRevenueDto( + String name, + int revenue +) { +} diff --git a/src/main/java/view/OutputView.java b/src/main/java/view/OutputView.java index ba52adbca3..be4efcfad6 100644 --- a/src/main/java/view/OutputView.java +++ b/src/main/java/view/OutputView.java @@ -3,6 +3,7 @@ import domain.game.GameResult; import dto.ParticipantCardsDto; +import dto.ParticipantRevenueDto; import java.util.List; import java.util.Map; @@ -52,6 +53,18 @@ public static void printGameResult(Map gameResult) { System.out.printf(resultMessage.toString()); } + public static void printParticipantRevenues(List participantRevenueDtos) { + System.out.println(); + System.out.println("## 최종 수익"); + + for (ParticipantRevenueDto participantRevenueDto : participantRevenueDtos) { + System.out.println( + participantRevenueDto.name() + ": " + participantRevenueDto.revenue() + ); + } + + } + private static void printInitialPlayerCards(ParticipantCardsDto participantCardsDto) { if (!participantCardsDto.name().equals(DEALER)) { String cardsInfoMessage = String.join(",", participantCardsDto.cardsInfo()); diff --git a/src/test/java/domain/participant/DealerTest.java b/src/test/java/domain/participant/DealerTest.java index 414fefc2bb..7bb9b7c0e0 100644 --- a/src/test/java/domain/participant/DealerTest.java +++ b/src/test/java/domain/participant/DealerTest.java @@ -11,7 +11,7 @@ class DealerTest { @Test void 점수가_16점_이하이면_카드를_추가로_받을_수_있다() { - Dealer dealer = new Dealer(new Name("딜러")); + Dealer dealer = new Dealer(); dealer.receiveCard(new Card(Shape.SPADE, domain.card.Number.TEN)); dealer.receiveCard(new Card(Shape.HEART, domain.card.Number.SIX)); @@ -21,7 +21,7 @@ class DealerTest { @Test void 점수가_17점_이상이면_카드를_추가로_받을_수_없다() { - Dealer dealer = new Dealer(new Name("딜러")); + Dealer dealer = new Dealer(); dealer.receiveCard(new Card(Shape.SPADE, domain.card.Number.TEN)); dealer.receiveCard(new Card(Shape.HEART, Number.SEVEN)); diff --git a/src/test/java/domain/participant/PlayerTest.java b/src/test/java/domain/participant/PlayerTest.java index f8343b4a8b..f52ffd3aca 100644 --- a/src/test/java/domain/participant/PlayerTest.java +++ b/src/test/java/domain/participant/PlayerTest.java @@ -95,7 +95,7 @@ class PlayerTest { @Test void 딜러보다_점수가_높으면_승리한다() { Player player = new Player(new Name("pobi")); - Dealer dealer = new Dealer(new Name("딜러")); + Dealer dealer = new Dealer(); player.receiveCard(new Card(Shape.SPADE, domain.card.Number.TEN)); player.receiveCard(new Card(Shape.HEART, domain.card.Number.JACK)); @@ -111,7 +111,7 @@ class PlayerTest { @Test void 딜러와_점수가_같으면_무승부이다() { Player player = new Player(new Name("pobi")); - Dealer dealer = new Dealer(new Name("딜러")); + Dealer dealer = new Dealer(); player.receiveCard(new Card(Shape.SPADE, domain.card.Number.TEN)); player.receiveCard(new Card(Shape.HEART, domain.card.Number.JACK)); @@ -127,7 +127,7 @@ class PlayerTest { @Test void 딜러보다_점수가_낮으면_패배한다() { Player player = new Player(new Name("pobi")); - Dealer dealer = new Dealer(new Name("딜러")); + Dealer dealer = new Dealer(); player.receiveCard(new Card(Shape.SPADE, domain.card.Number.TEN)); @@ -142,7 +142,7 @@ class PlayerTest { @Test void 플레이어가_버스트이면_패배한다() { Player player = new Player(new Name("pobi")); - Dealer dealer = new Dealer(new Name("딜러")); + Dealer dealer = new Dealer(); player.receiveCard(new Card(Shape.SPADE, domain.card.Number.TWO)); player.receiveCard(new Card(Shape.HEART, domain.card.Number.JACK)); @@ -159,7 +159,7 @@ class PlayerTest { @Test void 딜러가_버스트이면_승리한다() { Player player = new Player(new Name("pobi")); - Dealer dealer = new Dealer(new Name("딜러")); + Dealer dealer = new Dealer(); player.receiveCard(new Card(Shape.SPADE, domain.card.Number.TEN)); player.receiveCard(new Card(Shape.HEART, domain.card.Number.JACK)); From 77b197e564dec7c7578d87b788ddc64d63aff1eb Mon Sep 17 00:00:00 2001 From: xxbeann Date: Sun, 15 Mar 2026 04:52:05 +0900 Subject: [PATCH 28/44] =?UTF-8?q?refactor:=20=EC=9D=BC=EA=B8=89=20?= =?UTF-8?q?=EC=BB=AC=EB=A0=89=EC=85=98=EC=97=90=20=EB=A7=9E=EA=B2=8C=20?= =?UTF-8?q?=ED=81=B4=EB=9E=98=EC=8A=A4=EB=AA=85=20=EB=B3=80=EA=B2=BD?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../java/controller/BlackJackGameController.java | 11 +++++------ .../{BettingManager.java => BettingAmounts.java} | 4 ++-- .../java/domain/betting/CalculateProfit.java | 8 ++++---- .../{RevenueManager.java => Revenues.java} | 4 ++-- .../java/domain/betting/CalculateProfitTest.java | 16 ++++++++-------- .../java/domain/game/GameResultManagerTest.java | 4 ++-- 6 files changed, 23 insertions(+), 24 deletions(-) rename src/main/java/domain/betting/{BettingManager.java => BettingAmounts.java} (78%) rename src/main/java/domain/betting/{RevenueManager.java => Revenues.java} (71%) diff --git a/src/main/java/controller/BlackJackGameController.java b/src/main/java/controller/BlackJackGameController.java index cbefab1ba5..daa680808a 100644 --- a/src/main/java/controller/BlackJackGameController.java +++ b/src/main/java/controller/BlackJackGameController.java @@ -1,11 +1,10 @@ package controller; import domain.betting.BettingAmount; -import domain.betting.BettingManager; +import domain.betting.BettingAmounts; import domain.betting.CalculateProfit; import domain.betting.Revenue; import domain.game.GameManager; -import domain.game.GameResult; import domain.game.GameResultManager; import domain.participant.Dealer; import domain.participant.Name; @@ -34,12 +33,12 @@ public void run() { Players players = initPlayer(); GameManager gameManager = new GameManager(players); List playersNames = getPlayerNames(players); - BettingManager bettingManager = initBettingManager(players); + BettingAmounts bettingAmounts = initBettingManager(players); OutputView.printGameInitialMessage(playersNames); gameManager.distributeInitialCards(); printParticipantCards(gameManager.getDealer(), players); playGame(players, gameManager); - CalculateProfit calculateProfit = new CalculateProfit(bettingManager); + CalculateProfit calculateProfit = new CalculateProfit(bettingAmounts); GameResultManager gameResultManager = new GameResultManager(calculateProfit, players, gameManager.getDealer()); //TODO: 여기 아래 가 변경되어야 함. 지금 gameResuㅣㅅ @@ -50,13 +49,13 @@ public void run() { endGame(gameManager, players, revenueDtos); } - private BettingManager initBettingManager(Players players) { + private BettingAmounts initBettingManager(Players players) { Map bettingAmounts = new HashMap<>(); players.forEach(player -> { int amount = InputView.askBettingAmount(player.getName().getName()); bettingAmounts.put(player.getName(), new BettingAmount(amount)); }); - return new BettingManager(bettingAmounts); + return new BettingAmounts(bettingAmounts); } private List toParticipantRevenueDtos(Map profits) { diff --git a/src/main/java/domain/betting/BettingManager.java b/src/main/java/domain/betting/BettingAmounts.java similarity index 78% rename from src/main/java/domain/betting/BettingManager.java rename to src/main/java/domain/betting/BettingAmounts.java index 0d3863cf60..ac4a66b15c 100644 --- a/src/main/java/domain/betting/BettingManager.java +++ b/src/main/java/domain/betting/BettingAmounts.java @@ -4,10 +4,10 @@ import java.util.HashMap; import java.util.Map; -public class BettingManager { +public class BettingAmounts { private final Map bettingAmounts; - public BettingManager(Map playerBettingAmountMap) { + public BettingAmounts(Map playerBettingAmountMap) { this.bettingAmounts = new HashMap<>(playerBettingAmountMap); } diff --git a/src/main/java/domain/betting/CalculateProfit.java b/src/main/java/domain/betting/CalculateProfit.java index 161d0931de..da7e2026eb 100644 --- a/src/main/java/domain/betting/CalculateProfit.java +++ b/src/main/java/domain/betting/CalculateProfit.java @@ -5,14 +5,14 @@ public class CalculateProfit { private static final double PROFIT_RATE = 1.5; - private final BettingManager bettingManager; + private final BettingAmounts bettingAmounts; - public CalculateProfit(BettingManager bettingManager) { - this.bettingManager = bettingManager; + public CalculateProfit(BettingAmounts bettingAmounts) { + this.bettingAmounts = bettingAmounts; } public Revenue calculate(Name name, GameResult gameResult) { - BettingAmount amount = bettingManager.getAmount(name); + BettingAmount amount = bettingAmounts.getAmount(name); return calculateRevenue(gameResult, amount); } diff --git a/src/main/java/domain/betting/RevenueManager.java b/src/main/java/domain/betting/Revenues.java similarity index 71% rename from src/main/java/domain/betting/RevenueManager.java rename to src/main/java/domain/betting/Revenues.java index 3706832da4..c1ebfaa106 100644 --- a/src/main/java/domain/betting/RevenueManager.java +++ b/src/main/java/domain/betting/Revenues.java @@ -4,10 +4,10 @@ import java.util.HashMap; import java.util.Map; -public class RevenueManager { +public class Revenues { private final Map finalRevenue; - public RevenueManager(Map finalRevenue) { + public Revenues(Map finalRevenue) { this.finalRevenue = new HashMap<>(finalRevenue); } } diff --git a/src/test/java/domain/betting/CalculateProfitTest.java b/src/test/java/domain/betting/CalculateProfitTest.java index c9dce8f037..ed6804e36d 100644 --- a/src/test/java/domain/betting/CalculateProfitTest.java +++ b/src/test/java/domain/betting/CalculateProfitTest.java @@ -17,8 +17,8 @@ class CalculateProfitTest { Player player = new Player(name); Map amountMap = new HashMap<>(); amountMap.put(player.getName(), new BettingAmount(1000)); - BettingManager bettingManager = new BettingManager(amountMap); - CalculateProfit calculateProfit = new CalculateProfit(bettingManager); + BettingAmounts bettingAmounts = new BettingAmounts(amountMap); + CalculateProfit calculateProfit = new CalculateProfit(bettingAmounts); int expected = -1000; assertEquals(expected, calculateProfit.calculate(name, GameResult.LOSE).getMoney()); } @@ -29,8 +29,8 @@ class CalculateProfitTest { Player player = new Player(name); Map amountMap = new HashMap<>(); amountMap.put(player.getName(), new BettingAmount(1000)); - BettingManager bettingManager = new BettingManager(amountMap); - CalculateProfit calculateProfit = new CalculateProfit(bettingManager); + BettingAmounts bettingAmounts = new BettingAmounts(amountMap); + CalculateProfit calculateProfit = new CalculateProfit(bettingAmounts); int expected = 1000; assertEquals(expected, calculateProfit.calculate(name, GameResult.WIN).getMoney()); } @@ -41,8 +41,8 @@ class CalculateProfitTest { Player player = new Player(name); Map amountMap = new HashMap<>(); amountMap.put(player.getName(), new BettingAmount(1000)); - BettingManager bettingManager = new BettingManager(amountMap); - CalculateProfit calculateProfit = new CalculateProfit(bettingManager); + BettingAmounts bettingAmounts = new BettingAmounts(amountMap); + CalculateProfit calculateProfit = new CalculateProfit(bettingAmounts); int expected = 1500; assertEquals(expected, calculateProfit.calculate(name, GameResult.BLACKJACK).getMoney()); } @@ -53,8 +53,8 @@ class CalculateProfitTest { Player player = new Player(name); Map amountMap = new HashMap<>(); amountMap.put(player.getName(), new BettingAmount(1000)); - BettingManager bettingManager = new BettingManager(amountMap); - CalculateProfit calculateProfit = new CalculateProfit(bettingManager); + BettingAmounts bettingAmounts = new BettingAmounts(amountMap); + CalculateProfit calculateProfit = new CalculateProfit(bettingAmounts); int expected = 0; assertEquals(expected, calculateProfit.calculate(name, GameResult.DRAW).getMoney()); } diff --git a/src/test/java/domain/game/GameResultManagerTest.java b/src/test/java/domain/game/GameResultManagerTest.java index 1d25ce0b60..1f4d0f3cd0 100644 --- a/src/test/java/domain/game/GameResultManagerTest.java +++ b/src/test/java/domain/game/GameResultManagerTest.java @@ -3,7 +3,7 @@ import static org.junit.jupiter.api.Assertions.*; import domain.betting.BettingAmount; -import domain.betting.BettingManager; +import domain.betting.BettingAmounts; import domain.betting.CalculateProfit; import domain.card.Card; import domain.card.Number; @@ -38,7 +38,7 @@ class GameResultManagerTest { Map bettingAmounts = new HashMap<>(); players.forEach(player -> bettingAmounts.put(player.getName(), new BettingAmount(1000))); - BettingManager bettingManager = new BettingManager(bettingAmounts); + BettingAmounts bettingManager = new BettingAmounts(bettingAmounts); CalculateProfit calculateProfit = new CalculateProfit(bettingManager); GameResultManager gameResultManager = new GameResultManager(calculateProfit, players, dealer); From 15e40189a1a588b088a07258a7a4999c9ebdefb9 Mon Sep 17 00:00:00 2001 From: xxbeann Date: Sun, 15 Mar 2026 05:08:17 +0900 Subject: [PATCH 29/44] =?UTF-8?q?docs:=20=EB=AC=B8=EC=84=9C=20=EC=88=98?= =?UTF-8?q?=EC=A0=95?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- README.md | 12 ++++++------ 1 file changed, 6 insertions(+), 6 deletions(-) diff --git a/README.md b/README.md index e3f1019622..3dba08911f 100644 --- a/README.md +++ b/README.md @@ -68,17 +68,17 @@ - [x] 딜러 카드 합이 **16 이하이면 카드 1장 추가** - [x] 딜러 카드 합이 **17 이상이면 카드 추가 불가** -- [ ] 플레이어가 추가로 카드를 뽑아 21을 초과할 경우(Burst될 경우) 배팅 금액을 모두 잃는다. -- [ ] 처음 두 장의 카드 합이 21일 경우 블랙잭이되면 베팅 금액의 1.5배를 딜러에게 받는다. -- [ ] 딜러와 플레이어가 모두 동시에 블랙잭인 경우 플레이어는 베팅한 금액을 돌려받는다. -- [ ] 딜러가 21을 초과하면 그 시점까지 남아있던 플레이어들은 승리해 베팅 금액을 받는다. +- [x] 플레이어가 추가로 카드를 뽑아 21을 초과할 경우(Burst될 경우) 배팅 금액을 모두 잃는다. +- [x] 처음 두 장의 카드 합이 21일 경우 블랙잭이되면 베팅 금액의 1.5배를 딜러에게 받는다. +- [x] 딜러와 플레이어가 모두 동시에 블랙잭인 경우 플레이어는 베팅한 금액을 돌려받는다. +- [x] 딜러가 21을 초과하면 그 시점까지 남아있던 플레이어들은 승리해 베팅 금액을 받는다. ### 3. 결과 집계 단계 - [x] 딜러 → 플레이어 순으로 카드와 점수를 출력한다 - [x] 각 참가자의 승패를 판정한다 -- [ ] 배팅 금액을 기준으로 **최종 수익을 계산한다** -- [ ] 참가자들의 최종 수익을 출력한다 +- [x] 배팅 금액을 기준으로 **최종 수익을 계산한다** +- [x] 참가자들의 최종 수익을 출력한다 ```shell ## 최종 수익 딜러: 10000 From 07a9709165d6e7722cb248d905a6e69c887cd455 Mon Sep 17 00:00:00 2001 From: xxbeann Date: Sun, 15 Mar 2026 06:06:40 +0900 Subject: [PATCH 30/44] chore: code formatting --- src/main/java/domain/game/GameManager.java | 10 ---------- 1 file changed, 10 deletions(-) diff --git a/src/main/java/domain/game/GameManager.java b/src/main/java/domain/game/GameManager.java index 40c115c786..7c705cd459 100644 --- a/src/main/java/domain/game/GameManager.java +++ b/src/main/java/domain/game/GameManager.java @@ -49,14 +49,4 @@ public void drawCardTo(Participant participant) { Card card = deck.drawCard(); participant.receiveCard(card); } - - //TODO: 나중에 getGameResult랑 judgeResult와 함께하는 클래스를 하나 만들어야 할듯 -// public Map getGameResult() { -// Map gameResult = new HashMap<>(); -// players.forEach(player -> { -// GameResult result = player.judgeResult(dealer); -// gameResult.put(player.getName().getName(), result); -// }); -// return gameResult; -// } } From 28c8d4924892b408050208e667c5e65be47c1dd7 Mon Sep 17 00:00:00 2001 From: xxbeann Date: Sun, 15 Mar 2026 06:08:41 +0900 Subject: [PATCH 31/44] chore: code formatting --- src/main/java/controller/BlackJackGameController.java | 6 ------ 1 file changed, 6 deletions(-) diff --git a/src/main/java/controller/BlackJackGameController.java b/src/main/java/controller/BlackJackGameController.java index daa680808a..2f4210cfcd 100644 --- a/src/main/java/controller/BlackJackGameController.java +++ b/src/main/java/controller/BlackJackGameController.java @@ -41,11 +41,8 @@ public void run() { CalculateProfit calculateProfit = new CalculateProfit(bettingAmounts); GameResultManager gameResultManager = new GameResultManager(calculateProfit, players, gameManager.getDealer()); - //TODO: 여기 아래 가 변경되어야 함. 지금 gameResuㅣㅅ - //Map gameResult = gameResultManager.getGameResult(); Map profits = gameResultManager.getParticipantsProfit(); List revenueDtos = toParticipantRevenueDtos(profits); - endGame(gameManager, players, revenueDtos); } @@ -69,8 +66,6 @@ private List toParticipantRevenueDtos(Map return revenueDtos; } - - private void playGame(Players players, GameManager gameManager) { players.forEach(player -> playGameWithPlayer(player, gameManager)); playGameWithDealer(gameManager); @@ -113,7 +108,6 @@ private void printParticipantCards(Dealer dealer, Players players) { private void endGame(GameManager gameManager, Players players, List participantRevenueDtos) { OutputView.printFinalCards(toParticipantCardsDto(gameManager.getDealer())); printFinalScores(players); - // OutputView.printGameResult(gameResult); OutputView.printParticipantRevenues(participantRevenueDtos); } From 0b3af1863f1055ce588cdc66bde6c4575c4ac193 Mon Sep 17 00:00:00 2001 From: xxbeann Date: Sun, 15 Mar 2026 14:54:50 +0900 Subject: [PATCH 32/44] =?UTF-8?q?chore:=20=EC=A3=BC=EC=84=9D=EC=A0=9C?= =?UTF-8?q?=EA=B1=B0=20=EB=B0=8F=20code=20formatting?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- src/main/java/domain/participant/Player.java | 18 +++++++++--------- src/main/java/view/OutputView.java | 1 - 2 files changed, 9 insertions(+), 10 deletions(-) diff --git a/src/main/java/domain/participant/Player.java b/src/main/java/domain/participant/Player.java index aae3594b00..77e2861174 100644 --- a/src/main/java/domain/participant/Player.java +++ b/src/main/java/domain/participant/Player.java @@ -17,24 +17,24 @@ public boolean isContinueGame() { } public GameResult judgeResult(Dealer dealer) { - if(this.isBlackJack() && dealer.isBlackJack()) { - return GameResult.DRAW; // TODO: 배팅 금액을 돌려 받는다 + if (this.isBlackJack() && dealer.isBlackJack()) { + return GameResult.DRAW; } - if(this.isBlackJack()) { - return GameResult.BLACKJACK; // TODO: 배팅 금액 1.5배 + if (this.isBlackJack()) { + return GameResult.BLACKJACK; } - if (this.isBust()) { // TODO: 배팅 금액을 모두 잃는다. + if (this.isBust()) { return GameResult.LOSE; } - if (dealer.isBust()) { // TODO: 배팅 금액을 받는다. + if (dealer.isBust()) { return GameResult.WIN; } if (this.getScore() > dealer.getScore()) { - return GameResult.WIN; // TODO: 배팅 금액을 받는다. + return GameResult.WIN; } if (this.getScore() < dealer.getScore()) { - return GameResult.LOSE; // TODO: 배팅 금액을 모두 잃는다. + return GameResult.LOSE; } - return GameResult.DRAW; // TODO: 배팅 금액을 돌려 받는다. + return GameResult.DRAW; } } diff --git a/src/main/java/view/OutputView.java b/src/main/java/view/OutputView.java index be4efcfad6..d6705bf96b 100644 --- a/src/main/java/view/OutputView.java +++ b/src/main/java/view/OutputView.java @@ -62,7 +62,6 @@ public static void printParticipantRevenues(List particip participantRevenueDto.name() + ": " + participantRevenueDto.revenue() ); } - } private static void printInitialPlayerCards(ParticipantCardsDto participantCardsDto) { From c29a3e55c00c83d1a28b23c992728bd7362f1dd2 Mon Sep 17 00:00:00 2001 From: xxbeann Date: Sun, 15 Mar 2026 14:58:30 +0900 Subject: [PATCH 33/44] chore: code formatting --- src/main/java/domain/card/Card.java | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/main/java/domain/card/Card.java b/src/main/java/domain/card/Card.java index e9637731ce..003936bb45 100644 --- a/src/main/java/domain/card/Card.java +++ b/src/main/java/domain/card/Card.java @@ -1 +1 @@ -package domain.card; public class Card { private final Shape shape; private final Number number; public Card(Shape shape, Number number) { this.shape = shape; this.number = number; } public int getScore() { return number.getValue(); } // TODO: DTO 책임 분리 public String getCardInfo() { return number.getDisplayName() + shape.getShape(); } public boolean isAce() { return this.number.equals(Number.ACE); } } \ No newline at end of file +package domain.card; public class Card { private final Shape shape; private final Number number; public Card(Shape shape, Number number) { this.shape = shape; this.number = number; } public int getScore() { return number.getValue(); } public String getCardInfo() { return number.getDisplayName() + shape.getShape(); } public boolean isAce() { return this.number.equals(Number.ACE); } } \ No newline at end of file From c3290424ac53330c13cace7f8f08d347000d6875 Mon Sep 17 00:00:00 2001 From: xxbeann Date: Sun, 15 Mar 2026 14:59:57 +0900 Subject: [PATCH 34/44] chore: code formatting --- src/main/java/domain/card/Card.java | 24 +++++++++++++++++++++++- 1 file changed, 23 insertions(+), 1 deletion(-) diff --git a/src/main/java/domain/card/Card.java b/src/main/java/domain/card/Card.java index 003936bb45..d5fc180c8f 100644 --- a/src/main/java/domain/card/Card.java +++ b/src/main/java/domain/card/Card.java @@ -1 +1,23 @@ -package domain.card; public class Card { private final Shape shape; private final Number number; public Card(Shape shape, Number number) { this.shape = shape; this.number = number; } public int getScore() { return number.getValue(); } public String getCardInfo() { return number.getDisplayName() + shape.getShape(); } public boolean isAce() { return this.number.equals(Number.ACE); } } \ No newline at end of file +package domain.card; + +public class Card { + private final Shape shape; + private final Number number; + + public Card(Shape shape, Number number) { + this.shape = shape; + this.number = number; + } + + public int getScore() { + return number.getValue(); + } + + public String getCardInfo() { + return number.getDisplayName() + shape.getShape(); + } + + public boolean isAce() { + return this.number.equals(Number.ACE); + } +} From 4efdb2fee57b753697d8bac6d5d1ff640ef109b9 Mon Sep 17 00:00:00 2001 From: xxbeann Date: Sun, 15 Mar 2026 15:03:55 +0900 Subject: [PATCH 35/44] chore: code formatting --- src/main/java/domain/card/Card.java | 1 + 1 file changed, 1 insertion(+) diff --git a/src/main/java/domain/card/Card.java b/src/main/java/domain/card/Card.java index d5fc180c8f..51d92324d5 100644 --- a/src/main/java/domain/card/Card.java +++ b/src/main/java/domain/card/Card.java @@ -9,6 +9,7 @@ public Card(Shape shape, Number number) { this.number = number; } + //ToDO: public int getScore() { return number.getValue(); } From 1a140c6487b69d8d95dfb96d8961a30df4f4a812 Mon Sep 17 00:00:00 2001 From: xxbeann Date: Sun, 15 Mar 2026 15:05:34 +0900 Subject: [PATCH 36/44] Normalize line endings to LF --- src/main/java/domain/card/Card.java | 1 - 1 file changed, 1 deletion(-) diff --git a/src/main/java/domain/card/Card.java b/src/main/java/domain/card/Card.java index 51d92324d5..d5fc180c8f 100644 --- a/src/main/java/domain/card/Card.java +++ b/src/main/java/domain/card/Card.java @@ -9,7 +9,6 @@ public Card(Shape shape, Number number) { this.number = number; } - //ToDO: public int getScore() { return number.getValue(); } From d0d21b384fc8c4989d0984f0c6a97a82e11478eb Mon Sep 17 00:00:00 2001 From: xxbeann Date: Sun, 15 Mar 2026 15:07:24 +0900 Subject: [PATCH 37/44] Normalize line endings to LF --- gradlew.bat | 188 ++++++++++++++++++++++++++-------------------------- 1 file changed, 94 insertions(+), 94 deletions(-) diff --git a/gradlew.bat b/gradlew.bat index 9b42019c79..9d21a21834 100644 --- a/gradlew.bat +++ b/gradlew.bat @@ -1,94 +1,94 @@ -@rem -@rem Copyright 2015 the original author or authors. -@rem -@rem Licensed under the Apache License, Version 2.0 (the "License"); -@rem you may not use this file except in compliance with the License. -@rem You may obtain a copy of the License at -@rem -@rem https://www.apache.org/licenses/LICENSE-2.0 -@rem -@rem Unless required by applicable law or agreed to in writing, software -@rem distributed under the License is distributed on an "AS IS" BASIS, -@rem WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. -@rem See the License for the specific language governing permissions and -@rem limitations under the License. -@rem -@rem SPDX-License-Identifier: Apache-2.0 -@rem - -@if "%DEBUG%"=="" @echo off -@rem ########################################################################## -@rem -@rem Gradle startup script for Windows -@rem -@rem ########################################################################## - -@rem Set local scope for the variables with windows NT shell -if "%OS%"=="Windows_NT" setlocal - -set DIRNAME=%~dp0 -if "%DIRNAME%"=="" set DIRNAME=. -@rem This is normally unused -set APP_BASE_NAME=%~n0 -set APP_HOME=%DIRNAME% - -@rem Resolve any "." and ".." in APP_HOME to make it shorter. -for %%i in ("%APP_HOME%") do set APP_HOME=%%~fi - -@rem Add default JVM options here. You can also use JAVA_OPTS and GRADLE_OPTS to pass JVM options to this script. -set DEFAULT_JVM_OPTS="-Xmx64m" "-Xms64m" - -@rem Find java.exe -if defined JAVA_HOME goto findJavaFromJavaHome - -set JAVA_EXE=java.exe -%JAVA_EXE% -version >NUL 2>&1 -if %ERRORLEVEL% equ 0 goto execute - -echo. 1>&2 -echo ERROR: JAVA_HOME is not set and no 'java' command could be found in your PATH. 1>&2 -echo. 1>&2 -echo Please set the JAVA_HOME variable in your environment to match the 1>&2 -echo location of your Java installation. 1>&2 - -goto fail - -:findJavaFromJavaHome -set JAVA_HOME=%JAVA_HOME:"=% -set JAVA_EXE=%JAVA_HOME%/bin/java.exe - -if exist "%JAVA_EXE%" goto execute - -echo. 1>&2 -echo ERROR: JAVA_HOME is set to an invalid directory: %JAVA_HOME% 1>&2 -echo. 1>&2 -echo Please set the JAVA_HOME variable in your environment to match the 1>&2 -echo location of your Java installation. 1>&2 - -goto fail - -:execute -@rem Setup the command line - -set CLASSPATH=%APP_HOME%\gradle\wrapper\gradle-wrapper.jar - - -@rem Execute Gradle -"%JAVA_EXE%" %DEFAULT_JVM_OPTS% %JAVA_OPTS% %GRADLE_OPTS% "-Dorg.gradle.appname=%APP_BASE_NAME%" -classpath "%CLASSPATH%" org.gradle.wrapper.GradleWrapperMain %* - -:end -@rem End local scope for the variables with windows NT shell -if %ERRORLEVEL% equ 0 goto mainEnd - -:fail -rem Set variable GRADLE_EXIT_CONSOLE if you need the _script_ return code instead of -rem the _cmd.exe /c_ return code! -set EXIT_CODE=%ERRORLEVEL% -if %EXIT_CODE% equ 0 set EXIT_CODE=1 -if not ""=="%GRADLE_EXIT_CONSOLE%" exit %EXIT_CODE% -exit /b %EXIT_CODE% - -:mainEnd -if "%OS%"=="Windows_NT" endlocal - -:omega +@rem +@rem Copyright 2015 the original author or authors. +@rem +@rem Licensed under the Apache License, Version 2.0 (the "License"); +@rem you may not use this file except in compliance with the License. +@rem You may obtain a copy of the License at +@rem +@rem https://www.apache.org/licenses/LICENSE-2.0 +@rem +@rem Unless required by applicable law or agreed to in writing, software +@rem distributed under the License is distributed on an "AS IS" BASIS, +@rem WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +@rem See the License for the specific language governing permissions and +@rem limitations under the License. +@rem +@rem SPDX-License-Identifier: Apache-2.0 +@rem + +@if "%DEBUG%"=="" @echo off +@rem ########################################################################## +@rem +@rem Gradle startup script for Windows +@rem +@rem ########################################################################## + +@rem Set local scope for the variables with windows NT shell +if "%OS%"=="Windows_NT" setlocal + +set DIRNAME=%~dp0 +if "%DIRNAME%"=="" set DIRNAME=. +@rem This is normally unused +set APP_BASE_NAME=%~n0 +set APP_HOME=%DIRNAME% + +@rem Resolve any "." and ".." in APP_HOME to make it shorter. +for %%i in ("%APP_HOME%") do set APP_HOME=%%~fi + +@rem Add default JVM options here. You can also use JAVA_OPTS and GRADLE_OPTS to pass JVM options to this script. +set DEFAULT_JVM_OPTS="-Xmx64m" "-Xms64m" + +@rem Find java.exe +if defined JAVA_HOME goto findJavaFromJavaHome + +set JAVA_EXE=java.exe +%JAVA_EXE% -version >NUL 2>&1 +if %ERRORLEVEL% equ 0 goto execute + +echo. 1>&2 +echo ERROR: JAVA_HOME is not set and no 'java' command could be found in your PATH. 1>&2 +echo. 1>&2 +echo Please set the JAVA_HOME variable in your environment to match the 1>&2 +echo location of your Java installation. 1>&2 + +goto fail + +:findJavaFromJavaHome +set JAVA_HOME=%JAVA_HOME:"=% +set JAVA_EXE=%JAVA_HOME%/bin/java.exe + +if exist "%JAVA_EXE%" goto execute + +echo. 1>&2 +echo ERROR: JAVA_HOME is set to an invalid directory: %JAVA_HOME% 1>&2 +echo. 1>&2 +echo Please set the JAVA_HOME variable in your environment to match the 1>&2 +echo location of your Java installation. 1>&2 + +goto fail + +:execute +@rem Setup the command line + +set CLASSPATH=%APP_HOME%\gradle\wrapper\gradle-wrapper.jar + + +@rem Execute Gradle +"%JAVA_EXE%" %DEFAULT_JVM_OPTS% %JAVA_OPTS% %GRADLE_OPTS% "-Dorg.gradle.appname=%APP_BASE_NAME%" -classpath "%CLASSPATH%" org.gradle.wrapper.GradleWrapperMain %* + +:end +@rem End local scope for the variables with windows NT shell +if %ERRORLEVEL% equ 0 goto mainEnd + +:fail +rem Set variable GRADLE_EXIT_CONSOLE if you need the _script_ return code instead of +rem the _cmd.exe /c_ return code! +set EXIT_CODE=%ERRORLEVEL% +if %EXIT_CODE% equ 0 set EXIT_CODE=1 +if not ""=="%GRADLE_EXIT_CONSOLE%" exit %EXIT_CODE% +exit /b %EXIT_CODE% + +:mainEnd +if "%OS%"=="Windows_NT" endlocal + +:omega From 80af55c95e74bbb8ce3d82707f226d693d4c7dc6 Mon Sep 17 00:00:00 2001 From: xxbeann Date: Sun, 15 Mar 2026 15:08:36 +0900 Subject: [PATCH 38/44] refactor: change class name --- .gitattributes | 1 + src/main/java/domain/card/Cards.java | 24 +++--- src/main/java/domain/card/Deck.java | 14 ++-- .../java/domain/card/{Card.java => Help.java} | 4 +- src/main/java/domain/game/GameManager.java | 6 +- .../java/domain/participant/Participant.java | 6 +- .../domain/participant/ParticipantCards.java | 8 +- .../domain/game/GameResultManagerTest.java | 14 ++-- .../java/domain/participant/DealerTest.java | 10 +-- .../participant/ParticipantCardsTest.java | 22 ++--- .../java/domain/participant/PlayerTest.java | 82 +++++++++---------- 11 files changed, 96 insertions(+), 95 deletions(-) create mode 100644 .gitattributes rename src/main/java/domain/card/{Card.java => Help.java} (85%) diff --git a/.gitattributes b/.gitattributes new file mode 100644 index 0000000000..6313b56c57 --- /dev/null +++ b/.gitattributes @@ -0,0 +1 @@ +* text=auto eol=lf diff --git a/src/main/java/domain/card/Cards.java b/src/main/java/domain/card/Cards.java index be6a94cb88..c011e79773 100644 --- a/src/main/java/domain/card/Cards.java +++ b/src/main/java/domain/card/Cards.java @@ -4,35 +4,35 @@ import java.util.List; public class Cards { - private final List cards; + private final List helps; - public Cards(List cards) { - this.cards = new ArrayList<>(cards); + public Cards(List helps) { + this.helps = new ArrayList<>(helps); } public int getSize() { - return cards.size(); + return helps.size(); } public List getCardsInfo() { - return cards.stream() - .map(Card::getCardInfo) + return helps.stream() + .map(Help::getCardInfo) .toList(); } - public Card removeFirst() { - return cards.removeFirst(); + public Help removeFirst() { + return helps.removeFirst(); } public int sumScore() { int sum = 0; - for (Card card : cards) { - sum += card.getScore(); + for (Help help : helps) { + sum += help.getScore(); } return sum; } - public void add(Card card) { - cards.add(card); + public void add(Help help) { + helps.add(help); } } diff --git a/src/main/java/domain/card/Deck.java b/src/main/java/domain/card/Deck.java index ee49ce2ae1..db53f90dbb 100644 --- a/src/main/java/domain/card/Deck.java +++ b/src/main/java/domain/card/Deck.java @@ -11,10 +11,10 @@ public Deck() { this.cards = createDeck(); } - public Card drawCard() { + public Help drawCard() { validateDeckSize(); - Card card = cards.removeFirst(); - return card; + Help help = cards.removeFirst(); + return help; } private void validateDeckSize() { @@ -24,13 +24,13 @@ private void validateDeckSize() { } private Cards createDeck() { - List cards = new ArrayList<>(); + List helps = new ArrayList<>(); for (Shape shape : Shape.values()) { for (Number number : Number.values()) { - cards.add(new Card(shape, number)); + helps.add(new Help(shape, number)); } } - Collections.shuffle(cards); - return new Cards(cards); + Collections.shuffle(helps); + return new Cards(helps); } } diff --git a/src/main/java/domain/card/Card.java b/src/main/java/domain/card/Help.java similarity index 85% rename from src/main/java/domain/card/Card.java rename to src/main/java/domain/card/Help.java index d5fc180c8f..7ca98e7127 100644 --- a/src/main/java/domain/card/Card.java +++ b/src/main/java/domain/card/Help.java @@ -1,10 +1,10 @@ package domain.card; -public class Card { +public class Help { private final Shape shape; private final Number number; - public Card(Shape shape, Number number) { + public Help(Shape shape, Number number) { this.shape = shape; this.number = number; } diff --git a/src/main/java/domain/game/GameManager.java b/src/main/java/domain/game/GameManager.java index 7c705cd459..572ad2019e 100644 --- a/src/main/java/domain/game/GameManager.java +++ b/src/main/java/domain/game/GameManager.java @@ -1,6 +1,6 @@ package domain.game; -import domain.card.Card; +import domain.card.Help; import domain.participant.Dealer; import domain.card.Deck; import domain.participant.Participant; @@ -46,7 +46,7 @@ private void distributeInitialCards(Participant participant) { } public void drawCardTo(Participant participant) { - Card card = deck.drawCard(); - participant.receiveCard(card); + Help help = deck.drawCard(); + participant.receiveCard(help); } } diff --git a/src/main/java/domain/participant/Participant.java b/src/main/java/domain/participant/Participant.java index 6ec3ea50df..eea222b88c 100644 --- a/src/main/java/domain/participant/Participant.java +++ b/src/main/java/domain/participant/Participant.java @@ -1,6 +1,6 @@ package domain.participant; -import domain.card.Card; +import domain.card.Help; import domain.card.Cards; import java.util.ArrayList; import java.util.List; @@ -15,8 +15,8 @@ public Participant(Name name) { participantCards = new ParticipantCards(new Cards(new ArrayList<>())); } - public void receiveCard(Card card) { - participantCards.addCard(card); + public void receiveCard(Help help) { + participantCards.addCard(help); } public abstract boolean isContinueGame(); diff --git a/src/main/java/domain/participant/ParticipantCards.java b/src/main/java/domain/participant/ParticipantCards.java index 6e41495948..a6b9b3e041 100644 --- a/src/main/java/domain/participant/ParticipantCards.java +++ b/src/main/java/domain/participant/ParticipantCards.java @@ -1,6 +1,6 @@ package domain.participant; -import domain.card.Card; +import domain.card.Help; import domain.card.Cards; import java.util.List; @@ -27,11 +27,11 @@ public int calculateScore() { return sum; } - public void addCard(Card card) { - if (card.isAce()) { + public void addCard(Help help) { + if (help.isAce()) { changeAvailableAceCount += 1; } - cards.add(card); + cards.add(help); } public int getCardSize() { diff --git a/src/test/java/domain/game/GameResultManagerTest.java b/src/test/java/domain/game/GameResultManagerTest.java index 1f4d0f3cd0..5a44dd20f8 100644 --- a/src/test/java/domain/game/GameResultManagerTest.java +++ b/src/test/java/domain/game/GameResultManagerTest.java @@ -5,7 +5,7 @@ import domain.betting.BettingAmount; import domain.betting.BettingAmounts; import domain.betting.CalculateProfit; -import domain.card.Card; +import domain.card.Help; import domain.card.Number; import domain.card.Shape; import domain.participant.Dealer; @@ -26,14 +26,14 @@ class GameResultManagerTest { GameManager gameManager = new GameManager(players); Dealer dealer = gameManager.getDealer(); - dealer.receiveCard(new Card(Shape.SPADE, domain.card.Number.TEN)); - dealer.receiveCard(new Card(Shape.HEART, domain.card.Number.EIGHT)); + dealer.receiveCard(new Help(Shape.SPADE, domain.card.Number.TEN)); + dealer.receiveCard(new Help(Shape.HEART, domain.card.Number.EIGHT)); - pobi.receiveCard(new Card(Shape.DIAMOND, domain.card.Number.TEN)); - pobi.receiveCard(new Card(Shape.CLUB, domain.card.Number.TEN)); + pobi.receiveCard(new Help(Shape.DIAMOND, domain.card.Number.TEN)); + pobi.receiveCard(new Help(Shape.CLUB, domain.card.Number.TEN)); - crong.receiveCard(new Card(Shape.SPADE, domain.card.Number.NINE)); - crong.receiveCard(new Card(Shape.HEART, Number.SEVEN)); + crong.receiveCard(new Help(Shape.SPADE, domain.card.Number.NINE)); + crong.receiveCard(new Help(Shape.HEART, Number.SEVEN)); Map bettingAmounts = new HashMap<>(); players.forEach(player -> bettingAmounts.put(player.getName(), new BettingAmount(1000))); diff --git a/src/test/java/domain/participant/DealerTest.java b/src/test/java/domain/participant/DealerTest.java index 7bb9b7c0e0..60cf03b875 100644 --- a/src/test/java/domain/participant/DealerTest.java +++ b/src/test/java/domain/participant/DealerTest.java @@ -2,7 +2,7 @@ import static org.junit.jupiter.api.Assertions.*; -import domain.card.Card; +import domain.card.Help; import domain.card.Number; import domain.card.Shape; import org.junit.jupiter.api.Test; @@ -12,8 +12,8 @@ class DealerTest { @Test void 점수가_16점_이하이면_카드를_추가로_받을_수_있다() { Dealer dealer = new Dealer(); - dealer.receiveCard(new Card(Shape.SPADE, domain.card.Number.TEN)); - dealer.receiveCard(new Card(Shape.HEART, domain.card.Number.SIX)); + dealer.receiveCard(new Help(Shape.SPADE, domain.card.Number.TEN)); + dealer.receiveCard(new Help(Shape.HEART, domain.card.Number.SIX)); boolean result = dealer.isContinueGame(); assertEquals(true, result); @@ -22,8 +22,8 @@ class DealerTest { @Test void 점수가_17점_이상이면_카드를_추가로_받을_수_없다() { Dealer dealer = new Dealer(); - dealer.receiveCard(new Card(Shape.SPADE, domain.card.Number.TEN)); - dealer.receiveCard(new Card(Shape.HEART, Number.SEVEN)); + dealer.receiveCard(new Help(Shape.SPADE, domain.card.Number.TEN)); + dealer.receiveCard(new Help(Shape.HEART, Number.SEVEN)); boolean result = dealer.isContinueGame(); assertEquals(false, result); diff --git a/src/test/java/domain/participant/ParticipantCardsTest.java b/src/test/java/domain/participant/ParticipantCardsTest.java index 3d0448d799..0f24c18900 100644 --- a/src/test/java/domain/participant/ParticipantCardsTest.java +++ b/src/test/java/domain/participant/ParticipantCardsTest.java @@ -2,7 +2,7 @@ import static org.junit.jupiter.api.Assertions.*; -import domain.card.Card; +import domain.card.Help; import domain.card.Cards; import domain.card.Number; import domain.card.Shape; @@ -13,28 +13,28 @@ class ParticipantCardsTest { @Test void 에이스가_없으면_카드_숫자의_합을_반환한다() { - Card card1 = new Card(Shape.SPADE, domain.card.Number.EIGHT); - Card card2 = new Card(Shape.HEART, domain.card.Number.EIGHT); + Help help1 = new Help(Shape.SPADE, domain.card.Number.EIGHT); + Help help2 = new Help(Shape.HEART, domain.card.Number.EIGHT); ParticipantCards testParticipantCards = new ParticipantCards(new Cards(new ArrayList<>())); - testParticipantCards.addCard(card1); - testParticipantCards.addCard(card2); + testParticipantCards.addCard(help1); + testParticipantCards.addCard(help2); assertEquals(16, testParticipantCards.calculateScore()); } @Test void 에이스가_있으면_상황에_맞는_최대_합을_반환한다() { - Card card1 = new Card(Shape.SPADE, domain.card.Number.ACE); - Card card2 = new Card(Shape.HEART, domain.card.Number.FIVE); - Card card3 = new Card(Shape.CLUB, Number.EIGHT); + Help help1 = new Help(Shape.SPADE, domain.card.Number.ACE); + Help help2 = new Help(Shape.HEART, domain.card.Number.FIVE); + Help help3 = new Help(Shape.CLUB, Number.EIGHT); ParticipantCards testParticipantCards = new ParticipantCards(new Cards(new ArrayList<>())); - testParticipantCards.addCard(card1); - testParticipantCards.addCard(card2); - testParticipantCards.addCard(card3); + testParticipantCards.addCard(help1); + testParticipantCards.addCard(help2); + testParticipantCards.addCard(help3); assertEquals(14, testParticipantCards.calculateScore()); } diff --git a/src/test/java/domain/participant/PlayerTest.java b/src/test/java/domain/participant/PlayerTest.java index f52ffd3aca..32cadbfbec 100644 --- a/src/test/java/domain/participant/PlayerTest.java +++ b/src/test/java/domain/participant/PlayerTest.java @@ -2,7 +2,7 @@ import static org.junit.jupiter.api.Assertions.*; -import domain.card.Card; +import domain.card.Help; import domain.card.Number; import domain.card.Shape; import domain.game.GameResult; @@ -13,9 +13,9 @@ class PlayerTest { @Test void 점수가_21점을_초과하면_버스트이다() { Player player = new Player(new Name("pobi")); - player.receiveCard(new Card(Shape.SPADE, domain.card.Number.TEN)); - player.receiveCard(new Card(Shape.HEART, domain.card.Number.JACK)); - player.receiveCard(new Card(Shape.DIAMOND, domain.card.Number.TWO)); + player.receiveCard(new Help(Shape.SPADE, domain.card.Number.TEN)); + player.receiveCard(new Help(Shape.HEART, domain.card.Number.JACK)); + player.receiveCard(new Help(Shape.DIAMOND, domain.card.Number.TWO)); boolean result = player.isBust(); @@ -25,9 +25,9 @@ class PlayerTest { @Test void 점수가_21점이면_버스트가_아니다() { Player player = new Player(new Name("pobi")); - player.receiveCard(new Card(Shape.SPADE, domain.card.Number.NINE)); - player.receiveCard(new Card(Shape.HEART, domain.card.Number.JACK)); - player.receiveCard(new Card(Shape.DIAMOND, domain.card.Number.TWO)); + player.receiveCard(new Help(Shape.SPADE, domain.card.Number.NINE)); + player.receiveCard(new Help(Shape.HEART, domain.card.Number.JACK)); + player.receiveCard(new Help(Shape.DIAMOND, domain.card.Number.TWO)); boolean result = player.isBust(); @@ -37,8 +37,8 @@ class PlayerTest { @Test void 에이스와_10점카드를_받으면_블랙잭이다() { Player player = new Player(new Name("pobi")); - player.receiveCard(new Card(Shape.SPADE, domain.card.Number.ACE)); - player.receiveCard(new Card(Shape.HEART, domain.card.Number.JACK)); + player.receiveCard(new Help(Shape.SPADE, domain.card.Number.ACE)); + player.receiveCard(new Help(Shape.HEART, domain.card.Number.JACK)); boolean result = player.isBlackJack(); @@ -48,8 +48,8 @@ class PlayerTest { @Test void 두장의_합이_21이아니면_블랙잭이_아니다() { Player player = new Player(new Name("pobi")); - player.receiveCard(new Card(Shape.SPADE, domain.card.Number.JACK)); - player.receiveCard(new Card(Shape.HEART, domain.card.Number.JACK)); + player.receiveCard(new Help(Shape.SPADE, domain.card.Number.JACK)); + player.receiveCard(new Help(Shape.HEART, domain.card.Number.JACK)); boolean result = player.isBlackJack(); @@ -59,9 +59,9 @@ class PlayerTest { @Test void 세장의_합이_21이어도_블랙잭이_아니다() { Player player = new Player(new Name("pobi")); - player.receiveCard(new Card(Shape.SPADE, domain.card.Number.EIGHT)); - player.receiveCard(new Card(Shape.HEART, domain.card.Number.JACK)); - player.receiveCard(new Card(Shape.HEART, domain.card.Number.THREE)); + player.receiveCard(new Help(Shape.SPADE, domain.card.Number.EIGHT)); + player.receiveCard(new Help(Shape.HEART, domain.card.Number.JACK)); + player.receiveCard(new Help(Shape.HEART, domain.card.Number.THREE)); boolean result = player.isBlackJack(); @@ -71,9 +71,9 @@ class PlayerTest { @Test void 점수가_21점_미만이면_카드를_추가로_받을_수_있다() { Player player = new Player(new Name("pobi")); - player.receiveCard(new Card(Shape.SPADE, domain.card.Number.EIGHT)); - player.receiveCard(new Card(Shape.HEART, domain.card.Number.JACK)); - player.receiveCard(new Card(Shape.DIAMOND, domain.card.Number.TWO)); + player.receiveCard(new Help(Shape.SPADE, domain.card.Number.EIGHT)); + player.receiveCard(new Help(Shape.HEART, domain.card.Number.JACK)); + player.receiveCard(new Help(Shape.DIAMOND, domain.card.Number.TWO)); boolean result = player.isContinueGame(); @@ -83,9 +83,9 @@ class PlayerTest { @Test void 점수가_21점_이상이면_카드를_추가로_받을_수_없다() { Player player = new Player(new Name("pobi")); - player.receiveCard(new Card(Shape.SPADE, domain.card.Number.NINE)); - player.receiveCard(new Card(Shape.HEART, domain.card.Number.JACK)); - player.receiveCard(new Card(Shape.DIAMOND, domain.card.Number.TWO)); + player.receiveCard(new Help(Shape.SPADE, domain.card.Number.NINE)); + player.receiveCard(new Help(Shape.HEART, domain.card.Number.JACK)); + player.receiveCard(new Help(Shape.DIAMOND, domain.card.Number.TWO)); boolean result = player.isContinueGame(); @@ -97,11 +97,11 @@ class PlayerTest { Player player = new Player(new Name("pobi")); Dealer dealer = new Dealer(); - player.receiveCard(new Card(Shape.SPADE, domain.card.Number.TEN)); - player.receiveCard(new Card(Shape.HEART, domain.card.Number.JACK)); + player.receiveCard(new Help(Shape.SPADE, domain.card.Number.TEN)); + player.receiveCard(new Help(Shape.HEART, domain.card.Number.JACK)); - dealer.receiveCard(new Card(Shape.DIAMOND, domain.card.Number.TEN)); - dealer.receiveCard(new Card(Shape.CLUB, domain.card.Number.EIGHT)); + dealer.receiveCard(new Help(Shape.DIAMOND, domain.card.Number.TEN)); + dealer.receiveCard(new Help(Shape.CLUB, domain.card.Number.EIGHT)); GameResult result = player.judgeResult(dealer); @@ -113,11 +113,11 @@ class PlayerTest { Player player = new Player(new Name("pobi")); Dealer dealer = new Dealer(); - player.receiveCard(new Card(Shape.SPADE, domain.card.Number.TEN)); - player.receiveCard(new Card(Shape.HEART, domain.card.Number.JACK)); + player.receiveCard(new Help(Shape.SPADE, domain.card.Number.TEN)); + player.receiveCard(new Help(Shape.HEART, domain.card.Number.JACK)); - dealer.receiveCard(new Card(Shape.DIAMOND, domain.card.Number.TEN)); - dealer.receiveCard(new Card(Shape.CLUB, domain.card.Number.JACK)); + dealer.receiveCard(new Help(Shape.DIAMOND, domain.card.Number.TEN)); + dealer.receiveCard(new Help(Shape.CLUB, domain.card.Number.JACK)); GameResult result = player.judgeResult(dealer); @@ -129,10 +129,10 @@ class PlayerTest { Player player = new Player(new Name("pobi")); Dealer dealer = new Dealer(); - player.receiveCard(new Card(Shape.SPADE, domain.card.Number.TEN)); + player.receiveCard(new Help(Shape.SPADE, domain.card.Number.TEN)); - dealer.receiveCard(new Card(Shape.DIAMOND, domain.card.Number.TEN)); - dealer.receiveCard(new Card(Shape.CLUB, domain.card.Number.JACK)); + dealer.receiveCard(new Help(Shape.DIAMOND, domain.card.Number.TEN)); + dealer.receiveCard(new Help(Shape.CLUB, domain.card.Number.JACK)); GameResult result = player.judgeResult(dealer); @@ -144,12 +144,12 @@ class PlayerTest { Player player = new Player(new Name("pobi")); Dealer dealer = new Dealer(); - player.receiveCard(new Card(Shape.SPADE, domain.card.Number.TWO)); - player.receiveCard(new Card(Shape.HEART, domain.card.Number.JACK)); - player.receiveCard(new Card(Shape.CLUB, domain.card.Number.JACK)); + player.receiveCard(new Help(Shape.SPADE, domain.card.Number.TWO)); + player.receiveCard(new Help(Shape.HEART, domain.card.Number.JACK)); + player.receiveCard(new Help(Shape.CLUB, domain.card.Number.JACK)); - dealer.receiveCard(new Card(Shape.DIAMOND, domain.card.Number.TEN)); - dealer.receiveCard(new Card(Shape.CLUB, domain.card.Number.EIGHT)); + dealer.receiveCard(new Help(Shape.DIAMOND, domain.card.Number.TEN)); + dealer.receiveCard(new Help(Shape.CLUB, domain.card.Number.EIGHT)); GameResult result = player.judgeResult(dealer); @@ -161,12 +161,12 @@ class PlayerTest { Player player = new Player(new Name("pobi")); Dealer dealer = new Dealer(); - player.receiveCard(new Card(Shape.SPADE, domain.card.Number.TEN)); - player.receiveCard(new Card(Shape.HEART, domain.card.Number.JACK)); + player.receiveCard(new Help(Shape.SPADE, domain.card.Number.TEN)); + player.receiveCard(new Help(Shape.HEART, domain.card.Number.JACK)); - dealer.receiveCard(new Card(Shape.DIAMOND, domain.card.Number.TEN)); - dealer.receiveCard(new Card(Shape.CLUB, domain.card.Number.TWO)); - dealer.receiveCard(new Card(Shape.HEART, Number.TEN)); + dealer.receiveCard(new Help(Shape.DIAMOND, domain.card.Number.TEN)); + dealer.receiveCard(new Help(Shape.CLUB, domain.card.Number.TWO)); + dealer.receiveCard(new Help(Shape.HEART, Number.TEN)); GameResult result = player.judgeResult(dealer); From c8dbf816946d9f9a1c45107d8239ef5d38f20a27 Mon Sep 17 00:00:00 2001 From: xxbeann Date: Sun, 15 Mar 2026 15:11:16 +0900 Subject: [PATCH 39/44] refactor: chaneg clas name --- .../java/domain/card/{Help.java => Card.java} | 4 +- src/main/java/domain/card/Cards.java | 24 +++--- src/main/java/domain/card/Deck.java | 14 ++-- src/main/java/domain/game/GameManager.java | 6 +- .../java/domain/participant/Participant.java | 6 +- .../domain/participant/ParticipantCards.java | 8 +- .../domain/game/GameResultManagerTest.java | 14 ++-- .../java/domain/participant/DealerTest.java | 10 +-- .../participant/ParticipantCardsTest.java | 22 ++--- .../java/domain/participant/PlayerTest.java | 82 +++++++++---------- 10 files changed, 95 insertions(+), 95 deletions(-) rename src/main/java/domain/card/{Help.java => Card.java} (85%) diff --git a/src/main/java/domain/card/Help.java b/src/main/java/domain/card/Card.java similarity index 85% rename from src/main/java/domain/card/Help.java rename to src/main/java/domain/card/Card.java index 7ca98e7127..d5fc180c8f 100644 --- a/src/main/java/domain/card/Help.java +++ b/src/main/java/domain/card/Card.java @@ -1,10 +1,10 @@ package domain.card; -public class Help { +public class Card { private final Shape shape; private final Number number; - public Help(Shape shape, Number number) { + public Card(Shape shape, Number number) { this.shape = shape; this.number = number; } diff --git a/src/main/java/domain/card/Cards.java b/src/main/java/domain/card/Cards.java index c011e79773..be6a94cb88 100644 --- a/src/main/java/domain/card/Cards.java +++ b/src/main/java/domain/card/Cards.java @@ -4,35 +4,35 @@ import java.util.List; public class Cards { - private final List helps; + private final List cards; - public Cards(List helps) { - this.helps = new ArrayList<>(helps); + public Cards(List cards) { + this.cards = new ArrayList<>(cards); } public int getSize() { - return helps.size(); + return cards.size(); } public List getCardsInfo() { - return helps.stream() - .map(Help::getCardInfo) + return cards.stream() + .map(Card::getCardInfo) .toList(); } - public Help removeFirst() { - return helps.removeFirst(); + public Card removeFirst() { + return cards.removeFirst(); } public int sumScore() { int sum = 0; - for (Help help : helps) { - sum += help.getScore(); + for (Card card : cards) { + sum += card.getScore(); } return sum; } - public void add(Help help) { - helps.add(help); + public void add(Card card) { + cards.add(card); } } diff --git a/src/main/java/domain/card/Deck.java b/src/main/java/domain/card/Deck.java index db53f90dbb..ee49ce2ae1 100644 --- a/src/main/java/domain/card/Deck.java +++ b/src/main/java/domain/card/Deck.java @@ -11,10 +11,10 @@ public Deck() { this.cards = createDeck(); } - public Help drawCard() { + public Card drawCard() { validateDeckSize(); - Help help = cards.removeFirst(); - return help; + Card card = cards.removeFirst(); + return card; } private void validateDeckSize() { @@ -24,13 +24,13 @@ private void validateDeckSize() { } private Cards createDeck() { - List helps = new ArrayList<>(); + List cards = new ArrayList<>(); for (Shape shape : Shape.values()) { for (Number number : Number.values()) { - helps.add(new Help(shape, number)); + cards.add(new Card(shape, number)); } } - Collections.shuffle(helps); - return new Cards(helps); + Collections.shuffle(cards); + return new Cards(cards); } } diff --git a/src/main/java/domain/game/GameManager.java b/src/main/java/domain/game/GameManager.java index 572ad2019e..7c705cd459 100644 --- a/src/main/java/domain/game/GameManager.java +++ b/src/main/java/domain/game/GameManager.java @@ -1,6 +1,6 @@ package domain.game; -import domain.card.Help; +import domain.card.Card; import domain.participant.Dealer; import domain.card.Deck; import domain.participant.Participant; @@ -46,7 +46,7 @@ private void distributeInitialCards(Participant participant) { } public void drawCardTo(Participant participant) { - Help help = deck.drawCard(); - participant.receiveCard(help); + Card card = deck.drawCard(); + participant.receiveCard(card); } } diff --git a/src/main/java/domain/participant/Participant.java b/src/main/java/domain/participant/Participant.java index eea222b88c..6ec3ea50df 100644 --- a/src/main/java/domain/participant/Participant.java +++ b/src/main/java/domain/participant/Participant.java @@ -1,6 +1,6 @@ package domain.participant; -import domain.card.Help; +import domain.card.Card; import domain.card.Cards; import java.util.ArrayList; import java.util.List; @@ -15,8 +15,8 @@ public Participant(Name name) { participantCards = new ParticipantCards(new Cards(new ArrayList<>())); } - public void receiveCard(Help help) { - participantCards.addCard(help); + public void receiveCard(Card card) { + participantCards.addCard(card); } public abstract boolean isContinueGame(); diff --git a/src/main/java/domain/participant/ParticipantCards.java b/src/main/java/domain/participant/ParticipantCards.java index a6b9b3e041..6e41495948 100644 --- a/src/main/java/domain/participant/ParticipantCards.java +++ b/src/main/java/domain/participant/ParticipantCards.java @@ -1,6 +1,6 @@ package domain.participant; -import domain.card.Help; +import domain.card.Card; import domain.card.Cards; import java.util.List; @@ -27,11 +27,11 @@ public int calculateScore() { return sum; } - public void addCard(Help help) { - if (help.isAce()) { + public void addCard(Card card) { + if (card.isAce()) { changeAvailableAceCount += 1; } - cards.add(help); + cards.add(card); } public int getCardSize() { diff --git a/src/test/java/domain/game/GameResultManagerTest.java b/src/test/java/domain/game/GameResultManagerTest.java index 5a44dd20f8..1f4d0f3cd0 100644 --- a/src/test/java/domain/game/GameResultManagerTest.java +++ b/src/test/java/domain/game/GameResultManagerTest.java @@ -5,7 +5,7 @@ import domain.betting.BettingAmount; import domain.betting.BettingAmounts; import domain.betting.CalculateProfit; -import domain.card.Help; +import domain.card.Card; import domain.card.Number; import domain.card.Shape; import domain.participant.Dealer; @@ -26,14 +26,14 @@ class GameResultManagerTest { GameManager gameManager = new GameManager(players); Dealer dealer = gameManager.getDealer(); - dealer.receiveCard(new Help(Shape.SPADE, domain.card.Number.TEN)); - dealer.receiveCard(new Help(Shape.HEART, domain.card.Number.EIGHT)); + dealer.receiveCard(new Card(Shape.SPADE, domain.card.Number.TEN)); + dealer.receiveCard(new Card(Shape.HEART, domain.card.Number.EIGHT)); - pobi.receiveCard(new Help(Shape.DIAMOND, domain.card.Number.TEN)); - pobi.receiveCard(new Help(Shape.CLUB, domain.card.Number.TEN)); + pobi.receiveCard(new Card(Shape.DIAMOND, domain.card.Number.TEN)); + pobi.receiveCard(new Card(Shape.CLUB, domain.card.Number.TEN)); - crong.receiveCard(new Help(Shape.SPADE, domain.card.Number.NINE)); - crong.receiveCard(new Help(Shape.HEART, Number.SEVEN)); + crong.receiveCard(new Card(Shape.SPADE, domain.card.Number.NINE)); + crong.receiveCard(new Card(Shape.HEART, Number.SEVEN)); Map bettingAmounts = new HashMap<>(); players.forEach(player -> bettingAmounts.put(player.getName(), new BettingAmount(1000))); diff --git a/src/test/java/domain/participant/DealerTest.java b/src/test/java/domain/participant/DealerTest.java index 60cf03b875..7bb9b7c0e0 100644 --- a/src/test/java/domain/participant/DealerTest.java +++ b/src/test/java/domain/participant/DealerTest.java @@ -2,7 +2,7 @@ import static org.junit.jupiter.api.Assertions.*; -import domain.card.Help; +import domain.card.Card; import domain.card.Number; import domain.card.Shape; import org.junit.jupiter.api.Test; @@ -12,8 +12,8 @@ class DealerTest { @Test void 점수가_16점_이하이면_카드를_추가로_받을_수_있다() { Dealer dealer = new Dealer(); - dealer.receiveCard(new Help(Shape.SPADE, domain.card.Number.TEN)); - dealer.receiveCard(new Help(Shape.HEART, domain.card.Number.SIX)); + dealer.receiveCard(new Card(Shape.SPADE, domain.card.Number.TEN)); + dealer.receiveCard(new Card(Shape.HEART, domain.card.Number.SIX)); boolean result = dealer.isContinueGame(); assertEquals(true, result); @@ -22,8 +22,8 @@ class DealerTest { @Test void 점수가_17점_이상이면_카드를_추가로_받을_수_없다() { Dealer dealer = new Dealer(); - dealer.receiveCard(new Help(Shape.SPADE, domain.card.Number.TEN)); - dealer.receiveCard(new Help(Shape.HEART, Number.SEVEN)); + dealer.receiveCard(new Card(Shape.SPADE, domain.card.Number.TEN)); + dealer.receiveCard(new Card(Shape.HEART, Number.SEVEN)); boolean result = dealer.isContinueGame(); assertEquals(false, result); diff --git a/src/test/java/domain/participant/ParticipantCardsTest.java b/src/test/java/domain/participant/ParticipantCardsTest.java index 0f24c18900..3d0448d799 100644 --- a/src/test/java/domain/participant/ParticipantCardsTest.java +++ b/src/test/java/domain/participant/ParticipantCardsTest.java @@ -2,7 +2,7 @@ import static org.junit.jupiter.api.Assertions.*; -import domain.card.Help; +import domain.card.Card; import domain.card.Cards; import domain.card.Number; import domain.card.Shape; @@ -13,28 +13,28 @@ class ParticipantCardsTest { @Test void 에이스가_없으면_카드_숫자의_합을_반환한다() { - Help help1 = new Help(Shape.SPADE, domain.card.Number.EIGHT); - Help help2 = new Help(Shape.HEART, domain.card.Number.EIGHT); + Card card1 = new Card(Shape.SPADE, domain.card.Number.EIGHT); + Card card2 = new Card(Shape.HEART, domain.card.Number.EIGHT); ParticipantCards testParticipantCards = new ParticipantCards(new Cards(new ArrayList<>())); - testParticipantCards.addCard(help1); - testParticipantCards.addCard(help2); + testParticipantCards.addCard(card1); + testParticipantCards.addCard(card2); assertEquals(16, testParticipantCards.calculateScore()); } @Test void 에이스가_있으면_상황에_맞는_최대_합을_반환한다() { - Help help1 = new Help(Shape.SPADE, domain.card.Number.ACE); - Help help2 = new Help(Shape.HEART, domain.card.Number.FIVE); - Help help3 = new Help(Shape.CLUB, Number.EIGHT); + Card card1 = new Card(Shape.SPADE, domain.card.Number.ACE); + Card card2 = new Card(Shape.HEART, domain.card.Number.FIVE); + Card card3 = new Card(Shape.CLUB, Number.EIGHT); ParticipantCards testParticipantCards = new ParticipantCards(new Cards(new ArrayList<>())); - testParticipantCards.addCard(help1); - testParticipantCards.addCard(help2); - testParticipantCards.addCard(help3); + testParticipantCards.addCard(card1); + testParticipantCards.addCard(card2); + testParticipantCards.addCard(card3); assertEquals(14, testParticipantCards.calculateScore()); } diff --git a/src/test/java/domain/participant/PlayerTest.java b/src/test/java/domain/participant/PlayerTest.java index 32cadbfbec..f52ffd3aca 100644 --- a/src/test/java/domain/participant/PlayerTest.java +++ b/src/test/java/domain/participant/PlayerTest.java @@ -2,7 +2,7 @@ import static org.junit.jupiter.api.Assertions.*; -import domain.card.Help; +import domain.card.Card; import domain.card.Number; import domain.card.Shape; import domain.game.GameResult; @@ -13,9 +13,9 @@ class PlayerTest { @Test void 점수가_21점을_초과하면_버스트이다() { Player player = new Player(new Name("pobi")); - player.receiveCard(new Help(Shape.SPADE, domain.card.Number.TEN)); - player.receiveCard(new Help(Shape.HEART, domain.card.Number.JACK)); - player.receiveCard(new Help(Shape.DIAMOND, domain.card.Number.TWO)); + player.receiveCard(new Card(Shape.SPADE, domain.card.Number.TEN)); + player.receiveCard(new Card(Shape.HEART, domain.card.Number.JACK)); + player.receiveCard(new Card(Shape.DIAMOND, domain.card.Number.TWO)); boolean result = player.isBust(); @@ -25,9 +25,9 @@ class PlayerTest { @Test void 점수가_21점이면_버스트가_아니다() { Player player = new Player(new Name("pobi")); - player.receiveCard(new Help(Shape.SPADE, domain.card.Number.NINE)); - player.receiveCard(new Help(Shape.HEART, domain.card.Number.JACK)); - player.receiveCard(new Help(Shape.DIAMOND, domain.card.Number.TWO)); + player.receiveCard(new Card(Shape.SPADE, domain.card.Number.NINE)); + player.receiveCard(new Card(Shape.HEART, domain.card.Number.JACK)); + player.receiveCard(new Card(Shape.DIAMOND, domain.card.Number.TWO)); boolean result = player.isBust(); @@ -37,8 +37,8 @@ class PlayerTest { @Test void 에이스와_10점카드를_받으면_블랙잭이다() { Player player = new Player(new Name("pobi")); - player.receiveCard(new Help(Shape.SPADE, domain.card.Number.ACE)); - player.receiveCard(new Help(Shape.HEART, domain.card.Number.JACK)); + player.receiveCard(new Card(Shape.SPADE, domain.card.Number.ACE)); + player.receiveCard(new Card(Shape.HEART, domain.card.Number.JACK)); boolean result = player.isBlackJack(); @@ -48,8 +48,8 @@ class PlayerTest { @Test void 두장의_합이_21이아니면_블랙잭이_아니다() { Player player = new Player(new Name("pobi")); - player.receiveCard(new Help(Shape.SPADE, domain.card.Number.JACK)); - player.receiveCard(new Help(Shape.HEART, domain.card.Number.JACK)); + player.receiveCard(new Card(Shape.SPADE, domain.card.Number.JACK)); + player.receiveCard(new Card(Shape.HEART, domain.card.Number.JACK)); boolean result = player.isBlackJack(); @@ -59,9 +59,9 @@ class PlayerTest { @Test void 세장의_합이_21이어도_블랙잭이_아니다() { Player player = new Player(new Name("pobi")); - player.receiveCard(new Help(Shape.SPADE, domain.card.Number.EIGHT)); - player.receiveCard(new Help(Shape.HEART, domain.card.Number.JACK)); - player.receiveCard(new Help(Shape.HEART, domain.card.Number.THREE)); + player.receiveCard(new Card(Shape.SPADE, domain.card.Number.EIGHT)); + player.receiveCard(new Card(Shape.HEART, domain.card.Number.JACK)); + player.receiveCard(new Card(Shape.HEART, domain.card.Number.THREE)); boolean result = player.isBlackJack(); @@ -71,9 +71,9 @@ class PlayerTest { @Test void 점수가_21점_미만이면_카드를_추가로_받을_수_있다() { Player player = new Player(new Name("pobi")); - player.receiveCard(new Help(Shape.SPADE, domain.card.Number.EIGHT)); - player.receiveCard(new Help(Shape.HEART, domain.card.Number.JACK)); - player.receiveCard(new Help(Shape.DIAMOND, domain.card.Number.TWO)); + player.receiveCard(new Card(Shape.SPADE, domain.card.Number.EIGHT)); + player.receiveCard(new Card(Shape.HEART, domain.card.Number.JACK)); + player.receiveCard(new Card(Shape.DIAMOND, domain.card.Number.TWO)); boolean result = player.isContinueGame(); @@ -83,9 +83,9 @@ class PlayerTest { @Test void 점수가_21점_이상이면_카드를_추가로_받을_수_없다() { Player player = new Player(new Name("pobi")); - player.receiveCard(new Help(Shape.SPADE, domain.card.Number.NINE)); - player.receiveCard(new Help(Shape.HEART, domain.card.Number.JACK)); - player.receiveCard(new Help(Shape.DIAMOND, domain.card.Number.TWO)); + player.receiveCard(new Card(Shape.SPADE, domain.card.Number.NINE)); + player.receiveCard(new Card(Shape.HEART, domain.card.Number.JACK)); + player.receiveCard(new Card(Shape.DIAMOND, domain.card.Number.TWO)); boolean result = player.isContinueGame(); @@ -97,11 +97,11 @@ class PlayerTest { Player player = new Player(new Name("pobi")); Dealer dealer = new Dealer(); - player.receiveCard(new Help(Shape.SPADE, domain.card.Number.TEN)); - player.receiveCard(new Help(Shape.HEART, domain.card.Number.JACK)); + player.receiveCard(new Card(Shape.SPADE, domain.card.Number.TEN)); + player.receiveCard(new Card(Shape.HEART, domain.card.Number.JACK)); - dealer.receiveCard(new Help(Shape.DIAMOND, domain.card.Number.TEN)); - dealer.receiveCard(new Help(Shape.CLUB, domain.card.Number.EIGHT)); + dealer.receiveCard(new Card(Shape.DIAMOND, domain.card.Number.TEN)); + dealer.receiveCard(new Card(Shape.CLUB, domain.card.Number.EIGHT)); GameResult result = player.judgeResult(dealer); @@ -113,11 +113,11 @@ class PlayerTest { Player player = new Player(new Name("pobi")); Dealer dealer = new Dealer(); - player.receiveCard(new Help(Shape.SPADE, domain.card.Number.TEN)); - player.receiveCard(new Help(Shape.HEART, domain.card.Number.JACK)); + player.receiveCard(new Card(Shape.SPADE, domain.card.Number.TEN)); + player.receiveCard(new Card(Shape.HEART, domain.card.Number.JACK)); - dealer.receiveCard(new Help(Shape.DIAMOND, domain.card.Number.TEN)); - dealer.receiveCard(new Help(Shape.CLUB, domain.card.Number.JACK)); + dealer.receiveCard(new Card(Shape.DIAMOND, domain.card.Number.TEN)); + dealer.receiveCard(new Card(Shape.CLUB, domain.card.Number.JACK)); GameResult result = player.judgeResult(dealer); @@ -129,10 +129,10 @@ class PlayerTest { Player player = new Player(new Name("pobi")); Dealer dealer = new Dealer(); - player.receiveCard(new Help(Shape.SPADE, domain.card.Number.TEN)); + player.receiveCard(new Card(Shape.SPADE, domain.card.Number.TEN)); - dealer.receiveCard(new Help(Shape.DIAMOND, domain.card.Number.TEN)); - dealer.receiveCard(new Help(Shape.CLUB, domain.card.Number.JACK)); + dealer.receiveCard(new Card(Shape.DIAMOND, domain.card.Number.TEN)); + dealer.receiveCard(new Card(Shape.CLUB, domain.card.Number.JACK)); GameResult result = player.judgeResult(dealer); @@ -144,12 +144,12 @@ class PlayerTest { Player player = new Player(new Name("pobi")); Dealer dealer = new Dealer(); - player.receiveCard(new Help(Shape.SPADE, domain.card.Number.TWO)); - player.receiveCard(new Help(Shape.HEART, domain.card.Number.JACK)); - player.receiveCard(new Help(Shape.CLUB, domain.card.Number.JACK)); + player.receiveCard(new Card(Shape.SPADE, domain.card.Number.TWO)); + player.receiveCard(new Card(Shape.HEART, domain.card.Number.JACK)); + player.receiveCard(new Card(Shape.CLUB, domain.card.Number.JACK)); - dealer.receiveCard(new Help(Shape.DIAMOND, domain.card.Number.TEN)); - dealer.receiveCard(new Help(Shape.CLUB, domain.card.Number.EIGHT)); + dealer.receiveCard(new Card(Shape.DIAMOND, domain.card.Number.TEN)); + dealer.receiveCard(new Card(Shape.CLUB, domain.card.Number.EIGHT)); GameResult result = player.judgeResult(dealer); @@ -161,12 +161,12 @@ class PlayerTest { Player player = new Player(new Name("pobi")); Dealer dealer = new Dealer(); - player.receiveCard(new Help(Shape.SPADE, domain.card.Number.TEN)); - player.receiveCard(new Help(Shape.HEART, domain.card.Number.JACK)); + player.receiveCard(new Card(Shape.SPADE, domain.card.Number.TEN)); + player.receiveCard(new Card(Shape.HEART, domain.card.Number.JACK)); - dealer.receiveCard(new Help(Shape.DIAMOND, domain.card.Number.TEN)); - dealer.receiveCard(new Help(Shape.CLUB, domain.card.Number.TWO)); - dealer.receiveCard(new Help(Shape.HEART, Number.TEN)); + dealer.receiveCard(new Card(Shape.DIAMOND, domain.card.Number.TEN)); + dealer.receiveCard(new Card(Shape.CLUB, domain.card.Number.TWO)); + dealer.receiveCard(new Card(Shape.HEART, Number.TEN)); GameResult result = player.judgeResult(dealer); From dc4f53acd8ac1e2c20e02380c99d8cfa5b67c95d Mon Sep 17 00:00:00 2001 From: xxbeann Date: Sun, 15 Mar 2026 15:14:47 +0900 Subject: [PATCH 40/44] =?UTF-8?q?chore:=20=EB=B6=88=ED=95=84=EC=9A=94=20?= =?UTF-8?q?=ED=8C=8C=EC=9D=BC=20=EC=82=AD=EC=A0=9C?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .gitattributes | 1 - 1 file changed, 1 deletion(-) delete mode 100644 .gitattributes diff --git a/.gitattributes b/.gitattributes deleted file mode 100644 index 6313b56c57..0000000000 --- a/.gitattributes +++ /dev/null @@ -1 +0,0 @@ -* text=auto eol=lf From 3c2173c5be11ee58d6b08711cd0572405ce024e7 Mon Sep 17 00:00:00 2001 From: xxbeann Date: Sun, 15 Mar 2026 15:41:17 +0900 Subject: [PATCH 41/44] =?UTF-8?q?refactor:=20for=EB=AC=B8=20stream?= =?UTF-8?q?=EC=9C=BC=EB=A1=9C=20=EB=A6=AC=ED=8C=A9=ED=84=B0=EB=A7=81?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- src/main/java/domain/card/Cards.java | 8 +++----- 1 file changed, 3 insertions(+), 5 deletions(-) diff --git a/src/main/java/domain/card/Cards.java b/src/main/java/domain/card/Cards.java index be6a94cb88..6bd76436ab 100644 --- a/src/main/java/domain/card/Cards.java +++ b/src/main/java/domain/card/Cards.java @@ -25,11 +25,9 @@ public Card removeFirst() { } public int sumScore() { - int sum = 0; - for (Card card : cards) { - sum += card.getScore(); - } - return sum; + return cards.stream() + .mapToInt(Card::getScore) + .sum(); } public void add(Card card) { From f63b3df1a929cee0a1daddaf5c589ee9ade04b88 Mon Sep 17 00:00:00 2001 From: xxbeann Date: Sun, 15 Mar 2026 15:54:50 +0900 Subject: [PATCH 42/44] =?UTF-8?q?refactor:=20calculateDealerRevenue?= =?UTF-8?q?=EB=A9=94=EC=84=9C=EB=93=9C=20=EA=B0=80=EB=8F=85=EC=84=B1=20?= =?UTF-8?q?=EA=B0=9C=EC=84=A0?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- src/main/java/domain/game/GameResultManager.java | 4 +++- 1 file changed, 3 insertions(+), 1 deletion(-) diff --git a/src/main/java/domain/game/GameResultManager.java b/src/main/java/domain/game/GameResultManager.java index f2ae827738..c8f3ffd61e 100644 --- a/src/main/java/domain/game/GameResultManager.java +++ b/src/main/java/domain/game/GameResultManager.java @@ -41,9 +41,11 @@ public LinkedHashMap getParticipantsProfit() { } private Revenue calculateDealerRevenue(Map revenues) { - int dealerRevenue = -revenues.values().stream() + int totalPlayerRevenue = revenues.values().stream() .mapToInt(Revenue::getMoney) .sum(); + int dealerRevenue = Math.negateExact(totalPlayerRevenue); + return new Revenue(dealerRevenue); } From 895342c9b3828324706e4feedb05416fe0500314 Mon Sep 17 00:00:00 2001 From: xxbeann Date: Sun, 15 Mar 2026 16:12:36 +0900 Subject: [PATCH 43/44] =?UTF-8?q?refactor:=20distributeCardToDealer=20?= =?UTF-8?q?=EB=A9=94=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/domain/game/GameManager.java | 13 ++----------- 1 file changed, 2 insertions(+), 11 deletions(-) diff --git a/src/main/java/domain/game/GameManager.java b/src/main/java/domain/game/GameManager.java index 7c705cd459..e52eeb71a9 100644 --- a/src/main/java/domain/game/GameManager.java +++ b/src/main/java/domain/game/GameManager.java @@ -13,7 +13,7 @@ public class GameManager { private final Deck deck; public GameManager(Players players) { - this.dealer = initDealer(); + this.dealer = new Dealer(); this.players = players; this.deck = new Deck(); } @@ -22,18 +22,9 @@ public Dealer getDealer() { return dealer; } - private Dealer initDealer() { - Dealer dealer = new Dealer(); - return dealer; - } - public void distributeInitialCards() { - distributeCardToDealer(dealer); - distributeCardToPlayers(players); - } - - private void distributeCardToDealer(Dealer dealer) { distributeInitialCards(dealer); + distributeCardToPlayers(players); } private void distributeCardToPlayers(Players players) { From 360f6ab56445372241fc4dec95dbf8f184819ab4 Mon Sep 17 00:00:00 2001 From: xxbeann Date: Sun, 15 Mar 2026 16:42:06 +0900 Subject: [PATCH 44/44] =?UTF-8?q?refactor:=20money=20int=EB=A1=9C=20?= =?UTF-8?q?=ED=98=95=EB=B3=80=ED=99=98?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- src/main/java/domain/betting/BettingAmount.java | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/main/java/domain/betting/BettingAmount.java b/src/main/java/domain/betting/BettingAmount.java index ed8656ef7e..5cff42e143 100644 --- a/src/main/java/domain/betting/BettingAmount.java +++ b/src/main/java/domain/betting/BettingAmount.java @@ -3,7 +3,7 @@ import java.util.Objects; public class BettingAmount { - private final Integer money; + private final int money; public BettingAmount(Integer bettingAmount) { validateMinus(bettingAmount);