From 89a8f44c3ca6e3c2c8ec7495813206e82d85330f Mon Sep 17 00:00:00 2001 From: BurningFalls Date: Tue, 5 Mar 2024 14:30:50 +0900 Subject: [PATCH 01/56] =?UTF-8?q?docs:=20=EC=9A=94=EA=B5=AC=EC=82=AC?= =?UTF-8?q?=ED=95=AD=20=EB=B6=84=EC=84=9D=20=EB=B0=8F=20=EA=B8=B0=EB=8A=A5?= =?UTF-8?q?=20=EB=AA=A9=EB=A1=9D=20=EC=9E=91=EC=84=B1?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- README.md | 47 +++++++++++++++++++++++++++++++++++++++++++---- 1 file changed, 43 insertions(+), 4 deletions(-) diff --git a/README.md b/README.md index 556099c4de3..3623dda5ed1 100644 --- a/README.md +++ b/README.md @@ -1,7 +1,46 @@ -# java-blackjack +## 기능 요구 사항 +### 플레이어 이름 입력 +1. 플레이어의 이름은 ","을 기준으로 구분한다. +2. 플레이어의 이름은 길이가 1 이상이어야 한다. +3. 플레이어의 이름은 알파벳 대소문자와 숫자로만 구성되어야 한다. +4. 플레이어의 이름은 중복되면 안된다. -블랙잭 미션 저장소 +### 플레이어 및 딜러 점수 계산 +1. 플레이어가 소유한 카드의 점수의 합이 플레이어의 점수다. +2. 카드의 점수는 카드의 숫자로 계산한다. +3. Ace 카드는 1 혹은 11 중 카드의 소유자가 더 유리한 것으로 계산한다. +4. King, Queen, Jack은 각각 10으로 계산한다. -## 우아한테크코스 코드리뷰 +### 게임 진행 규칙 +1. 모든 플레이어와 딜러는 카드를 2장씩 가지고 시작한다. +2. 플레이어는 서로 돌아가면서 자기 턴을 가진다. +3. 플레이어는 자신의 턴에 자신이 카드를 더 받을지 말지 선택할 수 있다. 단, 자신의 점수가 21 이상인 경우 카드를 더 받을 수 없다. +4. 플레이어는 한 번 카드를 받지 않기로 결정한 경우, 앞으로의 턴에서 카드를 더 받을 수 없다. +5. 모든 플레이어가 카드를 더 받을 수 없는 경우, 딜러의 턴으로 넘어간다. +6. 딜러의 턴에서 딜러는 딜러의 점수가 16점 이하인 경우 카드를 더 받는다. 17점 이상인 경우 카드를 더 받지 않는다. +7. 딜러의 턴이 끝나면, 최종 점수 계산 및 게임의 승패를 가린다. +8. 최종 점수가 21점에 가장 가까우면서 21점을 넘기지 않는 사람이 승리한다. 동점인 플레이어(딜러 포함)이 나온 경우, 무승부로 판단한다. -- [온라인 코드 리뷰 과정](https://github.com/woowacourse/woowacourse-docs/blob/master/maincourse/README.md) +### 게임 진행 상황 출력 +1. 게임이 시작 되자마자, 딜러와 플레이어가 받은 카드를 출력한다. +2. 단, 딜러는 카드를 한장만 출력한다. +3. 이 후 플레이어의 차례마다 플레이어가 소유한 카드를 출력한다. + +### 게임 결과 출력 +1. 게임을 완료한 후 각 플레이어(딜러 포함)가 보유한 카드 및 점수를 출력한다. +2. 게임을 완료한 후 각 플레이어별로 승패를 출력한다. + - 딜러는 다른 모든 플레이어에 대한 승패가 출력된다. + - 딜러가 아닌 플레이어는 딜러에 대한 승패가 출력된다. + +### 게임 진행 가이드 출력 +- 게임의 원활한 진행을 위해 가이드 문구를 출력한다. + +## 기능 목록 + +- [ ] 플레이어 이름 입력 기능 +- [ ] 카드 점수 계산 기능 +- [ ] 플레이어 턴 진행 기능 +- [ ] 플레이어 및 딜러 점수 계산 기능 +- [ ] 딜러 턴 진행 기능 +- [ ] 게임 결과 출력 기능 +- [ ] 게임 진행 상황 출력 기능 \ No newline at end of file From db9149335d45a91f8af50bd3ae62809c31a4e3a5 Mon Sep 17 00:00:00 2001 From: BurningFalls Date: Tue, 5 Mar 2024 15:27:25 +0900 Subject: [PATCH 02/56] =?UTF-8?q?feat:=20=EB=8D=B1=20=EA=B4=80=EB=A6=AC=20?= =?UTF-8?q?=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 --- README.md | 14 ++++++-- src/main/java/domain/Card.java | 5 +++ src/main/java/domain/CardDrawStrategy.java | 7 ++++ src/main/java/domain/CardType.java | 5 +++ src/main/java/domain/CardValue.java | 17 ++++++++++ src/main/java/domain/Deck.java | 38 +++++++++++++++++++++ src/test/java/domain/DeckTest.java | 39 ++++++++++++++++++++++ 7 files changed, 122 insertions(+), 3 deletions(-) create mode 100644 src/main/java/domain/Card.java create mode 100644 src/main/java/domain/CardDrawStrategy.java create mode 100644 src/main/java/domain/CardType.java create mode 100644 src/main/java/domain/CardValue.java create mode 100644 src/main/java/domain/Deck.java create mode 100644 src/test/java/domain/DeckTest.java diff --git a/README.md b/README.md index 3623dda5ed1..a885645bf91 100644 --- a/README.md +++ b/README.md @@ -1,17 +1,21 @@ ## 기능 요구 사항 + ### 플레이어 이름 입력 + 1. 플레이어의 이름은 ","을 기준으로 구분한다. 2. 플레이어의 이름은 길이가 1 이상이어야 한다. 3. 플레이어의 이름은 알파벳 대소문자와 숫자로만 구성되어야 한다. 4. 플레이어의 이름은 중복되면 안된다. ### 플레이어 및 딜러 점수 계산 + 1. 플레이어가 소유한 카드의 점수의 합이 플레이어의 점수다. 2. 카드의 점수는 카드의 숫자로 계산한다. 3. Ace 카드는 1 혹은 11 중 카드의 소유자가 더 유리한 것으로 계산한다. 4. King, Queen, Jack은 각각 10으로 계산한다. ### 게임 진행 규칙 + 1. 모든 플레이어와 딜러는 카드를 2장씩 가지고 시작한다. 2. 플레이어는 서로 돌아가면서 자기 턴을 가진다. 3. 플레이어는 자신의 턴에 자신이 카드를 더 받을지 말지 선택할 수 있다. 단, 자신의 점수가 21 이상인 경우 카드를 더 받을 수 없다. @@ -22,17 +26,20 @@ 8. 최종 점수가 21점에 가장 가까우면서 21점을 넘기지 않는 사람이 승리한다. 동점인 플레이어(딜러 포함)이 나온 경우, 무승부로 판단한다. ### 게임 진행 상황 출력 + 1. 게임이 시작 되자마자, 딜러와 플레이어가 받은 카드를 출력한다. 2. 단, 딜러는 카드를 한장만 출력한다. 3. 이 후 플레이어의 차례마다 플레이어가 소유한 카드를 출력한다. ### 게임 결과 출력 + 1. 게임을 완료한 후 각 플레이어(딜러 포함)가 보유한 카드 및 점수를 출력한다. 2. 게임을 완료한 후 각 플레이어별로 승패를 출력한다. - - 딜러는 다른 모든 플레이어에 대한 승패가 출력된다. - - 딜러가 아닌 플레이어는 딜러에 대한 승패가 출력된다. + - 딜러는 다른 모든 플레이어에 대한 승패가 출력된다. + - 딜러가 아닌 플레이어는 딜러에 대한 승패가 출력된다. ### 게임 진행 가이드 출력 + - 게임의 원활한 진행을 위해 가이드 문구를 출력한다. ## 기능 목록 @@ -43,4 +50,5 @@ - [ ] 플레이어 및 딜러 점수 계산 기능 - [ ] 딜러 턴 진행 기능 - [ ] 게임 결과 출력 기능 -- [ ] 게임 진행 상황 출력 기능 \ No newline at end of file +- [ ] 게임 진행 상황 출력 기능 +- [x] 덱 관리 기능 diff --git a/src/main/java/domain/Card.java b/src/main/java/domain/Card.java new file mode 100644 index 00000000000..a27e1a1b292 --- /dev/null +++ b/src/main/java/domain/Card.java @@ -0,0 +1,5 @@ +package domain; + +public record Card(CardValue value, CardType cardType) { + +} diff --git a/src/main/java/domain/CardDrawStrategy.java b/src/main/java/domain/CardDrawStrategy.java new file mode 100644 index 00000000000..1463e634a73 --- /dev/null +++ b/src/main/java/domain/CardDrawStrategy.java @@ -0,0 +1,7 @@ +package domain; + +import java.util.List; + +public interface CardDrawStrategy { + Card nextCard(List cards); +} diff --git a/src/main/java/domain/CardType.java b/src/main/java/domain/CardType.java new file mode 100644 index 00000000000..98f58e37c4b --- /dev/null +++ b/src/main/java/domain/CardType.java @@ -0,0 +1,5 @@ +package domain; + +public enum CardType { + HEART, SPADE, CLOVER, DIAMOND; +} diff --git a/src/main/java/domain/CardValue.java b/src/main/java/domain/CardValue.java new file mode 100644 index 00000000000..a3213b57049 --- /dev/null +++ b/src/main/java/domain/CardValue.java @@ -0,0 +1,17 @@ +package domain; + +public enum CardValue { + ACE, + TWO, + THREE, + FOUR, + FIVE, + SIX, + SEVEN, + EIGHT, + NINE, + TEN, + JACK, + QUEEN, + KING; +} diff --git a/src/main/java/domain/Deck.java b/src/main/java/domain/Deck.java new file mode 100644 index 00000000000..a324fabce1a --- /dev/null +++ b/src/main/java/domain/Deck.java @@ -0,0 +1,38 @@ +package domain; + +import java.util.ArrayList; +import java.util.HashSet; +import java.util.List; +import java.util.Set; + +public class Deck { + private final List cards; + + private Deck(List cards) { + validateDuplicateCard(cards); + this.cards = cards; + } + + public static Deck of(Card... cards) { + List tmpCards = new ArrayList<>(List.of(cards)); + return new Deck(tmpCards); + } + + private void validateDuplicateCard(List cards) { + Set cardSet = new HashSet<>(cards); + if (cardSet.size() != cards.size()) { + throw new IllegalArgumentException("중복되는 카드가 있습니다."); + } + } + + public Card draw(CardDrawStrategy cardDrawStrategy) { + if (cards.isEmpty()) { + throw new IllegalArgumentException("덱이 비어있습니다."); + } + + Card card = cardDrawStrategy.nextCard(cards); + cards.remove(card); + + return card; + } +} diff --git a/src/test/java/domain/DeckTest.java b/src/test/java/domain/DeckTest.java new file mode 100644 index 00000000000..0dc3c905b27 --- /dev/null +++ b/src/test/java/domain/DeckTest.java @@ -0,0 +1,39 @@ +package domain; + +import static domain.CardType.HEART; +import static domain.CardValue.ACE; + +import org.assertj.core.api.Assertions; +import org.junit.jupiter.api.DisplayName; +import org.junit.jupiter.api.Test; + +class DeckTest { + + @Test + @DisplayName("원하는 방식대로 카드가 뽑히는지 검증") + void validateDraw() { + Deck deck = Deck.of(new Card(ACE, HEART)); + Card card = deck.draw(cards -> cards.get(0)); + Assertions.assertThat(card) + .isEqualTo(new Card(ACE, HEART)); + } + + @Test + @DisplayName("중복된 카드가 포함된 덱이 생성되지 않는지 검증") + void validateDuplicateCard() { + Assertions.assertThatThrownBy(() -> Deck.of(new Card(ACE, HEART), new Card(ACE, HEART))) + .isInstanceOf(IllegalArgumentException.class) + .hasMessage("중복되는 카드가 있습니다."); + } + + @Test + @DisplayName("한 번 뽑힌 카드가 또 뽑히지 않는지 검증") + void validateDrawedCardIsRemoved() { + Deck deck = Deck.of(new Card(ACE, HEART)); + deck.draw(cards -> cards.get(0)); + + Assertions.assertThatThrownBy(() -> deck.draw(cards -> cards.get(0))) + .isInstanceOf(IllegalArgumentException.class) + .hasMessage("덱이 비어있습니다."); + } +} From 178ad204a3bbefef9b9ceaf2b2118246ea7202c7 Mon Sep 17 00:00:00 2001 From: BurningFalls Date: Tue, 5 Mar 2024 16:15:51 +0900 Subject: [PATCH 03/56] =?UTF-8?q?feat:=20=EC=B9=B4=EB=93=9C=20=EC=A0=90?= =?UTF-8?q?=EC=88=98=20=EA=B3=84=EC=82=B0=20=EA=B8=B0=EB=8A=A5=20=EA=B5=AC?= =?UTF-8?q?=ED=98=84?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- README.md | 3 +- src/main/java/domain/CardPoint.java | 5 +++ src/main/java/domain/CardPointCalculator.java | 11 +++++ src/main/java/domain/CardValue.java | 36 +++++++++++------ .../java/domain/CardPointCalculatorTest.java | 40 +++++++++++++++++++ 5 files changed, 81 insertions(+), 14 deletions(-) create mode 100644 src/main/java/domain/CardPoint.java create mode 100644 src/main/java/domain/CardPointCalculator.java create mode 100644 src/test/java/domain/CardPointCalculatorTest.java diff --git a/README.md b/README.md index a885645bf91..0a31a026285 100644 --- a/README.md +++ b/README.md @@ -45,7 +45,8 @@ ## 기능 목록 - [ ] 플레이어 이름 입력 기능 -- [ ] 카드 점수 계산 기능 +- [x] 카드 점수 계산 기능 +- [ ] Ace 카드 점수 보정 기능 - [ ] 플레이어 턴 진행 기능 - [ ] 플레이어 및 딜러 점수 계산 기능 - [ ] 딜러 턴 진행 기능 diff --git a/src/main/java/domain/CardPoint.java b/src/main/java/domain/CardPoint.java new file mode 100644 index 00000000000..33f9315674b --- /dev/null +++ b/src/main/java/domain/CardPoint.java @@ -0,0 +1,5 @@ +package domain; + +public record CardPoint(int point) { + +} diff --git a/src/main/java/domain/CardPointCalculator.java b/src/main/java/domain/CardPointCalculator.java new file mode 100644 index 00000000000..21a358e5f91 --- /dev/null +++ b/src/main/java/domain/CardPointCalculator.java @@ -0,0 +1,11 @@ +package domain; + +public class CardPointCalculator { + public static CardPoint calculate(Card card) { + CardValue cardValue = card.value(); + if (cardValue.getCardNumber() > 10) { + return new CardPoint(10); + } + return new CardPoint(cardValue.getCardNumber()); + } +} diff --git a/src/main/java/domain/CardValue.java b/src/main/java/domain/CardValue.java index a3213b57049..0854b4ddaff 100644 --- a/src/main/java/domain/CardValue.java +++ b/src/main/java/domain/CardValue.java @@ -1,17 +1,27 @@ package domain; public enum CardValue { - ACE, - TWO, - THREE, - FOUR, - FIVE, - SIX, - SEVEN, - EIGHT, - NINE, - TEN, - JACK, - QUEEN, - KING; + ACE(1), + TWO(2), + THREE(3), + FOUR(4), + FIVE(5), + SIX(6), + SEVEN(7), + EIGHT(8), + NINE(9), + TEN(10), + JACK(11), + QUEEN(12), + KING(13); + private final int cardNumber; + + CardValue(int cardNumber) { + this.cardNumber = cardNumber; + } + + + public int getCardNumber() { + return cardNumber; + } } diff --git a/src/test/java/domain/CardPointCalculatorTest.java b/src/test/java/domain/CardPointCalculatorTest.java new file mode 100644 index 00000000000..8da1dad10be --- /dev/null +++ b/src/test/java/domain/CardPointCalculatorTest.java @@ -0,0 +1,40 @@ +package domain; + +import java.util.ArrayList; +import java.util.List; +import java.util.stream.Stream; +import org.assertj.core.api.Assertions; +import org.junit.jupiter.api.DisplayName; +import org.junit.jupiter.params.ParameterizedTest; +import org.junit.jupiter.params.provider.Arguments; +import org.junit.jupiter.params.provider.MethodSource; + +class CardPointCalculatorTest { + + //ToDo 메서드 분리 완전 필요 + static Stream calculateParameter() { + List arguments = new ArrayList<>(); + for (CardType cardType : CardType.values()) { + for (CardValue cardValue : CardValue.values()) { + Card card = new Card(cardValue, cardType); + CardPoint cardPoint; + if (cardValue.getCardNumber() > 10) { + cardPoint = new CardPoint(10); + } else { + cardPoint = new CardPoint(cardValue.getCardNumber()); + } + arguments.add(Arguments.of(card, cardPoint)); + } + } + return Stream.of(arguments.toArray(new Arguments[0])); + } + + @ParameterizedTest + @MethodSource("calculateParameter") + @DisplayName("카드 점수가 제대로 변환되는지 검증") + void calculate(Card card, CardPoint expected) { + CardPoint cardPoint = CardPointCalculator.calculate(card); + Assertions.assertThat(cardPoint) + .isEqualTo(expected); + } +} From 40019ad8e2c741b68fbc8ad58cd7071bf5ea0993 Mon Sep 17 00:00:00 2001 From: BurningFalls Date: Tue, 5 Mar 2024 16:18:30 +0900 Subject: [PATCH 04/56] =?UTF-8?q?refactor:=20CardValue=20=EB=A5=BC=20CardN?= =?UTF-8?q?ame=20=EC=9C=BC=EB=A1=9C=20=EB=B3=80=EA=B2=BD?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- src/main/java/domain/Card.java | 2 +- src/main/java/domain/{CardValue.java => CardName.java} | 4 ++-- src/main/java/domain/CardPointCalculator.java | 6 +++--- src/test/java/domain/CardPointCalculatorTest.java | 8 ++++---- src/test/java/domain/DeckTest.java | 2 +- 5 files changed, 11 insertions(+), 11 deletions(-) rename src/main/java/domain/{CardValue.java => CardName.java} (85%) diff --git a/src/main/java/domain/Card.java b/src/main/java/domain/Card.java index a27e1a1b292..077898a82a4 100644 --- a/src/main/java/domain/Card.java +++ b/src/main/java/domain/Card.java @@ -1,5 +1,5 @@ package domain; -public record Card(CardValue value, CardType cardType) { +public record Card(CardName name, CardType cardType) { } diff --git a/src/main/java/domain/CardValue.java b/src/main/java/domain/CardName.java similarity index 85% rename from src/main/java/domain/CardValue.java rename to src/main/java/domain/CardName.java index 0854b4ddaff..edd37d640fa 100644 --- a/src/main/java/domain/CardValue.java +++ b/src/main/java/domain/CardName.java @@ -1,6 +1,6 @@ package domain; -public enum CardValue { +public enum CardName { ACE(1), TWO(2), THREE(3), @@ -16,7 +16,7 @@ public enum CardValue { KING(13); private final int cardNumber; - CardValue(int cardNumber) { + CardName(int cardNumber) { this.cardNumber = cardNumber; } diff --git a/src/main/java/domain/CardPointCalculator.java b/src/main/java/domain/CardPointCalculator.java index 21a358e5f91..91a05db9f67 100644 --- a/src/main/java/domain/CardPointCalculator.java +++ b/src/main/java/domain/CardPointCalculator.java @@ -2,10 +2,10 @@ public class CardPointCalculator { public static CardPoint calculate(Card card) { - CardValue cardValue = card.value(); - if (cardValue.getCardNumber() > 10) { + CardName cardName = card.name(); + if (cardName.getCardNumber() > 10) { return new CardPoint(10); } - return new CardPoint(cardValue.getCardNumber()); + return new CardPoint(cardName.getCardNumber()); } } diff --git a/src/test/java/domain/CardPointCalculatorTest.java b/src/test/java/domain/CardPointCalculatorTest.java index 8da1dad10be..369f20ccf90 100644 --- a/src/test/java/domain/CardPointCalculatorTest.java +++ b/src/test/java/domain/CardPointCalculatorTest.java @@ -15,13 +15,13 @@ class CardPointCalculatorTest { static Stream calculateParameter() { List arguments = new ArrayList<>(); for (CardType cardType : CardType.values()) { - for (CardValue cardValue : CardValue.values()) { - Card card = new Card(cardValue, cardType); + for (CardName cardName : CardName.values()) { + Card card = new Card(cardName, cardType); CardPoint cardPoint; - if (cardValue.getCardNumber() > 10) { + if (cardName.getCardNumber() > 10) { cardPoint = new CardPoint(10); } else { - cardPoint = new CardPoint(cardValue.getCardNumber()); + cardPoint = new CardPoint(cardName.getCardNumber()); } arguments.add(Arguments.of(card, cardPoint)); } diff --git a/src/test/java/domain/DeckTest.java b/src/test/java/domain/DeckTest.java index 0dc3c905b27..8980980feb1 100644 --- a/src/test/java/domain/DeckTest.java +++ b/src/test/java/domain/DeckTest.java @@ -1,7 +1,7 @@ package domain; +import static domain.CardName.ACE; import static domain.CardType.HEART; -import static domain.CardValue.ACE; import org.assertj.core.api.Assertions; import org.junit.jupiter.api.DisplayName; From 7196074f2f3573f533a8f7b1a1d0c89789d43720 Mon Sep 17 00:00:00 2001 From: BurningFalls Date: Tue, 5 Mar 2024 17:19:46 +0900 Subject: [PATCH 05/56] =?UTF-8?q?feat:=20=EB=B3=B4=EC=9C=A0=ED=95=9C=20?= =?UTF-8?q?=EC=B9=B4=EB=93=9C=20=EC=A0=90=EC=88=98=20=ED=95=A9=EA=B3=84=20?= =?UTF-8?q?=EA=B3=84=EC=82=B0=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 --- README.md | 1 + src/main/java/domain/HoldingCards.java | 19 +++++++++++ src/main/java/domain/SummationCardPoint.java | 13 ++++++++ src/test/java/domain/HoldingCardsTest.java | 32 +++++++++++++++++++ .../java/domain/SummationCardPointTest.java | 23 +++++++++++++ 5 files changed, 88 insertions(+) create mode 100644 src/main/java/domain/HoldingCards.java create mode 100644 src/main/java/domain/SummationCardPoint.java create mode 100644 src/test/java/domain/HoldingCardsTest.java create mode 100644 src/test/java/domain/SummationCardPointTest.java diff --git a/README.md b/README.md index 0a31a026285..d8495c9a12c 100644 --- a/README.md +++ b/README.md @@ -53,3 +53,4 @@ - [ ] 게임 결과 출력 기능 - [ ] 게임 진행 상황 출력 기능 - [x] 덱 관리 기능 +- [x] 보유한 카드 점수 합계 계산 기능 diff --git a/src/main/java/domain/HoldingCards.java b/src/main/java/domain/HoldingCards.java new file mode 100644 index 00000000000..49ed8180412 --- /dev/null +++ b/src/main/java/domain/HoldingCards.java @@ -0,0 +1,19 @@ +package domain; + +import java.util.List; + +public class HoldingCards { + private final List holdingCards; + + public HoldingCards(List holdingCards) { + this.holdingCards = holdingCards; + } + + public SummationCardPoint calculateTotalPoint() { + List cardPoints = holdingCards.stream() + .map(CardPointCalculator::calculate) + .toList(); + + return SummationCardPoint.of(cardPoints); + } +} diff --git a/src/main/java/domain/SummationCardPoint.java b/src/main/java/domain/SummationCardPoint.java new file mode 100644 index 00000000000..48f2a643c51 --- /dev/null +++ b/src/main/java/domain/SummationCardPoint.java @@ -0,0 +1,13 @@ +package domain; + +import java.util.List; + +public record SummationCardPoint(int summationCardPoint) { + + public static SummationCardPoint of(List cardPoints) { + int summationCardPoint = cardPoints.stream() + .mapToInt(CardPoint::point) + .sum(); + return new SummationCardPoint(summationCardPoint); + } +} diff --git a/src/test/java/domain/HoldingCardsTest.java b/src/test/java/domain/HoldingCardsTest.java new file mode 100644 index 00000000000..d414b20419d --- /dev/null +++ b/src/test/java/domain/HoldingCardsTest.java @@ -0,0 +1,32 @@ +package domain; + +import java.util.List; +import org.assertj.core.api.Assertions; +import org.junit.jupiter.api.DisplayName; +import org.junit.jupiter.api.Test; + +class HoldingCardsTest { + + @Test + void add() { + + } + + @Test + @DisplayName("포함된 카드의 포인트 합계가 올바른지 검증") + void calculateTotalPoint() { + List cards = List.of( + new Card(CardName.ACE, CardType.HEART), + new Card(CardName.SIX, CardType.HEART), + new Card(CardName.JACK, CardType.HEART), + new Card(CardName.QUEEN, CardType.HEART), + new Card(CardName.KING, CardType.HEART) + ); + HoldingCards holdingCards = new HoldingCards(cards); + + SummationCardPoint actual = holdingCards.calculateTotalPoint(); + SummationCardPoint expected = new SummationCardPoint(37); + + Assertions.assertThat(actual).isEqualTo(expected); + } +} diff --git a/src/test/java/domain/SummationCardPointTest.java b/src/test/java/domain/SummationCardPointTest.java new file mode 100644 index 00000000000..4290c2326fa --- /dev/null +++ b/src/test/java/domain/SummationCardPointTest.java @@ -0,0 +1,23 @@ +package domain; + +import java.util.List; +import org.assertj.core.api.Assertions; +import org.junit.jupiter.api.DisplayName; +import org.junit.jupiter.api.Test; + +class SummationCardPointTest { + + @Test + @DisplayName("카드 포인트 합이 잘 생성되는지 검증") + void getSummationCardPoint() { + List cardPoints = List.of( + new CardPoint(1), new CardPoint(2), + new CardPoint(3), new CardPoint(4), + new CardPoint(5), new CardPoint(6) + ); + SummationCardPoint summationCardPoint = SummationCardPoint.of(cardPoints); + + Assertions.assertThat(summationCardPoint) + .isEqualTo(new SummationCardPoint(21)); + } +} From 399fa25a042b120cd4ea87542728d64ccda3b81d Mon Sep 17 00:00:00 2001 From: BurningFalls Date: Tue, 5 Mar 2024 19:10:13 +0900 Subject: [PATCH 06/56] =?UTF-8?q?feat:=20=ED=94=8C=EB=A0=88=EC=9D=B4?= =?UTF-8?q?=EC=96=B4=20=EB=B0=8F=20=EB=94=9C=EB=9F=AC=20=EC=A0=90=EC=88=98?= =?UTF-8?q?=20=EA=B3=84=EC=82=B0=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 --- README.md | 2 +- src/main/java/domain/Dealer.java | 19 +++++++++++++++++++ src/main/java/domain/HoldingCards.java | 4 ++++ src/main/java/domain/Player.java | 21 +++++++++++++++++++++ src/test/java/domain/DealerTest.java | 23 +++++++++++++++++++++++ src/test/java/domain/PlayerTest.java | 22 ++++++++++++++++++++++ 6 files changed, 90 insertions(+), 1 deletion(-) create mode 100644 src/main/java/domain/Dealer.java create mode 100644 src/main/java/domain/Player.java create mode 100644 src/test/java/domain/DealerTest.java create mode 100644 src/test/java/domain/PlayerTest.java diff --git a/README.md b/README.md index d8495c9a12c..c741d12ef7e 100644 --- a/README.md +++ b/README.md @@ -48,7 +48,7 @@ - [x] 카드 점수 계산 기능 - [ ] Ace 카드 점수 보정 기능 - [ ] 플레이어 턴 진행 기능 -- [ ] 플레이어 및 딜러 점수 계산 기능 +- [x] 플레이어 및 딜러 점수 계산 기능 - [ ] 딜러 턴 진행 기능 - [ ] 게임 결과 출력 기능 - [ ] 게임 진행 상황 출력 기능 diff --git a/src/main/java/domain/Dealer.java b/src/main/java/domain/Dealer.java new file mode 100644 index 00000000000..2dbc4341f90 --- /dev/null +++ b/src/main/java/domain/Dealer.java @@ -0,0 +1,19 @@ +package domain; + +import java.util.ArrayList; + +public class Dealer { + private final HoldingCards holdingCards; + + public Dealer() { + this.holdingCards = new HoldingCards(new ArrayList<>()); + } + + public void draw(Deck deck, CardDrawStrategy cardDrawStrategy) { + holdingCards.add(deck.draw(cardDrawStrategy)); + } + + public SummationCardPoint getSummationCardPoint() { + return holdingCards.calculateTotalPoint(); + } +} diff --git a/src/main/java/domain/HoldingCards.java b/src/main/java/domain/HoldingCards.java index 49ed8180412..12143fd71b7 100644 --- a/src/main/java/domain/HoldingCards.java +++ b/src/main/java/domain/HoldingCards.java @@ -16,4 +16,8 @@ public SummationCardPoint calculateTotalPoint() { return SummationCardPoint.of(cardPoints); } + + public void add(Card card) { + holdingCards.add(card); + } } diff --git a/src/main/java/domain/Player.java b/src/main/java/domain/Player.java new file mode 100644 index 00000000000..5f7d2013f13 --- /dev/null +++ b/src/main/java/domain/Player.java @@ -0,0 +1,21 @@ +package domain; + +import java.util.ArrayList; + +public class Player { + private final String name; + private final HoldingCards holdingCards; + + public Player(String name) { + this.name = name; + this.holdingCards = new HoldingCards(new ArrayList<>()); + } + + public void draw(Deck deck, CardDrawStrategy cardDrawStrategy) { + holdingCards.add(deck.draw(cardDrawStrategy)); + } + + public SummationCardPoint getSummationCardPoint() { + return holdingCards.calculateTotalPoint(); + } +} diff --git a/src/test/java/domain/DealerTest.java b/src/test/java/domain/DealerTest.java new file mode 100644 index 00000000000..becdee70c71 --- /dev/null +++ b/src/test/java/domain/DealerTest.java @@ -0,0 +1,23 @@ +package domain; + +import org.assertj.core.api.Assertions; +import org.junit.jupiter.api.DisplayName; +import org.junit.jupiter.api.Test; + +class DealerTest { + + @Test + @DisplayName("딜러 카드를 뽑았을 때 플레이어의 점수가 올바르게 계산되는지 검증") + void draw() { + Dealer dealer = new Dealer(); + Deck deck = Deck.of(new Card(CardName.JACK, CardType.HEART), new Card(CardName.EIGHT, CardType.HEART)); + dealer.draw(deck, cards -> cards.get(0)); + + SummationCardPoint actual = dealer.getSummationCardPoint(); + SummationCardPoint expected = new SummationCardPoint(10); + + Assertions.assertThat(actual) + .isEqualTo(expected); + } + +} diff --git a/src/test/java/domain/PlayerTest.java b/src/test/java/domain/PlayerTest.java new file mode 100644 index 00000000000..dac41beb719 --- /dev/null +++ b/src/test/java/domain/PlayerTest.java @@ -0,0 +1,22 @@ +package domain; + +import org.assertj.core.api.Assertions; +import org.junit.jupiter.api.DisplayName; +import org.junit.jupiter.api.Test; + +class PlayerTest { + + @Test + @DisplayName("플레이어가 카드를 뽑았을 때 플레이어의 점수가 올바르게 계산되는지 검가") + void draw() { + Player player = new Player("robin"); + Deck deck = Deck.of(new Card(CardName.JACK, CardType.HEART), new Card(CardName.EIGHT, CardType.HEART)); + player.draw(deck, cards -> cards.get(0)); + + SummationCardPoint actual = player.getSummationCardPoint(); + SummationCardPoint expected = new SummationCardPoint(10); + + Assertions.assertThat(actual) + .isEqualTo(expected); + } +} From 19cfa4cad722f46a35f8edd90d86840bcfac769d Mon Sep 17 00:00:00 2001 From: BurningFalls Date: Tue, 5 Mar 2024 19:31:32 +0900 Subject: [PATCH 07/56] =?UTF-8?q?fix:=20=ED=94=8C=EB=A0=88=EC=9D=B4?= =?UTF-8?q?=EC=96=B4=EA=B0=80=20=EC=B9=B4=EB=93=9C=EB=A5=BC=20=EB=BD=91?= =?UTF-8?q?=EC=9D=84=20=EC=88=98=20=EC=97=86=EB=8A=94=20=EA=B2=BD=EC=9A=B0?= =?UTF-8?q?=EC=97=90=EB=8F=84=20=EC=B9=B4=EB=93=9C=EB=A5=BC=20=EB=BD=91?= =?UTF-8?q?=EC=9D=84=20=EC=88=98=20=EC=9E=88=EB=8D=98=20=EC=98=A4=EB=A5=98?= =?UTF-8?q?=20=EC=88=98=EC=A0=95?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- src/main/java/domain/Player.java | 7 +++++++ src/main/java/domain/SummationCardPoint.java | 5 +++++ src/test/java/domain/PlayerTest.java | 22 +++++++++++++++++++- 3 files changed, 33 insertions(+), 1 deletion(-) diff --git a/src/main/java/domain/Player.java b/src/main/java/domain/Player.java index 5f7d2013f13..6d2ddce917a 100644 --- a/src/main/java/domain/Player.java +++ b/src/main/java/domain/Player.java @@ -12,9 +12,16 @@ public Player(String name) { } public void draw(Deck deck, CardDrawStrategy cardDrawStrategy) { + validateCanDraw(); holdingCards.add(deck.draw(cardDrawStrategy)); } + private void validateCanDraw() { + if (getSummationCardPoint().isBiggerThan(new SummationCardPoint(21))) { + throw new IllegalStateException("카드를 더이상 뽑을 수 없습니다."); + } + } + public SummationCardPoint getSummationCardPoint() { return holdingCards.calculateTotalPoint(); } diff --git a/src/main/java/domain/SummationCardPoint.java b/src/main/java/domain/SummationCardPoint.java index 48f2a643c51..4d8eabc6fde 100644 --- a/src/main/java/domain/SummationCardPoint.java +++ b/src/main/java/domain/SummationCardPoint.java @@ -10,4 +10,9 @@ public static SummationCardPoint of(List cardPoints) { .sum(); return new SummationCardPoint(summationCardPoint); } + + public boolean isBiggerThan(SummationCardPoint other) { + int otherPoint = other.summationCardPoint(); + return summationCardPoint > otherPoint; + } } diff --git a/src/test/java/domain/PlayerTest.java b/src/test/java/domain/PlayerTest.java index dac41beb719..ea7e843ed18 100644 --- a/src/test/java/domain/PlayerTest.java +++ b/src/test/java/domain/PlayerTest.java @@ -7,7 +7,7 @@ class PlayerTest { @Test - @DisplayName("플레이어가 카드를 뽑았을 때 플레이어의 점수가 올바르게 계산되는지 검가") + @DisplayName("플레이어가 카드를 뽑았을 때 플레이어의 점수가 올바르게 계산되는지 검증") void draw() { Player player = new Player("robin"); Deck deck = Deck.of(new Card(CardName.JACK, CardType.HEART), new Card(CardName.EIGHT, CardType.HEART)); @@ -19,4 +19,24 @@ void draw() { Assertions.assertThat(actual) .isEqualTo(expected); } + + @Test + @DisplayName("플레이어는 총합이 21이 넘으면 카드를 뽑을 수 없는지 검증") + void validateDrawLimit() { + Player player = new Player("robin"); + Deck deck = Deck.of( + new Card(CardName.JACK, CardType.HEART), + new Card(CardName.EIGHT, CardType.HEART), + new Card(CardName.JACK, CardType.SPADE), + new Card(CardName.TWO, CardType.SPADE) + ); + + player.draw(deck, cards -> cards.get(0)); + player.draw(deck, cards -> cards.get(0)); + player.draw(deck, cards -> cards.get(0)); + + Assertions.assertThatThrownBy(() -> player.draw(deck, cards -> cards.get(0))) + .isInstanceOf(IllegalStateException.class) + .hasMessage("카드를 더이상 뽑을 수 없습니다."); + } } From ab2676b51136c9b8939966f891852767bb11a186 Mon Sep 17 00:00:00 2001 From: BurningFalls Date: Tue, 5 Mar 2024 19:39:29 +0900 Subject: [PATCH 08/56] =?UTF-8?q?fix:=20=EB=94=9C=EB=9F=AC=EA=B0=80=20?= =?UTF-8?q?=EC=B9=B4=EB=93=9C=EB=A5=BC=20=EB=BD=91=EC=9D=84=20=EC=88=98=20?= =?UTF-8?q?=EC=97=86=EB=8A=94=20=EA=B2=BD=EC=9A=B0=EC=97=90=EB=8F=84=20?= =?UTF-8?q?=EC=B9=B4=EB=93=9C=EB=A5=BC=20=EB=BD=91=EC=9D=84=20=EC=88=98=20?= =?UTF-8?q?=EC=9E=88=EB=8D=98=20=EC=98=A4=EB=A5=98=20=EC=88=98=EC=A0=95?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- src/main/java/domain/Dealer.java | 7 +++++++ src/test/java/domain/DealerTest.java | 17 +++++++++++++++++ 2 files changed, 24 insertions(+) diff --git a/src/main/java/domain/Dealer.java b/src/main/java/domain/Dealer.java index 2dbc4341f90..ea6a15e5433 100644 --- a/src/main/java/domain/Dealer.java +++ b/src/main/java/domain/Dealer.java @@ -10,9 +10,16 @@ public Dealer() { } public void draw(Deck deck, CardDrawStrategy cardDrawStrategy) { + validateCanDraw(); holdingCards.add(deck.draw(cardDrawStrategy)); } + private void validateCanDraw() { + if (getSummationCardPoint().isBiggerThan(new SummationCardPoint(16))) { + throw new IllegalStateException("카드를 더이상 뽑을 수 없습니다."); + } + } + public SummationCardPoint getSummationCardPoint() { return holdingCards.calculateTotalPoint(); } diff --git a/src/test/java/domain/DealerTest.java b/src/test/java/domain/DealerTest.java index becdee70c71..a45b1fb78bd 100644 --- a/src/test/java/domain/DealerTest.java +++ b/src/test/java/domain/DealerTest.java @@ -20,4 +20,21 @@ void draw() { .isEqualTo(expected); } + @Test + @DisplayName("딜러는 총합이 17이 넘으면 카드를 뽑을 수 없는지 검증") + void validateDrawLimit() { + Dealer dealer = new Dealer(); + Deck deck = Deck.of( + new Card(CardName.JACK, CardType.HEART), + new Card(CardName.SEVEN, CardType.HEART), + new Card(CardName.JACK, CardType.SPADE) + ); + + dealer.draw(deck, cards -> cards.get(0)); + dealer.draw(deck, cards -> cards.get(0)); + + Assertions.assertThatThrownBy(() -> dealer.draw(deck, cards -> cards.get(0))) + .isInstanceOf(IllegalStateException.class) + .hasMessage("카드를 더이상 뽑을 수 없습니다."); + } } From f1319fd44eb35010968813a03b9bbb86773782eb Mon Sep 17 00:00:00 2001 From: BurningFalls Date: Tue, 5 Mar 2024 20:04:59 +0900 Subject: [PATCH 09/56] =?UTF-8?q?refactor:=20Player=20=EC=99=80=20Dealer?= =?UTF-8?q?=20=ED=86=B5=ED=95=A9?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- src/main/java/domain/Dealer.java | 26 --------- .../java/domain/{Player.java => Gamer.java} | 16 +++--- src/main/java/domain/HoldingCards.java | 7 ++- src/test/java/domain/DealerTest.java | 40 -------------- src/test/java/domain/GamerTest.java | 55 +++++++++++++++++++ src/test/java/domain/HoldingCardsTest.java | 6 +- src/test/java/domain/PlayerTest.java | 42 -------------- 7 files changed, 70 insertions(+), 122 deletions(-) delete mode 100644 src/main/java/domain/Dealer.java rename src/main/java/domain/{Player.java => Gamer.java} (58%) delete mode 100644 src/test/java/domain/DealerTest.java create mode 100644 src/test/java/domain/GamerTest.java delete mode 100644 src/test/java/domain/PlayerTest.java diff --git a/src/main/java/domain/Dealer.java b/src/main/java/domain/Dealer.java deleted file mode 100644 index ea6a15e5433..00000000000 --- a/src/main/java/domain/Dealer.java +++ /dev/null @@ -1,26 +0,0 @@ -package domain; - -import java.util.ArrayList; - -public class Dealer { - private final HoldingCards holdingCards; - - public Dealer() { - this.holdingCards = new HoldingCards(new ArrayList<>()); - } - - public void draw(Deck deck, CardDrawStrategy cardDrawStrategy) { - validateCanDraw(); - holdingCards.add(deck.draw(cardDrawStrategy)); - } - - private void validateCanDraw() { - if (getSummationCardPoint().isBiggerThan(new SummationCardPoint(16))) { - throw new IllegalStateException("카드를 더이상 뽑을 수 없습니다."); - } - } - - public SummationCardPoint getSummationCardPoint() { - return holdingCards.calculateTotalPoint(); - } -} diff --git a/src/main/java/domain/Player.java b/src/main/java/domain/Gamer.java similarity index 58% rename from src/main/java/domain/Player.java rename to src/main/java/domain/Gamer.java index 6d2ddce917a..f2d38df8e99 100644 --- a/src/main/java/domain/Player.java +++ b/src/main/java/domain/Gamer.java @@ -1,23 +1,21 @@ package domain; -import java.util.ArrayList; - -public class Player { +public class Gamer { private final String name; private final HoldingCards holdingCards; - public Player(String name) { + public Gamer(String name, HoldingCards holdingCards) { this.name = name; - this.holdingCards = new HoldingCards(new ArrayList<>()); + this.holdingCards = holdingCards; } - public void draw(Deck deck, CardDrawStrategy cardDrawStrategy) { - validateCanDraw(); + public void draw(Deck deck, CardDrawStrategy cardDrawStrategy, SummationCardPoint thresholdPoint) { + validateCanDraw(thresholdPoint); holdingCards.add(deck.draw(cardDrawStrategy)); } - private void validateCanDraw() { - if (getSummationCardPoint().isBiggerThan(new SummationCardPoint(21))) { + private void validateCanDraw(SummationCardPoint thresholdPoint) { + if (getSummationCardPoint().isBiggerThan(thresholdPoint)) { throw new IllegalStateException("카드를 더이상 뽑을 수 없습니다."); } } diff --git a/src/main/java/domain/HoldingCards.java b/src/main/java/domain/HoldingCards.java index 12143fd71b7..9e4ee02fa7e 100644 --- a/src/main/java/domain/HoldingCards.java +++ b/src/main/java/domain/HoldingCards.java @@ -1,14 +1,19 @@ package domain; +import java.util.ArrayList; import java.util.List; public class HoldingCards { private final List holdingCards; - public HoldingCards(List holdingCards) { + private HoldingCards(List holdingCards) { this.holdingCards = holdingCards; } + public static HoldingCards of(Card... cards) { + return new HoldingCards(new ArrayList<>(List.of(cards))); + } + public SummationCardPoint calculateTotalPoint() { List cardPoints = holdingCards.stream() .map(CardPointCalculator::calculate) diff --git a/src/test/java/domain/DealerTest.java b/src/test/java/domain/DealerTest.java deleted file mode 100644 index a45b1fb78bd..00000000000 --- a/src/test/java/domain/DealerTest.java +++ /dev/null @@ -1,40 +0,0 @@ -package domain; - -import org.assertj.core.api.Assertions; -import org.junit.jupiter.api.DisplayName; -import org.junit.jupiter.api.Test; - -class DealerTest { - - @Test - @DisplayName("딜러 카드를 뽑았을 때 플레이어의 점수가 올바르게 계산되는지 검증") - void draw() { - Dealer dealer = new Dealer(); - Deck deck = Deck.of(new Card(CardName.JACK, CardType.HEART), new Card(CardName.EIGHT, CardType.HEART)); - dealer.draw(deck, cards -> cards.get(0)); - - SummationCardPoint actual = dealer.getSummationCardPoint(); - SummationCardPoint expected = new SummationCardPoint(10); - - Assertions.assertThat(actual) - .isEqualTo(expected); - } - - @Test - @DisplayName("딜러는 총합이 17이 넘으면 카드를 뽑을 수 없는지 검증") - void validateDrawLimit() { - Dealer dealer = new Dealer(); - Deck deck = Deck.of( - new Card(CardName.JACK, CardType.HEART), - new Card(CardName.SEVEN, CardType.HEART), - new Card(CardName.JACK, CardType.SPADE) - ); - - dealer.draw(deck, cards -> cards.get(0)); - dealer.draw(deck, cards -> cards.get(0)); - - Assertions.assertThatThrownBy(() -> dealer.draw(deck, cards -> cards.get(0))) - .isInstanceOf(IllegalStateException.class) - .hasMessage("카드를 더이상 뽑을 수 없습니다."); - } -} diff --git a/src/test/java/domain/GamerTest.java b/src/test/java/domain/GamerTest.java new file mode 100644 index 00000000000..e4c0ec3a2dc --- /dev/null +++ b/src/test/java/domain/GamerTest.java @@ -0,0 +1,55 @@ +package domain; + +import org.assertj.core.api.Assertions; +import org.junit.jupiter.api.DisplayName; +import org.junit.jupiter.api.Test; + +class GamerTest { + + @Test + @DisplayName("게임 참가자가 카드를 뽑았을 때 점수가 올바르게 계산되는지 검증") + void draw() { + Gamer Gamer = new Gamer("robin", HoldingCards.of()); + Deck deck = Deck.of(new Card(CardName.JACK, CardType.HEART), new Card(CardName.EIGHT, CardType.HEART)); + Gamer.draw(deck, cards -> cards.get(0), new SummationCardPoint(21)); + + SummationCardPoint actual = Gamer.getSummationCardPoint(); + SummationCardPoint expected = new SummationCardPoint(10); + + Assertions.assertThat(actual) + .isEqualTo(expected); + } + + @Test + @DisplayName("플레이어는 총합이 21이 넘으면 카드를 뽑을 수 없는지 검증") + void validateDrawLimit() { + Gamer Gamer = new Gamer("robin", HoldingCards.of( + new Card(CardName.JACK, CardType.HEART), + new Card(CardName.EIGHT, CardType.HEART), + new Card(CardName.JACK, CardType.SPADE) + )); + Deck deck = Deck.of( + new Card(CardName.TWO, CardType.SPADE) + ); + + Assertions.assertThatThrownBy(() -> Gamer.draw(deck, cards -> cards.get(0), new SummationCardPoint(21))) + .isInstanceOf(IllegalStateException.class) + .hasMessage("카드를 더이상 뽑을 수 없습니다."); + } + + @Test + @DisplayName("딜러는 총합이 16이 넘으면 카드를 뽑을 수 없는지 검증") + void validateDealerDrawLimit() { + Gamer Gamer = new Gamer("robin", HoldingCards.of( + new Card(CardName.JACK, CardType.HEART), + new Card(CardName.SEVEN, CardType.HEART) + )); + Deck deck = Deck.of( + new Card(CardName.TWO, CardType.SPADE) + ); + + Assertions.assertThatThrownBy(() -> Gamer.draw(deck, cards -> cards.get(0), new SummationCardPoint(16))) + .isInstanceOf(IllegalStateException.class) + .hasMessage("카드를 더이상 뽑을 수 없습니다."); + } +} diff --git a/src/test/java/domain/HoldingCardsTest.java b/src/test/java/domain/HoldingCardsTest.java index d414b20419d..1863fe71ba6 100644 --- a/src/test/java/domain/HoldingCardsTest.java +++ b/src/test/java/domain/HoldingCardsTest.java @@ -1,6 +1,5 @@ package domain; -import java.util.List; import org.assertj.core.api.Assertions; import org.junit.jupiter.api.DisplayName; import org.junit.jupiter.api.Test; @@ -15,15 +14,14 @@ void add() { @Test @DisplayName("포함된 카드의 포인트 합계가 올바른지 검증") void calculateTotalPoint() { - List cards = List.of( + HoldingCards holdingCards = HoldingCards.of( new Card(CardName.ACE, CardType.HEART), new Card(CardName.SIX, CardType.HEART), new Card(CardName.JACK, CardType.HEART), new Card(CardName.QUEEN, CardType.HEART), new Card(CardName.KING, CardType.HEART) ); - HoldingCards holdingCards = new HoldingCards(cards); - + SummationCardPoint actual = holdingCards.calculateTotalPoint(); SummationCardPoint expected = new SummationCardPoint(37); diff --git a/src/test/java/domain/PlayerTest.java b/src/test/java/domain/PlayerTest.java deleted file mode 100644 index ea7e843ed18..00000000000 --- a/src/test/java/domain/PlayerTest.java +++ /dev/null @@ -1,42 +0,0 @@ -package domain; - -import org.assertj.core.api.Assertions; -import org.junit.jupiter.api.DisplayName; -import org.junit.jupiter.api.Test; - -class PlayerTest { - - @Test - @DisplayName("플레이어가 카드를 뽑았을 때 플레이어의 점수가 올바르게 계산되는지 검증") - void draw() { - Player player = new Player("robin"); - Deck deck = Deck.of(new Card(CardName.JACK, CardType.HEART), new Card(CardName.EIGHT, CardType.HEART)); - player.draw(deck, cards -> cards.get(0)); - - SummationCardPoint actual = player.getSummationCardPoint(); - SummationCardPoint expected = new SummationCardPoint(10); - - Assertions.assertThat(actual) - .isEqualTo(expected); - } - - @Test - @DisplayName("플레이어는 총합이 21이 넘으면 카드를 뽑을 수 없는지 검증") - void validateDrawLimit() { - Player player = new Player("robin"); - Deck deck = Deck.of( - new Card(CardName.JACK, CardType.HEART), - new Card(CardName.EIGHT, CardType.HEART), - new Card(CardName.JACK, CardType.SPADE), - new Card(CardName.TWO, CardType.SPADE) - ); - - player.draw(deck, cards -> cards.get(0)); - player.draw(deck, cards -> cards.get(0)); - player.draw(deck, cards -> cards.get(0)); - - Assertions.assertThatThrownBy(() -> player.draw(deck, cards -> cards.get(0))) - .isInstanceOf(IllegalStateException.class) - .hasMessage("카드를 더이상 뽑을 수 없습니다."); - } -} From 8656cafb6331eb180c9ea14de0f6cd60c61bebee Mon Sep 17 00:00:00 2001 From: BurningFalls Date: Tue, 5 Mar 2024 20:25:56 +0900 Subject: [PATCH 10/56] =?UTF-8?q?feat:=20=ED=94=8C=EB=A0=88=EC=9D=B4?= =?UTF-8?q?=EC=96=B4=20=EC=9D=B4=EB=A6=84=20=EC=9E=85=EB=A0=A5=20=EA=B8=B0?= =?UTF-8?q?=EB=8A=A5=20=EA=B5=AC=ED=98=84?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- README.md | 2 +- src/main/java/view/Console.java | 19 ++++++++++++++++++ src/main/java/view/NameInputView.java | 29 +++++++++++++++++++++++++++ 3 files changed, 49 insertions(+), 1 deletion(-) create mode 100644 src/main/java/view/Console.java create mode 100644 src/main/java/view/NameInputView.java diff --git a/README.md b/README.md index c741d12ef7e..4f002cbb546 100644 --- a/README.md +++ b/README.md @@ -44,7 +44,7 @@ ## 기능 목록 -- [ ] 플레이어 이름 입력 기능 +- [x] 플레이어 이름 입력 기능 - [x] 카드 점수 계산 기능 - [ ] Ace 카드 점수 보정 기능 - [ ] 플레이어 턴 진행 기능 diff --git a/src/main/java/view/Console.java b/src/main/java/view/Console.java new file mode 100644 index 00000000000..398cce8a352 --- /dev/null +++ b/src/main/java/view/Console.java @@ -0,0 +1,19 @@ +package view; + +import java.io.BufferedReader; +import java.io.IOException; +import java.io.InputStreamReader; + +public class Console { + + public static String getInputFromConsole() { + BufferedReader bufferedReader = new BufferedReader(new InputStreamReader(System.in)); + String input; + try { + input = bufferedReader.readLine(); + } catch (IOException e) { + throw new RuntimeException(e); + } + return input; + } +} diff --git a/src/main/java/view/NameInputView.java b/src/main/java/view/NameInputView.java new file mode 100644 index 00000000000..f07e2228060 --- /dev/null +++ b/src/main/java/view/NameInputView.java @@ -0,0 +1,29 @@ +package view; + +import java.util.Arrays; +import java.util.List; + +public class NameInputView { + private static final String SEPARATOR = ","; + + public static List getNames() { + String input = Console.getInputFromConsole(); + validateSeparator(input); + String[] splitInput = input.split(SEPARATOR); + validateBlank(splitInput); + return Arrays.stream(splitInput).toList(); + } + + private static void validateSeparator(String input) { + if (input.startsWith(SEPARATOR) || input.endsWith(SEPARATOR) || input.contains(SEPARATOR + SEPARATOR)) { + throw new IllegalArgumentException("입력 형식이 올바르지 않습니다."); + } + } + + private static void validateBlank(String[] split) { + boolean isInputContainsBlank = Arrays.stream(split).anyMatch(String::isBlank); + if (isInputContainsBlank) { + throw new IllegalArgumentException("입력 형식이 올바르지 않습니다."); + } + } +} From 9a66483da785a823612094295157a4dfdfb8e696 Mon Sep 17 00:00:00 2001 From: BurningFalls Date: Tue, 5 Mar 2024 20:30:26 +0900 Subject: [PATCH 11/56] =?UTF-8?q?feat:=20=EC=B9=B4=EB=93=9C=20=EB=B0=9B?= =?UTF-8?q?=EC=9D=84=EC=A7=80=20=EC=97=AC=EB=B6=80=20=EC=9E=85=EB=A0=A5=20?= =?UTF-8?q?=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 --- README.md | 1 + src/main/java/view/YNInputView.java | 15 +++++++++++++++ 2 files changed, 16 insertions(+) create mode 100644 src/main/java/view/YNInputView.java diff --git a/README.md b/README.md index 4f002cbb546..58af9e66592 100644 --- a/README.md +++ b/README.md @@ -54,3 +54,4 @@ - [ ] 게임 진행 상황 출력 기능 - [x] 덱 관리 기능 - [x] 보유한 카드 점수 합계 계산 기능 +- [x] 카드 받을지 여부 입력 기능 diff --git a/src/main/java/view/YNInputView.java b/src/main/java/view/YNInputView.java new file mode 100644 index 00000000000..da29e7b8756 --- /dev/null +++ b/src/main/java/view/YNInputView.java @@ -0,0 +1,15 @@ +package view; + +public class YNInputView { + + public static Boolean getYNAsBoolean() { + String input = Console.getInputFromConsole(); + if (input.equals("y")) { + return true; + } + if (input.equals("n")) { + return false; + } + throw new IllegalArgumentException("입력 형식이 올바르지 않습니다."); + } +} From 4adbb3ebd5b6f570be5f3cfce30051774215d45b Mon Sep 17 00:00:00 2001 From: BurningFalls Date: Wed, 6 Mar 2024 14:19:13 +0900 Subject: [PATCH 12/56] =?UTF-8?q?feat:=20=ED=94=8C=EB=A0=88=EC=9D=B4?= =?UTF-8?q?=EC=96=B4=20=EB=B0=8F=20=EB=94=9C=EB=9F=AC=EA=B0=84=20=EC=8A=B9?= =?UTF-8?q?=EB=B6=80=20=EA=B3=84=EC=82=B0=20=EA=B8=B0=EB=8A=A5=20=EA=B5=AC?= =?UTF-8?q?=ED=98=84?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- README.md | 1 + src/main/java/domain/GameResult.java | 5 ++++ src/main/java/domain/Gamer.java | 14 +++++++++ src/test/java/domain/GamerTest.java | 44 ++++++++++++++++++++++++++++ 4 files changed, 64 insertions(+) create mode 100644 src/main/java/domain/GameResult.java diff --git a/README.md b/README.md index 58af9e66592..6d0bee26115 100644 --- a/README.md +++ b/README.md @@ -49,6 +49,7 @@ - [ ] Ace 카드 점수 보정 기능 - [ ] 플레이어 턴 진행 기능 - [x] 플레이어 및 딜러 점수 계산 기능 +- [x] 플레이어 및 딜러간 승부 계산 기능 - [ ] 딜러 턴 진행 기능 - [ ] 게임 결과 출력 기능 - [ ] 게임 진행 상황 출력 기능 diff --git a/src/main/java/domain/GameResult.java b/src/main/java/domain/GameResult.java new file mode 100644 index 00000000000..0c16929b19d --- /dev/null +++ b/src/main/java/domain/GameResult.java @@ -0,0 +1,5 @@ +package domain; + +public enum GameResult { + WIN, LOSE, TIE; +} diff --git a/src/main/java/domain/Gamer.java b/src/main/java/domain/Gamer.java index f2d38df8e99..767d6a75470 100644 --- a/src/main/java/domain/Gamer.java +++ b/src/main/java/domain/Gamer.java @@ -23,4 +23,18 @@ private void validateCanDraw(SummationCardPoint thresholdPoint) { public SummationCardPoint getSummationCardPoint() { return holdingCards.calculateTotalPoint(); } + + public GameResult getGameResult(Gamer other) { + if (this.getSummationCardPoint().isBiggerThan(other.getSummationCardPoint())) { + return GameResult.WIN; + } + if (this.getSummationCardPoint().equals(other.getSummationCardPoint())) { + return GameResult.TIE; + } + return GameResult.LOSE; + } + + public String getName() { + return name; + } } diff --git a/src/test/java/domain/GamerTest.java b/src/test/java/domain/GamerTest.java index e4c0ec3a2dc..27aff8a0c10 100644 --- a/src/test/java/domain/GamerTest.java +++ b/src/test/java/domain/GamerTest.java @@ -1,11 +1,47 @@ package domain; +import java.util.stream.Stream; import org.assertj.core.api.Assertions; import org.junit.jupiter.api.DisplayName; import org.junit.jupiter.api.Test; +import org.junit.jupiter.params.ParameterizedTest; +import org.junit.jupiter.params.provider.Arguments; +import org.junit.jupiter.params.provider.MethodSource; class GamerTest { + public static Stream getGameResultParameters() { + return Stream.of( + Arguments.of( + new Gamer("게이머1", HoldingCards.of( + new Card(CardName.SEVEN, CardType.HEART) + )), + new Gamer("게이머2", HoldingCards.of( + new Card(CardName.SIX, CardType.HEART) + )), + GameResult.WIN + ), + Arguments.of( + new Gamer("게이머1", HoldingCards.of( + new Card(CardName.SIX, CardType.HEART) + )), + new Gamer("게이머2", HoldingCards.of( + new Card(CardName.SEVEN, CardType.HEART) + )), + GameResult.LOSE + ), + Arguments.of( + new Gamer("게이머1", HoldingCards.of( + new Card(CardName.SEVEN, CardType.HEART) + )), + new Gamer("게이머2", HoldingCards.of( + new Card(CardName.SEVEN, CardType.DIAMOND) + )), + GameResult.TIE + ) + ); + } + @Test @DisplayName("게임 참가자가 카드를 뽑았을 때 점수가 올바르게 계산되는지 검증") void draw() { @@ -52,4 +88,12 @@ void validateDealerDrawLimit() { .isInstanceOf(IllegalStateException.class) .hasMessage("카드를 더이상 뽑을 수 없습니다."); } + + @ParameterizedTest + @MethodSource("getGameResultParameters") + @DisplayName("승부가 잘 결정되는지 검증") + void getGameResult(Gamer gamer1, Gamer gamer2, GameResult expected) { + Assertions.assertThat(gamer1.getGameResult(gamer2)) + .isEqualTo(expected); + } } From b2a5a12ac4420db6f60a2b3d3c3df2f3296c1567 Mon Sep 17 00:00:00 2001 From: BurningFalls Date: Wed, 6 Mar 2024 14:38:28 +0900 Subject: [PATCH 13/56] =?UTF-8?q?refactor:=20=ED=94=8C=EB=A0=88=EC=9D=B4?= =?UTF-8?q?=EC=96=B4=20=EB=B0=8F=20=EB=94=9C=EB=9F=AC=EA=B0=84=20=EC=8A=B9?= =?UTF-8?q?=EB=B6=80=20=EA=B3=84=EC=82=B0=20=EA=B8=B0=EB=8A=A5=20Gamer=20?= =?UTF-8?q?=EC=97=90=EC=84=9C=20=EB=B6=84=EB=A6=AC?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../java/domain/GameResultCalculator.java | 20 ++++++++ src/main/java/domain/Gamer.java | 14 ----- .../java/domain/GameResultCalculatorTest.java | 51 +++++++++++++++++++ src/test/java/domain/GamerTest.java | 44 ---------------- 4 files changed, 71 insertions(+), 58 deletions(-) create mode 100644 src/main/java/domain/GameResultCalculator.java create mode 100644 src/test/java/domain/GameResultCalculatorTest.java diff --git a/src/main/java/domain/GameResultCalculator.java b/src/main/java/domain/GameResultCalculator.java new file mode 100644 index 00000000000..dc00557f00b --- /dev/null +++ b/src/main/java/domain/GameResultCalculator.java @@ -0,0 +1,20 @@ +package domain; + +public class GameResultCalculator { + /** + * baseGamer의 otherGamer 에 대한 승부 결과 반환 + * + * @param baseGamer 기준 게이머 + * @param otherGamer 상대 게이머 + * @return baseGamer의 otherGamer 에 대한 승부 결과 + */ + public static GameResult calculate(Gamer baseGamer, Gamer otherGamer) { + if (baseGamer.getSummationCardPoint().isBiggerThan(otherGamer.getSummationCardPoint())) { + return GameResult.WIN; + } + if (baseGamer.getSummationCardPoint().equals(otherGamer.getSummationCardPoint())) { + return GameResult.TIE; + } + return GameResult.LOSE; + } +} diff --git a/src/main/java/domain/Gamer.java b/src/main/java/domain/Gamer.java index 767d6a75470..f2d38df8e99 100644 --- a/src/main/java/domain/Gamer.java +++ b/src/main/java/domain/Gamer.java @@ -23,18 +23,4 @@ private void validateCanDraw(SummationCardPoint thresholdPoint) { public SummationCardPoint getSummationCardPoint() { return holdingCards.calculateTotalPoint(); } - - public GameResult getGameResult(Gamer other) { - if (this.getSummationCardPoint().isBiggerThan(other.getSummationCardPoint())) { - return GameResult.WIN; - } - if (this.getSummationCardPoint().equals(other.getSummationCardPoint())) { - return GameResult.TIE; - } - return GameResult.LOSE; - } - - public String getName() { - return name; - } } diff --git a/src/test/java/domain/GameResultCalculatorTest.java b/src/test/java/domain/GameResultCalculatorTest.java new file mode 100644 index 00000000000..3574c733865 --- /dev/null +++ b/src/test/java/domain/GameResultCalculatorTest.java @@ -0,0 +1,51 @@ +package domain; + +import java.util.stream.Stream; +import org.assertj.core.api.Assertions; +import org.junit.jupiter.api.DisplayName; +import org.junit.jupiter.params.ParameterizedTest; +import org.junit.jupiter.params.provider.Arguments; +import org.junit.jupiter.params.provider.MethodSource; + +class GameResultCalculatorTest { + public static Stream getGameResultParameters() { + return Stream.of( + Arguments.of( + new Gamer("게이머1", HoldingCards.of( + new Card(CardName.SEVEN, CardType.HEART) + )), + new Gamer("게이머2", HoldingCards.of( + new Card(CardName.SIX, CardType.HEART) + )), + GameResult.WIN + ), + Arguments.of( + new Gamer("게이머1", HoldingCards.of( + new Card(CardName.SIX, CardType.HEART) + )), + new Gamer("게이머2", HoldingCards.of( + new Card(CardName.SEVEN, CardType.HEART) + )), + GameResult.LOSE + ), + Arguments.of( + new Gamer("게이머1", HoldingCards.of( + new Card(CardName.SEVEN, CardType.HEART) + )), + new Gamer("게이머2", HoldingCards.of( + new Card(CardName.SEVEN, CardType.DIAMOND) + )), + GameResult.TIE + ) + ); + } + + + @ParameterizedTest + @MethodSource("getGameResultParameters") + @DisplayName("승부가 잘 결정되는지 검증") + void calculate(Gamer gamer1, Gamer gamer2, GameResult expected) { + Assertions.assertThat(GameResultCalculator.calculate(gamer1, gamer2)) + .isEqualTo(expected); + } +} diff --git a/src/test/java/domain/GamerTest.java b/src/test/java/domain/GamerTest.java index 27aff8a0c10..e4c0ec3a2dc 100644 --- a/src/test/java/domain/GamerTest.java +++ b/src/test/java/domain/GamerTest.java @@ -1,47 +1,11 @@ package domain; -import java.util.stream.Stream; import org.assertj.core.api.Assertions; import org.junit.jupiter.api.DisplayName; import org.junit.jupiter.api.Test; -import org.junit.jupiter.params.ParameterizedTest; -import org.junit.jupiter.params.provider.Arguments; -import org.junit.jupiter.params.provider.MethodSource; class GamerTest { - public static Stream getGameResultParameters() { - return Stream.of( - Arguments.of( - new Gamer("게이머1", HoldingCards.of( - new Card(CardName.SEVEN, CardType.HEART) - )), - new Gamer("게이머2", HoldingCards.of( - new Card(CardName.SIX, CardType.HEART) - )), - GameResult.WIN - ), - Arguments.of( - new Gamer("게이머1", HoldingCards.of( - new Card(CardName.SIX, CardType.HEART) - )), - new Gamer("게이머2", HoldingCards.of( - new Card(CardName.SEVEN, CardType.HEART) - )), - GameResult.LOSE - ), - Arguments.of( - new Gamer("게이머1", HoldingCards.of( - new Card(CardName.SEVEN, CardType.HEART) - )), - new Gamer("게이머2", HoldingCards.of( - new Card(CardName.SEVEN, CardType.DIAMOND) - )), - GameResult.TIE - ) - ); - } - @Test @DisplayName("게임 참가자가 카드를 뽑았을 때 점수가 올바르게 계산되는지 검증") void draw() { @@ -88,12 +52,4 @@ void validateDealerDrawLimit() { .isInstanceOf(IllegalStateException.class) .hasMessage("카드를 더이상 뽑을 수 없습니다."); } - - @ParameterizedTest - @MethodSource("getGameResultParameters") - @DisplayName("승부가 잘 결정되는지 검증") - void getGameResult(Gamer gamer1, Gamer gamer2, GameResult expected) { - Assertions.assertThat(gamer1.getGameResult(gamer2)) - .isEqualTo(expected); - } } From 7106b9c68b59290613938c6c319b347a4c9fdc9f Mon Sep 17 00:00:00 2001 From: BurningFalls Date: Wed, 6 Mar 2024 15:14:54 +0900 Subject: [PATCH 14/56] =?UTF-8?q?feat:=20=EA=B2=8C=EC=9E=84=20=EA=B2=B0?= =?UTF-8?q?=EA=B3=BC=20=EC=B6=9C=EB=A0=A5=20=EA=B8=B0=EB=8A=A5=20=EA=B5=AC?= =?UTF-8?q?=ED=98=84?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- README.md | 2 +- src/main/java/domain/Gamer.java | 14 ++++++ src/main/java/domain/HoldingCards.java | 4 ++ src/main/java/dto/GamerDTO.java | 28 ++++++++++++ src/main/java/view/GamerOutputView.java | 57 +++++++++++++++++++++++++ 5 files changed, 104 insertions(+), 1 deletion(-) create mode 100644 src/main/java/dto/GamerDTO.java create mode 100644 src/main/java/view/GamerOutputView.java diff --git a/README.md b/README.md index 6d0bee26115..9e671e4d17e 100644 --- a/README.md +++ b/README.md @@ -51,7 +51,7 @@ - [x] 플레이어 및 딜러 점수 계산 기능 - [x] 플레이어 및 딜러간 승부 계산 기능 - [ ] 딜러 턴 진행 기능 -- [ ] 게임 결과 출력 기능 +- [x] 게임 결과 출력 기능 - [ ] 게임 진행 상황 출력 기능 - [x] 덱 관리 기능 - [x] 보유한 카드 점수 합계 계산 기능 diff --git a/src/main/java/domain/Gamer.java b/src/main/java/domain/Gamer.java index f2d38df8e99..7cfe3248dbe 100644 --- a/src/main/java/domain/Gamer.java +++ b/src/main/java/domain/Gamer.java @@ -1,5 +1,7 @@ package domain; +import java.util.List; + public class Gamer { private final String name; private final HoldingCards holdingCards; @@ -23,4 +25,16 @@ private void validateCanDraw(SummationCardPoint thresholdPoint) { public SummationCardPoint getSummationCardPoint() { return holdingCards.calculateTotalPoint(); } + + public String getRawName() { + return name; + } + + public List getRawHoldingCards() { + return holdingCards.getHoldingCards(); + } + + public int getRawSummationCardPoint() { + return holdingCards.calculateTotalPoint().summationCardPoint(); + } } diff --git a/src/main/java/domain/HoldingCards.java b/src/main/java/domain/HoldingCards.java index 9e4ee02fa7e..7907f1f804a 100644 --- a/src/main/java/domain/HoldingCards.java +++ b/src/main/java/domain/HoldingCards.java @@ -25,4 +25,8 @@ public SummationCardPoint calculateTotalPoint() { public void add(Card card) { holdingCards.add(card); } + + List getHoldingCards() { + return holdingCards; + } } diff --git a/src/main/java/dto/GamerDTO.java b/src/main/java/dto/GamerDTO.java new file mode 100644 index 00000000000..fa5107482ce --- /dev/null +++ b/src/main/java/dto/GamerDTO.java @@ -0,0 +1,28 @@ +package dto; + +import domain.Card; +import java.util.List; + +public class GamerDTO { + private final String name; + private final List holdingCards; + private final int summationCardPoint; + + public GamerDTO(String name, List holdingCards, int summationCardPoint) { + this.name = name; + this.holdingCards = holdingCards; + this.summationCardPoint = summationCardPoint; + } + + public String getName() { + return name; + } + + public List getHoldingCards() { + return holdingCards; + } + + public int getSummationCardPoint() { + return summationCardPoint; + } +} diff --git a/src/main/java/view/GamerOutputView.java b/src/main/java/view/GamerOutputView.java new file mode 100644 index 00000000000..489941753f0 --- /dev/null +++ b/src/main/java/view/GamerOutputView.java @@ -0,0 +1,57 @@ +package view; + +import domain.Card; +import domain.CardName; +import domain.CardType; +import dto.GamerDTO; +import java.util.List; +import java.util.stream.Collectors; + +public class GamerOutputView { + + // jason카드: 7클로버, K스페이드 - 결과: 17 + public static void print(GamerDTO gamerDTO) { + String name = gamerDTO.getName(); + List cards = gamerDTO.getHoldingCards(); + int summationCardPoint = gamerDTO.getSummationCardPoint(); + + String nameOutput = name + "카드"; + String cardsOutput = cards.stream() + .map(card -> mapToString(card.cardType()) + mapToString(card.name())) + .collect(Collectors.joining(", ")); + String summationCardPointOutput = "결과: %d".formatted(summationCardPoint); + System.out.printf("%s: %s - %s\n", nameOutput, cardsOutput, summationCardPointOutput); + } + + private static String mapToString(CardType cardType) { + if (cardType == CardType.HEART) { + return "하트"; + } + if (cardType == CardType.SPADE) { + return "스페이드"; + } + if (cardType == CardType.CLOVER) { + return "클로버"; + } + if (cardType == CardType.DIAMOND) { + return "다이아몬드"; + } + throw new IllegalArgumentException("잘못된 카드 타입입니다."); + } + + private static String mapToString(CardName cardName) { + if (cardName == CardName.ACE) { + return "A"; + } + if (cardName == CardName.JACK) { + return "J"; + } + if (cardName == CardName.QUEEN) { + return "Q"; + } + if (cardName == CardName.KING) { + return "K"; + } + return String.valueOf(cardName.getCardNumber()); + } +} From 213a3f273215d78b52191bb2a5228bf6083809ea Mon Sep 17 00:00:00 2001 From: BurningFalls Date: Wed, 6 Mar 2024 15:17:28 +0900 Subject: [PATCH 15/56] =?UTF-8?q?docs:=20=EA=B8=B0=EB=8A=A5=20=EB=AA=A9?= =?UTF-8?q?=EB=A1=9D=20=EC=A0=95=EB=A6=AC?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- README.md | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/README.md b/README.md index 9e671e4d17e..82fe587928c 100644 --- a/README.md +++ b/README.md @@ -47,12 +47,12 @@ - [x] 플레이어 이름 입력 기능 - [x] 카드 점수 계산 기능 - [ ] Ace 카드 점수 보정 기능 -- [ ] 플레이어 턴 진행 기능 - [x] 플레이어 및 딜러 점수 계산 기능 - [x] 플레이어 및 딜러간 승부 계산 기능 -- [ ] 딜러 턴 진행 기능 +- [ ] 플레이어 및 딜러 손패 출력 기능 - [x] 게임 결과 출력 기능 -- [ ] 게임 진행 상황 출력 기능 +- [ ] 게임 승부 결과 출력 기능 - [x] 덱 관리 기능 - [x] 보유한 카드 점수 합계 계산 기능 - [x] 카드 받을지 여부 입력 기능 +- [ ] 전체 게임 진행 기능 From 77439a214980587a8f0a8f693425a9365052d6bf Mon Sep 17 00:00:00 2001 From: BurningFalls Date: Wed, 6 Mar 2024 15:29:20 +0900 Subject: [PATCH 16/56] =?UTF-8?q?feat:=20=ED=94=8C=EB=A0=88=EC=9D=B4?= =?UTF-8?q?=EC=96=B4=20=EB=B0=8F=20=EB=94=9C=EB=9F=AC=20=EC=86=90=ED=8C=A8?= =?UTF-8?q?=20=EC=B6=9C=EB=A0=A5=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 --- README.md | 2 +- src/main/java/view/GamerOutputView.java | 29 +++++++++++++++---------- 2 files changed, 19 insertions(+), 12 deletions(-) diff --git a/README.md b/README.md index 82fe587928c..45da63d0cd1 100644 --- a/README.md +++ b/README.md @@ -49,7 +49,7 @@ - [ ] Ace 카드 점수 보정 기능 - [x] 플레이어 및 딜러 점수 계산 기능 - [x] 플레이어 및 딜러간 승부 계산 기능 -- [ ] 플레이어 및 딜러 손패 출력 기능 +- [x] 플레이어 및 딜러 손패 출력 기능 - [x] 게임 결과 출력 기능 - [ ] 게임 승부 결과 출력 기능 - [x] 덱 관리 기능 diff --git a/src/main/java/view/GamerOutputView.java b/src/main/java/view/GamerOutputView.java index 489941753f0..3a6dfdad09a 100644 --- a/src/main/java/view/GamerOutputView.java +++ b/src/main/java/view/GamerOutputView.java @@ -9,18 +9,10 @@ public class GamerOutputView { - // jason카드: 7클로버, K스페이드 - 결과: 17 public static void print(GamerDTO gamerDTO) { - String name = gamerDTO.getName(); - List cards = gamerDTO.getHoldingCards(); - int summationCardPoint = gamerDTO.getSummationCardPoint(); - - String nameOutput = name + "카드"; - String cardsOutput = cards.stream() - .map(card -> mapToString(card.cardType()) + mapToString(card.name())) - .collect(Collectors.joining(", ")); - String summationCardPointOutput = "결과: %d".formatted(summationCardPoint); - System.out.printf("%s: %s - %s\n", nameOutput, cardsOutput, summationCardPointOutput); + String outputWithoutSummationCardPoint = generateOutputWithoutSummationCardPoint(gamerDTO); + String summationCardPointOutput = "결과: %d".formatted(gamerDTO.getSummationCardPoint()); + System.out.printf("%s - %s\n", outputWithoutSummationCardPoint, summationCardPointOutput); } private static String mapToString(CardType cardType) { @@ -54,4 +46,19 @@ private static String mapToString(CardName cardName) { } return String.valueOf(cardName.getCardNumber()); } + + public static void printWithoutSummationCardPoint(GamerDTO gamerDTO) { + String outputWithoutSummationCardPoint = generateOutputWithoutSummationCardPoint(gamerDTO); + System.out.println(outputWithoutSummationCardPoint); + } + + private static String generateOutputWithoutSummationCardPoint(GamerDTO gamerDTO) { + String name = gamerDTO.getName(); + List cards = gamerDTO.getHoldingCards(); + String nameOutput = name + "카드"; + String cardsOutput = cards.stream() + .map(card -> mapToString(card.cardType()) + mapToString(card.name())) + .collect(Collectors.joining(", ")); + return "%s: %s".formatted(nameOutput, cardsOutput); + } } From 453bb199c809a71087cd6f9b0a8e43c8af9b1343 Mon Sep 17 00:00:00 2001 From: BurningFalls Date: Wed, 6 Mar 2024 16:05:09 +0900 Subject: [PATCH 17/56] =?UTF-8?q?feat:=20=EA=B2=8C=EC=9E=84=20=EC=8A=B9?= =?UTF-8?q?=EB=B6=80=20=EA=B2=B0=EA=B3=BC=20=EC=B6=9C=EB=A0=A5=20=EA=B8=B0?= =?UTF-8?q?=EB=8A=A5=20=EA=B5=AC=ED=98=84?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- README.md | 2 +- src/main/java/dto/DealerGameResultDTO.java | 16 +++++++++ src/main/java/dto/GameResultDTO.java | 21 +++++++++++ src/main/java/view/GameResultOutputView.java | 38 ++++++++++++++++++++ 4 files changed, 76 insertions(+), 1 deletion(-) create mode 100644 src/main/java/dto/DealerGameResultDTO.java create mode 100644 src/main/java/dto/GameResultDTO.java create mode 100644 src/main/java/view/GameResultOutputView.java diff --git a/README.md b/README.md index 45da63d0cd1..76438250a6f 100644 --- a/README.md +++ b/README.md @@ -51,7 +51,7 @@ - [x] 플레이어 및 딜러간 승부 계산 기능 - [x] 플레이어 및 딜러 손패 출력 기능 - [x] 게임 결과 출력 기능 -- [ ] 게임 승부 결과 출력 기능 +- [x] 게임 승부 결과 출력 기능 - [x] 덱 관리 기능 - [x] 보유한 카드 점수 합계 계산 기능 - [x] 카드 받을지 여부 입력 기능 diff --git a/src/main/java/dto/DealerGameResultDTO.java b/src/main/java/dto/DealerGameResultDTO.java new file mode 100644 index 00000000000..807f5399fd6 --- /dev/null +++ b/src/main/java/dto/DealerGameResultDTO.java @@ -0,0 +1,16 @@ +package dto; + +import domain.GameResult; +import java.util.Map; + +public class DealerGameResultDTO { + private final Map dealerGameResultCounts; + + public DealerGameResultDTO(Map dealerGameResultCounts) { + this.dealerGameResultCounts = dealerGameResultCounts; + } + + public Map getDealerGameResultCounts() { + return dealerGameResultCounts; + } +} diff --git a/src/main/java/dto/GameResultDTO.java b/src/main/java/dto/GameResultDTO.java new file mode 100644 index 00000000000..02deac529ec --- /dev/null +++ b/src/main/java/dto/GameResultDTO.java @@ -0,0 +1,21 @@ +package dto; + +import domain.GameResult; + +public class GameResultDTO { + private final String gamerName; + private final GameResult gameResult; + + public GameResultDTO(String gamerName, GameResult gameResult) { + this.gamerName = gamerName; + this.gameResult = gameResult; + } + + public String getGamerName() { + return gamerName; + } + + public GameResult getGameResult() { + return gameResult; + } +} diff --git a/src/main/java/view/GameResultOutputView.java b/src/main/java/view/GameResultOutputView.java new file mode 100644 index 00000000000..7142c5968d1 --- /dev/null +++ b/src/main/java/view/GameResultOutputView.java @@ -0,0 +1,38 @@ +package view; + +import domain.GameResult; +import dto.DealerGameResultDTO; +import dto.GameResultDTO; +import java.util.Map; +import java.util.stream.Collectors; + +public class GameResultOutputView { + public static void print(GameResultDTO gameResultDTO) { + String gamerName = gameResultDTO.getGamerName(); + GameResult gameResult = gameResultDTO.getGameResult(); + System.out.printf("%s: %s\n", gamerName, mapToString(gameResult)); + } + + public static void print(DealerGameResultDTO dealerGameResultDTO) { + Map dealerGameResultCounts = dealerGameResultDTO.getDealerGameResultCounts(); + String output = dealerGameResultCounts.entrySet() + .stream() + .map(gameResultIntegerEntry -> + gameResultIntegerEntry.getValue() + mapToString(gameResultIntegerEntry.getKey())) + .collect(Collectors.joining(" ")); + System.out.printf("딜러: %s\n", output); + } + + private static String mapToString(GameResult gameResult) { + if (gameResult == GameResult.WIN) { + return "승"; + } + if (gameResult == GameResult.LOSE) { + return "패"; + } + if (gameResult == GameResult.TIE) { + return "무"; + } + throw new IllegalArgumentException("없는 승패 입니다."); + } +} From aa2a65e6c424aedac19822a6ae13fa0bec5c5dd0 Mon Sep 17 00:00:00 2001 From: BurningFalls Date: Wed, 6 Mar 2024 16:48:22 +0900 Subject: [PATCH 18/56] =?UTF-8?q?feat:=20=EC=A0=84=EC=B2=B4=20=EA=B2=8C?= =?UTF-8?q?=EC=9E=84=20=EC=A7=84=ED=96=89=20=EA=B8=B0=EB=8A=A5=20=EA=B5=AC?= =?UTF-8?q?=ED=98=84?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- README.md | 2 +- src/main/java/Main.java | 14 ++ .../java/controller/BlackjackController.java | 134 ++++++++++++++++++ src/main/java/domain/Deck.java | 11 ++ src/main/java/view/OutputView.java | 8 ++ 5 files changed, 168 insertions(+), 1 deletion(-) create mode 100644 src/main/java/Main.java create mode 100644 src/main/java/controller/BlackjackController.java create mode 100644 src/main/java/view/OutputView.java diff --git a/README.md b/README.md index 76438250a6f..74df6bbd649 100644 --- a/README.md +++ b/README.md @@ -55,4 +55,4 @@ - [x] 덱 관리 기능 - [x] 보유한 카드 점수 합계 계산 기능 - [x] 카드 받을지 여부 입력 기능 -- [ ] 전체 게임 진행 기능 +- [x] 전체 게임 진행 기능 diff --git a/src/main/java/Main.java b/src/main/java/Main.java new file mode 100644 index 00000000000..1620dc5d0ad --- /dev/null +++ b/src/main/java/Main.java @@ -0,0 +1,14 @@ +import controller.BlackjackController; +import domain.Deck; +import domain.Gamer; +import domain.HoldingCards; +import java.util.List; + +public class Main { + public static void main(String[] args) { + Gamer dealer = new Gamer("딜러", HoldingCards.of()); + Gamer player = new Gamer("aaa", HoldingCards.of()); + BlackjackController blackjackController = new BlackjackController(dealer, List.of(player)); + blackjackController.startBlackjackGame(Deck.fullDeck()); + } +} diff --git a/src/main/java/controller/BlackjackController.java b/src/main/java/controller/BlackjackController.java new file mode 100644 index 00000000000..27dbd7bfeeb --- /dev/null +++ b/src/main/java/controller/BlackjackController.java @@ -0,0 +1,134 @@ +package controller; + +import domain.Deck; +import domain.GameResult; +import domain.GameResultCalculator; +import domain.Gamer; +import domain.SummationCardPoint; +import dto.DealerGameResultDTO; +import dto.GameResultDTO; +import dto.GamerDTO; +import java.util.List; +import java.util.Map; +import java.util.Random; +import java.util.stream.Collectors; +import view.GameResultOutputView; +import view.GamerOutputView; +import view.OutputView; +import view.YNInputView; + +public class BlackjackController { + private final Gamer dealer; + private final List players; + + public BlackjackController(Gamer dealer, List players) { + this.dealer = dealer; + this.players = players; + } + + public void startBlackjackGame(Deck deck) { + initDealerAndPlayers(deck); + printDealerAndPlayers(); + + playersTryDraw(deck); + dealerTryDraw(deck); + + printDealerAndPlayersWithPoint(); + printDealerAndPlayersGameResult(); + } + + private void initDealerAndPlayers(Deck deck) { + dealerDraw(deck); + dealerDraw(deck); + players.forEach(player -> playerDraw(deck, player)); + players.forEach(player -> playerDraw(deck, player)); + OutputView.print("딜러와 pobi, jason에게 2장을 나누었습니다."); + } + + private void dealerDraw(Deck deck) { + dealer.draw(deck, cards -> { + Random random = new Random(); + int idx = random.nextInt(cards.size()); + return cards.get(idx); + }, new SummationCardPoint(16)); + } + + private void playerDraw(Deck deck, Gamer player) { + player.draw(deck, cards -> { + Random random = new Random(); + int idx = random.nextInt(cards.size()); + return cards.get(idx); + }, new SummationCardPoint(21)); + } + + private void printDealerAndPlayers() { + // TODO: 딜러의 카드 한장 숨기기 + GamerDTO dealerDTO = new GamerDTO(dealer.getRawName(), dealer.getRawHoldingCards(), + dealer.getRawSummationCardPoint()); + GamerOutputView.printWithoutSummationCardPoint(dealerDTO); + players.forEach(player -> { + GamerDTO gamerDTO = new GamerDTO(player.getRawName(), player.getRawHoldingCards(), + player.getRawSummationCardPoint()); + GamerOutputView.printWithoutSummationCardPoint(gamerDTO); + }); + } + + private void playersTryDraw(Deck deck) { + players.forEach(player -> { + playerTryDraw(deck, player); + }); + } + + private void playerTryDraw(Deck deck, Gamer player) { + boolean needToDraw = true; + //Todo 메서드 인덴트 줄이기 + while (needToDraw && canDraw(player, new SummationCardPoint(21))) { + OutputView.print("%s은(는) 한장의 카드를 더 받겠습니까?(예는 y, 아니오는 n)".formatted(player.getRawName())); + needToDraw = YNInputView.getYNAsBoolean(); + if (needToDraw) { + playerDraw(deck, player); + } + } + } + + private boolean canDraw(Gamer player, SummationCardPoint threshold) { + return !player.getSummationCardPoint().isBiggerThan(threshold); + } + + private void dealerTryDraw(Deck deck) { + int count = 0; + while (canDraw(dealer, new SummationCardPoint(16))) { + count++; + dealerDraw(deck); + } + if (count != 0) { + OutputView.print("딜러는 16이하라 " + count + "장의 카드를 더 받았습니다.\n"); + } + } + + private void printDealerAndPlayersWithPoint() { + GamerDTO gamerDTO = new GamerDTO(dealer.getRawName(), dealer.getRawHoldingCards(), + dealer.getRawSummationCardPoint()); + GamerOutputView.print(gamerDTO); + + players.forEach(player -> { + GamerDTO gamerDTO2 = new GamerDTO(player.getRawName(), player.getRawHoldingCards(), + player.getRawSummationCardPoint()); + GamerOutputView.print(gamerDTO2); + }); + } + + private void printDealerAndPlayersGameResult() { + Map dealerGameResultCounts = players.stream() + .collect(Collectors.groupingBy(player -> GameResultCalculator.calculate(dealer, player), + Collectors.summingInt(value -> 1))); + DealerGameResultDTO dealerGameResultDTO = new DealerGameResultDTO(dealerGameResultCounts); + + List gameResultDTOS = players.stream() + .map(player -> new GameResultDTO(player.getRawName(), GameResultCalculator.calculate(player, dealer))) + .toList(); + + GameResultOutputView.print(dealerGameResultDTO); + gameResultDTOS.forEach(GameResultOutputView::print); + } +} diff --git a/src/main/java/domain/Deck.java b/src/main/java/domain/Deck.java index a324fabce1a..ffeafb45645 100644 --- a/src/main/java/domain/Deck.java +++ b/src/main/java/domain/Deck.java @@ -18,6 +18,17 @@ public static Deck of(Card... cards) { return new Deck(tmpCards); } + public static Deck fullDeck() { + List cards = new ArrayList<>(); + for (CardType cardType : CardType.values()) { + for (CardName cardName : CardName.values()) { + Card card = new Card(cardName, cardType); + cards.add(card); + } + } + return new Deck(cards); + } + private void validateDuplicateCard(List cards) { Set cardSet = new HashSet<>(cards); if (cardSet.size() != cards.size()) { diff --git a/src/main/java/view/OutputView.java b/src/main/java/view/OutputView.java new file mode 100644 index 00000000000..df2236b1287 --- /dev/null +++ b/src/main/java/view/OutputView.java @@ -0,0 +1,8 @@ +package view; + +public class OutputView { + + public static void print(String output) { + System.out.println(output); + } +} From 56857011ccf59da552d20ee5d1a0917a2bed3d0f Mon Sep 17 00:00:00 2001 From: BurningFalls Date: Wed, 6 Mar 2024 17:11:28 +0900 Subject: [PATCH 19/56] =?UTF-8?q?fix:=20=EA=B2=8C=EC=9D=B4=EB=A8=B8?= =?UTF-8?q?=EA=B0=80=20=EC=A3=BD=EC=97=88=EC=9D=84=20=EA=B2=BD=EC=9A=B0=20?= =?UTF-8?q?=EC=8A=B9=EB=B6=80=EA=B0=80=20=EC=9E=98=EB=AA=BB=20=ED=8C=90?= =?UTF-8?q?=EB=8B=A8=EB=90=98=EB=8A=94=20=EC=98=A4=EB=A5=98=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 --- .../java/domain/GameResultCalculator.java | 9 ++++ src/main/java/domain/Gamer.java | 4 ++ .../java/domain/GameResultCalculatorTest.java | 46 ++++++++----------- src/test/java/domain/GamerTest.java | 28 ++++++++++- 4 files changed, 57 insertions(+), 30 deletions(-) diff --git a/src/main/java/domain/GameResultCalculator.java b/src/main/java/domain/GameResultCalculator.java index dc00557f00b..8b6009a88a0 100644 --- a/src/main/java/domain/GameResultCalculator.java +++ b/src/main/java/domain/GameResultCalculator.java @@ -9,6 +9,15 @@ public class GameResultCalculator { * @return baseGamer의 otherGamer 에 대한 승부 결과 */ public static GameResult calculate(Gamer baseGamer, Gamer otherGamer) { + if (baseGamer.isDead() && otherGamer.isDead()) { + return GameResult.TIE; + } + if (baseGamer.isDead()) { + return GameResult.LOSE; + } + if (otherGamer.isDead()) { + return GameResult.WIN; + } if (baseGamer.getSummationCardPoint().isBiggerThan(otherGamer.getSummationCardPoint())) { return GameResult.WIN; } diff --git a/src/main/java/domain/Gamer.java b/src/main/java/domain/Gamer.java index 7cfe3248dbe..42e92fedaf1 100644 --- a/src/main/java/domain/Gamer.java +++ b/src/main/java/domain/Gamer.java @@ -37,4 +37,8 @@ public List getRawHoldingCards() { public int getRawSummationCardPoint() { return holdingCards.calculateTotalPoint().summationCardPoint(); } + + public boolean isDead() { + return holdingCards.calculateTotalPoint().isBiggerThan(new SummationCardPoint(21)); + } } diff --git a/src/test/java/domain/GameResultCalculatorTest.java b/src/test/java/domain/GameResultCalculatorTest.java index 3574c733865..3ff362f0ad6 100644 --- a/src/test/java/domain/GameResultCalculatorTest.java +++ b/src/test/java/domain/GameResultCalculatorTest.java @@ -1,5 +1,9 @@ package domain; +import static domain.GameResult.LOSE; +import static domain.GameResult.TIE; +import static domain.GameResult.WIN; + import java.util.stream.Stream; import org.assertj.core.api.Assertions; import org.junit.jupiter.api.DisplayName; @@ -8,39 +12,25 @@ import org.junit.jupiter.params.provider.MethodSource; class GameResultCalculatorTest { + private static final HoldingCards ONLY_SIX_HEART = HoldingCards.of(new Card(CardName.SIX, CardType.HEART)); + private static final HoldingCards ONLY_SEVEN_HEART = HoldingCards.of(new Card(CardName.SEVEN, CardType.HEART)); + private static final HoldingCards DEAD_CARDS = HoldingCards.of( + new Card(CardName.JACK, CardType.HEART), + new Card(CardName.QUEEN, CardType.HEART), + new Card(CardName.TWO, CardType.HEART) + ); + public static Stream getGameResultParameters() { return Stream.of( - Arguments.of( - new Gamer("게이머1", HoldingCards.of( - new Card(CardName.SEVEN, CardType.HEART) - )), - new Gamer("게이머2", HoldingCards.of( - new Card(CardName.SIX, CardType.HEART) - )), - GameResult.WIN - ), - Arguments.of( - new Gamer("게이머1", HoldingCards.of( - new Card(CardName.SIX, CardType.HEART) - )), - new Gamer("게이머2", HoldingCards.of( - new Card(CardName.SEVEN, CardType.HEART) - )), - GameResult.LOSE - ), - Arguments.of( - new Gamer("게이머1", HoldingCards.of( - new Card(CardName.SEVEN, CardType.HEART) - )), - new Gamer("게이머2", HoldingCards.of( - new Card(CardName.SEVEN, CardType.DIAMOND) - )), - GameResult.TIE - ) + Arguments.of(new Gamer("게이머1", ONLY_SEVEN_HEART), new Gamer("게이머2", ONLY_SIX_HEART), WIN), + Arguments.of(new Gamer("게이머1", ONLY_SIX_HEART), new Gamer("게이머2", ONLY_SEVEN_HEART), LOSE), + Arguments.of(new Gamer("게이머1", ONLY_SEVEN_HEART), new Gamer("게이머2", ONLY_SEVEN_HEART), TIE), + Arguments.of(new Gamer("게이머1", DEAD_CARDS), new Gamer("게이머2", ONLY_SEVEN_HEART), LOSE), + Arguments.of(new Gamer("게이머1", ONLY_SEVEN_HEART), new Gamer("게이머2", DEAD_CARDS), WIN), + Arguments.of(new Gamer("게이머1", DEAD_CARDS), new Gamer("게이머2", DEAD_CARDS), TIE) ); } - @ParameterizedTest @MethodSource("getGameResultParameters") @DisplayName("승부가 잘 결정되는지 검증") diff --git a/src/test/java/domain/GamerTest.java b/src/test/java/domain/GamerTest.java index e4c0ec3a2dc..1951af18d5d 100644 --- a/src/test/java/domain/GamerTest.java +++ b/src/test/java/domain/GamerTest.java @@ -1,11 +1,22 @@ package domain; +import java.util.stream.Stream; import org.assertj.core.api.Assertions; import org.junit.jupiter.api.DisplayName; import org.junit.jupiter.api.Test; +import org.junit.jupiter.params.ParameterizedTest; +import org.junit.jupiter.params.provider.Arguments; +import org.junit.jupiter.params.provider.MethodSource; class GamerTest { + public static Stream isDeadParameters() { + return Stream.of( + Arguments.of(new Card(CardName.TWO, CardType.HEART), true), + Arguments.of(new Card(CardName.ACE, CardType.HEART), false) + ); + } + @Test @DisplayName("게임 참가자가 카드를 뽑았을 때 점수가 올바르게 계산되는지 검증") void draw() { @@ -40,7 +51,7 @@ void validateDrawLimit() { @Test @DisplayName("딜러는 총합이 16이 넘으면 카드를 뽑을 수 없는지 검증") void validateDealerDrawLimit() { - Gamer Gamer = new Gamer("robin", HoldingCards.of( + Gamer gamer = new Gamer("robin", HoldingCards.of( new Card(CardName.JACK, CardType.HEART), new Card(CardName.SEVEN, CardType.HEART) )); @@ -48,8 +59,21 @@ void validateDealerDrawLimit() { new Card(CardName.TWO, CardType.SPADE) ); - Assertions.assertThatThrownBy(() -> Gamer.draw(deck, cards -> cards.get(0), new SummationCardPoint(16))) + Assertions.assertThatThrownBy(() -> gamer.draw(deck, cards -> cards.get(0), new SummationCardPoint(16))) .isInstanceOf(IllegalStateException.class) .hasMessage("카드를 더이상 뽑을 수 없습니다."); } + + @ParameterizedTest + @MethodSource("isDeadParameters") + @DisplayName("게이머의 점수가 21이 넘으면 죽었다고 판단하는지 검증") + void isDead(Card additionalCard, boolean expected) { + Gamer gamer = new Gamer("robin", HoldingCards.of( + new Card(CardName.JACK, CardType.HEART), + new Card(CardName.QUEEN, CardType.HEART), + additionalCard + )); + + Assertions.assertThat(gamer.isDead()).isEqualTo(expected); + } } From c6e7564d9d42b5a06aa68ec3ac27cbeaf84bc52b Mon Sep 17 00:00:00 2001 From: BurningFalls Date: Wed, 6 Mar 2024 17:56:02 +0900 Subject: [PATCH 20/56] =?UTF-8?q?feat:=20Ace=20=EC=B9=B4=EB=93=9C=20?= =?UTF-8?q?=EC=A0=90=EC=88=98=20=EB=B3=B4=EC=A0=95=20=EA=B8=B0=EB=8A=A5=20?= =?UTF-8?q?=EA=B5=AC=ED=98=84?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- README.md | 2 +- .../java/domain/GameResultCalculator.java | 28 +++++++++++++++++-- src/main/java/domain/Gamer.java | 8 ++++++ src/main/java/domain/HoldingCards.java | 11 ++++++++ .../java/domain/GameResultCalculatorTest.java | 20 ++++++++++++- src/test/java/domain/HoldingCardsTest.java | 15 ++++++++++ 6 files changed, 80 insertions(+), 4 deletions(-) diff --git a/README.md b/README.md index 74df6bbd649..5b3e3f9257e 100644 --- a/README.md +++ b/README.md @@ -46,7 +46,7 @@ - [x] 플레이어 이름 입력 기능 - [x] 카드 점수 계산 기능 -- [ ] Ace 카드 점수 보정 기능 +- [x] Ace 카드 점수 보정 기능 - [x] 플레이어 및 딜러 점수 계산 기능 - [x] 플레이어 및 딜러간 승부 계산 기능 - [x] 플레이어 및 딜러 손패 출력 기능 diff --git a/src/main/java/domain/GameResultCalculator.java b/src/main/java/domain/GameResultCalculator.java index 8b6009a88a0..410e68aff6f 100644 --- a/src/main/java/domain/GameResultCalculator.java +++ b/src/main/java/domain/GameResultCalculator.java @@ -18,12 +18,36 @@ public static GameResult calculate(Gamer baseGamer, Gamer otherGamer) { if (otherGamer.isDead()) { return GameResult.WIN; } - if (baseGamer.getSummationCardPoint().isBiggerThan(otherGamer.getSummationCardPoint())) { + + // ??? + + SummationCardPoint baseGamerSummationCardPoint = fix(baseGamer); + SummationCardPoint otherGamerSummationCardPoint = fix(otherGamer); + + if (baseGamerSummationCardPoint.isBiggerThan(otherGamerSummationCardPoint)) { return GameResult.WIN; } - if (baseGamer.getSummationCardPoint().equals(otherGamer.getSummationCardPoint())) { + if (baseGamerSummationCardPoint.equals(otherGamerSummationCardPoint)) { return GameResult.TIE; } return GameResult.LOSE; } + + private static SummationCardPoint fix(Gamer gamer) { + int rawPoint = gamer.getSummationCardPoint().summationCardPoint(); + + if (gamer.hasAceInHoldingCards()) { + rawPoint = fixPoint(rawPoint); + return new SummationCardPoint(rawPoint); + } + return gamer.getSummationCardPoint(); + } + + private static int fixPoint(int rawPoint) { + int fixPoint = rawPoint + 10; + if (fixPoint <= 21) { + rawPoint = fixPoint; + } + return rawPoint; + } } diff --git a/src/main/java/domain/Gamer.java b/src/main/java/domain/Gamer.java index 42e92fedaf1..f899a4c5bd0 100644 --- a/src/main/java/domain/Gamer.java +++ b/src/main/java/domain/Gamer.java @@ -41,4 +41,12 @@ public int getRawSummationCardPoint() { public boolean isDead() { return holdingCards.calculateTotalPoint().isBiggerThan(new SummationCardPoint(21)); } + + int countOfAceInHoldingCards() { + return holdingCards.countOfAce(); + } + + boolean hasAceInHoldingCards() { + return holdingCards.hasAce(); + } } diff --git a/src/main/java/domain/HoldingCards.java b/src/main/java/domain/HoldingCards.java index 7907f1f804a..3931eb13ebf 100644 --- a/src/main/java/domain/HoldingCards.java +++ b/src/main/java/domain/HoldingCards.java @@ -29,4 +29,15 @@ public void add(Card card) { List getHoldingCards() { return holdingCards; } + + int countOfAce() { + return (int) holdingCards.stream() + .filter(card -> card.name() == CardName.ACE) + .count(); + } + + boolean hasAce() { + return holdingCards.stream() + .anyMatch(card -> card.name() == CardName.ACE); + } } diff --git a/src/test/java/domain/GameResultCalculatorTest.java b/src/test/java/domain/GameResultCalculatorTest.java index 3ff362f0ad6..ee07b4e3931 100644 --- a/src/test/java/domain/GameResultCalculatorTest.java +++ b/src/test/java/domain/GameResultCalculatorTest.java @@ -20,6 +20,22 @@ class GameResultCalculatorTest { new Card(CardName.TWO, CardType.HEART) ); + private static final HoldingCards WIN_CARDS_WITH_ACE = HoldingCards.of( + new Card(CardName.ACE, CardType.HEART), + new Card(CardName.QUEEN, CardType.HEART) + ); + + private static final HoldingCards WIN_CARDS_WITHOUT_ACE = HoldingCards.of( + new Card(CardName.JACK, CardType.HEART), + new Card(CardName.NINE, CardType.HEART), + new Card(CardName.TWO, CardType.HEART) + ); + + private static final HoldingCards TWO_SIX_CARDS = HoldingCards.of( + new Card(CardName.SIX, CardType.HEART), + new Card(CardName.SIX, CardType.DIAMOND) + ); + public static Stream getGameResultParameters() { return Stream.of( Arguments.of(new Gamer("게이머1", ONLY_SEVEN_HEART), new Gamer("게이머2", ONLY_SIX_HEART), WIN), @@ -27,7 +43,9 @@ public static Stream getGameResultParameters() { Arguments.of(new Gamer("게이머1", ONLY_SEVEN_HEART), new Gamer("게이머2", ONLY_SEVEN_HEART), TIE), Arguments.of(new Gamer("게이머1", DEAD_CARDS), new Gamer("게이머2", ONLY_SEVEN_HEART), LOSE), Arguments.of(new Gamer("게이머1", ONLY_SEVEN_HEART), new Gamer("게이머2", DEAD_CARDS), WIN), - Arguments.of(new Gamer("게이머1", DEAD_CARDS), new Gamer("게이머2", DEAD_CARDS), TIE) + Arguments.of(new Gamer("게이머1", DEAD_CARDS), new Gamer("게이머2", DEAD_CARDS), TIE), + Arguments.of(new Gamer("게이머1", WIN_CARDS_WITH_ACE), new Gamer("게이머2", TWO_SIX_CARDS), WIN), + Arguments.of(new Gamer("게이머1", WIN_CARDS_WITH_ACE), new Gamer("게이머2", WIN_CARDS_WITHOUT_ACE), TIE) ); } diff --git a/src/test/java/domain/HoldingCardsTest.java b/src/test/java/domain/HoldingCardsTest.java index 1863fe71ba6..406ed709834 100644 --- a/src/test/java/domain/HoldingCardsTest.java +++ b/src/test/java/domain/HoldingCardsTest.java @@ -27,4 +27,19 @@ void calculateTotalPoint() { Assertions.assertThat(actual).isEqualTo(expected); } + + @Test + @DisplayName("Ace 개수가 잘 세어지는지 검증") + void countOfAce() { + HoldingCards holdingCards = HoldingCards.of(new Card(CardName.ACE, CardType.HEART)); + Assertions.assertThat(holdingCards.countOfAce()) + .isEqualTo(1); + } + + @Test + @DisplayName("Ace가 포함되었는지 여부 검증") + void hasAce() { + HoldingCards holdingCards = HoldingCards.of(new Card(CardName.ACE, CardType.HEART)); + Assertions.assertThat(holdingCards.hasAce()).isTrue(); + } } From 9f15cc9d16257491cd6813b50bd1fd99e3845acd Mon Sep 17 00:00:00 2001 From: BurningFalls Date: Thu, 7 Mar 2024 10:48:13 +0900 Subject: [PATCH 21/56] =?UTF-8?q?docs:=20TODO=20=EB=AA=A9=EB=A1=9D=20?= =?UTF-8?q?=EC=A0=95=EB=A6=AC?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- src/main/java/controller/BlackjackController.java | 13 +++++++++++-- src/main/java/domain/CardName.java | 1 + src/main/java/domain/CardPointCalculator.java | 1 + src/main/java/domain/Deck.java | 5 ++++- src/main/java/domain/GameResultCalculator.java | 5 ++++- src/main/java/domain/Gamer.java | 4 ++++ src/main/java/domain/HoldingCards.java | 2 ++ src/main/java/domain/SummationCardPoint.java | 2 ++ src/main/java/view/Console.java | 3 ++- src/main/java/view/GameResultOutputView.java | 4 ++++ src/main/java/view/GamerOutputView.java | 2 ++ src/main/java/view/NameInputView.java | 1 + src/main/java/view/YNInputView.java | 1 + src/test/java/domain/CardPointCalculatorTest.java | 2 +- src/test/java/domain/GamerTest.java | 1 + 15 files changed, 41 insertions(+), 6 deletions(-) diff --git a/src/main/java/controller/BlackjackController.java b/src/main/java/controller/BlackjackController.java index 27dbd7bfeeb..16683b789dc 100644 --- a/src/main/java/controller/BlackjackController.java +++ b/src/main/java/controller/BlackjackController.java @@ -37,6 +37,7 @@ public void startBlackjackGame(Deck deck) { printDealerAndPlayersGameResult(); } + // TODO: 메시지 OutputView에서 처리 private void initDealerAndPlayers(Deck deck) { dealerDraw(deck); dealerDraw(deck); @@ -45,6 +46,8 @@ private void initDealerAndPlayers(Deck deck) { OutputView.print("딜러와 pobi, jason에게 2장을 나누었습니다."); } + // TODO: 16 상수화 + // TODO: 랜덤으로 카드 뽑는 전략 함수화 (아래랑 중복) private void dealerDraw(Deck deck) { dealer.draw(deck, cards -> { Random random = new Random(); @@ -53,6 +56,7 @@ private void dealerDraw(Deck deck) { }, new SummationCardPoint(16)); } + // TODO: 21 상수화 private void playerDraw(Deck deck, Gamer player) { player.draw(deck, cards -> { Random random = new Random(); @@ -61,8 +65,8 @@ private void playerDraw(Deck deck, Gamer player) { }, new SummationCardPoint(21)); } + // TODO: 딜러의 카드 한장 숨기기 private void printDealerAndPlayers() { - // TODO: 딜러의 카드 한장 숨기기 GamerDTO dealerDTO = new GamerDTO(dealer.getRawName(), dealer.getRawHoldingCards(), dealer.getRawSummationCardPoint()); GamerOutputView.printWithoutSummationCardPoint(dealerDTO); @@ -79,9 +83,10 @@ private void playersTryDraw(Deck deck) { }); } + // TODO: 메서드 인덴트 줄이기 + // TODO: 메시지 OutputView에서 처리 private void playerTryDraw(Deck deck, Gamer player) { boolean needToDraw = true; - //Todo 메서드 인덴트 줄이기 while (needToDraw && canDraw(player, new SummationCardPoint(21))) { OutputView.print("%s은(는) 한장의 카드를 더 받겠습니까?(예는 y, 아니오는 n)".formatted(player.getRawName())); needToDraw = YNInputView.getYNAsBoolean(); @@ -95,6 +100,8 @@ private boolean canDraw(Gamer player, SummationCardPoint threshold) { return !player.getSummationCardPoint().isBiggerThan(threshold); } + // TODO: 장 수를 그대로 숫자로 처리 할 것인지 고민 + // TODO: 메시지 OutputView에서 처리 private void dealerTryDraw(Deck deck) { int count = 0; while (canDraw(dealer, new SummationCardPoint(16))) { @@ -106,6 +113,8 @@ private void dealerTryDraw(Deck deck) { } } + // TODO: printDealerAndPlayers 메서드와 DTO 선언부 중복 + // TODO: gamerDTO2 변수명 변경 private void printDealerAndPlayersWithPoint() { GamerDTO gamerDTO = new GamerDTO(dealer.getRawName(), dealer.getRawHoldingCards(), dealer.getRawSummationCardPoint()); diff --git a/src/main/java/domain/CardName.java b/src/main/java/domain/CardName.java index edd37d640fa..fd3cf7adcd2 100644 --- a/src/main/java/domain/CardName.java +++ b/src/main/java/domain/CardName.java @@ -1,5 +1,6 @@ package domain; +// TODO: 인덴트 수정 public enum CardName { ACE(1), TWO(2), diff --git a/src/main/java/domain/CardPointCalculator.java b/src/main/java/domain/CardPointCalculator.java index 91a05db9f67..3f9b7c3303b 100644 --- a/src/main/java/domain/CardPointCalculator.java +++ b/src/main/java/domain/CardPointCalculator.java @@ -1,5 +1,6 @@ package domain; +// TODO: cardName.getCardNumber() 중복 public class CardPointCalculator { public static CardPoint calculate(Card card) { CardName cardName = card.name(); diff --git a/src/main/java/domain/Deck.java b/src/main/java/domain/Deck.java index ffeafb45645..84f81d51dd5 100644 --- a/src/main/java/domain/Deck.java +++ b/src/main/java/domain/Deck.java @@ -7,17 +7,20 @@ public class Deck { private final List cards; - + private Deck(List cards) { validateDuplicateCard(cards); this.cards = cards; } + // TODO: tmpCards 변수명 변경 + // TODO: 아래 팩토리 메서드처럼 의미있는 이름으로 변경 public static Deck of(Card... cards) { List tmpCards = new ArrayList<>(List.of(cards)); return new Deck(tmpCards); } + // TODO: 인덴트 줄이기 public static Deck fullDeck() { List cards = new ArrayList<>(); for (CardType cardType : CardType.values()) { diff --git a/src/main/java/domain/GameResultCalculator.java b/src/main/java/domain/GameResultCalculator.java index 410e68aff6f..03cd26ac1c0 100644 --- a/src/main/java/domain/GameResultCalculator.java +++ b/src/main/java/domain/GameResultCalculator.java @@ -8,6 +8,7 @@ public class GameResultCalculator { * @param otherGamer 상대 게이머 * @return baseGamer의 otherGamer 에 대한 승부 결과 */ + // TODO: 메서드 분리 필요 public static GameResult calculate(Gamer baseGamer, Gamer otherGamer) { if (baseGamer.isDead() && otherGamer.isDead()) { return GameResult.TIE; @@ -19,7 +20,7 @@ public static GameResult calculate(Gamer baseGamer, Gamer otherGamer) { return GameResult.WIN; } - // ??? + // TODO: 딜러가 Ace를 가지고 있는 경우 고려해야 함 SummationCardPoint baseGamerSummationCardPoint = fix(baseGamer); SummationCardPoint otherGamerSummationCardPoint = fix(otherGamer); @@ -33,6 +34,7 @@ public static GameResult calculate(Gamer baseGamer, Gamer otherGamer) { return GameResult.LOSE; } + // TODO: 메서드명 변경 필요 private static SummationCardPoint fix(Gamer gamer) { int rawPoint = gamer.getSummationCardPoint().summationCardPoint(); @@ -43,6 +45,7 @@ private static SummationCardPoint fix(Gamer gamer) { return gamer.getSummationCardPoint(); } + // TODO: 메서드명, 변수명 변경 필요 private static int fixPoint(int rawPoint) { int fixPoint = rawPoint + 10; if (fixPoint <= 21) { diff --git a/src/main/java/domain/Gamer.java b/src/main/java/domain/Gamer.java index f899a4c5bd0..d19169fa9d2 100644 --- a/src/main/java/domain/Gamer.java +++ b/src/main/java/domain/Gamer.java @@ -34,6 +34,9 @@ public List getRawHoldingCards() { return holdingCards.getHoldingCards(); } + // TODO: getSummationCardPoint -> 프로그램의 동작을 위한 메서드 + // TODO: getRawSummationCardPoint -> DTO를 위한 메서드 + // TODO: holdingCards.calculateTotalPoint()를 내부 메서드로 만들기 (. 줄이고 가시성 향상) public int getRawSummationCardPoint() { return holdingCards.calculateTotalPoint().summationCardPoint(); } @@ -42,6 +45,7 @@ public boolean isDead() { return holdingCards.calculateTotalPoint().isBiggerThan(new SummationCardPoint(21)); } + // TODO: 안쓰이는 메서드 int countOfAceInHoldingCards() { return holdingCards.countOfAce(); } diff --git a/src/main/java/domain/HoldingCards.java b/src/main/java/domain/HoldingCards.java index 3931eb13ebf..dd19fbded04 100644 --- a/src/main/java/domain/HoldingCards.java +++ b/src/main/java/domain/HoldingCards.java @@ -10,6 +10,7 @@ private HoldingCards(List holdingCards) { this.holdingCards = holdingCards; } + // TODO: 팩토리 메서드 변수명 변경?? public static HoldingCards of(Card... cards) { return new HoldingCards(new ArrayList<>(List.of(cards))); } @@ -30,6 +31,7 @@ List getHoldingCards() { return holdingCards; } + // TODO: countOfAce 메서드가 쓰이는가? 아래 hasAce로 충분한 듯 보임. int countOfAce() { return (int) holdingCards.stream() .filter(card -> card.name() == CardName.ACE) diff --git a/src/main/java/domain/SummationCardPoint.java b/src/main/java/domain/SummationCardPoint.java index 4d8eabc6fde..15ee936aefa 100644 --- a/src/main/java/domain/SummationCardPoint.java +++ b/src/main/java/domain/SummationCardPoint.java @@ -4,6 +4,8 @@ public record SummationCardPoint(int summationCardPoint) { + // TODO: 디폴트 생성자의 제한자가 public으로 되어버리는데, class로 만드는 것이 더 낫지 않을까 + // TODO: record로 해버리니 get 함수 이름이 .summationCardPoint가 되어 버리는데, 이를 사용하는 곳에서 가시성이 많이 떨어짐 public static SummationCardPoint of(List cardPoints) { int summationCardPoint = cardPoints.stream() .mapToInt(CardPoint::point) diff --git a/src/main/java/view/Console.java b/src/main/java/view/Console.java index 398cce8a352..0c70d727e53 100644 --- a/src/main/java/view/Console.java +++ b/src/main/java/view/Console.java @@ -4,8 +4,9 @@ import java.io.IOException; import java.io.InputStreamReader; +// TODO: 인덴트 수정 public class Console { - + public static String getInputFromConsole() { BufferedReader bufferedReader = new BufferedReader(new InputStreamReader(System.in)); String input; diff --git a/src/main/java/view/GameResultOutputView.java b/src/main/java/view/GameResultOutputView.java index 7142c5968d1..a66d24491c6 100644 --- a/src/main/java/view/GameResultOutputView.java +++ b/src/main/java/view/GameResultOutputView.java @@ -7,12 +7,15 @@ import java.util.stream.Collectors; public class GameResultOutputView { + // TODO: int gameResult = mapToString(gameResultDTO.getGameResult()); public static void print(GameResultDTO gameResultDTO) { String gamerName = gameResultDTO.getGamerName(); GameResult gameResult = gameResultDTO.getGameResult(); System.out.printf("%s: %s\n", gamerName, mapToString(gameResult)); } + // TODO: gameResultIntegerEntry 변수명 단순하게 수정 가능할듯 + // TODO: output 변수명 수정 public static void print(DealerGameResultDTO dealerGameResultDTO) { Map dealerGameResultCounts = dealerGameResultDTO.getDealerGameResultCounts(); String output = dealerGameResultCounts.entrySet() @@ -23,6 +26,7 @@ public static void print(DealerGameResultDTO dealerGameResultDTO) { System.out.printf("딜러: %s\n", output); } + // TODO: 메서드명 수정 private static String mapToString(GameResult gameResult) { if (gameResult == GameResult.WIN) { return "승"; diff --git a/src/main/java/view/GamerOutputView.java b/src/main/java/view/GamerOutputView.java index 3a6dfdad09a..0411e07924e 100644 --- a/src/main/java/view/GamerOutputView.java +++ b/src/main/java/view/GamerOutputView.java @@ -15,6 +15,7 @@ public static void print(GamerDTO gamerDTO) { System.out.printf("%s - %s\n", outputWithoutSummationCardPoint, summationCardPointOutput); } + // TODO: 메서드 라인 10줄 맞추기 private static String mapToString(CardType cardType) { if (cardType == CardType.HEART) { return "하트"; @@ -31,6 +32,7 @@ private static String mapToString(CardType cardType) { throw new IllegalArgumentException("잘못된 카드 타입입니다."); } + // TODO: 메서드 라인 10줄 맞추기 private static String mapToString(CardName cardName) { if (cardName == CardName.ACE) { return "A"; diff --git a/src/main/java/view/NameInputView.java b/src/main/java/view/NameInputView.java index f07e2228060..f13e9c74c02 100644 --- a/src/main/java/view/NameInputView.java +++ b/src/main/java/view/NameInputView.java @@ -6,6 +6,7 @@ public class NameInputView { private static final String SEPARATOR = ","; + // TODO: 배열 대신 컬렉션 사용하기 (요구사항) public static List getNames() { String input = Console.getInputFromConsole(); validateSeparator(input); diff --git a/src/main/java/view/YNInputView.java b/src/main/java/view/YNInputView.java index da29e7b8756..067613b14b7 100644 --- a/src/main/java/view/YNInputView.java +++ b/src/main/java/view/YNInputView.java @@ -1,5 +1,6 @@ package view; +// TODO: 클래스명 수정 public class YNInputView { public static Boolean getYNAsBoolean() { diff --git a/src/test/java/domain/CardPointCalculatorTest.java b/src/test/java/domain/CardPointCalculatorTest.java index 369f20ccf90..4439c67a942 100644 --- a/src/test/java/domain/CardPointCalculatorTest.java +++ b/src/test/java/domain/CardPointCalculatorTest.java @@ -11,7 +11,7 @@ class CardPointCalculatorTest { - //ToDo 메서드 분리 완전 필요 + // TODO: 메서드 분리 및 정리 필요 static Stream calculateParameter() { List arguments = new ArrayList<>(); for (CardType cardType : CardType.values()) { diff --git a/src/test/java/domain/GamerTest.java b/src/test/java/domain/GamerTest.java index 1951af18d5d..46438984227 100644 --- a/src/test/java/domain/GamerTest.java +++ b/src/test/java/domain/GamerTest.java @@ -8,6 +8,7 @@ import org.junit.jupiter.params.provider.Arguments; import org.junit.jupiter.params.provider.MethodSource; +// TODO: GameResultCalculateTest처럼 인스턴스 변수 정의 필요 class GamerTest { public static Stream isDeadParameters() { From 3b47a6dd22c79276d58caef9c787f15c56595859 Mon Sep 17 00:00:00 2001 From: BurningFalls Date: Thu, 7 Mar 2024 10:55:15 +0900 Subject: [PATCH 22/56] =?UTF-8?q?fix:=20Main=20=EB=A9=94=EC=84=9C=EB=93=9C?= =?UTF-8?q?=EC=97=90=EC=84=9C=20=ED=94=8C=EB=A0=88=EC=9D=B4=EC=96=B4=20?= =?UTF-8?q?=EC=9D=B4=EB=A6=84=EC=9D=84=20=EC=9E=85=EB=A0=A5=EB=B0=9B?= =?UTF-8?q?=EC=A7=80=20=EC=95=8A=EB=8A=94=20=EC=98=A4=EB=A5=98=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 --- src/main/java/Main.java | 9 +++++++-- src/main/java/view/NameInputView.java | 10 ++++------ 2 files changed, 11 insertions(+), 8 deletions(-) diff --git a/src/main/java/Main.java b/src/main/java/Main.java index 1620dc5d0ad..7f1bb25be4d 100644 --- a/src/main/java/Main.java +++ b/src/main/java/Main.java @@ -3,12 +3,17 @@ import domain.Gamer; import domain.HoldingCards; import java.util.List; +import view.NameInputView; +import view.OutputView; public class Main { public static void main(String[] args) { Gamer dealer = new Gamer("딜러", HoldingCards.of()); - Gamer player = new Gamer("aaa", HoldingCards.of()); - BlackjackController blackjackController = new BlackjackController(dealer, List.of(player)); + OutputView.print("게임에 참여할 사람의 이름을 입력하세요.(쉼표 기준으로 분리)"); + List players = NameInputView.getNames().stream() + .map(name -> new Gamer(name, HoldingCards.of())) + .toList(); + BlackjackController blackjackController = new BlackjackController(dealer, players); blackjackController.startBlackjackGame(Deck.fullDeck()); } } diff --git a/src/main/java/view/NameInputView.java b/src/main/java/view/NameInputView.java index f13e9c74c02..8a8e6001d4f 100644 --- a/src/main/java/view/NameInputView.java +++ b/src/main/java/view/NameInputView.java @@ -1,18 +1,16 @@ package view; -import java.util.Arrays; import java.util.List; public class NameInputView { private static final String SEPARATOR = ","; - // TODO: 배열 대신 컬렉션 사용하기 (요구사항) public static List getNames() { String input = Console.getInputFromConsole(); validateSeparator(input); - String[] splitInput = input.split(SEPARATOR); + List splitInput = List.of(input.split(SEPARATOR)); validateBlank(splitInput); - return Arrays.stream(splitInput).toList(); + return splitInput; } private static void validateSeparator(String input) { @@ -21,8 +19,8 @@ private static void validateSeparator(String input) { } } - private static void validateBlank(String[] split) { - boolean isInputContainsBlank = Arrays.stream(split).anyMatch(String::isBlank); + private static void validateBlank(List split) { + boolean isInputContainsBlank = split.stream().anyMatch(String::isBlank); if (isInputContainsBlank) { throw new IllegalArgumentException("입력 형식이 올바르지 않습니다."); } From a1b7720ffddbd5a74efe10523b08d39f0d0a58d5 Mon Sep 17 00:00:00 2001 From: BurningFalls Date: Thu, 7 Mar 2024 10:55:50 +0900 Subject: [PATCH 23/56] =?UTF-8?q?docs:=20=EB=94=9C=EB=9F=AC=20Ace=20?= =?UTF-8?q?=EC=B9=B4=EB=93=9C=20=EC=A0=90=EC=88=98=20=EB=B3=B4=EC=A0=95=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 --- README.md | 1 + 1 file changed, 1 insertion(+) diff --git a/README.md b/README.md index 5b3e3f9257e..1c8f8b42fa7 100644 --- a/README.md +++ b/README.md @@ -56,3 +56,4 @@ - [x] 보유한 카드 점수 합계 계산 기능 - [x] 카드 받을지 여부 입력 기능 - [x] 전체 게임 진행 기능 +- [ ] 딜러 Ace 카드 점수 보정 기능 From 3502c5d84b08ac1aeee71681dfee0c54d6b11aee Mon Sep 17 00:00:00 2001 From: BurningFalls Date: Thu, 7 Mar 2024 15:39:16 +0900 Subject: [PATCH 24/56] =?UTF-8?q?feat:=20=EB=94=9C=EB=9F=AC=20Ace=20?= =?UTF-8?q?=EC=B9=B4=EB=93=9C=20=EC=A0=90=EC=88=98=20=EB=B3=B4=EC=A0=95=20?= =?UTF-8?q?=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 --- README.md | 2 +- .../java/controller/BlackjackController.java | 25 +++++-------- .../AbstractRandomCardDrawStrategy.java | 22 ++++++++++++ .../domain/DealerRandomCardDrawStrategy.java | 15 ++++++++ .../java/domain/GameResultCalculator.java | 27 ++------------ src/main/java/domain/Gamer.java | 32 +++++++++-------- .../domain/PlayerRandomCardDrawStrategy.java | 14 ++++++++ .../domain/DealerCardDrawStrategyTest.java | 36 +++++++++++++++++++ src/test/java/domain/GamerTest.java | 6 ++-- .../domain/TestDealerCardDrawStrategy.java | 27 ++++++++++++++ .../domain/TestPlayerCardDrawStrategy.java | 27 ++++++++++++++ 11 files changed, 172 insertions(+), 61 deletions(-) create mode 100644 src/main/java/domain/AbstractRandomCardDrawStrategy.java create mode 100644 src/main/java/domain/DealerRandomCardDrawStrategy.java create mode 100644 src/main/java/domain/PlayerRandomCardDrawStrategy.java create mode 100644 src/test/java/domain/DealerCardDrawStrategyTest.java create mode 100644 src/test/java/domain/TestDealerCardDrawStrategy.java create mode 100644 src/test/java/domain/TestPlayerCardDrawStrategy.java diff --git a/README.md b/README.md index 1c8f8b42fa7..b11e4e54f85 100644 --- a/README.md +++ b/README.md @@ -56,4 +56,4 @@ - [x] 보유한 카드 점수 합계 계산 기능 - [x] 카드 받을지 여부 입력 기능 - [x] 전체 게임 진행 기능 -- [ ] 딜러 Ace 카드 점수 보정 기능 +- [x] 딜러 Ace 카드 점수 보정 기능 diff --git a/src/main/java/controller/BlackjackController.java b/src/main/java/controller/BlackjackController.java index 16683b789dc..e8a62e20a50 100644 --- a/src/main/java/controller/BlackjackController.java +++ b/src/main/java/controller/BlackjackController.java @@ -1,16 +1,17 @@ package controller; +import domain.DealerRandomCardDrawStrategy; import domain.Deck; import domain.GameResult; import domain.GameResultCalculator; import domain.Gamer; +import domain.PlayerRandomCardDrawStrategy; import domain.SummationCardPoint; import dto.DealerGameResultDTO; import dto.GameResultDTO; import dto.GamerDTO; import java.util.List; import java.util.Map; -import java.util.Random; import java.util.stream.Collectors; import view.GameResultOutputView; import view.GamerOutputView; @@ -49,20 +50,12 @@ private void initDealerAndPlayers(Deck deck) { // TODO: 16 상수화 // TODO: 랜덤으로 카드 뽑는 전략 함수화 (아래랑 중복) private void dealerDraw(Deck deck) { - dealer.draw(deck, cards -> { - Random random = new Random(); - int idx = random.nextInt(cards.size()); - return cards.get(idx); - }, new SummationCardPoint(16)); + dealer.draw(deck, new DealerRandomCardDrawStrategy(dealer)); } // TODO: 21 상수화 private void playerDraw(Deck deck, Gamer player) { - player.draw(deck, cards -> { - Random random = new Random(); - int idx = random.nextInt(cards.size()); - return cards.get(idx); - }, new SummationCardPoint(21)); + player.draw(deck, new PlayerRandomCardDrawStrategy(player)); } // TODO: 딜러의 카드 한장 숨기기 @@ -103,13 +96,11 @@ private boolean canDraw(Gamer player, SummationCardPoint threshold) { // TODO: 장 수를 그대로 숫자로 처리 할 것인지 고민 // TODO: 메시지 OutputView에서 처리 private void dealerTryDraw(Deck deck) { - int count = 0; - while (canDraw(dealer, new SummationCardPoint(16))) { - count++; + try { dealerDraw(deck); - } - if (count != 0) { - OutputView.print("딜러는 16이하라 " + count + "장의 카드를 더 받았습니다.\n"); + OutputView.print("딜러는 16이하라 한장의 카드를 더 받았습니다.\n"); + } catch (IllegalStateException e) { + } } diff --git a/src/main/java/domain/AbstractRandomCardDrawStrategy.java b/src/main/java/domain/AbstractRandomCardDrawStrategy.java new file mode 100644 index 00000000000..a8e5ffc978f --- /dev/null +++ b/src/main/java/domain/AbstractRandomCardDrawStrategy.java @@ -0,0 +1,22 @@ +package domain; + +import java.util.List; +import java.util.Random; + +public abstract class AbstractRandomCardDrawStrategy implements CardDrawStrategy { + @Override + public final Card nextCard(List cards) { + if (canDraw()) { + return cardSelectStrategy(cards); + } + throw new IllegalStateException("카드를 더이상 뽑을 수 없습니다."); + } + + protected abstract boolean canDraw(); + + private Card cardSelectStrategy(List cards) { + Random random = new Random(); + int idx = random.nextInt(cards.size()); + return cards.get(idx); + } +} diff --git a/src/main/java/domain/DealerRandomCardDrawStrategy.java b/src/main/java/domain/DealerRandomCardDrawStrategy.java new file mode 100644 index 00000000000..c6e06c4cadf --- /dev/null +++ b/src/main/java/domain/DealerRandomCardDrawStrategy.java @@ -0,0 +1,15 @@ +package domain; + +public class DealerRandomCardDrawStrategy extends AbstractRandomCardDrawStrategy { + private final Gamer dealer; + + public DealerRandomCardDrawStrategy(Gamer dealer) { + this.dealer = dealer; + } + + @Override + protected boolean canDraw() { + SummationCardPoint summationCardPoint = dealer.getSummationCardPoint(); + return !summationCardPoint.isBiggerThan(new SummationCardPoint(16)); + } +} diff --git a/src/main/java/domain/GameResultCalculator.java b/src/main/java/domain/GameResultCalculator.java index 03cd26ac1c0..d78210c08a2 100644 --- a/src/main/java/domain/GameResultCalculator.java +++ b/src/main/java/domain/GameResultCalculator.java @@ -20,11 +20,8 @@ public static GameResult calculate(Gamer baseGamer, Gamer otherGamer) { return GameResult.WIN; } - // TODO: 딜러가 Ace를 가지고 있는 경우 고려해야 함 - - SummationCardPoint baseGamerSummationCardPoint = fix(baseGamer); - SummationCardPoint otherGamerSummationCardPoint = fix(otherGamer); - + SummationCardPoint baseGamerSummationCardPoint = baseGamer.getSummationCardPoint(); + SummationCardPoint otherGamerSummationCardPoint = otherGamer.getSummationCardPoint(); if (baseGamerSummationCardPoint.isBiggerThan(otherGamerSummationCardPoint)) { return GameResult.WIN; } @@ -33,24 +30,4 @@ public static GameResult calculate(Gamer baseGamer, Gamer otherGamer) { } return GameResult.LOSE; } - - // TODO: 메서드명 변경 필요 - private static SummationCardPoint fix(Gamer gamer) { - int rawPoint = gamer.getSummationCardPoint().summationCardPoint(); - - if (gamer.hasAceInHoldingCards()) { - rawPoint = fixPoint(rawPoint); - return new SummationCardPoint(rawPoint); - } - return gamer.getSummationCardPoint(); - } - - // TODO: 메서드명, 변수명 변경 필요 - private static int fixPoint(int rawPoint) { - int fixPoint = rawPoint + 10; - if (fixPoint <= 21) { - rawPoint = fixPoint; - } - return rawPoint; - } } diff --git a/src/main/java/domain/Gamer.java b/src/main/java/domain/Gamer.java index d19169fa9d2..91feab0fb3a 100644 --- a/src/main/java/domain/Gamer.java +++ b/src/main/java/domain/Gamer.java @@ -11,19 +11,26 @@ public Gamer(String name, HoldingCards holdingCards) { this.holdingCards = holdingCards; } - public void draw(Deck deck, CardDrawStrategy cardDrawStrategy, SummationCardPoint thresholdPoint) { - validateCanDraw(thresholdPoint); - holdingCards.add(deck.draw(cardDrawStrategy)); + public void draw(Deck deck, CardDrawStrategy cardDrawStrategy) { + Card draw = deck.draw(cardDrawStrategy); + holdingCards.add(draw); } - - private void validateCanDraw(SummationCardPoint thresholdPoint) { - if (getSummationCardPoint().isBiggerThan(thresholdPoint)) { - throw new IllegalStateException("카드를 더이상 뽑을 수 없습니다."); + + public SummationCardPoint getSummationCardPoint() { + SummationCardPoint summationCardPoint = holdingCards.calculateTotalPoint(); + if (hasAceInHoldingCards()) { + int rawPoint = fixPoint(summationCardPoint.summationCardPoint()); + return new SummationCardPoint(rawPoint); } + return summationCardPoint; } - public SummationCardPoint getSummationCardPoint() { - return holdingCards.calculateTotalPoint(); + private int fixPoint(int rawPoint) { + int fixPoint = rawPoint + 10; + if (fixPoint <= 21) { + rawPoint = fixPoint; + } + return rawPoint; } public String getRawName() { @@ -38,18 +45,13 @@ public List getRawHoldingCards() { // TODO: getRawSummationCardPoint -> DTO를 위한 메서드 // TODO: holdingCards.calculateTotalPoint()를 내부 메서드로 만들기 (. 줄이고 가시성 향상) public int getRawSummationCardPoint() { - return holdingCards.calculateTotalPoint().summationCardPoint(); + return getSummationCardPoint().summationCardPoint(); } public boolean isDead() { return holdingCards.calculateTotalPoint().isBiggerThan(new SummationCardPoint(21)); } - // TODO: 안쓰이는 메서드 - int countOfAceInHoldingCards() { - return holdingCards.countOfAce(); - } - boolean hasAceInHoldingCards() { return holdingCards.hasAce(); } diff --git a/src/main/java/domain/PlayerRandomCardDrawStrategy.java b/src/main/java/domain/PlayerRandomCardDrawStrategy.java new file mode 100644 index 00000000000..ea91d3048be --- /dev/null +++ b/src/main/java/domain/PlayerRandomCardDrawStrategy.java @@ -0,0 +1,14 @@ +package domain; + +public class PlayerRandomCardDrawStrategy extends AbstractRandomCardDrawStrategy { + private final Gamer player; + + public PlayerRandomCardDrawStrategy(Gamer player) { + this.player = player; + } + + @Override + protected boolean canDraw() { + return !player.getSummationCardPoint().isBiggerThan(new SummationCardPoint(21)); + } +} diff --git a/src/test/java/domain/DealerCardDrawStrategyTest.java b/src/test/java/domain/DealerCardDrawStrategyTest.java new file mode 100644 index 00000000000..45da5abfac4 --- /dev/null +++ b/src/test/java/domain/DealerCardDrawStrategyTest.java @@ -0,0 +1,36 @@ +package domain; + +import java.util.stream.Stream; +import org.assertj.core.api.Assertions; +import org.junit.jupiter.api.DisplayName; +import org.junit.jupiter.params.ParameterizedTest; +import org.junit.jupiter.params.provider.Arguments; +import org.junit.jupiter.params.provider.MethodSource; + +class DealerCardDrawStrategyTest { + + public static Stream canDrawParameters() { + return Stream.of( + Arguments.of( + HoldingCards.of(new Card(CardName.ACE, CardType.HEART), new Card(CardName.SIX, CardType.HEART)), + false), + Arguments.of( + HoldingCards.of(new Card(CardName.ACE, CardType.HEART), + new Card(CardName.FIVE, CardType.HEART)), + true), + Arguments.of( + HoldingCards.of(new Card(CardName.JACK, CardType.HEART), + new Card(CardName.QUEEN, CardType.HEART)), + false) + ); + } + + @ParameterizedTest + @MethodSource("canDrawParameters") + @DisplayName("딜러의 드로우 여부가 제대로 판단되는지 검증") + void canDraw(HoldingCards holdingCards, boolean expected) { + Gamer dealer = new Gamer("딜러", holdingCards); + Assertions.assertThat(new DealerRandomCardDrawStrategy(dealer).canDraw()) + .isEqualTo(expected); + } +} diff --git a/src/test/java/domain/GamerTest.java b/src/test/java/domain/GamerTest.java index 46438984227..77389c9cca7 100644 --- a/src/test/java/domain/GamerTest.java +++ b/src/test/java/domain/GamerTest.java @@ -23,7 +23,7 @@ public static Stream isDeadParameters() { void draw() { Gamer Gamer = new Gamer("robin", HoldingCards.of()); Deck deck = Deck.of(new Card(CardName.JACK, CardType.HEART), new Card(CardName.EIGHT, CardType.HEART)); - Gamer.draw(deck, cards -> cards.get(0), new SummationCardPoint(21)); + Gamer.draw(deck, new TestPlayerCardDrawStrategy(Gamer)); SummationCardPoint actual = Gamer.getSummationCardPoint(); SummationCardPoint expected = new SummationCardPoint(10); @@ -44,7 +44,7 @@ void validateDrawLimit() { new Card(CardName.TWO, CardType.SPADE) ); - Assertions.assertThatThrownBy(() -> Gamer.draw(deck, cards -> cards.get(0), new SummationCardPoint(21))) + Assertions.assertThatThrownBy(() -> Gamer.draw(deck, new TestPlayerCardDrawStrategy(Gamer))) .isInstanceOf(IllegalStateException.class) .hasMessage("카드를 더이상 뽑을 수 없습니다."); } @@ -60,7 +60,7 @@ void validateDealerDrawLimit() { new Card(CardName.TWO, CardType.SPADE) ); - Assertions.assertThatThrownBy(() -> gamer.draw(deck, cards -> cards.get(0), new SummationCardPoint(16))) + Assertions.assertThatThrownBy(() -> gamer.draw(deck, new TestDealerCardDrawStrategy(gamer))) .isInstanceOf(IllegalStateException.class) .hasMessage("카드를 더이상 뽑을 수 없습니다."); } diff --git a/src/test/java/domain/TestDealerCardDrawStrategy.java b/src/test/java/domain/TestDealerCardDrawStrategy.java new file mode 100644 index 00000000000..5d3b97f380d --- /dev/null +++ b/src/test/java/domain/TestDealerCardDrawStrategy.java @@ -0,0 +1,27 @@ +package domain; + +import java.util.List; + +public class TestDealerCardDrawStrategy implements CardDrawStrategy { + private final Gamer player; + + public TestDealerCardDrawStrategy(Gamer player) { + this.player = player; + } + + @Override + public final Card nextCard(List cards) { + if (canDraw()) { + return cardSelectStrategy(cards); + } + throw new IllegalStateException("카드를 더이상 뽑을 수 없습니다."); + } + + private boolean canDraw() { + return !player.getSummationCardPoint().isBiggerThan(new SummationCardPoint(16)); + } + + private Card cardSelectStrategy(List cards) { + return cards.get(0); + } +} diff --git a/src/test/java/domain/TestPlayerCardDrawStrategy.java b/src/test/java/domain/TestPlayerCardDrawStrategy.java new file mode 100644 index 00000000000..f4dac7a6353 --- /dev/null +++ b/src/test/java/domain/TestPlayerCardDrawStrategy.java @@ -0,0 +1,27 @@ +package domain; + +import java.util.List; + +public class TestPlayerCardDrawStrategy implements CardDrawStrategy { + private final Gamer player; + + public TestPlayerCardDrawStrategy(Gamer player) { + this.player = player; + } + + @Override + public final Card nextCard(List cards) { + if (canDraw()) { + return cardSelectStrategy(cards); + } + throw new IllegalStateException("카드를 더이상 뽑을 수 없습니다."); + } + + private boolean canDraw() { + return !player.getSummationCardPoint().isBiggerThan(new SummationCardPoint(21)); + } + + private Card cardSelectStrategy(List cards) { + return cards.get(0); + } +} From 89e773e9d30caa9d5d3765c822a1fd476bdefc66 Mon Sep 17 00:00:00 2001 From: BurningFalls Date: Thu, 7 Mar 2024 15:44:07 +0900 Subject: [PATCH 25/56] =?UTF-8?q?fix:=20=EA=B2=8C=EC=9E=84=20=EB=8F=84?= =?UTF-8?q?=EC=A4=91=20=ED=94=8C=EB=A0=88=EC=9D=B4=EC=96=B4=EC=9D=98=20?= =?UTF-8?q?=EC=86=90=ED=8C=A8=EB=A5=BC=20=EC=B6=9C=EB=A0=A5=ED=95=98?= =?UTF-8?q?=EC=A7=80=20=EC=95=8A=EB=8A=94=20=EC=98=A4=EB=A5=98=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 --- .../java/controller/BlackjackController.java | 17 +++++++++-------- 1 file changed, 9 insertions(+), 8 deletions(-) diff --git a/src/main/java/controller/BlackjackController.java b/src/main/java/controller/BlackjackController.java index e8a62e20a50..3a6c2a430b7 100644 --- a/src/main/java/controller/BlackjackController.java +++ b/src/main/java/controller/BlackjackController.java @@ -60,14 +60,14 @@ private void playerDraw(Deck deck, Gamer player) { // TODO: 딜러의 카드 한장 숨기기 private void printDealerAndPlayers() { - GamerDTO dealerDTO = new GamerDTO(dealer.getRawName(), dealer.getRawHoldingCards(), - dealer.getRawSummationCardPoint()); - GamerOutputView.printWithoutSummationCardPoint(dealerDTO); - players.forEach(player -> { - GamerDTO gamerDTO = new GamerDTO(player.getRawName(), player.getRawHoldingCards(), - player.getRawSummationCardPoint()); - GamerOutputView.printWithoutSummationCardPoint(gamerDTO); - }); + printPlayer(dealer); + players.forEach(BlackjackController::printPlayer); + } + + private static void printPlayer(Gamer player) { + GamerDTO gamerDTO = new GamerDTO(player.getRawName(), player.getRawHoldingCards(), + player.getRawSummationCardPoint()); + GamerOutputView.printWithoutSummationCardPoint(gamerDTO); } private void playersTryDraw(Deck deck) { @@ -86,6 +86,7 @@ private void playerTryDraw(Deck deck, Gamer player) { if (needToDraw) { playerDraw(deck, player); } + printPlayer(player); } } From c6047ff6fb3994b63b7f0c27b806553a5efafb33 Mon Sep 17 00:00:00 2001 From: BurningFalls Date: Thu, 7 Mar 2024 15:53:46 +0900 Subject: [PATCH 26/56] =?UTF-8?q?fix:=20=EB=94=9C=EB=9F=AC=EC=9D=98=20?= =?UTF-8?q?=EC=B9=B4=EB=93=9C=20=ED=95=9C=EC=9E=A5=20=EC=88=A8=EA=B8=B0?= =?UTF-8?q?=EB=8F=84=EB=A1=9D=20=EC=88=98=EC=A0=95?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- src/main/java/controller/BlackjackController.java | 13 +++++++++++-- src/main/java/domain/Gamer.java | 4 ++-- src/main/java/domain/HoldingCards.java | 3 ++- 3 files changed, 15 insertions(+), 5 deletions(-) diff --git a/src/main/java/controller/BlackjackController.java b/src/main/java/controller/BlackjackController.java index 3a6c2a430b7..345b4780986 100644 --- a/src/main/java/controller/BlackjackController.java +++ b/src/main/java/controller/BlackjackController.java @@ -1,5 +1,6 @@ package controller; +import domain.Card; import domain.DealerRandomCardDrawStrategy; import domain.Deck; import domain.GameResult; @@ -10,6 +11,7 @@ import dto.DealerGameResultDTO; import dto.GameResultDTO; import dto.GamerDTO; +import java.util.ArrayList; import java.util.List; import java.util.Map; import java.util.stream.Collectors; @@ -58,12 +60,19 @@ private void playerDraw(Deck deck, Gamer player) { player.draw(deck, new PlayerRandomCardDrawStrategy(player)); } - // TODO: 딜러의 카드 한장 숨기기 private void printDealerAndPlayers() { - printPlayer(dealer); + printDealer(dealer); players.forEach(BlackjackController::printPlayer); } + private static void printDealer(Gamer dealer) { + List rawHoldingCards = new ArrayList<>(dealer.getRawHoldingCards()); + rawHoldingCards.remove(0); + GamerDTO gamerDTO = new GamerDTO(dealer.getRawName(), rawHoldingCards, + dealer.getRawSummationCardPoint()); + GamerOutputView.printWithoutSummationCardPoint(gamerDTO); + } + private static void printPlayer(Gamer player) { GamerDTO gamerDTO = new GamerDTO(player.getRawName(), player.getRawHoldingCards(), player.getRawSummationCardPoint()); diff --git a/src/main/java/domain/Gamer.java b/src/main/java/domain/Gamer.java index 91feab0fb3a..1e235f307fe 100644 --- a/src/main/java/domain/Gamer.java +++ b/src/main/java/domain/Gamer.java @@ -15,7 +15,7 @@ public void draw(Deck deck, CardDrawStrategy cardDrawStrategy) { Card draw = deck.draw(cardDrawStrategy); holdingCards.add(draw); } - + public SummationCardPoint getSummationCardPoint() { SummationCardPoint summationCardPoint = holdingCards.calculateTotalPoint(); if (hasAceInHoldingCards()) { @@ -38,7 +38,7 @@ public String getRawName() { } public List getRawHoldingCards() { - return holdingCards.getHoldingCards(); + return List.copyOf(holdingCards.getHoldingCards()); } // TODO: getSummationCardPoint -> 프로그램의 동작을 위한 메서드 diff --git a/src/main/java/domain/HoldingCards.java b/src/main/java/domain/HoldingCards.java index dd19fbded04..c3b345a35f7 100644 --- a/src/main/java/domain/HoldingCards.java +++ b/src/main/java/domain/HoldingCards.java @@ -1,6 +1,7 @@ package domain; import java.util.ArrayList; +import java.util.Collections; import java.util.List; public class HoldingCards { @@ -28,7 +29,7 @@ public void add(Card card) { } List getHoldingCards() { - return holdingCards; + return Collections.unmodifiableList(holdingCards); } // TODO: countOfAce 메서드가 쓰이는가? 아래 hasAce로 충분한 듯 보임. From da5c9ce47021291a8b6d27bd1281e2ea0afa93d7 Mon Sep 17 00:00:00 2001 From: BurningFalls Date: Thu, 7 Mar 2024 16:30:42 +0900 Subject: [PATCH 27/56] =?UTF-8?q?refactor:=20TODO=20=EC=B2=98=EB=A6=AC?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../java/controller/BlackjackController.java | 53 +++++++++---------- src/main/java/domain/CardName.java | 5 +- src/main/java/domain/CardPointCalculator.java | 6 +-- src/main/java/domain/Deck.java | 12 ++--- .../java/domain/GameResultCalculator.java | 5 +- src/main/java/domain/Gamer.java | 11 ++-- src/main/java/domain/HoldingCards.java | 8 --- .../domain/PlayerRandomCardDrawStrategy.java | 2 +- src/main/java/domain/SummationCardPoint.java | 7 ++- ...esultDTO.java => PlayerGameResultDTO.java} | 4 +- src/main/java/view/Console.java | 2 - src/main/java/view/GameResultOutputView.java | 23 ++++---- src/main/java/view/GamerOutputView.java | 4 +- ...YNInputView.java => YesOrNoInputView.java} | 4 +- .../java/domain/CardPointCalculatorTest.java | 16 +++--- .../domain/DealerCardDrawStrategyTest.java | 21 ++++---- .../java/domain/GameResultCalculatorTest.java | 27 +++++----- src/test/java/domain/GamerTest.java | 29 +++++----- src/test/java/domain/HoldingCardsTest.java | 29 ++++------ .../java/domain/SummationCardPointTest.java | 5 +- .../domain/TestPlayerCardDrawStrategy.java | 2 +- 21 files changed, 124 insertions(+), 151 deletions(-) rename src/main/java/dto/{GameResultDTO.java => PlayerGameResultDTO.java} (75%) rename src/main/java/view/{YNInputView.java => YesOrNoInputView.java} (85%) diff --git a/src/main/java/controller/BlackjackController.java b/src/main/java/controller/BlackjackController.java index 345b4780986..2034ea7a34c 100644 --- a/src/main/java/controller/BlackjackController.java +++ b/src/main/java/controller/BlackjackController.java @@ -9,8 +9,8 @@ import domain.PlayerRandomCardDrawStrategy; import domain.SummationCardPoint; import dto.DealerGameResultDTO; -import dto.GameResultDTO; import dto.GamerDTO; +import dto.PlayerGameResultDTO; import java.util.ArrayList; import java.util.List; import java.util.Map; @@ -18,7 +18,7 @@ import view.GameResultOutputView; import view.GamerOutputView; import view.OutputView; -import view.YNInputView; +import view.YesOrNoInputView; public class BlackjackController { private final Gamer dealer; @@ -40,7 +40,6 @@ public void startBlackjackGame(Deck deck) { printDealerAndPlayersGameResult(); } - // TODO: 메시지 OutputView에서 처리 private void initDealerAndPlayers(Deck deck) { dealerDraw(deck); dealerDraw(deck); @@ -49,13 +48,10 @@ private void initDealerAndPlayers(Deck deck) { OutputView.print("딜러와 pobi, jason에게 2장을 나누었습니다."); } - // TODO: 16 상수화 - // TODO: 랜덤으로 카드 뽑는 전략 함수화 (아래랑 중복) private void dealerDraw(Deck deck) { dealer.draw(deck, new DealerRandomCardDrawStrategy(dealer)); } - // TODO: 21 상수화 private void playerDraw(Deck deck, Gamer player) { player.draw(deck, new PlayerRandomCardDrawStrategy(player)); } @@ -85,47 +81,47 @@ private void playersTryDraw(Deck deck) { }); } - // TODO: 메서드 인덴트 줄이기 - // TODO: 메시지 OutputView에서 처리 private void playerTryDraw(Deck deck, Gamer player) { boolean needToDraw = true; while (needToDraw && canDraw(player, new SummationCardPoint(21))) { - OutputView.print("%s은(는) 한장의 카드를 더 받겠습니까?(예는 y, 아니오는 n)".formatted(player.getRawName())); - needToDraw = YNInputView.getYNAsBoolean(); - if (needToDraw) { - playerDraw(deck, player); - } - printPlayer(player); + needToDraw = playerTryDrawOnce(deck, player); } } + private boolean playerTryDrawOnce(Deck deck, Gamer player) { + boolean needToDraw; + OutputView.print("%s은(는) 한장의 카드를 더 받겠습니까?(예는 y, 아니오는 n)".formatted(player.getRawName())); + needToDraw = YesOrNoInputView.getYNAsBoolean(); + if (needToDraw) { + playerDraw(deck, player); + } + printPlayer(player); + return needToDraw; + } + private boolean canDraw(Gamer player, SummationCardPoint threshold) { return !player.getSummationCardPoint().isBiggerThan(threshold); } - // TODO: 장 수를 그대로 숫자로 처리 할 것인지 고민 - // TODO: 메시지 OutputView에서 처리 private void dealerTryDraw(Deck deck) { try { dealerDraw(deck); OutputView.print("딜러는 16이하라 한장의 카드를 더 받았습니다.\n"); - } catch (IllegalStateException e) { + } catch (IllegalStateException ignored) { } } - // TODO: printDealerAndPlayers 메서드와 DTO 선언부 중복 - // TODO: gamerDTO2 변수명 변경 private void printDealerAndPlayersWithPoint() { - GamerDTO gamerDTO = new GamerDTO(dealer.getRawName(), dealer.getRawHoldingCards(), + GamerDTO dealerDTO = new GamerDTO(dealer.getRawName(), dealer.getRawHoldingCards(), dealer.getRawSummationCardPoint()); - GamerOutputView.print(gamerDTO); + GamerOutputView.print(dealerDTO); - players.forEach(player -> { - GamerDTO gamerDTO2 = new GamerDTO(player.getRawName(), player.getRawHoldingCards(), + for (Gamer player : players) { + GamerDTO playerDTO = new GamerDTO(player.getRawName(), player.getRawHoldingCards(), player.getRawSummationCardPoint()); - GamerOutputView.print(gamerDTO2); - }); + GamerOutputView.print(playerDTO); + } } private void printDealerAndPlayersGameResult() { @@ -134,11 +130,12 @@ private void printDealerAndPlayersGameResult() { Collectors.summingInt(value -> 1))); DealerGameResultDTO dealerGameResultDTO = new DealerGameResultDTO(dealerGameResultCounts); - List gameResultDTOS = players.stream() - .map(player -> new GameResultDTO(player.getRawName(), GameResultCalculator.calculate(player, dealer))) + List playerGameResultDTOS = players.stream() + .map(player -> new PlayerGameResultDTO(player.getRawName(), + GameResultCalculator.calculate(player, dealer))) .toList(); GameResultOutputView.print(dealerGameResultDTO); - gameResultDTOS.forEach(GameResultOutputView::print); + playerGameResultDTOS.forEach(GameResultOutputView::print); } } diff --git a/src/main/java/domain/CardName.java b/src/main/java/domain/CardName.java index fd3cf7adcd2..55265c31962 100644 --- a/src/main/java/domain/CardName.java +++ b/src/main/java/domain/CardName.java @@ -1,6 +1,5 @@ package domain; -// TODO: 인덴트 수정 public enum CardName { ACE(1), TWO(2), @@ -15,13 +14,13 @@ public enum CardName { JACK(11), QUEEN(12), KING(13); + private final int cardNumber; CardName(int cardNumber) { this.cardNumber = cardNumber; } - - + public int getCardNumber() { return cardNumber; } diff --git a/src/main/java/domain/CardPointCalculator.java b/src/main/java/domain/CardPointCalculator.java index 3f9b7c3303b..4306e2b377a 100644 --- a/src/main/java/domain/CardPointCalculator.java +++ b/src/main/java/domain/CardPointCalculator.java @@ -1,12 +1,12 @@ package domain; -// TODO: cardName.getCardNumber() 중복 public class CardPointCalculator { public static CardPoint calculate(Card card) { CardName cardName = card.name(); - if (cardName.getCardNumber() > 10) { + int cardNumber = cardName.getCardNumber(); + if (cardNumber > 10) { return new CardPoint(10); } - return new CardPoint(cardName.getCardNumber()); + return new CardPoint(cardNumber); } } diff --git a/src/main/java/domain/Deck.java b/src/main/java/domain/Deck.java index 84f81d51dd5..9c5442977b1 100644 --- a/src/main/java/domain/Deck.java +++ b/src/main/java/domain/Deck.java @@ -7,20 +7,16 @@ public class Deck { private final List cards; - + private Deck(List cards) { validateDuplicateCard(cards); - this.cards = cards; + this.cards = new ArrayList<>(cards); } - // TODO: tmpCards 변수명 변경 - // TODO: 아래 팩토리 메서드처럼 의미있는 이름으로 변경 public static Deck of(Card... cards) { - List tmpCards = new ArrayList<>(List.of(cards)); - return new Deck(tmpCards); + return new Deck(List.of(cards)); } - - // TODO: 인덴트 줄이기 + public static Deck fullDeck() { List cards = new ArrayList<>(); for (CardType cardType : CardType.values()) { diff --git a/src/main/java/domain/GameResultCalculator.java b/src/main/java/domain/GameResultCalculator.java index d78210c08a2..5e7ee14df25 100644 --- a/src/main/java/domain/GameResultCalculator.java +++ b/src/main/java/domain/GameResultCalculator.java @@ -8,7 +8,6 @@ public class GameResultCalculator { * @param otherGamer 상대 게이머 * @return baseGamer의 otherGamer 에 대한 승부 결과 */ - // TODO: 메서드 분리 필요 public static GameResult calculate(Gamer baseGamer, Gamer otherGamer) { if (baseGamer.isDead() && otherGamer.isDead()) { return GameResult.TIE; @@ -19,9 +18,13 @@ public static GameResult calculate(Gamer baseGamer, Gamer otherGamer) { if (otherGamer.isDead()) { return GameResult.WIN; } + return getGameResultWhenNobodyDead(baseGamer, otherGamer); + } + private static GameResult getGameResultWhenNobodyDead(Gamer baseGamer, Gamer otherGamer) { SummationCardPoint baseGamerSummationCardPoint = baseGamer.getSummationCardPoint(); SummationCardPoint otherGamerSummationCardPoint = otherGamer.getSummationCardPoint(); + if (baseGamerSummationCardPoint.isBiggerThan(otherGamerSummationCardPoint)) { return GameResult.WIN; } diff --git a/src/main/java/domain/Gamer.java b/src/main/java/domain/Gamer.java index 1e235f307fe..48f8d7ae48d 100644 --- a/src/main/java/domain/Gamer.java +++ b/src/main/java/domain/Gamer.java @@ -26,9 +26,9 @@ public SummationCardPoint getSummationCardPoint() { } private int fixPoint(int rawPoint) { - int fixPoint = rawPoint + 10; - if (fixPoint <= 21) { - rawPoint = fixPoint; + SummationCardPoint fixPoint = new SummationCardPoint(rawPoint + 10); + if (!fixPoint.isDeadPoint()) { + return fixPoint.summationCardPoint(); } return rawPoint; } @@ -41,15 +41,12 @@ public List getRawHoldingCards() { return List.copyOf(holdingCards.getHoldingCards()); } - // TODO: getSummationCardPoint -> 프로그램의 동작을 위한 메서드 - // TODO: getRawSummationCardPoint -> DTO를 위한 메서드 - // TODO: holdingCards.calculateTotalPoint()를 내부 메서드로 만들기 (. 줄이고 가시성 향상) public int getRawSummationCardPoint() { return getSummationCardPoint().summationCardPoint(); } public boolean isDead() { - return holdingCards.calculateTotalPoint().isBiggerThan(new SummationCardPoint(21)); + return holdingCards.calculateTotalPoint().isDeadPoint(); } boolean hasAceInHoldingCards() { diff --git a/src/main/java/domain/HoldingCards.java b/src/main/java/domain/HoldingCards.java index c3b345a35f7..88ccdc2bf8e 100644 --- a/src/main/java/domain/HoldingCards.java +++ b/src/main/java/domain/HoldingCards.java @@ -11,7 +11,6 @@ private HoldingCards(List holdingCards) { this.holdingCards = holdingCards; } - // TODO: 팩토리 메서드 변수명 변경?? public static HoldingCards of(Card... cards) { return new HoldingCards(new ArrayList<>(List.of(cards))); } @@ -32,13 +31,6 @@ List getHoldingCards() { return Collections.unmodifiableList(holdingCards); } - // TODO: countOfAce 메서드가 쓰이는가? 아래 hasAce로 충분한 듯 보임. - int countOfAce() { - return (int) holdingCards.stream() - .filter(card -> card.name() == CardName.ACE) - .count(); - } - boolean hasAce() { return holdingCards.stream() .anyMatch(card -> card.name() == CardName.ACE); diff --git a/src/main/java/domain/PlayerRandomCardDrawStrategy.java b/src/main/java/domain/PlayerRandomCardDrawStrategy.java index ea91d3048be..f2a9a67aff5 100644 --- a/src/main/java/domain/PlayerRandomCardDrawStrategy.java +++ b/src/main/java/domain/PlayerRandomCardDrawStrategy.java @@ -9,6 +9,6 @@ public PlayerRandomCardDrawStrategy(Gamer player) { @Override protected boolean canDraw() { - return !player.getSummationCardPoint().isBiggerThan(new SummationCardPoint(21)); + return !player.getSummationCardPoint().isDeadPoint(); } } diff --git a/src/main/java/domain/SummationCardPoint.java b/src/main/java/domain/SummationCardPoint.java index 15ee936aefa..320e09550bd 100644 --- a/src/main/java/domain/SummationCardPoint.java +++ b/src/main/java/domain/SummationCardPoint.java @@ -3,9 +3,8 @@ import java.util.List; public record SummationCardPoint(int summationCardPoint) { + private static final int DEAD_POINT_THRESHOLD = 21; - // TODO: 디폴트 생성자의 제한자가 public으로 되어버리는데, class로 만드는 것이 더 낫지 않을까 - // TODO: record로 해버리니 get 함수 이름이 .summationCardPoint가 되어 버리는데, 이를 사용하는 곳에서 가시성이 많이 떨어짐 public static SummationCardPoint of(List cardPoints) { int summationCardPoint = cardPoints.stream() .mapToInt(CardPoint::point) @@ -17,4 +16,8 @@ public boolean isBiggerThan(SummationCardPoint other) { int otherPoint = other.summationCardPoint(); return summationCardPoint > otherPoint; } + + public boolean isDeadPoint() { + return this.isBiggerThan(new SummationCardPoint(DEAD_POINT_THRESHOLD)); + } } diff --git a/src/main/java/dto/GameResultDTO.java b/src/main/java/dto/PlayerGameResultDTO.java similarity index 75% rename from src/main/java/dto/GameResultDTO.java rename to src/main/java/dto/PlayerGameResultDTO.java index 02deac529ec..1365f0ca1e7 100644 --- a/src/main/java/dto/GameResultDTO.java +++ b/src/main/java/dto/PlayerGameResultDTO.java @@ -2,11 +2,11 @@ import domain.GameResult; -public class GameResultDTO { +public class PlayerGameResultDTO { private final String gamerName; private final GameResult gameResult; - public GameResultDTO(String gamerName, GameResult gameResult) { + public PlayerGameResultDTO(String gamerName, GameResult gameResult) { this.gamerName = gamerName; this.gameResult = gameResult; } diff --git a/src/main/java/view/Console.java b/src/main/java/view/Console.java index 0c70d727e53..72e8d4d8633 100644 --- a/src/main/java/view/Console.java +++ b/src/main/java/view/Console.java @@ -4,9 +4,7 @@ import java.io.IOException; import java.io.InputStreamReader; -// TODO: 인덴트 수정 public class Console { - public static String getInputFromConsole() { BufferedReader bufferedReader = new BufferedReader(new InputStreamReader(System.in)); String input; diff --git a/src/main/java/view/GameResultOutputView.java b/src/main/java/view/GameResultOutputView.java index a66d24491c6..e73edeb3e0a 100644 --- a/src/main/java/view/GameResultOutputView.java +++ b/src/main/java/view/GameResultOutputView.java @@ -2,31 +2,26 @@ import domain.GameResult; import dto.DealerGameResultDTO; -import dto.GameResultDTO; +import dto.PlayerGameResultDTO; import java.util.Map; import java.util.stream.Collectors; public class GameResultOutputView { - // TODO: int gameResult = mapToString(gameResultDTO.getGameResult()); - public static void print(GameResultDTO gameResultDTO) { - String gamerName = gameResultDTO.getGamerName(); - GameResult gameResult = gameResultDTO.getGameResult(); - System.out.printf("%s: %s\n", gamerName, mapToString(gameResult)); + public static void print(PlayerGameResultDTO playerGameResultDTO) { + String gamerName = playerGameResultDTO.getGamerName(); + String gameResult = mapToString(playerGameResultDTO.getGameResult()); + System.out.printf("%s: %s\n", gamerName, gameResult); } - // TODO: gameResultIntegerEntry 변수명 단순하게 수정 가능할듯 - // TODO: output 변수명 수정 public static void print(DealerGameResultDTO dealerGameResultDTO) { Map dealerGameResultCounts = dealerGameResultDTO.getDealerGameResultCounts(); - String output = dealerGameResultCounts.entrySet() + String dealersGameResultOutput = dealerGameResultCounts.entrySet() .stream() - .map(gameResultIntegerEntry -> - gameResultIntegerEntry.getValue() + mapToString(gameResultIntegerEntry.getKey())) + .map(mapEntry -> mapEntry.getValue() + mapToString(mapEntry.getKey())) .collect(Collectors.joining(" ")); - System.out.printf("딜러: %s\n", output); + System.out.printf("딜러: %s\n", dealersGameResultOutput); } - - // TODO: 메서드명 수정 + private static String mapToString(GameResult gameResult) { if (gameResult == GameResult.WIN) { return "승"; diff --git a/src/main/java/view/GamerOutputView.java b/src/main/java/view/GamerOutputView.java index 0411e07924e..64033b98c74 100644 --- a/src/main/java/view/GamerOutputView.java +++ b/src/main/java/view/GamerOutputView.java @@ -15,7 +15,6 @@ public static void print(GamerDTO gamerDTO) { System.out.printf("%s - %s\n", outputWithoutSummationCardPoint, summationCardPointOutput); } - // TODO: 메서드 라인 10줄 맞추기 private static String mapToString(CardType cardType) { if (cardType == CardType.HEART) { return "하트"; @@ -31,8 +30,7 @@ private static String mapToString(CardType cardType) { } throw new IllegalArgumentException("잘못된 카드 타입입니다."); } - - // TODO: 메서드 라인 10줄 맞추기 + private static String mapToString(CardName cardName) { if (cardName == CardName.ACE) { return "A"; diff --git a/src/main/java/view/YNInputView.java b/src/main/java/view/YesOrNoInputView.java similarity index 85% rename from src/main/java/view/YNInputView.java rename to src/main/java/view/YesOrNoInputView.java index 067613b14b7..55de0cc8fff 100644 --- a/src/main/java/view/YNInputView.java +++ b/src/main/java/view/YesOrNoInputView.java @@ -1,8 +1,6 @@ package view; -// TODO: 클래스명 수정 -public class YNInputView { - +public class YesOrNoInputView { public static Boolean getYNAsBoolean() { String input = Console.getInputFromConsole(); if (input.equals("y")) { diff --git a/src/test/java/domain/CardPointCalculatorTest.java b/src/test/java/domain/CardPointCalculatorTest.java index 4439c67a942..d560414789d 100644 --- a/src/test/java/domain/CardPointCalculatorTest.java +++ b/src/test/java/domain/CardPointCalculatorTest.java @@ -11,24 +11,26 @@ class CardPointCalculatorTest { - // TODO: 메서드 분리 및 정리 필요 static Stream calculateParameter() { List arguments = new ArrayList<>(); for (CardType cardType : CardType.values()) { for (CardName cardName : CardName.values()) { Card card = new Card(cardName, cardType); - CardPoint cardPoint; - if (cardName.getCardNumber() > 10) { - cardPoint = new CardPoint(10); - } else { - cardPoint = new CardPoint(cardName.getCardNumber()); - } + CardPoint cardPoint = makeCardPoint(cardName); arguments.add(Arguments.of(card, cardPoint)); } } return Stream.of(arguments.toArray(new Arguments[0])); } + private static CardPoint makeCardPoint(CardName cardName) { + CardPoint cardPoint = new CardPoint(cardName.getCardNumber()); + if (cardName.getCardNumber() > 10) { + return new CardPoint(10); + } + return cardPoint; + } + @ParameterizedTest @MethodSource("calculateParameter") @DisplayName("카드 점수가 제대로 변환되는지 검증") diff --git a/src/test/java/domain/DealerCardDrawStrategyTest.java b/src/test/java/domain/DealerCardDrawStrategyTest.java index 45da5abfac4..3cfbdd19a69 100644 --- a/src/test/java/domain/DealerCardDrawStrategyTest.java +++ b/src/test/java/domain/DealerCardDrawStrategyTest.java @@ -1,5 +1,12 @@ package domain; +import static domain.CardName.ACE; +import static domain.CardName.FIVE; +import static domain.CardName.JACK; +import static domain.CardName.QUEEN; +import static domain.CardName.SIX; +import static domain.CardType.HEART; + import java.util.stream.Stream; import org.assertj.core.api.Assertions; import org.junit.jupiter.api.DisplayName; @@ -11,17 +18,9 @@ class DealerCardDrawStrategyTest { public static Stream canDrawParameters() { return Stream.of( - Arguments.of( - HoldingCards.of(new Card(CardName.ACE, CardType.HEART), new Card(CardName.SIX, CardType.HEART)), - false), - Arguments.of( - HoldingCards.of(new Card(CardName.ACE, CardType.HEART), - new Card(CardName.FIVE, CardType.HEART)), - true), - Arguments.of( - HoldingCards.of(new Card(CardName.JACK, CardType.HEART), - new Card(CardName.QUEEN, CardType.HEART)), - false) + Arguments.of(HoldingCards.of(new Card(ACE, HEART), new Card(SIX, HEART)), false), + Arguments.of(HoldingCards.of(new Card(ACE, HEART), new Card(FIVE, HEART)), true), + Arguments.of(HoldingCards.of(new Card(JACK, HEART), new Card(QUEEN, HEART)), false) ); } diff --git a/src/test/java/domain/GameResultCalculatorTest.java b/src/test/java/domain/GameResultCalculatorTest.java index ee07b4e3931..c9d049f7f13 100644 --- a/src/test/java/domain/GameResultCalculatorTest.java +++ b/src/test/java/domain/GameResultCalculatorTest.java @@ -1,5 +1,14 @@ package domain; +import static domain.CardName.ACE; +import static domain.CardName.JACK; +import static domain.CardName.NINE; +import static domain.CardName.QUEEN; +import static domain.CardName.SEVEN; +import static domain.CardName.SIX; +import static domain.CardName.TWO; +import static domain.CardType.DIAMOND; +import static domain.CardType.HEART; import static domain.GameResult.LOSE; import static domain.GameResult.TIE; import static domain.GameResult.WIN; @@ -12,28 +21,22 @@ import org.junit.jupiter.params.provider.MethodSource; class GameResultCalculatorTest { - private static final HoldingCards ONLY_SIX_HEART = HoldingCards.of(new Card(CardName.SIX, CardType.HEART)); - private static final HoldingCards ONLY_SEVEN_HEART = HoldingCards.of(new Card(CardName.SEVEN, CardType.HEART)); + private static final HoldingCards ONLY_SIX_HEART = HoldingCards.of(new Card(SIX, HEART)); + private static final HoldingCards ONLY_SEVEN_HEART = HoldingCards.of(new Card(SEVEN, HEART)); private static final HoldingCards DEAD_CARDS = HoldingCards.of( - new Card(CardName.JACK, CardType.HEART), - new Card(CardName.QUEEN, CardType.HEART), - new Card(CardName.TWO, CardType.HEART) + new Card(JACK, HEART), new Card(QUEEN, HEART), new Card(TWO, HEART) ); private static final HoldingCards WIN_CARDS_WITH_ACE = HoldingCards.of( - new Card(CardName.ACE, CardType.HEART), - new Card(CardName.QUEEN, CardType.HEART) + new Card(ACE, HEART), new Card(QUEEN, HEART) ); private static final HoldingCards WIN_CARDS_WITHOUT_ACE = HoldingCards.of( - new Card(CardName.JACK, CardType.HEART), - new Card(CardName.NINE, CardType.HEART), - new Card(CardName.TWO, CardType.HEART) + new Card(JACK, HEART), new Card(NINE, HEART), new Card(TWO, HEART) ); private static final HoldingCards TWO_SIX_CARDS = HoldingCards.of( - new Card(CardName.SIX, CardType.HEART), - new Card(CardName.SIX, CardType.DIAMOND) + new Card(SIX, HEART), new Card(SIX, DIAMOND) ); public static Stream getGameResultParameters() { diff --git a/src/test/java/domain/GamerTest.java b/src/test/java/domain/GamerTest.java index 77389c9cca7..2b5e13b19c2 100644 --- a/src/test/java/domain/GamerTest.java +++ b/src/test/java/domain/GamerTest.java @@ -1,5 +1,14 @@ package domain; +import static domain.CardName.ACE; +import static domain.CardName.EIGHT; +import static domain.CardName.JACK; +import static domain.CardName.QUEEN; +import static domain.CardName.SEVEN; +import static domain.CardName.TWO; +import static domain.CardType.HEART; +import static domain.CardType.SPADE; + import java.util.stream.Stream; import org.assertj.core.api.Assertions; import org.junit.jupiter.api.DisplayName; @@ -13,8 +22,7 @@ class GamerTest { public static Stream isDeadParameters() { return Stream.of( - Arguments.of(new Card(CardName.TWO, CardType.HEART), true), - Arguments.of(new Card(CardName.ACE, CardType.HEART), false) + Arguments.of(new Card(TWO, HEART), true), Arguments.of(new Card(ACE, HEART), false) ); } @@ -22,7 +30,7 @@ public static Stream isDeadParameters() { @DisplayName("게임 참가자가 카드를 뽑았을 때 점수가 올바르게 계산되는지 검증") void draw() { Gamer Gamer = new Gamer("robin", HoldingCards.of()); - Deck deck = Deck.of(new Card(CardName.JACK, CardType.HEART), new Card(CardName.EIGHT, CardType.HEART)); + Deck deck = Deck.of(new Card(JACK, HEART), new Card(EIGHT, HEART)); Gamer.draw(deck, new TestPlayerCardDrawStrategy(Gamer)); SummationCardPoint actual = Gamer.getSummationCardPoint(); @@ -36,12 +44,10 @@ void draw() { @DisplayName("플레이어는 총합이 21이 넘으면 카드를 뽑을 수 없는지 검증") void validateDrawLimit() { Gamer Gamer = new Gamer("robin", HoldingCards.of( - new Card(CardName.JACK, CardType.HEART), - new Card(CardName.EIGHT, CardType.HEART), - new Card(CardName.JACK, CardType.SPADE) + new Card(JACK, HEART), new Card(EIGHT, HEART), new Card(JACK, SPADE) )); Deck deck = Deck.of( - new Card(CardName.TWO, CardType.SPADE) + new Card(TWO, SPADE) ); Assertions.assertThatThrownBy(() -> Gamer.draw(deck, new TestPlayerCardDrawStrategy(Gamer))) @@ -53,11 +59,10 @@ void validateDrawLimit() { @DisplayName("딜러는 총합이 16이 넘으면 카드를 뽑을 수 없는지 검증") void validateDealerDrawLimit() { Gamer gamer = new Gamer("robin", HoldingCards.of( - new Card(CardName.JACK, CardType.HEART), - new Card(CardName.SEVEN, CardType.HEART) + new Card(JACK, HEART), new Card(SEVEN, HEART) )); Deck deck = Deck.of( - new Card(CardName.TWO, CardType.SPADE) + new Card(TWO, SPADE) ); Assertions.assertThatThrownBy(() -> gamer.draw(deck, new TestDealerCardDrawStrategy(gamer))) @@ -70,9 +75,7 @@ void validateDealerDrawLimit() { @DisplayName("게이머의 점수가 21이 넘으면 죽었다고 판단하는지 검증") void isDead(Card additionalCard, boolean expected) { Gamer gamer = new Gamer("robin", HoldingCards.of( - new Card(CardName.JACK, CardType.HEART), - new Card(CardName.QUEEN, CardType.HEART), - additionalCard + new Card(JACK, HEART), new Card(QUEEN, HEART), additionalCard )); Assertions.assertThat(gamer.isDead()).isEqualTo(expected); diff --git a/src/test/java/domain/HoldingCardsTest.java b/src/test/java/domain/HoldingCardsTest.java index 406ed709834..93f15e3548c 100644 --- a/src/test/java/domain/HoldingCardsTest.java +++ b/src/test/java/domain/HoldingCardsTest.java @@ -1,25 +1,24 @@ package domain; +import static domain.CardName.ACE; +import static domain.CardName.JACK; +import static domain.CardName.KING; +import static domain.CardName.QUEEN; +import static domain.CardName.SIX; +import static domain.CardType.HEART; + import org.assertj.core.api.Assertions; import org.junit.jupiter.api.DisplayName; import org.junit.jupiter.api.Test; class HoldingCardsTest { - @Test - void add() { - - } - @Test @DisplayName("포함된 카드의 포인트 합계가 올바른지 검증") void calculateTotalPoint() { HoldingCards holdingCards = HoldingCards.of( - new Card(CardName.ACE, CardType.HEART), - new Card(CardName.SIX, CardType.HEART), - new Card(CardName.JACK, CardType.HEART), - new Card(CardName.QUEEN, CardType.HEART), - new Card(CardName.KING, CardType.HEART) + new Card(ACE, HEART), new Card(SIX, HEART), new Card(JACK, HEART), + new Card(QUEEN, HEART), new Card(KING, HEART) ); SummationCardPoint actual = holdingCards.calculateTotalPoint(); @@ -28,18 +27,10 @@ void calculateTotalPoint() { Assertions.assertThat(actual).isEqualTo(expected); } - @Test - @DisplayName("Ace 개수가 잘 세어지는지 검증") - void countOfAce() { - HoldingCards holdingCards = HoldingCards.of(new Card(CardName.ACE, CardType.HEART)); - Assertions.assertThat(holdingCards.countOfAce()) - .isEqualTo(1); - } - @Test @DisplayName("Ace가 포함되었는지 여부 검증") void hasAce() { - HoldingCards holdingCards = HoldingCards.of(new Card(CardName.ACE, CardType.HEART)); + HoldingCards holdingCards = HoldingCards.of(new Card(ACE, HEART)); Assertions.assertThat(holdingCards.hasAce()).isTrue(); } } diff --git a/src/test/java/domain/SummationCardPointTest.java b/src/test/java/domain/SummationCardPointTest.java index 4290c2326fa..77c0c704d81 100644 --- a/src/test/java/domain/SummationCardPointTest.java +++ b/src/test/java/domain/SummationCardPointTest.java @@ -12,12 +12,11 @@ class SummationCardPointTest { void getSummationCardPoint() { List cardPoints = List.of( new CardPoint(1), new CardPoint(2), - new CardPoint(3), new CardPoint(4), - new CardPoint(5), new CardPoint(6) + new CardPoint(3), new CardPoint(4) ); SummationCardPoint summationCardPoint = SummationCardPoint.of(cardPoints); Assertions.assertThat(summationCardPoint) - .isEqualTo(new SummationCardPoint(21)); + .isEqualTo(new SummationCardPoint(10)); } } diff --git a/src/test/java/domain/TestPlayerCardDrawStrategy.java b/src/test/java/domain/TestPlayerCardDrawStrategy.java index f4dac7a6353..e4cc5d07097 100644 --- a/src/test/java/domain/TestPlayerCardDrawStrategy.java +++ b/src/test/java/domain/TestPlayerCardDrawStrategy.java @@ -18,7 +18,7 @@ public final Card nextCard(List cards) { } private boolean canDraw() { - return !player.getSummationCardPoint().isBiggerThan(new SummationCardPoint(21)); + return !player.getSummationCardPoint().isDeadPoint(); } private Card cardSelectStrategy(List cards) { From a6ba73ba635bcdde7b6a16154256676726b12e1e Mon Sep 17 00:00:00 2001 From: BurningFalls Date: Thu, 7 Mar 2024 17:06:56 +0900 Subject: [PATCH 28/56] =?UTF-8?q?refactor:=20domain=20=ED=95=98=EC=9C=84?= =?UTF-8?q?=20=ED=8C=A8=ED=82=A4=EC=A7=80=20=EC=B6=94=EA=B0=80?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- src/main/java/Main.java | 6 ++-- .../java/controller/BlackjackController.java | 16 +++++----- .../AbstractRandomCardDrawStrategy.java | 6 ++-- .../domain/{ => blackjack}/CardPoint.java | 2 +- .../{ => blackjack}/CardPointCalculator.java | 6 +++- .../DealerRandomCardDrawStrategy.java | 4 +-- .../domain/{ => blackjack}/GameResult.java | 2 +- .../{ => blackjack}/GameResultCalculator.java | 2 +- .../java/domain/{ => blackjack}/Gamer.java | 5 ++- .../domain/{ => blackjack}/HoldingCards.java | 4 ++- .../PlayerRandomCardDrawStrategy.java | 4 +-- .../{ => blackjack}/SummationCardPoint.java | 2 +- src/main/java/domain/{ => card}/Card.java | 2 +- .../domain/{ => card}/CardDrawStrategy.java | 2 +- src/main/java/domain/{ => card}/CardName.java | 4 +-- src/main/java/domain/{ => card}/CardType.java | 2 +- src/main/java/domain/{ => card}/Deck.java | 4 +-- src/main/java/dto/DealerGameResultDTO.java | 2 +- src/main/java/dto/GamerDTO.java | 2 +- src/main/java/dto/PlayerGameResultDTO.java | 2 +- src/main/java/view/GameResultOutputView.java | 4 +-- src/main/java/view/GamerOutputView.java | 8 ++--- .../CardPointCalculatorTest.java | 5 ++- .../DealerCardDrawStrategyTest.java | 18 ++++++----- .../GameResultCalculatorTest.java | 31 ++++++++++--------- .../domain/{ => blackjack}/GamerTest.java | 20 ++++++------ .../{ => blackjack}/HoldingCardsTest.java | 15 ++++----- .../SummationCardPointTest.java | 2 +- .../TestDealerCardDrawStrategy.java | 6 +++- .../TestPlayerCardDrawStrategy.java | 5 ++- src/test/java/domain/{ => card}/DeckTest.java | 6 ++-- 31 files changed, 114 insertions(+), 85 deletions(-) rename src/main/java/domain/{ => blackjack}/AbstractRandomCardDrawStrategy.java (81%) rename src/main/java/domain/{ => blackjack}/CardPoint.java (61%) rename src/main/java/domain/{ => blackjack}/CardPointCalculator.java (72%) rename src/main/java/domain/{ => blackjack}/DealerRandomCardDrawStrategy.java (87%) rename src/main/java/domain/{ => blackjack}/GameResult.java (64%) rename src/main/java/domain/{ => blackjack}/GameResultCalculator.java (97%) rename src/main/java/domain/{ => blackjack}/Gamer.java (92%) rename src/main/java/domain/{ => blackjack}/HoldingCards.java (92%) rename src/main/java/domain/{ => blackjack}/PlayerRandomCardDrawStrategy.java (83%) rename src/main/java/domain/{ => blackjack}/SummationCardPoint.java (96%) rename src/main/java/domain/{ => card}/Card.java (73%) rename src/main/java/domain/{ => card}/CardDrawStrategy.java (82%) rename src/main/java/domain/{ => card}/CardName.java (94%) rename src/main/java/domain/{ => card}/CardType.java (74%) rename src/main/java/domain/{ => card}/Deck.java (98%) rename src/test/java/domain/{ => blackjack}/CardPointCalculatorTest.java (93%) rename src/test/java/domain/{ => blackjack}/DealerCardDrawStrategyTest.java (72%) rename src/test/java/domain/{ => blackjack}/GameResultCalculatorTest.java (81%) rename src/test/java/domain/{ => blackjack}/GamerTest.java (87%) rename src/test/java/domain/{ => blackjack}/HoldingCardsTest.java (75%) rename src/test/java/domain/{ => blackjack}/SummationCardPointTest.java (96%) rename src/test/java/domain/{ => blackjack}/TestDealerCardDrawStrategy.java (80%) rename src/test/java/domain/{ => blackjack}/TestPlayerCardDrawStrategy.java (84%) rename src/test/java/domain/{ => card}/DeckTest.java (92%) diff --git a/src/main/java/Main.java b/src/main/java/Main.java index 7f1bb25be4d..17fab767d55 100644 --- a/src/main/java/Main.java +++ b/src/main/java/Main.java @@ -1,7 +1,7 @@ import controller.BlackjackController; -import domain.Deck; -import domain.Gamer; -import domain.HoldingCards; +import domain.blackjack.Gamer; +import domain.blackjack.HoldingCards; +import domain.card.Deck; import java.util.List; import view.NameInputView; import view.OutputView; diff --git a/src/main/java/controller/BlackjackController.java b/src/main/java/controller/BlackjackController.java index 2034ea7a34c..77767d470b3 100644 --- a/src/main/java/controller/BlackjackController.java +++ b/src/main/java/controller/BlackjackController.java @@ -1,13 +1,13 @@ package controller; -import domain.Card; -import domain.DealerRandomCardDrawStrategy; -import domain.Deck; -import domain.GameResult; -import domain.GameResultCalculator; -import domain.Gamer; -import domain.PlayerRandomCardDrawStrategy; -import domain.SummationCardPoint; +import domain.blackjack.GameResult; +import domain.blackjack.GameResultCalculator; +import domain.blackjack.DealerRandomCardDrawStrategy; +import domain.blackjack.Gamer; +import domain.blackjack.PlayerRandomCardDrawStrategy; +import domain.blackjack.SummationCardPoint; +import domain.card.Card; +import domain.card.Deck; import dto.DealerGameResultDTO; import dto.GamerDTO; import dto.PlayerGameResultDTO; diff --git a/src/main/java/domain/AbstractRandomCardDrawStrategy.java b/src/main/java/domain/blackjack/AbstractRandomCardDrawStrategy.java similarity index 81% rename from src/main/java/domain/AbstractRandomCardDrawStrategy.java rename to src/main/java/domain/blackjack/AbstractRandomCardDrawStrategy.java index a8e5ffc978f..73c88ba71ab 100644 --- a/src/main/java/domain/AbstractRandomCardDrawStrategy.java +++ b/src/main/java/domain/blackjack/AbstractRandomCardDrawStrategy.java @@ -1,5 +1,7 @@ -package domain; +package domain.blackjack; +import domain.card.Card; +import domain.card.CardDrawStrategy; import java.util.List; import java.util.Random; @@ -12,7 +14,7 @@ public final Card nextCard(List cards) { throw new IllegalStateException("카드를 더이상 뽑을 수 없습니다."); } - protected abstract boolean canDraw(); + public abstract boolean canDraw(); private Card cardSelectStrategy(List cards) { Random random = new Random(); diff --git a/src/main/java/domain/CardPoint.java b/src/main/java/domain/blackjack/CardPoint.java similarity index 61% rename from src/main/java/domain/CardPoint.java rename to src/main/java/domain/blackjack/CardPoint.java index 33f9315674b..43ffaab6598 100644 --- a/src/main/java/domain/CardPoint.java +++ b/src/main/java/domain/blackjack/CardPoint.java @@ -1,4 +1,4 @@ -package domain; +package domain.blackjack; public record CardPoint(int point) { diff --git a/src/main/java/domain/CardPointCalculator.java b/src/main/java/domain/blackjack/CardPointCalculator.java similarity index 72% rename from src/main/java/domain/CardPointCalculator.java rename to src/main/java/domain/blackjack/CardPointCalculator.java index 4306e2b377a..6e518b58be7 100644 --- a/src/main/java/domain/CardPointCalculator.java +++ b/src/main/java/domain/blackjack/CardPointCalculator.java @@ -1,4 +1,8 @@ -package domain; +package domain.blackjack; + +import domain.blackjack.CardPoint; +import domain.card.Card; +import domain.card.CardName; public class CardPointCalculator { public static CardPoint calculate(Card card) { diff --git a/src/main/java/domain/DealerRandomCardDrawStrategy.java b/src/main/java/domain/blackjack/DealerRandomCardDrawStrategy.java similarity index 87% rename from src/main/java/domain/DealerRandomCardDrawStrategy.java rename to src/main/java/domain/blackjack/DealerRandomCardDrawStrategy.java index c6e06c4cadf..83a502dc6c7 100644 --- a/src/main/java/domain/DealerRandomCardDrawStrategy.java +++ b/src/main/java/domain/blackjack/DealerRandomCardDrawStrategy.java @@ -1,4 +1,4 @@ -package domain; +package domain.blackjack; public class DealerRandomCardDrawStrategy extends AbstractRandomCardDrawStrategy { private final Gamer dealer; @@ -8,7 +8,7 @@ public DealerRandomCardDrawStrategy(Gamer dealer) { } @Override - protected boolean canDraw() { + public boolean canDraw() { SummationCardPoint summationCardPoint = dealer.getSummationCardPoint(); return !summationCardPoint.isBiggerThan(new SummationCardPoint(16)); } diff --git a/src/main/java/domain/GameResult.java b/src/main/java/domain/blackjack/GameResult.java similarity index 64% rename from src/main/java/domain/GameResult.java rename to src/main/java/domain/blackjack/GameResult.java index 0c16929b19d..0e01f0327b4 100644 --- a/src/main/java/domain/GameResult.java +++ b/src/main/java/domain/blackjack/GameResult.java @@ -1,4 +1,4 @@ -package domain; +package domain.blackjack; public enum GameResult { WIN, LOSE, TIE; diff --git a/src/main/java/domain/GameResultCalculator.java b/src/main/java/domain/blackjack/GameResultCalculator.java similarity index 97% rename from src/main/java/domain/GameResultCalculator.java rename to src/main/java/domain/blackjack/GameResultCalculator.java index 5e7ee14df25..ffac144a31a 100644 --- a/src/main/java/domain/GameResultCalculator.java +++ b/src/main/java/domain/blackjack/GameResultCalculator.java @@ -1,4 +1,4 @@ -package domain; +package domain.blackjack; public class GameResultCalculator { /** diff --git a/src/main/java/domain/Gamer.java b/src/main/java/domain/blackjack/Gamer.java similarity index 92% rename from src/main/java/domain/Gamer.java rename to src/main/java/domain/blackjack/Gamer.java index 48f8d7ae48d..eafbc665dcf 100644 --- a/src/main/java/domain/Gamer.java +++ b/src/main/java/domain/blackjack/Gamer.java @@ -1,5 +1,8 @@ -package domain; +package domain.blackjack; +import domain.card.Card; +import domain.card.CardDrawStrategy; +import domain.card.Deck; import java.util.List; public class Gamer { diff --git a/src/main/java/domain/HoldingCards.java b/src/main/java/domain/blackjack/HoldingCards.java similarity index 92% rename from src/main/java/domain/HoldingCards.java rename to src/main/java/domain/blackjack/HoldingCards.java index 88ccdc2bf8e..6bd1bb58eec 100644 --- a/src/main/java/domain/HoldingCards.java +++ b/src/main/java/domain/blackjack/HoldingCards.java @@ -1,5 +1,7 @@ -package domain; +package domain.blackjack; +import domain.card.Card; +import domain.card.CardName; import java.util.ArrayList; import java.util.Collections; import java.util.List; diff --git a/src/main/java/domain/PlayerRandomCardDrawStrategy.java b/src/main/java/domain/blackjack/PlayerRandomCardDrawStrategy.java similarity index 83% rename from src/main/java/domain/PlayerRandomCardDrawStrategy.java rename to src/main/java/domain/blackjack/PlayerRandomCardDrawStrategy.java index f2a9a67aff5..fe5ee8f3d34 100644 --- a/src/main/java/domain/PlayerRandomCardDrawStrategy.java +++ b/src/main/java/domain/blackjack/PlayerRandomCardDrawStrategy.java @@ -1,4 +1,4 @@ -package domain; +package domain.blackjack; public class PlayerRandomCardDrawStrategy extends AbstractRandomCardDrawStrategy { private final Gamer player; @@ -8,7 +8,7 @@ public PlayerRandomCardDrawStrategy(Gamer player) { } @Override - protected boolean canDraw() { + public boolean canDraw() { return !player.getSummationCardPoint().isDeadPoint(); } } diff --git a/src/main/java/domain/SummationCardPoint.java b/src/main/java/domain/blackjack/SummationCardPoint.java similarity index 96% rename from src/main/java/domain/SummationCardPoint.java rename to src/main/java/domain/blackjack/SummationCardPoint.java index 320e09550bd..b57954ff142 100644 --- a/src/main/java/domain/SummationCardPoint.java +++ b/src/main/java/domain/blackjack/SummationCardPoint.java @@ -1,4 +1,4 @@ -package domain; +package domain.blackjack; import java.util.List; diff --git a/src/main/java/domain/Card.java b/src/main/java/domain/card/Card.java similarity index 73% rename from src/main/java/domain/Card.java rename to src/main/java/domain/card/Card.java index 077898a82a4..8707446f14b 100644 --- a/src/main/java/domain/Card.java +++ b/src/main/java/domain/card/Card.java @@ -1,4 +1,4 @@ -package domain; +package domain.card; public record Card(CardName name, CardType cardType) { diff --git a/src/main/java/domain/CardDrawStrategy.java b/src/main/java/domain/card/CardDrawStrategy.java similarity index 82% rename from src/main/java/domain/CardDrawStrategy.java rename to src/main/java/domain/card/CardDrawStrategy.java index 1463e634a73..79ff73ecfea 100644 --- a/src/main/java/domain/CardDrawStrategy.java +++ b/src/main/java/domain/card/CardDrawStrategy.java @@ -1,4 +1,4 @@ -package domain; +package domain.card; import java.util.List; diff --git a/src/main/java/domain/CardName.java b/src/main/java/domain/card/CardName.java similarity index 94% rename from src/main/java/domain/CardName.java rename to src/main/java/domain/card/CardName.java index 55265c31962..8336f679ee6 100644 --- a/src/main/java/domain/CardName.java +++ b/src/main/java/domain/card/CardName.java @@ -1,4 +1,4 @@ -package domain; +package domain.card; public enum CardName { ACE(1), @@ -20,7 +20,7 @@ public enum CardName { CardName(int cardNumber) { this.cardNumber = cardNumber; } - + public int getCardNumber() { return cardNumber; } diff --git a/src/main/java/domain/CardType.java b/src/main/java/domain/card/CardType.java similarity index 74% rename from src/main/java/domain/CardType.java rename to src/main/java/domain/card/CardType.java index 98f58e37c4b..1a06a857b9e 100644 --- a/src/main/java/domain/CardType.java +++ b/src/main/java/domain/card/CardType.java @@ -1,4 +1,4 @@ -package domain; +package domain.card; public enum CardType { HEART, SPADE, CLOVER, DIAMOND; diff --git a/src/main/java/domain/Deck.java b/src/main/java/domain/card/Deck.java similarity index 98% rename from src/main/java/domain/Deck.java rename to src/main/java/domain/card/Deck.java index 9c5442977b1..67e544f925c 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.HashSet; @@ -16,7 +16,7 @@ private Deck(List cards) { public static Deck of(Card... cards) { return new Deck(List.of(cards)); } - + public static Deck fullDeck() { List cards = new ArrayList<>(); for (CardType cardType : CardType.values()) { diff --git a/src/main/java/dto/DealerGameResultDTO.java b/src/main/java/dto/DealerGameResultDTO.java index 807f5399fd6..10d15bbd5bf 100644 --- a/src/main/java/dto/DealerGameResultDTO.java +++ b/src/main/java/dto/DealerGameResultDTO.java @@ -1,6 +1,6 @@ package dto; -import domain.GameResult; +import domain.blackjack.GameResult; import java.util.Map; public class DealerGameResultDTO { diff --git a/src/main/java/dto/GamerDTO.java b/src/main/java/dto/GamerDTO.java index fa5107482ce..143155a32ca 100644 --- a/src/main/java/dto/GamerDTO.java +++ b/src/main/java/dto/GamerDTO.java @@ -1,6 +1,6 @@ package dto; -import domain.Card; +import domain.card.Card; import java.util.List; public class GamerDTO { diff --git a/src/main/java/dto/PlayerGameResultDTO.java b/src/main/java/dto/PlayerGameResultDTO.java index 1365f0ca1e7..5b253d059ec 100644 --- a/src/main/java/dto/PlayerGameResultDTO.java +++ b/src/main/java/dto/PlayerGameResultDTO.java @@ -1,6 +1,6 @@ package dto; -import domain.GameResult; +import domain.blackjack.GameResult; public class PlayerGameResultDTO { private final String gamerName; diff --git a/src/main/java/view/GameResultOutputView.java b/src/main/java/view/GameResultOutputView.java index e73edeb3e0a..2ba739697f2 100644 --- a/src/main/java/view/GameResultOutputView.java +++ b/src/main/java/view/GameResultOutputView.java @@ -1,6 +1,6 @@ package view; -import domain.GameResult; +import domain.blackjack.GameResult; import dto.DealerGameResultDTO; import dto.PlayerGameResultDTO; import java.util.Map; @@ -21,7 +21,7 @@ public static void print(DealerGameResultDTO dealerGameResultDTO) { .collect(Collectors.joining(" ")); System.out.printf("딜러: %s\n", dealersGameResultOutput); } - + private static String mapToString(GameResult gameResult) { if (gameResult == GameResult.WIN) { return "승"; diff --git a/src/main/java/view/GamerOutputView.java b/src/main/java/view/GamerOutputView.java index 64033b98c74..6e14b257b06 100644 --- a/src/main/java/view/GamerOutputView.java +++ b/src/main/java/view/GamerOutputView.java @@ -1,8 +1,8 @@ package view; -import domain.Card; -import domain.CardName; -import domain.CardType; +import domain.card.Card; +import domain.card.CardName; +import domain.card.CardType; import dto.GamerDTO; import java.util.List; import java.util.stream.Collectors; @@ -30,7 +30,7 @@ private static String mapToString(CardType cardType) { } throw new IllegalArgumentException("잘못된 카드 타입입니다."); } - + private static String mapToString(CardName cardName) { if (cardName == CardName.ACE) { return "A"; diff --git a/src/test/java/domain/CardPointCalculatorTest.java b/src/test/java/domain/blackjack/CardPointCalculatorTest.java similarity index 93% rename from src/test/java/domain/CardPointCalculatorTest.java rename to src/test/java/domain/blackjack/CardPointCalculatorTest.java index d560414789d..7f0fd23530c 100644 --- a/src/test/java/domain/CardPointCalculatorTest.java +++ b/src/test/java/domain/blackjack/CardPointCalculatorTest.java @@ -1,5 +1,8 @@ -package domain; +package domain.blackjack; +import domain.card.Card; +import domain.card.CardName; +import domain.card.CardType; import java.util.ArrayList; import java.util.List; import java.util.stream.Stream; diff --git a/src/test/java/domain/DealerCardDrawStrategyTest.java b/src/test/java/domain/blackjack/DealerCardDrawStrategyTest.java similarity index 72% rename from src/test/java/domain/DealerCardDrawStrategyTest.java rename to src/test/java/domain/blackjack/DealerCardDrawStrategyTest.java index 3cfbdd19a69..d8bed4acfb7 100644 --- a/src/test/java/domain/DealerCardDrawStrategyTest.java +++ b/src/test/java/domain/blackjack/DealerCardDrawStrategyTest.java @@ -1,12 +1,16 @@ -package domain; +package domain.blackjack; -import static domain.CardName.ACE; -import static domain.CardName.FIVE; -import static domain.CardName.JACK; -import static domain.CardName.QUEEN; -import static domain.CardName.SIX; -import static domain.CardType.HEART; +import static domain.card.CardName.ACE; +import static domain.card.CardName.FIVE; +import static domain.card.CardName.JACK; +import static domain.card.CardName.QUEEN; +import static domain.card.CardName.SIX; +import static domain.card.CardType.HEART; +import domain.blackjack.DealerRandomCardDrawStrategy; +import domain.blackjack.Gamer; +import domain.blackjack.HoldingCards; +import domain.card.Card; import java.util.stream.Stream; import org.assertj.core.api.Assertions; import org.junit.jupiter.api.DisplayName; diff --git a/src/test/java/domain/GameResultCalculatorTest.java b/src/test/java/domain/blackjack/GameResultCalculatorTest.java similarity index 81% rename from src/test/java/domain/GameResultCalculatorTest.java rename to src/test/java/domain/blackjack/GameResultCalculatorTest.java index c9d049f7f13..49fb2280da3 100644 --- a/src/test/java/domain/GameResultCalculatorTest.java +++ b/src/test/java/domain/blackjack/GameResultCalculatorTest.java @@ -1,18 +1,19 @@ -package domain; - -import static domain.CardName.ACE; -import static domain.CardName.JACK; -import static domain.CardName.NINE; -import static domain.CardName.QUEEN; -import static domain.CardName.SEVEN; -import static domain.CardName.SIX; -import static domain.CardName.TWO; -import static domain.CardType.DIAMOND; -import static domain.CardType.HEART; -import static domain.GameResult.LOSE; -import static domain.GameResult.TIE; -import static domain.GameResult.WIN; - +package domain.blackjack; + +import static domain.blackjack.GameResult.LOSE; +import static domain.blackjack.GameResult.TIE; +import static domain.blackjack.GameResult.WIN; +import static domain.card.CardName.ACE; +import static domain.card.CardName.JACK; +import static domain.card.CardName.NINE; +import static domain.card.CardName.QUEEN; +import static domain.card.CardName.SEVEN; +import static domain.card.CardName.SIX; +import static domain.card.CardName.TWO; +import static domain.card.CardType.DIAMOND; +import static domain.card.CardType.HEART; + +import domain.card.Card; import java.util.stream.Stream; import org.assertj.core.api.Assertions; import org.junit.jupiter.api.DisplayName; diff --git a/src/test/java/domain/GamerTest.java b/src/test/java/domain/blackjack/GamerTest.java similarity index 87% rename from src/test/java/domain/GamerTest.java rename to src/test/java/domain/blackjack/GamerTest.java index 2b5e13b19c2..fb8afff908b 100644 --- a/src/test/java/domain/GamerTest.java +++ b/src/test/java/domain/blackjack/GamerTest.java @@ -1,14 +1,16 @@ -package domain; +package domain.blackjack; -import static domain.CardName.ACE; -import static domain.CardName.EIGHT; -import static domain.CardName.JACK; -import static domain.CardName.QUEEN; -import static domain.CardName.SEVEN; -import static domain.CardName.TWO; -import static domain.CardType.HEART; -import static domain.CardType.SPADE; +import static domain.card.CardName.ACE; +import static domain.card.CardName.EIGHT; +import static domain.card.CardName.JACK; +import static domain.card.CardName.QUEEN; +import static domain.card.CardName.SEVEN; +import static domain.card.CardName.TWO; +import static domain.card.CardType.HEART; +import static domain.card.CardType.SPADE; +import domain.card.Card; +import domain.card.Deck; import java.util.stream.Stream; import org.assertj.core.api.Assertions; import org.junit.jupiter.api.DisplayName; diff --git a/src/test/java/domain/HoldingCardsTest.java b/src/test/java/domain/blackjack/HoldingCardsTest.java similarity index 75% rename from src/test/java/domain/HoldingCardsTest.java rename to src/test/java/domain/blackjack/HoldingCardsTest.java index 93f15e3548c..57d562e747f 100644 --- a/src/test/java/domain/HoldingCardsTest.java +++ b/src/test/java/domain/blackjack/HoldingCardsTest.java @@ -1,12 +1,13 @@ -package domain; +package domain.blackjack; -import static domain.CardName.ACE; -import static domain.CardName.JACK; -import static domain.CardName.KING; -import static domain.CardName.QUEEN; -import static domain.CardName.SIX; -import static domain.CardType.HEART; +import static domain.card.CardName.ACE; +import static domain.card.CardName.JACK; +import static domain.card.CardName.KING; +import static domain.card.CardName.QUEEN; +import static domain.card.CardName.SIX; +import static domain.card.CardType.HEART; +import domain.card.Card; import org.assertj.core.api.Assertions; import org.junit.jupiter.api.DisplayName; import org.junit.jupiter.api.Test; diff --git a/src/test/java/domain/SummationCardPointTest.java b/src/test/java/domain/blackjack/SummationCardPointTest.java similarity index 96% rename from src/test/java/domain/SummationCardPointTest.java rename to src/test/java/domain/blackjack/SummationCardPointTest.java index 77c0c704d81..5daf2bb61b0 100644 --- a/src/test/java/domain/SummationCardPointTest.java +++ b/src/test/java/domain/blackjack/SummationCardPointTest.java @@ -1,4 +1,4 @@ -package domain; +package domain.blackjack; import java.util.List; import org.assertj.core.api.Assertions; diff --git a/src/test/java/domain/TestDealerCardDrawStrategy.java b/src/test/java/domain/blackjack/TestDealerCardDrawStrategy.java similarity index 80% rename from src/test/java/domain/TestDealerCardDrawStrategy.java rename to src/test/java/domain/blackjack/TestDealerCardDrawStrategy.java index 5d3b97f380d..61b25be36da 100644 --- a/src/test/java/domain/TestDealerCardDrawStrategy.java +++ b/src/test/java/domain/blackjack/TestDealerCardDrawStrategy.java @@ -1,5 +1,9 @@ -package domain; +package domain.blackjack; +import domain.blackjack.Gamer; +import domain.blackjack.SummationCardPoint; +import domain.card.Card; +import domain.card.CardDrawStrategy; import java.util.List; public class TestDealerCardDrawStrategy implements CardDrawStrategy { diff --git a/src/test/java/domain/TestPlayerCardDrawStrategy.java b/src/test/java/domain/blackjack/TestPlayerCardDrawStrategy.java similarity index 84% rename from src/test/java/domain/TestPlayerCardDrawStrategy.java rename to src/test/java/domain/blackjack/TestPlayerCardDrawStrategy.java index e4cc5d07097..942028e6b48 100644 --- a/src/test/java/domain/TestPlayerCardDrawStrategy.java +++ b/src/test/java/domain/blackjack/TestPlayerCardDrawStrategy.java @@ -1,5 +1,8 @@ -package domain; +package domain.blackjack; +import domain.blackjack.Gamer; +import domain.card.Card; +import domain.card.CardDrawStrategy; import java.util.List; public class TestPlayerCardDrawStrategy implements CardDrawStrategy { 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 8980980feb1..dfb793e48cf 100644 --- a/src/test/java/domain/DeckTest.java +++ b/src/test/java/domain/card/DeckTest.java @@ -1,7 +1,7 @@ -package domain; +package domain.card; -import static domain.CardName.ACE; -import static domain.CardType.HEART; +import static domain.card.CardName.ACE; +import static domain.card.CardType.HEART; import org.assertj.core.api.Assertions; import org.junit.jupiter.api.DisplayName; From f0aae99b774073fdcaff87b969804290e48fed0b Mon Sep 17 00:00:00 2001 From: BurningFalls Date: Thu, 7 Mar 2024 17:19:00 +0900 Subject: [PATCH 29/56] =?UTF-8?q?refactor:=20=ED=81=B4=EB=9E=98=EC=8A=A4?= =?UTF-8?q?=20=EB=B0=8F=20=ED=8C=A8=ED=82=A4=EC=A7=80=20=EC=A0=91=EA=B7=BC?= =?UTF-8?q?=EC=A7=80=EC=A0=95=EC=9E=90=20=EC=A1=B0=EC=9D=B4=EA=B8=B0?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../domain/blackjack/AbstractRandomCardDrawStrategy.java | 4 ++-- src/main/java/domain/blackjack/CardPoint.java | 2 +- src/main/java/domain/blackjack/CardPointCalculator.java | 5 ++--- .../java/domain/blackjack/DealerRandomCardDrawStrategy.java | 2 +- src/main/java/domain/blackjack/Gamer.java | 2 +- src/main/java/domain/blackjack/HoldingCards.java | 4 ++-- .../java/domain/blackjack/PlayerRandomCardDrawStrategy.java | 2 +- src/main/java/domain/blackjack/SummationCardPoint.java | 4 ++-- 8 files changed, 12 insertions(+), 13 deletions(-) diff --git a/src/main/java/domain/blackjack/AbstractRandomCardDrawStrategy.java b/src/main/java/domain/blackjack/AbstractRandomCardDrawStrategy.java index 73c88ba71ab..5674a6f4008 100644 --- a/src/main/java/domain/blackjack/AbstractRandomCardDrawStrategy.java +++ b/src/main/java/domain/blackjack/AbstractRandomCardDrawStrategy.java @@ -5,7 +5,7 @@ import java.util.List; import java.util.Random; -public abstract class AbstractRandomCardDrawStrategy implements CardDrawStrategy { +abstract class AbstractRandomCardDrawStrategy implements CardDrawStrategy { @Override public final Card nextCard(List cards) { if (canDraw()) { @@ -14,7 +14,7 @@ public final Card nextCard(List cards) { throw new IllegalStateException("카드를 더이상 뽑을 수 없습니다."); } - public abstract boolean canDraw(); + abstract boolean canDraw(); private Card cardSelectStrategy(List cards) { Random random = new Random(); diff --git a/src/main/java/domain/blackjack/CardPoint.java b/src/main/java/domain/blackjack/CardPoint.java index 43ffaab6598..ba3f1640caf 100644 --- a/src/main/java/domain/blackjack/CardPoint.java +++ b/src/main/java/domain/blackjack/CardPoint.java @@ -1,5 +1,5 @@ package domain.blackjack; -public record CardPoint(int point) { +record CardPoint(int point) { } diff --git a/src/main/java/domain/blackjack/CardPointCalculator.java b/src/main/java/domain/blackjack/CardPointCalculator.java index 6e518b58be7..6ee8eaed09c 100644 --- a/src/main/java/domain/blackjack/CardPointCalculator.java +++ b/src/main/java/domain/blackjack/CardPointCalculator.java @@ -1,11 +1,10 @@ package domain.blackjack; -import domain.blackjack.CardPoint; import domain.card.Card; import domain.card.CardName; -public class CardPointCalculator { - public static CardPoint calculate(Card card) { +class CardPointCalculator { + static CardPoint calculate(Card card) { CardName cardName = card.name(); int cardNumber = cardName.getCardNumber(); if (cardNumber > 10) { diff --git a/src/main/java/domain/blackjack/DealerRandomCardDrawStrategy.java b/src/main/java/domain/blackjack/DealerRandomCardDrawStrategy.java index 83a502dc6c7..3fec7e53a4d 100644 --- a/src/main/java/domain/blackjack/DealerRandomCardDrawStrategy.java +++ b/src/main/java/domain/blackjack/DealerRandomCardDrawStrategy.java @@ -8,7 +8,7 @@ public DealerRandomCardDrawStrategy(Gamer dealer) { } @Override - public boolean canDraw() { + boolean canDraw() { SummationCardPoint summationCardPoint = dealer.getSummationCardPoint(); return !summationCardPoint.isBiggerThan(new SummationCardPoint(16)); } diff --git a/src/main/java/domain/blackjack/Gamer.java b/src/main/java/domain/blackjack/Gamer.java index eafbc665dcf..0739b2da8c1 100644 --- a/src/main/java/domain/blackjack/Gamer.java +++ b/src/main/java/domain/blackjack/Gamer.java @@ -48,7 +48,7 @@ public int getRawSummationCardPoint() { return getSummationCardPoint().summationCardPoint(); } - public boolean isDead() { + boolean isDead() { return holdingCards.calculateTotalPoint().isDeadPoint(); } diff --git a/src/main/java/domain/blackjack/HoldingCards.java b/src/main/java/domain/blackjack/HoldingCards.java index 6bd1bb58eec..4546a7bba6c 100644 --- a/src/main/java/domain/blackjack/HoldingCards.java +++ b/src/main/java/domain/blackjack/HoldingCards.java @@ -17,7 +17,7 @@ public static HoldingCards of(Card... cards) { return new HoldingCards(new ArrayList<>(List.of(cards))); } - public SummationCardPoint calculateTotalPoint() { + SummationCardPoint calculateTotalPoint() { List cardPoints = holdingCards.stream() .map(CardPointCalculator::calculate) .toList(); @@ -25,7 +25,7 @@ public SummationCardPoint calculateTotalPoint() { return SummationCardPoint.of(cardPoints); } - public void add(Card card) { + void add(Card card) { holdingCards.add(card); } diff --git a/src/main/java/domain/blackjack/PlayerRandomCardDrawStrategy.java b/src/main/java/domain/blackjack/PlayerRandomCardDrawStrategy.java index fe5ee8f3d34..ec34864da0a 100644 --- a/src/main/java/domain/blackjack/PlayerRandomCardDrawStrategy.java +++ b/src/main/java/domain/blackjack/PlayerRandomCardDrawStrategy.java @@ -8,7 +8,7 @@ public PlayerRandomCardDrawStrategy(Gamer player) { } @Override - public boolean canDraw() { + boolean canDraw() { return !player.getSummationCardPoint().isDeadPoint(); } } diff --git a/src/main/java/domain/blackjack/SummationCardPoint.java b/src/main/java/domain/blackjack/SummationCardPoint.java index b57954ff142..b021a87178c 100644 --- a/src/main/java/domain/blackjack/SummationCardPoint.java +++ b/src/main/java/domain/blackjack/SummationCardPoint.java @@ -5,7 +5,7 @@ public record SummationCardPoint(int summationCardPoint) { private static final int DEAD_POINT_THRESHOLD = 21; - public static SummationCardPoint of(List cardPoints) { + static SummationCardPoint of(List cardPoints) { int summationCardPoint = cardPoints.stream() .mapToInt(CardPoint::point) .sum(); @@ -17,7 +17,7 @@ public boolean isBiggerThan(SummationCardPoint other) { return summationCardPoint > otherPoint; } - public boolean isDeadPoint() { + boolean isDeadPoint() { return this.isBiggerThan(new SummationCardPoint(DEAD_POINT_THRESHOLD)); } } From 6322d3dbd76f8c0fdf683f161943a035e984fea1 Mon Sep 17 00:00:00 2001 From: robinjoon Date: Thu, 7 Mar 2024 20:16:02 +0900 Subject: [PATCH 30/56] =?UTF-8?q?refactor:=20=EB=A9=94=EC=84=9C=EB=93=9C?= =?UTF-8?q?=20=EB=B6=84=EB=A6=AC?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- src/main/java/domain/card/Deck.java | 19 +++++++++------ .../blackjack/CardPointCalculatorTest.java | 23 +++++++++++-------- 2 files changed, 25 insertions(+), 17 deletions(-) diff --git a/src/main/java/domain/card/Deck.java b/src/main/java/domain/card/Deck.java index 67e544f925c..5988259cc06 100644 --- a/src/main/java/domain/card/Deck.java +++ b/src/main/java/domain/card/Deck.java @@ -1,6 +1,8 @@ package domain.card; import java.util.ArrayList; +import java.util.Arrays; +import java.util.Collection; import java.util.HashSet; import java.util.List; import java.util.Set; @@ -18,16 +20,19 @@ public static Deck of(Card... cards) { } public static Deck fullDeck() { - List cards = new ArrayList<>(); - for (CardType cardType : CardType.values()) { - for (CardName cardName : CardName.values()) { - Card card = new Card(cardName, cardType); - cards.add(card); - } - } + List cards = Arrays.stream(CardType.values()) + .map(Deck::makeSameTypeCards) + .flatMap(Collection::stream) + .toList(); return new Deck(cards); } + private static List makeSameTypeCards(CardType cardType) { + return Arrays.stream(CardName.values()) + .map(cardName -> new Card(cardName, cardType)) + .toList(); + } + private void validateDuplicateCard(List cards) { Set cardSet = new HashSet<>(cards); if (cardSet.size() != cards.size()) { diff --git a/src/test/java/domain/blackjack/CardPointCalculatorTest.java b/src/test/java/domain/blackjack/CardPointCalculatorTest.java index 7f0fd23530c..152bd0639cd 100644 --- a/src/test/java/domain/blackjack/CardPointCalculatorTest.java +++ b/src/test/java/domain/blackjack/CardPointCalculatorTest.java @@ -3,7 +3,8 @@ import domain.card.Card; import domain.card.CardName; import domain.card.CardType; -import java.util.ArrayList; +import java.util.Arrays; +import java.util.Collection; import java.util.List; import java.util.stream.Stream; import org.assertj.core.api.Assertions; @@ -15,15 +16,17 @@ class CardPointCalculatorTest { static Stream calculateParameter() { - List arguments = new ArrayList<>(); - for (CardType cardType : CardType.values()) { - for (CardName cardName : CardName.values()) { - Card card = new Card(cardName, cardType); - CardPoint cardPoint = makeCardPoint(cardName); - arguments.add(Arguments.of(card, cardPoint)); - } - } - return Stream.of(arguments.toArray(new Arguments[0])); + return Stream.of(Arrays.stream(CardType.values()) + .map(CardPointCalculatorTest::makeSameTypeCards) + .flatMap(Collection::stream) + .map(card -> Arguments.of(card, makeCardPoint(card.name()))) + .toArray(Arguments[]::new)); + } + + private static List makeSameTypeCards(CardType cardType) { + return Arrays.stream(CardName.values()) + .map(cardName -> new Card(cardName, cardType)) + .toList(); } private static CardPoint makeCardPoint(CardName cardName) { From 61eb780d35161d3c57efdb243ab6b08ea007eae6 Mon Sep 17 00:00:00 2001 From: robinjoon Date: Thu, 7 Mar 2024 20:19:32 +0900 Subject: [PATCH 31/56] =?UTF-8?q?style:=20=ED=81=B4=EB=9E=98=EC=8A=A4?= =?UTF-8?q?=EC=99=80=20=EC=A0=9C=EC=9D=BC=20=EC=9C=84=EC=97=90=20=EC=9C=84?= =?UTF-8?q?=EC=B9=98=ED=95=9C=20=ED=95=84=EB=93=9C(=EB=A9=94=EC=84=9C?= =?UTF-8?q?=EB=93=9C)=20=EC=82=AC=EC=9D=B4=EC=97=90=20=EA=B3=B5=EB=B0=B1?= =?UTF-8?q?=20=EB=9D=BC=EC=9D=B8=20=EC=A0=9C=EA=B1=B0?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- src/test/java/domain/blackjack/CardPointCalculatorTest.java | 1 - .../java/domain/blackjack/DealerCardDrawStrategyTest.java | 4 ---- src/test/java/domain/blackjack/GamerTest.java | 1 - src/test/java/domain/blackjack/HoldingCardsTest.java | 1 - src/test/java/domain/blackjack/SummationCardPointTest.java | 1 - .../java/domain/blackjack/TestDealerCardDrawStrategy.java | 2 -- .../java/domain/blackjack/TestPlayerCardDrawStrategy.java | 1 - src/test/java/domain/card/DeckTest.java | 1 - 8 files changed, 12 deletions(-) diff --git a/src/test/java/domain/blackjack/CardPointCalculatorTest.java b/src/test/java/domain/blackjack/CardPointCalculatorTest.java index 152bd0639cd..6467fde3463 100644 --- a/src/test/java/domain/blackjack/CardPointCalculatorTest.java +++ b/src/test/java/domain/blackjack/CardPointCalculatorTest.java @@ -14,7 +14,6 @@ import org.junit.jupiter.params.provider.MethodSource; class CardPointCalculatorTest { - static Stream calculateParameter() { return Stream.of(Arrays.stream(CardType.values()) .map(CardPointCalculatorTest::makeSameTypeCards) diff --git a/src/test/java/domain/blackjack/DealerCardDrawStrategyTest.java b/src/test/java/domain/blackjack/DealerCardDrawStrategyTest.java index d8bed4acfb7..7dc094263ae 100644 --- a/src/test/java/domain/blackjack/DealerCardDrawStrategyTest.java +++ b/src/test/java/domain/blackjack/DealerCardDrawStrategyTest.java @@ -7,9 +7,6 @@ import static domain.card.CardName.SIX; import static domain.card.CardType.HEART; -import domain.blackjack.DealerRandomCardDrawStrategy; -import domain.blackjack.Gamer; -import domain.blackjack.HoldingCards; import domain.card.Card; import java.util.stream.Stream; import org.assertj.core.api.Assertions; @@ -19,7 +16,6 @@ import org.junit.jupiter.params.provider.MethodSource; class DealerCardDrawStrategyTest { - public static Stream canDrawParameters() { return Stream.of( Arguments.of(HoldingCards.of(new Card(ACE, HEART), new Card(SIX, HEART)), false), diff --git a/src/test/java/domain/blackjack/GamerTest.java b/src/test/java/domain/blackjack/GamerTest.java index fb8afff908b..cb0714eee6d 100644 --- a/src/test/java/domain/blackjack/GamerTest.java +++ b/src/test/java/domain/blackjack/GamerTest.java @@ -21,7 +21,6 @@ // TODO: GameResultCalculateTest처럼 인스턴스 변수 정의 필요 class GamerTest { - public static Stream isDeadParameters() { return Stream.of( Arguments.of(new Card(TWO, HEART), true), Arguments.of(new Card(ACE, HEART), false) diff --git a/src/test/java/domain/blackjack/HoldingCardsTest.java b/src/test/java/domain/blackjack/HoldingCardsTest.java index 57d562e747f..29eb7ee3fdd 100644 --- a/src/test/java/domain/blackjack/HoldingCardsTest.java +++ b/src/test/java/domain/blackjack/HoldingCardsTest.java @@ -13,7 +13,6 @@ import org.junit.jupiter.api.Test; class HoldingCardsTest { - @Test @DisplayName("포함된 카드의 포인트 합계가 올바른지 검증") void calculateTotalPoint() { diff --git a/src/test/java/domain/blackjack/SummationCardPointTest.java b/src/test/java/domain/blackjack/SummationCardPointTest.java index 5daf2bb61b0..842c69e76f4 100644 --- a/src/test/java/domain/blackjack/SummationCardPointTest.java +++ b/src/test/java/domain/blackjack/SummationCardPointTest.java @@ -6,7 +6,6 @@ import org.junit.jupiter.api.Test; class SummationCardPointTest { - @Test @DisplayName("카드 포인트 합이 잘 생성되는지 검증") void getSummationCardPoint() { diff --git a/src/test/java/domain/blackjack/TestDealerCardDrawStrategy.java b/src/test/java/domain/blackjack/TestDealerCardDrawStrategy.java index 61b25be36da..827bf97fed8 100644 --- a/src/test/java/domain/blackjack/TestDealerCardDrawStrategy.java +++ b/src/test/java/domain/blackjack/TestDealerCardDrawStrategy.java @@ -1,7 +1,5 @@ package domain.blackjack; -import domain.blackjack.Gamer; -import domain.blackjack.SummationCardPoint; import domain.card.Card; import domain.card.CardDrawStrategy; import java.util.List; diff --git a/src/test/java/domain/blackjack/TestPlayerCardDrawStrategy.java b/src/test/java/domain/blackjack/TestPlayerCardDrawStrategy.java index 942028e6b48..2b835249a81 100644 --- a/src/test/java/domain/blackjack/TestPlayerCardDrawStrategy.java +++ b/src/test/java/domain/blackjack/TestPlayerCardDrawStrategy.java @@ -1,6 +1,5 @@ package domain.blackjack; -import domain.blackjack.Gamer; import domain.card.Card; import domain.card.CardDrawStrategy; import java.util.List; diff --git a/src/test/java/domain/card/DeckTest.java b/src/test/java/domain/card/DeckTest.java index dfb793e48cf..2cddfa48c98 100644 --- a/src/test/java/domain/card/DeckTest.java +++ b/src/test/java/domain/card/DeckTest.java @@ -8,7 +8,6 @@ import org.junit.jupiter.api.Test; class DeckTest { - @Test @DisplayName("원하는 방식대로 카드가 뽑히는지 검증") void validateDraw() { From 4c5d1a40f97b4fd63c0f9d44cd1a32bf78e193ef Mon Sep 17 00:00:00 2001 From: robinjoon Date: Thu, 7 Mar 2024 20:48:40 +0900 Subject: [PATCH 32/56] =?UTF-8?q?refactor:=20=EC=9D=BC=EB=B6=80=20?= =?UTF-8?q?=EB=A7=A4=EC=A7=81=20=EA=B0=92=EC=9D=84=20=EC=83=81=EC=88=98=20?= =?UTF-8?q?=ED=98=B9=EC=9D=80=20=EC=9D=98=EB=AF=B8=EC=9E=88=EB=8A=94=20?= =?UTF-8?q?=EB=B3=80=EC=88=98=EB=A1=9C=20=EC=B6=94=EC=B6=9C?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- src/main/java/domain/blackjack/CardPointCalculator.java | 6 ++++-- .../java/domain/blackjack/DealerRandomCardDrawStrategy.java | 3 ++- src/main/java/domain/blackjack/Gamer.java | 4 +++- src/test/java/domain/blackjack/CardPointCalculatorTest.java | 6 ++++-- 4 files changed, 13 insertions(+), 6 deletions(-) diff --git a/src/main/java/domain/blackjack/CardPointCalculator.java b/src/main/java/domain/blackjack/CardPointCalculator.java index 6ee8eaed09c..7174492f68c 100644 --- a/src/main/java/domain/blackjack/CardPointCalculator.java +++ b/src/main/java/domain/blackjack/CardPointCalculator.java @@ -1,5 +1,7 @@ package domain.blackjack; +import static domain.card.CardName.TEN; + import domain.card.Card; import domain.card.CardName; @@ -7,8 +9,8 @@ class CardPointCalculator { static CardPoint calculate(Card card) { CardName cardName = card.name(); int cardNumber = cardName.getCardNumber(); - if (cardNumber > 10) { - return new CardPoint(10); + if (cardNumber > TEN.getCardNumber()) { + return new CardPoint(TEN.getCardNumber()); } return new CardPoint(cardNumber); } diff --git a/src/main/java/domain/blackjack/DealerRandomCardDrawStrategy.java b/src/main/java/domain/blackjack/DealerRandomCardDrawStrategy.java index 3fec7e53a4d..2d25c751c8b 100644 --- a/src/main/java/domain/blackjack/DealerRandomCardDrawStrategy.java +++ b/src/main/java/domain/blackjack/DealerRandomCardDrawStrategy.java @@ -10,6 +10,7 @@ public DealerRandomCardDrawStrategy(Gamer dealer) { @Override boolean canDraw() { SummationCardPoint summationCardPoint = dealer.getSummationCardPoint(); - return !summationCardPoint.isBiggerThan(new SummationCardPoint(16)); + SummationCardPoint dealerDrawThresholdPoint = new SummationCardPoint(16); + return !summationCardPoint.isBiggerThan(dealerDrawThresholdPoint); } } diff --git a/src/main/java/domain/blackjack/Gamer.java b/src/main/java/domain/blackjack/Gamer.java index 0739b2da8c1..8556c08ed81 100644 --- a/src/main/java/domain/blackjack/Gamer.java +++ b/src/main/java/domain/blackjack/Gamer.java @@ -1,5 +1,7 @@ package domain.blackjack; +import static domain.card.CardName.TEN; + import domain.card.Card; import domain.card.CardDrawStrategy; import domain.card.Deck; @@ -29,7 +31,7 @@ public SummationCardPoint getSummationCardPoint() { } private int fixPoint(int rawPoint) { - SummationCardPoint fixPoint = new SummationCardPoint(rawPoint + 10); + SummationCardPoint fixPoint = new SummationCardPoint(rawPoint + TEN.getCardNumber()); if (!fixPoint.isDeadPoint()) { return fixPoint.summationCardPoint(); } diff --git a/src/test/java/domain/blackjack/CardPointCalculatorTest.java b/src/test/java/domain/blackjack/CardPointCalculatorTest.java index 6467fde3463..4e8f28ee93c 100644 --- a/src/test/java/domain/blackjack/CardPointCalculatorTest.java +++ b/src/test/java/domain/blackjack/CardPointCalculatorTest.java @@ -1,5 +1,7 @@ package domain.blackjack; +import static domain.card.CardName.TEN; + import domain.card.Card; import domain.card.CardName; import domain.card.CardType; @@ -30,8 +32,8 @@ private static List makeSameTypeCards(CardType cardType) { private static CardPoint makeCardPoint(CardName cardName) { CardPoint cardPoint = new CardPoint(cardName.getCardNumber()); - if (cardName.getCardNumber() > 10) { - return new CardPoint(10); + if (cardName.getCardNumber() > TEN.getCardNumber()) { + return new CardPoint(TEN.getCardNumber()); } return cardPoint; } From 14110548442c083a5856c386f6ab6c66a0c88af4 Mon Sep 17 00:00:00 2001 From: robinjoon Date: Thu, 7 Mar 2024 23:07:49 +0900 Subject: [PATCH 33/56] =?UTF-8?q?fix:=20=ED=94=8C=EB=A0=88=EC=9D=B4?= =?UTF-8?q?=EC=96=B4=20=EC=9D=B4=EB=A6=84=EC=9D=84=20=EC=9E=98=EB=AA=BB=20?= =?UTF-8?q?=EC=B6=9C=EB=A0=A5=ED=95=98=EB=8A=94=20=EB=B2=84=EA=B7=B8=20?= =?UTF-8?q?=EC=88=98=EC=A0=95?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- src/main/java/controller/BlackjackController.java | 5 +++-- 1 file changed, 3 insertions(+), 2 deletions(-) diff --git a/src/main/java/controller/BlackjackController.java b/src/main/java/controller/BlackjackController.java index 77767d470b3..741d25d5032 100644 --- a/src/main/java/controller/BlackjackController.java +++ b/src/main/java/controller/BlackjackController.java @@ -1,8 +1,8 @@ package controller; +import domain.blackjack.DealerRandomCardDrawStrategy; import domain.blackjack.GameResult; import domain.blackjack.GameResultCalculator; -import domain.blackjack.DealerRandomCardDrawStrategy; import domain.blackjack.Gamer; import domain.blackjack.PlayerRandomCardDrawStrategy; import domain.blackjack.SummationCardPoint; @@ -45,7 +45,8 @@ private void initDealerAndPlayers(Deck deck) { dealerDraw(deck); players.forEach(player -> playerDraw(deck, player)); players.forEach(player -> playerDraw(deck, player)); - OutputView.print("딜러와 pobi, jason에게 2장을 나누었습니다."); + String namesOutput = players.stream().map(Gamer::getRawName).collect(Collectors.joining(", ")); + OutputView.print("딜러와 %s에게 2장을 나누었습니다.".formatted(namesOutput)); } private void dealerDraw(Deck deck) { From b7ff262429ec5f1970d7e75e0570afe645fa431e Mon Sep 17 00:00:00 2001 From: robinjoon Date: Thu, 7 Mar 2024 23:10:42 +0900 Subject: [PATCH 34/56] =?UTF-8?q?chore:=20=EB=9E=8C=EB=8B=A4=ED=91=9C?= =?UTF-8?q?=ED=98=84=EC=8B=9D=EC=9C=BC=EB=A1=9C=20=EB=B3=80=EA=B2=BD?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- src/main/java/controller/BlackjackController.java | 4 +--- 1 file changed, 1 insertion(+), 3 deletions(-) diff --git a/src/main/java/controller/BlackjackController.java b/src/main/java/controller/BlackjackController.java index 741d25d5032..44f7e521502 100644 --- a/src/main/java/controller/BlackjackController.java +++ b/src/main/java/controller/BlackjackController.java @@ -77,9 +77,7 @@ private static void printPlayer(Gamer player) { } private void playersTryDraw(Deck deck) { - players.forEach(player -> { - playerTryDraw(deck, player); - }); + players.forEach(player -> playerTryDraw(deck, player)); } private void playerTryDraw(Deck deck, Gamer player) { From 0adedd5533bbe4260a53fa9badb7dedfdbc68df2 Mon Sep 17 00:00:00 2001 From: robinjoon Date: Sat, 9 Mar 2024 22:46:14 +0900 Subject: [PATCH 35/56] =?UTF-8?q?docs:=201=EB=8B=A8=EA=B3=84=20=ED=94=BC?= =?UTF-8?q?=EB=93=9C=EB=B0=B1=20=EB=B0=98=EC=98=81=20=EC=98=88=EC=A0=95=20?= =?UTF-8?q?=EB=AA=A9=EB=A1=9D=20=EC=B6=94=EA=B0=80?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- README.md | 9 +++++++++ 1 file changed, 9 insertions(+) diff --git a/README.md b/README.md index b11e4e54f85..d44311ad0cd 100644 --- a/README.md +++ b/README.md @@ -57,3 +57,12 @@ - [x] 카드 받을지 여부 입력 기능 - [x] 전체 게임 진행 기능 - [x] 딜러 Ace 카드 점수 보정 기능 + +## 1단계 피드백 반영 예정 목록 + +- [ ] 드로우 관련 컨트롤러의 책임 덜어내기 +- [ ] 드로우 여부 결정하는 정책과 드로우 방식을 결정하는 정책 분리 +- [ ] 의미 있는 상수화 +- [ ] 테스트 코드에서 사용하는 테스트 객체 생성 역할을 분리 +- [ ] view만을 위한 enum 추가 +- [ ] Card Enum화 From adecadf79677a4e287325df0f09ee0cff57f8a4a Mon Sep 17 00:00:00 2001 From: robinjoon Date: Sun, 10 Mar 2024 00:27:41 +0900 Subject: [PATCH 36/56] =?UTF-8?q?refactor:=20=EB=93=9C=EB=A1=9C=EC=9A=B0?= =?UTF-8?q?=EA=B0=80=20=EA=B0=80=EB=8A=A5=ED=95=9C=EC=A7=80=20=ED=99=95?= =?UTF-8?q?=EC=9D=B8=ED=95=98=EB=8A=94=20=EC=B1=85=EC=9E=84=20=EC=BB=A8?= =?UTF-8?q?=ED=8A=B8=EB=A1=A4=EB=9F=AC=EC=97=90=EC=84=9C=20Gamer=EB=A1=9C?= =?UTF-8?q?=20=EC=9D=B4=EB=8F=99?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- README.md | 2 +- .../java/controller/BlackjackController.java | 44 +++++++++---------- .../java/domain/blackjack/DrawResult.java | 35 +++++++++++++++ src/main/java/domain/blackjack/Gamer.java | 14 ++++-- src/test/java/domain/blackjack/GamerTest.java | 40 ++++++++++++----- 5 files changed, 97 insertions(+), 38 deletions(-) create mode 100644 src/main/java/domain/blackjack/DrawResult.java diff --git a/README.md b/README.md index d44311ad0cd..64bda9f565a 100644 --- a/README.md +++ b/README.md @@ -60,7 +60,7 @@ ## 1단계 피드백 반영 예정 목록 -- [ ] 드로우 관련 컨트롤러의 책임 덜어내기 +- [x] 드로우가 가능한지 확인하는 책임 컨트롤러에서 다른 곳으로 이동 - [ ] 드로우 여부 결정하는 정책과 드로우 방식을 결정하는 정책 분리 - [ ] 의미 있는 상수화 - [ ] 테스트 코드에서 사용하는 테스트 객체 생성 역할을 분리 diff --git a/src/main/java/controller/BlackjackController.java b/src/main/java/controller/BlackjackController.java index 44f7e521502..5f2969bd5e6 100644 --- a/src/main/java/controller/BlackjackController.java +++ b/src/main/java/controller/BlackjackController.java @@ -1,11 +1,11 @@ package controller; import domain.blackjack.DealerRandomCardDrawStrategy; +import domain.blackjack.DrawResult; import domain.blackjack.GameResult; import domain.blackjack.GameResultCalculator; import domain.blackjack.Gamer; import domain.blackjack.PlayerRandomCardDrawStrategy; -import domain.blackjack.SummationCardPoint; import domain.card.Card; import domain.card.Deck; import dto.DealerGameResultDTO; @@ -41,20 +41,20 @@ public void startBlackjackGame(Deck deck) { } private void initDealerAndPlayers(Deck deck) { - dealerDraw(deck); - dealerDraw(deck); - players.forEach(player -> playerDraw(deck, player)); - players.forEach(player -> playerDraw(deck, player)); + for (int index = 0; index < 2; index++) { + dealerDraw(deck); + players.forEach(player -> playerDraw(deck, player)); + } String namesOutput = players.stream().map(Gamer::getRawName).collect(Collectors.joining(", ")); OutputView.print("딜러와 %s에게 2장을 나누었습니다.".formatted(namesOutput)); } - private void dealerDraw(Deck deck) { - dealer.draw(deck, new DealerRandomCardDrawStrategy(dealer)); + private DrawResult dealerDraw(Deck deck) { + return dealer.draw(deck, new DealerRandomCardDrawStrategy(dealer)); } - private void playerDraw(Deck deck, Gamer player) { - player.draw(deck, new PlayerRandomCardDrawStrategy(player)); + private DrawResult playerDraw(Deck deck, Gamer player) { + return player.draw(deck, new PlayerRandomCardDrawStrategy(player)); } private void printDealerAndPlayers() { @@ -81,33 +81,31 @@ private void playersTryDraw(Deck deck) { } private void playerTryDraw(Deck deck, Gamer player) { - boolean needToDraw = true; - while (needToDraw && canDraw(player, new SummationCardPoint(21))) { - needToDraw = playerTryDrawOnce(deck, player); + boolean hasNextDrawChance = true; + while (hasNextDrawChance) { + hasNextDrawChance = playerTryDrawOnce(deck, player); } } private boolean playerTryDrawOnce(Deck deck, Gamer player) { - boolean needToDraw; OutputView.print("%s은(는) 한장의 카드를 더 받겠습니까?(예는 y, 아니오는 n)".formatted(player.getRawName())); - needToDraw = YesOrNoInputView.getYNAsBoolean(); + boolean needToDraw = YesOrNoInputView.getYNAsBoolean(); + DrawResult drawResult = null; if (needToDraw) { - playerDraw(deck, player); + drawResult = playerDraw(deck, player); } printPlayer(player); - return needToDraw; + if (drawResult == null) { + return false; + } + return drawResult.hasNextChance(); } - private boolean canDraw(Gamer player, SummationCardPoint threshold) { - return !player.getSummationCardPoint().isBiggerThan(threshold); - } private void dealerTryDraw(Deck deck) { - try { - dealerDraw(deck); + DrawResult drawResult = dealerDraw(deck); + if (drawResult.isSuccess()) { OutputView.print("딜러는 16이하라 한장의 카드를 더 받았습니다.\n"); - } catch (IllegalStateException ignored) { - } } diff --git a/src/main/java/domain/blackjack/DrawResult.java b/src/main/java/domain/blackjack/DrawResult.java new file mode 100644 index 00000000000..e5a6a65eb54 --- /dev/null +++ b/src/main/java/domain/blackjack/DrawResult.java @@ -0,0 +1,35 @@ +package domain.blackjack; + +public class DrawResult { + private final String failCause; + private final boolean hasNextChance; + + public static DrawResult success(boolean hasNextChance) { + return new DrawResult(null, hasNextChance); + } + + public static DrawResult fail(Exception drawFailCause, boolean hasNextChance) { + return new DrawResult(drawFailCause.getMessage(), hasNextChance); + } + + public static DrawResult fail(String failCause, boolean hasNextChance) { + return new DrawResult(failCause, hasNextChance); + } + + private DrawResult(String failCause, boolean hasNextChance) { + this.failCause = failCause; + this.hasNextChance = hasNextChance; + } + + public boolean hasNextChance() { + return hasNextChance; + } + + public boolean isSuccess() { + return failCause == null; + } + + String getFailCause() { + return failCause; + } +} diff --git a/src/main/java/domain/blackjack/Gamer.java b/src/main/java/domain/blackjack/Gamer.java index 8556c08ed81..f82d114a53f 100644 --- a/src/main/java/domain/blackjack/Gamer.java +++ b/src/main/java/domain/blackjack/Gamer.java @@ -16,9 +16,17 @@ public Gamer(String name, HoldingCards holdingCards) { this.holdingCards = holdingCards; } - public void draw(Deck deck, CardDrawStrategy cardDrawStrategy) { - Card draw = deck.draw(cardDrawStrategy); - holdingCards.add(draw); + public DrawResult draw(Deck deck, CardDrawStrategy cardDrawStrategy) { + if (isDead()) { + return DrawResult.fail("카드를 더이상 뽑을 수 없습니다.", false); + } + try { + Card draw = deck.draw(cardDrawStrategy); + holdingCards.add(draw); + return DrawResult.success(!isDead()); + } catch (IllegalArgumentException | IllegalStateException e) { + return DrawResult.fail(e, !isDead()); + } } public SummationCardPoint getSummationCardPoint() { diff --git a/src/test/java/domain/blackjack/GamerTest.java b/src/test/java/domain/blackjack/GamerTest.java index cb0714eee6d..6a9ed672f3a 100644 --- a/src/test/java/domain/blackjack/GamerTest.java +++ b/src/test/java/domain/blackjack/GamerTest.java @@ -27,14 +27,21 @@ public static Stream isDeadParameters() { ); } + public static Stream validatePlayerHasNextDrawChanceParameters() { + return Stream.of( + Arguments.of(new Card(TWO, HEART), false), + Arguments.of(new Card(ACE, HEART), true) + ); + } + @Test @DisplayName("게임 참가자가 카드를 뽑았을 때 점수가 올바르게 계산되는지 검증") void draw() { - Gamer Gamer = new Gamer("robin", HoldingCards.of()); + Gamer gamer = new Gamer("robin", HoldingCards.of()); Deck deck = Deck.of(new Card(JACK, HEART), new Card(EIGHT, HEART)); - Gamer.draw(deck, new TestPlayerCardDrawStrategy(Gamer)); + gamer.draw(deck, new TestPlayerCardDrawStrategy(gamer)); - SummationCardPoint actual = Gamer.getSummationCardPoint(); + SummationCardPoint actual = gamer.getSummationCardPoint(); SummationCardPoint expected = new SummationCardPoint(10); Assertions.assertThat(actual) @@ -44,16 +51,15 @@ void draw() { @Test @DisplayName("플레이어는 총합이 21이 넘으면 카드를 뽑을 수 없는지 검증") void validateDrawLimit() { - Gamer Gamer = new Gamer("robin", HoldingCards.of( + Gamer gamer = new Gamer("robin", HoldingCards.of( new Card(JACK, HEART), new Card(EIGHT, HEART), new Card(JACK, SPADE) )); Deck deck = Deck.of( new Card(TWO, SPADE) ); - - Assertions.assertThatThrownBy(() -> Gamer.draw(deck, new TestPlayerCardDrawStrategy(Gamer))) - .isInstanceOf(IllegalStateException.class) - .hasMessage("카드를 더이상 뽑을 수 없습니다."); + DrawResult drawResult = gamer.draw(deck, new TestPlayerCardDrawStrategy(gamer)); + Assertions.assertThat(drawResult.getFailCause()) + .isEqualTo("카드를 더이상 뽑을 수 없습니다."); } @Test @@ -66,9 +72,9 @@ void validateDealerDrawLimit() { new Card(TWO, SPADE) ); - Assertions.assertThatThrownBy(() -> gamer.draw(deck, new TestDealerCardDrawStrategy(gamer))) - .isInstanceOf(IllegalStateException.class) - .hasMessage("카드를 더이상 뽑을 수 없습니다."); + DrawResult drawResult = gamer.draw(deck, new TestDealerCardDrawStrategy(gamer)); + Assertions.assertThat(drawResult.getFailCause()) + .isEqualTo("카드를 더이상 뽑을 수 없습니다."); } @ParameterizedTest @@ -81,4 +87,16 @@ void isDead(Card additionalCard, boolean expected) { Assertions.assertThat(gamer.isDead()).isEqualTo(expected); } + + @ParameterizedTest + @MethodSource("validatePlayerHasNextDrawChanceParameters") + @DisplayName("플레이어의 다음 드로우 기회 유무를 제대로 판단하는지 검증") + void validatePlayerHasNextDrawChance(Card cardInDeck, boolean expected) { + Gamer gamer = new Gamer("robin", HoldingCards.of( + new Card(JACK, HEART), new Card(QUEEN, HEART) + )); + DrawResult drawResult = gamer.draw(Deck.of(cardInDeck), new TestPlayerCardDrawStrategy(gamer)); + Assertions.assertThat(drawResult.hasNextChance()) + .isEqualTo(expected); + } } From 74d6688e7b4a6710a94c312d2b47ebf91d4f9f1d Mon Sep 17 00:00:00 2001 From: robinjoon Date: Mon, 11 Mar 2024 00:03:35 +0900 Subject: [PATCH 37/56] =?UTF-8?q?refactor:=20=EB=93=9C=EB=A1=9C=EC=9A=B0?= =?UTF-8?q?=20=EC=97=AC=EB=B6=80=20=EA=B2=B0=EC=A0=95=ED=95=98=EB=8A=94=20?= =?UTF-8?q?=EC=A0=95=EC=B1=85=EA=B3=BC=20=EB=93=9C=EB=A1=9C=EC=9A=B0=20?= =?UTF-8?q?=EB=B0=A9=EC=8B=9D=EC=9D=84=20=EA=B2=B0=EC=A0=95=ED=95=98?= =?UTF-8?q?=EB=8A=94=20=EC=A0=95=EC=B1=85=20=EB=B6=84=EB=A6=AC?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- README.md | 4 +-- .../java/controller/BlackjackController.java | 8 ++--- .../AbstractRandomCardDrawStrategy.java | 24 ------------- ...tegy.java => DealerCardDrawCondition.java} | 12 ++++--- src/main/java/domain/blackjack/Gamer.java | 13 +++---- .../blackjack/PlayerCardDrawCondition.java | 16 +++++++++ .../PlayerRandomCardDrawStrategy.java | 14 -------- .../domain/blackjack/SummationCardPoint.java | 2 +- .../java/domain/card/CardDrawCondition.java | 5 +++ .../java/domain/card/CardDrawStrategy.java | 7 ---- .../java/domain/card/CardSelectStrategy.java | 7 ++++ src/main/java/domain/card/Deck.java | 4 +-- .../domain/card/RandomCardSelectStrategy.java | 14 ++++++++ ....java => DealerCardDrawConditionTest.java} | 5 +-- src/test/java/domain/blackjack/GamerTest.java | 12 ++++--- .../PlayerCardDrawConditionTest.java | 36 +++++++++++++++++++ .../blackjack/TestDealerCardDrawStrategy.java | 29 --------------- .../blackjack/TestPlayerCardDrawStrategy.java | 29 --------------- src/test/java/domain/card/DeckTest.java | 7 ++-- .../domain/card/FirstCardSelectStrategy.java | 10 ++++++ 20 files changed, 128 insertions(+), 130 deletions(-) delete mode 100644 src/main/java/domain/blackjack/AbstractRandomCardDrawStrategy.java rename src/main/java/domain/blackjack/{DealerRandomCardDrawStrategy.java => DealerCardDrawCondition.java} (53%) create mode 100644 src/main/java/domain/blackjack/PlayerCardDrawCondition.java delete mode 100644 src/main/java/domain/blackjack/PlayerRandomCardDrawStrategy.java create mode 100644 src/main/java/domain/card/CardDrawCondition.java delete mode 100644 src/main/java/domain/card/CardDrawStrategy.java create mode 100644 src/main/java/domain/card/CardSelectStrategy.java create mode 100644 src/main/java/domain/card/RandomCardSelectStrategy.java rename src/test/java/domain/blackjack/{DealerCardDrawStrategyTest.java => DealerCardDrawConditionTest.java} (91%) create mode 100644 src/test/java/domain/blackjack/PlayerCardDrawConditionTest.java delete mode 100644 src/test/java/domain/blackjack/TestDealerCardDrawStrategy.java delete mode 100644 src/test/java/domain/blackjack/TestPlayerCardDrawStrategy.java create mode 100644 src/test/java/domain/card/FirstCardSelectStrategy.java diff --git a/README.md b/README.md index 64bda9f565a..0c3b8eea8ea 100644 --- a/README.md +++ b/README.md @@ -61,8 +61,8 @@ ## 1단계 피드백 반영 예정 목록 - [x] 드로우가 가능한지 확인하는 책임 컨트롤러에서 다른 곳으로 이동 -- [ ] 드로우 여부 결정하는 정책과 드로우 방식을 결정하는 정책 분리 -- [ ] 의미 있는 상수화 +- [x] 드로우 여부 결정하는 정책과 드로우 방식을 결정하는 정책 분리 +- [x] 의미 있는 상수화 - [ ] 테스트 코드에서 사용하는 테스트 객체 생성 역할을 분리 - [ ] view만을 위한 enum 추가 - [ ] Card Enum화 diff --git a/src/main/java/controller/BlackjackController.java b/src/main/java/controller/BlackjackController.java index 5f2969bd5e6..ca40a52a468 100644 --- a/src/main/java/controller/BlackjackController.java +++ b/src/main/java/controller/BlackjackController.java @@ -1,13 +1,13 @@ package controller; -import domain.blackjack.DealerRandomCardDrawStrategy; +import domain.blackjack.DealerCardDrawCondition; import domain.blackjack.DrawResult; import domain.blackjack.GameResult; import domain.blackjack.GameResultCalculator; import domain.blackjack.Gamer; -import domain.blackjack.PlayerRandomCardDrawStrategy; import domain.card.Card; import domain.card.Deck; +import domain.card.RandomCardSelectStrategy; import dto.DealerGameResultDTO; import dto.GamerDTO; import dto.PlayerGameResultDTO; @@ -50,11 +50,11 @@ private void initDealerAndPlayers(Deck deck) { } private DrawResult dealerDraw(Deck deck) { - return dealer.draw(deck, new DealerRandomCardDrawStrategy(dealer)); + return dealer.draw(deck, new RandomCardSelectStrategy(), new DealerCardDrawCondition(dealer)); } private DrawResult playerDraw(Deck deck, Gamer player) { - return player.draw(deck, new PlayerRandomCardDrawStrategy(player)); + return player.draw(deck, new RandomCardSelectStrategy(), new DealerCardDrawCondition(player)); } private void printDealerAndPlayers() { diff --git a/src/main/java/domain/blackjack/AbstractRandomCardDrawStrategy.java b/src/main/java/domain/blackjack/AbstractRandomCardDrawStrategy.java deleted file mode 100644 index 5674a6f4008..00000000000 --- a/src/main/java/domain/blackjack/AbstractRandomCardDrawStrategy.java +++ /dev/null @@ -1,24 +0,0 @@ -package domain.blackjack; - -import domain.card.Card; -import domain.card.CardDrawStrategy; -import java.util.List; -import java.util.Random; - -abstract class AbstractRandomCardDrawStrategy implements CardDrawStrategy { - @Override - public final Card nextCard(List cards) { - if (canDraw()) { - return cardSelectStrategy(cards); - } - throw new IllegalStateException("카드를 더이상 뽑을 수 없습니다."); - } - - abstract boolean canDraw(); - - private Card cardSelectStrategy(List cards) { - Random random = new Random(); - int idx = random.nextInt(cards.size()); - return cards.get(idx); - } -} diff --git a/src/main/java/domain/blackjack/DealerRandomCardDrawStrategy.java b/src/main/java/domain/blackjack/DealerCardDrawCondition.java similarity index 53% rename from src/main/java/domain/blackjack/DealerRandomCardDrawStrategy.java rename to src/main/java/domain/blackjack/DealerCardDrawCondition.java index 2d25c751c8b..c7543a7d098 100644 --- a/src/main/java/domain/blackjack/DealerRandomCardDrawStrategy.java +++ b/src/main/java/domain/blackjack/DealerCardDrawCondition.java @@ -1,16 +1,20 @@ package domain.blackjack; -public class DealerRandomCardDrawStrategy extends AbstractRandomCardDrawStrategy { +import domain.card.CardDrawCondition; + +public final class DealerCardDrawCondition implements CardDrawCondition { private final Gamer dealer; - public DealerRandomCardDrawStrategy(Gamer dealer) { + public DealerCardDrawCondition(Gamer dealer) { this.dealer = dealer; } @Override - boolean canDraw() { + public boolean canDraw() { + final int rawDealerDrawThresholdPoint = 16; + SummationCardPoint dealerDrawThresholdPoint = new SummationCardPoint(rawDealerDrawThresholdPoint); + SummationCardPoint summationCardPoint = dealer.getSummationCardPoint(); - SummationCardPoint dealerDrawThresholdPoint = new SummationCardPoint(16); return !summationCardPoint.isBiggerThan(dealerDrawThresholdPoint); } } diff --git a/src/main/java/domain/blackjack/Gamer.java b/src/main/java/domain/blackjack/Gamer.java index f82d114a53f..dec075d39ee 100644 --- a/src/main/java/domain/blackjack/Gamer.java +++ b/src/main/java/domain/blackjack/Gamer.java @@ -3,7 +3,8 @@ import static domain.card.CardName.TEN; import domain.card.Card; -import domain.card.CardDrawStrategy; +import domain.card.CardDrawCondition; +import domain.card.CardSelectStrategy; import domain.card.Deck; import java.util.List; @@ -16,12 +17,12 @@ public Gamer(String name, HoldingCards holdingCards) { this.holdingCards = holdingCards; } - public DrawResult draw(Deck deck, CardDrawStrategy cardDrawStrategy) { - if (isDead()) { + public DrawResult draw(Deck deck, CardSelectStrategy cardSelectStrategy, CardDrawCondition cardDrawCondition) { + if (isDead() || !cardDrawCondition.canDraw()) { return DrawResult.fail("카드를 더이상 뽑을 수 없습니다.", false); } try { - Card draw = deck.draw(cardDrawStrategy); + Card draw = deck.draw(cardSelectStrategy); holdingCards.add(draw); return DrawResult.success(!isDead()); } catch (IllegalArgumentException | IllegalStateException e) { @@ -58,8 +59,8 @@ public int getRawSummationCardPoint() { return getSummationCardPoint().summationCardPoint(); } - boolean isDead() { - return holdingCards.calculateTotalPoint().isDeadPoint(); + public boolean isDead() { + return getSummationCardPoint().isDeadPoint(); } boolean hasAceInHoldingCards() { diff --git a/src/main/java/domain/blackjack/PlayerCardDrawCondition.java b/src/main/java/domain/blackjack/PlayerCardDrawCondition.java new file mode 100644 index 00000000000..29e4d857612 --- /dev/null +++ b/src/main/java/domain/blackjack/PlayerCardDrawCondition.java @@ -0,0 +1,16 @@ +package domain.blackjack; + +import domain.card.CardDrawCondition; + +public final class PlayerCardDrawCondition implements CardDrawCondition { + private final Gamer player; + + public PlayerCardDrawCondition(Gamer player) { + this.player = player; + } + + @Override + public boolean canDraw() { + return !player.isDead(); + } +} diff --git a/src/main/java/domain/blackjack/PlayerRandomCardDrawStrategy.java b/src/main/java/domain/blackjack/PlayerRandomCardDrawStrategy.java deleted file mode 100644 index ec34864da0a..00000000000 --- a/src/main/java/domain/blackjack/PlayerRandomCardDrawStrategy.java +++ /dev/null @@ -1,14 +0,0 @@ -package domain.blackjack; - -public class PlayerRandomCardDrawStrategy extends AbstractRandomCardDrawStrategy { - private final Gamer player; - - public PlayerRandomCardDrawStrategy(Gamer player) { - this.player = player; - } - - @Override - boolean canDraw() { - return !player.getSummationCardPoint().isDeadPoint(); - } -} diff --git a/src/main/java/domain/blackjack/SummationCardPoint.java b/src/main/java/domain/blackjack/SummationCardPoint.java index b021a87178c..d8f5ff41944 100644 --- a/src/main/java/domain/blackjack/SummationCardPoint.java +++ b/src/main/java/domain/blackjack/SummationCardPoint.java @@ -12,7 +12,7 @@ static SummationCardPoint of(List cardPoints) { return new SummationCardPoint(summationCardPoint); } - public boolean isBiggerThan(SummationCardPoint other) { + boolean isBiggerThan(SummationCardPoint other) { int otherPoint = other.summationCardPoint(); return summationCardPoint > otherPoint; } diff --git a/src/main/java/domain/card/CardDrawCondition.java b/src/main/java/domain/card/CardDrawCondition.java new file mode 100644 index 00000000000..eb85014bf69 --- /dev/null +++ b/src/main/java/domain/card/CardDrawCondition.java @@ -0,0 +1,5 @@ +package domain.card; + +public interface CardDrawCondition { + boolean canDraw(); +} diff --git a/src/main/java/domain/card/CardDrawStrategy.java b/src/main/java/domain/card/CardDrawStrategy.java deleted file mode 100644 index 79ff73ecfea..00000000000 --- a/src/main/java/domain/card/CardDrawStrategy.java +++ /dev/null @@ -1,7 +0,0 @@ -package domain.card; - -import java.util.List; - -public interface CardDrawStrategy { - Card nextCard(List cards); -} diff --git a/src/main/java/domain/card/CardSelectStrategy.java b/src/main/java/domain/card/CardSelectStrategy.java new file mode 100644 index 00000000000..c0b8c7d0268 --- /dev/null +++ b/src/main/java/domain/card/CardSelectStrategy.java @@ -0,0 +1,7 @@ +package domain.card; + +import java.util.List; + +public interface CardSelectStrategy { + Card select(List cards); +} diff --git a/src/main/java/domain/card/Deck.java b/src/main/java/domain/card/Deck.java index 5988259cc06..f831a4a3427 100644 --- a/src/main/java/domain/card/Deck.java +++ b/src/main/java/domain/card/Deck.java @@ -40,12 +40,12 @@ private void validateDuplicateCard(List cards) { } } - public Card draw(CardDrawStrategy cardDrawStrategy) { + public Card draw(CardSelectStrategy cardSelectStrategy) { if (cards.isEmpty()) { throw new IllegalArgumentException("덱이 비어있습니다."); } - Card card = cardDrawStrategy.nextCard(cards); + Card card = cardSelectStrategy.select(cards); cards.remove(card); return card; diff --git a/src/main/java/domain/card/RandomCardSelectStrategy.java b/src/main/java/domain/card/RandomCardSelectStrategy.java new file mode 100644 index 00000000000..5516410ef36 --- /dev/null +++ b/src/main/java/domain/card/RandomCardSelectStrategy.java @@ -0,0 +1,14 @@ +package domain.card; + +import java.util.List; +import java.util.Random; + +public final class RandomCardSelectStrategy implements CardSelectStrategy { + private final Random random = new Random(); + + @Override + public Card select(List cards) { + int idx = random.nextInt(cards.size()); + return cards.get(idx); + } +} diff --git a/src/test/java/domain/blackjack/DealerCardDrawStrategyTest.java b/src/test/java/domain/blackjack/DealerCardDrawConditionTest.java similarity index 91% rename from src/test/java/domain/blackjack/DealerCardDrawStrategyTest.java rename to src/test/java/domain/blackjack/DealerCardDrawConditionTest.java index 7dc094263ae..d5bf6df76d7 100644 --- a/src/test/java/domain/blackjack/DealerCardDrawStrategyTest.java +++ b/src/test/java/domain/blackjack/DealerCardDrawConditionTest.java @@ -15,7 +15,8 @@ import org.junit.jupiter.params.provider.Arguments; import org.junit.jupiter.params.provider.MethodSource; -class DealerCardDrawStrategyTest { +class DealerCardDrawConditionTest { + public static Stream canDrawParameters() { return Stream.of( Arguments.of(HoldingCards.of(new Card(ACE, HEART), new Card(SIX, HEART)), false), @@ -29,7 +30,7 @@ public static Stream canDrawParameters() { @DisplayName("딜러의 드로우 여부가 제대로 판단되는지 검증") void canDraw(HoldingCards holdingCards, boolean expected) { Gamer dealer = new Gamer("딜러", holdingCards); - Assertions.assertThat(new DealerRandomCardDrawStrategy(dealer).canDraw()) + Assertions.assertThat(new DealerCardDrawCondition(dealer).canDraw()) .isEqualTo(expected); } } diff --git a/src/test/java/domain/blackjack/GamerTest.java b/src/test/java/domain/blackjack/GamerTest.java index 6a9ed672f3a..e1f288335de 100644 --- a/src/test/java/domain/blackjack/GamerTest.java +++ b/src/test/java/domain/blackjack/GamerTest.java @@ -11,6 +11,7 @@ import domain.card.Card; import domain.card.Deck; +import domain.card.FirstCardSelectStrategy; import java.util.stream.Stream; import org.assertj.core.api.Assertions; import org.junit.jupiter.api.DisplayName; @@ -34,12 +35,14 @@ public static Stream validatePlayerHasNextDrawChanceParameters() { ); } + private static final FirstCardSelectStrategy FIRST_CARD_SELECT_STRATEGY = new FirstCardSelectStrategy(); + @Test @DisplayName("게임 참가자가 카드를 뽑았을 때 점수가 올바르게 계산되는지 검증") void draw() { Gamer gamer = new Gamer("robin", HoldingCards.of()); Deck deck = Deck.of(new Card(JACK, HEART), new Card(EIGHT, HEART)); - gamer.draw(deck, new TestPlayerCardDrawStrategy(gamer)); + gamer.draw(deck, FIRST_CARD_SELECT_STRATEGY, new PlayerCardDrawCondition(gamer)); SummationCardPoint actual = gamer.getSummationCardPoint(); SummationCardPoint expected = new SummationCardPoint(10); @@ -57,7 +60,7 @@ void validateDrawLimit() { Deck deck = Deck.of( new Card(TWO, SPADE) ); - DrawResult drawResult = gamer.draw(deck, new TestPlayerCardDrawStrategy(gamer)); + DrawResult drawResult = gamer.draw(deck, FIRST_CARD_SELECT_STRATEGY, new PlayerCardDrawCondition(gamer)); Assertions.assertThat(drawResult.getFailCause()) .isEqualTo("카드를 더이상 뽑을 수 없습니다."); } @@ -72,7 +75,7 @@ void validateDealerDrawLimit() { new Card(TWO, SPADE) ); - DrawResult drawResult = gamer.draw(deck, new TestDealerCardDrawStrategy(gamer)); + DrawResult drawResult = gamer.draw(deck, FIRST_CARD_SELECT_STRATEGY, new DealerCardDrawCondition(gamer)); Assertions.assertThat(drawResult.getFailCause()) .isEqualTo("카드를 더이상 뽑을 수 없습니다."); } @@ -95,7 +98,8 @@ void validatePlayerHasNextDrawChance(Card cardInDeck, boolean expected) { Gamer gamer = new Gamer("robin", HoldingCards.of( new Card(JACK, HEART), new Card(QUEEN, HEART) )); - DrawResult drawResult = gamer.draw(Deck.of(cardInDeck), new TestPlayerCardDrawStrategy(gamer)); + DrawResult drawResult = gamer.draw(Deck.of(cardInDeck), FIRST_CARD_SELECT_STRATEGY, + new PlayerCardDrawCondition(gamer)); Assertions.assertThat(drawResult.hasNextChance()) .isEqualTo(expected); } diff --git a/src/test/java/domain/blackjack/PlayerCardDrawConditionTest.java b/src/test/java/domain/blackjack/PlayerCardDrawConditionTest.java new file mode 100644 index 00000000000..db9a8eb0e90 --- /dev/null +++ b/src/test/java/domain/blackjack/PlayerCardDrawConditionTest.java @@ -0,0 +1,36 @@ +package domain.blackjack; + +import static domain.card.CardName.ACE; +import static domain.card.CardName.JACK; +import static domain.card.CardName.QUEEN; +import static domain.card.CardName.TWO; +import static domain.card.CardType.HEART; + +import domain.card.Card; +import java.util.stream.Stream; +import org.assertj.core.api.Assertions; +import org.junit.jupiter.api.DisplayName; +import org.junit.jupiter.params.ParameterizedTest; +import org.junit.jupiter.params.provider.Arguments; +import org.junit.jupiter.params.provider.MethodSource; + +class PlayerCardDrawConditionTest { + + public static Stream canDrawParameters() { + return Stream.of( + Arguments.of(HoldingCards.of(new Card(ACE, HEART), new Card(JACK, HEART)), true), + Arguments.of(HoldingCards.of(new Card(TWO, HEART), new Card(JACK, HEART), new Card(QUEEN, HEART)), + false), + Arguments.of(HoldingCards.of(new Card(JACK, HEART), new Card(QUEEN, HEART)), true) + ); + } + + @ParameterizedTest + @MethodSource("canDrawParameters") + @DisplayName("플레이어의 드로우 여부가 제대로 판단되는지 검증") + void canDraw(HoldingCards holdingCards, boolean expected) { + Gamer player = new Gamer("플레이어", holdingCards); + Assertions.assertThat(new PlayerCardDrawCondition(player).canDraw()) + .isEqualTo(expected); + } +} diff --git a/src/test/java/domain/blackjack/TestDealerCardDrawStrategy.java b/src/test/java/domain/blackjack/TestDealerCardDrawStrategy.java deleted file mode 100644 index 827bf97fed8..00000000000 --- a/src/test/java/domain/blackjack/TestDealerCardDrawStrategy.java +++ /dev/null @@ -1,29 +0,0 @@ -package domain.blackjack; - -import domain.card.Card; -import domain.card.CardDrawStrategy; -import java.util.List; - -public class TestDealerCardDrawStrategy implements CardDrawStrategy { - private final Gamer player; - - public TestDealerCardDrawStrategy(Gamer player) { - this.player = player; - } - - @Override - public final Card nextCard(List cards) { - if (canDraw()) { - return cardSelectStrategy(cards); - } - throw new IllegalStateException("카드를 더이상 뽑을 수 없습니다."); - } - - private boolean canDraw() { - return !player.getSummationCardPoint().isBiggerThan(new SummationCardPoint(16)); - } - - private Card cardSelectStrategy(List cards) { - return cards.get(0); - } -} diff --git a/src/test/java/domain/blackjack/TestPlayerCardDrawStrategy.java b/src/test/java/domain/blackjack/TestPlayerCardDrawStrategy.java deleted file mode 100644 index 2b835249a81..00000000000 --- a/src/test/java/domain/blackjack/TestPlayerCardDrawStrategy.java +++ /dev/null @@ -1,29 +0,0 @@ -package domain.blackjack; - -import domain.card.Card; -import domain.card.CardDrawStrategy; -import java.util.List; - -public class TestPlayerCardDrawStrategy implements CardDrawStrategy { - private final Gamer player; - - public TestPlayerCardDrawStrategy(Gamer player) { - this.player = player; - } - - @Override - public final Card nextCard(List cards) { - if (canDraw()) { - return cardSelectStrategy(cards); - } - throw new IllegalStateException("카드를 더이상 뽑을 수 없습니다."); - } - - private boolean canDraw() { - return !player.getSummationCardPoint().isDeadPoint(); - } - - private Card cardSelectStrategy(List cards) { - return cards.get(0); - } -} diff --git a/src/test/java/domain/card/DeckTest.java b/src/test/java/domain/card/DeckTest.java index 2cddfa48c98..a9f04b4ced2 100644 --- a/src/test/java/domain/card/DeckTest.java +++ b/src/test/java/domain/card/DeckTest.java @@ -8,11 +8,14 @@ import org.junit.jupiter.api.Test; class DeckTest { + + private static final FirstCardSelectStrategy FIRST_CARD_SELECT_STRATEGY = new FirstCardSelectStrategy(); + @Test @DisplayName("원하는 방식대로 카드가 뽑히는지 검증") void validateDraw() { Deck deck = Deck.of(new Card(ACE, HEART)); - Card card = deck.draw(cards -> cards.get(0)); + Card card = deck.draw(FIRST_CARD_SELECT_STRATEGY); Assertions.assertThat(card) .isEqualTo(new Card(ACE, HEART)); } @@ -31,7 +34,7 @@ void validateDrawedCardIsRemoved() { Deck deck = Deck.of(new Card(ACE, HEART)); deck.draw(cards -> cards.get(0)); - Assertions.assertThatThrownBy(() -> deck.draw(cards -> cards.get(0))) + Assertions.assertThatThrownBy(() -> deck.draw(FIRST_CARD_SELECT_STRATEGY)) .isInstanceOf(IllegalArgumentException.class) .hasMessage("덱이 비어있습니다."); } diff --git a/src/test/java/domain/card/FirstCardSelectStrategy.java b/src/test/java/domain/card/FirstCardSelectStrategy.java new file mode 100644 index 00000000000..a4e142e870a --- /dev/null +++ b/src/test/java/domain/card/FirstCardSelectStrategy.java @@ -0,0 +1,10 @@ +package domain.card; + +import java.util.List; + +public class FirstCardSelectStrategy implements CardSelectStrategy { + @Override + public Card select(List cards) { + return cards.get(0); + } +} From 15ee815b4e4df55ef6b7cee822e5e00e507351f4 Mon Sep 17 00:00:00 2001 From: robinjoon Date: Mon, 11 Mar 2024 00:25:39 +0900 Subject: [PATCH 38/56] =?UTF-8?q?refactor:=20Card=20Enum=ED=99=94?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- README.md | 2 +- .../domain/blackjack/CardPointCalculator.java | 2 +- .../java/domain/blackjack/HoldingCards.java | 2 +- src/main/java/domain/card/Card.java | 95 ++++++++++++++++++- src/main/java/domain/card/Deck.java | 11 +-- src/main/java/view/GamerOutputView.java | 2 +- .../blackjack/CardPointCalculatorTest.java | 15 +-- .../DealerCardDrawConditionTest.java | 19 ++-- .../blackjack/GameResultCalculatorTest.java | 46 ++++----- src/test/java/domain/blackjack/GamerTest.java | 46 ++++----- .../domain/blackjack/HoldingCardsTest.java | 19 ++-- .../PlayerCardDrawConditionTest.java | 17 ++-- src/test/java/domain/card/DeckTest.java | 11 +-- 13 files changed, 163 insertions(+), 124 deletions(-) diff --git a/README.md b/README.md index 0c3b8eea8ea..bd2e1d5552e 100644 --- a/README.md +++ b/README.md @@ -65,4 +65,4 @@ - [x] 의미 있는 상수화 - [ ] 테스트 코드에서 사용하는 테스트 객체 생성 역할을 분리 - [ ] view만을 위한 enum 추가 -- [ ] Card Enum화 +- [x] Card Enum화 diff --git a/src/main/java/domain/blackjack/CardPointCalculator.java b/src/main/java/domain/blackjack/CardPointCalculator.java index 7174492f68c..318129bd76a 100644 --- a/src/main/java/domain/blackjack/CardPointCalculator.java +++ b/src/main/java/domain/blackjack/CardPointCalculator.java @@ -7,7 +7,7 @@ class CardPointCalculator { static CardPoint calculate(Card card) { - CardName cardName = card.name(); + CardName cardName = card.cardName(); int cardNumber = cardName.getCardNumber(); if (cardNumber > TEN.getCardNumber()) { return new CardPoint(TEN.getCardNumber()); diff --git a/src/main/java/domain/blackjack/HoldingCards.java b/src/main/java/domain/blackjack/HoldingCards.java index 4546a7bba6c..3bbbe1f8b0e 100644 --- a/src/main/java/domain/blackjack/HoldingCards.java +++ b/src/main/java/domain/blackjack/HoldingCards.java @@ -35,6 +35,6 @@ List getHoldingCards() { boolean hasAce() { return holdingCards.stream() - .anyMatch(card -> card.name() == CardName.ACE); + .anyMatch(card -> card.cardName() == CardName.ACE); } } diff --git a/src/main/java/domain/card/Card.java b/src/main/java/domain/card/Card.java index 8707446f14b..4f28046ceb8 100644 --- a/src/main/java/domain/card/Card.java +++ b/src/main/java/domain/card/Card.java @@ -1,5 +1,98 @@ package domain.card; -public record Card(CardName name, CardType cardType) { +import static domain.card.CardName.ACE; +import static domain.card.CardName.EIGHT; +import static domain.card.CardName.FIVE; +import static domain.card.CardName.FOUR; +import static domain.card.CardName.JACK; +import static domain.card.CardName.KING; +import static domain.card.CardName.NINE; +import static domain.card.CardName.QUEEN; +import static domain.card.CardName.SEVEN; +import static domain.card.CardName.SIX; +import static domain.card.CardName.TEN; +import static domain.card.CardName.THREE; +import static domain.card.CardName.TWO; +import static domain.card.CardType.CLOVER; +import static domain.card.CardType.DIAMOND; +import static domain.card.CardType.HEART; +import static domain.card.CardType.SPADE; +public enum Card { + + ACE_HEART(ACE, HEART), + TWO_HEART(TWO, HEART), + THREE_HEART(THREE, HEART), + FOUR_HEART(FOUR, HEART), + FIVE_HEART(FIVE, HEART), + SIX_HEART(SIX, HEART), + SEVEN_HEART(SEVEN, HEART), + EIGHT_HEART(EIGHT, HEART), + NINE_HEART(NINE, HEART), + TEN_HEART(TEN, HEART), + JACK_HEART(JACK, HEART), + QUEEN_HEART(QUEEN, HEART), + KING_HEART(KING, HEART), + ACE_SPADE(ACE, SPADE), + TWO_SPADE(TWO, SPADE), + THREE_SPADE(THREE, SPADE), + FOUR_SPADE(FOUR, SPADE), + FIVE_SPADE(FIVE, SPADE), + SIX_SPADE(SIX, SPADE), + SEVEN_SPADE(SEVEN, SPADE), + EIGHT_SPADE(EIGHT, SPADE), + NINE_SPADE(NINE, SPADE), + TEN_SPADE(TEN, SPADE), + JACK_SPADE(JACK, SPADE), + QUEEN_SPADE(QUEEN, SPADE), + KING_SPADE(KING, SPADE), + ACE_CLOVER(ACE, CLOVER), + TWO_CLOVER(TWO, CLOVER), + THREE_CLOVER(THREE, CLOVER), + FOUR_CLOVER(FOUR, CLOVER), + FIVE_CLOVER(FIVE, CLOVER), + SIX_CLOVER(SIX, CLOVER), + SEVEN_CLOVER(SEVEN, CLOVER), + EIGHT_CLOVER(EIGHT, CLOVER), + NINE_CLOVER(NINE, CLOVER), + TEN_CLOVER(TEN, CLOVER), + JACK_CLOVER(JACK, CLOVER), + QUEEN_CLOVER(QUEEN, CLOVER), + KING_CLOVER(KING, CLOVER), + ACE_DIAMOND(ACE, DIAMOND), + TWO_DIAMOND(TWO, DIAMOND), + THREE_DIAMOND(THREE, DIAMOND), + FOUR_DIAMOND(FOUR, DIAMOND), + FIVE_DIAMOND(FIVE, DIAMOND), + SIX_DIAMOND(SIX, DIAMOND), + SEVEN_DIAMOND(SEVEN, DIAMOND), + EIGHT_DIAMOND(EIGHT, DIAMOND), + NINE_DIAMOND(NINE, DIAMOND), + TEN_DIAMOND(TEN, DIAMOND), + JACK_DIAMOND(JACK, DIAMOND), + QUEEN_DIAMOND(QUEEN, DIAMOND), + KING_DIAMOND(KING, DIAMOND); + + private final CardName cardName; + private final CardType cardType; + + Card(CardName cardName, CardType cardType) { + this.cardName = cardName; + this.cardType = cardType; + } + + public CardName cardName() { + return cardName; + } + + public CardType cardType() { + return cardType; + } + + @Override + public String toString() { + return "Card[" + + "name=" + cardName + ", " + + "cardType=" + cardType + ']'; + } } diff --git a/src/main/java/domain/card/Deck.java b/src/main/java/domain/card/Deck.java index f831a4a3427..bd819d156c0 100644 --- a/src/main/java/domain/card/Deck.java +++ b/src/main/java/domain/card/Deck.java @@ -2,7 +2,6 @@ import java.util.ArrayList; import java.util.Arrays; -import java.util.Collection; import java.util.HashSet; import java.util.List; import java.util.Set; @@ -20,19 +19,11 @@ public static Deck of(Card... cards) { } public static Deck fullDeck() { - List cards = Arrays.stream(CardType.values()) - .map(Deck::makeSameTypeCards) - .flatMap(Collection::stream) + List cards = Arrays.stream(Card.values()) .toList(); return new Deck(cards); } - private static List makeSameTypeCards(CardType cardType) { - return Arrays.stream(CardName.values()) - .map(cardName -> new Card(cardName, cardType)) - .toList(); - } - private void validateDuplicateCard(List cards) { Set cardSet = new HashSet<>(cards); if (cardSet.size() != cards.size()) { diff --git a/src/main/java/view/GamerOutputView.java b/src/main/java/view/GamerOutputView.java index 6e14b257b06..576b2f35563 100644 --- a/src/main/java/view/GamerOutputView.java +++ b/src/main/java/view/GamerOutputView.java @@ -57,7 +57,7 @@ private static String generateOutputWithoutSummationCardPoint(GamerDTO gamerDTO) List cards = gamerDTO.getHoldingCards(); String nameOutput = name + "카드"; String cardsOutput = cards.stream() - .map(card -> mapToString(card.cardType()) + mapToString(card.name())) + .map(card -> mapToString(card.cardType()) + mapToString(card.cardName())) .collect(Collectors.joining(", ")); return "%s: %s".formatted(nameOutput, cardsOutput); } diff --git a/src/test/java/domain/blackjack/CardPointCalculatorTest.java b/src/test/java/domain/blackjack/CardPointCalculatorTest.java index 4e8f28ee93c..6c47bfc48e6 100644 --- a/src/test/java/domain/blackjack/CardPointCalculatorTest.java +++ b/src/test/java/domain/blackjack/CardPointCalculatorTest.java @@ -4,10 +4,7 @@ import domain.card.Card; import domain.card.CardName; -import domain.card.CardType; import java.util.Arrays; -import java.util.Collection; -import java.util.List; import java.util.stream.Stream; import org.assertj.core.api.Assertions; import org.junit.jupiter.api.DisplayName; @@ -17,19 +14,11 @@ class CardPointCalculatorTest { static Stream calculateParameter() { - return Stream.of(Arrays.stream(CardType.values()) - .map(CardPointCalculatorTest::makeSameTypeCards) - .flatMap(Collection::stream) - .map(card -> Arguments.of(card, makeCardPoint(card.name()))) + return Stream.of(Arrays.stream(Card.values()) + .map(card -> Arguments.of(card, makeCardPoint(card.cardName()))) .toArray(Arguments[]::new)); } - private static List makeSameTypeCards(CardType cardType) { - return Arrays.stream(CardName.values()) - .map(cardName -> new Card(cardName, cardType)) - .toList(); - } - private static CardPoint makeCardPoint(CardName cardName) { CardPoint cardPoint = new CardPoint(cardName.getCardNumber()); if (cardName.getCardNumber() > TEN.getCardNumber()) { diff --git a/src/test/java/domain/blackjack/DealerCardDrawConditionTest.java b/src/test/java/domain/blackjack/DealerCardDrawConditionTest.java index d5bf6df76d7..88f54e3ba2a 100644 --- a/src/test/java/domain/blackjack/DealerCardDrawConditionTest.java +++ b/src/test/java/domain/blackjack/DealerCardDrawConditionTest.java @@ -1,13 +1,11 @@ package domain.blackjack; -import static domain.card.CardName.ACE; -import static domain.card.CardName.FIVE; -import static domain.card.CardName.JACK; -import static domain.card.CardName.QUEEN; -import static domain.card.CardName.SIX; -import static domain.card.CardType.HEART; +import static domain.card.Card.ACE_HEART; +import static domain.card.Card.FIVE_HEART; +import static domain.card.Card.JACK_HEART; +import static domain.card.Card.SEVEN_HEART; +import static domain.card.Card.SIX_HEART; -import domain.card.Card; import java.util.stream.Stream; import org.assertj.core.api.Assertions; import org.junit.jupiter.api.DisplayName; @@ -19,9 +17,10 @@ class DealerCardDrawConditionTest { public static Stream canDrawParameters() { return Stream.of( - Arguments.of(HoldingCards.of(new Card(ACE, HEART), new Card(SIX, HEART)), false), - Arguments.of(HoldingCards.of(new Card(ACE, HEART), new Card(FIVE, HEART)), true), - Arguments.of(HoldingCards.of(new Card(JACK, HEART), new Card(QUEEN, HEART)), false) + Arguments.of(HoldingCards.of(ACE_HEART, SIX_HEART), false), + Arguments.of(HoldingCards.of(ACE_HEART, FIVE_HEART), true), + Arguments.of(HoldingCards.of(JACK_HEART, SEVEN_HEART), false), + Arguments.of(HoldingCards.of(JACK_HEART, SIX_HEART), true) ); } diff --git a/src/test/java/domain/blackjack/GameResultCalculatorTest.java b/src/test/java/domain/blackjack/GameResultCalculatorTest.java index 49fb2280da3..09db2048651 100644 --- a/src/test/java/domain/blackjack/GameResultCalculatorTest.java +++ b/src/test/java/domain/blackjack/GameResultCalculatorTest.java @@ -3,17 +3,15 @@ import static domain.blackjack.GameResult.LOSE; import static domain.blackjack.GameResult.TIE; import static domain.blackjack.GameResult.WIN; -import static domain.card.CardName.ACE; -import static domain.card.CardName.JACK; -import static domain.card.CardName.NINE; -import static domain.card.CardName.QUEEN; -import static domain.card.CardName.SEVEN; -import static domain.card.CardName.SIX; -import static domain.card.CardName.TWO; -import static domain.card.CardType.DIAMOND; -import static domain.card.CardType.HEART; - -import domain.card.Card; +import static domain.card.Card.ACE_HEART; +import static domain.card.Card.JACK_HEART; +import static domain.card.Card.NINE_HEART; +import static domain.card.Card.QUEEN_HEART; +import static domain.card.Card.SEVEN_HEART; +import static domain.card.Card.SIX_DIAMOND; +import static domain.card.Card.SIX_HEART; +import static domain.card.Card.TWO_HEART; + import java.util.stream.Stream; import org.assertj.core.api.Assertions; import org.junit.jupiter.api.DisplayName; @@ -22,23 +20,15 @@ import org.junit.jupiter.params.provider.MethodSource; class GameResultCalculatorTest { - private static final HoldingCards ONLY_SIX_HEART = HoldingCards.of(new Card(SIX, HEART)); - private static final HoldingCards ONLY_SEVEN_HEART = HoldingCards.of(new Card(SEVEN, HEART)); - private static final HoldingCards DEAD_CARDS = HoldingCards.of( - new Card(JACK, HEART), new Card(QUEEN, HEART), new Card(TWO, HEART) - ); - - private static final HoldingCards WIN_CARDS_WITH_ACE = HoldingCards.of( - new Card(ACE, HEART), new Card(QUEEN, HEART) - ); - - private static final HoldingCards WIN_CARDS_WITHOUT_ACE = HoldingCards.of( - new Card(JACK, HEART), new Card(NINE, HEART), new Card(TWO, HEART) - ); - - private static final HoldingCards TWO_SIX_CARDS = HoldingCards.of( - new Card(SIX, HEART), new Card(SIX, DIAMOND) - ); + private static final HoldingCards ONLY_SIX_HEART = HoldingCards.of(SIX_HEART); + private static final HoldingCards ONLY_SEVEN_HEART = HoldingCards.of(SEVEN_HEART); + private static final HoldingCards DEAD_CARDS = HoldingCards.of(TWO_HEART, JACK_HEART, QUEEN_HEART); + + private static final HoldingCards WIN_CARDS_WITH_ACE = HoldingCards.of(ACE_HEART, QUEEN_HEART); + + private static final HoldingCards WIN_CARDS_WITHOUT_ACE = HoldingCards.of(TWO_HEART, JACK_HEART, NINE_HEART); + + private static final HoldingCards TWO_SIX_CARDS = HoldingCards.of(SIX_HEART, SIX_DIAMOND); public static Stream getGameResultParameters() { return Stream.of( diff --git a/src/test/java/domain/blackjack/GamerTest.java b/src/test/java/domain/blackjack/GamerTest.java index e1f288335de..7c3b69d99c4 100644 --- a/src/test/java/domain/blackjack/GamerTest.java +++ b/src/test/java/domain/blackjack/GamerTest.java @@ -1,13 +1,12 @@ package domain.blackjack; -import static domain.card.CardName.ACE; -import static domain.card.CardName.EIGHT; -import static domain.card.CardName.JACK; -import static domain.card.CardName.QUEEN; -import static domain.card.CardName.SEVEN; -import static domain.card.CardName.TWO; -import static domain.card.CardType.HEART; -import static domain.card.CardType.SPADE; +import static domain.card.Card.ACE_HEART; +import static domain.card.Card.EIGHT_HEART; +import static domain.card.Card.JACK_HEART; +import static domain.card.Card.JACK_SPADE; +import static domain.card.Card.QUEEN_HEART; +import static domain.card.Card.SEVEN_HEART; +import static domain.card.Card.TWO_HEART; import domain.card.Card; import domain.card.Deck; @@ -24,14 +23,13 @@ class GamerTest { public static Stream isDeadParameters() { return Stream.of( - Arguments.of(new Card(TWO, HEART), true), Arguments.of(new Card(ACE, HEART), false) + Arguments.of(TWO_HEART, true), Arguments.of(ACE_HEART, false) ); } public static Stream validatePlayerHasNextDrawChanceParameters() { return Stream.of( - Arguments.of(new Card(TWO, HEART), false), - Arguments.of(new Card(ACE, HEART), true) + Arguments.of(TWO_HEART, false), Arguments.of(ACE_HEART, true) ); } @@ -41,7 +39,7 @@ public static Stream validatePlayerHasNextDrawChanceParameters() { @DisplayName("게임 참가자가 카드를 뽑았을 때 점수가 올바르게 계산되는지 검증") void draw() { Gamer gamer = new Gamer("robin", HoldingCards.of()); - Deck deck = Deck.of(new Card(JACK, HEART), new Card(EIGHT, HEART)); + Deck deck = Deck.of(JACK_HEART, EIGHT_HEART); gamer.draw(deck, FIRST_CARD_SELECT_STRATEGY, new PlayerCardDrawCondition(gamer)); SummationCardPoint actual = gamer.getSummationCardPoint(); @@ -54,12 +52,8 @@ void draw() { @Test @DisplayName("플레이어는 총합이 21이 넘으면 카드를 뽑을 수 없는지 검증") void validateDrawLimit() { - Gamer gamer = new Gamer("robin", HoldingCards.of( - new Card(JACK, HEART), new Card(EIGHT, HEART), new Card(JACK, SPADE) - )); - Deck deck = Deck.of( - new Card(TWO, SPADE) - ); + Gamer gamer = new Gamer("robin", HoldingCards.of(JACK_HEART, EIGHT_HEART, JACK_SPADE)); + Deck deck = Deck.of(TWO_HEART); DrawResult drawResult = gamer.draw(deck, FIRST_CARD_SELECT_STRATEGY, new PlayerCardDrawCondition(gamer)); Assertions.assertThat(drawResult.getFailCause()) .isEqualTo("카드를 더이상 뽑을 수 없습니다."); @@ -68,12 +62,8 @@ void validateDrawLimit() { @Test @DisplayName("딜러는 총합이 16이 넘으면 카드를 뽑을 수 없는지 검증") void validateDealerDrawLimit() { - Gamer gamer = new Gamer("robin", HoldingCards.of( - new Card(JACK, HEART), new Card(SEVEN, HEART) - )); - Deck deck = Deck.of( - new Card(TWO, SPADE) - ); + Gamer gamer = new Gamer("robin", HoldingCards.of(JACK_HEART, SEVEN_HEART)); + Deck deck = Deck.of(TWO_HEART); DrawResult drawResult = gamer.draw(deck, FIRST_CARD_SELECT_STRATEGY, new DealerCardDrawCondition(gamer)); Assertions.assertThat(drawResult.getFailCause()) @@ -84,9 +74,7 @@ void validateDealerDrawLimit() { @MethodSource("isDeadParameters") @DisplayName("게이머의 점수가 21이 넘으면 죽었다고 판단하는지 검증") void isDead(Card additionalCard, boolean expected) { - Gamer gamer = new Gamer("robin", HoldingCards.of( - new Card(JACK, HEART), new Card(QUEEN, HEART), additionalCard - )); + Gamer gamer = new Gamer("robin", HoldingCards.of(JACK_HEART, QUEEN_HEART, additionalCard)); Assertions.assertThat(gamer.isDead()).isEqualTo(expected); } @@ -95,9 +83,7 @@ void isDead(Card additionalCard, boolean expected) { @MethodSource("validatePlayerHasNextDrawChanceParameters") @DisplayName("플레이어의 다음 드로우 기회 유무를 제대로 판단하는지 검증") void validatePlayerHasNextDrawChance(Card cardInDeck, boolean expected) { - Gamer gamer = new Gamer("robin", HoldingCards.of( - new Card(JACK, HEART), new Card(QUEEN, HEART) - )); + Gamer gamer = new Gamer("robin", HoldingCards.of(JACK_HEART, QUEEN_HEART)); DrawResult drawResult = gamer.draw(Deck.of(cardInDeck), FIRST_CARD_SELECT_STRATEGY, new PlayerCardDrawCondition(gamer)); Assertions.assertThat(drawResult.hasNextChance()) diff --git a/src/test/java/domain/blackjack/HoldingCardsTest.java b/src/test/java/domain/blackjack/HoldingCardsTest.java index 29eb7ee3fdd..70fd704d5c0 100644 --- a/src/test/java/domain/blackjack/HoldingCardsTest.java +++ b/src/test/java/domain/blackjack/HoldingCardsTest.java @@ -1,13 +1,11 @@ package domain.blackjack; -import static domain.card.CardName.ACE; -import static domain.card.CardName.JACK; -import static domain.card.CardName.KING; -import static domain.card.CardName.QUEEN; -import static domain.card.CardName.SIX; -import static domain.card.CardType.HEART; +import static domain.card.Card.ACE_HEART; +import static domain.card.Card.JACK_HEART; +import static domain.card.Card.KING_HEART; +import static domain.card.Card.QUEEN_HEART; +import static domain.card.Card.SIX_HEART; -import domain.card.Card; import org.assertj.core.api.Assertions; import org.junit.jupiter.api.DisplayName; import org.junit.jupiter.api.Test; @@ -16,10 +14,7 @@ class HoldingCardsTest { @Test @DisplayName("포함된 카드의 포인트 합계가 올바른지 검증") void calculateTotalPoint() { - HoldingCards holdingCards = HoldingCards.of( - new Card(ACE, HEART), new Card(SIX, HEART), new Card(JACK, HEART), - new Card(QUEEN, HEART), new Card(KING, HEART) - ); + HoldingCards holdingCards = HoldingCards.of(ACE_HEART, SIX_HEART, JACK_HEART, QUEEN_HEART, KING_HEART); SummationCardPoint actual = holdingCards.calculateTotalPoint(); SummationCardPoint expected = new SummationCardPoint(37); @@ -30,7 +25,7 @@ void calculateTotalPoint() { @Test @DisplayName("Ace가 포함되었는지 여부 검증") void hasAce() { - HoldingCards holdingCards = HoldingCards.of(new Card(ACE, HEART)); + HoldingCards holdingCards = HoldingCards.of(ACE_HEART); Assertions.assertThat(holdingCards.hasAce()).isTrue(); } } diff --git a/src/test/java/domain/blackjack/PlayerCardDrawConditionTest.java b/src/test/java/domain/blackjack/PlayerCardDrawConditionTest.java index db9a8eb0e90..b382256da3b 100644 --- a/src/test/java/domain/blackjack/PlayerCardDrawConditionTest.java +++ b/src/test/java/domain/blackjack/PlayerCardDrawConditionTest.java @@ -1,12 +1,10 @@ package domain.blackjack; -import static domain.card.CardName.ACE; -import static domain.card.CardName.JACK; -import static domain.card.CardName.QUEEN; -import static domain.card.CardName.TWO; -import static domain.card.CardType.HEART; +import static domain.card.Card.ACE_HEART; +import static domain.card.Card.JACK_HEART; +import static domain.card.Card.QUEEN_HEART; +import static domain.card.Card.TWO_HEART; -import domain.card.Card; import java.util.stream.Stream; import org.assertj.core.api.Assertions; import org.junit.jupiter.api.DisplayName; @@ -18,10 +16,9 @@ class PlayerCardDrawConditionTest { public static Stream canDrawParameters() { return Stream.of( - Arguments.of(HoldingCards.of(new Card(ACE, HEART), new Card(JACK, HEART)), true), - Arguments.of(HoldingCards.of(new Card(TWO, HEART), new Card(JACK, HEART), new Card(QUEEN, HEART)), - false), - Arguments.of(HoldingCards.of(new Card(JACK, HEART), new Card(QUEEN, HEART)), true) + Arguments.of(HoldingCards.of(ACE_HEART, JACK_HEART), true), + Arguments.of(HoldingCards.of(TWO_HEART, JACK_HEART, QUEEN_HEART), false), + Arguments.of(HoldingCards.of(JACK_HEART, QUEEN_HEART), true) ); } diff --git a/src/test/java/domain/card/DeckTest.java b/src/test/java/domain/card/DeckTest.java index a9f04b4ced2..808a07871e6 100644 --- a/src/test/java/domain/card/DeckTest.java +++ b/src/test/java/domain/card/DeckTest.java @@ -1,7 +1,6 @@ package domain.card; -import static domain.card.CardName.ACE; -import static domain.card.CardType.HEART; +import static domain.card.Card.ACE_HEART; import org.assertj.core.api.Assertions; import org.junit.jupiter.api.DisplayName; @@ -14,16 +13,16 @@ class DeckTest { @Test @DisplayName("원하는 방식대로 카드가 뽑히는지 검증") void validateDraw() { - Deck deck = Deck.of(new Card(ACE, HEART)); + Deck deck = Deck.of(ACE_HEART); Card card = deck.draw(FIRST_CARD_SELECT_STRATEGY); Assertions.assertThat(card) - .isEqualTo(new Card(ACE, HEART)); + .isEqualTo(ACE_HEART); } @Test @DisplayName("중복된 카드가 포함된 덱이 생성되지 않는지 검증") void validateDuplicateCard() { - Assertions.assertThatThrownBy(() -> Deck.of(new Card(ACE, HEART), new Card(ACE, HEART))) + Assertions.assertThatThrownBy(() -> Deck.of(ACE_HEART, ACE_HEART)) .isInstanceOf(IllegalArgumentException.class) .hasMessage("중복되는 카드가 있습니다."); } @@ -31,7 +30,7 @@ void validateDuplicateCard() { @Test @DisplayName("한 번 뽑힌 카드가 또 뽑히지 않는지 검증") void validateDrawedCardIsRemoved() { - Deck deck = Deck.of(new Card(ACE, HEART)); + Deck deck = Deck.of(ACE_HEART); deck.draw(cards -> cards.get(0)); Assertions.assertThatThrownBy(() -> deck.draw(FIRST_CARD_SELECT_STRATEGY)) From 5ef034306ecb69ab13c10e6cf40d3d69d2d61db4 Mon Sep 17 00:00:00 2001 From: robinjoon Date: Mon, 11 Mar 2024 14:19:10 +0900 Subject: [PATCH 39/56] =?UTF-8?q?refactor:=20=ED=85=8C=EC=8A=A4=ED=8A=B8?= =?UTF-8?q?=20=EC=BD=94=EB=93=9C=EC=97=90=EC=84=9C=20=EC=82=AC=EC=9A=A9?= =?UTF-8?q?=ED=95=98=EB=8A=94=20=ED=85=8C=EC=8A=A4=ED=8A=B8=20=EA=B0=9D?= =?UTF-8?q?=EC=B2=B4=20=EC=83=9D=EC=84=B1=20=EC=97=AD=ED=95=A0=EC=9D=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 --- README.md | 2 +- .../blackjack/GameResultCalculatorTest.java | 23 +++++-------------- .../domain/blackjack/TestHoldingCards.java | 19 +++++++++++++++ .../domain/card/FirstCardSelectStrategy.java | 3 +++ 4 files changed, 29 insertions(+), 18 deletions(-) create mode 100644 src/test/java/domain/blackjack/TestHoldingCards.java diff --git a/README.md b/README.md index bd2e1d5552e..e39d7b14318 100644 --- a/README.md +++ b/README.md @@ -63,6 +63,6 @@ - [x] 드로우가 가능한지 확인하는 책임 컨트롤러에서 다른 곳으로 이동 - [x] 드로우 여부 결정하는 정책과 드로우 방식을 결정하는 정책 분리 - [x] 의미 있는 상수화 -- [ ] 테스트 코드에서 사용하는 테스트 객체 생성 역할을 분리 +- [x] 테스트 코드에서 사용하는 테스트 객체 생성 역할을 분리 - [ ] view만을 위한 enum 추가 - [x] Card Enum화 diff --git a/src/test/java/domain/blackjack/GameResultCalculatorTest.java b/src/test/java/domain/blackjack/GameResultCalculatorTest.java index 09db2048651..38ab230bcc4 100644 --- a/src/test/java/domain/blackjack/GameResultCalculatorTest.java +++ b/src/test/java/domain/blackjack/GameResultCalculatorTest.java @@ -3,14 +3,12 @@ import static domain.blackjack.GameResult.LOSE; import static domain.blackjack.GameResult.TIE; import static domain.blackjack.GameResult.WIN; -import static domain.card.Card.ACE_HEART; -import static domain.card.Card.JACK_HEART; -import static domain.card.Card.NINE_HEART; -import static domain.card.Card.QUEEN_HEART; -import static domain.card.Card.SEVEN_HEART; -import static domain.card.Card.SIX_DIAMOND; -import static domain.card.Card.SIX_HEART; -import static domain.card.Card.TWO_HEART; +import static domain.blackjack.TestHoldingCards.DEAD_CARDS; +import static domain.blackjack.TestHoldingCards.ONLY_SEVEN_HEART; +import static domain.blackjack.TestHoldingCards.ONLY_SIX_HEART; +import static domain.blackjack.TestHoldingCards.TWO_SIX_CARDS; +import static domain.blackjack.TestHoldingCards.WIN_CARDS_WITHOUT_ACE; +import static domain.blackjack.TestHoldingCards.WIN_CARDS_WITH_ACE; import java.util.stream.Stream; import org.assertj.core.api.Assertions; @@ -20,15 +18,6 @@ import org.junit.jupiter.params.provider.MethodSource; class GameResultCalculatorTest { - private static final HoldingCards ONLY_SIX_HEART = HoldingCards.of(SIX_HEART); - private static final HoldingCards ONLY_SEVEN_HEART = HoldingCards.of(SEVEN_HEART); - private static final HoldingCards DEAD_CARDS = HoldingCards.of(TWO_HEART, JACK_HEART, QUEEN_HEART); - - private static final HoldingCards WIN_CARDS_WITH_ACE = HoldingCards.of(ACE_HEART, QUEEN_HEART); - - private static final HoldingCards WIN_CARDS_WITHOUT_ACE = HoldingCards.of(TWO_HEART, JACK_HEART, NINE_HEART); - - private static final HoldingCards TWO_SIX_CARDS = HoldingCards.of(SIX_HEART, SIX_DIAMOND); public static Stream getGameResultParameters() { return Stream.of( diff --git a/src/test/java/domain/blackjack/TestHoldingCards.java b/src/test/java/domain/blackjack/TestHoldingCards.java new file mode 100644 index 00000000000..415bcc90d30 --- /dev/null +++ b/src/test/java/domain/blackjack/TestHoldingCards.java @@ -0,0 +1,19 @@ +package domain.blackjack; + +import static domain.card.Card.ACE_HEART; +import static domain.card.Card.JACK_HEART; +import static domain.card.Card.NINE_HEART; +import static domain.card.Card.QUEEN_HEART; +import static domain.card.Card.SEVEN_HEART; +import static domain.card.Card.SIX_DIAMOND; +import static domain.card.Card.SIX_HEART; +import static domain.card.Card.TWO_HEART; + +public class TestHoldingCards { + static final HoldingCards ONLY_SIX_HEART = HoldingCards.of(SIX_HEART); + static final HoldingCards ONLY_SEVEN_HEART = HoldingCards.of(SEVEN_HEART); + static final HoldingCards DEAD_CARDS = HoldingCards.of(TWO_HEART, JACK_HEART, QUEEN_HEART); + static final HoldingCards WIN_CARDS_WITH_ACE = HoldingCards.of(ACE_HEART, QUEEN_HEART); + static final HoldingCards WIN_CARDS_WITHOUT_ACE = HoldingCards.of(TWO_HEART, JACK_HEART, NINE_HEART); + static final HoldingCards TWO_SIX_CARDS = HoldingCards.of(SIX_HEART, SIX_DIAMOND); +} diff --git a/src/test/java/domain/card/FirstCardSelectStrategy.java b/src/test/java/domain/card/FirstCardSelectStrategy.java index a4e142e870a..dd090bf8a59 100644 --- a/src/test/java/domain/card/FirstCardSelectStrategy.java +++ b/src/test/java/domain/card/FirstCardSelectStrategy.java @@ -3,6 +3,9 @@ import java.util.List; public class FirstCardSelectStrategy implements CardSelectStrategy { + + public static final FirstCardSelectStrategy FIRST_CARD_SELECT_STRATEGY = new FirstCardSelectStrategy(); + @Override public Card select(List cards) { return cards.get(0); From ea7eb45704891c0e5e0376168d2adbf04c301378 Mon Sep 17 00:00:00 2001 From: robinjoon Date: Mon, 11 Mar 2024 14:19:32 +0900 Subject: [PATCH 40/56] =?UTF-8?q?test:=20=EA=B2=8C=EC=9D=B4=EB=A8=B8?= =?UTF-8?q?=EC=9D=98=20=EC=A0=90=EC=88=98=EA=B0=80=20=EC=9E=98=20=EA=B3=84?= =?UTF-8?q?=EC=82=B0=EB=90=98=EB=8A=94=EC=A7=80=20=EA=B2=80=EC=A6=9D?= =?UTF-8?q?=ED=95=98=EB=8A=94=20=ED=85=8C=EC=8A=A4=ED=8A=B8=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/blackjack/GamerTest.java | 24 +++++++++++++++++-- 1 file changed, 22 insertions(+), 2 deletions(-) diff --git a/src/test/java/domain/blackjack/GamerTest.java b/src/test/java/domain/blackjack/GamerTest.java index 7c3b69d99c4..36410695790 100644 --- a/src/test/java/domain/blackjack/GamerTest.java +++ b/src/test/java/domain/blackjack/GamerTest.java @@ -1,5 +1,9 @@ package domain.blackjack; +import static domain.blackjack.TestHoldingCards.DEAD_CARDS; +import static domain.blackjack.TestHoldingCards.ONLY_SEVEN_HEART; +import static domain.blackjack.TestHoldingCards.WIN_CARDS_WITHOUT_ACE; +import static domain.blackjack.TestHoldingCards.WIN_CARDS_WITH_ACE; import static domain.card.Card.ACE_HEART; import static domain.card.Card.EIGHT_HEART; import static domain.card.Card.JACK_HEART; @@ -7,10 +11,10 @@ import static domain.card.Card.QUEEN_HEART; import static domain.card.Card.SEVEN_HEART; import static domain.card.Card.TWO_HEART; +import static domain.card.FirstCardSelectStrategy.FIRST_CARD_SELECT_STRATEGY; import domain.card.Card; import domain.card.Deck; -import domain.card.FirstCardSelectStrategy; import java.util.stream.Stream; import org.assertj.core.api.Assertions; import org.junit.jupiter.api.DisplayName; @@ -33,7 +37,14 @@ public static Stream validatePlayerHasNextDrawChanceParameters() { ); } - private static final FirstCardSelectStrategy FIRST_CARD_SELECT_STRATEGY = new FirstCardSelectStrategy(); + public static Stream getSummationCardPointParameters() { + return Stream.of( + Arguments.of(new Gamer("게이머1", ONLY_SEVEN_HEART), new SummationCardPoint(7)), + Arguments.of(new Gamer("게이머1", WIN_CARDS_WITH_ACE), new SummationCardPoint(21)), + Arguments.of(new Gamer("게이머1", WIN_CARDS_WITHOUT_ACE), new SummationCardPoint(21)), + Arguments.of(new Gamer("게이머1", DEAD_CARDS), new SummationCardPoint(22)) + ); + } @Test @DisplayName("게임 참가자가 카드를 뽑았을 때 점수가 올바르게 계산되는지 검증") @@ -89,4 +100,13 @@ void validatePlayerHasNextDrawChance(Card cardInDeck, boolean expected) { Assertions.assertThat(drawResult.hasNextChance()) .isEqualTo(expected); } + + @ParameterizedTest + @MethodSource("getSummationCardPointParameters") + @DisplayName("게이머의 점수가 잘 계산되는지 검증") + void getSummationCardPoint(Gamer gamer, SummationCardPoint expected) { + SummationCardPoint summationCardPoint = gamer.getSummationCardPoint(); + Assertions.assertThat(summationCardPoint) + .isEqualTo(expected); + } } From f66775551cc523ffa0759803339c5156b1d4b7bd Mon Sep 17 00:00:00 2001 From: robinjoon Date: Mon, 11 Mar 2024 15:42:02 +0900 Subject: [PATCH 41/56] =?UTF-8?q?refactor:=20view=EB=A7=8C=EC=9D=84=20?= =?UTF-8?q?=EC=9C=84=ED=95=9C=20enum=20=EC=B6=94=EA=B0=80?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- README.md | 2 +- .../java/controller/BlackjackController.java | 4 +- src/main/java/view/GameResultOutputView.java | 37 ----------- src/main/java/view/GamerOutputView.java | 64 ------------------- .../java/view/gamer/CardOutputGenerator.java | 15 +++++ src/main/java/view/gamer/GamerOutputView.java | 32 ++++++++++ src/main/java/view/gamer/ViewCardName.java | 33 ++++++++++ src/main/java/view/gamer/ViewCardType.java | 24 +++++++ .../DealerGameResultOutputGenerator.java | 21 ++++++ .../view/gameresult/GameResultOutputView.java | 17 +++++ .../PlayerGameResultOutputGenerator.java | 13 ++++ .../java/view/gameresult/ViewGameResult.java | 22 +++++++ 12 files changed, 180 insertions(+), 104 deletions(-) delete mode 100644 src/main/java/view/GameResultOutputView.java delete mode 100644 src/main/java/view/GamerOutputView.java create mode 100644 src/main/java/view/gamer/CardOutputGenerator.java create mode 100644 src/main/java/view/gamer/GamerOutputView.java create mode 100644 src/main/java/view/gamer/ViewCardName.java create mode 100644 src/main/java/view/gamer/ViewCardType.java create mode 100644 src/main/java/view/gameresult/DealerGameResultOutputGenerator.java create mode 100644 src/main/java/view/gameresult/GameResultOutputView.java create mode 100644 src/main/java/view/gameresult/PlayerGameResultOutputGenerator.java create mode 100644 src/main/java/view/gameresult/ViewGameResult.java diff --git a/README.md b/README.md index e39d7b14318..b6c80bc2af6 100644 --- a/README.md +++ b/README.md @@ -64,5 +64,5 @@ - [x] 드로우 여부 결정하는 정책과 드로우 방식을 결정하는 정책 분리 - [x] 의미 있는 상수화 - [x] 테스트 코드에서 사용하는 테스트 객체 생성 역할을 분리 -- [ ] view만을 위한 enum 추가 +- [x] view만을 위한 enum 추가 - [x] Card Enum화 diff --git a/src/main/java/controller/BlackjackController.java b/src/main/java/controller/BlackjackController.java index ca40a52a468..ce63370f739 100644 --- a/src/main/java/controller/BlackjackController.java +++ b/src/main/java/controller/BlackjackController.java @@ -15,10 +15,10 @@ import java.util.List; import java.util.Map; import java.util.stream.Collectors; -import view.GameResultOutputView; -import view.GamerOutputView; import view.OutputView; import view.YesOrNoInputView; +import view.gamer.GamerOutputView; +import view.gameresult.GameResultOutputView; public class BlackjackController { private final Gamer dealer; diff --git a/src/main/java/view/GameResultOutputView.java b/src/main/java/view/GameResultOutputView.java deleted file mode 100644 index 2ba739697f2..00000000000 --- a/src/main/java/view/GameResultOutputView.java +++ /dev/null @@ -1,37 +0,0 @@ -package view; - -import domain.blackjack.GameResult; -import dto.DealerGameResultDTO; -import dto.PlayerGameResultDTO; -import java.util.Map; -import java.util.stream.Collectors; - -public class GameResultOutputView { - public static void print(PlayerGameResultDTO playerGameResultDTO) { - String gamerName = playerGameResultDTO.getGamerName(); - String gameResult = mapToString(playerGameResultDTO.getGameResult()); - System.out.printf("%s: %s\n", gamerName, gameResult); - } - - public static void print(DealerGameResultDTO dealerGameResultDTO) { - Map dealerGameResultCounts = dealerGameResultDTO.getDealerGameResultCounts(); - String dealersGameResultOutput = dealerGameResultCounts.entrySet() - .stream() - .map(mapEntry -> mapEntry.getValue() + mapToString(mapEntry.getKey())) - .collect(Collectors.joining(" ")); - System.out.printf("딜러: %s\n", dealersGameResultOutput); - } - - private static String mapToString(GameResult gameResult) { - if (gameResult == GameResult.WIN) { - return "승"; - } - if (gameResult == GameResult.LOSE) { - return "패"; - } - if (gameResult == GameResult.TIE) { - return "무"; - } - throw new IllegalArgumentException("없는 승패 입니다."); - } -} diff --git a/src/main/java/view/GamerOutputView.java b/src/main/java/view/GamerOutputView.java deleted file mode 100644 index 576b2f35563..00000000000 --- a/src/main/java/view/GamerOutputView.java +++ /dev/null @@ -1,64 +0,0 @@ -package view; - -import domain.card.Card; -import domain.card.CardName; -import domain.card.CardType; -import dto.GamerDTO; -import java.util.List; -import java.util.stream.Collectors; - -public class GamerOutputView { - - public static void print(GamerDTO gamerDTO) { - String outputWithoutSummationCardPoint = generateOutputWithoutSummationCardPoint(gamerDTO); - String summationCardPointOutput = "결과: %d".formatted(gamerDTO.getSummationCardPoint()); - System.out.printf("%s - %s\n", outputWithoutSummationCardPoint, summationCardPointOutput); - } - - private static String mapToString(CardType cardType) { - if (cardType == CardType.HEART) { - return "하트"; - } - if (cardType == CardType.SPADE) { - return "스페이드"; - } - if (cardType == CardType.CLOVER) { - return "클로버"; - } - if (cardType == CardType.DIAMOND) { - return "다이아몬드"; - } - throw new IllegalArgumentException("잘못된 카드 타입입니다."); - } - - private static String mapToString(CardName cardName) { - if (cardName == CardName.ACE) { - return "A"; - } - if (cardName == CardName.JACK) { - return "J"; - } - if (cardName == CardName.QUEEN) { - return "Q"; - } - if (cardName == CardName.KING) { - return "K"; - } - return String.valueOf(cardName.getCardNumber()); - } - - public static void printWithoutSummationCardPoint(GamerDTO gamerDTO) { - String outputWithoutSummationCardPoint = generateOutputWithoutSummationCardPoint(gamerDTO); - System.out.println(outputWithoutSummationCardPoint); - } - - private static String generateOutputWithoutSummationCardPoint(GamerDTO gamerDTO) { - String name = gamerDTO.getName(); - List cards = gamerDTO.getHoldingCards(); - String nameOutput = name + "카드"; - String cardsOutput = cards.stream() - .map(card -> mapToString(card.cardType()) + mapToString(card.cardName())) - .collect(Collectors.joining(", ")); - return "%s: %s".formatted(nameOutput, cardsOutput); - } -} diff --git a/src/main/java/view/gamer/CardOutputGenerator.java b/src/main/java/view/gamer/CardOutputGenerator.java new file mode 100644 index 00000000000..8d49c0e6de4 --- /dev/null +++ b/src/main/java/view/gamer/CardOutputGenerator.java @@ -0,0 +1,15 @@ +package view.gamer; + +import domain.card.Card; +import domain.card.CardName; +import domain.card.CardType; + +class CardOutputGenerator { + static String generate(Card card) { + CardName cardName = card.cardName(); + CardType cardType = card.cardType(); + ViewCardName viewCardName = ViewCardName.of(cardName); + ViewCardType viewCardType = ViewCardType.of(cardType); + return viewCardName.getOutput() + viewCardType.getOutput(); + } +} diff --git a/src/main/java/view/gamer/GamerOutputView.java b/src/main/java/view/gamer/GamerOutputView.java new file mode 100644 index 00000000000..150e603e4af --- /dev/null +++ b/src/main/java/view/gamer/GamerOutputView.java @@ -0,0 +1,32 @@ +package view.gamer; + +import domain.card.Card; +import dto.GamerDTO; +import java.util.List; +import java.util.stream.Collectors; + +public class GamerOutputView { + + public static void print(GamerDTO gamerDTO) { + String outputWithoutSummationCardPoint = generateOutputWithoutSummationCardPoint(gamerDTO); + String summationCardPointOutput = "결과: %d".formatted(gamerDTO.getSummationCardPoint()); + System.out.printf("%s - %s%n", outputWithoutSummationCardPoint, summationCardPointOutput); + } + + + public static void printWithoutSummationCardPoint(GamerDTO gamerDTO) { + String outputWithoutSummationCardPoint = generateOutputWithoutSummationCardPoint(gamerDTO); + System.out.println(outputWithoutSummationCardPoint); + } + + private static String generateOutputWithoutSummationCardPoint(GamerDTO gamerDTO) { + String name = gamerDTO.getName(); + List cards = gamerDTO.getHoldingCards(); + String nameOutput = name + "카드"; + String cardsOutput = cards.stream() + .map(CardOutputGenerator::generate) + .collect(Collectors.joining(", ")); + return "%s: %s".formatted(nameOutput, cardsOutput); + } + +} diff --git a/src/main/java/view/gamer/ViewCardName.java b/src/main/java/view/gamer/ViewCardName.java new file mode 100644 index 00000000000..03027114994 --- /dev/null +++ b/src/main/java/view/gamer/ViewCardName.java @@ -0,0 +1,33 @@ +package view.gamer; + +import domain.card.CardName; + +public enum ViewCardName { + ACE("A"), + TWO("2"), + THREE("3"), + FOUR("4"), + FIVE("5"), + SIX("6"), + SEVEN("7"), + EIGHT("8"), + NINE("9"), + TEN("10"), + JACK("J"), + QUEEN("Q"), + KING("K"); + + private final String output; + + static ViewCardName of(CardName cardName) { + return valueOf(cardName.name()); + } + + ViewCardName(String output) { + this.output = output; + } + + String getOutput() { + return output; + } +} diff --git a/src/main/java/view/gamer/ViewCardType.java b/src/main/java/view/gamer/ViewCardType.java new file mode 100644 index 00000000000..50a45308dc7 --- /dev/null +++ b/src/main/java/view/gamer/ViewCardType.java @@ -0,0 +1,24 @@ +package view.gamer; + +import domain.card.CardType; + +enum ViewCardType { + HEART("하트"), + SPADE("스페이드"), + CLOVER("클로버"), + DIAMOND("다이아몬드"); + + private final String output; + + ViewCardType(String output) { + this.output = output; + } + + static ViewCardType of(CardType cardType) { + return valueOf(cardType.name()); + } + + public String getOutput() { + return output; + } +} diff --git a/src/main/java/view/gameresult/DealerGameResultOutputGenerator.java b/src/main/java/view/gameresult/DealerGameResultOutputGenerator.java new file mode 100644 index 00000000000..163c1cae411 --- /dev/null +++ b/src/main/java/view/gameresult/DealerGameResultOutputGenerator.java @@ -0,0 +1,21 @@ +package view.gameresult; + +import domain.blackjack.GameResult; +import dto.DealerGameResultDTO; +import java.util.Map; +import java.util.stream.Collectors; + +class DealerGameResultOutputGenerator { + static String generate(DealerGameResultDTO dealerGameResultDTO) { + Map dealerGameResultCounts = dealerGameResultDTO.getDealerGameResultCounts(); + return dealerGameResultCounts.entrySet() + .stream() + .map(mapEntry -> { + Integer resultCount = mapEntry.getValue(); + ViewGameResult viewGameResult = ViewGameResult.of(mapEntry.getKey()); + String viewGameResultOutput = viewGameResult.getOutput(); + return "%d%s".formatted(resultCount, viewGameResultOutput); + }) + .collect(Collectors.joining(" ")); + } +} diff --git a/src/main/java/view/gameresult/GameResultOutputView.java b/src/main/java/view/gameresult/GameResultOutputView.java new file mode 100644 index 00000000000..8eeed741b0b --- /dev/null +++ b/src/main/java/view/gameresult/GameResultOutputView.java @@ -0,0 +1,17 @@ +package view.gameresult; + +import dto.DealerGameResultDTO; +import dto.PlayerGameResultDTO; + +public class GameResultOutputView { + public static void print(PlayerGameResultDTO playerGameResultDTO) { + String gameResultOutput = PlayerGameResultOutputGenerator.generate(playerGameResultDTO); + System.out.println(gameResultOutput); + } + + public static void print(DealerGameResultDTO dealerGameResultDTO) { + String gameResultOutput = DealerGameResultOutputGenerator.generate(dealerGameResultDTO); + System.out.printf("딜러: %s%n", gameResultOutput); + } + +} diff --git a/src/main/java/view/gameresult/PlayerGameResultOutputGenerator.java b/src/main/java/view/gameresult/PlayerGameResultOutputGenerator.java new file mode 100644 index 00000000000..b057e24ff71 --- /dev/null +++ b/src/main/java/view/gameresult/PlayerGameResultOutputGenerator.java @@ -0,0 +1,13 @@ +package view.gameresult; + +import domain.blackjack.GameResult; +import dto.PlayerGameResultDTO; + +class PlayerGameResultOutputGenerator { + static String generate(PlayerGameResultDTO playerGameResultDTO) { + String gamerName = playerGameResultDTO.getGamerName(); + GameResult gameResult = playerGameResultDTO.getGameResult(); + ViewGameResult viewGameResult = ViewGameResult.of(gameResult); + return "%s: %s".formatted(gamerName, viewGameResult.getOutput()); + } +} diff --git a/src/main/java/view/gameresult/ViewGameResult.java b/src/main/java/view/gameresult/ViewGameResult.java new file mode 100644 index 00000000000..b670f0ea85a --- /dev/null +++ b/src/main/java/view/gameresult/ViewGameResult.java @@ -0,0 +1,22 @@ +package view.gameresult; + +import domain.blackjack.GameResult; + +public enum ViewGameResult { + WIN("승"), + LOSE("패"), + TIE("무"); + private final String output; + + static ViewGameResult of(GameResult gameResult) { + return valueOf(gameResult.name()); + } + + ViewGameResult(String output) { + this.output = output; + } + + public String getOutput() { + return output; + } +} From 6f1a623da41ba20990f6ea724884868edf1bdf54 Mon Sep 17 00:00:00 2001 From: robinjoon Date: Mon, 11 Mar 2024 15:42:41 +0900 Subject: [PATCH 42/56] =?UTF-8?q?chore:=20=ED=95=84=EC=9A=94=20=EC=97=86?= =?UTF-8?q?=EB=8A=94=20TODO=20=EC=A3=BC=EC=84=9D=20=EC=A0=9C=EA=B1=B0?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- src/test/java/domain/blackjack/GamerTest.java | 1 - 1 file changed, 1 deletion(-) diff --git a/src/test/java/domain/blackjack/GamerTest.java b/src/test/java/domain/blackjack/GamerTest.java index 36410695790..10e4eaa6c76 100644 --- a/src/test/java/domain/blackjack/GamerTest.java +++ b/src/test/java/domain/blackjack/GamerTest.java @@ -23,7 +23,6 @@ import org.junit.jupiter.params.provider.Arguments; import org.junit.jupiter.params.provider.MethodSource; -// TODO: GameResultCalculateTest처럼 인스턴스 변수 정의 필요 class GamerTest { public static Stream isDeadParameters() { return Stream.of( From 4df7ab4e2bf7fa3006b452ce2a33231af330a195 Mon Sep 17 00:00:00 2001 From: robinjoon Date: Mon, 11 Mar 2024 15:59:25 +0900 Subject: [PATCH 43/56] =?UTF-8?q?refactor:=20Controller=20=EB=82=B4?= =?UTF-8?q?=EB=B6=80=20=EB=A9=94=EC=84=9C=EB=93=9C=20=EB=B6=84=EB=A6=AC?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../java/controller/BlackjackController.java | 32 ++++++++++++------- 1 file changed, 20 insertions(+), 12 deletions(-) diff --git a/src/main/java/controller/BlackjackController.java b/src/main/java/controller/BlackjackController.java index ce63370f739..a254959f9b2 100644 --- a/src/main/java/controller/BlackjackController.java +++ b/src/main/java/controller/BlackjackController.java @@ -1,9 +1,11 @@ package controller; +import static domain.blackjack.GameResultCalculator.calculate; +import static java.util.stream.Collectors.summingInt; + import domain.blackjack.DealerCardDrawCondition; import domain.blackjack.DrawResult; import domain.blackjack.GameResult; -import domain.blackjack.GameResultCalculator; import domain.blackjack.Gamer; import domain.card.Card; import domain.card.Deck; @@ -36,8 +38,11 @@ public void startBlackjackGame(Deck deck) { playersTryDraw(deck); dealerTryDraw(deck); - printDealerAndPlayersWithPoint(); - printDealerAndPlayersGameResult(); + printDealerWithPoint(); + printPlayersWithPoint(); + + printDealerGameResult(); + printPlayersGameResult(); } private void initDealerAndPlayers(Deck deck) { @@ -109,11 +114,13 @@ private void dealerTryDraw(Deck deck) { } } - private void printDealerAndPlayersWithPoint() { + private void printDealerWithPoint() { GamerDTO dealerDTO = new GamerDTO(dealer.getRawName(), dealer.getRawHoldingCards(), dealer.getRawSummationCardPoint()); GamerOutputView.print(dealerDTO); + } + private void printPlayersWithPoint() { for (Gamer player : players) { GamerDTO playerDTO = new GamerDTO(player.getRawName(), player.getRawHoldingCards(), player.getRawSummationCardPoint()); @@ -121,18 +128,19 @@ private void printDealerAndPlayersWithPoint() { } } - private void printDealerAndPlayersGameResult() { + private void printDealerGameResult() { Map dealerGameResultCounts = players.stream() - .collect(Collectors.groupingBy(player -> GameResultCalculator.calculate(dealer, player), - Collectors.summingInt(value -> 1))); + .collect(Collectors.groupingBy(player -> calculate(dealer, player), summingInt(value -> 1))); DealerGameResultDTO dealerGameResultDTO = new DealerGameResultDTO(dealerGameResultCounts); + GameResultOutputView.print(dealerGameResultDTO); + } + private void printPlayersGameResult() { List playerGameResultDTOS = players.stream() - .map(player -> new PlayerGameResultDTO(player.getRawName(), - GameResultCalculator.calculate(player, dealer))) + .map(player -> new PlayerGameResultDTO(player.getRawName(), calculate(player, dealer))) .toList(); - - GameResultOutputView.print(dealerGameResultDTO); - playerGameResultDTOS.forEach(GameResultOutputView::print); + for (PlayerGameResultDTO playerGameResultDTO : playerGameResultDTOS) { + GameResultOutputView.print(playerGameResultDTO); + } } } From bc92c769bd01e8292634367554acb4203c35164f Mon Sep 17 00:00:00 2001 From: robinjoon Date: Mon, 11 Mar 2024 19:30:58 +0900 Subject: [PATCH 44/56] =?UTF-8?q?fix:=20=ED=94=8C=EB=A0=88=EC=9D=B4?= =?UTF-8?q?=EC=96=B4=EA=B0=80=20=EB=94=9C=EB=9F=AC=EC=9D=98=20=EC=A0=84?= =?UTF-8?q?=EB=9E=B5=EC=9D=84=20=EC=82=AC=EC=9A=A9=ED=95=98=EB=8A=94=20?= =?UTF-8?q?=EC=98=A4=EB=A5=98=20=EC=88=98=EC=A0=95?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- src/main/java/controller/BlackjackController.java | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/src/main/java/controller/BlackjackController.java b/src/main/java/controller/BlackjackController.java index a254959f9b2..21df5a57911 100644 --- a/src/main/java/controller/BlackjackController.java +++ b/src/main/java/controller/BlackjackController.java @@ -7,6 +7,7 @@ import domain.blackjack.DrawResult; import domain.blackjack.GameResult; import domain.blackjack.Gamer; +import domain.blackjack.PlayerCardDrawCondition; import domain.card.Card; import domain.card.Deck; import domain.card.RandomCardSelectStrategy; @@ -59,7 +60,7 @@ private DrawResult dealerDraw(Deck deck) { } private DrawResult playerDraw(Deck deck, Gamer player) { - return player.draw(deck, new RandomCardSelectStrategy(), new DealerCardDrawCondition(player)); + return player.draw(deck, new RandomCardSelectStrategy(), new PlayerCardDrawCondition(player)); } private void printDealerAndPlayers() { From 671e977f0a7478a498842e7f0f17b6a9ad93f912 Mon Sep 17 00:00:00 2001 From: robinjoon Date: Mon, 11 Mar 2024 20:50:28 +0900 Subject: [PATCH 45/56] =?UTF-8?q?refactor:=20=EB=94=9C=EB=9F=AC=EC=99=80?= =?UTF-8?q?=20=ED=94=8C=EB=A0=88=EC=9D=B4=EC=96=B4=20=EB=B6=84=EB=A6=AC?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit 상속이 아니라 조합을 이용함 --- src/main/java/Main.java | 9 ++- .../java/controller/BlackjackController.java | 35 ++++---- .../blackjack/BlackJackGameMachine.java | 63 +++++++++++++++ src/main/java/domain/blackjack/Dealer.java | 25 ++++++ .../blackjack/DealerCardDrawCondition.java | 8 +- .../blackjack/GameResultCalculator.java | 22 ++--- src/main/java/domain/blackjack/Gamer.java | 63 +++------------ src/main/java/domain/blackjack/Player.java | 27 +++++++ .../blackjack/PlayerCardDrawCondition.java | 6 +- .../blackjack/BlackJackGameMachineTest.java | 81 +++++++++++++++++++ .../DealerCardDrawConditionTest.java | 4 +- .../java/domain/blackjack/DealerTest.java | 54 +++++++++++++ .../blackjack/GameResultCalculatorTest.java | 29 ++++--- src/test/java/domain/blackjack/GamerTest.java | 69 ++++------------ .../PlayerCardDrawConditionTest.java | 2 +- .../java/domain/blackjack/PlayerTest.java | 51 ++++++++++++ 16 files changed, 392 insertions(+), 156 deletions(-) create mode 100644 src/main/java/domain/blackjack/BlackJackGameMachine.java create mode 100644 src/main/java/domain/blackjack/Dealer.java create mode 100644 src/main/java/domain/blackjack/Player.java create mode 100644 src/test/java/domain/blackjack/BlackJackGameMachineTest.java create mode 100644 src/test/java/domain/blackjack/DealerTest.java create mode 100644 src/test/java/domain/blackjack/PlayerTest.java diff --git a/src/main/java/Main.java b/src/main/java/Main.java index 17fab767d55..9ae42972bfb 100644 --- a/src/main/java/Main.java +++ b/src/main/java/Main.java @@ -1,6 +1,7 @@ import controller.BlackjackController; -import domain.blackjack.Gamer; +import domain.blackjack.Dealer; import domain.blackjack.HoldingCards; +import domain.blackjack.Player; import domain.card.Deck; import java.util.List; import view.NameInputView; @@ -8,10 +9,10 @@ public class Main { public static void main(String[] args) { - Gamer dealer = new Gamer("딜러", HoldingCards.of()); + Dealer dealer = Dealer.of(HoldingCards.of()); OutputView.print("게임에 참여할 사람의 이름을 입력하세요.(쉼표 기준으로 분리)"); - List players = NameInputView.getNames().stream() - .map(name -> new Gamer(name, HoldingCards.of())) + List players = NameInputView.getNames().stream() + .map(name -> Player.from(name, HoldingCards.of())) .toList(); BlackjackController blackjackController = new BlackjackController(dealer, players); blackjackController.startBlackjackGame(Deck.fullDeck()); diff --git a/src/main/java/controller/BlackjackController.java b/src/main/java/controller/BlackjackController.java index 21df5a57911..96f92d5779c 100644 --- a/src/main/java/controller/BlackjackController.java +++ b/src/main/java/controller/BlackjackController.java @@ -3,11 +3,10 @@ import static domain.blackjack.GameResultCalculator.calculate; import static java.util.stream.Collectors.summingInt; -import domain.blackjack.DealerCardDrawCondition; +import domain.blackjack.Dealer; import domain.blackjack.DrawResult; import domain.blackjack.GameResult; -import domain.blackjack.Gamer; -import domain.blackjack.PlayerCardDrawCondition; +import domain.blackjack.Player; import domain.card.Card; import domain.card.Deck; import domain.card.RandomCardSelectStrategy; @@ -24,10 +23,10 @@ import view.gameresult.GameResultOutputView; public class BlackjackController { - private final Gamer dealer; - private final List players; + private final Dealer dealer; + private final List players; - public BlackjackController(Gamer dealer, List players) { + public BlackjackController(Dealer dealer, List players) { this.dealer = dealer; this.players = players; } @@ -51,16 +50,16 @@ private void initDealerAndPlayers(Deck deck) { dealerDraw(deck); players.forEach(player -> playerDraw(deck, player)); } - String namesOutput = players.stream().map(Gamer::getRawName).collect(Collectors.joining(", ")); + String namesOutput = players.stream().map(Player::getRawName).collect(Collectors.joining(", ")); OutputView.print("딜러와 %s에게 2장을 나누었습니다.".formatted(namesOutput)); } private DrawResult dealerDraw(Deck deck) { - return dealer.draw(deck, new RandomCardSelectStrategy(), new DealerCardDrawCondition(dealer)); + return dealer.draw(deck, new RandomCardSelectStrategy()); } - private DrawResult playerDraw(Deck deck, Gamer player) { - return player.draw(deck, new RandomCardSelectStrategy(), new PlayerCardDrawCondition(player)); + private DrawResult playerDraw(Deck deck, Player player) { + return player.draw(deck, new RandomCardSelectStrategy()); } private void printDealerAndPlayers() { @@ -68,7 +67,7 @@ private void printDealerAndPlayers() { players.forEach(BlackjackController::printPlayer); } - private static void printDealer(Gamer dealer) { + private static void printDealer(Dealer dealer) { List rawHoldingCards = new ArrayList<>(dealer.getRawHoldingCards()); rawHoldingCards.remove(0); GamerDTO gamerDTO = new GamerDTO(dealer.getRawName(), rawHoldingCards, @@ -76,7 +75,7 @@ private static void printDealer(Gamer dealer) { GamerOutputView.printWithoutSummationCardPoint(gamerDTO); } - private static void printPlayer(Gamer player) { + private static void printPlayer(Player player) { GamerDTO gamerDTO = new GamerDTO(player.getRawName(), player.getRawHoldingCards(), player.getRawSummationCardPoint()); GamerOutputView.printWithoutSummationCardPoint(gamerDTO); @@ -86,14 +85,14 @@ private void playersTryDraw(Deck deck) { players.forEach(player -> playerTryDraw(deck, player)); } - private void playerTryDraw(Deck deck, Gamer player) { + private void playerTryDraw(Deck deck, Player player) { boolean hasNextDrawChance = true; while (hasNextDrawChance) { hasNextDrawChance = playerTryDrawOnce(deck, player); } } - private boolean playerTryDrawOnce(Deck deck, Gamer player) { + private boolean playerTryDrawOnce(Deck deck, Player player) { OutputView.print("%s은(는) 한장의 카드를 더 받겠습니까?(예는 y, 아니오는 n)".formatted(player.getRawName())); boolean needToDraw = YesOrNoInputView.getYNAsBoolean(); DrawResult drawResult = null; @@ -122,7 +121,7 @@ private void printDealerWithPoint() { } private void printPlayersWithPoint() { - for (Gamer player : players) { + for (Player player : players) { GamerDTO playerDTO = new GamerDTO(player.getRawName(), player.getRawHoldingCards(), player.getRawSummationCardPoint()); GamerOutputView.print(playerDTO); @@ -131,14 +130,16 @@ private void printPlayersWithPoint() { private void printDealerGameResult() { Map dealerGameResultCounts = players.stream() - .collect(Collectors.groupingBy(player -> calculate(dealer, player), summingInt(value -> 1))); + .collect(Collectors.groupingBy(player -> calculate(dealer.getGamer(), player.getGamer()), + summingInt(value -> 1))); DealerGameResultDTO dealerGameResultDTO = new DealerGameResultDTO(dealerGameResultCounts); GameResultOutputView.print(dealerGameResultDTO); } private void printPlayersGameResult() { List playerGameResultDTOS = players.stream() - .map(player -> new PlayerGameResultDTO(player.getRawName(), calculate(player, dealer))) + .map(player -> new PlayerGameResultDTO(player.getRawName(), + calculate(player.getGamer(), dealer.getGamer()))) .toList(); for (PlayerGameResultDTO playerGameResultDTO : playerGameResultDTOS) { GameResultOutputView.print(playerGameResultDTO); diff --git a/src/main/java/domain/blackjack/BlackJackGameMachine.java b/src/main/java/domain/blackjack/BlackJackGameMachine.java new file mode 100644 index 00000000000..fa7df0b1ab3 --- /dev/null +++ b/src/main/java/domain/blackjack/BlackJackGameMachine.java @@ -0,0 +1,63 @@ +package domain.blackjack; + +import static domain.card.CardName.TEN; + +import domain.card.Card; +import domain.card.CardDrawCondition; +import domain.card.CardSelectStrategy; +import domain.card.Deck; +import java.util.List; + +public class BlackJackGameMachine { + private final HoldingCards holdingCards; + + public BlackJackGameMachine(HoldingCards holdingCards) { + this.holdingCards = holdingCards; + } + + public DrawResult draw(Deck deck, CardSelectStrategy cardSelectStrategy, CardDrawCondition cardDrawCondition) { + if (isBust() || !cardDrawCondition.canDraw()) { + return DrawResult.fail("카드를 더이상 뽑을 수 없습니다.", false); + } + try { + Card draw = deck.draw(cardSelectStrategy); + holdingCards.add(draw); + return DrawResult.success(!isBust()); + } catch (IllegalArgumentException | IllegalStateException e) { + return DrawResult.fail(e, !isBust()); + } + } + + public SummationCardPoint getSummationCardPoint() { + SummationCardPoint summationCardPoint = holdingCards.calculateTotalPoint(); + if (hasAceInHoldingCards()) { + int rawPoint = fixPoint(summationCardPoint.summationCardPoint()); + return new SummationCardPoint(rawPoint); + } + return summationCardPoint; + } + + private int fixPoint(int rawPoint) { + SummationCardPoint fixPoint = new SummationCardPoint(rawPoint + TEN.getCardNumber()); + if (!fixPoint.isDeadPoint()) { + return fixPoint.summationCardPoint(); + } + return rawPoint; + } + + public List getRawHoldingCards() { + return List.copyOf(holdingCards.getHoldingCards()); + } + + public int getRawSummationCardPoint() { + return getSummationCardPoint().summationCardPoint(); + } + + boolean isBust() { + return getSummationCardPoint().isDeadPoint(); + } + + boolean hasAceInHoldingCards() { + return holdingCards.hasAce(); + } +} diff --git a/src/main/java/domain/blackjack/Dealer.java b/src/main/java/domain/blackjack/Dealer.java new file mode 100644 index 00000000000..0c724e112d8 --- /dev/null +++ b/src/main/java/domain/blackjack/Dealer.java @@ -0,0 +1,25 @@ +package domain.blackjack; + +import domain.card.CardSelectStrategy; +import domain.card.Deck; + +public class Dealer extends Gamer { + + public static Dealer of(HoldingCards holdingCards) { + return new Dealer(new BlackJackGameMachine(holdingCards)); + } + + Dealer(BlackJackGameMachine blackJackGameMachine) { + super(blackJackGameMachine); + } + + @Override + public DrawResult draw(Deck deck, CardSelectStrategy cardSelectStrategy) { + return blackJackGameMachine.draw(deck, cardSelectStrategy, new DealerCardDrawCondition(blackJackGameMachine)); + } + + @Override + public String getRawName() { + return "딜러"; + } +} diff --git a/src/main/java/domain/blackjack/DealerCardDrawCondition.java b/src/main/java/domain/blackjack/DealerCardDrawCondition.java index c7543a7d098..4db0f91cbd5 100644 --- a/src/main/java/domain/blackjack/DealerCardDrawCondition.java +++ b/src/main/java/domain/blackjack/DealerCardDrawCondition.java @@ -3,10 +3,10 @@ import domain.card.CardDrawCondition; public final class DealerCardDrawCondition implements CardDrawCondition { - private final Gamer dealer; + private final BlackJackGameMachine blackJackGameMachine; - public DealerCardDrawCondition(Gamer dealer) { - this.dealer = dealer; + public DealerCardDrawCondition(BlackJackGameMachine blackJackGameMachine) { + this.blackJackGameMachine = blackJackGameMachine; } @Override @@ -14,7 +14,7 @@ public boolean canDraw() { final int rawDealerDrawThresholdPoint = 16; SummationCardPoint dealerDrawThresholdPoint = new SummationCardPoint(rawDealerDrawThresholdPoint); - SummationCardPoint summationCardPoint = dealer.getSummationCardPoint(); + SummationCardPoint summationCardPoint = blackJackGameMachine.getSummationCardPoint(); return !summationCardPoint.isBiggerThan(dealerDrawThresholdPoint); } } diff --git a/src/main/java/domain/blackjack/GameResultCalculator.java b/src/main/java/domain/blackjack/GameResultCalculator.java index ffac144a31a..b1b78fccc95 100644 --- a/src/main/java/domain/blackjack/GameResultCalculator.java +++ b/src/main/java/domain/blackjack/GameResultCalculator.java @@ -4,26 +4,28 @@ public class GameResultCalculator { /** * baseGamer의 otherGamer 에 대한 승부 결과 반환 * - * @param baseGamer 기준 게이머 - * @param otherGamer 상대 게이머 + * @param baseBlackJackGameMachine 기준 게이머 + * @param otherBlackJackGameMachine 상대 게이머 * @return baseGamer의 otherGamer 에 대한 승부 결과 */ - public static GameResult calculate(Gamer baseGamer, Gamer otherGamer) { - if (baseGamer.isDead() && otherGamer.isDead()) { + public static GameResult calculate(BlackJackGameMachine baseBlackJackGameMachine, + BlackJackGameMachine otherBlackJackGameMachine) { + if (baseBlackJackGameMachine.isBust() && otherBlackJackGameMachine.isBust()) { return GameResult.TIE; } - if (baseGamer.isDead()) { + if (baseBlackJackGameMachine.isBust()) { return GameResult.LOSE; } - if (otherGamer.isDead()) { + if (otherBlackJackGameMachine.isBust()) { return GameResult.WIN; } - return getGameResultWhenNobodyDead(baseGamer, otherGamer); + return getGameResultWhenNobodyDead(baseBlackJackGameMachine, otherBlackJackGameMachine); } - private static GameResult getGameResultWhenNobodyDead(Gamer baseGamer, Gamer otherGamer) { - SummationCardPoint baseGamerSummationCardPoint = baseGamer.getSummationCardPoint(); - SummationCardPoint otherGamerSummationCardPoint = otherGamer.getSummationCardPoint(); + private static GameResult getGameResultWhenNobodyDead(BlackJackGameMachine baseBlackJackGameMachine, + BlackJackGameMachine otherBlackJackGameMachine) { + SummationCardPoint baseGamerSummationCardPoint = baseBlackJackGameMachine.getSummationCardPoint(); + SummationCardPoint otherGamerSummationCardPoint = otherBlackJackGameMachine.getSummationCardPoint(); if (baseGamerSummationCardPoint.isBiggerThan(otherGamerSummationCardPoint)) { return GameResult.WIN; diff --git a/src/main/java/domain/blackjack/Gamer.java b/src/main/java/domain/blackjack/Gamer.java index dec075d39ee..48a0ce1021d 100644 --- a/src/main/java/domain/blackjack/Gamer.java +++ b/src/main/java/domain/blackjack/Gamer.java @@ -1,69 +1,30 @@ package domain.blackjack; -import static domain.card.CardName.TEN; - import domain.card.Card; -import domain.card.CardDrawCondition; import domain.card.CardSelectStrategy; import domain.card.Deck; import java.util.List; -public class Gamer { - private final String name; - private final HoldingCards holdingCards; +abstract class Gamer { + protected final BlackJackGameMachine blackJackGameMachine; - public Gamer(String name, HoldingCards holdingCards) { - this.name = name; - this.holdingCards = holdingCards; + public Gamer(BlackJackGameMachine blackJackGameMachine) { + this.blackJackGameMachine = blackJackGameMachine; } - public DrawResult draw(Deck deck, CardSelectStrategy cardSelectStrategy, CardDrawCondition cardDrawCondition) { - if (isDead() || !cardDrawCondition.canDraw()) { - return DrawResult.fail("카드를 더이상 뽑을 수 없습니다.", false); - } - try { - Card draw = deck.draw(cardSelectStrategy); - holdingCards.add(draw); - return DrawResult.success(!isDead()); - } catch (IllegalArgumentException | IllegalStateException e) { - return DrawResult.fail(e, !isDead()); - } - } + public abstract DrawResult draw(Deck deck, CardSelectStrategy cardSelectStrategy); - public SummationCardPoint getSummationCardPoint() { - SummationCardPoint summationCardPoint = holdingCards.calculateTotalPoint(); - if (hasAceInHoldingCards()) { - int rawPoint = fixPoint(summationCardPoint.summationCardPoint()); - return new SummationCardPoint(rawPoint); - } - return summationCardPoint; + public final List getRawHoldingCards() { + return blackJackGameMachine.getRawHoldingCards(); } - private int fixPoint(int rawPoint) { - SummationCardPoint fixPoint = new SummationCardPoint(rawPoint + TEN.getCardNumber()); - if (!fixPoint.isDeadPoint()) { - return fixPoint.summationCardPoint(); - } - return rawPoint; + public final int getRawSummationCardPoint() { + return blackJackGameMachine.getRawSummationCardPoint(); } - public String getRawName() { - return name; + public final BlackJackGameMachine getGamer() { + return blackJackGameMachine; } - public List getRawHoldingCards() { - return List.copyOf(holdingCards.getHoldingCards()); - } - - public int getRawSummationCardPoint() { - return getSummationCardPoint().summationCardPoint(); - } - - public boolean isDead() { - return getSummationCardPoint().isDeadPoint(); - } - - boolean hasAceInHoldingCards() { - return holdingCards.hasAce(); - } + public abstract String getRawName(); } diff --git a/src/main/java/domain/blackjack/Player.java b/src/main/java/domain/blackjack/Player.java new file mode 100644 index 00000000000..a411e7b9c18 --- /dev/null +++ b/src/main/java/domain/blackjack/Player.java @@ -0,0 +1,27 @@ +package domain.blackjack; + +import domain.card.CardSelectStrategy; +import domain.card.Deck; + +public class Player extends Gamer { + private final String name; + + public static Player from(String name, HoldingCards holdingCards) { + return new Player(name, new BlackJackGameMachine(holdingCards)); + } + + private Player(String name, BlackJackGameMachine blackJackGameMachine) { + super(blackJackGameMachine); + this.name = name; + } + + @Override + public DrawResult draw(Deck deck, CardSelectStrategy cardSelectStrategy) { + return blackJackGameMachine.draw(deck, cardSelectStrategy, new PlayerCardDrawCondition(blackJackGameMachine)); + } + + @Override + public String getRawName() { + return name; + } +} diff --git a/src/main/java/domain/blackjack/PlayerCardDrawCondition.java b/src/main/java/domain/blackjack/PlayerCardDrawCondition.java index 29e4d857612..d7d7b1b1969 100644 --- a/src/main/java/domain/blackjack/PlayerCardDrawCondition.java +++ b/src/main/java/domain/blackjack/PlayerCardDrawCondition.java @@ -3,14 +3,14 @@ import domain.card.CardDrawCondition; public final class PlayerCardDrawCondition implements CardDrawCondition { - private final Gamer player; + private final BlackJackGameMachine player; - public PlayerCardDrawCondition(Gamer player) { + public PlayerCardDrawCondition(BlackJackGameMachine player) { this.player = player; } @Override public boolean canDraw() { - return !player.isDead(); + return !player.isBust(); } } diff --git a/src/test/java/domain/blackjack/BlackJackGameMachineTest.java b/src/test/java/domain/blackjack/BlackJackGameMachineTest.java new file mode 100644 index 00000000000..9cc6a764489 --- /dev/null +++ b/src/test/java/domain/blackjack/BlackJackGameMachineTest.java @@ -0,0 +1,81 @@ +package domain.blackjack; + +import static domain.blackjack.TestHoldingCards.DEAD_CARDS; +import static domain.blackjack.TestHoldingCards.ONLY_SEVEN_HEART; +import static domain.blackjack.TestHoldingCards.WIN_CARDS_WITHOUT_ACE; +import static domain.blackjack.TestHoldingCards.WIN_CARDS_WITH_ACE; +import static domain.card.Card.ACE_HEART; +import static domain.card.Card.EIGHT_HEART; +import static domain.card.Card.JACK_HEART; +import static domain.card.Card.QUEEN_HEART; +import static domain.card.Card.TWO_HEART; +import static domain.card.FirstCardSelectStrategy.FIRST_CARD_SELECT_STRATEGY; + +import domain.card.Card; +import domain.card.Deck; +import java.util.List; +import java.util.stream.Stream; +import org.assertj.core.api.Assertions; +import org.junit.jupiter.api.DisplayName; +import org.junit.jupiter.api.Test; +import org.junit.jupiter.params.ParameterizedTest; +import org.junit.jupiter.params.provider.Arguments; +import org.junit.jupiter.params.provider.MethodSource; + +class BlackJackGameMachineTest { + public static Stream isDeadParameters() { + return Stream.of( + Arguments.of(TWO_HEART, true), Arguments.of(ACE_HEART, false) + ); + } + + public static Stream getSummationCardPointParameters() { + return Stream.of( + Arguments.of(new BlackJackGameMachine(ONLY_SEVEN_HEART), new SummationCardPoint(7)), + Arguments.of(new BlackJackGameMachine(WIN_CARDS_WITH_ACE), new SummationCardPoint(21)), + Arguments.of(new BlackJackGameMachine(WIN_CARDS_WITHOUT_ACE), new SummationCardPoint(21)), + Arguments.of(new BlackJackGameMachine(DEAD_CARDS), new SummationCardPoint(22)) + ); + } + + @Test + @DisplayName("카드를 뽑았을 때 소유중인 카드에 제대로 반영되는지 검증") + void draw() { + BlackJackGameMachine blackJackGameMachine = new BlackJackGameMachine(HoldingCards.of()); + Deck deck = Deck.of(JACK_HEART, EIGHT_HEART); + blackJackGameMachine.draw(deck, FIRST_CARD_SELECT_STRATEGY, new PlayerCardDrawCondition(blackJackGameMachine)); + + List actual = blackJackGameMachine.getRawHoldingCards(); + + Assertions.assertThat(actual) + .containsExactly(JACK_HEART); + } + + @Test + @DisplayName("드로우 조건에 따라 드로우 가능 여부가 결정되는지 검증") + void validateDrawLimit() { + BlackJackGameMachine blackJackGameMachine = new BlackJackGameMachine(HoldingCards.of()); + Deck deck = Deck.of(TWO_HEART); + DrawResult drawResult = blackJackGameMachine.draw(deck, FIRST_CARD_SELECT_STRATEGY, () -> true); + Assertions.assertThat(drawResult.isSuccess()).isTrue(); + } + + @ParameterizedTest + @MethodSource("isDeadParameters") + @DisplayName("점수가 21이 넘으면 죽었다고 판단하는지 검증") + void isBust(Card additionalCard, boolean expected) { + BlackJackGameMachine blackJackGameMachine = new BlackJackGameMachine( + HoldingCards.of(JACK_HEART, QUEEN_HEART, additionalCard)); + + Assertions.assertThat(blackJackGameMachine.isBust()).isEqualTo(expected); + } + + @ParameterizedTest + @MethodSource("getSummationCardPointParameters") + @DisplayName("점수가 잘 계산되는지 검증") + void getSummationCardPoint(BlackJackGameMachine blackJackGameMachine, SummationCardPoint expected) { + SummationCardPoint summationCardPoint = blackJackGameMachine.getSummationCardPoint(); + Assertions.assertThat(summationCardPoint) + .isEqualTo(expected); + } +} diff --git a/src/test/java/domain/blackjack/DealerCardDrawConditionTest.java b/src/test/java/domain/blackjack/DealerCardDrawConditionTest.java index 88f54e3ba2a..ef049d812df 100644 --- a/src/test/java/domain/blackjack/DealerCardDrawConditionTest.java +++ b/src/test/java/domain/blackjack/DealerCardDrawConditionTest.java @@ -28,8 +28,8 @@ public static Stream canDrawParameters() { @MethodSource("canDrawParameters") @DisplayName("딜러의 드로우 여부가 제대로 판단되는지 검증") void canDraw(HoldingCards holdingCards, boolean expected) { - Gamer dealer = new Gamer("딜러", holdingCards); - Assertions.assertThat(new DealerCardDrawCondition(dealer).canDraw()) + BlackJackGameMachine dealerMachine = new BlackJackGameMachine(holdingCards); + Assertions.assertThat(new DealerCardDrawCondition(dealerMachine).canDraw()) .isEqualTo(expected); } } diff --git a/src/test/java/domain/blackjack/DealerTest.java b/src/test/java/domain/blackjack/DealerTest.java new file mode 100644 index 00000000000..3b60bdb27bb --- /dev/null +++ b/src/test/java/domain/blackjack/DealerTest.java @@ -0,0 +1,54 @@ +package domain.blackjack; + +import static domain.card.Card.ACE_HEART; +import static domain.card.Card.FIVE_HEART; +import static domain.card.Card.JACK_HEART; +import static domain.card.Card.QUEEN_HEART; +import static domain.card.Card.SEVEN_HEART; +import static domain.card.Card.TWO_HEART; +import static domain.card.FirstCardSelectStrategy.FIRST_CARD_SELECT_STRATEGY; + +import domain.card.Card; +import domain.card.Deck; +import java.util.stream.Stream; +import org.assertj.core.api.Assertions; +import org.junit.jupiter.api.DisplayName; +import org.junit.jupiter.api.Test; +import org.junit.jupiter.params.ParameterizedTest; +import org.junit.jupiter.params.provider.Arguments; +import org.junit.jupiter.params.provider.MethodSource; + +class DealerTest { + + @Test + @DisplayName("딜러는 총합이 16이 넘으면 카드를 뽑을 수 없는지 검증") + void validateDealerDrawLimit() { + Deck deck = Deck.of(TWO_HEART); + BlackJackGameMachine blackJackGameMachine = new BlackJackGameMachine(HoldingCards.of(JACK_HEART, SEVEN_HEART)); + Dealer dealer = new Dealer(blackJackGameMachine); + + DrawResult drawResult = dealer.draw(deck, FIRST_CARD_SELECT_STRATEGY); + Assertions.assertThat(drawResult.getFailCause()) + .isEqualTo("카드를 더이상 뽑을 수 없습니다."); + } + + static Stream validateDealerHasNextDrawChanceParameters() { + return Stream.of( + Arguments.of(TWO_HEART, false), Arguments.of(ACE_HEART, true) + ); + } + + @ParameterizedTest + @MethodSource("validateDealerHasNextDrawChanceParameters") + @DisplayName("딜러의 다음 드로우 기회 유무를 제대로 판단하는지 검증") + void validatePlayerHasNextDrawChance(Card cardInHand, boolean expected) { + Deck deck = Deck.of(ACE_HEART); + BlackJackGameMachine blackJackGameMachine = new BlackJackGameMachine( + HoldingCards.of(FIVE_HEART, QUEEN_HEART, cardInHand)); + Dealer dealer = new Dealer(blackJackGameMachine); + + DrawResult drawResult = dealer.draw(deck, FIRST_CARD_SELECT_STRATEGY); + Assertions.assertThat(drawResult.hasNextChance()) + .isEqualTo(expected); + } +} diff --git a/src/test/java/domain/blackjack/GameResultCalculatorTest.java b/src/test/java/domain/blackjack/GameResultCalculatorTest.java index 38ab230bcc4..a787e0bb6e0 100644 --- a/src/test/java/domain/blackjack/GameResultCalculatorTest.java +++ b/src/test/java/domain/blackjack/GameResultCalculatorTest.java @@ -21,22 +21,31 @@ class GameResultCalculatorTest { public static Stream getGameResultParameters() { return Stream.of( - Arguments.of(new Gamer("게이머1", ONLY_SEVEN_HEART), new Gamer("게이머2", ONLY_SIX_HEART), WIN), - Arguments.of(new Gamer("게이머1", ONLY_SIX_HEART), new Gamer("게이머2", ONLY_SEVEN_HEART), LOSE), - Arguments.of(new Gamer("게이머1", ONLY_SEVEN_HEART), new Gamer("게이머2", ONLY_SEVEN_HEART), TIE), - Arguments.of(new Gamer("게이머1", DEAD_CARDS), new Gamer("게이머2", ONLY_SEVEN_HEART), LOSE), - Arguments.of(new Gamer("게이머1", ONLY_SEVEN_HEART), new Gamer("게이머2", DEAD_CARDS), WIN), - Arguments.of(new Gamer("게이머1", DEAD_CARDS), new Gamer("게이머2", DEAD_CARDS), TIE), - Arguments.of(new Gamer("게이머1", WIN_CARDS_WITH_ACE), new Gamer("게이머2", TWO_SIX_CARDS), WIN), - Arguments.of(new Gamer("게이머1", WIN_CARDS_WITH_ACE), new Gamer("게이머2", WIN_CARDS_WITHOUT_ACE), TIE) + Arguments.of(new BlackJackGameMachine(ONLY_SEVEN_HEART), + new BlackJackGameMachine(ONLY_SIX_HEART), WIN), + Arguments.of(new BlackJackGameMachine(ONLY_SIX_HEART), + new BlackJackGameMachine(ONLY_SEVEN_HEART), LOSE), + Arguments.of(new BlackJackGameMachine(ONLY_SEVEN_HEART), + new BlackJackGameMachine(ONLY_SEVEN_HEART), TIE), + Arguments.of(new BlackJackGameMachine(DEAD_CARDS), + new BlackJackGameMachine(ONLY_SEVEN_HEART), LOSE), + Arguments.of(new BlackJackGameMachine(ONLY_SEVEN_HEART), + new BlackJackGameMachine(DEAD_CARDS), WIN), + Arguments.of(new BlackJackGameMachine(DEAD_CARDS), new BlackJackGameMachine(DEAD_CARDS), + TIE), + Arguments.of(new BlackJackGameMachine(WIN_CARDS_WITH_ACE), + new BlackJackGameMachine(TWO_SIX_CARDS), WIN), + Arguments.of(new BlackJackGameMachine(WIN_CARDS_WITH_ACE), + new BlackJackGameMachine(WIN_CARDS_WITHOUT_ACE), TIE) ); } @ParameterizedTest @MethodSource("getGameResultParameters") @DisplayName("승부가 잘 결정되는지 검증") - void calculate(Gamer gamer1, Gamer gamer2, GameResult expected) { - Assertions.assertThat(GameResultCalculator.calculate(gamer1, gamer2)) + void calculate(BlackJackGameMachine blackJackGameMachine1, BlackJackGameMachine blackJackGameMachine2, + GameResult expected) { + Assertions.assertThat(GameResultCalculator.calculate(blackJackGameMachine1, blackJackGameMachine2)) .isEqualTo(expected); } } diff --git a/src/test/java/domain/blackjack/GamerTest.java b/src/test/java/domain/blackjack/GamerTest.java index 10e4eaa6c76..3bd855e72ed 100644 --- a/src/test/java/domain/blackjack/GamerTest.java +++ b/src/test/java/domain/blackjack/GamerTest.java @@ -7,9 +7,7 @@ import static domain.card.Card.ACE_HEART; import static domain.card.Card.EIGHT_HEART; import static domain.card.Card.JACK_HEART; -import static domain.card.Card.JACK_SPADE; import static domain.card.Card.QUEEN_HEART; -import static domain.card.Card.SEVEN_HEART; import static domain.card.Card.TWO_HEART; import static domain.card.FirstCardSelectStrategy.FIRST_CARD_SELECT_STRATEGY; @@ -30,81 +28,44 @@ public static Stream isDeadParameters() { ); } - public static Stream validatePlayerHasNextDrawChanceParameters() { - return Stream.of( - Arguments.of(TWO_HEART, false), Arguments.of(ACE_HEART, true) - ); - } - public static Stream getSummationCardPointParameters() { return Stream.of( - Arguments.of(new Gamer("게이머1", ONLY_SEVEN_HEART), new SummationCardPoint(7)), - Arguments.of(new Gamer("게이머1", WIN_CARDS_WITH_ACE), new SummationCardPoint(21)), - Arguments.of(new Gamer("게이머1", WIN_CARDS_WITHOUT_ACE), new SummationCardPoint(21)), - Arguments.of(new Gamer("게이머1", DEAD_CARDS), new SummationCardPoint(22)) + Arguments.of(new BlackJackGameMachine(ONLY_SEVEN_HEART), new SummationCardPoint(7)), + Arguments.of(new BlackJackGameMachine(WIN_CARDS_WITH_ACE), new SummationCardPoint(21)), + Arguments.of(new BlackJackGameMachine(WIN_CARDS_WITHOUT_ACE), new SummationCardPoint(21)), + Arguments.of(new BlackJackGameMachine(DEAD_CARDS), new SummationCardPoint(22)) ); } @Test @DisplayName("게임 참가자가 카드를 뽑았을 때 점수가 올바르게 계산되는지 검증") void draw() { - Gamer gamer = new Gamer("robin", HoldingCards.of()); + BlackJackGameMachine blackJackGameMachine = new BlackJackGameMachine(HoldingCards.of()); Deck deck = Deck.of(JACK_HEART, EIGHT_HEART); - gamer.draw(deck, FIRST_CARD_SELECT_STRATEGY, new PlayerCardDrawCondition(gamer)); + blackJackGameMachine.draw(deck, FIRST_CARD_SELECT_STRATEGY, new PlayerCardDrawCondition(blackJackGameMachine)); - SummationCardPoint actual = gamer.getSummationCardPoint(); + SummationCardPoint actual = blackJackGameMachine.getSummationCardPoint(); SummationCardPoint expected = new SummationCardPoint(10); Assertions.assertThat(actual) .isEqualTo(expected); } - @Test - @DisplayName("플레이어는 총합이 21이 넘으면 카드를 뽑을 수 없는지 검증") - void validateDrawLimit() { - Gamer gamer = new Gamer("robin", HoldingCards.of(JACK_HEART, EIGHT_HEART, JACK_SPADE)); - Deck deck = Deck.of(TWO_HEART); - DrawResult drawResult = gamer.draw(deck, FIRST_CARD_SELECT_STRATEGY, new PlayerCardDrawCondition(gamer)); - Assertions.assertThat(drawResult.getFailCause()) - .isEqualTo("카드를 더이상 뽑을 수 없습니다."); - } - - @Test - @DisplayName("딜러는 총합이 16이 넘으면 카드를 뽑을 수 없는지 검증") - void validateDealerDrawLimit() { - Gamer gamer = new Gamer("robin", HoldingCards.of(JACK_HEART, SEVEN_HEART)); - Deck deck = Deck.of(TWO_HEART); - - DrawResult drawResult = gamer.draw(deck, FIRST_CARD_SELECT_STRATEGY, new DealerCardDrawCondition(gamer)); - Assertions.assertThat(drawResult.getFailCause()) - .isEqualTo("카드를 더이상 뽑을 수 없습니다."); - } - @ParameterizedTest @MethodSource("isDeadParameters") - @DisplayName("게이머의 점수가 21이 넘으면 죽었다고 판단하는지 검증") - void isDead(Card additionalCard, boolean expected) { - Gamer gamer = new Gamer("robin", HoldingCards.of(JACK_HEART, QUEEN_HEART, additionalCard)); + @DisplayName("게임 참가자의 점수가 21이 넘으면 죽었다고 판단하는지 검증") + void isBust(Card additionalCard, boolean expected) { + BlackJackGameMachine blackJackGameMachine = new BlackJackGameMachine( + HoldingCards.of(JACK_HEART, QUEEN_HEART, additionalCard)); - Assertions.assertThat(gamer.isDead()).isEqualTo(expected); - } - - @ParameterizedTest - @MethodSource("validatePlayerHasNextDrawChanceParameters") - @DisplayName("플레이어의 다음 드로우 기회 유무를 제대로 판단하는지 검증") - void validatePlayerHasNextDrawChance(Card cardInDeck, boolean expected) { - Gamer gamer = new Gamer("robin", HoldingCards.of(JACK_HEART, QUEEN_HEART)); - DrawResult drawResult = gamer.draw(Deck.of(cardInDeck), FIRST_CARD_SELECT_STRATEGY, - new PlayerCardDrawCondition(gamer)); - Assertions.assertThat(drawResult.hasNextChance()) - .isEqualTo(expected); + Assertions.assertThat(blackJackGameMachine.isBust()).isEqualTo(expected); } @ParameterizedTest @MethodSource("getSummationCardPointParameters") - @DisplayName("게이머의 점수가 잘 계산되는지 검증") - void getSummationCardPoint(Gamer gamer, SummationCardPoint expected) { - SummationCardPoint summationCardPoint = gamer.getSummationCardPoint(); + @DisplayName("게임 참가자의 점수가 잘 계산되는지 검증") + void getSummationCardPoint(BlackJackGameMachine blackJackGameMachine, SummationCardPoint expected) { + SummationCardPoint summationCardPoint = blackJackGameMachine.getSummationCardPoint(); Assertions.assertThat(summationCardPoint) .isEqualTo(expected); } diff --git a/src/test/java/domain/blackjack/PlayerCardDrawConditionTest.java b/src/test/java/domain/blackjack/PlayerCardDrawConditionTest.java index b382256da3b..64eed5fb865 100644 --- a/src/test/java/domain/blackjack/PlayerCardDrawConditionTest.java +++ b/src/test/java/domain/blackjack/PlayerCardDrawConditionTest.java @@ -26,7 +26,7 @@ public static Stream canDrawParameters() { @MethodSource("canDrawParameters") @DisplayName("플레이어의 드로우 여부가 제대로 판단되는지 검증") void canDraw(HoldingCards holdingCards, boolean expected) { - Gamer player = new Gamer("플레이어", holdingCards); + BlackJackGameMachine player = new BlackJackGameMachine(holdingCards); Assertions.assertThat(new PlayerCardDrawCondition(player).canDraw()) .isEqualTo(expected); } diff --git a/src/test/java/domain/blackjack/PlayerTest.java b/src/test/java/domain/blackjack/PlayerTest.java new file mode 100644 index 00000000000..1b194bb7900 --- /dev/null +++ b/src/test/java/domain/blackjack/PlayerTest.java @@ -0,0 +1,51 @@ +package domain.blackjack; + +import static domain.card.Card.ACE_HEART; +import static domain.card.Card.EIGHT_HEART; +import static domain.card.Card.JACK_HEART; +import static domain.card.Card.JACK_SPADE; +import static domain.card.Card.QUEEN_HEART; +import static domain.card.Card.TWO_HEART; +import static domain.card.FirstCardSelectStrategy.FIRST_CARD_SELECT_STRATEGY; + +import domain.card.Card; +import domain.card.Deck; +import java.util.stream.Stream; +import org.assertj.core.api.Assertions; +import org.junit.jupiter.api.DisplayName; +import org.junit.jupiter.api.Test; +import org.junit.jupiter.params.ParameterizedTest; +import org.junit.jupiter.params.provider.Arguments; +import org.junit.jupiter.params.provider.MethodSource; + +class PlayerTest { + + static Stream validatePlayerHasNextDrawChanceParameters() { + return Stream.of( + Arguments.of(TWO_HEART, false), Arguments.of(ACE_HEART, true) + ); + } + + @Test + @DisplayName("플레이어는 총합이 21이 넘으면 카드를 뽑을 수 없는지 검증") + void validateDrawLimit() { + BlackJackGameMachine blackJackGameMachine = new BlackJackGameMachine( + HoldingCards.of(JACK_HEART, EIGHT_HEART, JACK_SPADE)); + Deck deck = Deck.of(TWO_HEART); + DrawResult drawResult = blackJackGameMachine.draw(deck, FIRST_CARD_SELECT_STRATEGY, new PlayerCardDrawCondition( + blackJackGameMachine)); + Assertions.assertThat(drawResult.getFailCause()) + .isEqualTo("카드를 더이상 뽑을 수 없습니다."); + } + + @ParameterizedTest + @MethodSource("validatePlayerHasNextDrawChanceParameters") + @DisplayName("플레이어의 다음 드로우 기회 유무를 제대로 판단하는지 검증") + void validatePlayerHasNextDrawChance(Card cardInDeck, boolean expected) { + BlackJackGameMachine blackJackGameMachine = new BlackJackGameMachine(HoldingCards.of(JACK_HEART, QUEEN_HEART)); + DrawResult drawResult = blackJackGameMachine.draw(Deck.of(cardInDeck), FIRST_CARD_SELECT_STRATEGY, + new PlayerCardDrawCondition(blackJackGameMachine)); + Assertions.assertThat(drawResult.hasNextChance()) + .isEqualTo(expected); + } +} From b47d4a9e466b42a1a1a9aa9ee982534999f7b18c Mon Sep 17 00:00:00 2001 From: robinjoon Date: Mon, 11 Mar 2024 21:03:57 +0900 Subject: [PATCH 46/56] =?UTF-8?q?refactor:=20=EB=94=9C=EB=9F=AC=EC=9D=98?= =?UTF-8?q?=20=EC=B9=B4=EB=93=9C=20=ED=95=98=EB=82=98=20=EC=88=A8=EA=B8=B0?= =?UTF-8?q?=EB=8A=94=20=EA=B8=B0=EB=8A=A5=20Dealer=EB=A1=9C=20=EC=9D=B4?= =?UTF-8?q?=EA=B4=80?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- src/main/java/controller/BlackjackController.java | 4 +--- src/main/java/domain/blackjack/Dealer.java | 9 +++++++++ src/test/java/domain/blackjack/DealerTest.java | 14 ++++++++++++++ 3 files changed, 24 insertions(+), 3 deletions(-) diff --git a/src/main/java/controller/BlackjackController.java b/src/main/java/controller/BlackjackController.java index 96f92d5779c..e99a365b989 100644 --- a/src/main/java/controller/BlackjackController.java +++ b/src/main/java/controller/BlackjackController.java @@ -13,7 +13,6 @@ import dto.DealerGameResultDTO; import dto.GamerDTO; import dto.PlayerGameResultDTO; -import java.util.ArrayList; import java.util.List; import java.util.Map; import java.util.stream.Collectors; @@ -68,8 +67,7 @@ private void printDealerAndPlayers() { } private static void printDealer(Dealer dealer) { - List rawHoldingCards = new ArrayList<>(dealer.getRawHoldingCards()); - rawHoldingCards.remove(0); + List rawHoldingCards = dealer.getRawHoldingCardsWithoutFirstCard(); GamerDTO gamerDTO = new GamerDTO(dealer.getRawName(), rawHoldingCards, dealer.getRawSummationCardPoint()); GamerOutputView.printWithoutSummationCardPoint(gamerDTO); diff --git a/src/main/java/domain/blackjack/Dealer.java b/src/main/java/domain/blackjack/Dealer.java index 0c724e112d8..fd955220d24 100644 --- a/src/main/java/domain/blackjack/Dealer.java +++ b/src/main/java/domain/blackjack/Dealer.java @@ -1,7 +1,10 @@ package domain.blackjack; +import domain.card.Card; import domain.card.CardSelectStrategy; import domain.card.Deck; +import java.util.ArrayList; +import java.util.List; public class Dealer extends Gamer { @@ -22,4 +25,10 @@ public DrawResult draw(Deck deck, CardSelectStrategy cardSelectStrategy) { public String getRawName() { return "딜러"; } + + public List getRawHoldingCardsWithoutFirstCard() { + List rawHoldingCards = new ArrayList<>(blackJackGameMachine.getRawHoldingCards()); + rawHoldingCards.remove(0); + return List.copyOf(rawHoldingCards); + } } diff --git a/src/test/java/domain/blackjack/DealerTest.java b/src/test/java/domain/blackjack/DealerTest.java index 3b60bdb27bb..2e7542621bd 100644 --- a/src/test/java/domain/blackjack/DealerTest.java +++ b/src/test/java/domain/blackjack/DealerTest.java @@ -10,6 +10,7 @@ import domain.card.Card; import domain.card.Deck; +import java.util.List; import java.util.stream.Stream; import org.assertj.core.api.Assertions; import org.junit.jupiter.api.DisplayName; @@ -51,4 +52,17 @@ void validatePlayerHasNextDrawChance(Card cardInHand, boolean expected) { Assertions.assertThat(drawResult.hasNextChance()) .isEqualTo(expected); } + + @Test + @DisplayName("카드 하나가 숨겨진 상태로 조회되는지 검증") + void getRawHoldingCardsWithoutFirstCard() { + BlackJackGameMachine blackJackGameMachine = new BlackJackGameMachine( + HoldingCards.of(FIVE_HEART, QUEEN_HEART)); + Dealer dealer = new Dealer(blackJackGameMachine); + List rawHoldingCardsWithoutFirstCard = dealer.getRawHoldingCardsWithoutFirstCard(); + Assertions.assertThat(rawHoldingCardsWithoutFirstCard) + .containsExactly(QUEEN_HEART); + Assertions.assertThat(dealer.getRawHoldingCards()) + .containsExactly(FIVE_HEART, QUEEN_HEART); + } } From 92ec9826f3f3d9d89f7700c9245f74da7721b572 Mon Sep 17 00:00:00 2001 From: robinjoon Date: Tue, 12 Mar 2024 16:23:42 +0900 Subject: [PATCH 47/56] =?UTF-8?q?refactor:=20Main,=20Controller,=20View=20?= =?UTF-8?q?=EC=97=AD=ED=95=A0=20=EB=AA=85=ED=99=95=ED=95=98=EA=B2=8C=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 --- src/main/java/Main.java | 13 +--- .../java/controller/BlackjackController.java | 67 +++++++++---------- src/main/java/view/Console.java | 4 ++ src/main/java/view/OutputView.java | 17 ++++- src/main/java/view/YesOrNoInputView.java | 4 +- 5 files changed, 57 insertions(+), 48 deletions(-) diff --git a/src/main/java/Main.java b/src/main/java/Main.java index 9ae42972bfb..5433dfb075e 100644 --- a/src/main/java/Main.java +++ b/src/main/java/Main.java @@ -1,20 +1,9 @@ import controller.BlackjackController; -import domain.blackjack.Dealer; -import domain.blackjack.HoldingCards; -import domain.blackjack.Player; import domain.card.Deck; -import java.util.List; -import view.NameInputView; -import view.OutputView; public class Main { public static void main(String[] args) { - Dealer dealer = Dealer.of(HoldingCards.of()); - OutputView.print("게임에 참여할 사람의 이름을 입력하세요.(쉼표 기준으로 분리)"); - List players = NameInputView.getNames().stream() - .map(name -> Player.from(name, HoldingCards.of())) - .toList(); - BlackjackController blackjackController = new BlackjackController(dealer, players); + BlackjackController blackjackController = new BlackjackController(); blackjackController.startBlackjackGame(Deck.fullDeck()); } } diff --git a/src/main/java/controller/BlackjackController.java b/src/main/java/controller/BlackjackController.java index e99a365b989..9a32dd36f0f 100644 --- a/src/main/java/controller/BlackjackController.java +++ b/src/main/java/controller/BlackjackController.java @@ -6,6 +6,7 @@ import domain.blackjack.Dealer; import domain.blackjack.DrawResult; import domain.blackjack.GameResult; +import domain.blackjack.HoldingCards; import domain.blackjack.Player; import domain.card.Card; import domain.card.Deck; @@ -16,44 +17,44 @@ import java.util.List; import java.util.Map; import java.util.stream.Collectors; +import java.util.stream.IntStream; +import view.NameInputView; import view.OutputView; import view.YesOrNoInputView; import view.gamer.GamerOutputView; import view.gameresult.GameResultOutputView; public class BlackjackController { - private final Dealer dealer; - private final List players; - - public BlackjackController(Dealer dealer, List players) { - this.dealer = dealer; - this.players = players; - } public void startBlackjackGame(Deck deck) { - initDealerAndPlayers(deck); - printDealerAndPlayers(); + final Dealer dealer = Dealer.of(HoldingCards.of()); + OutputView.printStartGame(); + final List players = NameInputView.getNames().stream() + .map(name -> Player.from(name, HoldingCards.of())) + .toList(); + initDealerAndPlayers(deck, dealer, players); + printDealerAndPlayers(dealer, players); - playersTryDraw(deck); - dealerTryDraw(deck); + playersTryDraw(deck, players); + dealerTryDraw(deck, dealer); - printDealerWithPoint(); - printPlayersWithPoint(); + printDealerWithPoint(dealer); + printPlayersWithPoint(players); - printDealerGameResult(); - printPlayersGameResult(); + printDealerGameResult(dealer, players); + printPlayersGameResult(dealer, players); } - private void initDealerAndPlayers(Deck deck) { - for (int index = 0; index < 2; index++) { - dealerDraw(deck); + private void initDealerAndPlayers(Deck deck, Dealer dealer, List players) { + final int initialDrawCount = 2; + IntStream.range(0, initialDrawCount).forEach(index -> { + dealerDraw(deck, dealer); players.forEach(player -> playerDraw(deck, player)); - } - String namesOutput = players.stream().map(Player::getRawName).collect(Collectors.joining(", ")); - OutputView.print("딜러와 %s에게 2장을 나누었습니다.".formatted(namesOutput)); + }); + OutputView.printInitGameDoneMessage(players.stream().map(Player::getRawName).toList()); } - private DrawResult dealerDraw(Deck deck) { + private DrawResult dealerDraw(Deck deck, Dealer dealer) { return dealer.draw(deck, new RandomCardSelectStrategy()); } @@ -61,7 +62,7 @@ private DrawResult playerDraw(Deck deck, Player player) { return player.draw(deck, new RandomCardSelectStrategy()); } - private void printDealerAndPlayers() { + private void printDealerAndPlayers(Dealer dealer, List players) { printDealer(dealer); players.forEach(BlackjackController::printPlayer); } @@ -79,7 +80,7 @@ private static void printPlayer(Player player) { GamerOutputView.printWithoutSummationCardPoint(gamerDTO); } - private void playersTryDraw(Deck deck) { + private void playersTryDraw(Deck deck, List players) { players.forEach(player -> playerTryDraw(deck, player)); } @@ -91,8 +92,7 @@ private void playerTryDraw(Deck deck, Player player) { } private boolean playerTryDrawOnce(Deck deck, Player player) { - OutputView.print("%s은(는) 한장의 카드를 더 받겠습니까?(예는 y, 아니오는 n)".formatted(player.getRawName())); - boolean needToDraw = YesOrNoInputView.getYNAsBoolean(); + boolean needToDraw = YesOrNoInputView.getYNAsBoolean(player.getRawName()); DrawResult drawResult = null; if (needToDraw) { drawResult = playerDraw(deck, player); @@ -104,21 +104,20 @@ private boolean playerTryDrawOnce(Deck deck, Player player) { return drawResult.hasNextChance(); } - - private void dealerTryDraw(Deck deck) { - DrawResult drawResult = dealerDraw(deck); + private void dealerTryDraw(Deck deck, Dealer dealer) { + DrawResult drawResult = dealerDraw(deck, dealer); if (drawResult.isSuccess()) { - OutputView.print("딜러는 16이하라 한장의 카드를 더 받았습니다.\n"); + OutputView.printDealerDrawDone(); } } - private void printDealerWithPoint() { + private void printDealerWithPoint(Dealer dealer) { GamerDTO dealerDTO = new GamerDTO(dealer.getRawName(), dealer.getRawHoldingCards(), dealer.getRawSummationCardPoint()); GamerOutputView.print(dealerDTO); } - private void printPlayersWithPoint() { + private void printPlayersWithPoint(List players) { for (Player player : players) { GamerDTO playerDTO = new GamerDTO(player.getRawName(), player.getRawHoldingCards(), player.getRawSummationCardPoint()); @@ -126,7 +125,7 @@ private void printPlayersWithPoint() { } } - private void printDealerGameResult() { + private void printDealerGameResult(Dealer dealer, List players) { Map dealerGameResultCounts = players.stream() .collect(Collectors.groupingBy(player -> calculate(dealer.getGamer(), player.getGamer()), summingInt(value -> 1))); @@ -134,7 +133,7 @@ private void printDealerGameResult() { GameResultOutputView.print(dealerGameResultDTO); } - private void printPlayersGameResult() { + private void printPlayersGameResult(Dealer dealer, List players) { List playerGameResultDTOS = players.stream() .map(player -> new PlayerGameResultDTO(player.getRawName(), calculate(player.getGamer(), dealer.getGamer()))) diff --git a/src/main/java/view/Console.java b/src/main/java/view/Console.java index 72e8d4d8633..e263b50b030 100644 --- a/src/main/java/view/Console.java +++ b/src/main/java/view/Console.java @@ -15,4 +15,8 @@ public static String getInputFromConsole() { } return input; } + + public static void print(String output) { + System.out.print(output); + } } diff --git a/src/main/java/view/OutputView.java b/src/main/java/view/OutputView.java index df2236b1287..82705be7d76 100644 --- a/src/main/java/view/OutputView.java +++ b/src/main/java/view/OutputView.java @@ -1,8 +1,23 @@ package view; +import java.util.List; + public class OutputView { - public static void print(String output) { + public static void printStartGame() { + print("게임에 참여할 사람의 이름을 입력하세요.(쉼표 기준으로 분리)"); + } + + private static void print(String output) { System.out.println(output); } + + public static void printInitGameDoneMessage(List playerRawNames) { + String namesOutput = String.join(", ", playerRawNames); + print("딜러와 %s에게 2장을 나누었습니다.".formatted(namesOutput)); + } + + public static void printDealerDrawDone() { + print("딜러는 16이하라 한장의 카드를 더 받았습니다.\n"); + } } diff --git a/src/main/java/view/YesOrNoInputView.java b/src/main/java/view/YesOrNoInputView.java index 55de0cc8fff..ea8275bee73 100644 --- a/src/main/java/view/YesOrNoInputView.java +++ b/src/main/java/view/YesOrNoInputView.java @@ -1,7 +1,9 @@ package view; public class YesOrNoInputView { - public static Boolean getYNAsBoolean() { + public static Boolean getYNAsBoolean(String playerName) { + String inputGuideOutput = "%s은(는) 한장의 카드를 더 받겠습니까?(예는 y, 아니오는 n)%n".formatted(playerName); + Console.print(inputGuideOutput); String input = Console.getInputFromConsole(); if (input.equals("y")) { return true; From 839110d633feb70c972a61072d3ea34c7b2a5d7d Mon Sep 17 00:00:00 2001 From: robinjoon Date: Tue, 12 Mar 2024 16:34:52 +0900 Subject: [PATCH 48/56] =?UTF-8?q?refactor:=20Dealer=20=EC=97=90=EC=84=9C?= =?UTF-8?q?=20=EC=9D=B4=EB=A6=84=20=EC=A0=9C=EA=B1=B0,=20View=EB=A1=9C=20?= =?UTF-8?q?=EC=9D=B4=EA=B4=80?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../java/controller/BlackjackController.java | 16 ++++---- src/main/java/domain/blackjack/Dealer.java | 5 --- src/main/java/domain/blackjack/Gamer.java | 2 - src/main/java/domain/blackjack/Player.java | 1 - src/main/java/dto/DealerDTO.java | 22 +++++++++++ .../dto/{GamerDTO.java => PlayerDTO.java} | 4 +- src/main/java/view/gamer/GamerOutputView.java | 38 ++++++++++++++----- 7 files changed, 61 insertions(+), 27 deletions(-) create mode 100644 src/main/java/dto/DealerDTO.java rename src/main/java/dto/{GamerDTO.java => PlayerDTO.java} (82%) diff --git a/src/main/java/controller/BlackjackController.java b/src/main/java/controller/BlackjackController.java index 9a32dd36f0f..c1a1fdf3103 100644 --- a/src/main/java/controller/BlackjackController.java +++ b/src/main/java/controller/BlackjackController.java @@ -11,8 +11,9 @@ import domain.card.Card; import domain.card.Deck; import domain.card.RandomCardSelectStrategy; +import dto.DealerDTO; import dto.DealerGameResultDTO; -import dto.GamerDTO; +import dto.PlayerDTO; import dto.PlayerGameResultDTO; import java.util.List; import java.util.Map; @@ -69,15 +70,14 @@ private void printDealerAndPlayers(Dealer dealer, List players) { private static void printDealer(Dealer dealer) { List rawHoldingCards = dealer.getRawHoldingCardsWithoutFirstCard(); - GamerDTO gamerDTO = new GamerDTO(dealer.getRawName(), rawHoldingCards, - dealer.getRawSummationCardPoint()); - GamerOutputView.printWithoutSummationCardPoint(gamerDTO); + DealerDTO dealerDTO = new DealerDTO(rawHoldingCards, dealer.getRawSummationCardPoint()); + GamerOutputView.printWithoutSummationCardPoint(dealerDTO); } private static void printPlayer(Player player) { - GamerDTO gamerDTO = new GamerDTO(player.getRawName(), player.getRawHoldingCards(), + PlayerDTO playerDTO = new PlayerDTO(player.getRawName(), player.getRawHoldingCards(), player.getRawSummationCardPoint()); - GamerOutputView.printWithoutSummationCardPoint(gamerDTO); + GamerOutputView.printWithoutSummationCardPoint(playerDTO); } private void playersTryDraw(Deck deck, List players) { @@ -112,14 +112,14 @@ private void dealerTryDraw(Deck deck, Dealer dealer) { } private void printDealerWithPoint(Dealer dealer) { - GamerDTO dealerDTO = new GamerDTO(dealer.getRawName(), dealer.getRawHoldingCards(), + DealerDTO dealerDTO = new DealerDTO(dealer.getRawHoldingCards(), dealer.getRawSummationCardPoint()); GamerOutputView.print(dealerDTO); } private void printPlayersWithPoint(List players) { for (Player player : players) { - GamerDTO playerDTO = new GamerDTO(player.getRawName(), player.getRawHoldingCards(), + PlayerDTO playerDTO = new PlayerDTO(player.getRawName(), player.getRawHoldingCards(), player.getRawSummationCardPoint()); GamerOutputView.print(playerDTO); } diff --git a/src/main/java/domain/blackjack/Dealer.java b/src/main/java/domain/blackjack/Dealer.java index fd955220d24..c209cd54eb6 100644 --- a/src/main/java/domain/blackjack/Dealer.java +++ b/src/main/java/domain/blackjack/Dealer.java @@ -21,11 +21,6 @@ public DrawResult draw(Deck deck, CardSelectStrategy cardSelectStrategy) { return blackJackGameMachine.draw(deck, cardSelectStrategy, new DealerCardDrawCondition(blackJackGameMachine)); } - @Override - public String getRawName() { - return "딜러"; - } - public List getRawHoldingCardsWithoutFirstCard() { List rawHoldingCards = new ArrayList<>(blackJackGameMachine.getRawHoldingCards()); rawHoldingCards.remove(0); diff --git a/src/main/java/domain/blackjack/Gamer.java b/src/main/java/domain/blackjack/Gamer.java index 48a0ce1021d..a3b9f605cfd 100644 --- a/src/main/java/domain/blackjack/Gamer.java +++ b/src/main/java/domain/blackjack/Gamer.java @@ -25,6 +25,4 @@ public final int getRawSummationCardPoint() { public final BlackJackGameMachine getGamer() { return blackJackGameMachine; } - - public abstract String getRawName(); } diff --git a/src/main/java/domain/blackjack/Player.java b/src/main/java/domain/blackjack/Player.java index a411e7b9c18..ba45411b599 100644 --- a/src/main/java/domain/blackjack/Player.java +++ b/src/main/java/domain/blackjack/Player.java @@ -20,7 +20,6 @@ public DrawResult draw(Deck deck, CardSelectStrategy cardSelectStrategy) { return blackJackGameMachine.draw(deck, cardSelectStrategy, new PlayerCardDrawCondition(blackJackGameMachine)); } - @Override public String getRawName() { return name; } diff --git a/src/main/java/dto/DealerDTO.java b/src/main/java/dto/DealerDTO.java new file mode 100644 index 00000000000..e45ffd5d75d --- /dev/null +++ b/src/main/java/dto/DealerDTO.java @@ -0,0 +1,22 @@ +package dto; + +import domain.card.Card; +import java.util.List; + +public class DealerDTO { + private final List holdingCards; + private final int summationCardPoint; + + public DealerDTO(List holdingCards, int summationCardPoint) { + this.holdingCards = holdingCards; + this.summationCardPoint = summationCardPoint; + } + + public List getHoldingCards() { + return holdingCards; + } + + public int getSummationCardPoint() { + return summationCardPoint; + } +} diff --git a/src/main/java/dto/GamerDTO.java b/src/main/java/dto/PlayerDTO.java similarity index 82% rename from src/main/java/dto/GamerDTO.java rename to src/main/java/dto/PlayerDTO.java index 143155a32ca..d30b4a43cc9 100644 --- a/src/main/java/dto/GamerDTO.java +++ b/src/main/java/dto/PlayerDTO.java @@ -3,12 +3,12 @@ import domain.card.Card; import java.util.List; -public class GamerDTO { +public class PlayerDTO { private final String name; private final List holdingCards; private final int summationCardPoint; - public GamerDTO(String name, List holdingCards, int summationCardPoint) { + public PlayerDTO(String name, List holdingCards, int summationCardPoint) { this.name = name; this.holdingCards = holdingCards; this.summationCardPoint = summationCardPoint; diff --git a/src/main/java/view/gamer/GamerOutputView.java b/src/main/java/view/gamer/GamerOutputView.java index 150e603e4af..68eef16f4e2 100644 --- a/src/main/java/view/gamer/GamerOutputView.java +++ b/src/main/java/view/gamer/GamerOutputView.java @@ -1,27 +1,43 @@ package view.gamer; import domain.card.Card; -import dto.GamerDTO; +import dto.DealerDTO; +import dto.PlayerDTO; import java.util.List; import java.util.stream.Collectors; public class GamerOutputView { - public static void print(GamerDTO gamerDTO) { - String outputWithoutSummationCardPoint = generateOutputWithoutSummationCardPoint(gamerDTO); - String summationCardPointOutput = "결과: %d".formatted(gamerDTO.getSummationCardPoint()); + public static void print(PlayerDTO playerDTO) { + String outputWithoutSummationCardPoint = generateOutputWithoutSummationCardPoint(playerDTO); + String summationCardPointOutput = "결과: %d".formatted(playerDTO.getSummationCardPoint()); System.out.printf("%s - %s%n", outputWithoutSummationCardPoint, summationCardPointOutput); } + private static String generateOutputWithoutSummationCardPoint(PlayerDTO playerDTO) { + String name = playerDTO.getName(); + List cards = playerDTO.getHoldingCards(); + String nameOutput = name + "카드"; + String cardsOutput = cards.stream() + .map(CardOutputGenerator::generate) + .collect(Collectors.joining(", ")); + return "%s: %s".formatted(nameOutput, cardsOutput); + } - public static void printWithoutSummationCardPoint(GamerDTO gamerDTO) { - String outputWithoutSummationCardPoint = generateOutputWithoutSummationCardPoint(gamerDTO); + public static void printWithoutSummationCardPoint(PlayerDTO playerDTO) { + String outputWithoutSummationCardPoint = generateOutputWithoutSummationCardPoint(playerDTO); System.out.println(outputWithoutSummationCardPoint); } - private static String generateOutputWithoutSummationCardPoint(GamerDTO gamerDTO) { - String name = gamerDTO.getName(); - List cards = gamerDTO.getHoldingCards(); + public static void print(DealerDTO dealerDTO) { + String outputWithoutSummationCardPoint = generateOutputWithoutSummationCardPoint(dealerDTO); + String summationCardPointOutput = "결과: %d".formatted(dealerDTO.getSummationCardPoint()); + System.out.printf("%s - %s%n", outputWithoutSummationCardPoint, summationCardPointOutput); + } + + private static String generateOutputWithoutSummationCardPoint(DealerDTO dealerDTO) { + String name = "딜러"; + List cards = dealerDTO.getHoldingCards(); String nameOutput = name + "카드"; String cardsOutput = cards.stream() .map(CardOutputGenerator::generate) @@ -29,4 +45,8 @@ private static String generateOutputWithoutSummationCardPoint(GamerDTO gamerDTO) return "%s: %s".formatted(nameOutput, cardsOutput); } + public static void printWithoutSummationCardPoint(DealerDTO dealerDTO) { + String outputWithoutSummationCardPoint = generateOutputWithoutSummationCardPoint(dealerDTO); + System.out.println(outputWithoutSummationCardPoint); + } } From bea1e52cbcec5cdd9a6e6e9fce4bee0f6589ce44 Mon Sep 17 00:00:00 2001 From: robinjoon Date: Tue, 12 Mar 2024 16:37:35 +0900 Subject: [PATCH 49/56] =?UTF-8?q?refactor:=20GamerOutputView=EB=A5=BC=20De?= =?UTF-8?q?alerOutputView=20=EC=99=80=20PlayerOutputView=EB=A1=9C=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 --- .../java/controller/BlackjackController.java | 11 +++---- .../java/view/gamer/DealerOutputView.java | 29 +++++++++++++++++++ ...rOutputView.java => PlayerOutputView.java} | 24 +-------------- 3 files changed, 36 insertions(+), 28 deletions(-) create mode 100644 src/main/java/view/gamer/DealerOutputView.java rename src/main/java/view/gamer/{GamerOutputView.java => PlayerOutputView.java} (51%) diff --git a/src/main/java/controller/BlackjackController.java b/src/main/java/controller/BlackjackController.java index c1a1fdf3103..04b235cfe72 100644 --- a/src/main/java/controller/BlackjackController.java +++ b/src/main/java/controller/BlackjackController.java @@ -22,7 +22,8 @@ import view.NameInputView; import view.OutputView; import view.YesOrNoInputView; -import view.gamer.GamerOutputView; +import view.gamer.DealerOutputView; +import view.gamer.PlayerOutputView; import view.gameresult.GameResultOutputView; public class BlackjackController { @@ -71,13 +72,13 @@ private void printDealerAndPlayers(Dealer dealer, List players) { private static void printDealer(Dealer dealer) { List rawHoldingCards = dealer.getRawHoldingCardsWithoutFirstCard(); DealerDTO dealerDTO = new DealerDTO(rawHoldingCards, dealer.getRawSummationCardPoint()); - GamerOutputView.printWithoutSummationCardPoint(dealerDTO); + DealerOutputView.printWithoutSummationCardPoint(dealerDTO); } private static void printPlayer(Player player) { PlayerDTO playerDTO = new PlayerDTO(player.getRawName(), player.getRawHoldingCards(), player.getRawSummationCardPoint()); - GamerOutputView.printWithoutSummationCardPoint(playerDTO); + PlayerOutputView.printWithoutSummationCardPoint(playerDTO); } private void playersTryDraw(Deck deck, List players) { @@ -114,14 +115,14 @@ private void dealerTryDraw(Deck deck, Dealer dealer) { private void printDealerWithPoint(Dealer dealer) { DealerDTO dealerDTO = new DealerDTO(dealer.getRawHoldingCards(), dealer.getRawSummationCardPoint()); - GamerOutputView.print(dealerDTO); + DealerOutputView.print(dealerDTO); } private void printPlayersWithPoint(List players) { for (Player player : players) { PlayerDTO playerDTO = new PlayerDTO(player.getRawName(), player.getRawHoldingCards(), player.getRawSummationCardPoint()); - GamerOutputView.print(playerDTO); + PlayerOutputView.print(playerDTO); } } diff --git a/src/main/java/view/gamer/DealerOutputView.java b/src/main/java/view/gamer/DealerOutputView.java new file mode 100644 index 00000000000..6c4cff09ca1 --- /dev/null +++ b/src/main/java/view/gamer/DealerOutputView.java @@ -0,0 +1,29 @@ +package view.gamer; + +import domain.card.Card; +import dto.DealerDTO; +import java.util.List; +import java.util.stream.Collectors; + +public class DealerOutputView { + public static void print(DealerDTO dealerDTO) { + String outputWithoutSummationCardPoint = generateOutputWithoutSummationCardPoint(dealerDTO); + String summationCardPointOutput = "결과: %d".formatted(dealerDTO.getSummationCardPoint()); + System.out.printf("%s - %s%n", outputWithoutSummationCardPoint, summationCardPointOutput); + } + + private static String generateOutputWithoutSummationCardPoint(DealerDTO dealerDTO) { + String name = "딜러"; + List cards = dealerDTO.getHoldingCards(); + String nameOutput = name + "카드"; + String cardsOutput = cards.stream() + .map(CardOutputGenerator::generate) + .collect(Collectors.joining(", ")); + return "%s: %s".formatted(nameOutput, cardsOutput); + } + + public static void printWithoutSummationCardPoint(DealerDTO dealerDTO) { + String outputWithoutSummationCardPoint = generateOutputWithoutSummationCardPoint(dealerDTO); + System.out.println(outputWithoutSummationCardPoint); + } +} diff --git a/src/main/java/view/gamer/GamerOutputView.java b/src/main/java/view/gamer/PlayerOutputView.java similarity index 51% rename from src/main/java/view/gamer/GamerOutputView.java rename to src/main/java/view/gamer/PlayerOutputView.java index 68eef16f4e2..074c335b408 100644 --- a/src/main/java/view/gamer/GamerOutputView.java +++ b/src/main/java/view/gamer/PlayerOutputView.java @@ -1,12 +1,11 @@ package view.gamer; import domain.card.Card; -import dto.DealerDTO; import dto.PlayerDTO; import java.util.List; import java.util.stream.Collectors; -public class GamerOutputView { +public class PlayerOutputView { public static void print(PlayerDTO playerDTO) { String outputWithoutSummationCardPoint = generateOutputWithoutSummationCardPoint(playerDTO); @@ -28,25 +27,4 @@ public static void printWithoutSummationCardPoint(PlayerDTO playerDTO) { String outputWithoutSummationCardPoint = generateOutputWithoutSummationCardPoint(playerDTO); System.out.println(outputWithoutSummationCardPoint); } - - public static void print(DealerDTO dealerDTO) { - String outputWithoutSummationCardPoint = generateOutputWithoutSummationCardPoint(dealerDTO); - String summationCardPointOutput = "결과: %d".formatted(dealerDTO.getSummationCardPoint()); - System.out.printf("%s - %s%n", outputWithoutSummationCardPoint, summationCardPointOutput); - } - - private static String generateOutputWithoutSummationCardPoint(DealerDTO dealerDTO) { - String name = "딜러"; - List cards = dealerDTO.getHoldingCards(); - String nameOutput = name + "카드"; - String cardsOutput = cards.stream() - .map(CardOutputGenerator::generate) - .collect(Collectors.joining(", ")); - return "%s: %s".formatted(nameOutput, cardsOutput); - } - - public static void printWithoutSummationCardPoint(DealerDTO dealerDTO) { - String outputWithoutSummationCardPoint = generateOutputWithoutSummationCardPoint(dealerDTO); - System.out.println(outputWithoutSummationCardPoint); - } } From f7d8e732dadd075debe46c35395df56edf9d0e19 Mon Sep 17 00:00:00 2001 From: robinjoon Date: Tue, 12 Mar 2024 16:49:18 +0900 Subject: [PATCH 50/56] =?UTF-8?q?refactor:=20BlackjackController=20?= =?UTF-8?q?=EB=82=B4=EB=B6=80=20=EB=A9=94=EC=84=9C=EB=93=9C=20=EC=A0=95?= =?UTF-8?q?=EB=A6=AC?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../java/controller/BlackjackController.java | 25 +++++++++++++------ 1 file changed, 17 insertions(+), 8 deletions(-) diff --git a/src/main/java/controller/BlackjackController.java b/src/main/java/controller/BlackjackController.java index 04b235cfe72..90fc2347932 100644 --- a/src/main/java/controller/BlackjackController.java +++ b/src/main/java/controller/BlackjackController.java @@ -29,12 +29,11 @@ public class BlackjackController { public void startBlackjackGame(Deck deck) { - final Dealer dealer = Dealer.of(HoldingCards.of()); OutputView.printStartGame(); - final List players = NameInputView.getNames().stream() - .map(name -> Player.from(name, HoldingCards.of())) - .toList(); - initDealerAndPlayers(deck, dealer, players); + final Dealer dealer = generateDealer(); + final List players = generatePlayers(); + + initialDraw(deck, dealer, players); printDealerAndPlayers(dealer, players); playersTryDraw(deck, players); @@ -47,13 +46,23 @@ public void startBlackjackGame(Deck deck) { printPlayersGameResult(dealer, players); } - private void initDealerAndPlayers(Deck deck, Dealer dealer, List players) { + + private Dealer generateDealer() { + return Dealer.of(HoldingCards.of()); + } + + private List generatePlayers() { + return NameInputView.getNames().stream() + .map(name -> Player.from(name, HoldingCards.of())) + .toList(); + } + + private void initialDraw(Deck deck, Dealer dealer, List players) { final int initialDrawCount = 2; IntStream.range(0, initialDrawCount).forEach(index -> { - dealerDraw(deck, dealer); players.forEach(player -> playerDraw(deck, player)); + dealerDraw(deck, dealer); }); - OutputView.printInitGameDoneMessage(players.stream().map(Player::getRawName).toList()); } private DrawResult dealerDraw(Deck deck, Dealer dealer) { From 9e305e2910dda3ae386f124996fa0dbf60ebf28c Mon Sep 17 00:00:00 2001 From: robinjoon Date: Tue, 12 Mar 2024 17:21:17 +0900 Subject: [PATCH 51/56] =?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=EC=B6=94=EA=B0=80?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../java/controller/BlackjackController.java | 42 ++++++++----------- src/main/java/domain/blackjack/Dealer.java | 10 +++++ .../java/domain/blackjack/GameResult.java | 10 +++++ src/main/java/domain/blackjack/Gamer.java | 4 ++ src/main/java/domain/blackjack/Players.java | 29 +++++++++++++ .../view/gameresult/GameResultOutputView.java | 8 ++++ 6 files changed, 79 insertions(+), 24 deletions(-) create mode 100644 src/main/java/domain/blackjack/Players.java diff --git a/src/main/java/controller/BlackjackController.java b/src/main/java/controller/BlackjackController.java index 90fc2347932..fc837da4fce 100644 --- a/src/main/java/controller/BlackjackController.java +++ b/src/main/java/controller/BlackjackController.java @@ -1,13 +1,11 @@ package controller; -import static domain.blackjack.GameResultCalculator.calculate; -import static java.util.stream.Collectors.summingInt; - import domain.blackjack.Dealer; import domain.blackjack.DrawResult; import domain.blackjack.GameResult; import domain.blackjack.HoldingCards; import domain.blackjack.Player; +import domain.blackjack.Players; import domain.card.Card; import domain.card.Deck; import domain.card.RandomCardSelectStrategy; @@ -17,7 +15,6 @@ import dto.PlayerGameResultDTO; import java.util.List; import java.util.Map; -import java.util.stream.Collectors; import java.util.stream.IntStream; import view.NameInputView; import view.OutputView; @@ -31,7 +28,7 @@ public class BlackjackController { public void startBlackjackGame(Deck deck) { OutputView.printStartGame(); final Dealer dealer = generateDealer(); - final List players = generatePlayers(); + final Players players = generatePlayers(); initialDraw(deck, dealer, players); printDealerAndPlayers(dealer, players); @@ -51,13 +48,14 @@ private Dealer generateDealer() { return Dealer.of(HoldingCards.of()); } - private List generatePlayers() { - return NameInputView.getNames().stream() + private Players generatePlayers() { + List players = NameInputView.getNames().stream() .map(name -> Player.from(name, HoldingCards.of())) .toList(); + return new Players(players); } - private void initialDraw(Deck deck, Dealer dealer, List players) { + private void initialDraw(Deck deck, Dealer dealer, Players players) { final int initialDrawCount = 2; IntStream.range(0, initialDrawCount).forEach(index -> { players.forEach(player -> playerDraw(deck, player)); @@ -73,7 +71,7 @@ private DrawResult playerDraw(Deck deck, Player player) { return player.draw(deck, new RandomCardSelectStrategy()); } - private void printDealerAndPlayers(Dealer dealer, List players) { + private void printDealerAndPlayers(Dealer dealer, Players players) { printDealer(dealer); players.forEach(BlackjackController::printPlayer); } @@ -90,7 +88,7 @@ private static void printPlayer(Player player) { PlayerOutputView.printWithoutSummationCardPoint(playerDTO); } - private void playersTryDraw(Deck deck, List players) { + private void playersTryDraw(Deck deck, Players players) { players.forEach(player -> playerTryDraw(deck, player)); } @@ -127,29 +125,25 @@ private void printDealerWithPoint(Dealer dealer) { DealerOutputView.print(dealerDTO); } - private void printPlayersWithPoint(List players) { - for (Player player : players) { + private void printPlayersWithPoint(Players players) { + players.forEach(player -> { PlayerDTO playerDTO = new PlayerDTO(player.getRawName(), player.getRawHoldingCards(), player.getRawSummationCardPoint()); PlayerOutputView.print(playerDTO); - } + }); } - private void printDealerGameResult(Dealer dealer, List players) { - Map dealerGameResultCounts = players.stream() - .collect(Collectors.groupingBy(player -> calculate(dealer.getGamer(), player.getGamer()), - summingInt(value -> 1))); + private void printDealerGameResult(Dealer dealer, Players players) { + Map dealerGameResultCounts = dealer.calculateGameResultWithPlayers(players); DealerGameResultDTO dealerGameResultDTO = new DealerGameResultDTO(dealerGameResultCounts); GameResultOutputView.print(dealerGameResultDTO); } - private void printPlayersGameResult(Dealer dealer, List players) { - List playerGameResultDTOS = players.stream() - .map(player -> new PlayerGameResultDTO(player.getRawName(), - calculate(player.getGamer(), dealer.getGamer()))) + private void printPlayersGameResult(Dealer dealer, Players players) { + List playerGameResultDTOs = players.calculateGameResultsWithAsMap(dealer) + .entrySet().stream() + .map(entry -> new PlayerGameResultDTO(entry.getKey(), entry.getValue())) .toList(); - for (PlayerGameResultDTO playerGameResultDTO : playerGameResultDTOS) { - GameResultOutputView.print(playerGameResultDTO); - } + GameResultOutputView.print(playerGameResultDTOs); } } diff --git a/src/main/java/domain/blackjack/Dealer.java b/src/main/java/domain/blackjack/Dealer.java index c209cd54eb6..99801d4c5eb 100644 --- a/src/main/java/domain/blackjack/Dealer.java +++ b/src/main/java/domain/blackjack/Dealer.java @@ -5,6 +5,8 @@ import domain.card.Deck; import java.util.ArrayList; import java.util.List; +import java.util.Map; +import java.util.stream.Collectors; public class Dealer extends Gamer { @@ -26,4 +28,12 @@ public List getRawHoldingCardsWithoutFirstCard() { rawHoldingCards.remove(0); return List.copyOf(rawHoldingCards); } + + public Map calculateGameResultWithPlayers(Players players) { + List gameResults = players.calculateGameResultsWith(this).stream() + .map(GameResult::changeBase) + .toList(); + return gameResults.stream() + .collect(Collectors.groupingBy(gameResult -> gameResult, Collectors.summingInt(value -> 1))); + } } diff --git a/src/main/java/domain/blackjack/GameResult.java b/src/main/java/domain/blackjack/GameResult.java index 0e01f0327b4..4dd81195650 100644 --- a/src/main/java/domain/blackjack/GameResult.java +++ b/src/main/java/domain/blackjack/GameResult.java @@ -2,4 +2,14 @@ public enum GameResult { WIN, LOSE, TIE; + + public GameResult changeBase() { + if (this == WIN) { + return LOSE; + } + if (this == LOSE) { + return WIN; + } + return TIE; + } } diff --git a/src/main/java/domain/blackjack/Gamer.java b/src/main/java/domain/blackjack/Gamer.java index a3b9f605cfd..72c583991a2 100644 --- a/src/main/java/domain/blackjack/Gamer.java +++ b/src/main/java/domain/blackjack/Gamer.java @@ -25,4 +25,8 @@ public final int getRawSummationCardPoint() { public final BlackJackGameMachine getGamer() { return blackJackGameMachine; } + + public final GameResult calculateGameResult(Gamer other) { + return GameResultCalculator.calculate(blackJackGameMachine, other.blackJackGameMachine); + } } diff --git a/src/main/java/domain/blackjack/Players.java b/src/main/java/domain/blackjack/Players.java new file mode 100644 index 00000000000..32485e3a828 --- /dev/null +++ b/src/main/java/domain/blackjack/Players.java @@ -0,0 +1,29 @@ +package domain.blackjack; + +import java.util.List; +import java.util.Map; +import java.util.function.Consumer; +import java.util.stream.Collectors; + +public class Players { + private final List players; + + public Players(List players) { + this.players = players; + } + + public Map calculateGameResultsWithAsMap(Dealer dealer) { + return players.stream() + .collect(Collectors.toMap(Player::getRawName, player -> player.calculateGameResult(dealer))); + } + + List calculateGameResultsWith(Dealer dealer) { + return players.stream() + .map(player -> player.calculateGameResult(dealer)) + .toList(); + } + + public void forEach(Consumer consumer) { + players.forEach(consumer); + } +} diff --git a/src/main/java/view/gameresult/GameResultOutputView.java b/src/main/java/view/gameresult/GameResultOutputView.java index 8eeed741b0b..1e507c34028 100644 --- a/src/main/java/view/gameresult/GameResultOutputView.java +++ b/src/main/java/view/gameresult/GameResultOutputView.java @@ -2,8 +2,16 @@ import dto.DealerGameResultDTO; import dto.PlayerGameResultDTO; +import java.util.List; public class GameResultOutputView { + + public static void print(List playerGameResultDTOs) { + for (PlayerGameResultDTO playerGameResultDTO : playerGameResultDTOs) { + print(playerGameResultDTO); + } + } + public static void print(PlayerGameResultDTO playerGameResultDTO) { String gameResultOutput = PlayerGameResultOutputGenerator.generate(playerGameResultDTO); System.out.println(gameResultOutput); From 0f6df51debedefc7c7d0e6757ff169001fa56358 Mon Sep 17 00:00:00 2001 From: robinjoon Date: Tue, 12 Mar 2024 17:30:08 +0900 Subject: [PATCH 52/56] =?UTF-8?q?refactor:=20Players=20=EC=83=9D=EC=84=B1?= =?UTF-8?q?=EC=9E=90=20=EB=B3=80=EA=B2=BD?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- src/main/java/controller/BlackjackController.java | 5 +---- src/main/java/domain/blackjack/Players.java | 6 ++++-- 2 files changed, 5 insertions(+), 6 deletions(-) diff --git a/src/main/java/controller/BlackjackController.java b/src/main/java/controller/BlackjackController.java index fc837da4fce..e3051b91e79 100644 --- a/src/main/java/controller/BlackjackController.java +++ b/src/main/java/controller/BlackjackController.java @@ -49,10 +49,7 @@ private Dealer generateDealer() { } private Players generatePlayers() { - List players = NameInputView.getNames().stream() - .map(name -> Player.from(name, HoldingCards.of())) - .toList(); - return new Players(players); + return new Players(NameInputView.getNames()); } private void initialDraw(Deck deck, Dealer dealer, Players players) { diff --git a/src/main/java/domain/blackjack/Players.java b/src/main/java/domain/blackjack/Players.java index 32485e3a828..fdfaded6df7 100644 --- a/src/main/java/domain/blackjack/Players.java +++ b/src/main/java/domain/blackjack/Players.java @@ -8,8 +8,10 @@ public class Players { private final List players; - public Players(List players) { - this.players = players; + public Players(List playerNames) { + this.players = playerNames.stream() + .map(playerName -> Player.from(playerName, HoldingCards.of())) + .toList(); } public Map calculateGameResultsWithAsMap(Dealer dealer) { From 15543dba1b9dc255ad42afa36af15740aecee584 Mon Sep 17 00:00:00 2001 From: robinjoon Date: Tue, 12 Mar 2024 17:30:44 +0900 Subject: [PATCH 53/56] =?UTF-8?q?chore:=20=EC=82=AC=EC=9A=A9=ED=95=98?= =?UTF-8?q?=EC=A7=80=20=EC=95=8A=EB=8A=94=20=EB=A9=94=EC=84=9C=EB=93=9C=20?= =?UTF-8?q?=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/blackjack/Gamer.java | 4 ---- 1 file changed, 4 deletions(-) diff --git a/src/main/java/domain/blackjack/Gamer.java b/src/main/java/domain/blackjack/Gamer.java index 72c583991a2..2269dedb8a4 100644 --- a/src/main/java/domain/blackjack/Gamer.java +++ b/src/main/java/domain/blackjack/Gamer.java @@ -22,10 +22,6 @@ public final int getRawSummationCardPoint() { return blackJackGameMachine.getRawSummationCardPoint(); } - public final BlackJackGameMachine getGamer() { - return blackJackGameMachine; - } - public final GameResult calculateGameResult(Gamer other) { return GameResultCalculator.calculate(blackJackGameMachine, other.blackJackGameMachine); } From 0f008c7ab0503c52b0fab2c739552dd57f705d5e Mon Sep 17 00:00:00 2001 From: robinjoon Date: Tue, 12 Mar 2024 17:34:38 +0900 Subject: [PATCH 54/56] =?UTF-8?q?refactor:=20RandomCardSelectStrategy=20?= =?UTF-8?q?=EC=8B=B1=EA=B8=80=ED=86=A4=EC=9C=BC=EB=A1=9C=20=EB=B3=80?= =?UTF-8?q?=EA=B2=BD?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- src/main/java/controller/BlackjackController.java | 4 ++-- src/main/java/domain/card/RandomCardSelectStrategy.java | 4 +++- 2 files changed, 5 insertions(+), 3 deletions(-) diff --git a/src/main/java/controller/BlackjackController.java b/src/main/java/controller/BlackjackController.java index e3051b91e79..cc8682a7cad 100644 --- a/src/main/java/controller/BlackjackController.java +++ b/src/main/java/controller/BlackjackController.java @@ -61,11 +61,11 @@ private void initialDraw(Deck deck, Dealer dealer, Players players) { } private DrawResult dealerDraw(Deck deck, Dealer dealer) { - return dealer.draw(deck, new RandomCardSelectStrategy()); + return dealer.draw(deck, RandomCardSelectStrategy.INSTANCE); } private DrawResult playerDraw(Deck deck, Player player) { - return player.draw(deck, new RandomCardSelectStrategy()); + return player.draw(deck, RandomCardSelectStrategy.INSTANCE); } private void printDealerAndPlayers(Dealer dealer, Players players) { diff --git a/src/main/java/domain/card/RandomCardSelectStrategy.java b/src/main/java/domain/card/RandomCardSelectStrategy.java index 5516410ef36..08e39c442b1 100644 --- a/src/main/java/domain/card/RandomCardSelectStrategy.java +++ b/src/main/java/domain/card/RandomCardSelectStrategy.java @@ -4,8 +4,10 @@ import java.util.Random; public final class RandomCardSelectStrategy implements CardSelectStrategy { + + public static final RandomCardSelectStrategy INSTANCE = new RandomCardSelectStrategy(); private final Random random = new Random(); - + @Override public Card select(List cards) { int idx = random.nextInt(cards.size()); From 0b09e1222171e178b8a8b3a190952fc6f85ef5b2 Mon Sep 17 00:00:00 2001 From: robinjoon Date: Tue, 12 Mar 2024 17:38:09 +0900 Subject: [PATCH 55/56] =?UTF-8?q?fix:=20=EC=B6=9C=EB=A0=A5=EB=AC=B8?= =?UTF-8?q?=EA=B5=AC=20=EB=88=84=EB=9D=BD=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/BlackjackController.java | 1 + src/main/java/domain/blackjack/Players.java | 4 ++++ 2 files changed, 5 insertions(+) diff --git a/src/main/java/controller/BlackjackController.java b/src/main/java/controller/BlackjackController.java index cc8682a7cad..2f11057fa99 100644 --- a/src/main/java/controller/BlackjackController.java +++ b/src/main/java/controller/BlackjackController.java @@ -69,6 +69,7 @@ private DrawResult playerDraw(Deck deck, Player player) { } private void printDealerAndPlayers(Dealer dealer, Players players) { + OutputView.printInitGameDoneMessage(players.getPlayerNames()); printDealer(dealer); players.forEach(BlackjackController::printPlayer); } diff --git a/src/main/java/domain/blackjack/Players.java b/src/main/java/domain/blackjack/Players.java index fdfaded6df7..afd4414d162 100644 --- a/src/main/java/domain/blackjack/Players.java +++ b/src/main/java/domain/blackjack/Players.java @@ -28,4 +28,8 @@ List calculateGameResultsWith(Dealer dealer) { public void forEach(Consumer consumer) { players.forEach(consumer); } + + public List getPlayerNames() { + return players.stream().map(Player::getRawName).toList(); + } } From 438015edb841da9c917129bc852b0a9514244a15 Mon Sep 17 00:00:00 2001 From: robinjoon Date: Tue, 12 Mar 2024 17:45:33 +0900 Subject: [PATCH 56/56] =?UTF-8?q?refactor:=20BlackJackGameMachine=20?= =?UTF-8?q?=EB=82=B4=EB=B6=80=20=EB=A9=94=EC=84=9C=EB=93=9C=20=EC=9D=B4?= =?UTF-8?q?=EB=A6=84=20=EB=B0=8F=20=EC=A0=91=EA=B7=BC=20=EC=A7=80=EC=A0=95?= =?UTF-8?q?=EC=9E=90=20=EB=B3=80=EA=B2=BD?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../domain/blackjack/BlackJackGameMachine.java | 18 +++++++++--------- .../blackjack/DealerCardDrawCondition.java | 2 +- .../domain/blackjack/GameResultCalculator.java | 4 ++-- src/main/java/domain/blackjack/Gamer.java | 2 +- .../blackjack/BlackJackGameMachineTest.java | 2 +- src/test/java/domain/blackjack/GamerTest.java | 4 ++-- 6 files changed, 16 insertions(+), 16 deletions(-) diff --git a/src/main/java/domain/blackjack/BlackJackGameMachine.java b/src/main/java/domain/blackjack/BlackJackGameMachine.java index fa7df0b1ab3..592478b67a2 100644 --- a/src/main/java/domain/blackjack/BlackJackGameMachine.java +++ b/src/main/java/domain/blackjack/BlackJackGameMachine.java @@ -8,14 +8,14 @@ import domain.card.Deck; import java.util.List; -public class BlackJackGameMachine { +class BlackJackGameMachine { private final HoldingCards holdingCards; - public BlackJackGameMachine(HoldingCards holdingCards) { + BlackJackGameMachine(HoldingCards holdingCards) { this.holdingCards = holdingCards; } - public DrawResult draw(Deck deck, CardSelectStrategy cardSelectStrategy, CardDrawCondition cardDrawCondition) { + DrawResult draw(Deck deck, CardSelectStrategy cardSelectStrategy, CardDrawCondition cardDrawCondition) { if (isBust() || !cardDrawCondition.canDraw()) { return DrawResult.fail("카드를 더이상 뽑을 수 없습니다.", false); } @@ -28,7 +28,7 @@ public DrawResult draw(Deck deck, CardSelectStrategy cardSelectStrategy, CardDra } } - public SummationCardPoint getSummationCardPoint() { + SummationCardPoint calculateSummationCardPoint() { SummationCardPoint summationCardPoint = holdingCards.calculateTotalPoint(); if (hasAceInHoldingCards()) { int rawPoint = fixPoint(summationCardPoint.summationCardPoint()); @@ -44,17 +44,17 @@ private int fixPoint(int rawPoint) { } return rawPoint; } - - public List getRawHoldingCards() { + + List getRawHoldingCards() { return List.copyOf(holdingCards.getHoldingCards()); } - public int getRawSummationCardPoint() { - return getSummationCardPoint().summationCardPoint(); + int calculateSummationCardPointAsInt() { + return calculateSummationCardPoint().summationCardPoint(); } boolean isBust() { - return getSummationCardPoint().isDeadPoint(); + return calculateSummationCardPoint().isDeadPoint(); } boolean hasAceInHoldingCards() { diff --git a/src/main/java/domain/blackjack/DealerCardDrawCondition.java b/src/main/java/domain/blackjack/DealerCardDrawCondition.java index 4db0f91cbd5..f4690a6448b 100644 --- a/src/main/java/domain/blackjack/DealerCardDrawCondition.java +++ b/src/main/java/domain/blackjack/DealerCardDrawCondition.java @@ -14,7 +14,7 @@ public boolean canDraw() { final int rawDealerDrawThresholdPoint = 16; SummationCardPoint dealerDrawThresholdPoint = new SummationCardPoint(rawDealerDrawThresholdPoint); - SummationCardPoint summationCardPoint = blackJackGameMachine.getSummationCardPoint(); + SummationCardPoint summationCardPoint = blackJackGameMachine.calculateSummationCardPoint(); return !summationCardPoint.isBiggerThan(dealerDrawThresholdPoint); } } diff --git a/src/main/java/domain/blackjack/GameResultCalculator.java b/src/main/java/domain/blackjack/GameResultCalculator.java index b1b78fccc95..26eecc90d6c 100644 --- a/src/main/java/domain/blackjack/GameResultCalculator.java +++ b/src/main/java/domain/blackjack/GameResultCalculator.java @@ -24,8 +24,8 @@ public static GameResult calculate(BlackJackGameMachine baseBlackJackGameMachine private static GameResult getGameResultWhenNobodyDead(BlackJackGameMachine baseBlackJackGameMachine, BlackJackGameMachine otherBlackJackGameMachine) { - SummationCardPoint baseGamerSummationCardPoint = baseBlackJackGameMachine.getSummationCardPoint(); - SummationCardPoint otherGamerSummationCardPoint = otherBlackJackGameMachine.getSummationCardPoint(); + SummationCardPoint baseGamerSummationCardPoint = baseBlackJackGameMachine.calculateSummationCardPoint(); + SummationCardPoint otherGamerSummationCardPoint = otherBlackJackGameMachine.calculateSummationCardPoint(); if (baseGamerSummationCardPoint.isBiggerThan(otherGamerSummationCardPoint)) { return GameResult.WIN; diff --git a/src/main/java/domain/blackjack/Gamer.java b/src/main/java/domain/blackjack/Gamer.java index 2269dedb8a4..2bb01fe0dd2 100644 --- a/src/main/java/domain/blackjack/Gamer.java +++ b/src/main/java/domain/blackjack/Gamer.java @@ -19,7 +19,7 @@ public final List getRawHoldingCards() { } public final int getRawSummationCardPoint() { - return blackJackGameMachine.getRawSummationCardPoint(); + return blackJackGameMachine.calculateSummationCardPointAsInt(); } public final GameResult calculateGameResult(Gamer other) { diff --git a/src/test/java/domain/blackjack/BlackJackGameMachineTest.java b/src/test/java/domain/blackjack/BlackJackGameMachineTest.java index 9cc6a764489..697e4018755 100644 --- a/src/test/java/domain/blackjack/BlackJackGameMachineTest.java +++ b/src/test/java/domain/blackjack/BlackJackGameMachineTest.java @@ -74,7 +74,7 @@ void isBust(Card additionalCard, boolean expected) { @MethodSource("getSummationCardPointParameters") @DisplayName("점수가 잘 계산되는지 검증") void getSummationCardPoint(BlackJackGameMachine blackJackGameMachine, SummationCardPoint expected) { - SummationCardPoint summationCardPoint = blackJackGameMachine.getSummationCardPoint(); + SummationCardPoint summationCardPoint = blackJackGameMachine.calculateSummationCardPoint(); Assertions.assertThat(summationCardPoint) .isEqualTo(expected); } diff --git a/src/test/java/domain/blackjack/GamerTest.java b/src/test/java/domain/blackjack/GamerTest.java index 3bd855e72ed..ebd6646b964 100644 --- a/src/test/java/domain/blackjack/GamerTest.java +++ b/src/test/java/domain/blackjack/GamerTest.java @@ -44,7 +44,7 @@ void draw() { Deck deck = Deck.of(JACK_HEART, EIGHT_HEART); blackJackGameMachine.draw(deck, FIRST_CARD_SELECT_STRATEGY, new PlayerCardDrawCondition(blackJackGameMachine)); - SummationCardPoint actual = blackJackGameMachine.getSummationCardPoint(); + SummationCardPoint actual = blackJackGameMachine.calculateSummationCardPoint(); SummationCardPoint expected = new SummationCardPoint(10); Assertions.assertThat(actual) @@ -65,7 +65,7 @@ void isBust(Card additionalCard, boolean expected) { @MethodSource("getSummationCardPointParameters") @DisplayName("게임 참가자의 점수가 잘 계산되는지 검증") void getSummationCardPoint(BlackJackGameMachine blackJackGameMachine, SummationCardPoint expected) { - SummationCardPoint summationCardPoint = blackJackGameMachine.getSummationCardPoint(); + SummationCardPoint summationCardPoint = blackJackGameMachine.calculateSummationCardPoint(); Assertions.assertThat(summationCardPoint) .isEqualTo(expected); }