From 0169491a3b2f9cd5fc8f0cae3eafe35c4b6f75bf Mon Sep 17 00:00:00 2001 From: Beenie93 Date: Sun, 25 Jul 2021 16:35:54 +0900 Subject: [PATCH 01/80] =?UTF-8?q?docs:=20=EA=B5=AC=ED=98=84=ED=95=B4?= =?UTF-8?q?=EC=95=BC=ED=95=A0=20=EA=B8=B0=EB=8A=A5=20=EB=AA=A9=EB=A1=9D=20?= =?UTF-8?q?=EC=B6=94=EA=B0=80?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- README.md | 63 +++++++++++++++++++++++++++++++++++++++++++++++++++++++ 1 file changed, 63 insertions(+) diff --git a/README.md b/README.md index 2d9bc12..5d83e63 100644 --- a/README.md +++ b/README.md @@ -1 +1,64 @@ # java-blackjack + +# 규칙 +Blackjack : 처음 두 장의 카드 합 21 => 승 +Bust : 카드 합 21 초과 => 패 +Push : 플레이어, 딜러 카드 합이 같음 => 무승부 +Hit : 플레이어의 카드 2장의 합이 21을 초과하지 않을 경우, 추가 카드를 요청 +Stay : 플레이어가 추가 카드를 원하지 않음, 딜러는 카드 합 17 이상이면 추가 카드를 얻을 수 없음 +최대 인원 : 5명 + +# 구현해야 할 기능 목록 +- [] 입력 + - [] 플레이어 이름 + - [] 플레이어(딜러 제외) 추가 카드 요청 여부 + +- [] 출력 + - [] 각 플레이어(딜러 포함)에게 2장의 카드 지급 알림 + - [] 각 플레이어(딜러 포함)가 가진 카드 + - [] 딜러의 추가 카드 지급 여부 결과 + - [] 각 플레이어(딜러 포함)의 총 카드의 합 + - [] 최종 승패 결과 + +- [] 게임 참여자 + - 속성 + - [] 이름 + - [] 역할 + - [] 카드 목록 + + - 기능 + - [] 모든 카드 합을 계산 + - [] 처음 두 장의 카드 합 21인지 확인 + - [] 모든 카드 합이 21을 초과하는지 확인 + - [] Ace 포함하는지 확인 + - [] 21을 기준으로 Ace 1 또는 11로 설정 + - [] 카드 추가 요청 + +- [] 이름 + +- [] 카드 + - 속성 + - [] 값 + - [] 이름 + + - 기능 + - [] 카드의 값 반환 + - [] Ace인지 확인 + - [] K, Q, J인지 확인 + +- [] 카드 팩 + - 속성 + - [] 52개의 카드 + + - 기능 + - [] 52개의 카드 생성(캐싱) + - [] 2개의 랜덤 카드 반환 + - [] 추가 카드 반환 + +- [] 게임 시스템 + - 속성 + - [] 참여자 목록 + + - 기능 + - [] 카드 지급 + - [] 승, 패 여부 From 73b0cc125929452530a0193fce3f8880da425b7e Mon Sep 17 00:00:00 2001 From: Beenie93 Date: Sun, 25 Jul 2021 17:04:37 +0900 Subject: [PATCH 02/80] =?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=EB=B0=8F?= =?UTF-8?q?=20=EA=B3=B5=EB=B0=B1=20=EB=98=90=EB=8A=94=20null=20=EC=B2=B4?= =?UTF-8?q?=ED=81=AC?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- README.md | 2 +- src/main/java/blackjack/view/InputView.java | 27 +++++++++++++++++++++ src/main/java/empty.txt | 0 src/test/java/empty.txt | 0 4 files changed, 28 insertions(+), 1 deletion(-) create mode 100644 src/main/java/blackjack/view/InputView.java delete mode 100644 src/main/java/empty.txt delete mode 100644 src/test/java/empty.txt diff --git a/README.md b/README.md index 5d83e63..22080fb 100644 --- a/README.md +++ b/README.md @@ -10,7 +10,7 @@ Stay : 플레이어가 추가 카드를 원하지 않음, 딜러는 카드 합 1 # 구현해야 할 기능 목록 - [] 입력 - - [] 플레이어 이름 + - [x] 플레이어 이름 - [] 플레이어(딜러 제외) 추가 카드 요청 여부 - [] 출력 diff --git a/src/main/java/blackjack/view/InputView.java b/src/main/java/blackjack/view/InputView.java new file mode 100644 index 0000000..24a2cbf --- /dev/null +++ b/src/main/java/blackjack/view/InputView.java @@ -0,0 +1,27 @@ +package blackjack.view; + +import java.util.Arrays; +import java.util.List; +import java.util.Scanner; + +public class InputView { + private static final String SPLIT_DELIMITER = ","; + private static final Scanner scanner = new Scanner(System.in); + + public List getPlayerNames() { + System.out.println("게임에 참여할 사람의 이름을 입력하세요.(쉼표 기준으로 분리)"); + String playerNames = scanner.nextLine(); + checkBlank(playerNames); + return splitByComma(playerNames); + } + + private void checkBlank(String input) { + if (input == null || input.isEmpty()) { + throw new IllegalArgumentException("한 글자 이상의 사람 이름을 입력해주세요"); + } + } + + private List splitByComma(String playerNames) { + return Arrays.asList(playerNames.split(SPLIT_DELIMITER)); + } +} diff --git a/src/main/java/empty.txt b/src/main/java/empty.txt deleted file mode 100644 index e69de29..0000000 diff --git a/src/test/java/empty.txt b/src/test/java/empty.txt deleted file mode 100644 index e69de29..0000000 From ac0700923b9b8dfa61fc1ff6dda72de31cc44ddc Mon Sep 17 00:00:00 2001 From: Beenie93 Date: Sun, 25 Jul 2021 18:42:06 +0900 Subject: [PATCH 03/80] =?UTF-8?q?feat:=20=EC=B9=B4=EB=93=9C=20=ED=95=9C=20?= =?UTF-8?q?=EC=9E=A5=EC=97=90=20=EC=9D=B4=EB=A6=84=EA=B3=BC=20=EA=B0=92?= =?UTF-8?q?=EC=9D=84=20=EC=B2=B4=ED=81=AC=ED=95=B4=EC=84=9C=20=EC=83=9D?= =?UTF-8?q?=EC=84=B1=ED=95=98=EB=8A=94=20=ED=85=8C=EC=8A=A4=ED=8A=B8=20?= =?UTF-8?q?=EC=BD=94=EB=93=9C=20=EB=B0=8F=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 | 6 ++-- src/main/java/blackjack/domain/Card.java | 34 ++++++++++++++++++++ src/main/java/blackjack/enums/CardScore.java | 22 +++++++++++++ src/test/java/blackjack/domain/CardTest.java | 27 ++++++++++++++++ 4 files changed, 87 insertions(+), 2 deletions(-) create mode 100644 src/main/java/blackjack/domain/Card.java create mode 100644 src/main/java/blackjack/enums/CardScore.java create mode 100644 src/test/java/blackjack/domain/CardTest.java diff --git a/README.md b/README.md index 22080fb..eb3f6fa 100644 --- a/README.md +++ b/README.md @@ -38,8 +38,10 @@ Stay : 플레이어가 추가 카드를 원하지 않음, 딜러는 카드 합 1 - [] 카드 - 속성 - - [] 값 - - [] 이름 + - [x] 값 + - [x] ERROR: 값이 2~9, a,j,q,k가 아닌 경우 예외가 발생한다. + - [x] 이름 + - [x] ERROR: 이름이 다이아몬드, 스페이스, 클로버, 하트가 아닌 경우 예외가 발생한다. - 기능 - [] 카드의 값 반환 diff --git a/src/main/java/blackjack/domain/Card.java b/src/main/java/blackjack/domain/Card.java new file mode 100644 index 0000000..21dc41d --- /dev/null +++ b/src/main/java/blackjack/domain/Card.java @@ -0,0 +1,34 @@ +package blackjack.domain; + +import java.util.Arrays; + +public class Card { + private final String score; + private final String type; + + private static final String[] scores = {"A", "2", "3", "4", "5", "6", "7", "8", "9", "J", "Q", "K"}; + private static final String[] types = {"다이아몬드", "클로버", "하트", "스페이드"}; + + public Card(String score, String type) { + validateScore(score); + validateType(type); + this.score = score; + this.type = type; + } + + private void validateScore(String inputScore) { + boolean isMatched = Arrays.asList(scores).contains(inputScore); + + if (!isMatched) { + throw new IllegalArgumentException("카드 숫자가 규격에 맞지 않습니다."); + } + } + + private void validateType(String inputType) { + boolean isMatched = Arrays.asList(types).contains(inputType); + + if (!isMatched) { + throw new IllegalArgumentException("카드 타입이 규격에 맞지 않습니다."); + } + } +} diff --git a/src/main/java/blackjack/enums/CardScore.java b/src/main/java/blackjack/enums/CardScore.java new file mode 100644 index 0000000..43b91ce --- /dev/null +++ b/src/main/java/blackjack/enums/CardScore.java @@ -0,0 +1,22 @@ +//package blackjack.enums; +// +//public enum CardScore { +// A(new int{1,11}), +// TWO(2), +// THREE(3), +// FOUR(4), +// FIVE(5), +// SIX(6), +// SEVEN(7), +// EIGHT(8), +// NINE(9), +// J(10), +// Q(10), +// K(10); +// +// private final int[] score; +// +// CardScore(int score){ +// this.score = score; +// } +//} diff --git a/src/test/java/blackjack/domain/CardTest.java b/src/test/java/blackjack/domain/CardTest.java new file mode 100644 index 0000000..d66ca04 --- /dev/null +++ b/src/test/java/blackjack/domain/CardTest.java @@ -0,0 +1,27 @@ +package blackjack.domain; + +import org.junit.jupiter.api.DisplayName; +import org.junit.jupiter.params.ParameterizedTest; +import org.junit.jupiter.params.provider.ValueSource; + +import static org.assertj.core.api.Assertions.assertThatIllegalArgumentException; + +public class CardTest { + + @ParameterizedTest + @ValueSource(strings = {"동그라미", "네모"}) + @DisplayName("카드의 타입이 다이아몬드,스페이스,클로버,하트 중 하나가 아니면 에러를 리턴한다") + void validateType(String type) { + //when //then + assertThatIllegalArgumentException().isThrownBy(() -> new Card("1", type)); + } + + @ParameterizedTest + @ValueSource(strings = {"B", "10", "1"}) + @DisplayName("카드의 스코어가 a,j,q,k,2~9 외의 값이면 에러를 리턴한다") + void validateScore(String score) { + //when //then + assertThatIllegalArgumentException().isThrownBy(() -> new Card(score, "하트")); + } + +} From e378c9860d7c808c98f27e22feab850d5845ab78 Mon Sep 17 00:00:00 2001 From: Beenie93 Date: Mon, 26 Jul 2021 20:03:18 +0900 Subject: [PATCH 04/80] =?UTF-8?q?feat:=20=EC=B9=B4=EB=93=9C=20=ED=95=9C=20?= =?UTF-8?q?=EC=9E=A5=EC=9D=98=20=EC=A0=90=EC=88=98=EB=A5=BC=20=EB=B0=98?= =?UTF-8?q?=ED=99=98=ED=95=98=EB=8A=94=20=ED=85=8C=EC=8A=A4=ED=8A=B8=20?= =?UTF-8?q?=EB=B0=8F=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 | 6 +-- src/main/java/blackjack/domain/Card.java | 30 +++-------- src/main/java/blackjack/enums/CardScore.java | 54 ++++++++++++-------- src/main/java/blackjack/enums/CardType.java | 18 +++++++ src/test/java/blackjack/domain/CardTest.java | 29 +++++------ 5 files changed, 73 insertions(+), 64 deletions(-) create mode 100644 src/main/java/blackjack/enums/CardType.java diff --git a/README.md b/README.md index eb3f6fa..2f3cd20 100644 --- a/README.md +++ b/README.md @@ -39,12 +39,10 @@ Stay : 플레이어가 추가 카드를 원하지 않음, 딜러는 카드 합 1 - [] 카드 - 속성 - [x] 값 - - [x] ERROR: 값이 2~9, a,j,q,k가 아닌 경우 예외가 발생한다. - - [x] 이름 - - [x] ERROR: 이름이 다이아몬드, 스페이스, 클로버, 하트가 아닌 경우 예외가 발생한다. + - [x] 타입 - 기능 - - [] 카드의 값 반환 + - [X] 카드의 값 반환 - [] Ace인지 확인 - [] K, Q, J인지 확인 diff --git a/src/main/java/blackjack/domain/Card.java b/src/main/java/blackjack/domain/Card.java index 21dc41d..3f42950 100644 --- a/src/main/java/blackjack/domain/Card.java +++ b/src/main/java/blackjack/domain/Card.java @@ -1,34 +1,18 @@ package blackjack.domain; -import java.util.Arrays; +import blackjack.enums.CardScore; +import blackjack.enums.CardType; public class Card { - private final String score; - private final String type; + private final CardScore score; + private final CardType type; - private static final String[] scores = {"A", "2", "3", "4", "5", "6", "7", "8", "9", "J", "Q", "K"}; - private static final String[] types = {"다이아몬드", "클로버", "하트", "스페이드"}; - - public Card(String score, String type) { - validateScore(score); - validateType(type); + public Card(CardScore score, CardType type) { this.score = score; this.type = type; } - private void validateScore(String inputScore) { - boolean isMatched = Arrays.asList(scores).contains(inputScore); - - if (!isMatched) { - throw new IllegalArgumentException("카드 숫자가 규격에 맞지 않습니다."); - } - } - - private void validateType(String inputType) { - boolean isMatched = Arrays.asList(types).contains(inputType); - - if (!isMatched) { - throw new IllegalArgumentException("카드 타입이 규격에 맞지 않습니다."); - } + public int getScore() { + return score.getScore(); } } diff --git a/src/main/java/blackjack/enums/CardScore.java b/src/main/java/blackjack/enums/CardScore.java index 43b91ce..ace1fc5 100644 --- a/src/main/java/blackjack/enums/CardScore.java +++ b/src/main/java/blackjack/enums/CardScore.java @@ -1,22 +1,32 @@ -//package blackjack.enums; -// -//public enum CardScore { -// A(new int{1,11}), -// TWO(2), -// THREE(3), -// FOUR(4), -// FIVE(5), -// SIX(6), -// SEVEN(7), -// EIGHT(8), -// NINE(9), -// J(10), -// Q(10), -// K(10); -// -// private final int[] score; -// -// CardScore(int score){ -// this.score = score; -// } -//} +package blackjack.enums; + +public enum CardScore { + A("A", 1), + TWO("2", 2), + THREE("3", 3), + FOUR("4", 4), + FIVE("5", 5), + SIX("6", 6), + SEVEN("7", 7), + EIGHT("8", 8), + NINE("9", 9), + J("J", 10), + Q("Q", 10), + K("K", 10); + + private final String denomination; + private final int score; + + CardScore(String denomination, int score) { + this.denomination = denomination; + this.score = score; + } + + public String getDenomination() { + return denomination; + } + + public int getScore() { + return score; + } +} diff --git a/src/main/java/blackjack/enums/CardType.java b/src/main/java/blackjack/enums/CardType.java new file mode 100644 index 0000000..bc784b1 --- /dev/null +++ b/src/main/java/blackjack/enums/CardType.java @@ -0,0 +1,18 @@ +package blackjack.enums; + +public enum CardType { + HEART("하트"), + DIAMOND("다이아몬드"), + CLUB("클로버"), + SPADE("스페이드"); + + private final String type; + + CardType(String type) { + this.type = type; + } + + public String getType() { + return type; + } +} diff --git a/src/test/java/blackjack/domain/CardTest.java b/src/test/java/blackjack/domain/CardTest.java index d66ca04..d2878c6 100644 --- a/src/test/java/blackjack/domain/CardTest.java +++ b/src/test/java/blackjack/domain/CardTest.java @@ -1,27 +1,26 @@ package blackjack.domain; +import blackjack.enums.CardScore; +import blackjack.enums.CardType; import org.junit.jupiter.api.DisplayName; import org.junit.jupiter.params.ParameterizedTest; -import org.junit.jupiter.params.provider.ValueSource; +import org.junit.jupiter.params.provider.CsvSource; -import static org.assertj.core.api.Assertions.assertThatIllegalArgumentException; +import static org.assertj.core.api.Assertions.assertThat; public class CardTest { @ParameterizedTest - @ValueSource(strings = {"동그라미", "네모"}) - @DisplayName("카드의 타입이 다이아몬드,스페이스,클로버,하트 중 하나가 아니면 에러를 리턴한다") - void validateType(String type) { - //when //then - assertThatIllegalArgumentException().isThrownBy(() -> new Card("1", type)); - } + @CsvSource(value = {"TWO, 2", "THREE, 3", "FOUR, 4", "FIVE, 5", "SIX, 6", "A, 1", "K, 10", "Q, 10", "J, 10"}) + @DisplayName("카드의 점수를 반환한다.") + void getScore(String inputScore, int expectedValue) { + //given + Card card = new Card(CardScore.valueOf(inputScore), CardType.DIAMOND); - @ParameterizedTest - @ValueSource(strings = {"B", "10", "1"}) - @DisplayName("카드의 스코어가 a,j,q,k,2~9 외의 값이면 에러를 리턴한다") - void validateScore(String score) { - //when //then - assertThatIllegalArgumentException().isThrownBy(() -> new Card(score, "하트")); - } + //when + int score = card.getScore(); + //then + assertThat(score).isEqualTo(expectedValue); + } } From 6b566fc79ce4ad21517331c843e0f2a68f982d95 Mon Sep 17 00:00:00 2001 From: Beenie93 Date: Mon, 26 Jul 2021 20:33:04 +0900 Subject: [PATCH 05/80] =?UTF-8?q?feat:=20=EC=B9=B4=EB=93=9C=2052=EA=B0=9C?= =?UTF-8?q?=20=EC=83=9D=EC=84=B1=EB=90=98=EB=8A=94=20=ED=85=8C=EC=8A=A4?= =?UTF-8?q?=ED=8A=B8=20=EB=B0=8F=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 | 4 +-- src/main/java/blackjack/domain/CardDeck.java | 26 +++++++++++++++++++ .../java/blackjack/domain/CardDeckTest.java | 21 +++++++++++++++ 3 files changed, 49 insertions(+), 2 deletions(-) create mode 100644 src/main/java/blackjack/domain/CardDeck.java create mode 100644 src/test/java/blackjack/domain/CardDeckTest.java diff --git a/README.md b/README.md index 2f3cd20..a9d9a5f 100644 --- a/README.md +++ b/README.md @@ -48,10 +48,10 @@ Stay : 플레이어가 추가 카드를 원하지 않음, 딜러는 카드 합 1 - [] 카드 팩 - 속성 - - [] 52개의 카드 + - [x] 52개의 카드 - 기능 - - [] 52개의 카드 생성(캐싱) + - [x] 52개의 카드 생성 - [] 2개의 랜덤 카드 반환 - [] 추가 카드 반환 diff --git a/src/main/java/blackjack/domain/CardDeck.java b/src/main/java/blackjack/domain/CardDeck.java new file mode 100644 index 0000000..69eaf32 --- /dev/null +++ b/src/main/java/blackjack/domain/CardDeck.java @@ -0,0 +1,26 @@ +package blackjack.domain; + +import blackjack.enums.CardScore; +import blackjack.enums.CardType; + +import java.util.ArrayList; +import java.util.List; + +public class CardDeck { + + private final List cards = new ArrayList<>(); + + public CardDeck() { + for (CardScore cardScore : CardScore.values()) { + for (CardType cardType : CardType.values()) { + cards.add(new Card(cardScore, cardType)); + } + + } + } + + public int size() { + return cards.size(); + } + +} diff --git a/src/test/java/blackjack/domain/CardDeckTest.java b/src/test/java/blackjack/domain/CardDeckTest.java new file mode 100644 index 0000000..c98112f --- /dev/null +++ b/src/test/java/blackjack/domain/CardDeckTest.java @@ -0,0 +1,21 @@ +package blackjack.domain; + +import org.junit.jupiter.api.DisplayName; +import org.junit.jupiter.api.Test; + +import static org.assertj.core.api.Assertions.assertThat; + +class CardDeckTest { + @Test + @DisplayName("카드 덱을 생성하면 52장의 카드가 생긴다") + void create() { + //given + CardDeck cardDeck = new CardDeck(); + + //when + int size = cardDeck.size(); + + //then + assertThat(size).isEqualTo(52); + } +} From 70529973cc326518d6a88eb4bb7c97a004813d6e Mon Sep 17 00:00:00 2001 From: Beenie93 Date: Mon, 26 Jul 2021 21:20:06 +0900 Subject: [PATCH 06/80] =?UTF-8?q?feat:=20=EC=B4=88=EA=B8=B0=202=EC=9E=A5?= =?UTF-8?q?=EC=9D=98=20=EC=B9=B4=EB=93=9C=20=EC=A7=80=EA=B8=89,=20?= =?UTF-8?q?=EC=B6=94=EA=B0=80=20=EC=B9=B4=EB=93=9C=20=EC=A7=80=EA=B8=89=20?= =?UTF-8?q?=ED=85=8C=EC=8A=A4=ED=8A=B8=20=EB=B0=8F=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 | 7 ++-- src/main/java/blackjack/domain/CardDeck.java | 38 +++++++++++++++---- src/main/java/blackjack/enums/CardScore.java | 1 + .../java/blackjack/domain/CardDeckTest.java | 27 +++++++++++++ 4 files changed, 63 insertions(+), 10 deletions(-) diff --git a/README.md b/README.md index a9d9a5f..ea3d910 100644 --- a/README.md +++ b/README.md @@ -46,14 +46,15 @@ Stay : 플레이어가 추가 카드를 원하지 않음, 딜러는 카드 합 1 - [] Ace인지 확인 - [] K, Q, J인지 확인 -- [] 카드 팩 +- [x] 카드 팩 - 속성 - [x] 52개의 카드 - 기능 - [x] 52개의 카드 생성 - - [] 2개의 랜덤 카드 반환 - - [] 추가 카드 반환 + - [x] 2개의 랜덤 카드 반환 + - [x] 추가 카드 반환 + - [] ERROR: 반환할 수 있는 카드가 없을 경우 - [] 게임 시스템 - 속성 diff --git a/src/main/java/blackjack/domain/CardDeck.java b/src/main/java/blackjack/domain/CardDeck.java index 69eaf32..47a6a3a 100644 --- a/src/main/java/blackjack/domain/CardDeck.java +++ b/src/main/java/blackjack/domain/CardDeck.java @@ -4,23 +4,47 @@ import blackjack.enums.CardType; import java.util.ArrayList; +import java.util.Arrays; +import java.util.Collections; import java.util.List; +import java.util.stream.Collectors; +import java.util.stream.IntStream; public class CardDeck { + public static final int FIRST_CARDS_SETTING_COUNT = 2; private final List cards = new ArrayList<>(); + private int size; public CardDeck() { - for (CardScore cardScore : CardScore.values()) { - for (CardType cardType : CardType.values()) { - cards.add(new Card(cardScore, cardType)); - } + init(); + } + + private void init() { + Arrays.stream(CardScore.values()) + .forEach(cardScore -> { + Arrays.stream(CardType.values()).forEach(cardType -> cards.add(new Card(cardScore, cardType))); + }); + + size = cards.size(); + suffleCard(); + } - } + public int getSize() { + return size; } - public int size() { - return cards.size(); + private void suffleCard() { + Collections.shuffle(cards); } + public List getFirstTwoCards() { + return IntStream.range(0, FIRST_CARDS_SETTING_COUNT) + .mapToObj(i -> getAdditionalCard()) + .collect(Collectors.toList()); + } + + public Card getAdditionalCard() { + return cards.get(--size); + } } diff --git a/src/main/java/blackjack/enums/CardScore.java b/src/main/java/blackjack/enums/CardScore.java index ace1fc5..269b6e9 100644 --- a/src/main/java/blackjack/enums/CardScore.java +++ b/src/main/java/blackjack/enums/CardScore.java @@ -10,6 +10,7 @@ public enum CardScore { SEVEN("7", 7), EIGHT("8", 8), NINE("9", 9), + TEN("10", 10), J("J", 10), Q("Q", 10), K("K", 10); diff --git a/src/test/java/blackjack/domain/CardDeckTest.java b/src/test/java/blackjack/domain/CardDeckTest.java index c98112f..f9d952a 100644 --- a/src/test/java/blackjack/domain/CardDeckTest.java +++ b/src/test/java/blackjack/domain/CardDeckTest.java @@ -18,4 +18,31 @@ void create() { //then assertThat(size).isEqualTo(52); } + + @Test + @DisplayName("섞인카드 덱에서 2개의 카드를 순서대로 리턴한다.") + void getFirstTwoCards() { + //given + CardDeck cardDeck = new CardDeck(); + + //when + List myCards = cardDeck.getFirstTwoCards(); + + //then + assertThat(myCards).hasSize(2); + assertThat(cardDeck.getSize()).isEqualTo(50); + } + + @Test + @DisplayName("섞인 카드덱에서 1개의 카드를 반환한다") + void getAdditionalCard() { + //given + CardDeck cardDeck = new CardDeck(); + + //when + Card additionalCard = cardDeck.getAdditionalCard(); + + //then + assertThat(additionalCard).isNotNull(); + } } From d57570da09ce1173637e62fa4ffb6cf45bbb36f7 Mon Sep 17 00:00:00 2001 From: Beenie93 Date: Wed, 28 Jul 2021 19:02:26 +0900 Subject: [PATCH 07/80] =?UTF-8?q?feat:=20=EB=8D=94=20=EC=9D=B4=EC=83=81=20?= =?UTF-8?q?=EC=B9=B4=EB=93=9C=EB=A5=BC=20=EB=B0=98=ED=99=98=ED=95=A0=20?= =?UTF-8?q?=EC=88=98=20=EC=97=86=EB=8A=94=20=EA=B2=BD=EC=9A=B0=20=EC=98=88?= =?UTF-8?q?=EC=99=B8=20=EB=B0=9C=EC=83=9D=20=ED=85=8C=EC=8A=A4=ED=8A=B8=20?= =?UTF-8?q?=EB=B0=8F=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/blackjack/domain/CardDeck.java | 8 ++++++-- .../java/blackjack/domain/CardDeckTest.java | 19 ++++++++++++++++++- 3 files changed, 25 insertions(+), 4 deletions(-) diff --git a/README.md b/README.md index ea3d910..8044896 100644 --- a/README.md +++ b/README.md @@ -54,7 +54,7 @@ Stay : 플레이어가 추가 카드를 원하지 않음, 딜러는 카드 합 1 - [x] 52개의 카드 생성 - [x] 2개의 랜덤 카드 반환 - [x] 추가 카드 반환 - - [] ERROR: 반환할 수 있는 카드가 없을 경우 + - [x] ERROR: 반환할 수 있는 카드가 없을 경우 - [] 게임 시스템 - 속성 diff --git a/src/main/java/blackjack/domain/CardDeck.java b/src/main/java/blackjack/domain/CardDeck.java index 47a6a3a..c1d3db5 100644 --- a/src/main/java/blackjack/domain/CardDeck.java +++ b/src/main/java/blackjack/domain/CardDeck.java @@ -12,7 +12,8 @@ public class CardDeck { - public static final int FIRST_CARDS_SETTING_COUNT = 2; + private static final int FIRST_CARDS_SETTING_COUNT = 2; + private final List cards = new ArrayList<>(); private int size; @@ -25,7 +26,6 @@ private void init() { .forEach(cardScore -> { Arrays.stream(CardType.values()).forEach(cardType -> cards.add(new Card(cardScore, cardType))); }); - size = cards.size(); suffleCard(); } @@ -45,6 +45,10 @@ public List getFirstTwoCards() { } public Card getAdditionalCard() { + if (size < 1) { + throw new IndexOutOfBoundsException("더이상 카드가 없습니다."); + } + return cards.get(--size); } } diff --git a/src/test/java/blackjack/domain/CardDeckTest.java b/src/test/java/blackjack/domain/CardDeckTest.java index f9d952a..688e60c 100644 --- a/src/test/java/blackjack/domain/CardDeckTest.java +++ b/src/test/java/blackjack/domain/CardDeckTest.java @@ -3,7 +3,11 @@ import org.junit.jupiter.api.DisplayName; import org.junit.jupiter.api.Test; +import java.util.List; +import java.util.stream.IntStream; + import static org.assertj.core.api.Assertions.assertThat; +import static org.assertj.core.api.Assertions.assertThatThrownBy; class CardDeckTest { @Test @@ -13,7 +17,7 @@ void create() { CardDeck cardDeck = new CardDeck(); //when - int size = cardDeck.size(); + int size = cardDeck.getSize(); //then assertThat(size).isEqualTo(52); @@ -45,4 +49,17 @@ void getAdditionalCard() { //then assertThat(additionalCard).isNotNull(); } + + @Test + @DisplayName("카드가 없을때 카드를 뽑으면 예외가 발생한다") + void getAdditionlCard_throw_exception_no_cards_left() { + //given + CardDeck cardDeck = new CardDeck(); + IntStream.range(0, 52).forEach(i -> cardDeck.getAdditionalCard()); + + //when //then + assertThatThrownBy(cardDeck::getAdditionalCard) + .isInstanceOf(IndexOutOfBoundsException.class) + .hasMessage("더이상 카드가 없습니다."); + } } From 16becf5d652399c8fb68f637a46a85e54091e73a Mon Sep 17 00:00:00 2001 From: Beenie93 Date: Wed, 28 Jul 2021 19:09:52 +0900 Subject: [PATCH 08/80] =?UTF-8?q?feat:=20=ED=94=8C=EB=A0=88=EC=9D=B4?= =?UTF-8?q?=EC=96=B4(=EB=94=9C=EB=9F=AC=20=EC=A0=9C=EC=99=B8)=20=EC=B6=94?= =?UTF-8?q?=EA=B0=80=20=EC=B9=B4=EB=93=9C=20=EC=9A=94=EC=B2=AD=20=EC=9E=85?= =?UTF-8?q?=EB=A0=A5=20=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 | 3 +-- src/main/java/blackjack/view/InputView.java | 7 +++++++ 2 files changed, 8 insertions(+), 2 deletions(-) diff --git a/README.md b/README.md index 8044896..3f96a3f 100644 --- a/README.md +++ b/README.md @@ -11,7 +11,7 @@ Stay : 플레이어가 추가 카드를 원하지 않음, 딜러는 카드 합 1 # 구현해야 할 기능 목록 - [] 입력 - [x] 플레이어 이름 - - [] 플레이어(딜러 제외) 추가 카드 요청 여부 + - [x] 플레이어(딜러 제외) 추가 카드 요청 여부 - [] 출력 - [] 각 플레이어(딜러 포함)에게 2장의 카드 지급 알림 @@ -44,7 +44,6 @@ Stay : 플레이어가 추가 카드를 원하지 않음, 딜러는 카드 합 1 - 기능 - [X] 카드의 값 반환 - [] Ace인지 확인 - - [] K, Q, J인지 확인 - [x] 카드 팩 - 속성 diff --git a/src/main/java/blackjack/view/InputView.java b/src/main/java/blackjack/view/InputView.java index 24a2cbf..e49acd9 100644 --- a/src/main/java/blackjack/view/InputView.java +++ b/src/main/java/blackjack/view/InputView.java @@ -15,6 +15,13 @@ public List getPlayerNames() { return splitByComma(playerNames); } + public String getAdditionalCard(String playerName) { + System.out.printf("%s는 한장의 카드를 더 받겠습니까?(예는 y, 아니오는 n)", playerName); + String answer = scanner.nextLine(); + checkBlank(answer); + return answer; + } + private void checkBlank(String input) { if (input == null || input.isEmpty()) { throw new IllegalArgumentException("한 글자 이상의 사람 이름을 입력해주세요"); From 2885dbbf8f4554462b55db273418e5d5a34b4eef Mon Sep 17 00:00:00 2001 From: Beenie93 Date: Wed, 28 Jul 2021 19:20:45 +0900 Subject: [PATCH 09/80] =?UTF-8?q?feat:=20=EA=B0=81=20=ED=94=8C=EB=A0=88?= =?UTF-8?q?=EC=9D=B4=EC=96=B4(=EB=94=9C=EB=9F=AC=20=ED=8F=AC=ED=95=A8)?= =?UTF-8?q?=EC=97=90=EA=B2=8C=202=EC=9E=A5=EC=9D=98=20=EC=B9=B4=EB=93=9C?= =?UTF-8?q?=20=EC=A7=80=EA=B8=89=20=EC=95=8C=EB=A6=BC=20=EC=B6=9C=EB=A0=A5?= =?UTF-8?q?=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 | 4 ++-- src/main/java/blackjack/view/OutputView.java | 10 ++++++++++ 2 files changed, 12 insertions(+), 2 deletions(-) create mode 100644 src/main/java/blackjack/view/OutputView.java diff --git a/README.md b/README.md index 3f96a3f..945cfd0 100644 --- a/README.md +++ b/README.md @@ -9,12 +9,12 @@ Stay : 플레이어가 추가 카드를 원하지 않음, 딜러는 카드 합 1 최대 인원 : 5명 # 구현해야 할 기능 목록 -- [] 입력 +- [x] 입력 - [x] 플레이어 이름 - [x] 플레이어(딜러 제외) 추가 카드 요청 여부 - [] 출력 - - [] 각 플레이어(딜러 포함)에게 2장의 카드 지급 알림 + - [x] 각 플레이어(딜러 포함)에게 2장의 카드 지급 알림 - [] 각 플레이어(딜러 포함)가 가진 카드 - [] 딜러의 추가 카드 지급 여부 결과 - [] 각 플레이어(딜러 포함)의 총 카드의 합 diff --git a/src/main/java/blackjack/view/OutputView.java b/src/main/java/blackjack/view/OutputView.java new file mode 100644 index 0000000..57d5a22 --- /dev/null +++ b/src/main/java/blackjack/view/OutputView.java @@ -0,0 +1,10 @@ +package blackjack.view; + +import java.util.List; + +public class OutputView { + + public void printFirstTwoCards(List playerNames) { + System.out.printf("딜러와 %s에게 2장의 카드를 나누었습니다.", String.join(",", playerNames)); + } +} From 245b7c5afb9901a024c8a7d7937539e0f646a81b Mon Sep 17 00:00:00 2001 From: Beenie93 Date: Wed, 28 Jul 2021 19:41:56 +0900 Subject: [PATCH 10/80] =?UTF-8?q?feat:=20=ED=94=8C=EB=A0=88=EC=9D=B4?= =?UTF-8?q?=EC=96=B4=EA=B0=80=20=EC=B6=94=EA=B0=80=20=EC=B9=B4=EB=93=9C=20?= =?UTF-8?q?=EB=B0=9C=EA=B8=89=EB=B0=9B=EB=8A=94=20=ED=85=8C=EC=8A=A4?= =?UTF-8?q?=ED=8A=B8=20=EB=B0=8F=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 | 7 ++-- src/main/java/blackjack/domain/Player.java | 27 ++++++++++++++ .../java/blackjack/domain/PlayerTest.java | 37 +++++++++++++++++++ 3 files changed, 67 insertions(+), 4 deletions(-) create mode 100644 src/main/java/blackjack/domain/Player.java create mode 100644 src/test/java/blackjack/domain/PlayerTest.java diff --git a/README.md b/README.md index 945cfd0..8809e8e 100644 --- a/README.md +++ b/README.md @@ -22,9 +22,8 @@ Stay : 플레이어가 추가 카드를 원하지 않음, 딜러는 카드 합 1 - [] 게임 참여자 - 속성 - - [] 이름 - - [] 역할 - - [] 카드 목록 + - [x] 이름 + - [x] 카드 목록 - 기능 - [] 모든 카드 합을 계산 @@ -32,7 +31,7 @@ Stay : 플레이어가 추가 카드를 원하지 않음, 딜러는 카드 합 1 - [] 모든 카드 합이 21을 초과하는지 확인 - [] Ace 포함하는지 확인 - [] 21을 기준으로 Ace 1 또는 11로 설정 - - [] 카드 추가 요청 + - [x] 카드 추가 요청 - [] 이름 diff --git a/src/main/java/blackjack/domain/Player.java b/src/main/java/blackjack/domain/Player.java new file mode 100644 index 0000000..5fb8edc --- /dev/null +++ b/src/main/java/blackjack/domain/Player.java @@ -0,0 +1,27 @@ +package blackjack.domain; + +import java.util.ArrayList; +import java.util.Collections; +import java.util.List; + +public class Player { + + private final String name; + private final List cards = new ArrayList<>(); + + public Player(String name) { + this.name = name; + } + + public String getName() { + return name; + } + + public List getCards() { + return Collections.unmodifiableList(cards); + } + + public void addCard(Card card) { + cards.add(card); + } +} diff --git a/src/test/java/blackjack/domain/PlayerTest.java b/src/test/java/blackjack/domain/PlayerTest.java new file mode 100644 index 0000000..ac352ad --- /dev/null +++ b/src/test/java/blackjack/domain/PlayerTest.java @@ -0,0 +1,37 @@ +package blackjack.domain; + +import org.junit.jupiter.api.DisplayName; +import org.junit.jupiter.api.Test; + +import static org.assertj.core.api.Assertions.assertThat; + +public class PlayerTest { + + @Test + @DisplayName("사람이름을 입력 받아서 입력받은 플레이어 객체를 만든다") + void create() { + //given + String name = "홍길동"; + + //when + Player player = new Player(name); + + //then + assertThat(player.getName()).isEqualTo(name); + assertThat(player.getCards()).hasSize(0); + } + + @Test + @DisplayName("카드를 추가로 한장 더 발급 받는다.") + void addCard() { + //given + CardDeck cardDeck = new CardDeck(); + Player player = new Player("pobi"); + + //when + player.addCard(cardDeck.getAdditionalCard()); + + //then + assertThat(player.getCards()).hasSize(1); + } +} From 5e00eda0e39d3cc5275a3171109681472b782070 Mon Sep 17 00:00:00 2001 From: Beenie93 Date: Wed, 28 Jul 2021 19:57:20 +0900 Subject: [PATCH 11/80] =?UTF-8?q?feat:=20=ED=94=8C=EB=A0=88=EC=9D=B4?= =?UTF-8?q?=EC=96=B4=EA=B0=80=20=EC=B6=94=EA=B0=80=20=EC=B9=B4=EB=93=9C=20?= =?UTF-8?q?=EB=B0=9C=EA=B8=89=EB=B0=9B=EB=8A=94=20=ED=85=8C=EC=8A=A4?= =?UTF-8?q?=ED=8A=B8=20=EB=B0=8F=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 | 5 ++- src/main/java/blackjack/domain/Player.java | 8 +++++ .../java/blackjack/domain/PlayerTest.java | 35 ++++++++++++++++++- 3 files changed, 44 insertions(+), 4 deletions(-) diff --git a/README.md b/README.md index 8809e8e..e3dfa95 100644 --- a/README.md +++ b/README.md @@ -32,9 +32,8 @@ Stay : 플레이어가 추가 카드를 원하지 않음, 딜러는 카드 합 1 - [] Ace 포함하는지 확인 - [] 21을 기준으로 Ace 1 또는 11로 설정 - [x] 카드 추가 요청 - -- [] 이름 - + - [x] 초기 카드 2장을 받는다 + - [x] Error: 3장 이상의 카드를 발급받으면 에러 - [] 카드 - 속성 - [x] 값 diff --git a/src/main/java/blackjack/domain/Player.java b/src/main/java/blackjack/domain/Player.java index 5fb8edc..af679ff 100644 --- a/src/main/java/blackjack/domain/Player.java +++ b/src/main/java/blackjack/domain/Player.java @@ -24,4 +24,12 @@ public List getCards() { public void addCard(Card card) { cards.add(card); } + + public void addFirstTwoCards(List firstTwoCards) { + if (firstTwoCards.size() != 2) { + throw new IllegalArgumentException("두장의 카드만 지급이 가능합니다"); + } + + cards.addAll(firstTwoCards); + } } diff --git a/src/test/java/blackjack/domain/PlayerTest.java b/src/test/java/blackjack/domain/PlayerTest.java index ac352ad..21a2af1 100644 --- a/src/test/java/blackjack/domain/PlayerTest.java +++ b/src/test/java/blackjack/domain/PlayerTest.java @@ -3,7 +3,11 @@ import org.junit.jupiter.api.DisplayName; import org.junit.jupiter.api.Test; +import java.util.ArrayList; +import java.util.List; + import static org.assertj.core.api.Assertions.assertThat; +import static org.assertj.core.api.Assertions.assertThatThrownBy; public class PlayerTest { @@ -22,7 +26,7 @@ void create() { } @Test - @DisplayName("카드를 추가로 한장 더 발급 받는다.") + @DisplayName("입력받은 한 장의 카드를 추가한다.") void addCard() { //given CardDeck cardDeck = new CardDeck(); @@ -34,4 +38,33 @@ void addCard() { //then assertThat(player.getCards()).hasSize(1); } + + @Test + @DisplayName("카드 덱에서 발급받은 카드 2장을 추가한다.") + void addFirstTwoCards() { + //given + CardDeck cardDeck = new CardDeck(); + Player player = new Player("pobi"); + + //when + player.addFirstTwoCards(cardDeck.getFirstTwoCards()); + + //then + assertThat(player.getCards()).hasSize(2); + } + + @Test + @DisplayName("3장 이상의 카드를 발급받는 경우 에러가 발생한다.") + void addOverThreeCards() { + //given + CardDeck cardDeck = new CardDeck(); + Player player = new Player("pobi"); + List cards = new ArrayList<>(); + cards.add(cardDeck.getAdditionalCard()); + cards.add(cardDeck.getAdditionalCard()); + cards.add(cardDeck.getAdditionalCard()); + + //when //then + assertThatThrownBy(() -> player.addFirstTwoCards(cards)).isInstanceOf(IllegalArgumentException.class); + } } From ed21358197fbf8c6db7cd2a8a14aac56e570ee83 Mon Sep 17 00:00:00 2001 From: Beenie93 Date: Wed, 28 Jul 2021 20:04:26 +0900 Subject: [PATCH 12/80] =?UTF-8?q?feat:=20=ED=94=8C=EB=A0=88=EC=9D=B4?= =?UTF-8?q?=EC=96=B4=EA=B0=80=20=EA=B0=80=EC=A7=84=20=EC=B9=B4=EB=93=9C=20?= =?UTF-8?q?=ED=95=A9=EC=9D=84=20=EB=B0=98=ED=99=98=ED=95=98=EB=8A=94=20?= =?UTF-8?q?=ED=85=8C=EC=8A=A4=ED=8A=B8=20=EB=B0=8F=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 +- src/main/java/blackjack/domain/Player.java | 6 ++++++ src/test/java/blackjack/domain/PlayerTest.java | 17 +++++++++++++++++ 3 files changed, 24 insertions(+), 1 deletion(-) diff --git a/README.md b/README.md index e3dfa95..2860f41 100644 --- a/README.md +++ b/README.md @@ -26,7 +26,7 @@ Stay : 플레이어가 추가 카드를 원하지 않음, 딜러는 카드 합 1 - [x] 카드 목록 - 기능 - - [] 모든 카드 합을 계산 + - [x] 모든 카드 합을 계산 - [] 처음 두 장의 카드 합 21인지 확인 - [] 모든 카드 합이 21을 초과하는지 확인 - [] Ace 포함하는지 확인 diff --git a/src/main/java/blackjack/domain/Player.java b/src/main/java/blackjack/domain/Player.java index af679ff..cff055b 100644 --- a/src/main/java/blackjack/domain/Player.java +++ b/src/main/java/blackjack/domain/Player.java @@ -32,4 +32,10 @@ public void addFirstTwoCards(List firstTwoCards) { cards.addAll(firstTwoCards); } + + public int sumScore() { + return cards.stream() + .mapToInt(Card::getScore) + .sum(); + } } diff --git a/src/test/java/blackjack/domain/PlayerTest.java b/src/test/java/blackjack/domain/PlayerTest.java index 21a2af1..5ff64dd 100644 --- a/src/test/java/blackjack/domain/PlayerTest.java +++ b/src/test/java/blackjack/domain/PlayerTest.java @@ -1,9 +1,12 @@ package blackjack.domain; +import blackjack.enums.CardScore; +import blackjack.enums.CardType; import org.junit.jupiter.api.DisplayName; import org.junit.jupiter.api.Test; import java.util.ArrayList; +import java.util.Arrays; import java.util.List; import static org.assertj.core.api.Assertions.assertThat; @@ -67,4 +70,18 @@ void addOverThreeCards() { //when //then assertThatThrownBy(() -> player.addFirstTwoCards(cards)).isInstanceOf(IllegalArgumentException.class); } + + @Test + @DisplayName("플레이어가 가진 카드의 합을 반환한다.") + void sumScore() { + //given + Player player = new Player("pobi"); + player.addFirstTwoCards(Arrays.asList(new Card(CardScore.J, CardType.CLUB), new Card(CardScore.FIVE, CardType.CLUB))); + + //when + int sum = player.sumScore(); + + //then + assertThat(sum).isEqualTo(15); + } } From 022020fc4dd7b3979b1d4b2fd478eb55bbaa85fd Mon Sep 17 00:00:00 2001 From: Beenie93 Date: Wed, 28 Jul 2021 20:30:33 +0900 Subject: [PATCH 13/80] =?UTF-8?q?feat:=20=EC=B0=B8=EA=B0=80=EC=9E=90=20?= =?UTF-8?q?=EC=9D=B4=EB=A6=84=20=EB=A6=AC=EC=8A=A4=ED=8A=B8=EB=A1=9C=20?= =?UTF-8?q?=EB=93=B1=EB=A1=9D=ED=95=98=EB=A9=B4=20=EA=B2=8C=EC=9E=84?= =?UTF-8?q?=EC=97=90=20=EC=B0=B8=EA=B0=80=EC=9E=90=EB=93=A4=EC=9D=B4=20?= =?UTF-8?q?=EC=83=9D=EC=84=B1=EB=90=98=EB=8A=94=20=ED=85=8C=EC=8A=A4?= =?UTF-8?q?=ED=8A=B8=20=EB=B0=8F=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 +- .../java/blackjack/domain/GameService.java | 22 ++++++++++++++ .../blackjack/domain/GameServiceTest.java | 29 +++++++++++++++++++ 3 files changed, 52 insertions(+), 1 deletion(-) create mode 100644 src/main/java/blackjack/domain/GameService.java create mode 100644 src/test/java/blackjack/domain/GameServiceTest.java diff --git a/README.md b/README.md index 2860f41..37d55f8 100644 --- a/README.md +++ b/README.md @@ -55,7 +55,7 @@ Stay : 플레이어가 추가 카드를 원하지 않음, 딜러는 카드 합 1 - [] 게임 시스템 - 속성 - - [] 참여자 목록 + - [x] 참여자 목록 - 기능 - [] 카드 지급 diff --git a/src/main/java/blackjack/domain/GameService.java b/src/main/java/blackjack/domain/GameService.java new file mode 100644 index 0000000..73f0b32 --- /dev/null +++ b/src/main/java/blackjack/domain/GameService.java @@ -0,0 +1,22 @@ +package blackjack.domain; + +import java.util.ArrayList; +import java.util.List; + +public class GameService { + private final List players = new ArrayList<>(); + + public GameService(List playerNames) { + init(playerNames); + } + + private void init(List playerNames) { + playerNames.forEach(playerName -> { + players.add(new Player(playerName)); + }); + } + + public List getPlayers() { + return players; + } +} diff --git a/src/test/java/blackjack/domain/GameServiceTest.java b/src/test/java/blackjack/domain/GameServiceTest.java new file mode 100644 index 0000000..3bb3eac --- /dev/null +++ b/src/test/java/blackjack/domain/GameServiceTest.java @@ -0,0 +1,29 @@ +package blackjack.domain; + +import org.junit.jupiter.api.DisplayName; +import org.junit.jupiter.api.Test; + +import java.util.Arrays; +import java.util.List; + +import static org.assertj.core.api.Assertions.assertThat; + +public class GameServiceTest { + + @Test + @DisplayName("참가자 이름 리스트로 등록하면 게임에 참가자들이 생성된다") + void create() { + //given + GameService gameService = new GameService(Arrays.asList("pobi", "jason")); + + //when + List players = gameService.getPlayers(); + + //then + assertThat(players).hasSize(2) + .extracting("name") + .contains("pobi", "jason"); + assertThat(players.get(0).getName()).isEqualTo("pobi"); + assertThat(players.get(1).getName()).isEqualTo("jason"); + } +} From 4dd158f60166637a5fc67fba5a0cd389963001b5 Mon Sep 17 00:00:00 2001 From: Beenie93 Date: Wed, 28 Jul 2021 20:54:03 +0900 Subject: [PATCH 14/80] =?UTF-8?q?feat:=20=EC=B9=B4=EB=93=9C=EA=B0=80=20Ace?= =?UTF-8?q?=EC=9D=B8=EC=A7=80=20=ED=99=95=EC=9D=B8=ED=95=98=EB=8A=94=20?= =?UTF-8?q?=ED=85=8C=EC=8A=A4=ED=8A=B8=20=EB=B0=8F=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 | 7 ++++--- src/main/java/blackjack/domain/Card.java | 4 ++++ src/main/java/blackjack/domain/Player.java | 5 +++++ src/test/java/blackjack/domain/CardTest.java | 14 ++++++++++++++ src/test/java/blackjack/domain/PlayerTest.java | 14 ++++++++++++++ 5 files changed, 41 insertions(+), 3 deletions(-) diff --git a/README.md b/README.md index 37d55f8..79fa649 100644 --- a/README.md +++ b/README.md @@ -29,19 +29,20 @@ Stay : 플레이어가 추가 카드를 원하지 않음, 딜러는 카드 합 1 - [x] 모든 카드 합을 계산 - [] 처음 두 장의 카드 합 21인지 확인 - [] 모든 카드 합이 21을 초과하는지 확인 - - [] Ace 포함하는지 확인 + - [x] Ace 포함하는지 확인 - [] 21을 기준으로 Ace 1 또는 11로 설정 - [x] 카드 추가 요청 - [x] 초기 카드 2장을 받는다 - [x] Error: 3장 이상의 카드를 발급받으면 에러 + - [] 카드 - 속성 - [x] 값 - [x] 타입 - 기능 - - [X] 카드의 값 반환 - - [] Ace인지 확인 + - [x] 카드의 값 반환 + - [x] Ace인지 확인 - [x] 카드 팩 - 속성 diff --git a/src/main/java/blackjack/domain/Card.java b/src/main/java/blackjack/domain/Card.java index 3f42950..ab190ad 100644 --- a/src/main/java/blackjack/domain/Card.java +++ b/src/main/java/blackjack/domain/Card.java @@ -15,4 +15,8 @@ public Card(CardScore score, CardType type) { public int getScore() { return score.getScore(); } + + public boolean isAce() { + return score.equals(CardScore.A); + } } diff --git a/src/main/java/blackjack/domain/Player.java b/src/main/java/blackjack/domain/Player.java index cff055b..4bc2428 100644 --- a/src/main/java/blackjack/domain/Player.java +++ b/src/main/java/blackjack/domain/Player.java @@ -38,4 +38,9 @@ public int sumScore() { .mapToInt(Card::getScore) .sum(); } + + public boolean hasAce() { + return cards.stream() + .anyMatch(Card::isAce); + } } diff --git a/src/test/java/blackjack/domain/CardTest.java b/src/test/java/blackjack/domain/CardTest.java index d2878c6..2c7d428 100644 --- a/src/test/java/blackjack/domain/CardTest.java +++ b/src/test/java/blackjack/domain/CardTest.java @@ -3,6 +3,7 @@ import blackjack.enums.CardScore; import blackjack.enums.CardType; import org.junit.jupiter.api.DisplayName; +import org.junit.jupiter.api.Test; import org.junit.jupiter.params.ParameterizedTest; import org.junit.jupiter.params.provider.CsvSource; @@ -23,4 +24,17 @@ void getScore(String inputScore, int expectedValue) { //then assertThat(score).isEqualTo(expectedValue); } + + @Test + @DisplayName("Ace일 경우 참을 반환한다.") + void isAce() { + //given + Card card = new Card(CardScore.A, CardType.CLUB); + + //when + boolean isAce = card.isAce(); + + //then + assertThat(isAce).isTrue(); + } } diff --git a/src/test/java/blackjack/domain/PlayerTest.java b/src/test/java/blackjack/domain/PlayerTest.java index 5ff64dd..24b92a1 100644 --- a/src/test/java/blackjack/domain/PlayerTest.java +++ b/src/test/java/blackjack/domain/PlayerTest.java @@ -84,4 +84,18 @@ void sumScore() { //then assertThat(sum).isEqualTo(15); } + + @Test + @DisplayName("카드 중 Ace가 있을 경우 참을 반환한다.") + void hasAce() { + //given + Player player = new Player("pobi"); + player.addCard(new Card(CardScore.A, CardType.HEART)); + + //when + boolean hasAce = player.hasAce(); + + //then + assertThat(hasAce).isTrue(); + } } From 926367ed364f2f4873730b83ee0e25c1ca72a444 Mon Sep 17 00:00:00 2001 From: Beenie93 Date: Wed, 28 Jul 2021 21:32:35 +0900 Subject: [PATCH 15/80] =?UTF-8?q?feat:=20=EC=B9=B4=EB=93=9C=EC=9D=98=20?= =?UTF-8?q?=ED=95=A9=EC=9D=84=2021=EC=9D=84=20=EA=B8=B0=EC=A4=80=EC=9C=BC?= =?UTF-8?q?=EB=A1=9C=20Ace=201=20=EB=98=90=EB=8A=94=2011=EB=A1=9C=20?= =?UTF-8?q?=EC=84=A4=EC=A0=95=ED=95=98=EB=8A=94=20=ED=85=8C=EC=8A=A4?= =?UTF-8?q?=ED=8A=B8=20=EB=B0=8F=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 +- .../java/blackjack/domain/GameService.java | 3 +++ src/main/java/blackjack/domain/Player.java | 11 ++++++++- .../java/blackjack/domain/PlayerTest.java | 24 +++++++++++++++++++ 4 files changed, 38 insertions(+), 2 deletions(-) diff --git a/README.md b/README.md index 79fa649..92739ff 100644 --- a/README.md +++ b/README.md @@ -30,7 +30,7 @@ Stay : 플레이어가 추가 카드를 원하지 않음, 딜러는 카드 합 1 - [] 처음 두 장의 카드 합 21인지 확인 - [] 모든 카드 합이 21을 초과하는지 확인 - [x] Ace 포함하는지 확인 - - [] 21을 기준으로 Ace 1 또는 11로 설정 + - [x] 21을 기준으로 Ace 1 또는 11로 설정 - [x] 카드 추가 요청 - [x] 초기 카드 2장을 받는다 - [x] Error: 3장 이상의 카드를 발급받으면 에러 diff --git a/src/main/java/blackjack/domain/GameService.java b/src/main/java/blackjack/domain/GameService.java index 73f0b32..688fa8c 100644 --- a/src/main/java/blackjack/domain/GameService.java +++ b/src/main/java/blackjack/domain/GameService.java @@ -4,6 +4,9 @@ import java.util.List; public class GameService { + static final int BLACKJACK = 21; + static final int ACE_BONUS_SCORE = 10; + private final List players = new ArrayList<>(); public GameService(List playerNames) { diff --git a/src/main/java/blackjack/domain/Player.java b/src/main/java/blackjack/domain/Player.java index 4bc2428..dde8d8b 100644 --- a/src/main/java/blackjack/domain/Player.java +++ b/src/main/java/blackjack/domain/Player.java @@ -4,6 +4,9 @@ import java.util.Collections; import java.util.List; +import static blackjack.domain.GameService.ACE_BONUS_SCORE; +import static blackjack.domain.GameService.BLACKJACK; + public class Player { private final String name; @@ -34,9 +37,15 @@ public void addFirstTwoCards(List firstTwoCards) { } public int sumScore() { - return cards.stream() + int sum = cards.stream() .mapToInt(Card::getScore) .sum(); + + if (hasAce() && sum + ACE_BONUS_SCORE <= BLACKJACK) { + sum += ACE_BONUS_SCORE; + } + + return sum; } public boolean hasAce() { diff --git a/src/test/java/blackjack/domain/PlayerTest.java b/src/test/java/blackjack/domain/PlayerTest.java index 24b92a1..4a7b0f6 100644 --- a/src/test/java/blackjack/domain/PlayerTest.java +++ b/src/test/java/blackjack/domain/PlayerTest.java @@ -98,4 +98,28 @@ void hasAce() { //then assertThat(hasAce).isTrue(); } + + @Test + @DisplayName("플레이어가 ace카드를 가지고 있다면 21을 초과하지 않는 최대점수를 리턴한다") + void sumScoreWithAce() { + //given + Player player1 = new Player("jason1"); + Player player2 = new Player("jason2"); + Player player3 = new Player("jason3"); + + player1.addFirstTwoCards(Arrays.asList(new Card(CardScore.A, CardType.DIAMOND), new Card(CardScore.Q, CardType.HEART))); + player2.addFirstTwoCards(Arrays.asList(new Card(CardScore.A, CardType.DIAMOND), new Card(CardScore.TWO, CardType.HEART))); + player3.addFirstTwoCards(Arrays.asList(new Card(CardScore.A, CardType.DIAMOND), new Card(CardScore.THREE, CardType.HEART))); + player3.addCard(new Card(CardScore.TEN, CardType.HEART)); + + //when + int score1 = player1.sumScore(); + int score2 = player2.sumScore(); + int score3 = player3.sumScore(); + + //then + assertThat(score1).isEqualTo(21); + assertThat(score2).isEqualTo(13); + assertThat(score3).isEqualTo(14); + } } From 7c1f065a2a374668a27528ecff9434483a9fed23 Mon Sep 17 00:00:00 2001 From: Beenie93 Date: Wed, 28 Jul 2021 21:52:33 +0900 Subject: [PATCH 16/80] =?UTF-8?q?feat:=20=EC=B9=B4=EB=93=9C=EC=9D=98=20?= =?UTF-8?q?=ED=95=A9=EC=9D=B4=2021=EC=9D=84=20=EC=B4=88=EA=B3=BC=ED=95=A0?= =?UTF-8?q?=20=EA=B2=BD=EC=9A=B0=20=EC=B0=B8=EC=9D=84=20=EB=B0=98=ED=99=98?= =?UTF-8?q?=ED=95=98=EB=8A=94=20=ED=85=8C=EC=8A=A4=ED=8A=B8=20=EB=B0=8F=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 +- src/main/java/blackjack/domain/Player.java | 5 +++ .../java/blackjack/domain/PlayerTest.java | 41 +++++++++++++++++++ 3 files changed, 47 insertions(+), 1 deletion(-) diff --git a/README.md b/README.md index 92739ff..2f3888b 100644 --- a/README.md +++ b/README.md @@ -28,7 +28,7 @@ Stay : 플레이어가 추가 카드를 원하지 않음, 딜러는 카드 합 1 - 기능 - [x] 모든 카드 합을 계산 - [] 처음 두 장의 카드 합 21인지 확인 - - [] 모든 카드 합이 21을 초과하는지 확인 + - [x] 모든 카드 합이 21을 초과하는지 확인 - [x] Ace 포함하는지 확인 - [x] 21을 기준으로 Ace 1 또는 11로 설정 - [x] 카드 추가 요청 diff --git a/src/main/java/blackjack/domain/Player.java b/src/main/java/blackjack/domain/Player.java index dde8d8b..546bee3 100644 --- a/src/main/java/blackjack/domain/Player.java +++ b/src/main/java/blackjack/domain/Player.java @@ -52,4 +52,9 @@ public boolean hasAce() { return cards.stream() .anyMatch(Card::isAce); } + + public boolean isBurst(int sum) { + return sum > BLACKJACK; + + } } diff --git a/src/test/java/blackjack/domain/PlayerTest.java b/src/test/java/blackjack/domain/PlayerTest.java index 4a7b0f6..cfe1c14 100644 --- a/src/test/java/blackjack/domain/PlayerTest.java +++ b/src/test/java/blackjack/domain/PlayerTest.java @@ -122,4 +122,45 @@ void sumScoreWithAce() { assertThat(score2).isEqualTo(13); assertThat(score3).isEqualTo(14); } + + @Test + @DisplayName("게임에서 A만 연속으로 나오는 경우 21을 초과하지 않는 최대점수를 리턴한다") + void sumScoreOnlyWithAce() { + //given + Player player1 = new Player("pobi1"); + Player player2 = new Player("pobi2"); + Player player3 = new Player("pobi3"); + player1.addFirstTwoCards(Arrays.asList(new Card(CardScore.A, CardType.HEART), new Card(CardScore.A, CardType.CLUB))); + player2.addFirstTwoCards(Arrays.asList(new Card(CardScore.A, CardType.HEART), new Card(CardScore.A, CardType.CLUB))); + player2.addCard(new Card(CardScore.A, CardType.DIAMOND)); + player3.addFirstTwoCards(Arrays.asList(new Card(CardScore.A, CardType.HEART), new Card(CardScore.A, CardType.CLUB))); + player3.addCard(new Card(CardScore.A, CardType.DIAMOND)); + player3.addCard(new Card(CardScore.A, CardType.SPADE)); + + //when + int score1 = player1.sumScore(); + int score2 = player2.sumScore(); + int score3 = player3.sumScore(); + + //then + assertThat(score1).isEqualTo(12); + assertThat(score2).isEqualTo(13); + assertThat(score3).isEqualTo(14); + } + + @Test + @DisplayName("카드 값의 합이 21을 초과할 경우 참을 반환한다.") + void isBurst() { + //given + Player player = new Player("pobi"); + player.addFirstTwoCards(Arrays.asList(new Card(CardScore.Q, CardType.CLUB), new Card(CardScore.J, CardType.DIAMOND))); + player.addCard(new Card(CardScore.TWO, CardType.CLUB)); + int sum = player.sumScore(); + + //when + boolean isBurst = player.isBurst(sum); + + //then + assertThat(isBurst).isTrue(); + } } From eef0805a9eecc7d5561333808d0cad7cd98b5e40 Mon Sep 17 00:00:00 2001 From: Beenie93 Date: Fri, 30 Jul 2021 00:49:26 +0900 Subject: [PATCH 17/80] =?UTF-8?q?=EC=B4=88=EA=B8=B0=ED=99=94?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- README.md | 87 ++++++--- src/main/java/blackjack/domain/Card.java | 22 --- src/main/java/blackjack/domain/CardDeck.java | 54 ------ .../java/blackjack/domain/GameService.java | 25 --- src/main/java/blackjack/domain/Player.java | 60 ------- src/main/java/blackjack/enums/CardScore.java | 33 ---- src/main/java/blackjack/enums/CardType.java | 18 -- src/main/java/blackjack/view/InputView.java | 34 ---- src/main/java/blackjack/view/OutputView.java | 10 -- .../java/blackjack/domain/CardDeckTest.java | 65 ------- src/test/java/blackjack/domain/CardTest.java | 40 ----- .../blackjack/domain/GameServiceTest.java | 29 --- .../java/blackjack/domain/PlayerTest.java | 166 ------------------ 13 files changed, 58 insertions(+), 585 deletions(-) delete mode 100644 src/main/java/blackjack/domain/Card.java delete mode 100644 src/main/java/blackjack/domain/CardDeck.java delete mode 100644 src/main/java/blackjack/domain/GameService.java delete mode 100644 src/main/java/blackjack/domain/Player.java delete mode 100644 src/main/java/blackjack/enums/CardScore.java delete mode 100644 src/main/java/blackjack/enums/CardType.java delete mode 100644 src/main/java/blackjack/view/InputView.java delete mode 100644 src/main/java/blackjack/view/OutputView.java delete mode 100644 src/test/java/blackjack/domain/CardDeckTest.java delete mode 100644 src/test/java/blackjack/domain/CardTest.java delete mode 100644 src/test/java/blackjack/domain/GameServiceTest.java delete mode 100644 src/test/java/blackjack/domain/PlayerTest.java diff --git a/README.md b/README.md index 2f3888b..1833ab6 100644 --- a/README.md +++ b/README.md @@ -6,58 +6,87 @@ Bust : 카드 합 21 초과 => 패 Push : 플레이어, 딜러 카드 합이 같음 => 무승부 Hit : 플레이어의 카드 2장의 합이 21을 초과하지 않을 경우, 추가 카드를 요청 Stay : 플레이어가 추가 카드를 원하지 않음, 딜러는 카드 합 17 이상이면 추가 카드를 얻을 수 없음 -최대 인원 : 5명 # 구현해야 할 기능 목록 -- [x] 입력 - - [x] 플레이어 이름 - - [x] 플레이어(딜러 제외) 추가 카드 요청 여부 +- [] 입력 + - [] 플레이어 이름 + - [] 플레이어(딜러 제외) 추가 카드 요청 여부 - [] 출력 - - [x] 각 플레이어(딜러 포함)에게 2장의 카드 지급 알림 + - [] 각 플레이어(딜러 포함)에게 2장의 카드 지급 알림 - [] 각 플레이어(딜러 포함)가 가진 카드 - [] 딜러의 추가 카드 지급 여부 결과 - [] 각 플레이어(딜러 포함)의 총 카드의 합 - [] 최종 승패 결과 -- [] 게임 참여자 +- [] 상태 + - 기능 + - [] 첫 카드 2장 발급 + - [] 추가 카드 발급 + - [] 추가 카드 발급 거부 + - [] 모든 카드 합 계산 + - [] 게임 종료 상태인지 확인 + +- [] 게임 참여 상태 (Running) + - [] 시작 상태 + - [] 카드 추가 받은 상태 + +- [] 게임 종료 상태 (Finished) + - [] Blackjack 상태 + - [] Burst 상태 + - [] Stay 상태 + +- [] 플레이어 - 속성 - - [x] 이름 - - [x] 카드 목록 + - [] 이름 + - [] 카드 목록 - 기능 - - [x] 모든 카드 합을 계산 - - [] 처음 두 장의 카드 합 21인지 확인 - - [x] 모든 카드 합이 21을 초과하는지 확인 - - [x] Ace 포함하는지 확인 - - [x] 21을 기준으로 Ace 1 또는 11로 설정 - - [x] 카드 추가 요청 - - [x] 초기 카드 2장을 받는다 - - [x] Error: 3장 이상의 카드를 발급받으면 에러 - + - [] 초기 카드 2장을 받는다 + - [] 카드 추가 요청 + +- [] 딜러 + - 속성 + - [] 이름 + - [] 카드 목록 + + - 기능 + - [] 초기 카드 2장을 받는다 + - [] 카드 추가 요청 + - [] ERROR: 합이 17 이상이면 추가 카드를 얻을 수 없음 + - [] 카드 - 속성 - - [x] 값 - - [x] 타입 + - [] 값 + - [] 타입 - 기능 - - [x] 카드의 값 반환 - - [x] Ace인지 확인 + - [] 카드의 값 반환 + +- [] 현재까지 받은 카드 목록 + - 속성 + - [] 현재까지 받은 카드 목록 + + - 기능 + - [] Ace 포함하는지 확인 + - [] 처음 두 장의 카드 합 21인지 확인 + - [] 모든 카드 합이 21을 초과하는지 확인 + - [] 21을 기준으로 Ace 1 또는 11로 설정 -- [x] 카드 팩 +- [] 카드 덱 - 속성 - - [x] 52개의 카드 + - [] 카드 52장 - 기능 - - [x] 52개의 카드 생성 - - [x] 2개의 랜덤 카드 반환 - - [x] 추가 카드 반환 - - [x] ERROR: 반환할 수 있는 카드가 없을 경우 + - [] 52장 카드 생성 + - [] 처음 2장 카드 반환 + - [] 추가 카드 반환 + - [] ERROR: 반환할 수 있는 카드가 없을 경우 - [] 게임 시스템 - 속성 - - [x] 참여자 목록 + - [] 참여자 목록 - 기능 - [] 카드 지급 - - [] 승, 패 여부 + - [] 참여자 점수 비교 diff --git a/src/main/java/blackjack/domain/Card.java b/src/main/java/blackjack/domain/Card.java deleted file mode 100644 index ab190ad..0000000 --- a/src/main/java/blackjack/domain/Card.java +++ /dev/null @@ -1,22 +0,0 @@ -package blackjack.domain; - -import blackjack.enums.CardScore; -import blackjack.enums.CardType; - -public class Card { - private final CardScore score; - private final CardType type; - - public Card(CardScore score, CardType type) { - this.score = score; - this.type = type; - } - - public int getScore() { - return score.getScore(); - } - - public boolean isAce() { - return score.equals(CardScore.A); - } -} diff --git a/src/main/java/blackjack/domain/CardDeck.java b/src/main/java/blackjack/domain/CardDeck.java deleted file mode 100644 index c1d3db5..0000000 --- a/src/main/java/blackjack/domain/CardDeck.java +++ /dev/null @@ -1,54 +0,0 @@ -package blackjack.domain; - -import blackjack.enums.CardScore; -import blackjack.enums.CardType; - -import java.util.ArrayList; -import java.util.Arrays; -import java.util.Collections; -import java.util.List; -import java.util.stream.Collectors; -import java.util.stream.IntStream; - -public class CardDeck { - - private static final int FIRST_CARDS_SETTING_COUNT = 2; - - private final List cards = new ArrayList<>(); - private int size; - - public CardDeck() { - init(); - } - - private void init() { - Arrays.stream(CardScore.values()) - .forEach(cardScore -> { - Arrays.stream(CardType.values()).forEach(cardType -> cards.add(new Card(cardScore, cardType))); - }); - size = cards.size(); - suffleCard(); - } - - public int getSize() { - return size; - } - - private void suffleCard() { - Collections.shuffle(cards); - } - - public List getFirstTwoCards() { - return IntStream.range(0, FIRST_CARDS_SETTING_COUNT) - .mapToObj(i -> getAdditionalCard()) - .collect(Collectors.toList()); - } - - public Card getAdditionalCard() { - if (size < 1) { - throw new IndexOutOfBoundsException("더이상 카드가 없습니다."); - } - - return cards.get(--size); - } -} diff --git a/src/main/java/blackjack/domain/GameService.java b/src/main/java/blackjack/domain/GameService.java deleted file mode 100644 index 688fa8c..0000000 --- a/src/main/java/blackjack/domain/GameService.java +++ /dev/null @@ -1,25 +0,0 @@ -package blackjack.domain; - -import java.util.ArrayList; -import java.util.List; - -public class GameService { - static final int BLACKJACK = 21; - static final int ACE_BONUS_SCORE = 10; - - private final List players = new ArrayList<>(); - - public GameService(List playerNames) { - init(playerNames); - } - - private void init(List playerNames) { - playerNames.forEach(playerName -> { - players.add(new Player(playerName)); - }); - } - - public List getPlayers() { - return players; - } -} diff --git a/src/main/java/blackjack/domain/Player.java b/src/main/java/blackjack/domain/Player.java deleted file mode 100644 index 546bee3..0000000 --- a/src/main/java/blackjack/domain/Player.java +++ /dev/null @@ -1,60 +0,0 @@ -package blackjack.domain; - -import java.util.ArrayList; -import java.util.Collections; -import java.util.List; - -import static blackjack.domain.GameService.ACE_BONUS_SCORE; -import static blackjack.domain.GameService.BLACKJACK; - -public class Player { - - private final String name; - private final List cards = new ArrayList<>(); - - public Player(String name) { - this.name = name; - } - - public String getName() { - return name; - } - - public List getCards() { - return Collections.unmodifiableList(cards); - } - - public void addCard(Card card) { - cards.add(card); - } - - public void addFirstTwoCards(List firstTwoCards) { - if (firstTwoCards.size() != 2) { - throw new IllegalArgumentException("두장의 카드만 지급이 가능합니다"); - } - - cards.addAll(firstTwoCards); - } - - public int sumScore() { - int sum = cards.stream() - .mapToInt(Card::getScore) - .sum(); - - if (hasAce() && sum + ACE_BONUS_SCORE <= BLACKJACK) { - sum += ACE_BONUS_SCORE; - } - - return sum; - } - - public boolean hasAce() { - return cards.stream() - .anyMatch(Card::isAce); - } - - public boolean isBurst(int sum) { - return sum > BLACKJACK; - - } -} diff --git a/src/main/java/blackjack/enums/CardScore.java b/src/main/java/blackjack/enums/CardScore.java deleted file mode 100644 index 269b6e9..0000000 --- a/src/main/java/blackjack/enums/CardScore.java +++ /dev/null @@ -1,33 +0,0 @@ -package blackjack.enums; - -public enum CardScore { - A("A", 1), - TWO("2", 2), - THREE("3", 3), - FOUR("4", 4), - FIVE("5", 5), - SIX("6", 6), - SEVEN("7", 7), - EIGHT("8", 8), - NINE("9", 9), - TEN("10", 10), - J("J", 10), - Q("Q", 10), - K("K", 10); - - private final String denomination; - private final int score; - - CardScore(String denomination, int score) { - this.denomination = denomination; - this.score = score; - } - - public String getDenomination() { - return denomination; - } - - public int getScore() { - return score; - } -} diff --git a/src/main/java/blackjack/enums/CardType.java b/src/main/java/blackjack/enums/CardType.java deleted file mode 100644 index bc784b1..0000000 --- a/src/main/java/blackjack/enums/CardType.java +++ /dev/null @@ -1,18 +0,0 @@ -package blackjack.enums; - -public enum CardType { - HEART("하트"), - DIAMOND("다이아몬드"), - CLUB("클로버"), - SPADE("스페이드"); - - private final String type; - - CardType(String type) { - this.type = type; - } - - public String getType() { - return type; - } -} diff --git a/src/main/java/blackjack/view/InputView.java b/src/main/java/blackjack/view/InputView.java deleted file mode 100644 index e49acd9..0000000 --- a/src/main/java/blackjack/view/InputView.java +++ /dev/null @@ -1,34 +0,0 @@ -package blackjack.view; - -import java.util.Arrays; -import java.util.List; -import java.util.Scanner; - -public class InputView { - private static final String SPLIT_DELIMITER = ","; - private static final Scanner scanner = new Scanner(System.in); - - public List getPlayerNames() { - System.out.println("게임에 참여할 사람의 이름을 입력하세요.(쉼표 기준으로 분리)"); - String playerNames = scanner.nextLine(); - checkBlank(playerNames); - return splitByComma(playerNames); - } - - public String getAdditionalCard(String playerName) { - System.out.printf("%s는 한장의 카드를 더 받겠습니까?(예는 y, 아니오는 n)", playerName); - String answer = scanner.nextLine(); - checkBlank(answer); - return answer; - } - - private void checkBlank(String input) { - if (input == null || input.isEmpty()) { - throw new IllegalArgumentException("한 글자 이상의 사람 이름을 입력해주세요"); - } - } - - private List splitByComma(String playerNames) { - return Arrays.asList(playerNames.split(SPLIT_DELIMITER)); - } -} diff --git a/src/main/java/blackjack/view/OutputView.java b/src/main/java/blackjack/view/OutputView.java deleted file mode 100644 index 57d5a22..0000000 --- a/src/main/java/blackjack/view/OutputView.java +++ /dev/null @@ -1,10 +0,0 @@ -package blackjack.view; - -import java.util.List; - -public class OutputView { - - public void printFirstTwoCards(List playerNames) { - System.out.printf("딜러와 %s에게 2장의 카드를 나누었습니다.", String.join(",", playerNames)); - } -} diff --git a/src/test/java/blackjack/domain/CardDeckTest.java b/src/test/java/blackjack/domain/CardDeckTest.java deleted file mode 100644 index 688e60c..0000000 --- a/src/test/java/blackjack/domain/CardDeckTest.java +++ /dev/null @@ -1,65 +0,0 @@ -package blackjack.domain; - -import org.junit.jupiter.api.DisplayName; -import org.junit.jupiter.api.Test; - -import java.util.List; -import java.util.stream.IntStream; - -import static org.assertj.core.api.Assertions.assertThat; -import static org.assertj.core.api.Assertions.assertThatThrownBy; - -class CardDeckTest { - @Test - @DisplayName("카드 덱을 생성하면 52장의 카드가 생긴다") - void create() { - //given - CardDeck cardDeck = new CardDeck(); - - //when - int size = cardDeck.getSize(); - - //then - assertThat(size).isEqualTo(52); - } - - @Test - @DisplayName("섞인카드 덱에서 2개의 카드를 순서대로 리턴한다.") - void getFirstTwoCards() { - //given - CardDeck cardDeck = new CardDeck(); - - //when - List myCards = cardDeck.getFirstTwoCards(); - - //then - assertThat(myCards).hasSize(2); - assertThat(cardDeck.getSize()).isEqualTo(50); - } - - @Test - @DisplayName("섞인 카드덱에서 1개의 카드를 반환한다") - void getAdditionalCard() { - //given - CardDeck cardDeck = new CardDeck(); - - //when - Card additionalCard = cardDeck.getAdditionalCard(); - - //then - assertThat(additionalCard).isNotNull(); - } - - @Test - @DisplayName("카드가 없을때 카드를 뽑으면 예외가 발생한다") - void getAdditionlCard_throw_exception_no_cards_left() { - //given - CardDeck cardDeck = new CardDeck(); - IntStream.range(0, 52).forEach(i -> cardDeck.getAdditionalCard()); - - //when //then - assertThatThrownBy(cardDeck::getAdditionalCard) - .isInstanceOf(IndexOutOfBoundsException.class) - .hasMessage("더이상 카드가 없습니다."); - } -} diff --git a/src/test/java/blackjack/domain/CardTest.java b/src/test/java/blackjack/domain/CardTest.java deleted file mode 100644 index 2c7d428..0000000 --- a/src/test/java/blackjack/domain/CardTest.java +++ /dev/null @@ -1,40 +0,0 @@ -package blackjack.domain; - -import blackjack.enums.CardScore; -import blackjack.enums.CardType; -import org.junit.jupiter.api.DisplayName; -import org.junit.jupiter.api.Test; -import org.junit.jupiter.params.ParameterizedTest; -import org.junit.jupiter.params.provider.CsvSource; - -import static org.assertj.core.api.Assertions.assertThat; - -public class CardTest { - - @ParameterizedTest - @CsvSource(value = {"TWO, 2", "THREE, 3", "FOUR, 4", "FIVE, 5", "SIX, 6", "A, 1", "K, 10", "Q, 10", "J, 10"}) - @DisplayName("카드의 점수를 반환한다.") - void getScore(String inputScore, int expectedValue) { - //given - Card card = new Card(CardScore.valueOf(inputScore), CardType.DIAMOND); - - //when - int score = card.getScore(); - - //then - assertThat(score).isEqualTo(expectedValue); - } - - @Test - @DisplayName("Ace일 경우 참을 반환한다.") - void isAce() { - //given - Card card = new Card(CardScore.A, CardType.CLUB); - - //when - boolean isAce = card.isAce(); - - //then - assertThat(isAce).isTrue(); - } -} diff --git a/src/test/java/blackjack/domain/GameServiceTest.java b/src/test/java/blackjack/domain/GameServiceTest.java deleted file mode 100644 index 3bb3eac..0000000 --- a/src/test/java/blackjack/domain/GameServiceTest.java +++ /dev/null @@ -1,29 +0,0 @@ -package blackjack.domain; - -import org.junit.jupiter.api.DisplayName; -import org.junit.jupiter.api.Test; - -import java.util.Arrays; -import java.util.List; - -import static org.assertj.core.api.Assertions.assertThat; - -public class GameServiceTest { - - @Test - @DisplayName("참가자 이름 리스트로 등록하면 게임에 참가자들이 생성된다") - void create() { - //given - GameService gameService = new GameService(Arrays.asList("pobi", "jason")); - - //when - List players = gameService.getPlayers(); - - //then - assertThat(players).hasSize(2) - .extracting("name") - .contains("pobi", "jason"); - assertThat(players.get(0).getName()).isEqualTo("pobi"); - assertThat(players.get(1).getName()).isEqualTo("jason"); - } -} diff --git a/src/test/java/blackjack/domain/PlayerTest.java b/src/test/java/blackjack/domain/PlayerTest.java deleted file mode 100644 index cfe1c14..0000000 --- a/src/test/java/blackjack/domain/PlayerTest.java +++ /dev/null @@ -1,166 +0,0 @@ -package blackjack.domain; - -import blackjack.enums.CardScore; -import blackjack.enums.CardType; -import org.junit.jupiter.api.DisplayName; -import org.junit.jupiter.api.Test; - -import java.util.ArrayList; -import java.util.Arrays; -import java.util.List; - -import static org.assertj.core.api.Assertions.assertThat; -import static org.assertj.core.api.Assertions.assertThatThrownBy; - -public class PlayerTest { - - @Test - @DisplayName("사람이름을 입력 받아서 입력받은 플레이어 객체를 만든다") - void create() { - //given - String name = "홍길동"; - - //when - Player player = new Player(name); - - //then - assertThat(player.getName()).isEqualTo(name); - assertThat(player.getCards()).hasSize(0); - } - - @Test - @DisplayName("입력받은 한 장의 카드를 추가한다.") - void addCard() { - //given - CardDeck cardDeck = new CardDeck(); - Player player = new Player("pobi"); - - //when - player.addCard(cardDeck.getAdditionalCard()); - - //then - assertThat(player.getCards()).hasSize(1); - } - - @Test - @DisplayName("카드 덱에서 발급받은 카드 2장을 추가한다.") - void addFirstTwoCards() { - //given - CardDeck cardDeck = new CardDeck(); - Player player = new Player("pobi"); - - //when - player.addFirstTwoCards(cardDeck.getFirstTwoCards()); - - //then - assertThat(player.getCards()).hasSize(2); - } - - @Test - @DisplayName("3장 이상의 카드를 발급받는 경우 에러가 발생한다.") - void addOverThreeCards() { - //given - CardDeck cardDeck = new CardDeck(); - Player player = new Player("pobi"); - List cards = new ArrayList<>(); - cards.add(cardDeck.getAdditionalCard()); - cards.add(cardDeck.getAdditionalCard()); - cards.add(cardDeck.getAdditionalCard()); - - //when //then - assertThatThrownBy(() -> player.addFirstTwoCards(cards)).isInstanceOf(IllegalArgumentException.class); - } - - @Test - @DisplayName("플레이어가 가진 카드의 합을 반환한다.") - void sumScore() { - //given - Player player = new Player("pobi"); - player.addFirstTwoCards(Arrays.asList(new Card(CardScore.J, CardType.CLUB), new Card(CardScore.FIVE, CardType.CLUB))); - - //when - int sum = player.sumScore(); - - //then - assertThat(sum).isEqualTo(15); - } - - @Test - @DisplayName("카드 중 Ace가 있을 경우 참을 반환한다.") - void hasAce() { - //given - Player player = new Player("pobi"); - player.addCard(new Card(CardScore.A, CardType.HEART)); - - //when - boolean hasAce = player.hasAce(); - - //then - assertThat(hasAce).isTrue(); - } - - @Test - @DisplayName("플레이어가 ace카드를 가지고 있다면 21을 초과하지 않는 최대점수를 리턴한다") - void sumScoreWithAce() { - //given - Player player1 = new Player("jason1"); - Player player2 = new Player("jason2"); - Player player3 = new Player("jason3"); - - player1.addFirstTwoCards(Arrays.asList(new Card(CardScore.A, CardType.DIAMOND), new Card(CardScore.Q, CardType.HEART))); - player2.addFirstTwoCards(Arrays.asList(new Card(CardScore.A, CardType.DIAMOND), new Card(CardScore.TWO, CardType.HEART))); - player3.addFirstTwoCards(Arrays.asList(new Card(CardScore.A, CardType.DIAMOND), new Card(CardScore.THREE, CardType.HEART))); - player3.addCard(new Card(CardScore.TEN, CardType.HEART)); - - //when - int score1 = player1.sumScore(); - int score2 = player2.sumScore(); - int score3 = player3.sumScore(); - - //then - assertThat(score1).isEqualTo(21); - assertThat(score2).isEqualTo(13); - assertThat(score3).isEqualTo(14); - } - - @Test - @DisplayName("게임에서 A만 연속으로 나오는 경우 21을 초과하지 않는 최대점수를 리턴한다") - void sumScoreOnlyWithAce() { - //given - Player player1 = new Player("pobi1"); - Player player2 = new Player("pobi2"); - Player player3 = new Player("pobi3"); - player1.addFirstTwoCards(Arrays.asList(new Card(CardScore.A, CardType.HEART), new Card(CardScore.A, CardType.CLUB))); - player2.addFirstTwoCards(Arrays.asList(new Card(CardScore.A, CardType.HEART), new Card(CardScore.A, CardType.CLUB))); - player2.addCard(new Card(CardScore.A, CardType.DIAMOND)); - player3.addFirstTwoCards(Arrays.asList(new Card(CardScore.A, CardType.HEART), new Card(CardScore.A, CardType.CLUB))); - player3.addCard(new Card(CardScore.A, CardType.DIAMOND)); - player3.addCard(new Card(CardScore.A, CardType.SPADE)); - - //when - int score1 = player1.sumScore(); - int score2 = player2.sumScore(); - int score3 = player3.sumScore(); - - //then - assertThat(score1).isEqualTo(12); - assertThat(score2).isEqualTo(13); - assertThat(score3).isEqualTo(14); - } - - @Test - @DisplayName("카드 값의 합이 21을 초과할 경우 참을 반환한다.") - void isBurst() { - //given - Player player = new Player("pobi"); - player.addFirstTwoCards(Arrays.asList(new Card(CardScore.Q, CardType.CLUB), new Card(CardScore.J, CardType.DIAMOND))); - player.addCard(new Card(CardScore.TWO, CardType.CLUB)); - int sum = player.sumScore(); - - //when - boolean isBurst = player.isBurst(sum); - - //then - assertThat(isBurst).isTrue(); - } -} From 05c16899f5d6fa7aa4287182fed75fc11a6968ce Mon Sep 17 00:00:00 2001 From: Beenie93 Date: Fri, 30 Jul 2021 01:31:54 +0900 Subject: [PATCH 18/80] =?UTF-8?q?feat:=20=EC=B9=B4=EB=93=9C=20=EC=A0=90?= =?UTF-8?q?=EC=88=98=20enum=20=EC=86=8D=EC=84=B1=20getter=20=ED=85=8C?= =?UTF-8?q?=EC=8A=A4=ED=8A=B8=20=EB=B0=8F=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 | 9 +++++ .../java/blackjack/domain/enums/Score.java | 33 ++++++++++++++++ .../blackjack/domain/enums/ScoreTest.java | 38 +++++++++++++++++++ 3 files changed, 80 insertions(+) create mode 100644 src/main/java/blackjack/domain/enums/Score.java create mode 100644 src/test/java/blackjack/domain/enums/ScoreTest.java diff --git a/README.md b/README.md index 1833ab6..36b96d5 100644 --- a/README.md +++ b/README.md @@ -63,6 +63,15 @@ Stay : 플레이어가 추가 카드를 원하지 않음, 딜러는 카드 합 1 - 기능 - [] 카드의 값 반환 +- [x] 점수 enum + - 속성 + - [x] 점수 이름(끗수) + - [x] 점수 + + - 기능 + - [x] 점수 이름 반환 + - [x] 점수 반환 + - [] 현재까지 받은 카드 목록 - 속성 - [] 현재까지 받은 카드 목록 diff --git a/src/main/java/blackjack/domain/enums/Score.java b/src/main/java/blackjack/domain/enums/Score.java new file mode 100644 index 0000000..6ff36ef --- /dev/null +++ b/src/main/java/blackjack/domain/enums/Score.java @@ -0,0 +1,33 @@ +package blackjack.domain.enums; + +public enum Score { + A("A", 1), + TWO("2", 2), + THREE("3", 3), + FOUR("4", 4), + FIVE("5", 5), + SIX("6", 6), + SEVEN("7", 7), + EIGHT("8", 8), + NINE("9", 9), + TEN("10", 10), + J("J", 10), + Q("Q", 10), + K("K", 10); + + private final String denomination; + private final int score; + + Score(final String denomination, final int score) { + this.denomination = denomination; + this.score = score; + } + + public String getDenomination() { + return denomination; + } + + public int getScore() { + return score; + } +} diff --git a/src/test/java/blackjack/domain/enums/ScoreTest.java b/src/test/java/blackjack/domain/enums/ScoreTest.java new file mode 100644 index 0000000..0b4d437 --- /dev/null +++ b/src/test/java/blackjack/domain/enums/ScoreTest.java @@ -0,0 +1,38 @@ +package blackjack.domain.enums; + +import org.junit.jupiter.api.DisplayName; +import org.junit.jupiter.params.ParameterizedTest; +import org.junit.jupiter.params.provider.CsvSource; + +import static org.assertj.core.api.Assertions.assertThat; + +public class ScoreTest { + + @ParameterizedTest + @CsvSource(value = {"A, 1", "TWO, 2", "THREE, 3", "FOUR, 4", "FIVE, 5", "SIX, 6", "SEVEN, 7", "EIGHT, 8", "NINE, 9", "TEN, 10", "J, 10", "Q, 10", "K, 10"}) + @DisplayName("카드의 점수를 반환한다.") + void getScore(String scoreName, int expectedScore) { + //given + Score cardScore = Score.valueOf(scoreName); + + //when + int score = cardScore.getScore(); + + //then + assertThat(score).isEqualTo(expectedScore); + } + + @ParameterizedTest + @CsvSource(value = {"A, A", "TWO, 2", "THREE, 3", "FOUR, 4", "FIVE, 5", "SIX, 6", "SEVEN, 7", "EIGHT, 8", "NINE, 9", "TEN, 10", "J, J", "Q, Q", "K, K"}) + @DisplayName("카드의 점수 이름을 반환한다.") + void getDenomination(String scoreName, String expectedDenomiantion) { + //given + Score score = Score.valueOf(scoreName); + + //when + String denomination = score.getDenomination(); + + //then + assertThat(denomination).isEqualTo(expectedDenomiantion); + } +} From 32ba1acc3414cc0e19945d9a059fa0ee0ebd08e0 Mon Sep 17 00:00:00 2001 From: Beenie93 Date: Fri, 30 Jul 2021 01:36:03 +0900 Subject: [PATCH 19/80] =?UTF-8?q?feat:=20=EC=B9=B4=EB=93=9C=20=EB=AC=B4?= =?UTF-8?q?=EB=8A=AC=20enum=20=EC=86=8D=EC=84=B1=20getter=20=ED=85=8C?= =?UTF-8?q?=EC=8A=A4=ED=8A=B8=20=EB=B0=8F=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 | 7 ++++++ .../java/blackjack/domain/enums/Suit.java | 18 ++++++++++++++ .../java/blackjack/domain/enums/SuitTest.java | 24 +++++++++++++++++++ 3 files changed, 49 insertions(+) create mode 100644 src/main/java/blackjack/domain/enums/Suit.java create mode 100644 src/test/java/blackjack/domain/enums/SuitTest.java diff --git a/README.md b/README.md index 36b96d5..37d647a 100644 --- a/README.md +++ b/README.md @@ -72,6 +72,13 @@ Stay : 플레이어가 추가 카드를 원하지 않음, 딜러는 카드 합 1 - [x] 점수 이름 반환 - [x] 점수 반환 +- [x] 무늬 enum + - 속성 + - [x] 무늬 + + - 기능 + - [x] 무늬 이름 반환 + - [] 현재까지 받은 카드 목록 - 속성 - [] 현재까지 받은 카드 목록 diff --git a/src/main/java/blackjack/domain/enums/Suit.java b/src/main/java/blackjack/domain/enums/Suit.java new file mode 100644 index 0000000..8b26e86 --- /dev/null +++ b/src/main/java/blackjack/domain/enums/Suit.java @@ -0,0 +1,18 @@ +package blackjack.domain.enums; + +public enum Suit { + SPADE("스페이드"), + DIAMOND("다이아몬드"), + CLUB("클로버"), + HEART("하트"); + + private final String suit; + + Suit(final String suit) { + this.suit = suit; + } + + public String getSuit() { + return suit; + } +} diff --git a/src/test/java/blackjack/domain/enums/SuitTest.java b/src/test/java/blackjack/domain/enums/SuitTest.java new file mode 100644 index 0000000..1d24f67 --- /dev/null +++ b/src/test/java/blackjack/domain/enums/SuitTest.java @@ -0,0 +1,24 @@ +package blackjack.domain.enums; + +import org.junit.jupiter.api.DisplayName; +import org.junit.jupiter.params.ParameterizedTest; +import org.junit.jupiter.params.provider.CsvSource; + +import static org.assertj.core.api.Assertions.assertThat; + +public class SuitTest { + + @ParameterizedTest + @CsvSource(value = {"SPADE, 스페이드", "DIAMOND, 다이아몬드", "CLUB, 클로버", "HEART, 하트"}) + @DisplayName("카드 무늬 이름을 반환한다.") + void getSuit(String suitName, String expectedSuit) { + //given + Suit cardSuit = Suit.valueOf(suitName); + + //when + String suit = cardSuit.getSuit(); + + //then + assertThat(suit).isEqualTo(expectedSuit); + } +} From 099cfcee7221ff50e8c631124e449efaef52e986 Mon Sep 17 00:00:00 2001 From: Beenie93 Date: Fri, 30 Jul 2021 01:41:50 +0900 Subject: [PATCH 20/80] =?UTF-8?q?feat:=20=EC=B9=B4=EB=93=9C=20=EC=A0=90?= =?UTF-8?q?=EC=88=98=20enum=20=EA=B0=9D=EC=B2=B4=EA=B0=80=20Ace=EC=9D=B8?= =?UTF-8?q?=EC=A7=80=20=ED=99=95=EC=9D=B8=ED=95=98=EB=8A=94=20=ED=85=8C?= =?UTF-8?q?=EC=8A=A4=ED=8A=B8=20=EB=B0=8F=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 | 9 ++++----- src/main/java/blackjack/domain/enums/Score.java | 4 ++++ .../java/blackjack/domain/enums/ScoreTest.java | 14 ++++++++++++++ 3 files changed, 22 insertions(+), 5 deletions(-) diff --git a/README.md b/README.md index 37d647a..f3dac16 100644 --- a/README.md +++ b/README.md @@ -71,13 +71,12 @@ Stay : 플레이어가 추가 카드를 원하지 않음, 딜러는 카드 합 1 - 기능 - [x] 점수 이름 반환 - [x] 점수 반환 + - [x] ACE인지 확인 -- [x] 무늬 enum - - 속성 - - [x] 무늬 +- [x] 무늬 enum - 속성 - [x] 무늬 - - 기능 - - [x] 무늬 이름 반환 + - 기능 + - [x] 무늬 이름 반환 - [] 현재까지 받은 카드 목록 - 속성 diff --git a/src/main/java/blackjack/domain/enums/Score.java b/src/main/java/blackjack/domain/enums/Score.java index 6ff36ef..c9a1748 100644 --- a/src/main/java/blackjack/domain/enums/Score.java +++ b/src/main/java/blackjack/domain/enums/Score.java @@ -30,4 +30,8 @@ public String getDenomination() { public int getScore() { return score; } + + public boolean isAce() { + return this.equals(Score.A); + } } diff --git a/src/test/java/blackjack/domain/enums/ScoreTest.java b/src/test/java/blackjack/domain/enums/ScoreTest.java index 0b4d437..01032aa 100644 --- a/src/test/java/blackjack/domain/enums/ScoreTest.java +++ b/src/test/java/blackjack/domain/enums/ScoreTest.java @@ -35,4 +35,18 @@ void getDenomination(String scoreName, String expectedDenomiantion) { //then assertThat(denomination).isEqualTo(expectedDenomiantion); } + + @ParameterizedTest + @CsvSource(value = {"A, true", "TWO, false", "TEN, false", "J, false"}) + @DisplayName("카드가 Ace일 경우 참을 반환한다.") + void isAce(String scoreName, boolean expected) { + //given + Score score = Score.valueOf(scoreName); + + //when + boolean actual = score.isAce(); + + //then + assertThat(actual).isEqualTo(expected); + } } From 78109d260bef1633ac9e8a8656bee1f3adbd0d66 Mon Sep 17 00:00:00 2001 From: Beenie93 Date: Fri, 30 Jul 2021 02:20:53 +0900 Subject: [PATCH 21/80] =?UTF-8?q?feat:=20=EC=B9=B4=EB=93=9C=20=ED=95=9C=20?= =?UTF-8?q?=EC=9E=A5=20=EA=B0=9D=EC=B2=B4=EC=97=90=20=EB=8C=80=ED=95=9C=20?= =?UTF-8?q?=ED=85=8C=EC=8A=A4=ED=8A=B8=20=EB=B0=8F=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 | 9 +-- src/main/java/blackjack/domain/Card.java | 37 +++++++++++++ src/test/java/blackjack/domain/CardTest.java | 58 ++++++++++++++++++++ 3 files changed, 100 insertions(+), 4 deletions(-) create mode 100644 src/main/java/blackjack/domain/Card.java create mode 100644 src/test/java/blackjack/domain/CardTest.java diff --git a/README.md b/README.md index f3dac16..cc8e855 100644 --- a/README.md +++ b/README.md @@ -55,13 +55,14 @@ Stay : 플레이어가 추가 카드를 원하지 않음, 딜러는 카드 합 1 - [] 카드 추가 요청 - [] ERROR: 합이 17 이상이면 추가 카드를 얻을 수 없음 -- [] 카드 +- [x] 카드 - 속성 - - [] 값 - - [] 타입 + - [x] 점수 + - [x] 무늬 - 기능 - - [] 카드의 값 반환 + - [x] 카드의 값 반환 + - [x] ACE인지 확인 - [x] 점수 enum - 속성 diff --git a/src/main/java/blackjack/domain/Card.java b/src/main/java/blackjack/domain/Card.java new file mode 100644 index 0000000..323c1fa --- /dev/null +++ b/src/main/java/blackjack/domain/Card.java @@ -0,0 +1,37 @@ +package blackjack.domain; + +import blackjack.domain.enums.Score; +import blackjack.domain.enums.Suit; + +import java.util.Objects; + +public class Card { + private final Score score; + private final Suit suit; + + public Card(final Score score, final Suit suit) { + this.score = score; + this.suit = suit; + } + + public int getScore() { + return score.getScore(); + } + + public boolean isAce() { + return score.isAce(); + } + + @Override + public boolean equals(Object o) { + if (this == o) return true; + if (o == null || getClass() != o.getClass()) return false; + Card card = (Card) o; + return score == card.score && suit == card.suit; + } + + @Override + public int hashCode() { + return Objects.hash(score, suit); + } +} diff --git a/src/test/java/blackjack/domain/CardTest.java b/src/test/java/blackjack/domain/CardTest.java new file mode 100644 index 0000000..81b239f --- /dev/null +++ b/src/test/java/blackjack/domain/CardTest.java @@ -0,0 +1,58 @@ +package blackjack.domain; + +import blackjack.domain.enums.Score; +import blackjack.domain.enums.Suit; +import org.junit.jupiter.api.DisplayName; +import org.junit.jupiter.api.Test; +import org.junit.jupiter.params.ParameterizedTest; +import org.junit.jupiter.params.provider.CsvSource; + +import static org.assertj.core.api.Assertions.assertThat; + +public class CardTest { + + @Test + @DisplayName("점수와 무늬를 인자로 받아 한 장의 카드를 생성한다.") + void create() { + //given + Score ace = Score.A; + Suit diamond = Suit.DIAMOND; + + //when + Card card = new Card(ace, diamond); + + //then + assertThat(card).isEqualTo(new Card(ace, diamond)); + } + + @Test + @DisplayName("카드의 점수를 반환한다.") + void getScore() { + //given + Score jack = Score.J; + Suit diamond = Suit.DIAMOND; + Card card = new Card(jack, diamond); + + //when + int score = card.getScore(); + + //then + assertThat(score).isEqualTo(jack.getScore()); + } + + @ParameterizedTest + @CsvSource(value = {"A, true", "TWO, false", "TEN, false", "J, false"}) + @DisplayName("카드가 Ace일 경우 참을 반환한다.") + void isAce(String scoreName, boolean expected) { + //given + Score score = Score.valueOf(scoreName); + Suit diamond = Suit.DIAMOND; + Card card = new Card(score, diamond); + + //when + boolean actual = card.isAce(); + + //then + assertThat(actual).isEqualTo(expected); + } +} From dd35ba89ed754c60d45637356803c4ee0443be74 Mon Sep 17 00:00:00 2001 From: Beenie93 Date: Fri, 30 Jul 2021 03:17:26 +0900 Subject: [PATCH 22/80] =?UTF-8?q?feat:=20=EC=B9=B4=EB=93=9C=20=EB=8D=B1?= =?UTF-8?q?=EC=97=90=EC=84=9C=20=EC=B9=B4=EB=93=9C=201=EC=9E=A5,=202?= =?UTF-8?q?=EC=9E=A5=20=EB=B0=98=ED=99=98=ED=95=98=EB=8A=94=20=ED=85=8C?= =?UTF-8?q?=EC=8A=A4=ED=8A=B8=20=EB=B0=8F=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 | 11 +++-- src/main/java/blackjack/domain/Deck.java | 42 ++++++++++++++++++++ src/test/java/blackjack/domain/DeckTest.java | 31 +++++++++++++++ 3 files changed, 78 insertions(+), 6 deletions(-) create mode 100644 src/main/java/blackjack/domain/Deck.java create mode 100644 src/test/java/blackjack/domain/DeckTest.java diff --git a/README.md b/README.md index cc8e855..6861b5f 100644 --- a/README.md +++ b/README.md @@ -89,15 +89,14 @@ Stay : 플레이어가 추가 카드를 원하지 않음, 딜러는 카드 합 1 - [] 모든 카드 합이 21을 초과하는지 확인 - [] 21을 기준으로 Ace 1 또는 11로 설정 -- [] 카드 덱 +- [x] 카드 덱 - 속성 - - [] 카드 52장 + - [x] 카드 52장 - 기능 - - [] 52장 카드 생성 - - [] 처음 2장 카드 반환 - - [] 추가 카드 반환 - - [] ERROR: 반환할 수 있는 카드가 없을 경우 + - [x] 52장 카드 생성 + - [x] 처음 2장 카드 반환 + - [x] 추가 카드 반환 - [] 게임 시스템 - 속성 diff --git a/src/main/java/blackjack/domain/Deck.java b/src/main/java/blackjack/domain/Deck.java new file mode 100644 index 0000000..4d745e7 --- /dev/null +++ b/src/main/java/blackjack/domain/Deck.java @@ -0,0 +1,42 @@ +package blackjack.domain; + +import blackjack.domain.enums.Score; +import blackjack.domain.enums.Suit; + +import java.util.ArrayDeque; +import java.util.ArrayList; +import java.util.Arrays; +import java.util.Collections; +import java.util.Deque; +import java.util.List; +import java.util.stream.Collectors; +import java.util.stream.IntStream; + +public class Deck { + private static final Deque cards = new ArrayDeque<>(); + + static { + List cards = new ArrayList<>(); + + for (final Score score : Score.values()) { + Arrays.stream(Suit.values()) + .forEach(suit -> cards.add(new Card(score, suit))); + } + + Collections.shuffle(cards); + Deck.cards.addAll(cards); + } + + private Deck() { + } + + public static Card getCard() { + return cards.pop(); + } + + public static List getTwoCards() { + return Collections.unmodifiableList(IntStream.range(0, 2) + .mapToObj(i -> cards.pop()) + .collect(Collectors.toList())); + } +} diff --git a/src/test/java/blackjack/domain/DeckTest.java b/src/test/java/blackjack/domain/DeckTest.java new file mode 100644 index 0000000..6289cd8 --- /dev/null +++ b/src/test/java/blackjack/domain/DeckTest.java @@ -0,0 +1,31 @@ +package blackjack.domain; + +import org.junit.jupiter.api.DisplayName; +import org.junit.jupiter.api.Test; + +import java.util.List; + +import static org.assertj.core.api.Assertions.assertThat; + +public class DeckTest { + + @Test + @DisplayName("카드 한 장을 반환한다.") + void getCard() { + //when + Card card = Deck.getCard(); + + //then + assertThat(card).isNotNull(); + } + + @Test + @DisplayName("카드 두 장을 반환한다.") + void getTwoCards() { + //when + List cards = Deck.getTwoCards(); + + //then + assertThat(cards).hasSize(2); + } +} From d1c6199149996fc29393b2719aed905075d8fcfe Mon Sep 17 00:00:00 2001 From: Beenie93 Date: Sat, 31 Jul 2021 16:55:00 +0900 Subject: [PATCH 23/80] =?UTF-8?q?feat:=20=EA=B2=8C=EC=9E=84=20=EC=B0=B8?= =?UTF-8?q?=EC=97=AC=EC=9E=90=EB=93=A4=EC=9D=B4=20=EB=B0=9B=EB=8A=94=20?= =?UTF-8?q?=EC=B9=B4=EB=93=9C=20=EB=AA=A9=EB=A1=9D=EC=97=90=20=EB=8C=80?= =?UTF-8?q?=ED=95=9C=20=ED=85=8C=EC=8A=A4=ED=8A=B8=20=EB=B0=8F=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 | 29 ++--- src/main/java/blackjack/domain/Deck.java | 7 +- .../java/blackjack/domain/GivenCards.java | 55 +++++++++ .../java/blackjack/domain/enums/Score.java | 2 + src/test/java/blackjack/domain/DeckTest.java | 6 +- .../java/blackjack/domain/GivenCardsTest.java | 107 ++++++++++++++++++ 6 files changed, 186 insertions(+), 20 deletions(-) create mode 100644 src/main/java/blackjack/domain/GivenCards.java create mode 100644 src/test/java/blackjack/domain/GivenCardsTest.java diff --git a/README.md b/README.md index 6861b5f..589a60e 100644 --- a/README.md +++ b/README.md @@ -1,10 +1,10 @@ # java-blackjack # 규칙 -Blackjack : 처음 두 장의 카드 합 21 => 승 -Bust : 카드 합 21 초과 => 패 -Push : 플레이어, 딜러 카드 합이 같음 => 무승부 -Hit : 플레이어의 카드 2장의 합이 21을 초과하지 않을 경우, 추가 카드를 요청 +Blackjack : 처음 두 장의 카드 합 21 => 승 +Bust : 카드 합 21 초과 => 패 +Push : 플레이어, 딜러 카드 합이 같음 => 무승부 +Hit : 플레이어의 카드 2장의 합이 21을 초과하지 않을 경우, 추가 카드를 요청 Stay : 플레이어가 추가 카드를 원하지 않음, 딜러는 카드 합 17 이상이면 추가 카드를 얻을 수 없음 # 구현해야 할 기능 목록 @@ -74,20 +74,23 @@ Stay : 플레이어가 추가 카드를 원하지 않음, 딜러는 카드 합 1 - [x] 점수 반환 - [x] ACE인지 확인 -- [x] 무늬 enum - 속성 - [x] 무늬 +- [x] 무늬 enum + - 속성 + - [x] 무늬 - - 기능 - - [x] 무늬 이름 반환 + - 기능 + - [x] 무늬 이름 반환 -- [] 현재까지 받은 카드 목록 +- [x] 현재까지 받은 카드 목록 - 속성 - - [] 현재까지 받은 카드 목록 + - [x] 현재까지 받은 카드 목록 - 기능 - - [] Ace 포함하는지 확인 - - [] 처음 두 장의 카드 합 21인지 확인 - - [] 모든 카드 합이 21을 초과하는지 확인 - - [] 21을 기준으로 Ace 1 또는 11로 설정 + - [x] Ace 포함하는지 확인 + - [x] 처음 두 장의 카드 합 21인지 확인 + - [x] 모든 카드 합이 21을 초과하는지 확인 + - [x] 21을 기준으로 Ace 1 또는 11로 설정 + - [x] 카드 목록 반환 - [x] 카드 덱 - 속성 diff --git a/src/main/java/blackjack/domain/Deck.java b/src/main/java/blackjack/domain/Deck.java index 4d745e7..cad45d1 100644 --- a/src/main/java/blackjack/domain/Deck.java +++ b/src/main/java/blackjack/domain/Deck.java @@ -13,6 +13,7 @@ import java.util.stream.IntStream; public class Deck { + static final int TWO_CARDS = 2; private static final Deque cards = new ArrayDeque<>(); static { @@ -34,9 +35,9 @@ public static Card getCard() { return cards.pop(); } - public static List getTwoCards() { - return Collections.unmodifiableList(IntStream.range(0, 2) + public static GivenCards getTwoCards() { + return new GivenCards(Collections.unmodifiableList(IntStream.range(0, TWO_CARDS) .mapToObj(i -> cards.pop()) - .collect(Collectors.toList())); + .collect(Collectors.toList()))); } } diff --git a/src/main/java/blackjack/domain/GivenCards.java b/src/main/java/blackjack/domain/GivenCards.java new file mode 100644 index 0000000..a4351b7 --- /dev/null +++ b/src/main/java/blackjack/domain/GivenCards.java @@ -0,0 +1,55 @@ +package blackjack.domain; + +import java.util.ArrayList; +import java.util.Collections; +import java.util.List; + +import static blackjack.domain.Deck.TWO_CARDS; +import static blackjack.domain.enums.Score.ACE_BONUS; + +public class GivenCards { + private static final int BLACKJACK = 21; + + private final List cards; + + public GivenCards(final List cards) { + this.cards = new ArrayList<>(cards); + } + + public int sum() { + int sum = cards.stream() + .mapToInt(Card::getScore) + .sum(); + + if (hasAce() && isLessThanOrEqualToBlackjack(addAceBonus(sum))) { + sum = addAceBonus(sum); + } + + return sum; + } + + private boolean hasAce() { + return cards.stream() + .anyMatch(Card::isAce); + } + + private boolean isLessThanOrEqualToBlackjack(final int sum) { + return BLACKJACK >= sum; + } + + private int addAceBonus(final int sum) { + return sum + ACE_BONUS; + } + + public boolean isBlackjack() { + return (cards.size() == TWO_CARDS) && (BLACKJACK == sum()); + } + + public boolean isBurst() { + return BLACKJACK > sum(); + } + + public List list() { + return Collections.unmodifiableList(cards); + } +} diff --git a/src/main/java/blackjack/domain/enums/Score.java b/src/main/java/blackjack/domain/enums/Score.java index c9a1748..e573961 100644 --- a/src/main/java/blackjack/domain/enums/Score.java +++ b/src/main/java/blackjack/domain/enums/Score.java @@ -15,6 +15,8 @@ public enum Score { Q("Q", 10), K("K", 10); + public static final int ACE_BONUS = 10; + private final String denomination; private final int score; diff --git a/src/test/java/blackjack/domain/DeckTest.java b/src/test/java/blackjack/domain/DeckTest.java index 6289cd8..04b3c6c 100644 --- a/src/test/java/blackjack/domain/DeckTest.java +++ b/src/test/java/blackjack/domain/DeckTest.java @@ -3,8 +3,6 @@ import org.junit.jupiter.api.DisplayName; import org.junit.jupiter.api.Test; -import java.util.List; - import static org.assertj.core.api.Assertions.assertThat; public class DeckTest { @@ -23,9 +21,9 @@ void getCard() { @DisplayName("카드 두 장을 반환한다.") void getTwoCards() { //when - List cards = Deck.getTwoCards(); + GivenCards cards = Deck.getTwoCards(); //then - assertThat(cards).hasSize(2); + assertThat(cards.list()).hasSize(2); } } diff --git a/src/test/java/blackjack/domain/GivenCardsTest.java b/src/test/java/blackjack/domain/GivenCardsTest.java new file mode 100644 index 0000000..6e546db --- /dev/null +++ b/src/test/java/blackjack/domain/GivenCardsTest.java @@ -0,0 +1,107 @@ +package blackjack.domain; + +import blackjack.domain.enums.Score; +import blackjack.domain.enums.Suit; +import org.junit.jupiter.api.DisplayName; +import org.junit.jupiter.api.Test; + +import java.util.Arrays; +import java.util.List; + +import static org.assertj.core.api.Assertions.assertThat; + +public class GivenCardsTest { + + @Test + @DisplayName("가지고 있는 카드의 합을 반환한다.") + void sum() { + //given + Card card1 = new Card(Score.EIGHT, Suit.CLUB); + Card card2 = new Card(Score.TWO, Suit.CLUB); + GivenCards givenCards = new GivenCards(Arrays.asList(card1, card2)); + + //when + int sum = givenCards.sum(); + + //then + assertThat(sum).isEqualTo(10); + } + + @Test + @DisplayName("Ace가 1로 계산된 카드의 합을 반환한다.") + void sum_with_ace_value_1() { + //given + Card card1 = new Card(Score.TEN, Suit.CLUB); + Card card2 = new Card(Score.TEN, Suit.CLUB); + Card card3 = new Card(Score.A, Suit.CLUB); + GivenCards givenCards = new GivenCards(Arrays.asList(card1, card2, card3)); + + //when + int sum = givenCards.sum(); + + //then + assertThat(sum).isEqualTo(21); + } + + @Test + @DisplayName("Ace가 11로 계산된 카드의 합을 반환한다.") + void sum_with_ace_value_11() { + //given + Card card1 = new Card(Score.TEN, Suit.CLUB); + Card card2 = new Card(Score.A, Suit.CLUB); + GivenCards givenCards = new GivenCards(Arrays.asList(card1, card2)); + + //when + int sum = givenCards.sum(); + + //then + assertThat(sum).isEqualTo(21); + } + + @Test + @DisplayName("처음 카드 2장이 21일 경우, 참을 반환한다.") + void isBlackjack() { + //given + Card card1 = new Card(Score.TEN, Suit.CLUB); + Card card2 = new Card(Score.A, Suit.CLUB); + GivenCards givenCards = new GivenCards(Arrays.asList(card1, card2)); + + //when + boolean isBlackjack = givenCards.isBlackjack(); + + //then + assertThat(isBlackjack).isTrue(); + } + + @Test + @DisplayName("카드의 합이 21을 초과할 경우, 참을 반환한다.") + void isBurst() { + //given + Card card1 = new Card(Score.TEN, Suit.CLUB); + Card card2 = new Card(Score.TEN, Suit.HEART); + Card card3 = new Card(Score.TWO, Suit.HEART); + GivenCards givenCards = new GivenCards(Arrays.asList(card1, card2, card3)); + + //when + boolean isBurst = givenCards.isBurst(); + + //then + assertThat(isBurst).isTrue(); + } + + @Test + @DisplayName("가지고 있는 카드 목록을 반환한다.") + void list() { + //given + Card card1 = new Card(Score.TEN, Suit.CLUB); + Card card2 = new Card(Score.A, Suit.CLUB); + GivenCards givenCards = new GivenCards(Arrays.asList(card1, card2)); + + //when + List cards = givenCards.list(); + + //then + assertThat(cards).hasSize(2) + .containsOnly(card1, card2); + } +} From 335f55c9a55ef0e1ed7e1cc4899488a502f57690 Mon Sep 17 00:00:00 2001 From: Beenie93 Date: Sat, 31 Jul 2021 19:37:06 +0900 Subject: [PATCH 24/80] =?UTF-8?q?feat:=20=EA=B2=8C=EC=9E=84=20=EC=B0=B8?= =?UTF-8?q?=EC=97=AC=EC=9E=90=EB=93=A4=EC=9D=B4=20=EB=B0=9B=EB=8A=94=20?= =?UTF-8?q?=EC=B9=B4=EB=93=9C=20=EB=AA=A9=EB=A1=9D=EC=97=90=20=EC=B9=B4?= =?UTF-8?q?=EB=93=9C=20=ED=95=9C=20=EC=9E=A5=20=EC=B6=94=EA=B0=80=ED=95=98?= =?UTF-8?q?=EB=8A=94=20=ED=85=8C=EC=8A=A4=ED=8A=B8=20=EB=B0=8F=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 | 5 +++-- src/main/java/blackjack/domain/GivenCards.java | 6 +++++- .../java/blackjack/domain/GivenCardsTest.java | 17 +++++++++++++++++ 3 files changed, 25 insertions(+), 3 deletions(-) diff --git a/README.md b/README.md index 589a60e..f1ae182 100644 --- a/README.md +++ b/README.md @@ -27,11 +27,11 @@ Stay : 플레이어가 추가 카드를 원하지 않음, 딜러는 카드 합 1 - [] 모든 카드 합 계산 - [] 게임 종료 상태인지 확인 -- [] 게임 참여 상태 (Running) +- [] 참여 상태 (Running) - [] 시작 상태 - [] 카드 추가 받은 상태 -- [] 게임 종료 상태 (Finished) +- [] 종료 상태 (Finished) - [] Blackjack 상태 - [] Burst 상태 - [] Stay 상태 @@ -91,6 +91,7 @@ Stay : 플레이어가 추가 카드를 원하지 않음, 딜러는 카드 합 1 - [x] 모든 카드 합이 21을 초과하는지 확인 - [x] 21을 기준으로 Ace 1 또는 11로 설정 - [x] 카드 목록 반환 + - [x] 인자로 받은 카드 추가 - [x] 카드 덱 - 속성 diff --git a/src/main/java/blackjack/domain/GivenCards.java b/src/main/java/blackjack/domain/GivenCards.java index a4351b7..64182ef 100644 --- a/src/main/java/blackjack/domain/GivenCards.java +++ b/src/main/java/blackjack/domain/GivenCards.java @@ -46,10 +46,14 @@ public boolean isBlackjack() { } public boolean isBurst() { - return BLACKJACK > sum(); + return BLACKJACK < sum(); } public List list() { return Collections.unmodifiableList(cards); } + + public void add(final Card card) { + cards.add(card); + } } diff --git a/src/test/java/blackjack/domain/GivenCardsTest.java b/src/test/java/blackjack/domain/GivenCardsTest.java index 6e546db..14fd422 100644 --- a/src/test/java/blackjack/domain/GivenCardsTest.java +++ b/src/test/java/blackjack/domain/GivenCardsTest.java @@ -104,4 +104,21 @@ void list() { assertThat(cards).hasSize(2) .containsOnly(card1, card2); } + + @Test + @DisplayName("인자로 받은 카드를 추가한다.") + void add() { + //given + Card card1 = new Card(Score.TEN, Suit.CLUB); + Card card2 = new Card(Score.NINE, Suit.CLUB); + GivenCards givenCards = new GivenCards(Arrays.asList(card1, card2)); + Card newCard = new Card(Score.TWO, Suit.CLUB); + + //when + givenCards.add(newCard); + + //then + assertThat(givenCards.list()).hasSize(3) + .containsOnly(card1, card2, newCard); + } } From 3b64f712ae463a057210526d069a6509300428ad Mon Sep 17 00:00:00 2001 From: Beenie93 Date: Sat, 31 Jul 2021 20:20:46 +0900 Subject: [PATCH 25/80] =?UTF-8?q?feat:=20=EC=B0=B8=EC=97=AC=20=EC=83=81?= =?UTF-8?q?=ED=83=9C(Running)=20=ED=85=8C=EC=8A=A4=ED=8A=B8=20=EB=B0=8F=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 | 16 +++--- .../java/blackjack/domain/state/Running.java | 14 +++++ .../java/blackjack/domain/state/State.java | 16 ++++++ .../blackjack/domain/state/RunningTest.java | 56 +++++++++++++++++++ 4 files changed, 94 insertions(+), 8 deletions(-) create mode 100644 src/main/java/blackjack/domain/state/Running.java create mode 100644 src/main/java/blackjack/domain/state/State.java create mode 100644 src/test/java/blackjack/domain/state/RunningTest.java diff --git a/README.md b/README.md index f1ae182..29dddcf 100644 --- a/README.md +++ b/README.md @@ -19,15 +19,15 @@ Stay : 플레이어가 추가 카드를 원하지 않음, 딜러는 카드 합 1 - [] 각 플레이어(딜러 포함)의 총 카드의 합 - [] 최종 승패 결과 -- [] 상태 +- [x] 상태 - 기능 - - [] 첫 카드 2장 발급 - - [] 추가 카드 발급 - - [] 추가 카드 발급 거부 - - [] 모든 카드 합 계산 - - [] 게임 종료 상태인지 확인 + - [x] 추가 카드 발급 + - [x] 추가 카드 발급 거부 + - [x] 모든 카드 합 계산 + - [x] 참여 종료 여부 반환 + - [x] 발급받은 카드 목록 반환 -- [] 참여 상태 (Running) +- [x] 참여 상태 (Running) - [] 시작 상태 - [] 카드 추가 받은 상태 @@ -53,7 +53,7 @@ Stay : 플레이어가 추가 카드를 원하지 않음, 딜러는 카드 합 1 - 기능 - [] 초기 카드 2장을 받는다 - [] 카드 추가 요청 - - [] ERROR: 합이 17 이상이면 추가 카드를 얻을 수 없음 + - [] ERROR: 합이 17 이상일 경우 - [x] 카드 - 속성 diff --git a/src/main/java/blackjack/domain/state/Running.java b/src/main/java/blackjack/domain/state/Running.java new file mode 100644 index 0000000..2fc87fc --- /dev/null +++ b/src/main/java/blackjack/domain/state/Running.java @@ -0,0 +1,14 @@ +package blackjack.domain.state; + +public abstract class Running implements State { + + @Override + public int sum() { + throw new IllegalStateException("게임 진행 중에는 카드의 합을 반환할 수 없습니다."); + } + + @Override + public boolean isFinished() { + return false; + } +} diff --git a/src/main/java/blackjack/domain/state/State.java b/src/main/java/blackjack/domain/state/State.java new file mode 100644 index 0000000..d06479f --- /dev/null +++ b/src/main/java/blackjack/domain/state/State.java @@ -0,0 +1,16 @@ +package blackjack.domain.state; + +import blackjack.domain.Card; +import blackjack.domain.GivenCards; + +public interface State { + State hit(Card card); + + State stay(); + + int sum(); + + boolean isFinished(); + + GivenCards getCards(); +} diff --git a/src/test/java/blackjack/domain/state/RunningTest.java b/src/test/java/blackjack/domain/state/RunningTest.java new file mode 100644 index 0000000..05b80ac --- /dev/null +++ b/src/test/java/blackjack/domain/state/RunningTest.java @@ -0,0 +1,56 @@ +package blackjack.domain.state; + +import blackjack.domain.Card; +import blackjack.domain.GivenCards; +import org.junit.jupiter.api.DisplayName; +import org.junit.jupiter.api.Test; + +import static org.assertj.core.api.Assertions.assertThat; +import static org.assertj.core.api.Assertions.assertThatThrownBy; + +class RunningTest { + + @Test + @DisplayName("게임 진행 중 카드의 합을 요청할 경우, 예외가 발생한다.") + void sum() { + //given + State runningState = createRunningState(); + + //when //then + assertThatThrownBy(runningState::sum) + .isInstanceOf(IllegalStateException.class) + .hasMessage("게임 진행 중에는 카드의 합을 반환할 수 없습니다."); + } + + @Test + @DisplayName("게임 진행 중 게임 종료 여부를 물어볼 경우, 거짓을 반환한다.") + void isFinished() { + //given + State runningState = createRunningState(); + + //when + boolean finished = runningState.isFinished(); + + //then + assertThat(finished).isFalse(); + } + + private State createRunningState() { + return new Running() { + @Override + public State hit(Card card) { + return null; + } + + @Override + public State stay() { + return null; + } + + @Override + public GivenCards getCards() { + return null; + } + }; + } +} From bb05ebba517e9ae51ecde5c0897824ec1bad7cf7 Mon Sep 17 00:00:00 2001 From: Beenie93 Date: Sat, 31 Jul 2021 20:24:46 +0900 Subject: [PATCH 26/80] =?UTF-8?q?feat:=20=EC=A2=85=EB=A3=8C=20=EC=83=81?= =?UTF-8?q?=ED=83=9C(Finished)=20=ED=85=8C=EC=8A=A4=ED=8A=B8=20=EB=B0=8F?= =?UTF-8?q?=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 | 8 +-- .../java/blackjack/domain/state/Finished.java | 21 ++++++ .../blackjack/domain/state/FinishedTest.java | 68 +++++++++++++++++++ .../blackjack/domain/state/RunningTest.java | 2 +- 4 files changed, 94 insertions(+), 5 deletions(-) create mode 100644 src/main/java/blackjack/domain/state/Finished.java create mode 100644 src/test/java/blackjack/domain/state/FinishedTest.java diff --git a/README.md b/README.md index 29dddcf..1c3d902 100644 --- a/README.md +++ b/README.md @@ -31,10 +31,10 @@ Stay : 플레이어가 추가 카드를 원하지 않음, 딜러는 카드 합 1 - [] 시작 상태 - [] 카드 추가 받은 상태 -- [] 종료 상태 (Finished) - - [] Blackjack 상태 - - [] Burst 상태 - - [] Stay 상태 +- [x] 종료 상태 (Finished) + - [] 처음 카드 두 장의 합이 21인 상태 (Blackjack) + - [] 모든 카드의 합이 21인 상태 (Burst) + - [] 카드 발급 거부 후 참여가 종료된 상태 (Stay) - [] 플레이어 - 속성 diff --git a/src/main/java/blackjack/domain/state/Finished.java b/src/main/java/blackjack/domain/state/Finished.java new file mode 100644 index 0000000..2461d79 --- /dev/null +++ b/src/main/java/blackjack/domain/state/Finished.java @@ -0,0 +1,21 @@ +package blackjack.domain.state; + +import blackjack.domain.Card; + +public abstract class Finished implements State { + + @Override + public State hit(Card card) { + throw new IllegalStateException("참여 종료 후에는 추가 카드 요청을 할 수 없습니다."); + } + + @Override + public State stay() { + throw new IllegalStateException("참여 종료 후에는 추가 카드 요청 거부를 할 수 없습니다."); + } + + @Override + public boolean isFinished() { + return true; + } +} diff --git a/src/test/java/blackjack/domain/state/FinishedTest.java b/src/test/java/blackjack/domain/state/FinishedTest.java new file mode 100644 index 0000000..885e5dc --- /dev/null +++ b/src/test/java/blackjack/domain/state/FinishedTest.java @@ -0,0 +1,68 @@ +package blackjack.domain.state; + +import blackjack.domain.Card; +import blackjack.domain.GivenCards; +import blackjack.domain.enums.Score; +import blackjack.domain.enums.Suit; +import org.junit.jupiter.api.DisplayName; +import org.junit.jupiter.api.Test; + +import static org.assertj.core.api.Assertions.assertThat; +import static org.assertj.core.api.Assertions.assertThatThrownBy; + +class FinishedTest { + + @Test + @DisplayName("참여 종료 상태에서 카드 발급 요청을 할 경우 예외가 발생한다.") + void hit() { + //given + State finishedState = createFinishedState(); + Card card = new Card(Score.A, Suit.CLUB); + + //when //then + assertThatThrownBy(() -> finishedState.hit(card)) + .isInstanceOf(IllegalStateException.class) + .hasMessage("참여 종료 후에는 추가 카드 요청을 할 수 없습니다."); + } + + @Test + @DisplayName("참여 종료 상태에서 카드 발급 거부를 할 경우 예외가 발생한다.") + void stay() { + //given + State finishedState = createFinishedState(); + + //when //then + assertThatThrownBy(finishedState::stay) + .isInstanceOf(IllegalStateException.class) + .hasMessage("참여 종료 후에는 추가 카드 요청 거부를 할 수 없습니다."); + } + + @Test + @DisplayName("참여 종료 상태에서 참여 종료 여부를 물어볼 경우, 참을 반환한다.") + void isFinished() { + //given + State finishedState = createFinishedState(); + + //when + boolean finished = finishedState.isFinished(); + + //then + assertThat(finished).isTrue(); + } + + private State createFinishedState() { + return new Finished() { + @Override + public int sum() { + return 0; + } + + @Override + public GivenCards getCards() { + return null; + } + }; + } + + +} diff --git a/src/test/java/blackjack/domain/state/RunningTest.java b/src/test/java/blackjack/domain/state/RunningTest.java index 05b80ac..fc86b18 100644 --- a/src/test/java/blackjack/domain/state/RunningTest.java +++ b/src/test/java/blackjack/domain/state/RunningTest.java @@ -23,7 +23,7 @@ void sum() { } @Test - @DisplayName("게임 진행 중 게임 종료 여부를 물어볼 경우, 거짓을 반환한다.") + @DisplayName("게임 진행 중 참여 종료 여부를 물어볼 경우, 거짓을 반환한다.") void isFinished() { //given State runningState = createRunningState(); From 2ba425f82afe9a29eed99681bb8d4b666093da60 Mon Sep 17 00:00:00 2001 From: Beenie93 Date: Sat, 31 Jul 2021 20:37:05 +0900 Subject: [PATCH 27/80] =?UTF-8?q?feat:=20=EC=8B=9C=EC=9E=91=20=EC=83=81?= =?UTF-8?q?=ED=83=9C(Started)=20=ED=85=8C=EC=8A=A4=ED=8A=B8=20=EB=B0=8F=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 | 11 ++- .../java/blackjack/domain/state/Started.java | 33 ++++++++ .../blackjack/domain/state/StartedTest.java | 81 +++++++++++++++++++ 3 files changed, 123 insertions(+), 2 deletions(-) create mode 100644 src/main/java/blackjack/domain/state/Started.java create mode 100644 src/test/java/blackjack/domain/state/StartedTest.java diff --git a/README.md b/README.md index 1c3d902..63c6700 100644 --- a/README.md +++ b/README.md @@ -28,8 +28,15 @@ Stay : 플레이어가 추가 카드를 원하지 않음, 딜러는 카드 합 1 - [x] 발급받은 카드 목록 반환 - [x] 참여 상태 (Running) - - [] 시작 상태 - - [] 카드 추가 받은 상태 + - [x] 시작 상태 (Started) + - 기능 + - [x] 추가 카드 발급 + - [x] 카드의 합 21을 초과할 경우 Burst 상태 반환 + - [x] 카드의 합 21 이하일 경우 Hit 상태 반환 + - [x] Stay 상태 반환 + - [x] 발급받은 카드 목록 반환 + + - [] 카드 추가 받은 상태 (Hit) - [x] 종료 상태 (Finished) - [] 처음 카드 두 장의 합이 21인 상태 (Blackjack) diff --git a/src/main/java/blackjack/domain/state/Started.java b/src/main/java/blackjack/domain/state/Started.java new file mode 100644 index 0000000..607cd01 --- /dev/null +++ b/src/main/java/blackjack/domain/state/Started.java @@ -0,0 +1,33 @@ +package blackjack.domain.state; + +import blackjack.domain.Card; +import blackjack.domain.GivenCards; + +public class Started extends Running { + private final GivenCards givenCards; + + public Started(GivenCards givenCards) { + this.givenCards = givenCards; + } + + @Override + public State hit(final Card card) { + givenCards.add(card); + + if (givenCards.isBurst()) { + return new Burst(givenCards); + } + + return new Hit(givenCards); + } + + @Override + public State stay() { + return new Stay(givenCards); + } + + @Override + public GivenCards getCards() { + return givenCards; + } +} diff --git a/src/test/java/blackjack/domain/state/StartedTest.java b/src/test/java/blackjack/domain/state/StartedTest.java new file mode 100644 index 0000000..2ec8c96 --- /dev/null +++ b/src/test/java/blackjack/domain/state/StartedTest.java @@ -0,0 +1,81 @@ +package blackjack.domain.state; + +import blackjack.domain.Card; +import blackjack.domain.GivenCards; +import blackjack.domain.enums.Score; +import blackjack.domain.enums.Suit; +import org.junit.jupiter.api.DisplayName; +import org.junit.jupiter.api.Test; + +import java.util.Arrays; + +import static org.assertj.core.api.Assertions.assertThat; + +class StartedTest { + + @Test + @DisplayName("지급받은 카드 포함 합이 21을 초과할 경우, Burst 상태를 반환한다.") + void hit_return_burst_state() { + //given + Card card1 = new Card(Score.TEN, Suit.CLUB); + Card card2 = new Card(Score.TEN, Suit.HEART); + GivenCards givenCards = new GivenCards(Arrays.asList(card1, card2)); + Started started = new Started(givenCards); + Card newCard = new Card(Score.TWO, Suit.CLUB); + + //when + State state = started.hit(newCard); + + //then + assertThat(state).isInstanceOf(Burst.class); + } + + @Test + @DisplayName("지급받은 카드 포함 합이 21을 초과하지 않을 경우, Hit 상태를 반환한다.") + void hit_return_itself() { + //given + Card card1 = new Card(Score.TEN, Suit.CLUB); + Card card2 = new Card(Score.TEN, Suit.HEART); + GivenCards givenCards = new GivenCards(Arrays.asList(card1, card2)); + State started = new Started(givenCards); + Card newCard = new Card(Score.A, Suit.CLUB); + + //when + State state = started.hit(newCard); + + //then + assertThat(state).isInstanceOf(Hit.class); + } + + @Test + @DisplayName("Stay 상태를 반환한다.") + void stay() { + ///given + Card card1 = new Card(Score.TEN, Suit.CLUB); + Card card2 = new Card(Score.TEN, Suit.HEART); + GivenCards givenCards = new GivenCards(Arrays.asList(card1, card2)); + State started = new Started(givenCards); + + //when + State state = started.stay(); + + //then + assertThat(state).isInstanceOf(Stay.class); + } + + @Test + @DisplayName("모든 카드 목록을 반환한다.") + void getCards() { + ///given + Card card1 = new Card(Score.TEN, Suit.CLUB); + Card card2 = new Card(Score.TEN, Suit.HEART); + GivenCards givenCards = new GivenCards(Arrays.asList(card1, card2)); + State started = new Started(givenCards); + + //when + GivenCards cards = started.getCards(); + + //then + assertThat(cards).isEqualTo(givenCards); + } +} From 0a7d336d028bfee1b6077a6bf0ceebac40700264 Mon Sep 17 00:00:00 2001 From: Beenie93 Date: Sun, 1 Aug 2021 19:04:48 +0900 Subject: [PATCH 28/80] =?UTF-8?q?feat:=20=EB=AA=A8=EB=93=A0=20=EC=83=81?= =?UTF-8?q?=ED=83=9C=EC=97=90=EC=84=9C=20=EC=B9=B4=EB=93=9C=20=ED=95=A9=20?= =?UTF-8?q?=EB=B0=98=ED=99=98,=20=EC=B9=B4=EB=93=9C=20=EB=AA=A9=EB=A1=9D?= =?UTF-8?q?=20=EB=B0=98=ED=99=98=20=EA=B8=B0=EB=8A=A5=20=EC=A4=91=EB=B3=B5?= =?UTF-8?q?=20=EC=BD=94=EB=93=9C=20=EC=A0=9C=EA=B1=B0=EB=A5=BC=20=EC=9C=84?= =?UTF-8?q?=ED=95=9C=20Init=20=EC=B6=94=EC=83=81=20=ED=81=B4=EB=9E=98?= =?UTF-8?q?=EC=8A=A4=20=EC=B6=94=EA=B0=80=20=EB=B0=8F=20Started=20->=20Hit?= =?UTF-8?q?=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 --- README.md | 22 ++++-- .../java/blackjack/domain/state/Finished.java | 7 +- .../domain/state/{Started.java => Hit.java} | 15 ++--- .../java/blackjack/domain/state/Init.java | 21 ++++++ .../java/blackjack/domain/state/Running.java | 9 +-- .../blackjack/domain/state/FinishedTest.java | 6 +- .../state/{StartedTest.java => HitTest.java} | 30 ++------- .../java/blackjack/domain/state/InitTest.java | 67 +++++++++++++++++++ .../blackjack/domain/state/RunningTest.java | 21 ++---- 9 files changed, 139 insertions(+), 59 deletions(-) rename src/main/java/blackjack/domain/state/{Started.java => Hit.java} (56%) create mode 100644 src/main/java/blackjack/domain/state/Init.java rename src/test/java/blackjack/domain/state/{StartedTest.java => HitTest.java} (68%) create mode 100644 src/test/java/blackjack/domain/state/InitTest.java diff --git a/README.md b/README.md index 63c6700..8839cc7 100644 --- a/README.md +++ b/README.md @@ -19,26 +19,36 @@ Stay : 플레이어가 추가 카드를 원하지 않음, 딜러는 카드 합 1 - [] 각 플레이어(딜러 포함)의 총 카드의 합 - [] 최종 승패 결과 -- [x] 상태 +- [x] 상태 (State) - 기능 - [x] 추가 카드 발급 - [x] 추가 카드 발급 거부 - - [x] 모든 카드 합 계산 + - [x] 모든 카드 합 반환 - [x] 참여 종료 여부 반환 - [x] 발급받은 카드 목록 반환 +- [x] 시작 상태 (Init) + - 기능 + - [x] 발급받은 카드 목록 반환 + - [x] 모든 카드 합 반환 + - [x] 참여 상태 (Running) - - [x] 시작 상태 (Started) + - 기능 + - [x] 참여 종료 여부 거짓으로 반환 + + - [x] 카드 추가 받은 상태 (Hit) - 기능 - [x] 추가 카드 발급 - [x] 카드의 합 21을 초과할 경우 Burst 상태 반환 - [x] 카드의 합 21 이하일 경우 Hit 상태 반환 - [x] Stay 상태 반환 - - [x] 발급받은 카드 목록 반환 - - - [] 카드 추가 받은 상태 (Hit) - [x] 종료 상태 (Finished) + - 기능 + - [x] 참여 종료 여부 참으로 반환 + - [x] ERROR : 추가 카드 발급 시 + - [x] ERROR : 추가 카드 발급 거부 시 + - [] 처음 카드 두 장의 합이 21인 상태 (Blackjack) - [] 모든 카드의 합이 21인 상태 (Burst) - [] 카드 발급 거부 후 참여가 종료된 상태 (Stay) diff --git a/src/main/java/blackjack/domain/state/Finished.java b/src/main/java/blackjack/domain/state/Finished.java index 2461d79..9990c9a 100644 --- a/src/main/java/blackjack/domain/state/Finished.java +++ b/src/main/java/blackjack/domain/state/Finished.java @@ -1,8 +1,13 @@ package blackjack.domain.state; import blackjack.domain.Card; +import blackjack.domain.GivenCards; -public abstract class Finished implements State { +public abstract class Finished extends Init { + + protected Finished(GivenCards givenCards) { + super(givenCards); + } @Override public State hit(Card card) { diff --git a/src/main/java/blackjack/domain/state/Started.java b/src/main/java/blackjack/domain/state/Hit.java similarity index 56% rename from src/main/java/blackjack/domain/state/Started.java rename to src/main/java/blackjack/domain/state/Hit.java index 607cd01..8c3b75c 100644 --- a/src/main/java/blackjack/domain/state/Started.java +++ b/src/main/java/blackjack/domain/state/Hit.java @@ -3,15 +3,15 @@ import blackjack.domain.Card; import blackjack.domain.GivenCards; -public class Started extends Running { - private final GivenCards givenCards; +public class Hit extends Running { - public Started(GivenCards givenCards) { - this.givenCards = givenCards; + public Hit(final GivenCards givenCards) { + super(givenCards); } @Override public State hit(final Card card) { + GivenCards givenCards = getCards(); givenCards.add(card); if (givenCards.isBurst()) { @@ -23,11 +23,6 @@ public State hit(final Card card) { @Override public State stay() { - return new Stay(givenCards); - } - - @Override - public GivenCards getCards() { - return givenCards; + return new Stay(getCards()); } } diff --git a/src/main/java/blackjack/domain/state/Init.java b/src/main/java/blackjack/domain/state/Init.java new file mode 100644 index 0000000..2af458d --- /dev/null +++ b/src/main/java/blackjack/domain/state/Init.java @@ -0,0 +1,21 @@ +package blackjack.domain.state; + +import blackjack.domain.GivenCards; + +public abstract class Init implements State { + private final GivenCards givenCards; + + protected Init(final GivenCards givenCards) { + this.givenCards = givenCards; + } + + @Override + public GivenCards getCards() { + return givenCards; + } + + @Override + public int sum() { + return givenCards.sum(); + } +} diff --git a/src/main/java/blackjack/domain/state/Running.java b/src/main/java/blackjack/domain/state/Running.java index 2fc87fc..f5605b8 100644 --- a/src/main/java/blackjack/domain/state/Running.java +++ b/src/main/java/blackjack/domain/state/Running.java @@ -1,10 +1,11 @@ package blackjack.domain.state; -public abstract class Running implements State { +import blackjack.domain.GivenCards; - @Override - public int sum() { - throw new IllegalStateException("게임 진행 중에는 카드의 합을 반환할 수 없습니다."); +public abstract class Running extends Init { + + Running(final GivenCards givenCards) { + super(givenCards); } @Override diff --git a/src/test/java/blackjack/domain/state/FinishedTest.java b/src/test/java/blackjack/domain/state/FinishedTest.java index 885e5dc..9210663 100644 --- a/src/test/java/blackjack/domain/state/FinishedTest.java +++ b/src/test/java/blackjack/domain/state/FinishedTest.java @@ -7,6 +7,8 @@ import org.junit.jupiter.api.DisplayName; import org.junit.jupiter.api.Test; +import java.util.Collections; + import static org.assertj.core.api.Assertions.assertThat; import static org.assertj.core.api.Assertions.assertThatThrownBy; @@ -51,7 +53,9 @@ void isFinished() { } private State createFinishedState() { - return new Finished() { + GivenCards givenCards = new GivenCards(Collections.singletonList(new Card(Score.A, Suit.CLUB))); + + return new Finished(givenCards) { @Override public int sum() { return 0; diff --git a/src/test/java/blackjack/domain/state/StartedTest.java b/src/test/java/blackjack/domain/state/HitTest.java similarity index 68% rename from src/test/java/blackjack/domain/state/StartedTest.java rename to src/test/java/blackjack/domain/state/HitTest.java index 2ec8c96..bbf83cc 100644 --- a/src/test/java/blackjack/domain/state/StartedTest.java +++ b/src/test/java/blackjack/domain/state/HitTest.java @@ -11,7 +11,7 @@ import static org.assertj.core.api.Assertions.assertThat; -class StartedTest { +class HitTest { @Test @DisplayName("지급받은 카드 포함 합이 21을 초과할 경우, Burst 상태를 반환한다.") @@ -20,11 +20,11 @@ void hit_return_burst_state() { Card card1 = new Card(Score.TEN, Suit.CLUB); Card card2 = new Card(Score.TEN, Suit.HEART); GivenCards givenCards = new GivenCards(Arrays.asList(card1, card2)); - Started started = new Started(givenCards); + State hit = new Hit(givenCards); Card newCard = new Card(Score.TWO, Suit.CLUB); //when - State state = started.hit(newCard); + State state = hit.hit(newCard); //then assertThat(state).isInstanceOf(Burst.class); @@ -37,11 +37,11 @@ void hit_return_itself() { Card card1 = new Card(Score.TEN, Suit.CLUB); Card card2 = new Card(Score.TEN, Suit.HEART); GivenCards givenCards = new GivenCards(Arrays.asList(card1, card2)); - State started = new Started(givenCards); + State hit = new Hit(givenCards); Card newCard = new Card(Score.A, Suit.CLUB); //when - State state = started.hit(newCard); + State state = hit.hit(newCard); //then assertThat(state).isInstanceOf(Hit.class); @@ -54,28 +54,12 @@ void stay() { Card card1 = new Card(Score.TEN, Suit.CLUB); Card card2 = new Card(Score.TEN, Suit.HEART); GivenCards givenCards = new GivenCards(Arrays.asList(card1, card2)); - State started = new Started(givenCards); + State hit = new Hit(givenCards); //when - State state = started.stay(); + State state = hit.stay(); //then assertThat(state).isInstanceOf(Stay.class); } - - @Test - @DisplayName("모든 카드 목록을 반환한다.") - void getCards() { - ///given - Card card1 = new Card(Score.TEN, Suit.CLUB); - Card card2 = new Card(Score.TEN, Suit.HEART); - GivenCards givenCards = new GivenCards(Arrays.asList(card1, card2)); - State started = new Started(givenCards); - - //when - GivenCards cards = started.getCards(); - - //then - assertThat(cards).isEqualTo(givenCards); - } } diff --git a/src/test/java/blackjack/domain/state/InitTest.java b/src/test/java/blackjack/domain/state/InitTest.java new file mode 100644 index 0000000..ef36ccf --- /dev/null +++ b/src/test/java/blackjack/domain/state/InitTest.java @@ -0,0 +1,67 @@ +package blackjack.domain.state; + +import blackjack.domain.Card; +import blackjack.domain.GivenCards; +import blackjack.domain.enums.Score; +import blackjack.domain.enums.Suit; +import org.junit.jupiter.api.DisplayName; +import org.junit.jupiter.api.Test; + +import java.util.Arrays; + +import static org.assertj.core.api.Assertions.assertThat; + +class InitTest { + + @Test + @DisplayName("모든 카드 목록을 반환한다.") + void getCards() { + ///given + Card card1 = new Card(Score.TEN, Suit.CLUB); + Card card2 = new Card(Score.TEN, Suit.HEART); + GivenCards givenCards = new GivenCards(Arrays.asList(card1, card2)); + State init = createInitState(givenCards); + + //when + GivenCards cards = init.getCards(); + + //then + assertThat(cards).isEqualTo(givenCards); + } + + @Test + @DisplayName("게임 진행 중 카드의 합을 요청할 경우, 예외가 발생한다.") + void sum() { + ///given + Card card1 = new Card(Score.TEN, Suit.CLUB); + Card card2 = new Card(Score.TEN, Suit.HEART); + GivenCards givenCards = new GivenCards(Arrays.asList(card1, card2)); + State init = createInitState(givenCards); + + //when + int sum = init.sum(); + + //then + assertThat(sum).isEqualTo(20); + ; + } + + private Init createInitState(GivenCards givenCards) { + return new Init(givenCards) { + @Override + public State hit(Card card) { + return null; + } + + @Override + public State stay() { + return null; + } + + @Override + public boolean isFinished() { + return false; + } + }; + } +} diff --git a/src/test/java/blackjack/domain/state/RunningTest.java b/src/test/java/blackjack/domain/state/RunningTest.java index fc86b18..33ae4c6 100644 --- a/src/test/java/blackjack/domain/state/RunningTest.java +++ b/src/test/java/blackjack/domain/state/RunningTest.java @@ -2,26 +2,17 @@ import blackjack.domain.Card; import blackjack.domain.GivenCards; +import blackjack.domain.enums.Score; +import blackjack.domain.enums.Suit; import org.junit.jupiter.api.DisplayName; import org.junit.jupiter.api.Test; +import java.util.Collections; + import static org.assertj.core.api.Assertions.assertThat; -import static org.assertj.core.api.Assertions.assertThatThrownBy; class RunningTest { - @Test - @DisplayName("게임 진행 중 카드의 합을 요청할 경우, 예외가 발생한다.") - void sum() { - //given - State runningState = createRunningState(); - - //when //then - assertThatThrownBy(runningState::sum) - .isInstanceOf(IllegalStateException.class) - .hasMessage("게임 진행 중에는 카드의 합을 반환할 수 없습니다."); - } - @Test @DisplayName("게임 진행 중 참여 종료 여부를 물어볼 경우, 거짓을 반환한다.") void isFinished() { @@ -36,7 +27,9 @@ void isFinished() { } private State createRunningState() { - return new Running() { + GivenCards givenCards = new GivenCards(Collections.singletonList(new Card(Score.A, Suit.CLUB))); + + return new Running(givenCards) { @Override public State hit(Card card) { return null; From 4859fd6201fe726404593859fac26b513ce8490a Mon Sep 17 00:00:00 2001 From: Beenie93 Date: Mon, 2 Aug 2021 01:57:50 +0900 Subject: [PATCH 29/80] =?UTF-8?q?feat:=20=EC=9D=B8=EC=9E=90=EB=A1=9C=20?= =?UTF-8?q?=EB=B0=9B=EC=9D=80=20=EC=B9=B4=EB=93=9C=EC=9D=98=20=ED=95=A9?= =?UTF-8?q?=EC=9D=84=20=EB=B9=84=EA=B5=90=ED=95=98=EB=8A=94=20=ED=85=8C?= =?UTF-8?q?=EC=8A=A4=ED=8A=B8=20=EB=B0=8F=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 ++ .../java/blackjack/domain/GivenCards.java | 8 +++++ .../java/blackjack/domain/GivenCardsTest.java | 34 +++++++++++++++++++ 3 files changed, 44 insertions(+) diff --git a/README.md b/README.md index 8839cc7..457c018 100644 --- a/README.md +++ b/README.md @@ -109,6 +109,8 @@ Stay : 플레이어가 추가 카드를 원하지 않음, 딜러는 카드 합 1 - [x] 21을 기준으로 Ace 1 또는 11로 설정 - [x] 카드 목록 반환 - [x] 인자로 받은 카드 추가 + - [x] 인자로 받은 카드보다 합이 큰 지 확인 + - [x] 인자로 받은 카드보다 합이 작은 지 확인 - [x] 카드 덱 - 속성 diff --git a/src/main/java/blackjack/domain/GivenCards.java b/src/main/java/blackjack/domain/GivenCards.java index 64182ef..460e4f3 100644 --- a/src/main/java/blackjack/domain/GivenCards.java +++ b/src/main/java/blackjack/domain/GivenCards.java @@ -56,4 +56,12 @@ public List list() { public void add(final Card card) { cards.add(card); } + + public boolean isGreaterThan(final GivenCards otherCards) { + return sum() > otherCards.sum(); + } + + public boolean isLessThan(final GivenCards otherCards) { + return sum() < otherCards.sum(); + } } diff --git a/src/test/java/blackjack/domain/GivenCardsTest.java b/src/test/java/blackjack/domain/GivenCardsTest.java index 14fd422..20e32f1 100644 --- a/src/test/java/blackjack/domain/GivenCardsTest.java +++ b/src/test/java/blackjack/domain/GivenCardsTest.java @@ -121,4 +121,38 @@ void add() { assertThat(givenCards.list()).hasSize(3) .containsOnly(card1, card2, newCard); } + + @Test + @DisplayName("인자로 받은 카드보다 자신의 카드 합이 더 클 경우, 참을 반환한다.") + void isGreaterThan() { + //given + Card card1 = new Card(Score.TEN, Suit.CLUB); + Card card2 = new Card(Score.NINE, Suit.CLUB); + GivenCards myCards = new GivenCards(Arrays.asList(card1, card2)); + Card card3 = new Card(Score.SEVEN, Suit.CLUB); + GivenCards otherCards = new GivenCards(Arrays.asList(card1, card3)); + + //when + boolean result = myCards.isGreaterThan(otherCards); + + //then + assertThat(result).isTrue(); + } + + @Test + @DisplayName("인자로 받은 카드보다 자신의 카드 합보다 작을 경우, 참을 반환한다.") + void isLessThan() { + //given + Card card1 = new Card(Score.TEN, Suit.CLUB); + Card card2 = new Card(Score.NINE, Suit.CLUB); + GivenCards myCards = new GivenCards(Arrays.asList(card1, card2)); + Card card3 = new Card(Score.TEN, Suit.HEART); + GivenCards otherCards = new GivenCards(Arrays.asList(card1, card3)); + + //when + boolean result = myCards.isLessThan(otherCards); + + //then + assertThat(result).isTrue(); + } } From c07c6c6593babf817905f86ec31319c8344d3eb0 Mon Sep 17 00:00:00 2001 From: Beenie93 Date: Mon, 2 Aug 2021 02:02:04 +0900 Subject: [PATCH 30/80] =?UTF-8?q?feat:=20=EA=B2=B0=EA=B3=BC=20=EC=A0=90?= =?UTF-8?q?=EC=88=98=20enum=20=EA=B5=AC=ED=98=84?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- README.md | 7 ++++++ .../java/blackjack/domain/enums/Result.java | 17 +++++++++++++ .../blackjack/domain/enums/ResultTest.java | 24 +++++++++++++++++++ 3 files changed, 48 insertions(+) create mode 100644 src/main/java/blackjack/domain/enums/Result.java create mode 100644 src/test/java/blackjack/domain/enums/ResultTest.java diff --git a/README.md b/README.md index 457c018..f02b3a1 100644 --- a/README.md +++ b/README.md @@ -98,6 +98,13 @@ Stay : 플레이어가 추가 카드를 원하지 않음, 딜러는 카드 합 1 - 기능 - [x] 무늬 이름 반환 +- [x] 결과 enum + - 속성 + - [x] 포인트 + + - 기능 + - [x] 포인트 반환 + - [x] 현재까지 받은 카드 목록 - 속성 - [x] 현재까지 받은 카드 목록 diff --git a/src/main/java/blackjack/domain/enums/Result.java b/src/main/java/blackjack/domain/enums/Result.java new file mode 100644 index 0000000..1b3178f --- /dev/null +++ b/src/main/java/blackjack/domain/enums/Result.java @@ -0,0 +1,17 @@ +package blackjack.domain.enums; + +public enum Result { + WIN(1), + LOSE(-1), + DRAW(0); + + private final int point; + + Result(int point) { + this.point = point; + } + + public int getPoint() { + return point; + } +} diff --git a/src/test/java/blackjack/domain/enums/ResultTest.java b/src/test/java/blackjack/domain/enums/ResultTest.java new file mode 100644 index 0000000..b2699f4 --- /dev/null +++ b/src/test/java/blackjack/domain/enums/ResultTest.java @@ -0,0 +1,24 @@ +package blackjack.domain.enums; + +import org.junit.jupiter.api.DisplayName; +import org.junit.jupiter.params.ParameterizedTest; +import org.junit.jupiter.params.provider.CsvSource; + +import static org.assertj.core.api.Assertions.assertThat; + +class ResultTest { + + @ParameterizedTest + @CsvSource(value = {"WIN, 1", "LOSE, -1", "DRAW, 0"}) + @DisplayName("게임 결과 포인트를 반환한다.") + void getPoint(String resultName, int expectedPoint) { + //given + Result result = Result.valueOf(resultName); + + //when + int point = result.getPoint(); + + //then + assertThat(point).isEqualTo(expectedPoint); + } +} From 0352558dd760692395ca18e9cc3e5327ff15593c Mon Sep 17 00:00:00 2001 From: Beenie93 Date: Mon, 2 Aug 2021 02:04:14 +0900 Subject: [PATCH 31/80] =?UTF-8?q?feat:=20State=20=EC=9D=B8=ED=84=B0?= =?UTF-8?q?=ED=8E=98=EC=9D=B4=EC=8A=A4=EC=97=90=20=EA=B2=B0=EA=B3=BC=20?= =?UTF-8?q?=EC=9A=94=EC=B2=AD=20=ED=95=A8=EC=88=98=20=EC=B6=94=EA=B0=80=20?= =?UTF-8?q?=EB=B0=8F=20=EC=A0=81=EC=9A=A9?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- README.md | 2 ++ src/main/java/blackjack/domain/state/Running.java | 5 +++++ src/main/java/blackjack/domain/state/State.java | 3 +++ src/test/java/blackjack/domain/state/InitTest.java | 5 +++++ .../java/blackjack/domain/state/RunningTest.java | 12 ++++++++++++ 5 files changed, 27 insertions(+) diff --git a/README.md b/README.md index f02b3a1..bc6f38c 100644 --- a/README.md +++ b/README.md @@ -26,6 +26,7 @@ Stay : 플레이어가 추가 카드를 원하지 않음, 딜러는 카드 합 1 - [x] 모든 카드 합 반환 - [x] 참여 종료 여부 반환 - [x] 발급받은 카드 목록 반환 + - [x] 결과 요청 - [x] 시작 상태 (Init) - 기능 @@ -35,6 +36,7 @@ Stay : 플레이어가 추가 카드를 원하지 않음, 딜러는 카드 합 1 - [x] 참여 상태 (Running) - 기능 - [x] 참여 종료 여부 거짓으로 반환 + - [x] ERROR : 결과 요청할 경우 - [x] 카드 추가 받은 상태 (Hit) - 기능 diff --git a/src/main/java/blackjack/domain/state/Running.java b/src/main/java/blackjack/domain/state/Running.java index f5605b8..32b30d1 100644 --- a/src/main/java/blackjack/domain/state/Running.java +++ b/src/main/java/blackjack/domain/state/Running.java @@ -12,4 +12,9 @@ public abstract class Running extends Init { public boolean isFinished() { return false; } + + @Override + public int result(GivenCards givenCards) { + throw new IllegalStateException("게임 진행 중에는 결과를 알 수 없습니다."); + } } diff --git a/src/main/java/blackjack/domain/state/State.java b/src/main/java/blackjack/domain/state/State.java index d06479f..ff7e09c 100644 --- a/src/main/java/blackjack/domain/state/State.java +++ b/src/main/java/blackjack/domain/state/State.java @@ -4,6 +4,7 @@ import blackjack.domain.GivenCards; public interface State { + State hit(Card card); State stay(); @@ -13,4 +14,6 @@ public interface State { boolean isFinished(); GivenCards getCards(); + + int result(GivenCards givenCards); } diff --git a/src/test/java/blackjack/domain/state/InitTest.java b/src/test/java/blackjack/domain/state/InitTest.java index ef36ccf..0e6355f 100644 --- a/src/test/java/blackjack/domain/state/InitTest.java +++ b/src/test/java/blackjack/domain/state/InitTest.java @@ -48,6 +48,11 @@ void sum() { private Init createInitState(GivenCards givenCards) { return new Init(givenCards) { + @Override + public int result(GivenCards givenCards) { + return 0; + } + @Override public State hit(Card card) { return null; diff --git a/src/test/java/blackjack/domain/state/RunningTest.java b/src/test/java/blackjack/domain/state/RunningTest.java index 33ae4c6..165433b 100644 --- a/src/test/java/blackjack/domain/state/RunningTest.java +++ b/src/test/java/blackjack/domain/state/RunningTest.java @@ -10,6 +10,7 @@ import java.util.Collections; import static org.assertj.core.api.Assertions.assertThat; +import static org.assertj.core.api.Assertions.assertThatThrownBy; class RunningTest { @@ -26,6 +27,17 @@ void isFinished() { assertThat(finished).isFalse(); } + @Test + @DisplayName("게임 진행 중 게임 결과를 요청할 경우, 예외가 발생한다.") + void result() { + //given + State runningState = createRunningState(); + + //when //then + assertThatThrownBy(() -> runningState.result(new GivenCards(Collections.emptyList()))) + .hasMessage("게임 진행 중에는 결과를 알 수 없습니다."); + } + private State createRunningState() { GivenCards givenCards = new GivenCards(Collections.singletonList(new Card(Score.A, Suit.CLUB))); From 4787fa32a95e08918a3fa8c83c2650b3df6c9d14 Mon Sep 17 00:00:00 2001 From: Beenie93 Date: Mon, 2 Aug 2021 02:05:24 +0900 Subject: [PATCH 32/80] =?UTF-8?q?feat:=20BlackJack,=20Burst,=20Stay=20?= =?UTF-8?q?=EC=83=81=ED=83=9C=20=ED=85=8C=EC=8A=A4=ED=8A=B8=20=EB=B0=8F=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 | 16 ++++- .../blackjack/domain/state/Blackjack.java | 16 +++++ .../java/blackjack/domain/state/Burst.java | 16 +++++ .../java/blackjack/domain/state/Finished.java | 2 +- .../java/blackjack/domain/state/Stay.java | 26 +++++++ .../blackjack/domain/state/BlackjackTest.java | 33 +++++++++ .../blackjack/domain/state/BurstTest.java | 33 +++++++++ .../blackjack/domain/state/FinishedTest.java | 7 +- .../java/blackjack/domain/state/StayTest.java | 68 +++++++++++++++++++ 9 files changed, 211 insertions(+), 6 deletions(-) create mode 100644 src/main/java/blackjack/domain/state/Blackjack.java create mode 100644 src/main/java/blackjack/domain/state/Burst.java create mode 100644 src/main/java/blackjack/domain/state/Stay.java create mode 100644 src/test/java/blackjack/domain/state/BlackjackTest.java create mode 100644 src/test/java/blackjack/domain/state/BurstTest.java create mode 100644 src/test/java/blackjack/domain/state/StayTest.java diff --git a/README.md b/README.md index bc6f38c..2815146 100644 --- a/README.md +++ b/README.md @@ -51,9 +51,19 @@ Stay : 플레이어가 추가 카드를 원하지 않음, 딜러는 카드 합 1 - [x] ERROR : 추가 카드 발급 시 - [x] ERROR : 추가 카드 발급 거부 시 - - [] 처음 카드 두 장의 합이 21인 상태 (Blackjack) - - [] 모든 카드의 합이 21인 상태 (Burst) - - [] 카드 발급 거부 후 참여가 종료된 상태 (Stay) + - [x] 처음 카드 두 장의 합이 21인 상태 (Blackjack) + - 기능 + - [x] 승리 결과 (1) 반환 + - [x] 모든 카드의 합이 21인 상태 (Burst) + - 기능 + - [x] 패배 결과 (-1) 반환 + + - [x] 카드 발급 거부 후 참여가 종료된 상태 (Stay) + - 기능 + - [x] 결과 반환 + - [x] 자신의 합이 더 클 경우 승리 결과 (1) 반환 + - [x] 자신의 합이 더 작을 경우 패배 결과 (-1) 반환 + - [x] 자신의 합과 같을 경우 무승부 결과 (0) 반환 - [] 플레이어 - 속성 diff --git a/src/main/java/blackjack/domain/state/Blackjack.java b/src/main/java/blackjack/domain/state/Blackjack.java new file mode 100644 index 0000000..163e6a9 --- /dev/null +++ b/src/main/java/blackjack/domain/state/Blackjack.java @@ -0,0 +1,16 @@ +package blackjack.domain.state; + +import blackjack.domain.GivenCards; +import blackjack.domain.enums.Result; + +public class Blackjack extends Finished { + + public Blackjack(final GivenCards givenCards) { + super(givenCards); + } + + @Override + public int result(final GivenCards competitorCards) { + return Result.WIN.getPoint(); + } +} diff --git a/src/main/java/blackjack/domain/state/Burst.java b/src/main/java/blackjack/domain/state/Burst.java new file mode 100644 index 0000000..f548f20 --- /dev/null +++ b/src/main/java/blackjack/domain/state/Burst.java @@ -0,0 +1,16 @@ +package blackjack.domain.state; + +import blackjack.domain.GivenCards; +import blackjack.domain.enums.Result; + +public class Burst extends Finished { + + public Burst(final GivenCards givenCards) { + super(givenCards); + } + + @Override + public int result(final GivenCards competitorCards) { + return Result.LOSE.getPoint(); + } +} diff --git a/src/main/java/blackjack/domain/state/Finished.java b/src/main/java/blackjack/domain/state/Finished.java index 9990c9a..4f6cca8 100644 --- a/src/main/java/blackjack/domain/state/Finished.java +++ b/src/main/java/blackjack/domain/state/Finished.java @@ -5,7 +5,7 @@ public abstract class Finished extends Init { - protected Finished(GivenCards givenCards) { + protected Finished(final GivenCards givenCards) { super(givenCards); } diff --git a/src/main/java/blackjack/domain/state/Stay.java b/src/main/java/blackjack/domain/state/Stay.java new file mode 100644 index 0000000..6b7306c --- /dev/null +++ b/src/main/java/blackjack/domain/state/Stay.java @@ -0,0 +1,26 @@ +package blackjack.domain.state; + +import blackjack.domain.GivenCards; +import blackjack.domain.enums.Result; + +public class Stay extends Finished { + + public Stay(final GivenCards givenCards) { + super(givenCards); + } + + @Override + public int result(final GivenCards competitorCards) { + GivenCards myCards = getCards(); + + if (myCards.isGreaterThan(competitorCards)) { + return Result.WIN.getPoint(); + } + + if (myCards.isLessThan(competitorCards)) { + return Result.LOSE.getPoint(); + } + + return Result.DRAW.getPoint(); + } +} diff --git a/src/test/java/blackjack/domain/state/BlackjackTest.java b/src/test/java/blackjack/domain/state/BlackjackTest.java new file mode 100644 index 0000000..d82d4fd --- /dev/null +++ b/src/test/java/blackjack/domain/state/BlackjackTest.java @@ -0,0 +1,33 @@ +package blackjack.domain.state; + +import blackjack.domain.Card; +import blackjack.domain.GivenCards; +import blackjack.domain.enums.Score; +import blackjack.domain.enums.Suit; +import org.junit.jupiter.api.DisplayName; +import org.junit.jupiter.api.Test; + +import java.util.Arrays; +import java.util.Collections; + +import static org.assertj.core.api.Assertions.assertThat; + +class BlackjackTest { + + @Test + @DisplayName("승리를 의미하는 1을 반환한다.") + void result() { + //given + Card card1 = new Card(Score.EIGHT, Suit.CLUB); + Card card2 = new Card(Score.EIGHT, Suit.HEART); + GivenCards myCards = new GivenCards(Arrays.asList(card1, card2)); + State blackjack = new Blackjack(myCards); + GivenCards otherCards = new GivenCards(Collections.emptyList()); + + //when + int result = blackjack.result(otherCards); + + //then + assertThat(result).isEqualTo(1); + } +} diff --git a/src/test/java/blackjack/domain/state/BurstTest.java b/src/test/java/blackjack/domain/state/BurstTest.java new file mode 100644 index 0000000..1a9a1ff --- /dev/null +++ b/src/test/java/blackjack/domain/state/BurstTest.java @@ -0,0 +1,33 @@ +package blackjack.domain.state; + +import blackjack.domain.Card; +import blackjack.domain.GivenCards; +import blackjack.domain.enums.Score; +import blackjack.domain.enums.Suit; +import org.junit.jupiter.api.DisplayName; +import org.junit.jupiter.api.Test; + +import java.util.Arrays; +import java.util.Collections; + +import static org.assertj.core.api.Assertions.assertThat; + +class BurstTest { + + @Test + @DisplayName("패배를 의미하는 -1을 반환한다.") + void result() { + //given + Card card1 = new Card(Score.EIGHT, Suit.CLUB); + Card card2 = new Card(Score.EIGHT, Suit.HEART); + GivenCards myCards = new GivenCards(Arrays.asList(card1, card2)); + State burst = new Burst(myCards); + GivenCards otherCards = new GivenCards(Collections.emptyList()); + + //when + int result = burst.result(otherCards); + + //then + assertThat(result).isEqualTo(-1); + } +} diff --git a/src/test/java/blackjack/domain/state/FinishedTest.java b/src/test/java/blackjack/domain/state/FinishedTest.java index 9210663..415aeef 100644 --- a/src/test/java/blackjack/domain/state/FinishedTest.java +++ b/src/test/java/blackjack/domain/state/FinishedTest.java @@ -56,6 +56,11 @@ private State createFinishedState() { GivenCards givenCards = new GivenCards(Collections.singletonList(new Card(Score.A, Suit.CLUB))); return new Finished(givenCards) { + @Override + public int result(GivenCards competitorCards) { + return 0; + } + @Override public int sum() { return 0; @@ -67,6 +72,4 @@ public GivenCards getCards() { } }; } - - } diff --git a/src/test/java/blackjack/domain/state/StayTest.java b/src/test/java/blackjack/domain/state/StayTest.java new file mode 100644 index 0000000..f1169e8 --- /dev/null +++ b/src/test/java/blackjack/domain/state/StayTest.java @@ -0,0 +1,68 @@ +package blackjack.domain.state; + +import blackjack.domain.Card; +import blackjack.domain.GivenCards; +import blackjack.domain.enums.Score; +import blackjack.domain.enums.Suit; +import org.junit.jupiter.api.DisplayName; +import org.junit.jupiter.api.Test; + +import java.util.Arrays; + +import static org.assertj.core.api.Assertions.assertThat; + +class StayTest { + + @Test + @DisplayName("다른 카드의 합보다 클 경우, 승리를 의미하는 1을 반환한다.") + void result_win() { + //given + Card card1 = new Card(Score.EIGHT, Suit.CLUB); + Card card2 = new Card(Score.EIGHT, Suit.HEART); + GivenCards myCards = new GivenCards(Arrays.asList(card1, card2)); + State stay = new Stay(myCards); + Card card3 = new Card(Score.SEVEN, Suit.DIAMOND); + GivenCards otherCards = new GivenCards(Arrays.asList(card1, card3)); + + //when + int result = stay.result(otherCards); + + //then + assertThat(result).isEqualTo(1); + } + + @Test + @DisplayName("다른 카드의 합보다 작을 경우, 패배를 의미하는 -1을 반환한다.") + void result_lose() { + //given + Card card1 = new Card(Score.EIGHT, Suit.CLUB); + Card card2 = new Card(Score.EIGHT, Suit.HEART); + GivenCards myCards = new GivenCards(Arrays.asList(card1, card2)); + State stay = new Stay(myCards); + Card card3 = new Card(Score.NINE, Suit.DIAMOND); + GivenCards otherCards = new GivenCards(Arrays.asList(card1, card3)); + + //when + int result = stay.result(otherCards); + + //then + assertThat(result).isEqualTo(-1); + } + + @Test + @DisplayName("다른 카드의 합과 같은 경우, 무승부를 의미하는 0을 반환한다.") + void result_draw() { + //given + Card card1 = new Card(Score.EIGHT, Suit.CLUB); + Card card2 = new Card(Score.EIGHT, Suit.HEART); + GivenCards myCards = new GivenCards(Arrays.asList(card1, card2)); + State stay = new Stay(myCards); + GivenCards otherCards = new GivenCards(Arrays.asList(card1, card2)); + + //when + int result = stay.result(otherCards); + + //then + assertThat(result).isEqualTo(0); + } +} From 0a5c219e522576cec387b7b0c8fa696f0136f601 Mon Sep 17 00:00:00 2001 From: Beenie93 Date: Mon, 2 Aug 2021 02:07:59 +0900 Subject: [PATCH 33/80] =?UTF-8?q?style:=20=EC=83=81=ED=83=9C=20=EA=B4=80?= =?UTF-8?q?=EB=A0=A8=20=ED=81=B4=EB=9E=98=EC=8A=A4=20=ED=8C=A8=ED=82=A4?= =?UTF-8?q?=EC=A7=80=20=EB=B3=80=EA=B2=BD?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../blackjack/domain/state/{ => finished}/Blackjack.java | 2 +- .../java/blackjack/domain/state/{ => finished}/Burst.java | 2 +- .../java/blackjack/domain/state/{ => finished}/Finished.java | 4 +++- .../java/blackjack/domain/state/{ => finished}/Stay.java | 2 +- src/main/java/blackjack/domain/state/{ => running}/Hit.java | 5 ++++- .../java/blackjack/domain/state/{ => running}/Running.java | 3 ++- .../blackjack/domain/state/{ => finished}/BlackjackTest.java | 3 ++- .../blackjack/domain/state/{ => finished}/BurstTest.java | 3 ++- .../blackjack/domain/state/{ => finished}/FinishedTest.java | 3 ++- .../java/blackjack/domain/state/{ => finished}/StayTest.java | 3 ++- .../java/blackjack/domain/state/{ => running}/HitTest.java | 5 ++++- .../blackjack/domain/state/{ => running}/RunningTest.java | 3 ++- 12 files changed, 26 insertions(+), 12 deletions(-) rename src/main/java/blackjack/domain/state/{ => finished}/Blackjack.java (88%) rename src/main/java/blackjack/domain/state/{ => finished}/Burst.java (88%) rename src/main/java/blackjack/domain/state/{ => finished}/Finished.java (84%) rename src/main/java/blackjack/domain/state/{ => finished}/Stay.java (93%) rename src/main/java/blackjack/domain/state/{ => running}/Hit.java (75%) rename src/main/java/blackjack/domain/state/{ => running}/Running.java (84%) rename src/test/java/blackjack/domain/state/{ => finished}/BlackjackTest.java (92%) rename src/test/java/blackjack/domain/state/{ => finished}/BurstTest.java (91%) rename src/test/java/blackjack/domain/state/{ => finished}/FinishedTest.java (96%) rename src/test/java/blackjack/domain/state/{ => finished}/StayTest.java (96%) rename src/test/java/blackjack/domain/state/{ => running}/HitTest.java (91%) rename src/test/java/blackjack/domain/state/{ => running}/RunningTest.java (95%) diff --git a/src/main/java/blackjack/domain/state/Blackjack.java b/src/main/java/blackjack/domain/state/finished/Blackjack.java similarity index 88% rename from src/main/java/blackjack/domain/state/Blackjack.java rename to src/main/java/blackjack/domain/state/finished/Blackjack.java index 163e6a9..be6f6c8 100644 --- a/src/main/java/blackjack/domain/state/Blackjack.java +++ b/src/main/java/blackjack/domain/state/finished/Blackjack.java @@ -1,4 +1,4 @@ -package blackjack.domain.state; +package blackjack.domain.state.finished; import blackjack.domain.GivenCards; import blackjack.domain.enums.Result; diff --git a/src/main/java/blackjack/domain/state/Burst.java b/src/main/java/blackjack/domain/state/finished/Burst.java similarity index 88% rename from src/main/java/blackjack/domain/state/Burst.java rename to src/main/java/blackjack/domain/state/finished/Burst.java index f548f20..a174302 100644 --- a/src/main/java/blackjack/domain/state/Burst.java +++ b/src/main/java/blackjack/domain/state/finished/Burst.java @@ -1,4 +1,4 @@ -package blackjack.domain.state; +package blackjack.domain.state.finished; import blackjack.domain.GivenCards; import blackjack.domain.enums.Result; diff --git a/src/main/java/blackjack/domain/state/Finished.java b/src/main/java/blackjack/domain/state/finished/Finished.java similarity index 84% rename from src/main/java/blackjack/domain/state/Finished.java rename to src/main/java/blackjack/domain/state/finished/Finished.java index 4f6cca8..c451653 100644 --- a/src/main/java/blackjack/domain/state/Finished.java +++ b/src/main/java/blackjack/domain/state/finished/Finished.java @@ -1,7 +1,9 @@ -package blackjack.domain.state; +package blackjack.domain.state.finished; import blackjack.domain.Card; import blackjack.domain.GivenCards; +import blackjack.domain.state.Init; +import blackjack.domain.state.State; public abstract class Finished extends Init { diff --git a/src/main/java/blackjack/domain/state/Stay.java b/src/main/java/blackjack/domain/state/finished/Stay.java similarity index 93% rename from src/main/java/blackjack/domain/state/Stay.java rename to src/main/java/blackjack/domain/state/finished/Stay.java index 6b7306c..6a17ca8 100644 --- a/src/main/java/blackjack/domain/state/Stay.java +++ b/src/main/java/blackjack/domain/state/finished/Stay.java @@ -1,4 +1,4 @@ -package blackjack.domain.state; +package blackjack.domain.state.finished; import blackjack.domain.GivenCards; import blackjack.domain.enums.Result; diff --git a/src/main/java/blackjack/domain/state/Hit.java b/src/main/java/blackjack/domain/state/running/Hit.java similarity index 75% rename from src/main/java/blackjack/domain/state/Hit.java rename to src/main/java/blackjack/domain/state/running/Hit.java index 8c3b75c..9cb7bae 100644 --- a/src/main/java/blackjack/domain/state/Hit.java +++ b/src/main/java/blackjack/domain/state/running/Hit.java @@ -1,7 +1,10 @@ -package blackjack.domain.state; +package blackjack.domain.state.running; import blackjack.domain.Card; import blackjack.domain.GivenCards; +import blackjack.domain.state.State; +import blackjack.domain.state.finished.Burst; +import blackjack.domain.state.finished.Stay; public class Hit extends Running { diff --git a/src/main/java/blackjack/domain/state/Running.java b/src/main/java/blackjack/domain/state/running/Running.java similarity index 84% rename from src/main/java/blackjack/domain/state/Running.java rename to src/main/java/blackjack/domain/state/running/Running.java index 32b30d1..8d3a6fe 100644 --- a/src/main/java/blackjack/domain/state/Running.java +++ b/src/main/java/blackjack/domain/state/running/Running.java @@ -1,6 +1,7 @@ -package blackjack.domain.state; +package blackjack.domain.state.running; import blackjack.domain.GivenCards; +import blackjack.domain.state.Init; public abstract class Running extends Init { diff --git a/src/test/java/blackjack/domain/state/BlackjackTest.java b/src/test/java/blackjack/domain/state/finished/BlackjackTest.java similarity index 92% rename from src/test/java/blackjack/domain/state/BlackjackTest.java rename to src/test/java/blackjack/domain/state/finished/BlackjackTest.java index d82d4fd..bedeec8 100644 --- a/src/test/java/blackjack/domain/state/BlackjackTest.java +++ b/src/test/java/blackjack/domain/state/finished/BlackjackTest.java @@ -1,9 +1,10 @@ -package blackjack.domain.state; +package blackjack.domain.state.finished; import blackjack.domain.Card; import blackjack.domain.GivenCards; import blackjack.domain.enums.Score; import blackjack.domain.enums.Suit; +import blackjack.domain.state.State; import org.junit.jupiter.api.DisplayName; import org.junit.jupiter.api.Test; diff --git a/src/test/java/blackjack/domain/state/BurstTest.java b/src/test/java/blackjack/domain/state/finished/BurstTest.java similarity index 91% rename from src/test/java/blackjack/domain/state/BurstTest.java rename to src/test/java/blackjack/domain/state/finished/BurstTest.java index 1a9a1ff..dc5bc46 100644 --- a/src/test/java/blackjack/domain/state/BurstTest.java +++ b/src/test/java/blackjack/domain/state/finished/BurstTest.java @@ -1,9 +1,10 @@ -package blackjack.domain.state; +package blackjack.domain.state.finished; import blackjack.domain.Card; import blackjack.domain.GivenCards; import blackjack.domain.enums.Score; import blackjack.domain.enums.Suit; +import blackjack.domain.state.State; import org.junit.jupiter.api.DisplayName; import org.junit.jupiter.api.Test; diff --git a/src/test/java/blackjack/domain/state/FinishedTest.java b/src/test/java/blackjack/domain/state/finished/FinishedTest.java similarity index 96% rename from src/test/java/blackjack/domain/state/FinishedTest.java rename to src/test/java/blackjack/domain/state/finished/FinishedTest.java index 415aeef..ce05b57 100644 --- a/src/test/java/blackjack/domain/state/FinishedTest.java +++ b/src/test/java/blackjack/domain/state/finished/FinishedTest.java @@ -1,9 +1,10 @@ -package blackjack.domain.state; +package blackjack.domain.state.finished; import blackjack.domain.Card; import blackjack.domain.GivenCards; import blackjack.domain.enums.Score; import blackjack.domain.enums.Suit; +import blackjack.domain.state.State; import org.junit.jupiter.api.DisplayName; import org.junit.jupiter.api.Test; diff --git a/src/test/java/blackjack/domain/state/StayTest.java b/src/test/java/blackjack/domain/state/finished/StayTest.java similarity index 96% rename from src/test/java/blackjack/domain/state/StayTest.java rename to src/test/java/blackjack/domain/state/finished/StayTest.java index f1169e8..bd7eb46 100644 --- a/src/test/java/blackjack/domain/state/StayTest.java +++ b/src/test/java/blackjack/domain/state/finished/StayTest.java @@ -1,9 +1,10 @@ -package blackjack.domain.state; +package blackjack.domain.state.finished; import blackjack.domain.Card; import blackjack.domain.GivenCards; import blackjack.domain.enums.Score; import blackjack.domain.enums.Suit; +import blackjack.domain.state.State; import org.junit.jupiter.api.DisplayName; import org.junit.jupiter.api.Test; diff --git a/src/test/java/blackjack/domain/state/HitTest.java b/src/test/java/blackjack/domain/state/running/HitTest.java similarity index 91% rename from src/test/java/blackjack/domain/state/HitTest.java rename to src/test/java/blackjack/domain/state/running/HitTest.java index bbf83cc..193d5ef 100644 --- a/src/test/java/blackjack/domain/state/HitTest.java +++ b/src/test/java/blackjack/domain/state/running/HitTest.java @@ -1,9 +1,12 @@ -package blackjack.domain.state; +package blackjack.domain.state.running; import blackjack.domain.Card; import blackjack.domain.GivenCards; import blackjack.domain.enums.Score; import blackjack.domain.enums.Suit; +import blackjack.domain.state.State; +import blackjack.domain.state.finished.Burst; +import blackjack.domain.state.finished.Stay; import org.junit.jupiter.api.DisplayName; import org.junit.jupiter.api.Test; diff --git a/src/test/java/blackjack/domain/state/RunningTest.java b/src/test/java/blackjack/domain/state/running/RunningTest.java similarity index 95% rename from src/test/java/blackjack/domain/state/RunningTest.java rename to src/test/java/blackjack/domain/state/running/RunningTest.java index 165433b..aab84b0 100644 --- a/src/test/java/blackjack/domain/state/RunningTest.java +++ b/src/test/java/blackjack/domain/state/running/RunningTest.java @@ -1,9 +1,10 @@ -package blackjack.domain.state; +package blackjack.domain.state.running; import blackjack.domain.Card; import blackjack.domain.GivenCards; import blackjack.domain.enums.Score; import blackjack.domain.enums.Suit; +import blackjack.domain.state.State; import org.junit.jupiter.api.DisplayName; import org.junit.jupiter.api.Test; From a046ee8d69c336a8cf0cae7334075443e7c1bdc2 Mon Sep 17 00:00:00 2001 From: Beenie93 Date: Mon, 2 Aug 2021 03:04:39 +0900 Subject: [PATCH 34/80] =?UTF-8?q?feat:=20=ED=94=8C=EB=A0=88=EC=9D=B4?= =?UTF-8?q?=EC=96=B4=20=ED=85=8C=EC=8A=A4=ED=8A=B8=20=EB=B0=8F=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 | 13 +- src/main/java/blackjack/domain/Player.java | 46 ++++++ .../java/blackjack/domain/PlayerTest.java | 134 ++++++++++++++++++ 3 files changed, 188 insertions(+), 5 deletions(-) create mode 100644 src/main/java/blackjack/domain/Player.java create mode 100644 src/test/java/blackjack/domain/PlayerTest.java diff --git a/README.md b/README.md index 2815146..ffe22bd 100644 --- a/README.md +++ b/README.md @@ -65,14 +65,17 @@ Stay : 플레이어가 추가 카드를 원하지 않음, 딜러는 카드 합 1 - [x] 자신의 합이 더 작을 경우 패배 결과 (-1) 반환 - [x] 자신의 합과 같을 경우 무승부 결과 (0) 반환 -- [] 플레이어 +- [x] 플레이어 - 속성 - - [] 이름 - - [] 카드 목록 + - [x] 이름 + - [x] 카드 목록 - 기능 - - [] 초기 카드 2장을 받는다 - - [] 카드 추가 요청 + - [x] 초기 카드 2장을 받는다 + - [x] 카드 추가 발급 + - [x] 카드 추가 발급 거부 + - [x] 카드 목록 반환 + - [x] 카드 합 반환 - [] 딜러 - 속성 diff --git a/src/main/java/blackjack/domain/Player.java b/src/main/java/blackjack/domain/Player.java new file mode 100644 index 0000000..6ef280c --- /dev/null +++ b/src/main/java/blackjack/domain/Player.java @@ -0,0 +1,46 @@ +package blackjack.domain; + +import blackjack.domain.participant.Participant; +import blackjack.domain.state.State; +import blackjack.domain.state.finished.Blackjack; +import blackjack.domain.state.finished.Stay; +import blackjack.domain.state.running.Hit; + +public class Player implements Participant { + private final String name; + private State state; + + public Player(final String name, final GivenCards cards) { + this.name = name; + initState(cards); + } + + private void initState(final GivenCards cards) { + if (cards.isBlackjack()) { + state = new Blackjack(cards); + return; + } + + state = new Hit(cards); + } + + @Override + public void hit(final Card card) { + state = state.hit(card); + } + + @Override + public void stay() { + state = new Stay(getCards()); + } + + @Override + public GivenCards getCards() { + return state.getCards(); + } + + @Override + public int sum() { + return state.sum(); + } +} diff --git a/src/test/java/blackjack/domain/PlayerTest.java b/src/test/java/blackjack/domain/PlayerTest.java new file mode 100644 index 0000000..1f3a868 --- /dev/null +++ b/src/test/java/blackjack/domain/PlayerTest.java @@ -0,0 +1,134 @@ +package blackjack.domain; + +import blackjack.domain.enums.Score; +import blackjack.domain.enums.Suit; +import blackjack.domain.state.finished.Blackjack; +import blackjack.domain.state.finished.Burst; +import blackjack.domain.state.finished.Stay; +import blackjack.domain.state.running.Hit; +import org.junit.jupiter.api.DisplayName; +import org.junit.jupiter.api.Test; + +import java.util.Arrays; + +import static org.assertj.core.api.Assertions.assertThat; + +public class PlayerTest { + + @Test + @DisplayName("처음 받은 카드 두 장의 합이 21일 경우, Blackjack 상태가 된다.") + void create_state_blackjack() { + //given + Card card1 = new Card(Score.A, Suit.DIAMOND); + Card card2 = new Card(Score.TEN, Suit.DIAMOND); + GivenCards givenCards = new GivenCards(Arrays.asList(card1, card2)); + + //when + Player player = new Player("pobi", givenCards); + + //then + assertThat(player).extracting("state") + .isInstanceOf(Blackjack.class); + } + + @Test + @DisplayName("처음 받은 카드 두 장의 합이 21 미만일 경우, Hit 상태가 된다.") + void create_state_hit() { + //given + Card card1 = new Card(Score.TEN, Suit.DIAMOND); + Card card2 = new Card(Score.TEN, Suit.CLUB); + GivenCards givenCards = new GivenCards(Arrays.asList(card1, card2)); + + //when + Player player = new Player("pobi", givenCards); + + //then + assertThat(player).extracting("state") + .isInstanceOf(Hit.class); + } + + @Test + @DisplayName("발급 받은 카드를 더한 합이 21을 초과할 경우, Burst 상태가 된다.") + void hit_become_burst_state() { + //given + Card card1 = new Card(Score.TEN, Suit.DIAMOND); + Card card2 = new Card(Score.TEN, Suit.CLUB); + GivenCards givenCards = new GivenCards(Arrays.asList(card1, card2)); + Player player = new Player("pobi", givenCards); + Card card3 = new Card(Score.TWO, Suit.HEART); + + //when + player.hit(card3); + + //then + assertThat(player).extracting("state") + .isInstanceOf(Burst.class); + } + + @Test + @DisplayName("발급 받은 카드를 더한 합이 21 이하일 경우, Hit 상태가 된다.") + void hit_remain_hit_state() { + //given + Card card1 = new Card(Score.TEN, Suit.DIAMOND); + Card card2 = new Card(Score.NINE, Suit.DIAMOND); + GivenCards givenCards = new GivenCards(Arrays.asList(card1, card2)); + Player player = new Player("pobi", givenCards); + Card card3 = new Card(Score.TWO, Suit.HEART); + + //when + player.hit(card3); + + //then + assertThat(player).extracting("state") + .isInstanceOf(Hit.class); + } + + @Test + @DisplayName("추가 카드 발급을 거부할 경우, Stay 상태가 된다.") + void stay() { + //given + Card card1 = new Card(Score.TEN, Suit.DIAMOND); + Card card2 = new Card(Score.NINE, Suit.DIAMOND); + GivenCards givenCards = new GivenCards(Arrays.asList(card1, card2)); + Player player = new Player("pobi", givenCards); + + //when + player.stay(); + + //then + assertThat(player).extracting("state") + .isInstanceOf(Stay.class); + } + + @Test + @DisplayName("발급 받은 카드 목록을 반환한다.") + void getCards() { + //given + Card card1 = new Card(Score.TEN, Suit.DIAMOND); + Card card2 = new Card(Score.NINE, Suit.DIAMOND); + GivenCards givenCards = new GivenCards(Arrays.asList(card1, card2)); + Player player = new Player("pobi", givenCards); + + //when + GivenCards cards = player.getCards(); + + //then + assertThat(cards).isEqualTo(givenCards); + } + + @Test + @DisplayName("카드의 합을 반환한다.") + void sum() { + //given + Card card1 = new Card(Score.TEN, Suit.DIAMOND); + Card card2 = new Card(Score.NINE, Suit.DIAMOND); + GivenCards givenCards = new GivenCards(Arrays.asList(card1, card2)); + Player player = new Player("pobi", givenCards); + + //when + int sum = player.sum(); + + //then + assertThat(sum).isEqualTo(19); + } +} From 7175ca3b61e3d8812ccad9bc91012a02a2a41354 Mon Sep 17 00:00:00 2001 From: Beenie93 Date: Mon, 2 Aug 2021 03:39:23 +0900 Subject: [PATCH 35/80] =?UTF-8?q?refactor:=20private=20->=20protected=20?= =?UTF-8?q?=EC=A0=91=EA=B7=BC=EC=A0=9C=EC=96=B4=EC=9E=90=20=EB=B3=80?= =?UTF-8?q?=EA=B2=BD?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- src/main/java/blackjack/domain/state/Init.java | 2 +- src/main/java/blackjack/domain/state/finished/Stay.java | 6 ++---- src/main/java/blackjack/domain/state/running/Hit.java | 1 - 3 files changed, 3 insertions(+), 6 deletions(-) diff --git a/src/main/java/blackjack/domain/state/Init.java b/src/main/java/blackjack/domain/state/Init.java index 2af458d..ba7dfcd 100644 --- a/src/main/java/blackjack/domain/state/Init.java +++ b/src/main/java/blackjack/domain/state/Init.java @@ -3,7 +3,7 @@ import blackjack.domain.GivenCards; public abstract class Init implements State { - private final GivenCards givenCards; + protected final GivenCards givenCards; protected Init(final GivenCards givenCards) { this.givenCards = givenCards; diff --git a/src/main/java/blackjack/domain/state/finished/Stay.java b/src/main/java/blackjack/domain/state/finished/Stay.java index 6a17ca8..6504beb 100644 --- a/src/main/java/blackjack/domain/state/finished/Stay.java +++ b/src/main/java/blackjack/domain/state/finished/Stay.java @@ -11,13 +11,11 @@ public Stay(final GivenCards givenCards) { @Override public int result(final GivenCards competitorCards) { - GivenCards myCards = getCards(); - - if (myCards.isGreaterThan(competitorCards)) { + if (givenCards.isGreaterThan(competitorCards)) { return Result.WIN.getPoint(); } - if (myCards.isLessThan(competitorCards)) { + if (givenCards.isLessThan(competitorCards)) { return Result.LOSE.getPoint(); } diff --git a/src/main/java/blackjack/domain/state/running/Hit.java b/src/main/java/blackjack/domain/state/running/Hit.java index 9cb7bae..a5ed76f 100644 --- a/src/main/java/blackjack/domain/state/running/Hit.java +++ b/src/main/java/blackjack/domain/state/running/Hit.java @@ -14,7 +14,6 @@ public Hit(final GivenCards givenCards) { @Override public State hit(final Card card) { - GivenCards givenCards = getCards(); givenCards.add(card); if (givenCards.isBurst()) { From 7178c1e80a4d4d8f4bf16ef033b370881842fd92 Mon Sep 17 00:00:00 2001 From: Beenie93 Date: Mon, 2 Aug 2021 04:12:32 +0900 Subject: [PATCH 36/80] =?UTF-8?q?feat:=20=EA=B2=8C=EC=9E=84=20=EC=B0=B8?= =?UTF-8?q?=EC=97=AC=EC=9E=90(=ED=94=8C=EB=A0=88=EC=9D=B4=EC=96=B4,=20?= =?UTF-8?q?=EB=94=9C=EB=9F=AC)=EB=93=A4=EC=9D=B4=20=EA=B0=80=EC=A7=80?= =?UTF-8?q?=EB=8A=94=20=EA=B3=B5=ED=86=B5=20=EB=A9=94=EC=84=9C=EB=93=9C,?= =?UTF-8?q?=20=EB=B3=80=EC=88=98=20=EB=B6=84=EB=A6=AC?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- README.md | 36 ++++- src/main/java/blackjack/domain/Player.java | 46 ------ .../blackjack/domain/participant/Gamer.java | 39 +++++ .../blackjack/domain/participant/Person.java | 22 +++ .../blackjack/domain/participant/Player.java | 29 ++++ .../domain/participant/GamerTest.java | 137 ++++++++++++++++++ .../domain/{ => participant}/PlayerTest.java | 62 +------- 7 files changed, 265 insertions(+), 106 deletions(-) delete mode 100644 src/main/java/blackjack/domain/Player.java create mode 100644 src/main/java/blackjack/domain/participant/Gamer.java create mode 100644 src/main/java/blackjack/domain/participant/Person.java create mode 100644 src/main/java/blackjack/domain/participant/Player.java create mode 100644 src/test/java/blackjack/domain/participant/GamerTest.java rename src/test/java/blackjack/domain/{ => participant}/PlayerTest.java (58%) diff --git a/README.md b/README.md index ffe22bd..8c3c17f 100644 --- a/README.md +++ b/README.md @@ -65,17 +65,43 @@ Stay : 플레이어가 추가 카드를 원하지 않음, 딜러는 카드 합 1 - [x] 자신의 합이 더 작을 경우 패배 결과 (-1) 반환 - [x] 자신의 합과 같을 경우 무승부 결과 (0) 반환 -- [x] 플레이어 +- [x] 사람 (Person) + - 기능 + - [x] 초기 상태 주입 + - [x] 카드 추가 발급 + - [x] 카드 추가 발급 거부 + - [x] 카드 목록 반환 + - [x] 카드 합 반환 + - [x] 이름 반환 + - [x] 종료 여부 반환 + +- [x] 게임 참여자 (Gamer) + - 기능 + - [x] 카드 추가 발급 거부 + - [x] 카드 목록 반환 + - [x] 카드 합 반환 + - [x] 이름 반환 + - [x] 종료 여부 반환 + +- [x] 플레이어 (Player) - 속성 - [x] 이름 - [x] 카드 목록 - 기능 - - [x] 초기 카드 2장을 받는다 + - [x] 초기 상태 주입 + - [x] 카드 2장의 합 21일 경우 Blackjack 상태 + - [x] 카드 2장의 합 21 미만일 경우 Hit 상태 - [x] 카드 추가 발급 - - [x] 카드 추가 발급 거부 - - [x] 카드 목록 반환 - - [x] 카드 합 반환 + +- [] 딜러 (Dealer) + - 속성 + - [] 이름 + - [] 카드 목록 + + - 기능 + - [] 초기 상태 주입 + - [] 카드 추가 발급 - [] 딜러 - 속성 diff --git a/src/main/java/blackjack/domain/Player.java b/src/main/java/blackjack/domain/Player.java deleted file mode 100644 index 6ef280c..0000000 --- a/src/main/java/blackjack/domain/Player.java +++ /dev/null @@ -1,46 +0,0 @@ -package blackjack.domain; - -import blackjack.domain.participant.Participant; -import blackjack.domain.state.State; -import blackjack.domain.state.finished.Blackjack; -import blackjack.domain.state.finished.Stay; -import blackjack.domain.state.running.Hit; - -public class Player implements Participant { - private final String name; - private State state; - - public Player(final String name, final GivenCards cards) { - this.name = name; - initState(cards); - } - - private void initState(final GivenCards cards) { - if (cards.isBlackjack()) { - state = new Blackjack(cards); - return; - } - - state = new Hit(cards); - } - - @Override - public void hit(final Card card) { - state = state.hit(card); - } - - @Override - public void stay() { - state = new Stay(getCards()); - } - - @Override - public GivenCards getCards() { - return state.getCards(); - } - - @Override - public int sum() { - return state.sum(); - } -} diff --git a/src/main/java/blackjack/domain/participant/Gamer.java b/src/main/java/blackjack/domain/participant/Gamer.java new file mode 100644 index 0000000..a0df9d7 --- /dev/null +++ b/src/main/java/blackjack/domain/participant/Gamer.java @@ -0,0 +1,39 @@ +package blackjack.domain.participant; + +import blackjack.domain.GivenCards; +import blackjack.domain.state.State; +import blackjack.domain.state.finished.Stay; + +public abstract class Gamer implements Person { + private final String name; + protected State state; + + protected Gamer(final String name) { + this.name = name; + } + + @Override + public GivenCards getCards() { + return state.getCards(); + } + + @Override + public String getName() { + return name; + } + + @Override + public int sum() { + return state.sum(); + } + + @Override + public void stay() { + state = new Stay(getCards()); + } + + @Override + public boolean isFinished() { + return state.isFinished(); + } +} diff --git a/src/main/java/blackjack/domain/participant/Person.java b/src/main/java/blackjack/domain/participant/Person.java new file mode 100644 index 0000000..5ad35ce --- /dev/null +++ b/src/main/java/blackjack/domain/participant/Person.java @@ -0,0 +1,22 @@ +package blackjack.domain.participant; + +import blackjack.domain.Card; +import blackjack.domain.GivenCards; +import blackjack.domain.state.State; + +public interface Person { + + State injectStateBy(GivenCards cards); + + void hit(Card card); + + GivenCards getCards(); + + String getName(); + + int sum(); + + void stay(); + + boolean isFinished(); +} diff --git a/src/main/java/blackjack/domain/participant/Player.java b/src/main/java/blackjack/domain/participant/Player.java new file mode 100644 index 0000000..91988d9 --- /dev/null +++ b/src/main/java/blackjack/domain/participant/Player.java @@ -0,0 +1,29 @@ +package blackjack.domain.participant; + +import blackjack.domain.Card; +import blackjack.domain.GivenCards; +import blackjack.domain.state.State; +import blackjack.domain.state.finished.Blackjack; +import blackjack.domain.state.running.Hit; + +public class Player extends Gamer { + + public Player(final String name, final GivenCards cards) { + super(name); + state = injectStateBy(cards); + } + + @Override + public State injectStateBy(final GivenCards cards) { + if (cards.isBlackjack()) { + return new Blackjack(cards); + } + + return new Hit(cards); + } + + @Override + public void hit(final Card card) { + state = state.hit(card); + } +} diff --git a/src/test/java/blackjack/domain/participant/GamerTest.java b/src/test/java/blackjack/domain/participant/GamerTest.java new file mode 100644 index 0000000..adbc2e7 --- /dev/null +++ b/src/test/java/blackjack/domain/participant/GamerTest.java @@ -0,0 +1,137 @@ +package blackjack.domain.participant; + +import blackjack.domain.Card; +import blackjack.domain.GivenCards; +import blackjack.domain.enums.Score; +import blackjack.domain.enums.Suit; +import blackjack.domain.state.State; +import blackjack.domain.state.finished.Stay; +import org.junit.jupiter.api.DisplayName; +import org.junit.jupiter.api.Test; + +import java.util.Arrays; +import java.util.Collections; + +import static org.assertj.core.api.Assertions.assertThat; + +class GamerTest { + + @Test + @DisplayName("추가 카드 발급을 거부할 경우, Stay 상태가 된다.") + void stay() { + //given + Card card1 = new Card(Score.TEN, Suit.DIAMOND); + Card card2 = new Card(Score.NINE, Suit.DIAMOND); + GivenCards givenCards = new GivenCards(Arrays.asList(card1, card2)); + Person gamer = createGamer("pobi", givenCards, false); + + //when + gamer.stay(); + + //then + assertThat(gamer).extracting("state") + .isInstanceOf(Stay.class); + } + + @Test + @DisplayName("발급 받은 카드 목록을 반환한다.") + void getCards() { + //given + Card card1 = new Card(Score.TEN, Suit.DIAMOND); + Card card2 = new Card(Score.NINE, Suit.DIAMOND); + GivenCards givenCards = new GivenCards(Arrays.asList(card1, card2)); + Person gamer = createGamer("pobi", givenCards, false); + + //when + GivenCards cards = gamer.getCards(); + + //then + assertThat(cards).isEqualTo(givenCards); + } + + @Test + @DisplayName("카드의 합을 반환한다.") + void sum() { + //given + Card card1 = new Card(Score.TEN, Suit.DIAMOND); + Card card2 = new Card(Score.NINE, Suit.DIAMOND); + GivenCards givenCards = new GivenCards(Arrays.asList(card1, card2)); + Person gamer = createGamer("pobi", givenCards, false); + + //when + int sum = gamer.sum(); + + //then + assertThat(sum).isEqualTo(19); + } + + @Test + @DisplayName("이름을 반환한다.") + void getName() { + //given + GivenCards givenCards = new GivenCards(Collections.emptyList()); + String playerName = "pobi"; + Person gamer = createGamer("pobi", givenCards, false); + + //when + String name = gamer.getName(); + + //then + assertThat(name).isEqualTo(playerName); + } + + @Test + @DisplayName("종료 여부를 반환한다.") + void isFinished() { + //given + Card card1 = new Card(Score.A, Suit.DIAMOND); + Card card2 = new Card(Score.TEN, Suit.DIAMOND); + GivenCards givenCards = new GivenCards(Arrays.asList(card1, card2)); + Person gamer = createGamer("pobi", givenCards, true); + + //when + boolean finished = gamer.isFinished(); + + //then + assertThat(finished).isTrue(); + } + + private Gamer createGamer(String name, GivenCards givenCards, boolean isFinished) { + return new Gamer(name) { + @Override + public GivenCards getCards() { + return givenCards; + } + + @Override + public String getName() { + return super.getName(); + } + + @Override + public int sum() { + return givenCards.sum(); + } + + @Override + public void stay() { + super.stay(); + } + + @Override + public boolean isFinished() { + return isFinished; + } + + @Override + public State injectStateBy(GivenCards cards) { + return null; + } + + @Override + public void hit(Card card) { + + } + }; + } +} diff --git a/src/test/java/blackjack/domain/PlayerTest.java b/src/test/java/blackjack/domain/participant/PlayerTest.java similarity index 58% rename from src/test/java/blackjack/domain/PlayerTest.java rename to src/test/java/blackjack/domain/participant/PlayerTest.java index 1f3a868..a8541c5 100644 --- a/src/test/java/blackjack/domain/PlayerTest.java +++ b/src/test/java/blackjack/domain/participant/PlayerTest.java @@ -1,10 +1,11 @@ -package blackjack.domain; +package blackjack.domain.participant; +import blackjack.domain.Card; +import blackjack.domain.GivenCards; import blackjack.domain.enums.Score; import blackjack.domain.enums.Suit; import blackjack.domain.state.finished.Blackjack; import blackjack.domain.state.finished.Burst; -import blackjack.domain.state.finished.Stay; import blackjack.domain.state.running.Hit; import org.junit.jupiter.api.DisplayName; import org.junit.jupiter.api.Test; @@ -24,7 +25,7 @@ void create_state_blackjack() { GivenCards givenCards = new GivenCards(Arrays.asList(card1, card2)); //when - Player player = new Player("pobi", givenCards); + Person player = new Player("pobi", givenCards); //then assertThat(player).extracting("state") @@ -40,7 +41,7 @@ void create_state_hit() { GivenCards givenCards = new GivenCards(Arrays.asList(card1, card2)); //when - Player player = new Player("pobi", givenCards); + Person player = new Player("pobi", givenCards); //then assertThat(player).extracting("state") @@ -54,7 +55,7 @@ void hit_become_burst_state() { Card card1 = new Card(Score.TEN, Suit.DIAMOND); Card card2 = new Card(Score.TEN, Suit.CLUB); GivenCards givenCards = new GivenCards(Arrays.asList(card1, card2)); - Player player = new Player("pobi", givenCards); + Person player = new Player("pobi", givenCards); Card card3 = new Card(Score.TWO, Suit.HEART); //when @@ -72,7 +73,7 @@ void hit_remain_hit_state() { Card card1 = new Card(Score.TEN, Suit.DIAMOND); Card card2 = new Card(Score.NINE, Suit.DIAMOND); GivenCards givenCards = new GivenCards(Arrays.asList(card1, card2)); - Player player = new Player("pobi", givenCards); + Person player = new Player("pobi", givenCards); Card card3 = new Card(Score.TWO, Suit.HEART); //when @@ -82,53 +83,4 @@ void hit_remain_hit_state() { assertThat(player).extracting("state") .isInstanceOf(Hit.class); } - - @Test - @DisplayName("추가 카드 발급을 거부할 경우, Stay 상태가 된다.") - void stay() { - //given - Card card1 = new Card(Score.TEN, Suit.DIAMOND); - Card card2 = new Card(Score.NINE, Suit.DIAMOND); - GivenCards givenCards = new GivenCards(Arrays.asList(card1, card2)); - Player player = new Player("pobi", givenCards); - - //when - player.stay(); - - //then - assertThat(player).extracting("state") - .isInstanceOf(Stay.class); - } - - @Test - @DisplayName("발급 받은 카드 목록을 반환한다.") - void getCards() { - //given - Card card1 = new Card(Score.TEN, Suit.DIAMOND); - Card card2 = new Card(Score.NINE, Suit.DIAMOND); - GivenCards givenCards = new GivenCards(Arrays.asList(card1, card2)); - Player player = new Player("pobi", givenCards); - - //when - GivenCards cards = player.getCards(); - - //then - assertThat(cards).isEqualTo(givenCards); - } - - @Test - @DisplayName("카드의 합을 반환한다.") - void sum() { - //given - Card card1 = new Card(Score.TEN, Suit.DIAMOND); - Card card2 = new Card(Score.NINE, Suit.DIAMOND); - GivenCards givenCards = new GivenCards(Arrays.asList(card1, card2)); - Player player = new Player("pobi", givenCards); - - //when - int sum = player.sum(); - - //then - assertThat(sum).isEqualTo(19); - } } From 9fdf92b5b5b9d376ee87623f2757fb057f7a047b Mon Sep 17 00:00:00 2001 From: Beenie93 Date: Mon, 2 Aug 2021 04:28:23 +0900 Subject: [PATCH 37/80] =?UTF-8?q?feat:=20=EB=94=9C=EB=9F=AC=20=ED=85=8C?= =?UTF-8?q?=EC=8A=A4=ED=8A=B8=20=EB=B0=8F=20=EA=B5=AC=ED=98=84?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- README.md | 13 ++- .../blackjack/domain/participant/Dealer.java | 35 ++++++ .../domain/participant/DealerTest.java | 103 ++++++++++++++++++ 3 files changed, 146 insertions(+), 5 deletions(-) create mode 100644 src/main/java/blackjack/domain/participant/Dealer.java create mode 100644 src/test/java/blackjack/domain/participant/DealerTest.java diff --git a/README.md b/README.md index 8c3c17f..80fe2c9 100644 --- a/README.md +++ b/README.md @@ -94,14 +94,17 @@ Stay : 플레이어가 추가 카드를 원하지 않음, 딜러는 카드 합 1 - [x] 카드 2장의 합 21 미만일 경우 Hit 상태 - [x] 카드 추가 발급 -- [] 딜러 (Dealer) +- [x] 딜러 (Dealer) - 속성 - - [] 이름 - - [] 카드 목록 + - [x] 이름 + - [x] 카드 목록 - 기능 - - [] 초기 상태 주입 - - [] 카드 추가 발급 + - [x] 초기 상태 주입 + - [x] 카드 2장의 합 21일 경우 Blackjack 상태 + - [x] 카드 2장의 합 16 이하일 경우 Hit 상태 + - [x] 카드 2장의 합 16 초과일 경우 Stay 상태 + - [x] 카드 추가 발급 - [] 딜러 - 속성 diff --git a/src/main/java/blackjack/domain/participant/Dealer.java b/src/main/java/blackjack/domain/participant/Dealer.java new file mode 100644 index 0000000..4b1f307 --- /dev/null +++ b/src/main/java/blackjack/domain/participant/Dealer.java @@ -0,0 +1,35 @@ +package blackjack.domain.participant; + +import blackjack.domain.Card; +import blackjack.domain.GivenCards; +import blackjack.domain.state.State; +import blackjack.domain.state.finished.Blackjack; +import blackjack.domain.state.finished.Stay; +import blackjack.domain.state.running.Hit; + +public class Dealer extends Gamer { + public static final int HIT_THRESHOLD = 16; + + public Dealer(final String name, final GivenCards givenCards) { + super(name); + state = injectStateBy(givenCards); + } + + @Override + public State injectStateBy(final GivenCards cards) { + if (cards.isBlackjack()) { + return new Blackjack(cards); + } + + if (cards.sum() <= HIT_THRESHOLD) { + return new Hit(cards); + } + + return new Stay(cards); + } + + @Override + public void hit(final Card card) { + state = state.hit(card); + } +} diff --git a/src/test/java/blackjack/domain/participant/DealerTest.java b/src/test/java/blackjack/domain/participant/DealerTest.java new file mode 100644 index 0000000..36659d0 --- /dev/null +++ b/src/test/java/blackjack/domain/participant/DealerTest.java @@ -0,0 +1,103 @@ +package blackjack.domain.participant; + +import blackjack.domain.Card; +import blackjack.domain.GivenCards; +import blackjack.domain.enums.Score; +import blackjack.domain.enums.Suit; +import blackjack.domain.state.finished.Blackjack; +import blackjack.domain.state.finished.Burst; +import blackjack.domain.state.finished.Stay; +import blackjack.domain.state.running.Hit; +import org.junit.jupiter.api.DisplayName; +import org.junit.jupiter.api.Test; + +import java.util.Arrays; + +import static org.assertj.core.api.Assertions.assertThat; + +public class DealerTest { + + @Test + @DisplayName("처음 받은 카드 두 장의 합이 21일 경우, Blackjack 상태가 된다.") + void create_state_blackjack() { + //given + Card card1 = new Card(Score.A, Suit.DIAMOND); + Card card2 = new Card(Score.TEN, Suit.DIAMOND); + GivenCards givenCards = new GivenCards(Arrays.asList(card1, card2)); + + //when + Person dealer = new Dealer("딜러", givenCards); + + //then + assertThat(dealer).extracting("state") + .isInstanceOf(Blackjack.class); + } + + @Test + @DisplayName("처음 받은 카드 두 장의 합이 16 이하일 경우, Hit 상태가 된다.") + void create_state_hit() { + //given + Card card1 = new Card(Score.TEN, Suit.DIAMOND); + Card card2 = new Card(Score.SIX, Suit.CLUB); + GivenCards givenCards = new GivenCards(Arrays.asList(card1, card2)); + + //when + Person dealer = new Dealer("딜러", givenCards); + + //then + assertThat(dealer).extracting("state") + .isInstanceOf(Hit.class); + } + + @Test + @DisplayName("처음 받은 카드 두 장의 합이 16을 초과할 경우, Stay 상태가 된다.") + void create_state_stay() { + //given + Card card1 = new Card(Score.TEN, Suit.DIAMOND); + Card card2 = new Card(Score.SEVEN, Suit.CLUB); + GivenCards givenCards = new GivenCards(Arrays.asList(card1, card2)); + + //when + Person dealer = new Dealer("딜러", givenCards); + + //then + assertThat(dealer).extracting("state") + .isInstanceOf(Stay.class); + } + + @Test + @DisplayName("발급 받은 카드를 더한 합이 21을 초과할 경우, Burst 상태가 된다.") + void hit_become_burst_state() { + //given + Card card1 = new Card(Score.TEN, Suit.DIAMOND); + Card card2 = new Card(Score.SIX, Suit.CLUB); + GivenCards givenCards = new GivenCards(Arrays.asList(card1, card2)); + Person dealer = new Dealer("pobi", givenCards); + Card card3 = new Card(Score.SIX, Suit.HEART); + + //when + dealer.hit(card3); + + //then + assertThat(dealer).extracting("state") + .isInstanceOf(Burst.class); + } + + @Test + @DisplayName("발급 받은 카드를 더한 합이 21 이하일 경우, Hit 상태가 된다.") + void hit_remain_hit_state() { + //given + Card card1 = new Card(Score.TEN, Suit.DIAMOND); + Card card2 = new Card(Score.SIX, Suit.DIAMOND); + GivenCards givenCards = new GivenCards(Arrays.asList(card1, card2)); + Person dealer = new Dealer("pobi", givenCards); + Card card3 = new Card(Score.FIVE, Suit.HEART); + + //when + dealer.hit(card3); + + //then + assertThat(dealer).extracting("state") + .isInstanceOf(Hit.class); + } +} From a5696a48dc40154f5ce67b6c29b6edcd9a4e4ca8 Mon Sep 17 00:00:00 2001 From: Beenie93 Date: Mon, 2 Aug 2021 04:54:43 +0900 Subject: [PATCH 38/80] =?UTF-8?q?feat:=20=EB=94=9C=EB=9F=AC=EA=B0=80=20?= =?UTF-8?q?=EC=B6=94=EA=B0=80=20=EC=B9=B4=EB=93=9C=20=EB=B0=9C=EA=B8=89=20?= =?UTF-8?q?=ED=9B=84=2017=20=EC=9D=B4=EC=83=81=2021=20=EC=9D=B4=ED=95=98?= =?UTF-8?q?=EC=9D=98=20=ED=95=A9=EC=9D=84=20=EA=B0=80=EC=A7=88=20=EA=B2=BD?= =?UTF-8?q?=EC=9A=B0=20Stay=20=EC=83=81=ED=83=9C=EB=A1=9C=20=EB=B3=80?= =?UTF-8?q?=EA=B2=BD=EB=90=98=EB=8A=94=20=ED=85=8C=EC=8A=A4=ED=8A=B8=20?= =?UTF-8?q?=EB=B0=8F=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 | 11 +------- .../java/blackjack/domain/GivenCards.java | 3 +-- .../blackjack/domain/participant/Dealer.java | 13 +++++++-- .../domain/participant/DealerTest.java | 27 ++++++++++++++++--- 4 files changed, 37 insertions(+), 17 deletions(-) diff --git a/README.md b/README.md index 80fe2c9..a3a1363 100644 --- a/README.md +++ b/README.md @@ -105,16 +105,7 @@ Stay : 플레이어가 추가 카드를 원하지 않음, 딜러는 카드 합 1 - [x] 카드 2장의 합 16 이하일 경우 Hit 상태 - [x] 카드 2장의 합 16 초과일 경우 Stay 상태 - [x] 카드 추가 발급 - -- [] 딜러 - - 속성 - - [] 이름 - - [] 카드 목록 - - - 기능 - - [] 초기 카드 2장을 받는다 - - [] 카드 추가 요청 - - [] ERROR: 합이 17 이상일 경우 + - [x] 17 이상 21 이하일 경우, Stay 상태로 변경 - [x] 카드 - 속성 diff --git a/src/main/java/blackjack/domain/GivenCards.java b/src/main/java/blackjack/domain/GivenCards.java index 460e4f3..2053c54 100644 --- a/src/main/java/blackjack/domain/GivenCards.java +++ b/src/main/java/blackjack/domain/GivenCards.java @@ -6,10 +6,9 @@ import static blackjack.domain.Deck.TWO_CARDS; import static blackjack.domain.enums.Score.ACE_BONUS; +import static blackjack.domain.participant.Dealer.BLACKJACK; public class GivenCards { - private static final int BLACKJACK = 21; - private final List cards; public GivenCards(final List cards) { diff --git a/src/main/java/blackjack/domain/participant/Dealer.java b/src/main/java/blackjack/domain/participant/Dealer.java index 4b1f307..bbd743f 100644 --- a/src/main/java/blackjack/domain/participant/Dealer.java +++ b/src/main/java/blackjack/domain/participant/Dealer.java @@ -8,7 +8,8 @@ import blackjack.domain.state.running.Hit; public class Dealer extends Gamer { - public static final int HIT_THRESHOLD = 16; + private static final int HIT_THRESHOLD = 16; + public static final int BLACKJACK = 21; public Dealer(final String name, final GivenCards givenCards) { super(name); @@ -30,6 +31,14 @@ public State injectStateBy(final GivenCards cards) { @Override public void hit(final Card card) { - state = state.hit(card); + State newState = state.hit(card); + int sum = newState.sum(); + + if (sum > HIT_THRESHOLD && sum <= BLACKJACK) { + state = new Stay(newState.getCards()); + return; + } + + state = newState; } } diff --git a/src/test/java/blackjack/domain/participant/DealerTest.java b/src/test/java/blackjack/domain/participant/DealerTest.java index 36659d0..8eb5f6c 100644 --- a/src/test/java/blackjack/domain/participant/DealerTest.java +++ b/src/test/java/blackjack/domain/participant/DealerTest.java @@ -10,6 +10,8 @@ import blackjack.domain.state.running.Hit; import org.junit.jupiter.api.DisplayName; import org.junit.jupiter.api.Test; +import org.junit.jupiter.params.ParameterizedTest; +import org.junit.jupiter.params.provider.ValueSource; import java.util.Arrays; @@ -84,14 +86,14 @@ void hit_become_burst_state() { } @Test - @DisplayName("발급 받은 카드를 더한 합이 21 이하일 경우, Hit 상태가 된다.") + @DisplayName("발급 받은 카드를 더한 합이 16 이하일 경우, Hit 상태가 된다.") void hit_remain_hit_state() { //given Card card1 = new Card(Score.TEN, Suit.DIAMOND); - Card card2 = new Card(Score.SIX, Suit.DIAMOND); + Card card2 = new Card(Score.FOUR, Suit.DIAMOND); GivenCards givenCards = new GivenCards(Arrays.asList(card1, card2)); Person dealer = new Dealer("pobi", givenCards); - Card card3 = new Card(Score.FIVE, Suit.HEART); + Card card3 = new Card(Score.TWO, Suit.HEART); //when dealer.hit(card3); @@ -100,4 +102,23 @@ void hit_remain_hit_state() { assertThat(dealer).extracting("state") .isInstanceOf(Hit.class); } + + @ParameterizedTest + @ValueSource(strings = {"TWO", "SIX"}) + @DisplayName("발급 받은 카드를 더한 합이 17 이상 21 이하일 경우, Stay 상태가 된다.") + void hit_become_stay_state(String score) { + //given + Card card1 = new Card(Score.TEN, Suit.DIAMOND); + Card card2 = new Card(Score.FIVE, Suit.DIAMOND); + GivenCards givenCards = new GivenCards(Arrays.asList(card1, card2)); + Person dealer = new Dealer("pobi", givenCards); + Card card3 = new Card(Score.valueOf(score), Suit.HEART); + + //when + dealer.hit(card3); + + //then + assertThat(dealer).extracting("state") + .isInstanceOf(Stay.class); + } } From b353012cf79fb179aee3ac92c0546e54e4a2bac2 Mon Sep 17 00:00:00 2001 From: Beenie93 Date: Mon, 2 Aug 2021 04:56:13 +0900 Subject: [PATCH 39/80] =?UTF-8?q?style:=20=EC=B9=B4=EB=93=9C=20=EA=B4=80?= =?UTF-8?q?=EB=A0=A8=20=ED=81=B4=EB=9E=98=EC=8A=A4=20=ED=8C=A8=ED=82=A4?= =?UTF-8?q?=EC=A7=80=20=EB=B3=80=EA=B2=BD?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- src/main/java/blackjack/domain/{ => card}/Card.java | 2 +- src/main/java/blackjack/domain/{ => card}/Deck.java | 2 +- src/main/java/blackjack/domain/{ => card}/GivenCards.java | 4 ++-- src/main/java/blackjack/domain/participant/Dealer.java | 4 ++-- src/main/java/blackjack/domain/participant/Gamer.java | 2 +- src/main/java/blackjack/domain/participant/Person.java | 4 ++-- src/main/java/blackjack/domain/participant/Player.java | 4 ++-- src/main/java/blackjack/domain/state/Init.java | 2 +- src/main/java/blackjack/domain/state/State.java | 4 ++-- src/main/java/blackjack/domain/state/finished/Blackjack.java | 2 +- src/main/java/blackjack/domain/state/finished/Burst.java | 2 +- src/main/java/blackjack/domain/state/finished/Finished.java | 4 ++-- src/main/java/blackjack/domain/state/finished/Stay.java | 2 +- src/main/java/blackjack/domain/state/running/Hit.java | 4 ++-- src/main/java/blackjack/domain/state/running/Running.java | 2 +- src/test/java/blackjack/domain/{ => card}/CardTest.java | 2 +- src/test/java/blackjack/domain/{ => card}/DeckTest.java | 2 +- src/test/java/blackjack/domain/{ => card}/GivenCardsTest.java | 2 +- src/test/java/blackjack/domain/participant/DealerTest.java | 4 ++-- src/test/java/blackjack/domain/participant/GamerTest.java | 4 ++-- src/test/java/blackjack/domain/participant/PlayerTest.java | 4 ++-- src/test/java/blackjack/domain/state/InitTest.java | 4 ++-- .../java/blackjack/domain/state/finished/BlackjackTest.java | 4 ++-- src/test/java/blackjack/domain/state/finished/BurstTest.java | 4 ++-- .../java/blackjack/domain/state/finished/FinishedTest.java | 4 ++-- src/test/java/blackjack/domain/state/finished/StayTest.java | 4 ++-- src/test/java/blackjack/domain/state/running/HitTest.java | 4 ++-- src/test/java/blackjack/domain/state/running/RunningTest.java | 4 ++-- 28 files changed, 45 insertions(+), 45 deletions(-) rename src/main/java/blackjack/domain/{ => card}/Card.java (96%) rename src/main/java/blackjack/domain/{ => card}/Deck.java (97%) rename src/main/java/blackjack/domain/{ => card}/GivenCards.java (94%) rename src/test/java/blackjack/domain/{ => card}/CardTest.java (98%) rename src/test/java/blackjack/domain/{ => card}/DeckTest.java (94%) rename src/test/java/blackjack/domain/{ => card}/GivenCardsTest.java (99%) diff --git a/src/main/java/blackjack/domain/Card.java b/src/main/java/blackjack/domain/card/Card.java similarity index 96% rename from src/main/java/blackjack/domain/Card.java rename to src/main/java/blackjack/domain/card/Card.java index 323c1fa..5ef5eca 100644 --- a/src/main/java/blackjack/domain/Card.java +++ b/src/main/java/blackjack/domain/card/Card.java @@ -1,4 +1,4 @@ -package blackjack.domain; +package blackjack.domain.card; import blackjack.domain.enums.Score; import blackjack.domain.enums.Suit; diff --git a/src/main/java/blackjack/domain/Deck.java b/src/main/java/blackjack/domain/card/Deck.java similarity index 97% rename from src/main/java/blackjack/domain/Deck.java rename to src/main/java/blackjack/domain/card/Deck.java index cad45d1..9f4805d 100644 --- a/src/main/java/blackjack/domain/Deck.java +++ b/src/main/java/blackjack/domain/card/Deck.java @@ -1,4 +1,4 @@ -package blackjack.domain; +package blackjack.domain.card; import blackjack.domain.enums.Score; import blackjack.domain.enums.Suit; diff --git a/src/main/java/blackjack/domain/GivenCards.java b/src/main/java/blackjack/domain/card/GivenCards.java similarity index 94% rename from src/main/java/blackjack/domain/GivenCards.java rename to src/main/java/blackjack/domain/card/GivenCards.java index 2053c54..871990b 100644 --- a/src/main/java/blackjack/domain/GivenCards.java +++ b/src/main/java/blackjack/domain/card/GivenCards.java @@ -1,10 +1,10 @@ -package blackjack.domain; +package blackjack.domain.card; import java.util.ArrayList; import java.util.Collections; import java.util.List; -import static blackjack.domain.Deck.TWO_CARDS; +import static blackjack.domain.card.Deck.TWO_CARDS; import static blackjack.domain.enums.Score.ACE_BONUS; import static blackjack.domain.participant.Dealer.BLACKJACK; diff --git a/src/main/java/blackjack/domain/participant/Dealer.java b/src/main/java/blackjack/domain/participant/Dealer.java index bbd743f..acb9b99 100644 --- a/src/main/java/blackjack/domain/participant/Dealer.java +++ b/src/main/java/blackjack/domain/participant/Dealer.java @@ -1,7 +1,7 @@ package blackjack.domain.participant; -import blackjack.domain.Card; -import blackjack.domain.GivenCards; +import blackjack.domain.card.Card; +import blackjack.domain.card.GivenCards; import blackjack.domain.state.State; import blackjack.domain.state.finished.Blackjack; import blackjack.domain.state.finished.Stay; diff --git a/src/main/java/blackjack/domain/participant/Gamer.java b/src/main/java/blackjack/domain/participant/Gamer.java index a0df9d7..b4a5d54 100644 --- a/src/main/java/blackjack/domain/participant/Gamer.java +++ b/src/main/java/blackjack/domain/participant/Gamer.java @@ -1,6 +1,6 @@ package blackjack.domain.participant; -import blackjack.domain.GivenCards; +import blackjack.domain.card.GivenCards; import blackjack.domain.state.State; import blackjack.domain.state.finished.Stay; diff --git a/src/main/java/blackjack/domain/participant/Person.java b/src/main/java/blackjack/domain/participant/Person.java index 5ad35ce..7f5b9ce 100644 --- a/src/main/java/blackjack/domain/participant/Person.java +++ b/src/main/java/blackjack/domain/participant/Person.java @@ -1,7 +1,7 @@ package blackjack.domain.participant; -import blackjack.domain.Card; -import blackjack.domain.GivenCards; +import blackjack.domain.card.Card; +import blackjack.domain.card.GivenCards; import blackjack.domain.state.State; public interface Person { diff --git a/src/main/java/blackjack/domain/participant/Player.java b/src/main/java/blackjack/domain/participant/Player.java index 91988d9..f4cebb3 100644 --- a/src/main/java/blackjack/domain/participant/Player.java +++ b/src/main/java/blackjack/domain/participant/Player.java @@ -1,7 +1,7 @@ package blackjack.domain.participant; -import blackjack.domain.Card; -import blackjack.domain.GivenCards; +import blackjack.domain.card.Card; +import blackjack.domain.card.GivenCards; import blackjack.domain.state.State; import blackjack.domain.state.finished.Blackjack; import blackjack.domain.state.running.Hit; diff --git a/src/main/java/blackjack/domain/state/Init.java b/src/main/java/blackjack/domain/state/Init.java index ba7dfcd..858d1c6 100644 --- a/src/main/java/blackjack/domain/state/Init.java +++ b/src/main/java/blackjack/domain/state/Init.java @@ -1,6 +1,6 @@ package blackjack.domain.state; -import blackjack.domain.GivenCards; +import blackjack.domain.card.GivenCards; public abstract class Init implements State { protected final GivenCards givenCards; diff --git a/src/main/java/blackjack/domain/state/State.java b/src/main/java/blackjack/domain/state/State.java index ff7e09c..1923b12 100644 --- a/src/main/java/blackjack/domain/state/State.java +++ b/src/main/java/blackjack/domain/state/State.java @@ -1,7 +1,7 @@ package blackjack.domain.state; -import blackjack.domain.Card; -import blackjack.domain.GivenCards; +import blackjack.domain.card.Card; +import blackjack.domain.card.GivenCards; public interface State { diff --git a/src/main/java/blackjack/domain/state/finished/Blackjack.java b/src/main/java/blackjack/domain/state/finished/Blackjack.java index be6f6c8..4cdeddd 100644 --- a/src/main/java/blackjack/domain/state/finished/Blackjack.java +++ b/src/main/java/blackjack/domain/state/finished/Blackjack.java @@ -1,6 +1,6 @@ package blackjack.domain.state.finished; -import blackjack.domain.GivenCards; +import blackjack.domain.card.GivenCards; import blackjack.domain.enums.Result; public class Blackjack extends Finished { diff --git a/src/main/java/blackjack/domain/state/finished/Burst.java b/src/main/java/blackjack/domain/state/finished/Burst.java index a174302..bac349a 100644 --- a/src/main/java/blackjack/domain/state/finished/Burst.java +++ b/src/main/java/blackjack/domain/state/finished/Burst.java @@ -1,6 +1,6 @@ package blackjack.domain.state.finished; -import blackjack.domain.GivenCards; +import blackjack.domain.card.GivenCards; import blackjack.domain.enums.Result; public class Burst extends Finished { diff --git a/src/main/java/blackjack/domain/state/finished/Finished.java b/src/main/java/blackjack/domain/state/finished/Finished.java index c451653..e2eb825 100644 --- a/src/main/java/blackjack/domain/state/finished/Finished.java +++ b/src/main/java/blackjack/domain/state/finished/Finished.java @@ -1,7 +1,7 @@ package blackjack.domain.state.finished; -import blackjack.domain.Card; -import blackjack.domain.GivenCards; +import blackjack.domain.card.Card; +import blackjack.domain.card.GivenCards; import blackjack.domain.state.Init; import blackjack.domain.state.State; diff --git a/src/main/java/blackjack/domain/state/finished/Stay.java b/src/main/java/blackjack/domain/state/finished/Stay.java index 6504beb..c3f6b23 100644 --- a/src/main/java/blackjack/domain/state/finished/Stay.java +++ b/src/main/java/blackjack/domain/state/finished/Stay.java @@ -1,6 +1,6 @@ package blackjack.domain.state.finished; -import blackjack.domain.GivenCards; +import blackjack.domain.card.GivenCards; import blackjack.domain.enums.Result; public class Stay extends Finished { diff --git a/src/main/java/blackjack/domain/state/running/Hit.java b/src/main/java/blackjack/domain/state/running/Hit.java index a5ed76f..f8f9c52 100644 --- a/src/main/java/blackjack/domain/state/running/Hit.java +++ b/src/main/java/blackjack/domain/state/running/Hit.java @@ -1,7 +1,7 @@ package blackjack.domain.state.running; -import blackjack.domain.Card; -import blackjack.domain.GivenCards; +import blackjack.domain.card.Card; +import blackjack.domain.card.GivenCards; import blackjack.domain.state.State; import blackjack.domain.state.finished.Burst; import blackjack.domain.state.finished.Stay; diff --git a/src/main/java/blackjack/domain/state/running/Running.java b/src/main/java/blackjack/domain/state/running/Running.java index 8d3a6fe..b660ab9 100644 --- a/src/main/java/blackjack/domain/state/running/Running.java +++ b/src/main/java/blackjack/domain/state/running/Running.java @@ -1,6 +1,6 @@ package blackjack.domain.state.running; -import blackjack.domain.GivenCards; +import blackjack.domain.card.GivenCards; import blackjack.domain.state.Init; public abstract class Running extends Init { diff --git a/src/test/java/blackjack/domain/CardTest.java b/src/test/java/blackjack/domain/card/CardTest.java similarity index 98% rename from src/test/java/blackjack/domain/CardTest.java rename to src/test/java/blackjack/domain/card/CardTest.java index 81b239f..f344daf 100644 --- a/src/test/java/blackjack/domain/CardTest.java +++ b/src/test/java/blackjack/domain/card/CardTest.java @@ -1,4 +1,4 @@ -package blackjack.domain; +package blackjack.domain.card; import blackjack.domain.enums.Score; import blackjack.domain.enums.Suit; diff --git a/src/test/java/blackjack/domain/DeckTest.java b/src/test/java/blackjack/domain/card/DeckTest.java similarity index 94% rename from src/test/java/blackjack/domain/DeckTest.java rename to src/test/java/blackjack/domain/card/DeckTest.java index 04b3c6c..c854bf2 100644 --- a/src/test/java/blackjack/domain/DeckTest.java +++ b/src/test/java/blackjack/domain/card/DeckTest.java @@ -1,4 +1,4 @@ -package blackjack.domain; +package blackjack.domain.card; import org.junit.jupiter.api.DisplayName; import org.junit.jupiter.api.Test; diff --git a/src/test/java/blackjack/domain/GivenCardsTest.java b/src/test/java/blackjack/domain/card/GivenCardsTest.java similarity index 99% rename from src/test/java/blackjack/domain/GivenCardsTest.java rename to src/test/java/blackjack/domain/card/GivenCardsTest.java index 20e32f1..34eab24 100644 --- a/src/test/java/blackjack/domain/GivenCardsTest.java +++ b/src/test/java/blackjack/domain/card/GivenCardsTest.java @@ -1,4 +1,4 @@ -package blackjack.domain; +package blackjack.domain.card; import blackjack.domain.enums.Score; import blackjack.domain.enums.Suit; diff --git a/src/test/java/blackjack/domain/participant/DealerTest.java b/src/test/java/blackjack/domain/participant/DealerTest.java index 8eb5f6c..9aa7fff 100644 --- a/src/test/java/blackjack/domain/participant/DealerTest.java +++ b/src/test/java/blackjack/domain/participant/DealerTest.java @@ -1,7 +1,7 @@ package blackjack.domain.participant; -import blackjack.domain.Card; -import blackjack.domain.GivenCards; +import blackjack.domain.card.Card; +import blackjack.domain.card.GivenCards; import blackjack.domain.enums.Score; import blackjack.domain.enums.Suit; import blackjack.domain.state.finished.Blackjack; diff --git a/src/test/java/blackjack/domain/participant/GamerTest.java b/src/test/java/blackjack/domain/participant/GamerTest.java index adbc2e7..8be8881 100644 --- a/src/test/java/blackjack/domain/participant/GamerTest.java +++ b/src/test/java/blackjack/domain/participant/GamerTest.java @@ -1,7 +1,7 @@ package blackjack.domain.participant; -import blackjack.domain.Card; -import blackjack.domain.GivenCards; +import blackjack.domain.card.Card; +import blackjack.domain.card.GivenCards; import blackjack.domain.enums.Score; import blackjack.domain.enums.Suit; import blackjack.domain.state.State; diff --git a/src/test/java/blackjack/domain/participant/PlayerTest.java b/src/test/java/blackjack/domain/participant/PlayerTest.java index a8541c5..4571f15 100644 --- a/src/test/java/blackjack/domain/participant/PlayerTest.java +++ b/src/test/java/blackjack/domain/participant/PlayerTest.java @@ -1,7 +1,7 @@ package blackjack.domain.participant; -import blackjack.domain.Card; -import blackjack.domain.GivenCards; +import blackjack.domain.card.Card; +import blackjack.domain.card.GivenCards; import blackjack.domain.enums.Score; import blackjack.domain.enums.Suit; import blackjack.domain.state.finished.Blackjack; diff --git a/src/test/java/blackjack/domain/state/InitTest.java b/src/test/java/blackjack/domain/state/InitTest.java index 0e6355f..549f3b1 100644 --- a/src/test/java/blackjack/domain/state/InitTest.java +++ b/src/test/java/blackjack/domain/state/InitTest.java @@ -1,7 +1,7 @@ package blackjack.domain.state; -import blackjack.domain.Card; -import blackjack.domain.GivenCards; +import blackjack.domain.card.Card; +import blackjack.domain.card.GivenCards; import blackjack.domain.enums.Score; import blackjack.domain.enums.Suit; import org.junit.jupiter.api.DisplayName; diff --git a/src/test/java/blackjack/domain/state/finished/BlackjackTest.java b/src/test/java/blackjack/domain/state/finished/BlackjackTest.java index bedeec8..8c87900 100644 --- a/src/test/java/blackjack/domain/state/finished/BlackjackTest.java +++ b/src/test/java/blackjack/domain/state/finished/BlackjackTest.java @@ -1,7 +1,7 @@ package blackjack.domain.state.finished; -import blackjack.domain.Card; -import blackjack.domain.GivenCards; +import blackjack.domain.card.Card; +import blackjack.domain.card.GivenCards; import blackjack.domain.enums.Score; import blackjack.domain.enums.Suit; import blackjack.domain.state.State; diff --git a/src/test/java/blackjack/domain/state/finished/BurstTest.java b/src/test/java/blackjack/domain/state/finished/BurstTest.java index dc5bc46..9318ce8 100644 --- a/src/test/java/blackjack/domain/state/finished/BurstTest.java +++ b/src/test/java/blackjack/domain/state/finished/BurstTest.java @@ -1,7 +1,7 @@ package blackjack.domain.state.finished; -import blackjack.domain.Card; -import blackjack.domain.GivenCards; +import blackjack.domain.card.Card; +import blackjack.domain.card.GivenCards; import blackjack.domain.enums.Score; import blackjack.domain.enums.Suit; import blackjack.domain.state.State; diff --git a/src/test/java/blackjack/domain/state/finished/FinishedTest.java b/src/test/java/blackjack/domain/state/finished/FinishedTest.java index ce05b57..01e5f10 100644 --- a/src/test/java/blackjack/domain/state/finished/FinishedTest.java +++ b/src/test/java/blackjack/domain/state/finished/FinishedTest.java @@ -1,7 +1,7 @@ package blackjack.domain.state.finished; -import blackjack.domain.Card; -import blackjack.domain.GivenCards; +import blackjack.domain.card.Card; +import blackjack.domain.card.GivenCards; import blackjack.domain.enums.Score; import blackjack.domain.enums.Suit; import blackjack.domain.state.State; diff --git a/src/test/java/blackjack/domain/state/finished/StayTest.java b/src/test/java/blackjack/domain/state/finished/StayTest.java index bd7eb46..ccf75e1 100644 --- a/src/test/java/blackjack/domain/state/finished/StayTest.java +++ b/src/test/java/blackjack/domain/state/finished/StayTest.java @@ -1,7 +1,7 @@ package blackjack.domain.state.finished; -import blackjack.domain.Card; -import blackjack.domain.GivenCards; +import blackjack.domain.card.Card; +import blackjack.domain.card.GivenCards; import blackjack.domain.enums.Score; import blackjack.domain.enums.Suit; import blackjack.domain.state.State; diff --git a/src/test/java/blackjack/domain/state/running/HitTest.java b/src/test/java/blackjack/domain/state/running/HitTest.java index 193d5ef..f489026 100644 --- a/src/test/java/blackjack/domain/state/running/HitTest.java +++ b/src/test/java/blackjack/domain/state/running/HitTest.java @@ -1,7 +1,7 @@ package blackjack.domain.state.running; -import blackjack.domain.Card; -import blackjack.domain.GivenCards; +import blackjack.domain.card.Card; +import blackjack.domain.card.GivenCards; import blackjack.domain.enums.Score; import blackjack.domain.enums.Suit; import blackjack.domain.state.State; diff --git a/src/test/java/blackjack/domain/state/running/RunningTest.java b/src/test/java/blackjack/domain/state/running/RunningTest.java index aab84b0..15ae57a 100644 --- a/src/test/java/blackjack/domain/state/running/RunningTest.java +++ b/src/test/java/blackjack/domain/state/running/RunningTest.java @@ -1,7 +1,7 @@ package blackjack.domain.state.running; -import blackjack.domain.Card; -import blackjack.domain.GivenCards; +import blackjack.domain.card.Card; +import blackjack.domain.card.GivenCards; import blackjack.domain.enums.Score; import blackjack.domain.enums.Suit; import blackjack.domain.state.State; From 29d45ee79a7ca38b1eca003f77cd5edde310e916 Mon Sep 17 00:00:00 2001 From: Beenie93 Date: Mon, 2 Aug 2021 05:10:52 +0900 Subject: [PATCH 40/80] =?UTF-8?q?feat:=20=EC=9E=85=EB=A0=A5=20=EB=B7=B0,?= =?UTF-8?q?=20=EC=B6=9C=EB=A0=A5=20=EB=B7=B0,=20=EC=BB=A8=ED=8A=B8?= =?UTF-8?q?=EB=A1=A4=EB=9F=AC=20=EC=83=9D=EC=84=B1?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- README.md | 4 ++-- src/main/java/blackjack/Blackjack.java | 14 +++++++++++++ .../controller/BlackjackController.java | 20 +++++++++++++++++++ src/main/java/blackjack/view/InputView.java | 19 ++++++++++++++++++ src/main/java/blackjack/view/OutputView.java | 4 ++++ 5 files changed, 59 insertions(+), 2 deletions(-) create mode 100644 src/main/java/blackjack/Blackjack.java create mode 100644 src/main/java/blackjack/controller/BlackjackController.java create mode 100644 src/main/java/blackjack/view/InputView.java create mode 100644 src/main/java/blackjack/view/OutputView.java diff --git a/README.md b/README.md index a3a1363..006838e 100644 --- a/README.md +++ b/README.md @@ -8,8 +8,8 @@ Hit : 플레이어의 카드 2장의 합이 21을 초과하지 않을 경우, Stay : 플레이어가 추가 카드를 원하지 않음, 딜러는 카드 합 17 이상이면 추가 카드를 얻을 수 없음 # 구현해야 할 기능 목록 -- [] 입력 - - [] 플레이어 이름 +- [x] 입력 + - [x] 플레이어 이름 - [] 플레이어(딜러 제외) 추가 카드 요청 여부 - [] 출력 diff --git a/src/main/java/blackjack/Blackjack.java b/src/main/java/blackjack/Blackjack.java new file mode 100644 index 0000000..9c7b6fd --- /dev/null +++ b/src/main/java/blackjack/Blackjack.java @@ -0,0 +1,14 @@ +package blackjack; + +import blackjack.controller.BlackjackController; +import blackjack.view.InputView; +import blackjack.view.OutputView; + +public class Blackjack { + public static void main(String[] args) { + InputView inputView = new InputView(); + OutputView outputView = new OutputView(); + BlackjackController blackjackController = new BlackjackController(inputView, outputView); + blackjackController.run(); + } +} diff --git a/src/main/java/blackjack/controller/BlackjackController.java b/src/main/java/blackjack/controller/BlackjackController.java new file mode 100644 index 0000000..9934f93 --- /dev/null +++ b/src/main/java/blackjack/controller/BlackjackController.java @@ -0,0 +1,20 @@ +package blackjack.controller; + +import blackjack.view.InputView; +import blackjack.view.OutputView; + +import java.util.List; + +public class BlackjackController { + private final InputView inputView; + private final OutputView outputView; + + public BlackjackController(final InputView inputView, final OutputView outputView) { + this.inputView = inputView; + this.outputView = outputView; + } + + public void run() { + List playerNames = inputView.getPlayerNames(); + } +} diff --git a/src/main/java/blackjack/view/InputView.java b/src/main/java/blackjack/view/InputView.java new file mode 100644 index 0000000..a217520 --- /dev/null +++ b/src/main/java/blackjack/view/InputView.java @@ -0,0 +1,19 @@ +package blackjack.view; + +import java.util.Arrays; +import java.util.List; +import java.util.Scanner; +import java.util.stream.Collectors; + +public class InputView { + private static final Scanner scanner = new Scanner(System.in); + public static final String SEPARATOR = ","; + + public List getPlayerNames() { + System.out.println("게임에 참여할 사람의 이름을 입력하세요.(쉼표 기준으로 분리)"); + String names = scanner.nextLine(); + return Arrays.stream(names.split(SEPARATOR)) + .map(String::trim) + .collect(Collectors.toList()); + } +} diff --git a/src/main/java/blackjack/view/OutputView.java b/src/main/java/blackjack/view/OutputView.java new file mode 100644 index 0000000..004d800 --- /dev/null +++ b/src/main/java/blackjack/view/OutputView.java @@ -0,0 +1,4 @@ +package blackjack.view; + +public class OutputView { +} From c48cfc1506da619bd13f2948639df3ff6ea0e3bb Mon Sep 17 00:00:00 2001 From: Beenie93 Date: Mon, 2 Aug 2021 05:50:25 +0900 Subject: [PATCH 41/80] =?UTF-8?q?feat:=20GameSystem=EC=97=90=EC=84=9C=20?= =?UTF-8?q?=EC=B0=B8=EC=97=AC=EC=9E=90=20=EC=9D=B4=EB=A6=84=20=EB=B0=98?= =?UTF-8?q?=ED=99=98=ED=95=98=EB=8A=94=20=ED=85=8C=EC=8A=A4=ED=8A=B8=20?= =?UTF-8?q?=EB=B0=8F=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 | 6 ++-- .../controller/BlackjackController.java | 3 ++ .../java/blackjack/domain/GameSystem.java | 33 +++++++++++++++++++ .../blackjack/domain/participant/Dealer.java | 2 +- src/main/java/blackjack/view/OutputView.java | 8 +++++ .../java/blackjack/domain/GameSystemTest.java | 31 +++++++++++++++++ 6 files changed, 80 insertions(+), 3 deletions(-) create mode 100644 src/main/java/blackjack/domain/GameSystem.java create mode 100644 src/test/java/blackjack/domain/GameSystemTest.java diff --git a/README.md b/README.md index 006838e..7148000 100644 --- a/README.md +++ b/README.md @@ -13,7 +13,7 @@ Stay : 플레이어가 추가 카드를 원하지 않음, 딜러는 카드 합 1 - [] 플레이어(딜러 제외) 추가 카드 요청 여부 - [] 출력 - - [] 각 플레이어(딜러 포함)에게 2장의 카드 지급 알림 + - [x] 각 플레이어(딜러 포함)에게 2장의 카드 지급 알림 - [] 각 플레이어(딜러 포함)가 가진 카드 - [] 딜러의 추가 카드 지급 여부 결과 - [] 각 플레이어(딜러 포함)의 총 카드의 합 @@ -165,8 +165,10 @@ Stay : 플레이어가 추가 카드를 원하지 않음, 딜러는 카드 합 1 - [] 게임 시스템 - 속성 - - [] 참여자 목록 + - [x] 딜러 + - [x] 참여자 목록 - 기능 + - [x] 참여자 이름 반환 - [] 카드 지급 - [] 참여자 점수 비교 diff --git a/src/main/java/blackjack/controller/BlackjackController.java b/src/main/java/blackjack/controller/BlackjackController.java index 9934f93..4d4ef63 100644 --- a/src/main/java/blackjack/controller/BlackjackController.java +++ b/src/main/java/blackjack/controller/BlackjackController.java @@ -1,5 +1,6 @@ package blackjack.controller; +import blackjack.domain.GameSystem; import blackjack.view.InputView; import blackjack.view.OutputView; @@ -16,5 +17,7 @@ public BlackjackController(final InputView inputView, final OutputView outputVie public void run() { List playerNames = inputView.getPlayerNames(); + GameSystem gameSystem = new GameSystem(playerNames); + outputView.printGameStart(gameSystem.getPlayerNames()); } } diff --git a/src/main/java/blackjack/domain/GameSystem.java b/src/main/java/blackjack/domain/GameSystem.java new file mode 100644 index 0000000..8f0595a --- /dev/null +++ b/src/main/java/blackjack/domain/GameSystem.java @@ -0,0 +1,33 @@ +package blackjack.domain; + +import blackjack.domain.card.Deck; +import blackjack.domain.participant.Dealer; +import blackjack.domain.participant.Gamer; +import blackjack.domain.participant.Player; + +import java.util.Collections; +import java.util.List; +import java.util.stream.Collectors; + +public class GameSystem { + private static final String DEFAULT_DEALER_NAME = "딜러"; + + private final Dealer dealer = new Dealer(DEFAULT_DEALER_NAME, Deck.getTwoCards()); + private final List players; + + public GameSystem(final List playerNames) { + this.players = createPlayers(playerNames); + } + + private List createPlayers(final List playerNames) { + return playerNames.stream() + .map(name -> new Player(name, Deck.getTwoCards())) + .collect(Collectors.toList()); + } + + public List getPlayerNames() { + return Collections.unmodifiableList(players.stream() + .map(Gamer::getName) + .collect(Collectors.toList())); + } +} diff --git a/src/main/java/blackjack/domain/participant/Dealer.java b/src/main/java/blackjack/domain/participant/Dealer.java index acb9b99..20570cc 100644 --- a/src/main/java/blackjack/domain/participant/Dealer.java +++ b/src/main/java/blackjack/domain/participant/Dealer.java @@ -8,8 +8,8 @@ import blackjack.domain.state.running.Hit; public class Dealer extends Gamer { - private static final int HIT_THRESHOLD = 16; public static final int BLACKJACK = 21; + private static final int HIT_THRESHOLD = 16; public Dealer(final String name, final GivenCards givenCards) { super(name); diff --git a/src/main/java/blackjack/view/OutputView.java b/src/main/java/blackjack/view/OutputView.java index 004d800..2c0bcab 100644 --- a/src/main/java/blackjack/view/OutputView.java +++ b/src/main/java/blackjack/view/OutputView.java @@ -1,4 +1,12 @@ package blackjack.view; +import java.util.List; + public class OutputView { + + + public void printGameStart(List playerNames) { + String names = String.join(", ", playerNames); + System.out.printf("딜러와 %s에게 2장의 카드를 나누었습니다.", names); + } } diff --git a/src/test/java/blackjack/domain/GameSystemTest.java b/src/test/java/blackjack/domain/GameSystemTest.java new file mode 100644 index 0000000..4d2e12d --- /dev/null +++ b/src/test/java/blackjack/domain/GameSystemTest.java @@ -0,0 +1,31 @@ +package blackjack.domain; + +import blackjack.domain.card.GivenCards; +import org.junit.jupiter.api.DisplayName; +import org.junit.jupiter.api.Test; + +import java.util.Arrays; +import java.util.Collections; +import java.util.List; + +import static org.assertj.core.api.Assertions.assertThat; + +public class GameSystemTest { + + @Test + @DisplayName("플레이어의 이름을 반환한다.") + void getPlayerNames() { + //given + String name1 = "pobi"; + String name2 = "tobi"; + List names = Arrays.asList(name1, name2); + GivenCards givenCards = new GivenCards(Collections.emptyList()); + + //when + GameSystem gameSystem = new GameSystem(names); + + //then + assertThat(gameSystem.getPlayerNames()).hasSize(2) + .contains(name1, name2); + } +} From 7267872a5d031e6d7cf3bdf6d3debeaffe4c405c Mon Sep 17 00:00:00 2001 From: Beenie93 Date: Mon, 2 Aug 2021 11:35:15 +0900 Subject: [PATCH 42/80] =?UTF-8?q?feat:=20=EB=94=9C=EB=9F=AC,=20=ED=94=8C?= =?UTF-8?q?=EB=A0=88=EC=9D=B4=EC=96=B4=EB=93=A4=EC=9D=98=20=EB=AA=A8?= =?UTF-8?q?=EB=93=A0=20=EC=B9=B4=EB=93=9C=20=EB=B0=98=ED=99=98=ED=95=98?= =?UTF-8?q?=EB=8A=94=20=ED=85=8C=EC=8A=A4=ED=8A=B8=20=EB=B0=8F=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 | 8 +++-- .../java/blackjack/domain/GameSystem.java | 11 +++++++ .../java/blackjack/domain/GameSystemTest.java | 30 ++++++++++++++++++- 3 files changed, 45 insertions(+), 4 deletions(-) diff --git a/README.md b/README.md index 7148000..242d080 100644 --- a/README.md +++ b/README.md @@ -166,9 +166,11 @@ Stay : 플레이어가 추가 카드를 원하지 않음, 딜러는 카드 합 1 - [] 게임 시스템 - 속성 - [x] 딜러 - - [x] 참여자 목록 + - [x] 플레이어 목록 - 기능 - - [x] 참여자 이름 반환 - - [] 카드 지급 + - [x] 플레이어들의 이름 반환 + - [x] 플레이어들의 모든 카드 반환 + - [x] 딜러의 모든 카드 반환 + - [] 딜러 추가 카드 발급 - [] 참여자 점수 비교 diff --git a/src/main/java/blackjack/domain/GameSystem.java b/src/main/java/blackjack/domain/GameSystem.java index 8f0595a..f426eaf 100644 --- a/src/main/java/blackjack/domain/GameSystem.java +++ b/src/main/java/blackjack/domain/GameSystem.java @@ -1,6 +1,7 @@ package blackjack.domain; import blackjack.domain.card.Deck; +import blackjack.domain.card.GivenCards; import blackjack.domain.participant.Dealer; import blackjack.domain.participant.Gamer; import blackjack.domain.participant.Player; @@ -30,4 +31,14 @@ public List getPlayerNames() { .map(Gamer::getName) .collect(Collectors.toList())); } + + public GivenCards getDealerCards() { + return dealer.getCards(); + } + + public List getPlayerCards() { + return Collections.unmodifiableList(players.stream() + .map(Gamer::getCards) + .collect(Collectors.toList())); + } } diff --git a/src/test/java/blackjack/domain/GameSystemTest.java b/src/test/java/blackjack/domain/GameSystemTest.java index 4d2e12d..8ca6d07 100644 --- a/src/test/java/blackjack/domain/GameSystemTest.java +++ b/src/test/java/blackjack/domain/GameSystemTest.java @@ -19,7 +19,6 @@ void getPlayerNames() { String name1 = "pobi"; String name2 = "tobi"; List names = Arrays.asList(name1, name2); - GivenCards givenCards = new GivenCards(Collections.emptyList()); //when GameSystem gameSystem = new GameSystem(names); @@ -28,4 +27,33 @@ void getPlayerNames() { assertThat(gameSystem.getPlayerNames()).hasSize(2) .contains(name1, name2); } + + @Test + @DisplayName("딜러의 모든 카드를 반환한다,") + void getDealerCards() { + //given + GameSystem gameSystem = new GameSystem(Collections.emptyList()); + + //when + GivenCards dealerCards = gameSystem.getDealerCards(); + + //then + assertThat(dealerCards.list()).hasSize(2); + } + + @Test + @DisplayName("플레이어들의 모든 카드를 반환한다.") + void getPlayerCards() { + //given + String name1 = "pobi"; + String name2 = "tobi"; + List names = Arrays.asList(name1, name2); + GameSystem gameSystem = new GameSystem(names); + + //when + List givenCards = gameSystem.getPlayerCards(); + + //then + assertThat(givenCards).hasSize(2); + } } From 35e1746eab1edc2a0ffa5c5a5d0b172a1d28bda2 Mon Sep 17 00:00:00 2001 From: Beenie93 Date: Tue, 3 Aug 2021 16:30:56 +0900 Subject: [PATCH 43/80] =?UTF-8?q?feat:=20=EC=B9=B4=EB=93=9C=EC=9D=98=20?= =?UTF-8?q?=EA=B0=92=20=EC=9D=B4=EB=A6=84(=EB=81=97=EC=88=98)=20=EB=B0=98?= =?UTF-8?q?=ED=99=98=ED=95=98=EB=8A=94=20=ED=85=8C=EC=8A=A4=ED=8A=B8=20?= =?UTF-8?q?=EB=B0=8F=20=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 + src/main/java/blackjack/domain/card/Card.java | 8 ++++++++ src/test/java/blackjack/domain/card/CardTest.java | 15 +++++++++++++++ 3 files changed, 24 insertions(+) diff --git a/README.md b/README.md index 242d080..1d80e90 100644 --- a/README.md +++ b/README.md @@ -114,6 +114,7 @@ Stay : 플레이어가 추가 카드를 원하지 않음, 딜러는 카드 합 1 - 기능 - [x] 카드의 값 반환 + - [x] 카드의 값 이름 반환 - [x] ACE인지 확인 - [x] 점수 enum diff --git a/src/main/java/blackjack/domain/card/Card.java b/src/main/java/blackjack/domain/card/Card.java index 5ef5eca..ccfa364 100644 --- a/src/main/java/blackjack/domain/card/Card.java +++ b/src/main/java/blackjack/domain/card/Card.java @@ -18,6 +18,14 @@ public int getScore() { return score.getScore(); } + public String getDenomination() { + return score.getDenomination(); + } + + public String getSuit() { + return suit.getSuit(); + } + public boolean isAce() { return score.isAce(); } diff --git a/src/test/java/blackjack/domain/card/CardTest.java b/src/test/java/blackjack/domain/card/CardTest.java index f344daf..3ca1245 100644 --- a/src/test/java/blackjack/domain/card/CardTest.java +++ b/src/test/java/blackjack/domain/card/CardTest.java @@ -40,6 +40,21 @@ void getScore() { assertThat(score).isEqualTo(jack.getScore()); } + @Test + @DisplayName("카드의 점수 이름(끗수)를 반환한다.") + void getDenomination() { + //given + Score jack = Score.J; + Suit diamond = Suit.DIAMOND; + Card card = new Card(jack, diamond); + + //when + String denomination = card.getDenomination(); + + //then + assertThat(denomination).isEqualTo(jack.getDenomination()); + } + @ParameterizedTest @CsvSource(value = {"A, true", "TWO, false", "TEN, false", "J, false"}) @DisplayName("카드가 Ace일 경우 참을 반환한다.") From 1973163c7a3c021d8082cd87ed42a1b195ef8d27 Mon Sep 17 00:00:00 2001 From: Beenie93 Date: Tue, 3 Aug 2021 16:32:17 +0900 Subject: [PATCH 44/80] =?UTF-8?q?refactor:=20GivenCards=20->=20List?= =?UTF-8?q?=EB=A1=9C=20=EB=B0=98=ED=99=98=ED=95=98=EA=B2=8C=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/blackjack/domain/GameSystem.java | 8 +++++--- src/test/java/blackjack/domain/GameSystemTest.java | 10 +++++----- 2 files changed, 10 insertions(+), 8 deletions(-) diff --git a/src/main/java/blackjack/domain/GameSystem.java b/src/main/java/blackjack/domain/GameSystem.java index f426eaf..b4896ee 100644 --- a/src/main/java/blackjack/domain/GameSystem.java +++ b/src/main/java/blackjack/domain/GameSystem.java @@ -1,5 +1,6 @@ package blackjack.domain; +import blackjack.domain.card.Card; import blackjack.domain.card.Deck; import blackjack.domain.card.GivenCards; import blackjack.domain.participant.Dealer; @@ -32,13 +33,14 @@ public List getPlayerNames() { .collect(Collectors.toList())); } - public GivenCards getDealerCards() { - return dealer.getCards(); + public List getDealerCards() { + return Collections.unmodifiableList(dealer.getCards().list()); } - public List getPlayerCards() { + public List> getPlayerCards() { return Collections.unmodifiableList(players.stream() .map(Gamer::getCards) + .map(GivenCards::list) .collect(Collectors.toList())); } } diff --git a/src/test/java/blackjack/domain/GameSystemTest.java b/src/test/java/blackjack/domain/GameSystemTest.java index 8ca6d07..0ff40d0 100644 --- a/src/test/java/blackjack/domain/GameSystemTest.java +++ b/src/test/java/blackjack/domain/GameSystemTest.java @@ -1,6 +1,6 @@ package blackjack.domain; -import blackjack.domain.card.GivenCards; +import blackjack.domain.card.Card; import org.junit.jupiter.api.DisplayName; import org.junit.jupiter.api.Test; @@ -35,10 +35,10 @@ void getDealerCards() { GameSystem gameSystem = new GameSystem(Collections.emptyList()); //when - GivenCards dealerCards = gameSystem.getDealerCards(); + List dealerCards = gameSystem.getDealerCards(); //then - assertThat(dealerCards.list()).hasSize(2); + assertThat(dealerCards).hasSize(2); } @Test @@ -51,9 +51,9 @@ void getPlayerCards() { GameSystem gameSystem = new GameSystem(names); //when - List givenCards = gameSystem.getPlayerCards(); + List> playerCards = gameSystem.getPlayerCards(); //then - assertThat(givenCards).hasSize(2); + assertThat(playerCards).hasSize(2); } } From 7cb37874a563c4cb2a6fcdc0b8c7cf2228701d0c Mon Sep 17 00:00:00 2001 From: Beenie93 Date: Tue, 3 Aug 2021 16:33:46 +0900 Subject: [PATCH 45/80] =?UTF-8?q?feat:=20=EB=94=9C=EB=9F=AC,=20=ED=94=8C?= =?UTF-8?q?=EB=A0=88=EC=9D=B4=EC=96=B4=EC=9D=98=20=EC=B2=98=EC=9D=8C=20?= =?UTF-8?q?=EC=B9=B4=EB=93=9C=202=EC=9E=A5=EC=9D=84=20=EC=A0=84=EB=8B=AC?= =?UTF-8?q?=ED=95=98=EB=8A=94=20DTO=20=EC=B6=94=EA=B0=80?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../blackjack/domain/dto/CardResponse.java | 19 ++++++ .../domain/dto/FirstTwoCardsResponse.java | 33 ++++++++++ .../domain/dto/CardResponseTest.java | 40 ++++++++++++ .../domain/dto/FirstTwoCardsResponseTest.java | 65 +++++++++++++++++++ 4 files changed, 157 insertions(+) create mode 100644 src/main/java/blackjack/domain/dto/CardResponse.java create mode 100644 src/main/java/blackjack/domain/dto/FirstTwoCardsResponse.java create mode 100644 src/test/java/blackjack/domain/dto/CardResponseTest.java create mode 100644 src/test/java/blackjack/domain/dto/FirstTwoCardsResponseTest.java diff --git a/src/main/java/blackjack/domain/dto/CardResponse.java b/src/main/java/blackjack/domain/dto/CardResponse.java new file mode 100644 index 0000000..707c3b2 --- /dev/null +++ b/src/main/java/blackjack/domain/dto/CardResponse.java @@ -0,0 +1,19 @@ +package blackjack.domain.dto; + +public class CardResponse { + private final String denomination; + private final String suit; + + public CardResponse(final String denomination, final String suit) { + this.denomination = denomination; + this.suit = suit; + } + + public String getDenomination() { + return denomination; + } + + public String getSuit() { + return suit; + } +} diff --git a/src/main/java/blackjack/domain/dto/FirstTwoCardsResponse.java b/src/main/java/blackjack/domain/dto/FirstTwoCardsResponse.java new file mode 100644 index 0000000..0f85aaf --- /dev/null +++ b/src/main/java/blackjack/domain/dto/FirstTwoCardsResponse.java @@ -0,0 +1,33 @@ +package blackjack.domain.dto; + +import blackjack.domain.card.Card; + +import java.util.ArrayList; +import java.util.List; +import java.util.stream.Collectors; + +public class FirstTwoCardsResponse { + private final List dealerCards; + private final List> playerCards; + + public FirstTwoCardsResponse(final List dealerCards, final List> playerCards) { + this.dealerCards = dealerCards; + this.playerCards = new ArrayList<>(playerCards); + } + + public List getDealerCards() { + return convertToCardResponse(dealerCards); + } + + public List> getAllPlayerCards() { + return playerCards.stream() + .map(FirstTwoCardsResponse::convertToCardResponse) + .collect(Collectors.toList()); + } + + private static List convertToCardResponse(final List givenCards) { + return givenCards.stream() + .map(card -> new CardResponse(card.getDenomination(), card.getSuit())) + .collect(Collectors.toList()); + } +} diff --git a/src/test/java/blackjack/domain/dto/CardResponseTest.java b/src/test/java/blackjack/domain/dto/CardResponseTest.java new file mode 100644 index 0000000..bd8ad69 --- /dev/null +++ b/src/test/java/blackjack/domain/dto/CardResponseTest.java @@ -0,0 +1,40 @@ +package blackjack.domain.dto; + +import blackjack.domain.card.Card; +import blackjack.domain.enums.Score; +import blackjack.domain.enums.Suit; +import org.junit.jupiter.api.DisplayName; +import org.junit.jupiter.api.Test; + +import static org.assertj.core.api.Assertions.assertThat; + +public class CardResponseTest { + + @Test + @DisplayName("카드의 점수 이름(끗수)을 반환한다.") + void getScore() { + //given + Card card = new Card(Score.A, Suit.CLUB); + CardResponse cardResponse = new CardResponse(card.getDenomination(), card.getSuit()); + + //when + String denomination = cardResponse.getDenomination(); + + //then + assertThat(denomination).isEqualTo(Score.A.getDenomination()); + } + + @Test + @DisplayName("카드의 무늬를 반환한다.") + void getSuit() { + //given + Card card = new Card(Score.A, Suit.CLUB); + CardResponse cardResponse = new CardResponse(card.getDenomination(), card.getSuit()); + + //when + String suit = cardResponse.getSuit(); + + //then + assertThat(suit).isEqualTo(Suit.CLUB.getSuit()); + } +} diff --git a/src/test/java/blackjack/domain/dto/FirstTwoCardsResponseTest.java b/src/test/java/blackjack/domain/dto/FirstTwoCardsResponseTest.java new file mode 100644 index 0000000..6549acd --- /dev/null +++ b/src/test/java/blackjack/domain/dto/FirstTwoCardsResponseTest.java @@ -0,0 +1,65 @@ +package blackjack.domain.dto; + +import blackjack.domain.card.Card; +import blackjack.domain.enums.Score; +import blackjack.domain.enums.Suit; +import org.junit.jupiter.api.DisplayName; +import org.junit.jupiter.api.Test; + +import java.util.Arrays; +import java.util.Collections; +import java.util.List; + +import static org.assertj.core.api.Assertions.assertThat; +import static org.assertj.core.api.Assertions.tuple; + +public class FirstTwoCardsResponseTest { + + @Test + @DisplayName("딜러 카드 2장을 반환한다.") + void getDealerCards() { + //given + Score ace = Score.A; + Suit club = Suit.CLUB; + Suit diamond = Suit.DIAMOND; + Card card1 = new Card(ace, club); + Card card2 = new Card(ace, diamond); + List dealerCards = Arrays.asList(card1, card2); + FirstTwoCardsResponse firstTwoCardsResponse = new FirstTwoCardsResponse(dealerCards, Collections.emptyList()); + + //when + List dealerCard = firstTwoCardsResponse.getDealerCards(); + + //then + assertThat(dealerCard).hasSize(2) + .extracting("denomination", "suit") + .containsOnly(tuple(ace.getDenomination(), club.getSuit()), + tuple(ace.getDenomination(), diamond.getSuit())); + } + + @Test + @DisplayName("모든 플레이어의 카드 2장을 반환한다.") + void getAllPlayerCards() { + //given + Score ace = Score.A; + Suit club = Suit.CLUB; + Suit diamond = Suit.DIAMOND; + Card card1 = new Card(ace, club); + Card card2 = new Card(ace, diamond); + List playerCards = Arrays.asList(card1, card2); + List> allPlayerCards = Arrays.asList(playerCards, playerCards, playerCards); + FirstTwoCardsResponse firstTwoCardsResponse = new FirstTwoCardsResponse(Collections.emptyList(), allPlayerCards); + + //when + List> allPlayerCardsResponse = firstTwoCardsResponse.getAllPlayerCards(); + + //then + assertThat(allPlayerCardsResponse).hasSize(3); + allPlayerCardsResponse.forEach( + playerCardsResponse -> assertThat(playerCardsResponse).hasSize(2) + .extracting("denomination", "suit") + .containsOnly(tuple(ace.getDenomination(), club.getSuit()), + tuple(ace.getDenomination(), diamond.getSuit())) + ); + } +} From 506fb75eae9433c8e1ca4b2b207fad518236ad0f Mon Sep 17 00:00:00 2001 From: Beenie93 Date: Tue, 3 Aug 2021 16:33:59 +0900 Subject: [PATCH 46/80] =?UTF-8?q?feat:=20=EB=94=9C=EB=9F=AC,=20=ED=94=8C?= =?UTF-8?q?=EB=A0=88=EC=9D=B4=EC=96=B4=EB=93=A4=EC=9D=B4=20=EC=B2=98?= =?UTF-8?q?=EC=9D=8C=20=EB=B0=9B=EC=9D=80=20=EC=B9=B4=EB=93=9C=202?= =?UTF-8?q?=EC=9E=A5=EC=9D=84=20=EC=B6=9C=EB=A0=A5=ED=95=98=EB=8A=94=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 | 2 +- .../controller/BlackjackController.java | 3 ++ src/main/java/blackjack/view/OutputView.java | 31 +++++++++++++++++-- 3 files changed, 32 insertions(+), 4 deletions(-) diff --git a/README.md b/README.md index 1d80e90..5c4db04 100644 --- a/README.md +++ b/README.md @@ -14,7 +14,7 @@ Stay : 플레이어가 추가 카드를 원하지 않음, 딜러는 카드 합 1 - [] 출력 - [x] 각 플레이어(딜러 포함)에게 2장의 카드 지급 알림 - - [] 각 플레이어(딜러 포함)가 가진 카드 + - [x] 각 플레이어(딜러 포함)가 가진 카드 - [] 딜러의 추가 카드 지급 여부 결과 - [] 각 플레이어(딜러 포함)의 총 카드의 합 - [] 최종 승패 결과 diff --git a/src/main/java/blackjack/controller/BlackjackController.java b/src/main/java/blackjack/controller/BlackjackController.java index 4d4ef63..56965d8 100644 --- a/src/main/java/blackjack/controller/BlackjackController.java +++ b/src/main/java/blackjack/controller/BlackjackController.java @@ -1,6 +1,7 @@ package blackjack.controller; import blackjack.domain.GameSystem; +import blackjack.domain.dto.FirstTwoCardsResponse; import blackjack.view.InputView; import blackjack.view.OutputView; @@ -19,5 +20,7 @@ public void run() { List playerNames = inputView.getPlayerNames(); GameSystem gameSystem = new GameSystem(playerNames); outputView.printGameStart(gameSystem.getPlayerNames()); + FirstTwoCardsResponse firstTwoCardsResponse = new FirstTwoCardsResponse(gameSystem.getDealerCards(), gameSystem.getPlayerCards()); + outputView.printFirstTwoCards(gameSystem.getPlayerNames(), firstTwoCardsResponse); } } diff --git a/src/main/java/blackjack/view/OutputView.java b/src/main/java/blackjack/view/OutputView.java index 2c0bcab..edf0a53 100644 --- a/src/main/java/blackjack/view/OutputView.java +++ b/src/main/java/blackjack/view/OutputView.java @@ -1,12 +1,37 @@ package blackjack.view; +import blackjack.domain.dto.CardResponse; +import blackjack.domain.dto.FirstTwoCardsResponse; + import java.util.List; +import java.util.stream.Collectors; +import java.util.stream.IntStream; public class OutputView { - + private static final String DEALER = "딜러"; + private static final String SEPARATOR = ", "; public void printGameStart(List playerNames) { - String names = String.join(", ", playerNames); - System.out.printf("딜러와 %s에게 2장의 카드를 나누었습니다.", names); + String names = String.join(SEPARATOR, playerNames); + System.out.printf("%s와 %s에게 2장의 카드를 나누었습니다.%n", DEALER, names); + } + + public void printFirstTwoCards(List playerNames, FirstTwoCardsResponse firstTwoCardsResponse) { + System.out.printf("%s: %s%n", DEALER, combine(firstTwoCardsResponse.getDealerCards().get(0))); + + IntStream.range(0, playerNames.size()) + .forEach(i -> System.out.printf("%s카드: %s%n", playerNames.get(i), playerCards(firstTwoCardsResponse.getAllPlayerCards().get(i)))); + } + + private String combine(final CardResponse cardResponse) { + return cardResponse.getDenomination() + cardResponse.getSuit(); + } + + private String playerCards(final List cardResponses) { + List fullCardNames = cardResponses.stream() + .map(this::combine) + .collect(Collectors.toList()); + + return String.join(SEPARATOR, fullCardNames); } } From 863cc9392a0335477733da495fda1234c9ac1f35 Mon Sep 17 00:00:00 2001 From: Beenie93 Date: Tue, 3 Aug 2021 16:56:07 +0900 Subject: [PATCH 47/80] =?UTF-8?q?feat:=20=EB=AA=A8=EB=93=A0=20=ED=94=8C?= =?UTF-8?q?=EB=A0=88=EC=9D=B4=EC=96=B4=EA=B0=80=20=EC=A2=85=EB=A3=8C?= =?UTF-8?q?=EB=90=98=EC=97=88=EB=8A=94=EC=A7=80=EC=97=90=20=EB=8C=80?= =?UTF-8?q?=ED=95=9C=20=EC=97=AC=EB=B6=80=EB=A5=BC=20=EB=B0=98=ED=99=98?= =?UTF-8?q?=ED=95=98=EB=8A=94=20=ED=85=8C=EC=8A=A4=ED=8A=B8=20=EB=B0=8F=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 + .../controller/BlackjackController.java | 2 +- .../java/blackjack/domain/GameSystem.java | 15 +++++--- .../java/blackjack/domain/GameSystemTest.java | 35 ++++++++++++++++--- 4 files changed, 43 insertions(+), 10 deletions(-) diff --git a/README.md b/README.md index 5c4db04..c0de36c 100644 --- a/README.md +++ b/README.md @@ -173,5 +173,6 @@ Stay : 플레이어가 추가 카드를 원하지 않음, 딜러는 카드 합 1 - [x] 플레이어들의 이름 반환 - [x] 플레이어들의 모든 카드 반환 - [x] 딜러의 모든 카드 반환 + - [x] 모든 플레이어가 참여 종료했는지 확인 - [] 딜러 추가 카드 발급 - [] 참여자 점수 비교 diff --git a/src/main/java/blackjack/controller/BlackjackController.java b/src/main/java/blackjack/controller/BlackjackController.java index 56965d8..f25313e 100644 --- a/src/main/java/blackjack/controller/BlackjackController.java +++ b/src/main/java/blackjack/controller/BlackjackController.java @@ -18,7 +18,7 @@ public BlackjackController(final InputView inputView, final OutputView outputVie public void run() { List playerNames = inputView.getPlayerNames(); - GameSystem gameSystem = new GameSystem(playerNames); + GameSystem gameSystem = GameSystem.create(playerNames); outputView.printGameStart(gameSystem.getPlayerNames()); FirstTwoCardsResponse firstTwoCardsResponse = new FirstTwoCardsResponse(gameSystem.getDealerCards(), gameSystem.getPlayerCards()); outputView.printFirstTwoCards(gameSystem.getPlayerNames(), firstTwoCardsResponse); diff --git a/src/main/java/blackjack/domain/GameSystem.java b/src/main/java/blackjack/domain/GameSystem.java index b4896ee..0c7695d 100644 --- a/src/main/java/blackjack/domain/GameSystem.java +++ b/src/main/java/blackjack/domain/GameSystem.java @@ -17,14 +17,14 @@ public class GameSystem { private final Dealer dealer = new Dealer(DEFAULT_DEALER_NAME, Deck.getTwoCards()); private final List players; - public GameSystem(final List playerNames) { - this.players = createPlayers(playerNames); + protected GameSystem(final List players) { + this.players = players; } - private List createPlayers(final List playerNames) { - return playerNames.stream() + public static GameSystem create(final List playerNames) { + return new GameSystem(playerNames.stream() .map(name -> new Player(name, Deck.getTwoCards())) - .collect(Collectors.toList()); + .collect(Collectors.toList())); } public List getPlayerNames() { @@ -43,4 +43,9 @@ public List> getPlayerCards() { .map(GivenCards::list) .collect(Collectors.toList())); } + + public boolean isFinished() { + return players.stream() + .allMatch(Gamer::isFinished); + } } diff --git a/src/test/java/blackjack/domain/GameSystemTest.java b/src/test/java/blackjack/domain/GameSystemTest.java index 0ff40d0..fb288d2 100644 --- a/src/test/java/blackjack/domain/GameSystemTest.java +++ b/src/test/java/blackjack/domain/GameSystemTest.java @@ -1,8 +1,14 @@ package blackjack.domain; import blackjack.domain.card.Card; +import blackjack.domain.card.GivenCards; +import blackjack.domain.enums.Score; +import blackjack.domain.enums.Suit; +import blackjack.domain.participant.Player; import org.junit.jupiter.api.DisplayName; import org.junit.jupiter.api.Test; +import org.junit.jupiter.params.ParameterizedTest; +import org.junit.jupiter.params.provider.CsvSource; import java.util.Arrays; import java.util.Collections; @@ -21,7 +27,7 @@ void getPlayerNames() { List names = Arrays.asList(name1, name2); //when - GameSystem gameSystem = new GameSystem(names); + GameSystem gameSystem = GameSystem.create(names); //then assertThat(gameSystem.getPlayerNames()).hasSize(2) @@ -48,12 +54,33 @@ void getPlayerCards() { String name1 = "pobi"; String name2 = "tobi"; List names = Arrays.asList(name1, name2); - GameSystem gameSystem = new GameSystem(names); + GameSystem gameSystem = GameSystem.create(names); //when - List> playerCards = gameSystem.getPlayerCards(); + List> allPlayerCards = gameSystem.getPlayerCards(); //then - assertThat(playerCards).hasSize(2); + assertThat(allPlayerCards).hasSize(2); + allPlayerCards.forEach(playerCards -> assertThat(playerCards).hasSize(2)); + } + + @ParameterizedTest + @CsvSource(value = {"A, TEN, true", "TEN, TEN, false"}) + @DisplayName("모든 플레이어가 종료하였는지 여부를 반환한다.") + void isFinished(String score1, String score2, boolean expected) { + //given + Card card1 = new Card(Score.A, Suit.DIAMOND); + Card card2 = new Card(Score.J, Suit.DIAMOND); + Card card3 = new Card(Score.valueOf(score1), Suit.CLUB); + Card card4 = new Card(Score.valueOf(score2), Suit.CLUB); + Player player1 = new Player("pobi", new GivenCards(Arrays.asList(card1, card2))); + Player player2 = new Player("tobi", new GivenCards(Arrays.asList(card3, card4))); + GameSystem gameSystem = new GameSystem(Arrays.asList(player1, player2)); + + //when + boolean isFinished = gameSystem.isFinished(); + + //then + assertThat(isFinished).isEqualTo(expected); } } From 2792e831d26dd37229f73d4512267374969d9d00 Mon Sep 17 00:00:00 2001 From: Beenie93 Date: Tue, 3 Aug 2021 17:14:55 +0900 Subject: [PATCH 48/80] =?UTF-8?q?feat:=20=EC=B0=B8=EC=97=AC=20=EC=A2=85?= =?UTF-8?q?=EB=A3=8C=EC=83=81=ED=83=9C=EA=B0=80=20=EC=95=84=EB=8B=8C=20?= =?UTF-8?q?=ED=94=8C=EB=A0=88=EC=9D=B4=EC=96=B4=20=EC=A4=91=20=EB=A8=BC?= =?UTF-8?q?=EC=A0=80=20=EC=9E=85=EB=A0=A5=20=EB=B0=9B=EC=95=98=EB=8D=98=20?= =?UTF-8?q?=ED=94=8C=EB=A0=88=EC=9D=B4=EC=96=B4=EC=9D=98=20=EC=9D=B4?= =?UTF-8?q?=EB=A6=84=EC=9D=84=20=EB=B0=98=ED=99=98=ED=95=98=EB=8A=94=20?= =?UTF-8?q?=ED=85=8C=EC=8A=A4=ED=8A=B8=20=EB=B0=8F=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 | 1 + .../java/blackjack/domain/GameSystem.java | 8 +++++++ .../java/blackjack/domain/GameSystemTest.java | 23 +++++++++++++++++++ 3 files changed, 32 insertions(+) diff --git a/README.md b/README.md index c0de36c..df1219c 100644 --- a/README.md +++ b/README.md @@ -174,5 +174,6 @@ Stay : 플레이어가 추가 카드를 원하지 않음, 딜러는 카드 합 1 - [x] 플레이어들의 모든 카드 반환 - [x] 딜러의 모든 카드 반환 - [x] 모든 플레이어가 참여 종료했는지 확인 + - [x] 참여 종료 상태가 아닌 플레이어 중 먼저 입력받은 플레이어 이름 반환 - [] 딜러 추가 카드 발급 - [] 참여자 점수 비교 diff --git a/src/main/java/blackjack/domain/GameSystem.java b/src/main/java/blackjack/domain/GameSystem.java index 0c7695d..30be699 100644 --- a/src/main/java/blackjack/domain/GameSystem.java +++ b/src/main/java/blackjack/domain/GameSystem.java @@ -48,4 +48,12 @@ public boolean isFinished() { return players.stream() .allMatch(Gamer::isFinished); } + + public String getCurrentPlayer() { + return players.stream() + .filter(player -> !player.isFinished()) + .map(Gamer::getName) + .findFirst() + .orElseThrow(IllegalStateException::new); + } } diff --git a/src/test/java/blackjack/domain/GameSystemTest.java b/src/test/java/blackjack/domain/GameSystemTest.java index fb288d2..18effbd 100644 --- a/src/test/java/blackjack/domain/GameSystemTest.java +++ b/src/test/java/blackjack/domain/GameSystemTest.java @@ -83,4 +83,27 @@ void isFinished(String score1, String score2, boolean expected) { //then assertThat(isFinished).isEqualTo(expected); } + + @ParameterizedTest + @CsvSource(value = {"A, TEN, A, NINE, player3", "TEN, TEN, TEN, TEN, player2"}) + @DisplayName("참여 종료상태가 아닌 플레이어 중 먼저 입력 받았던 플레이어의 이름을 반환한다.") + void getCurrentPlayer(String score1, String score2, String score3, String score4, String expectedPlayer) { + //given + Card card1 = new Card(Score.A, Suit.DIAMOND); + Card card2 = new Card(Score.J, Suit.DIAMOND); + Card card3 = new Card(Score.valueOf(score1), Suit.CLUB); + Card card4 = new Card(Score.valueOf(score2), Suit.CLUB); + Card card5 = new Card(Score.valueOf(score3), Suit.HEART); + Card card6 = new Card(Score.valueOf(score4), Suit.HEART); + Player player1 = new Player("player1", new GivenCards(Arrays.asList(card1, card2))); + Player player2 = new Player("player2", new GivenCards(Arrays.asList(card3, card4))); + Player player3 = new Player("player3", new GivenCards(Arrays.asList(card5, card6))); + GameSystem gameSystem = new GameSystem(Arrays.asList(player1, player2, player3)); + + //when + String player = gameSystem.getCurrentPlayer(); + + //then + assertThat(player).isEqualTo(expectedPlayer); + } } From d7d4e0d2b3fc488a9f41cbcb5e116d5f5afeeb78 Mon Sep 17 00:00:00 2001 From: Beenie93 Date: Tue, 3 Aug 2021 17:30:05 +0900 Subject: [PATCH 49/80] =?UTF-8?q?feat:=20=EC=9D=B8=EC=9E=90=EB=A1=9C=20?= =?UTF-8?q?=EC=A0=84=EB=8B=AC=EB=B0=9B=EC=9D=80=20=ED=94=8C=EB=A0=88?= =?UTF-8?q?=EC=9D=B4=EC=96=B4=EC=9D=98=20=EC=B9=B4=EB=93=9C=EB=A5=BC=20?= =?UTF-8?q?=EC=B6=94=EA=B0=80=ED=95=98=EB=8A=94=20=ED=85=8C=EC=8A=A4?= =?UTF-8?q?=ED=8A=B8=20=EB=B0=8F=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/blackjack/domain/GameSystem.java | 12 ++++++++++++ .../java/blackjack/domain/GameSystemTest.java | 17 +++++++++++++++++ 3 files changed, 30 insertions(+) diff --git a/README.md b/README.md index df1219c..4ed0ec7 100644 --- a/README.md +++ b/README.md @@ -175,5 +175,6 @@ Stay : 플레이어가 추가 카드를 원하지 않음, 딜러는 카드 합 1 - [x] 딜러의 모든 카드 반환 - [x] 모든 플레이어가 참여 종료했는지 확인 - [x] 참여 종료 상태가 아닌 플레이어 중 먼저 입력받은 플레이어 이름 반환 + - [x] 입력받은 이름의 플레이어 추가 카드 발급 - [] 딜러 추가 카드 발급 - [] 참여자 점수 비교 diff --git a/src/main/java/blackjack/domain/GameSystem.java b/src/main/java/blackjack/domain/GameSystem.java index 30be699..c165e09 100644 --- a/src/main/java/blackjack/domain/GameSystem.java +++ b/src/main/java/blackjack/domain/GameSystem.java @@ -56,4 +56,16 @@ public String getCurrentPlayer() { .findFirst() .orElseThrow(IllegalStateException::new); } + + public void hit(final String name) { + Player fetchedPlayer = findPlayerBy(name); + fetchedPlayer.hit(Deck.getCard()); + } + + private Player findPlayerBy(final String name) { + return players.stream() + .filter(player -> player.getName().equals(name)) + .findFirst() + .orElseThrow(IllegalArgumentException::new); + } } diff --git a/src/test/java/blackjack/domain/GameSystemTest.java b/src/test/java/blackjack/domain/GameSystemTest.java index 18effbd..cfc4447 100644 --- a/src/test/java/blackjack/domain/GameSystemTest.java +++ b/src/test/java/blackjack/domain/GameSystemTest.java @@ -106,4 +106,21 @@ void getCurrentPlayer(String score1, String score2, String score3, String score4 //then assertThat(player).isEqualTo(expectedPlayer); } + + @Test + @DisplayName("인자로 전달받은 플레이어의 카드를 추가한다.") + void hit() { + //given + String name = "pobi"; + Card card1 = new Card(Score.A, Suit.HEART); + Card card2 = new Card(Score.A, Suit.CLUB); + Player player = new Player(name, new GivenCards(Arrays.asList(card1, card2))); + GameSystem gameSystem = new GameSystem(Collections.singletonList(player)); + + //when + gameSystem.hit(name); + + //then + assertThat(player.getCards().list()).hasSize(3); + } } From 7d6f168d000d70bb124d1a6f8ae311e183883367 Mon Sep 17 00:00:00 2001 From: Beenie93 Date: Tue, 3 Aug 2021 17:34:28 +0900 Subject: [PATCH 50/80] =?UTF-8?q?feat:=20=EB=94=9C=EB=9F=AC=EC=9D=98=20?= =?UTF-8?q?=EC=B9=B4=EB=93=9C=EB=A5=BC=20=EC=B6=94=EA=B0=80=ED=95=98?= =?UTF-8?q?=EB=8A=94=20=ED=85=8C=EC=8A=A4=ED=8A=B8=20=EB=B0=8F=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/blackjack/domain/GameSystem.java | 4 ++++ src/test/java/blackjack/domain/GameSystemTest.java | 13 +++++++++++++ 3 files changed, 18 insertions(+), 1 deletion(-) diff --git a/README.md b/README.md index 4ed0ec7..10acad7 100644 --- a/README.md +++ b/README.md @@ -176,5 +176,5 @@ Stay : 플레이어가 추가 카드를 원하지 않음, 딜러는 카드 합 1 - [x] 모든 플레이어가 참여 종료했는지 확인 - [x] 참여 종료 상태가 아닌 플레이어 중 먼저 입력받은 플레이어 이름 반환 - [x] 입력받은 이름의 플레이어 추가 카드 발급 - - [] 딜러 추가 카드 발급 + - [x] 딜러 추가 카드 발급 - [] 참여자 점수 비교 diff --git a/src/main/java/blackjack/domain/GameSystem.java b/src/main/java/blackjack/domain/GameSystem.java index c165e09..51e8c8a 100644 --- a/src/main/java/blackjack/domain/GameSystem.java +++ b/src/main/java/blackjack/domain/GameSystem.java @@ -68,4 +68,8 @@ private Player findPlayerBy(final String name) { .findFirst() .orElseThrow(IllegalArgumentException::new); } + + public void hit() { + dealer.hit(Deck.getCard()); + } } diff --git a/src/test/java/blackjack/domain/GameSystemTest.java b/src/test/java/blackjack/domain/GameSystemTest.java index cfc4447..22e6f9d 100644 --- a/src/test/java/blackjack/domain/GameSystemTest.java +++ b/src/test/java/blackjack/domain/GameSystemTest.java @@ -123,4 +123,17 @@ void hit() { //then assertThat(player.getCards().list()).hasSize(3); } + + @Test + @DisplayName("딜러의 카드를 추가한다.") + void hit_for_dealer() { + //given + GameSystem gameSystem = new GameSystem(Collections.emptyList()); + + //when + gameSystem.hit(); + + //then + assertThat(gameSystem.getDealerCards()).hasSize(3); + } } From c1c91372cd425ad1bf88057f91a57d3378a6e857 Mon Sep 17 00:00:00 2001 From: Beenie93 Date: Tue, 3 Aug 2021 19:12:26 +0900 Subject: [PATCH 51/80] =?UTF-8?q?refactor:=20=ED=94=8C=EB=A0=88=EC=9D=B4?= =?UTF-8?q?=EC=96=B4=EC=9D=98=20=EC=B9=B4=EB=93=9C=20=EC=B6=94=EA=B0=80=20?= =?UTF-8?q?=EC=8B=9C=20=EC=B9=B4=EB=93=9C=20=EC=B6=94=EA=B0=80=20=EC=9D=91?= =?UTF-8?q?=EB=8B=B5=EC=9D=84=20=EC=9D=B8=EC=9E=90=EB=8F=84=20=EB=B0=9B?= =?UTF-8?q?=EC=95=84=EC=98=A4=EA=B2=8C=20=EC=88=98=EC=A0=95?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- README.md | 1 + .../java/blackjack/domain/GameSystem.java | 17 ++++++++++- .../java/blackjack/domain/GameSystemTest.java | 30 +++++++++++++++---- 3 files changed, 42 insertions(+), 6 deletions(-) diff --git a/README.md b/README.md index 10acad7..185a4ef 100644 --- a/README.md +++ b/README.md @@ -176,5 +176,6 @@ Stay : 플레이어가 추가 카드를 원하지 않음, 딜러는 카드 합 1 - [x] 모든 플레이어가 참여 종료했는지 확인 - [x] 참여 종료 상태가 아닌 플레이어 중 먼저 입력받은 플레이어 이름 반환 - [x] 입력받은 이름의 플레이어 추가 카드 발급 + - [x] ERROR : y 또는 n이 아닌 응답을 전달받을 경우 - [x] 딜러 추가 카드 발급 - [] 참여자 점수 비교 diff --git a/src/main/java/blackjack/domain/GameSystem.java b/src/main/java/blackjack/domain/GameSystem.java index 51e8c8a..f42a9fe 100644 --- a/src/main/java/blackjack/domain/GameSystem.java +++ b/src/main/java/blackjack/domain/GameSystem.java @@ -13,6 +13,8 @@ public class GameSystem { private static final String DEFAULT_DEALER_NAME = "딜러"; + private static final String ACCEPT_ANSWER = "y"; + private static final String DECLINE_ANSWER = "n"; private final Dealer dealer = new Dealer(DEFAULT_DEALER_NAME, Deck.getTwoCards()); private final List players; @@ -57,11 +59,24 @@ public String getCurrentPlayer() { .orElseThrow(IllegalStateException::new); } - public void hit(final String name) { + public void hit(final String answer, final String name) { + validate(answer); Player fetchedPlayer = findPlayerBy(name); + + if (answer.equals(DECLINE_ANSWER)) { + fetchedPlayer.stay(); + return; + } + fetchedPlayer.hit(Deck.getCard()); } + private void validate(final String answer) { + if (!answer.equals(ACCEPT_ANSWER) && !answer.equals(DECLINE_ANSWER)) { + throw new IllegalArgumentException("y 또는 n을 입력해주세요."); + } + } + private Player findPlayerBy(final String name) { return players.stream() .filter(player -> player.getName().equals(name)) diff --git a/src/test/java/blackjack/domain/GameSystemTest.java b/src/test/java/blackjack/domain/GameSystemTest.java index 22e6f9d..a077f91 100644 --- a/src/test/java/blackjack/domain/GameSystemTest.java +++ b/src/test/java/blackjack/domain/GameSystemTest.java @@ -9,12 +9,14 @@ import org.junit.jupiter.api.Test; import org.junit.jupiter.params.ParameterizedTest; import org.junit.jupiter.params.provider.CsvSource; +import org.junit.jupiter.params.provider.ValueSource; import java.util.Arrays; import java.util.Collections; import java.util.List; import static org.assertj.core.api.Assertions.assertThat; +import static org.assertj.core.api.Assertions.assertThatThrownBy; public class GameSystemTest { @@ -107,9 +109,10 @@ void getCurrentPlayer(String score1, String score2, String score3, String score4 assertThat(player).isEqualTo(expectedPlayer); } - @Test - @DisplayName("인자로 전달받은 플레이어의 카드를 추가한다.") - void hit() { + @ParameterizedTest + @CsvSource(value = {"y, 3", "n, 2"}) + @DisplayName("카드 추가 의사와 플레이어 이름을 인자로 전달받아 플레이어의 카드를 추가한다.") + void hit(String answer, int expectedSize) { //given String name = "pobi"; Card card1 = new Card(Score.A, Suit.HEART); @@ -118,10 +121,27 @@ void hit() { GameSystem gameSystem = new GameSystem(Collections.singletonList(player)); //when - gameSystem.hit(name); + gameSystem.hit(answer, name); //then - assertThat(player.getCards().list()).hasSize(3); + assertThat(player.getCards().list()).hasSize(expectedSize); + } + + @ParameterizedTest + @ValueSource(strings = {"Y", "N", "y1", "n1", "yes", "no"}) + @DisplayName("y 또는 n이 아닌 다른 응답을 전달받을 경우, 예외가 발생한다.") + void hit_with_invalid_answer(String answer) { + //given + String name = "pobi"; + Card card1 = new Card(Score.A, Suit.HEART); + Card card2 = new Card(Score.A, Suit.CLUB); + Player player = new Player(name, new GivenCards(Arrays.asList(card1, card2))); + GameSystem gameSystem = new GameSystem(Collections.singletonList(player)); + + //when //then + assertThatThrownBy(() -> gameSystem.hit(answer, name)) + .isInstanceOf(IllegalArgumentException.class) + .hasMessage("y 또는 n을 입력해주세요."); } @Test From bf12f9eb95574cb802a5abf79091ef422658c64d Mon Sep 17 00:00:00 2001 From: Beenie93 Date: Tue, 3 Aug 2021 19:23:17 +0900 Subject: [PATCH 52/80] =?UTF-8?q?refactor:=20isFinished=20->=20allPlayersF?= =?UTF-8?q?inished=20=EC=9D=B4=EB=A6=84=20=EB=B3=80=EA=B2=BD?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- src/main/java/blackjack/domain/GameSystem.java | 2 +- src/test/java/blackjack/domain/GameSystemTest.java | 4 ++-- 2 files changed, 3 insertions(+), 3 deletions(-) diff --git a/src/main/java/blackjack/domain/GameSystem.java b/src/main/java/blackjack/domain/GameSystem.java index f42a9fe..7c7b121 100644 --- a/src/main/java/blackjack/domain/GameSystem.java +++ b/src/main/java/blackjack/domain/GameSystem.java @@ -46,7 +46,7 @@ public List> getPlayerCards() { .collect(Collectors.toList())); } - public boolean isFinished() { + public boolean allPlayersFinished() { return players.stream() .allMatch(Gamer::isFinished); } diff --git a/src/test/java/blackjack/domain/GameSystemTest.java b/src/test/java/blackjack/domain/GameSystemTest.java index a077f91..56486ed 100644 --- a/src/test/java/blackjack/domain/GameSystemTest.java +++ b/src/test/java/blackjack/domain/GameSystemTest.java @@ -69,7 +69,7 @@ void getPlayerCards() { @ParameterizedTest @CsvSource(value = {"A, TEN, true", "TEN, TEN, false"}) @DisplayName("모든 플레이어가 종료하였는지 여부를 반환한다.") - void isFinished(String score1, String score2, boolean expected) { + void allPlayersFinished(String score1, String score2, boolean expected) { //given Card card1 = new Card(Score.A, Suit.DIAMOND); Card card2 = new Card(Score.J, Suit.DIAMOND); @@ -80,7 +80,7 @@ void isFinished(String score1, String score2, boolean expected) { GameSystem gameSystem = new GameSystem(Arrays.asList(player1, player2)); //when - boolean isFinished = gameSystem.isFinished(); + boolean isFinished = gameSystem.allPlayersFinished(); //then assertThat(isFinished).isEqualTo(expected); From 16109f33a30a6cbc0685258338c281f66437ca93 Mon Sep 17 00:00:00 2001 From: Beenie93 Date: Tue, 3 Aug 2021 19:23:53 +0900 Subject: [PATCH 53/80] =?UTF-8?q?feat:=20=ED=94=8C=EB=A0=88=EC=9D=B4?= =?UTF-8?q?=EC=96=B4(=EB=94=9C=EB=9F=AC=20=EC=A0=9C=EC=99=B8)=20=EC=B6=94?= =?UTF-8?q?=EA=B0=80=20=EC=B9=B4=EB=93=9C=20=EC=9A=94=EC=B2=AD=ED=95=98?= =?UTF-8?q?=EB=8A=94=20=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 | 2 +- src/main/java/blackjack/controller/BlackjackController.java | 6 ++++++ src/main/java/blackjack/view/InputView.java | 5 +++++ 3 files changed, 12 insertions(+), 1 deletion(-) diff --git a/README.md b/README.md index 185a4ef..dd88461 100644 --- a/README.md +++ b/README.md @@ -10,7 +10,7 @@ Stay : 플레이어가 추가 카드를 원하지 않음, 딜러는 카드 합 1 # 구현해야 할 기능 목록 - [x] 입력 - [x] 플레이어 이름 - - [] 플레이어(딜러 제외) 추가 카드 요청 여부 + - [x] 플레이어(딜러 제외) 추가 카드 요청 여부 - [] 출력 - [x] 각 플레이어(딜러 포함)에게 2장의 카드 지급 알림 diff --git a/src/main/java/blackjack/controller/BlackjackController.java b/src/main/java/blackjack/controller/BlackjackController.java index f25313e..91e8f05 100644 --- a/src/main/java/blackjack/controller/BlackjackController.java +++ b/src/main/java/blackjack/controller/BlackjackController.java @@ -22,5 +22,11 @@ public void run() { outputView.printGameStart(gameSystem.getPlayerNames()); FirstTwoCardsResponse firstTwoCardsResponse = new FirstTwoCardsResponse(gameSystem.getDealerCards(), gameSystem.getPlayerCards()); outputView.printFirstTwoCards(gameSystem.getPlayerNames(), firstTwoCardsResponse); + + while (!gameSystem.allPlayersFinished()) { + String currentPlayer = gameSystem.getCurrentPlayer(); + String answer = inputView.getAnswerForAnotherCard(currentPlayer); + gameSystem.hit(answer, currentPlayer); + } } } diff --git a/src/main/java/blackjack/view/InputView.java b/src/main/java/blackjack/view/InputView.java index a217520..c77f1f7 100644 --- a/src/main/java/blackjack/view/InputView.java +++ b/src/main/java/blackjack/view/InputView.java @@ -16,4 +16,9 @@ public List getPlayerNames() { .map(String::trim) .collect(Collectors.toList()); } + + public String getAnswerForAnotherCard(String player) { + System.out.printf("%s는 한장의 카드를 더 받겠습니까?(예는 y, 아니오는 n)%n", player); + return scanner.nextLine().trim(); + } } From a6018439bf4257025a6b0525a3296a35bb969467 Mon Sep 17 00:00:00 2001 From: Beenie93 Date: Tue, 3 Aug 2021 19:30:12 +0900 Subject: [PATCH 54/80] =?UTF-8?q?refactor:=20Player=20=EA=B0=9D=EC=B2=B4?= =?UTF-8?q?=20->=20Person=20=EA=B0=9D=EC=B2=B4=EB=A1=9C=20=EC=88=98?= =?UTF-8?q?=EC=A0=95?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../java/blackjack/domain/GameSystem.java | 20 +++++++++---------- .../java/blackjack/domain/GameSystemTest.java | 15 +++++++------- 2 files changed, 18 insertions(+), 17 deletions(-) diff --git a/src/main/java/blackjack/domain/GameSystem.java b/src/main/java/blackjack/domain/GameSystem.java index 7c7b121..a9a6cb6 100644 --- a/src/main/java/blackjack/domain/GameSystem.java +++ b/src/main/java/blackjack/domain/GameSystem.java @@ -4,7 +4,7 @@ import blackjack.domain.card.Deck; import blackjack.domain.card.GivenCards; import blackjack.domain.participant.Dealer; -import blackjack.domain.participant.Gamer; +import blackjack.domain.participant.Person; import blackjack.domain.participant.Player; import java.util.Collections; @@ -16,10 +16,10 @@ public class GameSystem { private static final String ACCEPT_ANSWER = "y"; private static final String DECLINE_ANSWER = "n"; - private final Dealer dealer = new Dealer(DEFAULT_DEALER_NAME, Deck.getTwoCards()); - private final List players; + private final Person dealer = new Dealer(DEFAULT_DEALER_NAME, Deck.getTwoCards()); + private final List players; - protected GameSystem(final List players) { + protected GameSystem(final List players) { this.players = players; } @@ -31,7 +31,7 @@ public static GameSystem create(final List playerNames) { public List getPlayerNames() { return Collections.unmodifiableList(players.stream() - .map(Gamer::getName) + .map(Person::getName) .collect(Collectors.toList())); } @@ -41,27 +41,27 @@ public List getDealerCards() { public List> getPlayerCards() { return Collections.unmodifiableList(players.stream() - .map(Gamer::getCards) + .map(Person::getCards) .map(GivenCards::list) .collect(Collectors.toList())); } public boolean allPlayersFinished() { return players.stream() - .allMatch(Gamer::isFinished); + .allMatch(Person::isFinished); } public String getCurrentPlayer() { return players.stream() .filter(player -> !player.isFinished()) - .map(Gamer::getName) + .map(Person::getName) .findFirst() .orElseThrow(IllegalStateException::new); } public void hit(final String answer, final String name) { validate(answer); - Player fetchedPlayer = findPlayerBy(name); + Person fetchedPlayer = findPlayerBy(name); if (answer.equals(DECLINE_ANSWER)) { fetchedPlayer.stay(); @@ -77,7 +77,7 @@ private void validate(final String answer) { } } - private Player findPlayerBy(final String name) { + private Person findPlayerBy(final String name) { return players.stream() .filter(player -> player.getName().equals(name)) .findFirst() diff --git a/src/test/java/blackjack/domain/GameSystemTest.java b/src/test/java/blackjack/domain/GameSystemTest.java index 56486ed..f4c7139 100644 --- a/src/test/java/blackjack/domain/GameSystemTest.java +++ b/src/test/java/blackjack/domain/GameSystemTest.java @@ -4,6 +4,7 @@ import blackjack.domain.card.GivenCards; import blackjack.domain.enums.Score; import blackjack.domain.enums.Suit; +import blackjack.domain.participant.Person; import blackjack.domain.participant.Player; import org.junit.jupiter.api.DisplayName; import org.junit.jupiter.api.Test; @@ -75,8 +76,8 @@ void allPlayersFinished(String score1, String score2, boolean expected) { Card card2 = new Card(Score.J, Suit.DIAMOND); Card card3 = new Card(Score.valueOf(score1), Suit.CLUB); Card card4 = new Card(Score.valueOf(score2), Suit.CLUB); - Player player1 = new Player("pobi", new GivenCards(Arrays.asList(card1, card2))); - Player player2 = new Player("tobi", new GivenCards(Arrays.asList(card3, card4))); + Person player1 = new Player("pobi", new GivenCards(Arrays.asList(card1, card2))); + Person player2 = new Player("tobi", new GivenCards(Arrays.asList(card3, card4))); GameSystem gameSystem = new GameSystem(Arrays.asList(player1, player2)); //when @@ -97,9 +98,9 @@ void getCurrentPlayer(String score1, String score2, String score3, String score4 Card card4 = new Card(Score.valueOf(score2), Suit.CLUB); Card card5 = new Card(Score.valueOf(score3), Suit.HEART); Card card6 = new Card(Score.valueOf(score4), Suit.HEART); - Player player1 = new Player("player1", new GivenCards(Arrays.asList(card1, card2))); - Player player2 = new Player("player2", new GivenCards(Arrays.asList(card3, card4))); - Player player3 = new Player("player3", new GivenCards(Arrays.asList(card5, card6))); + Person player1 = new Player("player1", new GivenCards(Arrays.asList(card1, card2))); + Person player2 = new Player("player2", new GivenCards(Arrays.asList(card3, card4))); + Person player3 = new Player("player3", new GivenCards(Arrays.asList(card5, card6))); GameSystem gameSystem = new GameSystem(Arrays.asList(player1, player2, player3)); //when @@ -117,7 +118,7 @@ void hit(String answer, int expectedSize) { String name = "pobi"; Card card1 = new Card(Score.A, Suit.HEART); Card card2 = new Card(Score.A, Suit.CLUB); - Player player = new Player(name, new GivenCards(Arrays.asList(card1, card2))); + Person player = new Player(name, new GivenCards(Arrays.asList(card1, card2))); GameSystem gameSystem = new GameSystem(Collections.singletonList(player)); //when @@ -135,7 +136,7 @@ void hit_with_invalid_answer(String answer) { String name = "pobi"; Card card1 = new Card(Score.A, Suit.HEART); Card card2 = new Card(Score.A, Suit.CLUB); - Player player = new Player(name, new GivenCards(Arrays.asList(card1, card2))); + Person player = new Player(name, new GivenCards(Arrays.asList(card1, card2))); GameSystem gameSystem = new GameSystem(Collections.singletonList(player)); //when //then From d68db1d45dead4f573c27ae8e72b1012fe6e34bb Mon Sep 17 00:00:00 2001 From: Beenie93 Date: Tue, 3 Aug 2021 20:22:15 +0900 Subject: [PATCH 55/80] =?UTF-8?q?refactor:=20=EC=9D=B8=EC=9E=90=EB=A1=9C?= =?UTF-8?q?=20=EB=B0=9B=EC=9D=80=20=EA=B0=92=EB=B3=B4=EB=8B=A4=20=ED=95=A9?= =?UTF-8?q?=EC=9D=B4=20=EC=9E=91=EA=B1=B0=EB=82=98=20=EA=B0=99=EC=9D=80=20?= =?UTF-8?q?=EC=A7=80=20=ED=99=95=EC=9D=B8=ED=95=98=EB=8A=94=20=EA=B8=B0?= =?UTF-8?q?=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 + .../java/blackjack/domain/card/GivenCards.java | 4 ++++ .../blackjack/domain/participant/Dealer.java | 4 ++-- .../blackjack/domain/card/GivenCardsTest.java | 18 ++++++++++++++++++ 4 files changed, 25 insertions(+), 2 deletions(-) diff --git a/README.md b/README.md index dd88461..52a318f 100644 --- a/README.md +++ b/README.md @@ -154,6 +154,7 @@ Stay : 플레이어가 추가 카드를 원하지 않음, 딜러는 카드 합 1 - [x] 인자로 받은 카드 추가 - [x] 인자로 받은 카드보다 합이 큰 지 확인 - [x] 인자로 받은 카드보다 합이 작은 지 확인 + - [x] 인자로 받은 값보다 합이 작거나 같은 지 확인 - [x] 카드 덱 - 속성 diff --git a/src/main/java/blackjack/domain/card/GivenCards.java b/src/main/java/blackjack/domain/card/GivenCards.java index 871990b..df0952f 100644 --- a/src/main/java/blackjack/domain/card/GivenCards.java +++ b/src/main/java/blackjack/domain/card/GivenCards.java @@ -63,4 +63,8 @@ public boolean isGreaterThan(final GivenCards otherCards) { public boolean isLessThan(final GivenCards otherCards) { return sum() < otherCards.sum(); } + + public boolean isLessThanEqualTo(final int value) { + return sum() <= value; + } } diff --git a/src/main/java/blackjack/domain/participant/Dealer.java b/src/main/java/blackjack/domain/participant/Dealer.java index 20570cc..4c31afd 100644 --- a/src/main/java/blackjack/domain/participant/Dealer.java +++ b/src/main/java/blackjack/domain/participant/Dealer.java @@ -9,7 +9,7 @@ public class Dealer extends Gamer { public static final int BLACKJACK = 21; - private static final int HIT_THRESHOLD = 16; + public static final int HIT_THRESHOLD = 16; public Dealer(final String name, final GivenCards givenCards) { super(name); @@ -22,7 +22,7 @@ public State injectStateBy(final GivenCards cards) { return new Blackjack(cards); } - if (cards.sum() <= HIT_THRESHOLD) { + if (cards.isLessThanEqualTo(HIT_THRESHOLD)) { return new Hit(cards); } diff --git a/src/test/java/blackjack/domain/card/GivenCardsTest.java b/src/test/java/blackjack/domain/card/GivenCardsTest.java index 34eab24..09d1083 100644 --- a/src/test/java/blackjack/domain/card/GivenCardsTest.java +++ b/src/test/java/blackjack/domain/card/GivenCardsTest.java @@ -4,6 +4,8 @@ import blackjack.domain.enums.Suit; import org.junit.jupiter.api.DisplayName; import org.junit.jupiter.api.Test; +import org.junit.jupiter.params.ParameterizedTest; +import org.junit.jupiter.params.provider.CsvSource; import java.util.Arrays; import java.util.List; @@ -155,4 +157,20 @@ void isLessThan() { //then assertThat(result).isTrue(); } + + @ParameterizedTest + @CsvSource(value = {"18, false", "19, true"}) + @DisplayName("인자로 받은 값보다 자신의 카드 합이 작거나 같을 경우, 참을 반환한다.") + void isLessThanEqualTo(int sum, boolean expected) { + //given + Card card1 = new Card(Score.TEN, Suit.CLUB); + Card card2 = new Card(Score.NINE, Suit.CLUB); + GivenCards myCards = new GivenCards(Arrays.asList(card1, card2)); + + //when + boolean result = myCards.isLessThanEqualTo(sum); + + //then + assertThat(result).isEqualTo(expected); + } } From c560333d7f9b4c70382a8d21e34a06d6f1a90329 Mon Sep 17 00:00:00 2001 From: Beenie93 Date: Tue, 3 Aug 2021 21:03:20 +0900 Subject: [PATCH 56/80] =?UTF-8?q?feat:=20=EB=94=9C=EB=9F=AC=20=EC=A2=85?= =?UTF-8?q?=EB=A3=8C=20=EC=97=AC=EB=B6=80=20=EB=B0=98=ED=99=98=ED=95=98?= =?UTF-8?q?=EB=8A=94=20=ED=85=8C=EC=8A=A4=ED=8A=B8=20=EB=B0=8F=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 | 4 +++- .../java/blackjack/domain/GameSystem.java | 4 ++++ .../blackjack/domain/participant/Dealer.java | 9 +++++++++ .../domain/participant/DealerTest.java | 20 +++++++++++++++++++ 4 files changed, 36 insertions(+), 1 deletion(-) diff --git a/README.md b/README.md index 52a318f..4e94fd4 100644 --- a/README.md +++ b/README.md @@ -106,7 +106,8 @@ Stay : 플레이어가 추가 카드를 원하지 않음, 딜러는 카드 합 1 - [x] 카드 2장의 합 16 초과일 경우 Stay 상태 - [x] 카드 추가 발급 - [x] 17 이상 21 이하일 경우, Stay 상태로 변경 - + - [x] 종료 여부 반환 + - [x] Blackjack이 아니며, 17 이상 21 이하일 경우 참으로 반환 - [x] 카드 - 속성 - [x] 점수 @@ -179,4 +180,5 @@ Stay : 플레이어가 추가 카드를 원하지 않음, 딜러는 카드 합 1 - [x] 입력받은 이름의 플레이어 추가 카드 발급 - [x] ERROR : y 또는 n이 아닌 응답을 전달받을 경우 - [x] 딜러 추가 카드 발급 + - [x] 딜러 종료 여부 반환 - [] 참여자 점수 비교 diff --git a/src/main/java/blackjack/domain/GameSystem.java b/src/main/java/blackjack/domain/GameSystem.java index a9a6cb6..4643495 100644 --- a/src/main/java/blackjack/domain/GameSystem.java +++ b/src/main/java/blackjack/domain/GameSystem.java @@ -87,4 +87,8 @@ private Person findPlayerBy(final String name) { public void hit() { dealer.hit(Deck.getCard()); } + + public boolean isDealerFinished() { + return dealer.isFinished(); + } } diff --git a/src/main/java/blackjack/domain/participant/Dealer.java b/src/main/java/blackjack/domain/participant/Dealer.java index 4c31afd..851f191 100644 --- a/src/main/java/blackjack/domain/participant/Dealer.java +++ b/src/main/java/blackjack/domain/participant/Dealer.java @@ -41,4 +41,13 @@ public void hit(final Card card) { state = newState; } + + @Override + public boolean isFinished() { + if (!getCards().isBlackjack() && !getCards().isLessThanEqualTo(HIT_THRESHOLD)) { + stay(); + } + + return super.isFinished(); + } } diff --git a/src/test/java/blackjack/domain/participant/DealerTest.java b/src/test/java/blackjack/domain/participant/DealerTest.java index 9aa7fff..b194a0a 100644 --- a/src/test/java/blackjack/domain/participant/DealerTest.java +++ b/src/test/java/blackjack/domain/participant/DealerTest.java @@ -11,6 +11,7 @@ import org.junit.jupiter.api.DisplayName; import org.junit.jupiter.api.Test; import org.junit.jupiter.params.ParameterizedTest; +import org.junit.jupiter.params.provider.CsvSource; import org.junit.jupiter.params.provider.ValueSource; import java.util.Arrays; @@ -121,4 +122,23 @@ void hit_become_stay_state(String score) { assertThat(dealer).extracting("state") .isInstanceOf(Stay.class); } + + @ParameterizedTest + @CsvSource(value = {"THREE, true", "SEVEN, true", "TWO, false"}) + @DisplayName("블랙잭이 아니고 17 이상 21 이하일 경우 종료 여부를 참으로 반환한다.") + void isFinished(String score, boolean expected) { + //given + Card card1 = new Card(Score.TEN, Suit.DIAMOND); + Card card2 = new Card(Score.FOUR, Suit.DIAMOND); + GivenCards givenCards = new GivenCards(Arrays.asList(card1, card2)); + Person dealer = new Dealer("pobi", givenCards); + Card card3 = new Card(Score.valueOf(score), Suit.HEART); + dealer.hit(card3); + + //when + boolean finished = dealer.isFinished(); + + //then + assertThat(finished).isEqualTo(expected); + } } From adf3110686debe3b564312caed19153f760b9a19 Mon Sep 17 00:00:00 2001 From: Beenie93 Date: Tue, 3 Aug 2021 21:06:43 +0900 Subject: [PATCH 57/80] =?UTF-8?q?feat:=20=EB=94=9C=EB=9F=AC=EC=9D=98=20?= =?UTF-8?q?=EC=B6=94=EA=B0=80=20=EC=B9=B4=EB=93=9C=20=EC=A7=80=EA=B8=89=20?= =?UTF-8?q?=EC=97=AC=EB=B6=80=20=EA=B2=B0=EA=B3=BC=20=EC=B6=9C=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 | 2 +- .../java/blackjack/controller/BlackjackController.java | 5 +++++ src/main/java/blackjack/view/OutputView.java | 9 ++++++--- 3 files changed, 12 insertions(+), 4 deletions(-) diff --git a/README.md b/README.md index 4e94fd4..6772a32 100644 --- a/README.md +++ b/README.md @@ -15,7 +15,7 @@ Stay : 플레이어가 추가 카드를 원하지 않음, 딜러는 카드 합 1 - [] 출력 - [x] 각 플레이어(딜러 포함)에게 2장의 카드 지급 알림 - [x] 각 플레이어(딜러 포함)가 가진 카드 - - [] 딜러의 추가 카드 지급 여부 결과 + - [x] 딜러의 추가 카드 지급 여부 결과 - [] 각 플레이어(딜러 포함)의 총 카드의 합 - [] 최종 승패 결과 diff --git a/src/main/java/blackjack/controller/BlackjackController.java b/src/main/java/blackjack/controller/BlackjackController.java index 91e8f05..8fa64b5 100644 --- a/src/main/java/blackjack/controller/BlackjackController.java +++ b/src/main/java/blackjack/controller/BlackjackController.java @@ -28,5 +28,10 @@ public void run() { String answer = inputView.getAnswerForAnotherCard(currentPlayer); gameSystem.hit(answer, currentPlayer); } + + while (!gameSystem.isDealerFinished()) { + outputView.printDealerGetAnotherCard(); + gameSystem.hit(); + } } } diff --git a/src/main/java/blackjack/view/OutputView.java b/src/main/java/blackjack/view/OutputView.java index edf0a53..dc85daf 100644 --- a/src/main/java/blackjack/view/OutputView.java +++ b/src/main/java/blackjack/view/OutputView.java @@ -8,16 +8,15 @@ import java.util.stream.IntStream; public class OutputView { - private static final String DEALER = "딜러"; private static final String SEPARATOR = ", "; public void printGameStart(List playerNames) { String names = String.join(SEPARATOR, playerNames); - System.out.printf("%s와 %s에게 2장의 카드를 나누었습니다.%n", DEALER, names); + System.out.printf("딜러와 %s에게 2장의 카드를 나누었습니다.%n", names); } public void printFirstTwoCards(List playerNames, FirstTwoCardsResponse firstTwoCardsResponse) { - System.out.printf("%s: %s%n", DEALER, combine(firstTwoCardsResponse.getDealerCards().get(0))); + System.out.printf("딜러: %s%n", combine(firstTwoCardsResponse.getDealerCards().get(0))); IntStream.range(0, playerNames.size()) .forEach(i -> System.out.printf("%s카드: %s%n", playerNames.get(i), playerCards(firstTwoCardsResponse.getAllPlayerCards().get(i)))); @@ -34,4 +33,8 @@ private String playerCards(final List cardResponses) { return String.join(SEPARATOR, fullCardNames); } + + public void printDealerGetAnotherCard() { + System.out.printf("딜러는 16이하라 한장의 카드를 더 받았습니다.%n"); + } } From 3dc4b10470336e91a00e87bd6f8a629dfde69ac3 Mon Sep 17 00:00:00 2001 From: Beenie93 Date: Tue, 3 Aug 2021 21:10:59 +0900 Subject: [PATCH 58/80] =?UTF-8?q?refactor:=20=EB=B8=94=EB=9E=99=EC=9E=AD?= =?UTF-8?q?=20=EC=83=81=EC=88=98=20Dealer=20->=20GameSystem=EC=9C=BC?= =?UTF-8?q?=EB=A1=9C=20=EC=9D=B4=EB=8F=99?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- src/main/java/blackjack/domain/GameSystem.java | 1 + src/main/java/blackjack/domain/card/GivenCards.java | 2 +- src/main/java/blackjack/domain/participant/Dealer.java | 5 +++-- 3 files changed, 5 insertions(+), 3 deletions(-) diff --git a/src/main/java/blackjack/domain/GameSystem.java b/src/main/java/blackjack/domain/GameSystem.java index 4643495..bc9a0b6 100644 --- a/src/main/java/blackjack/domain/GameSystem.java +++ b/src/main/java/blackjack/domain/GameSystem.java @@ -12,6 +12,7 @@ import java.util.stream.Collectors; public class GameSystem { + public static final int BLACKJACK = 21; private static final String DEFAULT_DEALER_NAME = "딜러"; private static final String ACCEPT_ANSWER = "y"; private static final String DECLINE_ANSWER = "n"; diff --git a/src/main/java/blackjack/domain/card/GivenCards.java b/src/main/java/blackjack/domain/card/GivenCards.java index df0952f..5e907f0 100644 --- a/src/main/java/blackjack/domain/card/GivenCards.java +++ b/src/main/java/blackjack/domain/card/GivenCards.java @@ -4,9 +4,9 @@ import java.util.Collections; import java.util.List; +import static blackjack.domain.GameSystem.BLACKJACK; import static blackjack.domain.card.Deck.TWO_CARDS; import static blackjack.domain.enums.Score.ACE_BONUS; -import static blackjack.domain.participant.Dealer.BLACKJACK; public class GivenCards { private final List cards; diff --git a/src/main/java/blackjack/domain/participant/Dealer.java b/src/main/java/blackjack/domain/participant/Dealer.java index 851f191..e0680a9 100644 --- a/src/main/java/blackjack/domain/participant/Dealer.java +++ b/src/main/java/blackjack/domain/participant/Dealer.java @@ -7,9 +7,10 @@ import blackjack.domain.state.finished.Stay; import blackjack.domain.state.running.Hit; +import static blackjack.domain.GameSystem.BLACKJACK; + public class Dealer extends Gamer { - public static final int BLACKJACK = 21; - public static final int HIT_THRESHOLD = 16; + private static final int HIT_THRESHOLD = 16; public Dealer(final String name, final GivenCards givenCards) { super(name); From 36211ae2080b1de78a88c95cc4cf4002d90ffc0b Mon Sep 17 00:00:00 2001 From: Beenie93 Date: Tue, 3 Aug 2021 21:21:00 +0900 Subject: [PATCH 59/80] =?UTF-8?q?refactor:=20FirstTwoCardsResponse=20->=20?= =?UTF-8?q?CardsResponse=EB=A1=9C=20=EC=9D=B4=EB=A6=84=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 --- .../blackjack/controller/BlackjackController.java | 6 +++--- ...rstTwoCardsResponse.java => CardsResponse.java} | 6 +++--- src/main/java/blackjack/view/OutputView.java | 8 ++++---- ...rdsResponseTest.java => CardsResponseTest.java} | 14 +++++++------- 4 files changed, 17 insertions(+), 17 deletions(-) rename src/main/java/blackjack/domain/dto/{FirstTwoCardsResponse.java => CardsResponse.java} (80%) rename src/test/java/blackjack/domain/dto/{FirstTwoCardsResponseTest.java => CardsResponseTest.java} (75%) diff --git a/src/main/java/blackjack/controller/BlackjackController.java b/src/main/java/blackjack/controller/BlackjackController.java index 8fa64b5..2f913a0 100644 --- a/src/main/java/blackjack/controller/BlackjackController.java +++ b/src/main/java/blackjack/controller/BlackjackController.java @@ -1,7 +1,7 @@ package blackjack.controller; import blackjack.domain.GameSystem; -import blackjack.domain.dto.FirstTwoCardsResponse; +import blackjack.domain.dto.CardsResponse; import blackjack.view.InputView; import blackjack.view.OutputView; @@ -20,8 +20,8 @@ public void run() { List playerNames = inputView.getPlayerNames(); GameSystem gameSystem = GameSystem.create(playerNames); outputView.printGameStart(gameSystem.getPlayerNames()); - FirstTwoCardsResponse firstTwoCardsResponse = new FirstTwoCardsResponse(gameSystem.getDealerCards(), gameSystem.getPlayerCards()); - outputView.printFirstTwoCards(gameSystem.getPlayerNames(), firstTwoCardsResponse); + CardsResponse cardsResponse = new CardsResponse(gameSystem.getDealerCards(), gameSystem.getPlayerCards()); + outputView.printFirstTwoCards(gameSystem.getPlayerNames(), cardsResponse); while (!gameSystem.allPlayersFinished()) { String currentPlayer = gameSystem.getCurrentPlayer(); diff --git a/src/main/java/blackjack/domain/dto/FirstTwoCardsResponse.java b/src/main/java/blackjack/domain/dto/CardsResponse.java similarity index 80% rename from src/main/java/blackjack/domain/dto/FirstTwoCardsResponse.java rename to src/main/java/blackjack/domain/dto/CardsResponse.java index 0f85aaf..36cbb8a 100644 --- a/src/main/java/blackjack/domain/dto/FirstTwoCardsResponse.java +++ b/src/main/java/blackjack/domain/dto/CardsResponse.java @@ -6,11 +6,11 @@ import java.util.List; import java.util.stream.Collectors; -public class FirstTwoCardsResponse { +public class CardsResponse { private final List dealerCards; private final List> playerCards; - public FirstTwoCardsResponse(final List dealerCards, final List> playerCards) { + public CardsResponse(final List dealerCards, final List> playerCards) { this.dealerCards = dealerCards; this.playerCards = new ArrayList<>(playerCards); } @@ -21,7 +21,7 @@ public List getDealerCards() { public List> getAllPlayerCards() { return playerCards.stream() - .map(FirstTwoCardsResponse::convertToCardResponse) + .map(CardsResponse::convertToCardResponse) .collect(Collectors.toList()); } diff --git a/src/main/java/blackjack/view/OutputView.java b/src/main/java/blackjack/view/OutputView.java index dc85daf..bf5f013 100644 --- a/src/main/java/blackjack/view/OutputView.java +++ b/src/main/java/blackjack/view/OutputView.java @@ -1,7 +1,7 @@ package blackjack.view; import blackjack.domain.dto.CardResponse; -import blackjack.domain.dto.FirstTwoCardsResponse; +import blackjack.domain.dto.CardsResponse; import java.util.List; import java.util.stream.Collectors; @@ -15,11 +15,11 @@ public void printGameStart(List playerNames) { System.out.printf("딜러와 %s에게 2장의 카드를 나누었습니다.%n", names); } - public void printFirstTwoCards(List playerNames, FirstTwoCardsResponse firstTwoCardsResponse) { - System.out.printf("딜러: %s%n", combine(firstTwoCardsResponse.getDealerCards().get(0))); + public void printFirstTwoCards(List playerNames, CardsResponse cardsResponse) { + System.out.printf("딜러: %s%n", combine(cardsResponse.getDealerCards().get(0))); IntStream.range(0, playerNames.size()) - .forEach(i -> System.out.printf("%s카드: %s%n", playerNames.get(i), playerCards(firstTwoCardsResponse.getAllPlayerCards().get(i)))); + .forEach(i -> System.out.printf("%s카드: %s%n", playerNames.get(i), playerCards(cardsResponse.getAllPlayerCards().get(i)))); } private String combine(final CardResponse cardResponse) { diff --git a/src/test/java/blackjack/domain/dto/FirstTwoCardsResponseTest.java b/src/test/java/blackjack/domain/dto/CardsResponseTest.java similarity index 75% rename from src/test/java/blackjack/domain/dto/FirstTwoCardsResponseTest.java rename to src/test/java/blackjack/domain/dto/CardsResponseTest.java index 6549acd..c515960 100644 --- a/src/test/java/blackjack/domain/dto/FirstTwoCardsResponseTest.java +++ b/src/test/java/blackjack/domain/dto/CardsResponseTest.java @@ -13,10 +13,10 @@ import static org.assertj.core.api.Assertions.assertThat; import static org.assertj.core.api.Assertions.tuple; -public class FirstTwoCardsResponseTest { +public class CardsResponseTest { @Test - @DisplayName("딜러 카드 2장을 반환한다.") + @DisplayName("딜러 카드를 반환한다.") void getDealerCards() { //given Score ace = Score.A; @@ -25,10 +25,10 @@ void getDealerCards() { Card card1 = new Card(ace, club); Card card2 = new Card(ace, diamond); List dealerCards = Arrays.asList(card1, card2); - FirstTwoCardsResponse firstTwoCardsResponse = new FirstTwoCardsResponse(dealerCards, Collections.emptyList()); + CardsResponse cardsResponse = new CardsResponse(dealerCards, Collections.emptyList()); //when - List dealerCard = firstTwoCardsResponse.getDealerCards(); + List dealerCard = cardsResponse.getDealerCards(); //then assertThat(dealerCard).hasSize(2) @@ -38,7 +38,7 @@ void getDealerCards() { } @Test - @DisplayName("모든 플레이어의 카드 2장을 반환한다.") + @DisplayName("모든 플레이어의 카드를 반환한다.") void getAllPlayerCards() { //given Score ace = Score.A; @@ -48,10 +48,10 @@ void getAllPlayerCards() { Card card2 = new Card(ace, diamond); List playerCards = Arrays.asList(card1, card2); List> allPlayerCards = Arrays.asList(playerCards, playerCards, playerCards); - FirstTwoCardsResponse firstTwoCardsResponse = new FirstTwoCardsResponse(Collections.emptyList(), allPlayerCards); + CardsResponse cardsResponse = new CardsResponse(Collections.emptyList(), allPlayerCards); //when - List> allPlayerCardsResponse = firstTwoCardsResponse.getAllPlayerCards(); + List> allPlayerCardsResponse = cardsResponse.getAllPlayerCards(); //then assertThat(allPlayerCardsResponse).hasSize(3); From 42f113aa65fb2d294c38ae1d38a366a708e1bc3f Mon Sep 17 00:00:00 2001 From: Beenie93 Date: Tue, 3 Aug 2021 22:34:57 +0900 Subject: [PATCH 60/80] =?UTF-8?q?feat:=20=EB=94=9C=EB=9F=AC,=20=ED=94=8C?= =?UTF-8?q?=EB=A0=88=EC=9D=B4=EC=96=B4=EB=93=A4=EC=9D=98=20=EC=B9=B4?= =?UTF-8?q?=EB=93=9C=20=EB=B0=98=ED=99=98=ED=95=98=EB=8A=94=20DealerAndPla?= =?UTF-8?q?yerCardsResponse=20=EC=83=9D=EC=84=B1?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../controller/BlackjackController.java | 5 +- .../java/blackjack/domain/GameSystem.java | 6 +- .../blackjack/domain/dto/CardsResponse.java | 23 ++----- .../dto/DealerAndPlayerCardsResponse.java | 27 ++++++++ src/main/java/blackjack/view/OutputView.java | 16 +++-- .../domain/dto/CardsResponseTest.java | 39 ++--------- .../dto/DealerAndPlayerCardsResponseTest.java | 65 +++++++++++++++++++ 7 files changed, 118 insertions(+), 63 deletions(-) create mode 100644 src/main/java/blackjack/domain/dto/DealerAndPlayerCardsResponse.java create mode 100644 src/test/java/blackjack/domain/dto/DealerAndPlayerCardsResponseTest.java diff --git a/src/main/java/blackjack/controller/BlackjackController.java b/src/main/java/blackjack/controller/BlackjackController.java index 2f913a0..b2fbe55 100644 --- a/src/main/java/blackjack/controller/BlackjackController.java +++ b/src/main/java/blackjack/controller/BlackjackController.java @@ -2,6 +2,7 @@ import blackjack.domain.GameSystem; import blackjack.domain.dto.CardsResponse; +import blackjack.domain.dto.DealerAndPlayerCardsResponse; import blackjack.view.InputView; import blackjack.view.OutputView; @@ -20,8 +21,8 @@ public void run() { List playerNames = inputView.getPlayerNames(); GameSystem gameSystem = GameSystem.create(playerNames); outputView.printGameStart(gameSystem.getPlayerNames()); - CardsResponse cardsResponse = new CardsResponse(gameSystem.getDealerCards(), gameSystem.getPlayerCards()); - outputView.printFirstTwoCards(gameSystem.getPlayerNames(), cardsResponse); + DealerAndPlayerCardsResponse dealerAndPlayerCardsResponse = new DealerAndPlayerCardsResponse(gameSystem.getDealerCards(), gameSystem.getPlayerCards()); + outputView.printFirstTwoCards(gameSystem.getPlayerNames(), dealerAndPlayerCardsResponse); while (!gameSystem.allPlayersFinished()) { String currentPlayer = gameSystem.getCurrentPlayer(); diff --git a/src/main/java/blackjack/domain/GameSystem.java b/src/main/java/blackjack/domain/GameSystem.java index bc9a0b6..be56257 100644 --- a/src/main/java/blackjack/domain/GameSystem.java +++ b/src/main/java/blackjack/domain/GameSystem.java @@ -62,14 +62,14 @@ public String getCurrentPlayer() { public void hit(final String answer, final String name) { validate(answer); - Person fetchedPlayer = findPlayerBy(name); + Person player = findPlayerBy(name); if (answer.equals(DECLINE_ANSWER)) { - fetchedPlayer.stay(); + player.stay(); return; } - fetchedPlayer.hit(Deck.getCard()); + player.hit(Deck.getCard()); } private void validate(final String answer) { diff --git a/src/main/java/blackjack/domain/dto/CardsResponse.java b/src/main/java/blackjack/domain/dto/CardsResponse.java index 36cbb8a..9a81684 100644 --- a/src/main/java/blackjack/domain/dto/CardsResponse.java +++ b/src/main/java/blackjack/domain/dto/CardsResponse.java @@ -2,31 +2,18 @@ import blackjack.domain.card.Card; -import java.util.ArrayList; import java.util.List; import java.util.stream.Collectors; public class CardsResponse { - private final List dealerCards; - private final List> playerCards; + private final List cards; - public CardsResponse(final List dealerCards, final List> playerCards) { - this.dealerCards = dealerCards; - this.playerCards = new ArrayList<>(playerCards); + public CardsResponse(final List cards) { + this.cards = cards; } - public List getDealerCards() { - return convertToCardResponse(dealerCards); - } - - public List> getAllPlayerCards() { - return playerCards.stream() - .map(CardsResponse::convertToCardResponse) - .collect(Collectors.toList()); - } - - private static List convertToCardResponse(final List givenCards) { - return givenCards.stream() + public List getCards() { + return cards.stream() .map(card -> new CardResponse(card.getDenomination(), card.getSuit())) .collect(Collectors.toList()); } diff --git a/src/main/java/blackjack/domain/dto/DealerAndPlayerCardsResponse.java b/src/main/java/blackjack/domain/dto/DealerAndPlayerCardsResponse.java new file mode 100644 index 0000000..e6525a3 --- /dev/null +++ b/src/main/java/blackjack/domain/dto/DealerAndPlayerCardsResponse.java @@ -0,0 +1,27 @@ +package blackjack.domain.dto; + +import blackjack.domain.card.Card; + +import java.util.ArrayList; +import java.util.List; +import java.util.stream.Collectors; + +public class DealerAndPlayerCardsResponse { + private final List dealerCards; + private final List> playerCards; + + public DealerAndPlayerCardsResponse(final List dealerCards, final List> playerCards) { + this.dealerCards = dealerCards; + this.playerCards = new ArrayList<>(playerCards); + } + + public CardsResponse getDealerCards() { + return new CardsResponse(dealerCards); + } + + public List getAllPlayerCards() { + return playerCards.stream() + .map(CardsResponse::new) + .collect(Collectors.toList()); + } +} diff --git a/src/main/java/blackjack/view/OutputView.java b/src/main/java/blackjack/view/OutputView.java index bf5f013..6c8cca0 100644 --- a/src/main/java/blackjack/view/OutputView.java +++ b/src/main/java/blackjack/view/OutputView.java @@ -2,6 +2,7 @@ import blackjack.domain.dto.CardResponse; import blackjack.domain.dto.CardsResponse; +import blackjack.domain.dto.DealerAndPlayerCardsResponse; import java.util.List; import java.util.stream.Collectors; @@ -12,22 +13,23 @@ public class OutputView { public void printGameStart(List playerNames) { String names = String.join(SEPARATOR, playerNames); - System.out.printf("딜러와 %s에게 2장의 카드를 나누었습니다.%n", names); + System.out.printf("%n딜러와 %s에게 2장의 카드를 나누었습니다.%n", names); } - public void printFirstTwoCards(List playerNames, CardsResponse cardsResponse) { - System.out.printf("딜러: %s%n", combine(cardsResponse.getDealerCards().get(0))); + public void printFirstTwoCards(List playerNames, DealerAndPlayerCardsResponse dealerAndPlayerCardsResponse) { + System.out.printf("딜러: %s%n", combine(dealerAndPlayerCardsResponse.getDealerCards().getCards().get(0))); IntStream.range(0, playerNames.size()) - .forEach(i -> System.out.printf("%s카드: %s%n", playerNames.get(i), playerCards(cardsResponse.getAllPlayerCards().get(i)))); + .forEach(i -> System.out.printf("%s카드: %s%n", playerNames.get(i), join(dealerAndPlayerCardsResponse.getAllPlayerCards().get(i)))); + System.out.println(); } private String combine(final CardResponse cardResponse) { return cardResponse.getDenomination() + cardResponse.getSuit(); } - private String playerCards(final List cardResponses) { - List fullCardNames = cardResponses.stream() + private String join(final CardsResponse cardResponses) { + List fullCardNames = cardResponses.getCards().stream() .map(this::combine) .collect(Collectors.toList()); @@ -35,6 +37,6 @@ private String playerCards(final List cardResponses) { } public void printDealerGetAnotherCard() { - System.out.printf("딜러는 16이하라 한장의 카드를 더 받았습니다.%n"); + System.out.printf("%n딜러는 16이하라 한장의 카드를 더 받았습니다."); } } diff --git a/src/test/java/blackjack/domain/dto/CardsResponseTest.java b/src/test/java/blackjack/domain/dto/CardsResponseTest.java index c515960..aa35a10 100644 --- a/src/test/java/blackjack/domain/dto/CardsResponseTest.java +++ b/src/test/java/blackjack/domain/dto/CardsResponseTest.java @@ -7,7 +7,6 @@ import org.junit.jupiter.api.Test; import java.util.Arrays; -import java.util.Collections; import java.util.List; import static org.assertj.core.api.Assertions.assertThat; @@ -16,50 +15,24 @@ public class CardsResponseTest { @Test - @DisplayName("딜러 카드를 반환한다.") - void getDealerCards() { + @DisplayName("모든 카드를 반환한다.") + void getCards() { //given Score ace = Score.A; Suit club = Suit.CLUB; Suit diamond = Suit.DIAMOND; Card card1 = new Card(ace, club); Card card2 = new Card(ace, diamond); - List dealerCards = Arrays.asList(card1, card2); - CardsResponse cardsResponse = new CardsResponse(dealerCards, Collections.emptyList()); + List playerCards = Arrays.asList(card1, card2); + CardsResponse cardsResponse = new CardsResponse(playerCards); //when - List dealerCard = cardsResponse.getDealerCards(); + List cards = cardsResponse.getCards(); //then - assertThat(dealerCard).hasSize(2) + assertThat(cards).hasSize(2) .extracting("denomination", "suit") .containsOnly(tuple(ace.getDenomination(), club.getSuit()), tuple(ace.getDenomination(), diamond.getSuit())); } - - @Test - @DisplayName("모든 플레이어의 카드를 반환한다.") - void getAllPlayerCards() { - //given - Score ace = Score.A; - Suit club = Suit.CLUB; - Suit diamond = Suit.DIAMOND; - Card card1 = new Card(ace, club); - Card card2 = new Card(ace, diamond); - List playerCards = Arrays.asList(card1, card2); - List> allPlayerCards = Arrays.asList(playerCards, playerCards, playerCards); - CardsResponse cardsResponse = new CardsResponse(Collections.emptyList(), allPlayerCards); - - //when - List> allPlayerCardsResponse = cardsResponse.getAllPlayerCards(); - - //then - assertThat(allPlayerCardsResponse).hasSize(3); - allPlayerCardsResponse.forEach( - playerCardsResponse -> assertThat(playerCardsResponse).hasSize(2) - .extracting("denomination", "suit") - .containsOnly(tuple(ace.getDenomination(), club.getSuit()), - tuple(ace.getDenomination(), diamond.getSuit())) - ); - } } diff --git a/src/test/java/blackjack/domain/dto/DealerAndPlayerCardsResponseTest.java b/src/test/java/blackjack/domain/dto/DealerAndPlayerCardsResponseTest.java new file mode 100644 index 0000000..45c64c2 --- /dev/null +++ b/src/test/java/blackjack/domain/dto/DealerAndPlayerCardsResponseTest.java @@ -0,0 +1,65 @@ +package blackjack.domain.dto; + +import blackjack.domain.card.Card; +import blackjack.domain.enums.Score; +import blackjack.domain.enums.Suit; +import org.junit.jupiter.api.DisplayName; +import org.junit.jupiter.api.Test; + +import java.util.Arrays; +import java.util.Collections; +import java.util.List; + +import static org.assertj.core.api.Assertions.assertThat; +import static org.assertj.core.api.Assertions.tuple; + +public class DealerAndPlayerCardsResponseTest { + + @Test + @DisplayName("딜러 카드를 반환한다.") + void getDealerCards() { + //given + Score ace = Score.A; + Suit club = Suit.CLUB; + Suit diamond = Suit.DIAMOND; + Card card1 = new Card(ace, club); + Card card2 = new Card(ace, diamond); + List dealerCards = Arrays.asList(card1, card2); + DealerAndPlayerCardsResponse dealerAndPlayerCardsResponse = new DealerAndPlayerCardsResponse(dealerCards, Collections.emptyList()); + + //when + CardsResponse dealerCard = dealerAndPlayerCardsResponse.getDealerCards(); + + //then + assertThat(dealerCard.getCards()).hasSize(2) + .extracting("denomination", "suit") + .containsOnly(tuple(ace.getDenomination(), club.getSuit()), + tuple(ace.getDenomination(), diamond.getSuit())); + } + + @Test + @DisplayName("모든 플레이어의 카드를 반환한다.") + void getAllPlayerCards() { + //given + Score ace = Score.A; + Suit club = Suit.CLUB; + Suit diamond = Suit.DIAMOND; + Card card1 = new Card(ace, club); + Card card2 = new Card(ace, diamond); + List playerCards = Arrays.asList(card1, card2); + List> allPlayerCards = Arrays.asList(playerCards, playerCards, playerCards); + DealerAndPlayerCardsResponse dealerAndPlayerCardsResponse = new DealerAndPlayerCardsResponse(Collections.emptyList(), allPlayerCards); + + //when + List allPlayerCardsResponse = dealerAndPlayerCardsResponse.getAllPlayerCards(); + + //then + assertThat(allPlayerCardsResponse).hasSize(3); + allPlayerCardsResponse.forEach( + playerCardsResponse -> assertThat(playerCardsResponse.getCards()).hasSize(2) + .extracting("denomination", "suit") + .containsOnly(tuple(ace.getDenomination(), club.getSuit()), + tuple(ace.getDenomination(), diamond.getSuit())) + ); + } +} From 2abc49456b76ff1aa30e0f9fc9b10fe54424d5ea Mon Sep 17 00:00:00 2001 From: Beenie93 Date: Tue, 3 Aug 2021 22:41:11 +0900 Subject: [PATCH 61/80] =?UTF-8?q?feat:=20=EC=B6=94=EA=B0=80=20=EC=9A=94?= =?UTF-8?q?=EC=B2=AD=20=ED=9B=84=20=ED=94=8C=EB=A0=88=EC=9D=B4=EC=96=B4?= =?UTF-8?q?=EC=9D=98=20=EC=B9=B4=EB=93=9C=EB=A5=BC=20=EC=B6=9C=EB=A0=A5?= =?UTF-8?q?=ED=95=98=EB=8A=94=20=EA=B8=B0=EB=8A=A5=20=EC=B6=94=EA=B0=80?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- README.md | 2 ++ .../controller/BlackjackController.java | 2 ++ src/main/java/blackjack/domain/GameSystem.java | 5 +++++ src/main/java/blackjack/view/OutputView.java | 10 ++++++++++ .../java/blackjack/domain/GameSystemTest.java | 18 ++++++++++++++++++ 5 files changed, 37 insertions(+) diff --git a/README.md b/README.md index 6772a32..6a4a44b 100644 --- a/README.md +++ b/README.md @@ -15,6 +15,8 @@ Stay : 플레이어가 추가 카드를 원하지 않음, 딜러는 카드 합 1 - [] 출력 - [x] 각 플레이어(딜러 포함)에게 2장의 카드 지급 알림 - [x] 각 플레이어(딜러 포함)가 가진 카드 + - [x] 추가 요청 후 플레이어의 카드 + - [x] 추가 카드가 발급되지 않았고 3장 이상일 경우 출력 X - [x] 딜러의 추가 카드 지급 여부 결과 - [] 각 플레이어(딜러 포함)의 총 카드의 합 - [] 최종 승패 결과 diff --git a/src/main/java/blackjack/controller/BlackjackController.java b/src/main/java/blackjack/controller/BlackjackController.java index b2fbe55..bc7eab4 100644 --- a/src/main/java/blackjack/controller/BlackjackController.java +++ b/src/main/java/blackjack/controller/BlackjackController.java @@ -27,7 +27,9 @@ public void run() { while (!gameSystem.allPlayersFinished()) { String currentPlayer = gameSystem.getCurrentPlayer(); String answer = inputView.getAnswerForAnotherCard(currentPlayer); + CardsResponse cardsResponse = new CardsResponse(gameSystem.getCards(currentPlayer)); gameSystem.hit(answer, currentPlayer); + outputView.printPlayerCards(currentPlayer, cardsResponse, answer); } while (!gameSystem.isDealerFinished()) { diff --git a/src/main/java/blackjack/domain/GameSystem.java b/src/main/java/blackjack/domain/GameSystem.java index be56257..6a2516d 100644 --- a/src/main/java/blackjack/domain/GameSystem.java +++ b/src/main/java/blackjack/domain/GameSystem.java @@ -92,4 +92,9 @@ public void hit() { public boolean isDealerFinished() { return dealer.isFinished(); } + + public List getCards(final String name) { + Person player = findPlayerBy(name); + return player.getCards().list(); + } } diff --git a/src/main/java/blackjack/view/OutputView.java b/src/main/java/blackjack/view/OutputView.java index 6c8cca0..fd2a9d7 100644 --- a/src/main/java/blackjack/view/OutputView.java +++ b/src/main/java/blackjack/view/OutputView.java @@ -10,6 +10,8 @@ public class OutputView { private static final String SEPARATOR = ", "; + private static final String DECLINE_ANSWER = "n"; + private static final int FIRST_TWO_CARDS = 2; public void printGameStart(List playerNames) { String names = String.join(SEPARATOR, playerNames); @@ -36,6 +38,14 @@ private String join(final CardsResponse cardResponses) { return String.join(SEPARATOR, fullCardNames); } + public void printPlayerCards(final String playerName, final CardsResponse cardsResponse, String answer) { + if (answer.equals(DECLINE_ANSWER) && cardsResponse.getCards().size() != FIRST_TWO_CARDS) { + return; + } + + System.out.printf("%s카드: %s%n", playerName, join(cardsResponse)); + } + public void printDealerGetAnotherCard() { System.out.printf("%n딜러는 16이하라 한장의 카드를 더 받았습니다."); } diff --git a/src/test/java/blackjack/domain/GameSystemTest.java b/src/test/java/blackjack/domain/GameSystemTest.java index f4c7139..f0e9ef8 100644 --- a/src/test/java/blackjack/domain/GameSystemTest.java +++ b/src/test/java/blackjack/domain/GameSystemTest.java @@ -157,4 +157,22 @@ void hit_for_dealer() { //then assertThat(gameSystem.getDealerCards()).hasSize(3); } + + @Test + @DisplayName("인자로 받은 플레이어의 카드를 반환한다.") + void getCards() { + //given + String name = "pobi"; + Card card1 = new Card(Score.A, Suit.HEART); + Card card2 = new Card(Score.A, Suit.CLUB); + Person player = new Player(name, new GivenCards(Arrays.asList(card1, card2))); + GameSystem gameSystem = new GameSystem(Collections.singletonList(player)); + + //when + List cards = gameSystem.getCards(name); + + //then + assertThat(cards).hasSize(2) + .containsOnly(card1, card2); + } } From 80be38b2c6ff7ffc0c346852248ceab37df0259f Mon Sep 17 00:00:00 2001 From: Beenie93 Date: Tue, 3 Aug 2021 23:32:36 +0900 Subject: [PATCH 62/80] =?UTF-8?q?feat:=20=EA=B0=81=20=ED=94=8C=EB=A0=88?= =?UTF-8?q?=EC=9D=B4=EC=96=B4(=EB=94=9C=EB=9F=AC=20=ED=8F=AC=ED=95=A8)?= =?UTF-8?q?=EC=9D=98=20=EC=B4=9D=20=EC=B9=B4=EB=93=9C=EC=9D=98=20=ED=95=A9?= =?UTF-8?q?=EC=9D=84=20=EB=B0=98=ED=99=98=ED=95=98=EB=8A=94=20=EA=B8=B0?= =?UTF-8?q?=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 | 4 +- .../controller/BlackjackController.java | 20 ++++++- .../java/blackjack/domain/GameSystem.java | 17 +++++- src/main/java/blackjack/view/OutputView.java | 9 ++- .../java/blackjack/domain/GameSystemTest.java | 60 ++++++++++++++++--- 5 files changed, 95 insertions(+), 15 deletions(-) diff --git a/README.md b/README.md index 6a4a44b..d568a34 100644 --- a/README.md +++ b/README.md @@ -18,7 +18,7 @@ Stay : 플레이어가 추가 카드를 원하지 않음, 딜러는 카드 합 1 - [x] 추가 요청 후 플레이어의 카드 - [x] 추가 카드가 발급되지 않았고 3장 이상일 경우 출력 X - [x] 딜러의 추가 카드 지급 여부 결과 - - [] 각 플레이어(딜러 포함)의 총 카드의 합 + - [x] 각 플레이어(딜러 포함)의 총 카드의 합 - [] 최종 승패 결과 - [x] 상태 (State) @@ -183,4 +183,6 @@ Stay : 플레이어가 추가 카드를 원하지 않음, 딜러는 카드 합 1 - [x] ERROR : y 또는 n이 아닌 응답을 전달받을 경우 - [x] 딜러 추가 카드 발급 - [x] 딜러 종료 여부 반환 + - [x] 딜러 점수 반환 + - [x] 플레이어들의 점수 반환 - [] 참여자 점수 비교 diff --git a/src/main/java/blackjack/controller/BlackjackController.java b/src/main/java/blackjack/controller/BlackjackController.java index bc7eab4..1289568 100644 --- a/src/main/java/blackjack/controller/BlackjackController.java +++ b/src/main/java/blackjack/controller/BlackjackController.java @@ -18,23 +18,39 @@ public BlackjackController(final InputView inputView, final OutputView outputVie } public void run() { - List playerNames = inputView.getPlayerNames(); + GameSystem gameSystem = setup(inputView.getPlayerNames()); + playerMode(gameSystem); + dealerMode(gameSystem); + printResult(gameSystem); + } + + private GameSystem setup(final List playerNames) { GameSystem gameSystem = GameSystem.create(playerNames); outputView.printGameStart(gameSystem.getPlayerNames()); DealerAndPlayerCardsResponse dealerAndPlayerCardsResponse = new DealerAndPlayerCardsResponse(gameSystem.getDealerCards(), gameSystem.getPlayerCards()); outputView.printFirstTwoCards(gameSystem.getPlayerNames(), dealerAndPlayerCardsResponse); + return gameSystem; + } + private void playerMode(final GameSystem gameSystem) { while (!gameSystem.allPlayersFinished()) { String currentPlayer = gameSystem.getCurrentPlayer(); String answer = inputView.getAnswerForAnotherCard(currentPlayer); - CardsResponse cardsResponse = new CardsResponse(gameSystem.getCards(currentPlayer)); gameSystem.hit(answer, currentPlayer); + CardsResponse cardsResponse = new CardsResponse(gameSystem.getCards(currentPlayer)); outputView.printPlayerCards(currentPlayer, cardsResponse, answer); } + } + private void dealerMode(final GameSystem gameSystem) { while (!gameSystem.isDealerFinished()) { outputView.printDealerGetAnotherCard(); gameSystem.hit(); } } + + private void printResult(final GameSystem gameSystem) { + DealerAndPlayerCardsResponse dealerAndPlayerCardsResponse = new DealerAndPlayerCardsResponse(gameSystem.getDealerCards(), gameSystem.getPlayerCards()); + outputView.printCardsAndScores(gameSystem.getPlayerNames(), dealerAndPlayerCardsResponse, gameSystem.getDealerScore(), gameSystem.getPlayerScores()); + } } diff --git a/src/main/java/blackjack/domain/GameSystem.java b/src/main/java/blackjack/domain/GameSystem.java index 6a2516d..f41bdc3 100644 --- a/src/main/java/blackjack/domain/GameSystem.java +++ b/src/main/java/blackjack/domain/GameSystem.java @@ -17,15 +17,16 @@ public class GameSystem { private static final String ACCEPT_ANSWER = "y"; private static final String DECLINE_ANSWER = "n"; - private final Person dealer = new Dealer(DEFAULT_DEALER_NAME, Deck.getTwoCards()); + private final Person dealer; private final List players; - protected GameSystem(final List players) { + protected GameSystem(final Person dealer, final List players) { + this.dealer = dealer; this.players = players; } public static GameSystem create(final List playerNames) { - return new GameSystem(playerNames.stream() + return new GameSystem(new Dealer(DEFAULT_DEALER_NAME, Deck.getTwoCards()), playerNames.stream() .map(name -> new Player(name, Deck.getTwoCards())) .collect(Collectors.toList())); } @@ -97,4 +98,14 @@ public List getCards(final String name) { Person player = findPlayerBy(name); return player.getCards().list(); } + + public int getDealerScore() { + return dealer.sum(); + } + + public List getPlayerScores() { + return players.stream() + .map(Person::sum) + .collect(Collectors.toList()); + } } diff --git a/src/main/java/blackjack/view/OutputView.java b/src/main/java/blackjack/view/OutputView.java index fd2a9d7..c83ac0a 100644 --- a/src/main/java/blackjack/view/OutputView.java +++ b/src/main/java/blackjack/view/OutputView.java @@ -47,6 +47,13 @@ public void printPlayerCards(final String playerName, final CardsResponse cardsR } public void printDealerGetAnotherCard() { - System.out.printf("%n딜러는 16이하라 한장의 카드를 더 받았습니다."); + System.out.printf("%n딜러는 16이하라 한장의 카드를 더 받았습니다.%n"); + } + + public void printCardsAndScores(final List playerNames, DealerAndPlayerCardsResponse dealerAndPlayerCardsResponse, int dealerScore, List playerScores) { + System.out.printf("%n딜러 카드: %s - 결과: %d%n", join(dealerAndPlayerCardsResponse.getDealerCards()), dealerScore); + + IntStream.range(0, playerNames.size()) + .forEach(i -> System.out.printf("%s카드: %s - 결과: %d%n", playerNames.get(i), join(dealerAndPlayerCardsResponse.getAllPlayerCards().get(i)), playerScores.get(i))); } } diff --git a/src/test/java/blackjack/domain/GameSystemTest.java b/src/test/java/blackjack/domain/GameSystemTest.java index f0e9ef8..683c89e 100644 --- a/src/test/java/blackjack/domain/GameSystemTest.java +++ b/src/test/java/blackjack/domain/GameSystemTest.java @@ -1,9 +1,11 @@ package blackjack.domain; import blackjack.domain.card.Card; +import blackjack.domain.card.Deck; import blackjack.domain.card.GivenCards; import blackjack.domain.enums.Score; import blackjack.domain.enums.Suit; +import blackjack.domain.participant.Dealer; import blackjack.domain.participant.Person; import blackjack.domain.participant.Player; import org.junit.jupiter.api.DisplayName; @@ -40,8 +42,9 @@ void getPlayerNames() { @Test @DisplayName("딜러의 모든 카드를 반환한다,") void getDealerCards() { - //given - GameSystem gameSystem = new GameSystem(Collections.emptyList()); + //give + Dealer dealer = new Dealer("딜러", Deck.getTwoCards()); + GameSystem gameSystem = new GameSystem(dealer, Collections.emptyList()); //when List dealerCards = gameSystem.getDealerCards(); @@ -78,7 +81,7 @@ void allPlayersFinished(String score1, String score2, boolean expected) { Card card4 = new Card(Score.valueOf(score2), Suit.CLUB); Person player1 = new Player("pobi", new GivenCards(Arrays.asList(card1, card2))); Person player2 = new Player("tobi", new GivenCards(Arrays.asList(card3, card4))); - GameSystem gameSystem = new GameSystem(Arrays.asList(player1, player2)); + GameSystem gameSystem = new GameSystem(new Dealer("딜러", Deck.getTwoCards()), Arrays.asList(player1, player2)); //when boolean isFinished = gameSystem.allPlayersFinished(); @@ -101,7 +104,7 @@ void getCurrentPlayer(String score1, String score2, String score3, String score4 Person player1 = new Player("player1", new GivenCards(Arrays.asList(card1, card2))); Person player2 = new Player("player2", new GivenCards(Arrays.asList(card3, card4))); Person player3 = new Player("player3", new GivenCards(Arrays.asList(card5, card6))); - GameSystem gameSystem = new GameSystem(Arrays.asList(player1, player2, player3)); + GameSystem gameSystem = new GameSystem(new Dealer("딜러", Deck.getTwoCards()), Arrays.asList(player1, player2, player3)); //when String player = gameSystem.getCurrentPlayer(); @@ -119,7 +122,7 @@ void hit(String answer, int expectedSize) { Card card1 = new Card(Score.A, Suit.HEART); Card card2 = new Card(Score.A, Suit.CLUB); Person player = new Player(name, new GivenCards(Arrays.asList(card1, card2))); - GameSystem gameSystem = new GameSystem(Collections.singletonList(player)); + GameSystem gameSystem = new GameSystem(new Dealer("딜러", Deck.getTwoCards()), Collections.singletonList(player)); //when gameSystem.hit(answer, name); @@ -137,7 +140,7 @@ void hit_with_invalid_answer(String answer) { Card card1 = new Card(Score.A, Suit.HEART); Card card2 = new Card(Score.A, Suit.CLUB); Person player = new Player(name, new GivenCards(Arrays.asList(card1, card2))); - GameSystem gameSystem = new GameSystem(Collections.singletonList(player)); + GameSystem gameSystem = new GameSystem(new Dealer("딜러", Deck.getTwoCards()), Collections.singletonList(player)); //when //then assertThatThrownBy(() -> gameSystem.hit(answer, name)) @@ -149,7 +152,10 @@ void hit_with_invalid_answer(String answer) { @DisplayName("딜러의 카드를 추가한다.") void hit_for_dealer() { //given - GameSystem gameSystem = new GameSystem(Collections.emptyList()); + Card card1 = new Card(Score.TWO, Suit.CLUB); + Card card2 = new Card(Score.TWO, Suit.HEART); + GivenCards givenCards = new GivenCards(Arrays.asList(card1, card2)); + GameSystem gameSystem = new GameSystem(new Dealer("딜러", givenCards), Collections.emptyList()); //when gameSystem.hit(); @@ -166,7 +172,7 @@ void getCards() { Card card1 = new Card(Score.A, Suit.HEART); Card card2 = new Card(Score.A, Suit.CLUB); Person player = new Player(name, new GivenCards(Arrays.asList(card1, card2))); - GameSystem gameSystem = new GameSystem(Collections.singletonList(player)); + GameSystem gameSystem = new GameSystem(new Dealer("딜러", Deck.getTwoCards()), Collections.singletonList(player)); //when List cards = gameSystem.getCards(name); @@ -175,4 +181,42 @@ void getCards() { assertThat(cards).hasSize(2) .containsOnly(card1, card2); } + + @Test + @DisplayName("딜러의 점수 합을 반환한다.") + void getDealerScore() { + //give + Card card1 = new Card(Score.A, Suit.CLUB); + Card card2 = new Card(Score.TEN, Suit.CLUB); + GivenCards givenCards = new GivenCards(Arrays.asList(card1, card2)); + Dealer dealer = new Dealer("딜러", givenCards); + GameSystem gameSystem = new GameSystem(dealer, Collections.emptyList()); + + //when + int dealerScore = gameSystem.getDealerScore(); + + //then + assertThat(dealerScore).isEqualTo(21); + } + + @ParameterizedTest + @CsvSource(value = {"A, TEN, A, NINE, 21, 20", "TEN, TEN, A, A, 20, 12"}) + @DisplayName("플레이어들의 점수를 반환한다.") + void getPlayerScores(String score1, String score2, String score3, String score4, int expectedSum1, int expectedSum2) { + //given + Card card1 = new Card(Score.valueOf(score1), Suit.CLUB); + Card card2 = new Card(Score.valueOf(score2), Suit.CLUB); + Card card3 = new Card(Score.valueOf(score3), Suit.HEART); + Card card4 = new Card(Score.valueOf(score4), Suit.HEART); + Person player1 = new Player("player1", new GivenCards(Arrays.asList(card1, card2))); + Person player2 = new Player("player2", new GivenCards(Arrays.asList(card3, card4))); + GameSystem gameSystem = new GameSystem(new Dealer("딜러", Deck.getTwoCards()), Arrays.asList(player1, player2)); + + //when + List playerScores = gameSystem.getPlayerScores(); + + //then + assertThat(playerScores).hasSize(2) + .containsOnly(expectedSum1, expectedSum2); + } } From 47eb909ebdf2cdf136997dafddb49da3e7902a17 Mon Sep 17 00:00:00 2001 From: Beenie93 Date: Wed, 4 Aug 2021 00:29:28 +0900 Subject: [PATCH 63/80] =?UTF-8?q?refactor:=20result=20->=20compare=20?= =?UTF-8?q?=EC=9D=B4=EB=A6=84=20=EB=B3=80=EA=B2=BD?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- src/main/java/blackjack/domain/state/State.java | 2 +- .../java/blackjack/domain/state/finished/Blackjack.java | 2 +- src/main/java/blackjack/domain/state/finished/Burst.java | 2 +- src/main/java/blackjack/domain/state/finished/Stay.java | 2 +- src/main/java/blackjack/domain/state/running/Running.java | 2 +- src/test/java/blackjack/domain/state/InitTest.java | 3 +-- .../blackjack/domain/state/finished/BlackjackTest.java | 2 +- .../java/blackjack/domain/state/finished/BurstTest.java | 2 +- .../blackjack/domain/state/finished/FinishedTest.java | 2 +- .../java/blackjack/domain/state/finished/StayTest.java | 8 ++++---- .../java/blackjack/domain/state/running/RunningTest.java | 2 +- 11 files changed, 14 insertions(+), 15 deletions(-) diff --git a/src/main/java/blackjack/domain/state/State.java b/src/main/java/blackjack/domain/state/State.java index 1923b12..f13f588 100644 --- a/src/main/java/blackjack/domain/state/State.java +++ b/src/main/java/blackjack/domain/state/State.java @@ -15,5 +15,5 @@ public interface State { GivenCards getCards(); - int result(GivenCards givenCards); + int compare(GivenCards givenCards); } diff --git a/src/main/java/blackjack/domain/state/finished/Blackjack.java b/src/main/java/blackjack/domain/state/finished/Blackjack.java index 4cdeddd..0330b14 100644 --- a/src/main/java/blackjack/domain/state/finished/Blackjack.java +++ b/src/main/java/blackjack/domain/state/finished/Blackjack.java @@ -10,7 +10,7 @@ public Blackjack(final GivenCards givenCards) { } @Override - public int result(final GivenCards competitorCards) { + public int compare(final GivenCards competitorCards) { return Result.WIN.getPoint(); } } diff --git a/src/main/java/blackjack/domain/state/finished/Burst.java b/src/main/java/blackjack/domain/state/finished/Burst.java index bac349a..762d569 100644 --- a/src/main/java/blackjack/domain/state/finished/Burst.java +++ b/src/main/java/blackjack/domain/state/finished/Burst.java @@ -10,7 +10,7 @@ public Burst(final GivenCards givenCards) { } @Override - public int result(final GivenCards competitorCards) { + public int compare(final GivenCards competitorCards) { return Result.LOSE.getPoint(); } } diff --git a/src/main/java/blackjack/domain/state/finished/Stay.java b/src/main/java/blackjack/domain/state/finished/Stay.java index c3f6b23..7f3b2d8 100644 --- a/src/main/java/blackjack/domain/state/finished/Stay.java +++ b/src/main/java/blackjack/domain/state/finished/Stay.java @@ -10,7 +10,7 @@ public Stay(final GivenCards givenCards) { } @Override - public int result(final GivenCards competitorCards) { + public int compare(final GivenCards competitorCards) { if (givenCards.isGreaterThan(competitorCards)) { return Result.WIN.getPoint(); } diff --git a/src/main/java/blackjack/domain/state/running/Running.java b/src/main/java/blackjack/domain/state/running/Running.java index b660ab9..52503cc 100644 --- a/src/main/java/blackjack/domain/state/running/Running.java +++ b/src/main/java/blackjack/domain/state/running/Running.java @@ -15,7 +15,7 @@ public boolean isFinished() { } @Override - public int result(GivenCards givenCards) { + public int compare(GivenCards givenCards) { throw new IllegalStateException("게임 진행 중에는 결과를 알 수 없습니다."); } } diff --git a/src/test/java/blackjack/domain/state/InitTest.java b/src/test/java/blackjack/domain/state/InitTest.java index 549f3b1..df2fcd0 100644 --- a/src/test/java/blackjack/domain/state/InitTest.java +++ b/src/test/java/blackjack/domain/state/InitTest.java @@ -43,13 +43,12 @@ void sum() { //then assertThat(sum).isEqualTo(20); - ; } private Init createInitState(GivenCards givenCards) { return new Init(givenCards) { @Override - public int result(GivenCards givenCards) { + public int compare(GivenCards givenCards) { return 0; } diff --git a/src/test/java/blackjack/domain/state/finished/BlackjackTest.java b/src/test/java/blackjack/domain/state/finished/BlackjackTest.java index 8c87900..99d45cd 100644 --- a/src/test/java/blackjack/domain/state/finished/BlackjackTest.java +++ b/src/test/java/blackjack/domain/state/finished/BlackjackTest.java @@ -26,7 +26,7 @@ void result() { GivenCards otherCards = new GivenCards(Collections.emptyList()); //when - int result = blackjack.result(otherCards); + int result = blackjack.compare(otherCards); //then assertThat(result).isEqualTo(1); diff --git a/src/test/java/blackjack/domain/state/finished/BurstTest.java b/src/test/java/blackjack/domain/state/finished/BurstTest.java index 9318ce8..d80c400 100644 --- a/src/test/java/blackjack/domain/state/finished/BurstTest.java +++ b/src/test/java/blackjack/domain/state/finished/BurstTest.java @@ -26,7 +26,7 @@ void result() { GivenCards otherCards = new GivenCards(Collections.emptyList()); //when - int result = burst.result(otherCards); + int result = burst.compare(otherCards); //then assertThat(result).isEqualTo(-1); diff --git a/src/test/java/blackjack/domain/state/finished/FinishedTest.java b/src/test/java/blackjack/domain/state/finished/FinishedTest.java index 01e5f10..e7eb78c 100644 --- a/src/test/java/blackjack/domain/state/finished/FinishedTest.java +++ b/src/test/java/blackjack/domain/state/finished/FinishedTest.java @@ -58,7 +58,7 @@ private State createFinishedState() { return new Finished(givenCards) { @Override - public int result(GivenCards competitorCards) { + public int compare(GivenCards competitorCards) { return 0; } diff --git a/src/test/java/blackjack/domain/state/finished/StayTest.java b/src/test/java/blackjack/domain/state/finished/StayTest.java index ccf75e1..3152c83 100644 --- a/src/test/java/blackjack/domain/state/finished/StayTest.java +++ b/src/test/java/blackjack/domain/state/finished/StayTest.java @@ -26,7 +26,7 @@ void result_win() { GivenCards otherCards = new GivenCards(Arrays.asList(card1, card3)); //when - int result = stay.result(otherCards); + int result = stay.compare(otherCards); //then assertThat(result).isEqualTo(1); @@ -44,7 +44,7 @@ void result_lose() { GivenCards otherCards = new GivenCards(Arrays.asList(card1, card3)); //when - int result = stay.result(otherCards); + int result = stay.compare(otherCards); //then assertThat(result).isEqualTo(-1); @@ -61,9 +61,9 @@ void result_draw() { GivenCards otherCards = new GivenCards(Arrays.asList(card1, card2)); //when - int result = stay.result(otherCards); + int result = stay.compare(otherCards); //then - assertThat(result).isEqualTo(0); + assertThat(result).isZero(); } } diff --git a/src/test/java/blackjack/domain/state/running/RunningTest.java b/src/test/java/blackjack/domain/state/running/RunningTest.java index 15ae57a..98125b4 100644 --- a/src/test/java/blackjack/domain/state/running/RunningTest.java +++ b/src/test/java/blackjack/domain/state/running/RunningTest.java @@ -35,7 +35,7 @@ void result() { State runningState = createRunningState(); //when //then - assertThatThrownBy(() -> runningState.result(new GivenCards(Collections.emptyList()))) + assertThatThrownBy(() -> runningState.compare(new GivenCards(Collections.emptyList()))) .hasMessage("게임 진행 중에는 결과를 알 수 없습니다."); } From 23a37d0db5a4bec8e51d1e115b01e68d1763e0c9 Mon Sep 17 00:00:00 2001 From: Beenie93 Date: Wed, 4 Aug 2021 01:01:17 +0900 Subject: [PATCH 64/80] =?UTF-8?q?feat:=20=EC=B4=9D=20=EC=B9=B4=EB=93=9C?= =?UTF-8?q?=EC=9D=98=20=ED=95=A9=EC=9D=B4=2021=EC=9D=B8=EC=A7=80=20?= =?UTF-8?q?=ED=99=95=EC=9D=B8=ED=95=98=EB=8A=94=20=ED=85=8C=EC=8A=A4?= =?UTF-8?q?=ED=8A=B8=20=EB=B0=8F=20=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 | 3 ++- .../blackjack/domain/card/GivenCards.java | 6 +++++- .../blackjack/domain/card/GivenCardsTest.java | 19 ++++++++++++++++++- 3 files changed, 25 insertions(+), 3 deletions(-) diff --git a/README.md b/README.md index d568a34..889d644 100644 --- a/README.md +++ b/README.md @@ -150,7 +150,8 @@ Stay : 플레이어가 추가 카드를 원하지 않음, 딜러는 카드 합 1 - 기능 - [x] Ace 포함하는지 확인 - - [x] 처음 두 장의 카드 합 21인지 확인 + - [x] 두 장의 카드 합 21인지 확인 + - [x] 총 카드의 합이 21인지 확인 - [x] 모든 카드 합이 21을 초과하는지 확인 - [x] 21을 기준으로 Ace 1 또는 11로 설정 - [x] 카드 목록 반환 diff --git a/src/main/java/blackjack/domain/card/GivenCards.java b/src/main/java/blackjack/domain/card/GivenCards.java index 5e907f0..ad61728 100644 --- a/src/main/java/blackjack/domain/card/GivenCards.java +++ b/src/main/java/blackjack/domain/card/GivenCards.java @@ -41,7 +41,7 @@ private int addAceBonus(final int sum) { } public boolean isBlackjack() { - return (cards.size() == TWO_CARDS) && (BLACKJACK == sum()); + return (cards.size() == TWO_CARDS) && isMaximumThreshold(); } public boolean isBurst() { @@ -67,4 +67,8 @@ public boolean isLessThan(final GivenCards otherCards) { public boolean isLessThanEqualTo(final int value) { return sum() <= value; } + + public boolean isMaximumThreshold() { + return sum() == BLACKJACK; + } } diff --git a/src/test/java/blackjack/domain/card/GivenCardsTest.java b/src/test/java/blackjack/domain/card/GivenCardsTest.java index 09d1083..e95070b 100644 --- a/src/test/java/blackjack/domain/card/GivenCardsTest.java +++ b/src/test/java/blackjack/domain/card/GivenCardsTest.java @@ -61,7 +61,7 @@ void sum_with_ace_value_11() { } @Test - @DisplayName("처음 카드 2장이 21일 경우, 참을 반환한다.") + @DisplayName("카드 2장이 21일 경우, 참을 반환한다.") void isBlackjack() { //given Card card1 = new Card(Score.TEN, Suit.CLUB); @@ -173,4 +173,21 @@ void isLessThanEqualTo(int sum, boolean expected) { //then assertThat(result).isEqualTo(expected); } + + @ParameterizedTest + @CsvSource(value = {"TEN, NINE, TWO, true", "TEN, EIGHT, TWO, false"}) + @DisplayName("카드의 합이 21일 경우, 참을 반환한다.") + void isMaximumThreshhold(String score1, String score2, String score3, boolean expected) { + //given + Card card1 = new Card(Score.valueOf(score1), Suit.CLUB); + Card card2 = new Card(Score.valueOf(score2), Suit.CLUB); + Card card3 = new Card(Score.valueOf(score3), Suit.CLUB); + GivenCards myCards = new GivenCards(Arrays.asList(card1, card2, card3)); + + //when + boolean result = myCards.isMaximumThreshold(); + + //then + assertThat(result).isEqualTo(expected); + } } From 27597107ec57bba270e71c11eadd6589036b0c41 Mon Sep 17 00:00:00 2001 From: Beenie93 Date: Wed, 4 Aug 2021 01:29:07 +0900 Subject: [PATCH 65/80] =?UTF-8?q?feat:=20=EC=B9=B4=EB=93=9C=20=EC=B6=94?= =?UTF-8?q?=EA=B0=80=20=EB=B0=9C=EA=B8=89=20=EC=8B=9C=20=20=EC=B9=B4?= =?UTF-8?q?=EB=93=9C=EC=9D=98=20=ED=95=A9=2021=EC=9D=BC=20=EA=B2=BD?= =?UTF-8?q?=EC=9A=B0=20Stay=20=EC=83=81=ED=83=9C=20=EB=B0=98=ED=99=98?= =?UTF-8?q?=ED=95=98=EB=8A=94=20=ED=85=8C=EC=8A=A4=ED=8A=B8=20=EB=B0=8F=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 | 6 ++++- .../blackjack/domain/state/running/Hit.java | 4 ++++ .../domain/participant/PlayerTest.java | 23 +++++++++++++++++-- .../domain/state/running/HitTest.java | 21 +++++++++++++++-- 4 files changed, 49 insertions(+), 5 deletions(-) diff --git a/README.md b/README.md index 889d644..0822f4f 100644 --- a/README.md +++ b/README.md @@ -44,7 +44,8 @@ Stay : 플레이어가 추가 카드를 원하지 않음, 딜러는 카드 합 1 - 기능 - [x] 추가 카드 발급 - [x] 카드의 합 21을 초과할 경우 Burst 상태 반환 - - [x] 카드의 합 21 이하일 경우 Hit 상태 반환 + - [x] 카드의 합 21 미만일 경우 Hit 상태 반환 + - [x] 카드의 합 21일 경우 Stay 상태 반환 - [x] Stay 상태 반환 - [x] 종료 상태 (Finished) @@ -95,6 +96,9 @@ Stay : 플레이어가 추가 카드를 원하지 않음, 딜러는 카드 합 1 - [x] 카드 2장의 합 21일 경우 Blackjack 상태 - [x] 카드 2장의 합 21 미만일 경우 Hit 상태 - [x] 카드 추가 발급 + - [x] 카드의 합 21 초과할 경우 Burst 상태 반환 + - [x] 카드의 합 21 미만일 경우 Hit 상태 반환 + - [x] 카드의 합 21일 경우 Stay 상태 반환 - [x] 딜러 (Dealer) - 속성 diff --git a/src/main/java/blackjack/domain/state/running/Hit.java b/src/main/java/blackjack/domain/state/running/Hit.java index f8f9c52..29d8eee 100644 --- a/src/main/java/blackjack/domain/state/running/Hit.java +++ b/src/main/java/blackjack/domain/state/running/Hit.java @@ -20,6 +20,10 @@ public State hit(final Card card) { return new Burst(givenCards); } + if (givenCards.isMaximumThreshold()) { + return new Stay(givenCards); + } + return new Hit(givenCards); } diff --git a/src/test/java/blackjack/domain/participant/PlayerTest.java b/src/test/java/blackjack/domain/participant/PlayerTest.java index 4571f15..3904736 100644 --- a/src/test/java/blackjack/domain/participant/PlayerTest.java +++ b/src/test/java/blackjack/domain/participant/PlayerTest.java @@ -6,6 +6,7 @@ import blackjack.domain.enums.Suit; import blackjack.domain.state.finished.Blackjack; import blackjack.domain.state.finished.Burst; +import blackjack.domain.state.finished.Stay; import blackjack.domain.state.running.Hit; import org.junit.jupiter.api.DisplayName; import org.junit.jupiter.api.Test; @@ -67,11 +68,11 @@ void hit_become_burst_state() { } @Test - @DisplayName("발급 받은 카드를 더한 합이 21 이하일 경우, Hit 상태가 된다.") + @DisplayName("발급 받은 카드를 더한 합이 21 미만일 경우, Hit 상태가 된다.") void hit_remain_hit_state() { //given Card card1 = new Card(Score.TEN, Suit.DIAMOND); - Card card2 = new Card(Score.NINE, Suit.DIAMOND); + Card card2 = new Card(Score.EIGHT, Suit.DIAMOND); GivenCards givenCards = new GivenCards(Arrays.asList(card1, card2)); Person player = new Player("pobi", givenCards); Card card3 = new Card(Score.TWO, Suit.HEART); @@ -83,4 +84,22 @@ void hit_remain_hit_state() { assertThat(player).extracting("state") .isInstanceOf(Hit.class); } + + @Test + @DisplayName("발급 받은 카드를 더한 합이 21일 경우, Stay 상태가 된다.") + void hit_become_stay_state() { + //given + Card card1 = new Card(Score.TEN, Suit.DIAMOND); + Card card2 = new Card(Score.NINE, Suit.DIAMOND); + GivenCards givenCards = new GivenCards(Arrays.asList(card1, card2)); + Person player = new Player("pobi", givenCards); + Card card3 = new Card(Score.TWO, Suit.HEART); + + //when + player.hit(card3); + + //then + assertThat(player).extracting("state") + .isInstanceOf(Stay.class); + } } diff --git a/src/test/java/blackjack/domain/state/running/HitTest.java b/src/test/java/blackjack/domain/state/running/HitTest.java index f489026..ec6d1f7 100644 --- a/src/test/java/blackjack/domain/state/running/HitTest.java +++ b/src/test/java/blackjack/domain/state/running/HitTest.java @@ -34,11 +34,11 @@ void hit_return_burst_state() { } @Test - @DisplayName("지급받은 카드 포함 합이 21을 초과하지 않을 경우, Hit 상태를 반환한다.") + @DisplayName("지급받은 카드 포함 합이 21 미만일 경우, Hit 상태를 반환한다.") void hit_return_itself() { //given Card card1 = new Card(Score.TEN, Suit.CLUB); - Card card2 = new Card(Score.TEN, Suit.HEART); + Card card2 = new Card(Score.NINE, Suit.HEART); GivenCards givenCards = new GivenCards(Arrays.asList(card1, card2)); State hit = new Hit(givenCards); Card newCard = new Card(Score.A, Suit.CLUB); @@ -50,6 +50,23 @@ void hit_return_itself() { assertThat(state).isInstanceOf(Hit.class); } + @Test + @DisplayName("지급받은 카드 포함 합이 21일 경우, Stay 상태를 반환한다.") + void hit_return_stay_state() { + //given + Card card1 = new Card(Score.TEN, Suit.CLUB); + Card card2 = new Card(Score.NINE, Suit.HEART); + GivenCards givenCards = new GivenCards(Arrays.asList(card1, card2)); + State hit = new Hit(givenCards); + Card newCard = new Card(Score.TWO, Suit.CLUB); + + //when + State state = hit.hit(newCard); + + //then + assertThat(state).isInstanceOf(Stay.class); + } + @Test @DisplayName("Stay 상태를 반환한다.") void stay() { From d6cc2ce9eceab1b01b7fe2a3016a9a0e8be4fcde Mon Sep 17 00:00:00 2001 From: Beenie93 Date: Wed, 4 Aug 2021 01:30:05 +0900 Subject: [PATCH 66/80] =?UTF-8?q?feat:=20Stay=20=EC=83=81=ED=83=9C?= =?UTF-8?q?=EC=97=90=EC=84=9C=20=ED=95=A9=20=EB=B9=84=EA=B5=90=EC=8B=9C=20?= =?UTF-8?q?=EC=9D=B8=EC=9E=90=EB=A1=9C=20=EB=B0=9B=EC=95=84=EC=98=A8=20?= =?UTF-8?q?=EC=B9=B4=EB=93=9C=EC=9D=98=20=ED=95=A9=EC=9D=B4=2021=EC=9D=84?= =?UTF-8?q?=20=EC=B4=88=EA=B3=BC=ED=95=A0=20=EA=B2=BD=EC=9A=B0=EC=97=90=20?= =?UTF-8?q?=EB=8C=80=ED=95=9C=20=ED=85=8C=EC=8A=A4=ED=8A=B8=20=EB=B0=8F=20?= =?UTF-8?q?=EC=A1=B0=EA=B1=B4=20=EC=B6=94=EA=B0=80?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- README.md | 4 +++- .../blackjack/domain/state/finished/Stay.java | 2 +- .../domain/state/finished/StayTest.java | 19 ++++++++++++------- 3 files changed, 16 insertions(+), 9 deletions(-) diff --git a/README.md b/README.md index 0822f4f..c6369bb 100644 --- a/README.md +++ b/README.md @@ -64,7 +64,9 @@ Stay : 플레이어가 추가 카드를 원하지 않음, 딜러는 카드 합 1 - [x] 카드 발급 거부 후 참여가 종료된 상태 (Stay) - 기능 - [x] 결과 반환 - - [x] 자신의 합이 더 클 경우 승리 결과 (1) 반환 + - [x] 승리 결과 (1) 반환 + - [x] 자신의 합이 더 클 경우 + - [x] 인자로 받아온 카드의 합이 21을 초과할 경우 - [x] 자신의 합이 더 작을 경우 패배 결과 (-1) 반환 - [x] 자신의 합과 같을 경우 무승부 결과 (0) 반환 diff --git a/src/main/java/blackjack/domain/state/finished/Stay.java b/src/main/java/blackjack/domain/state/finished/Stay.java index 7f3b2d8..d222e79 100644 --- a/src/main/java/blackjack/domain/state/finished/Stay.java +++ b/src/main/java/blackjack/domain/state/finished/Stay.java @@ -11,7 +11,7 @@ public Stay(final GivenCards givenCards) { @Override public int compare(final GivenCards competitorCards) { - if (givenCards.isGreaterThan(competitorCards)) { + if (competitorCards.isBurst() || givenCards.isGreaterThan(competitorCards)) { return Result.WIN.getPoint(); } diff --git a/src/test/java/blackjack/domain/state/finished/StayTest.java b/src/test/java/blackjack/domain/state/finished/StayTest.java index 3152c83..9bffdd4 100644 --- a/src/test/java/blackjack/domain/state/finished/StayTest.java +++ b/src/test/java/blackjack/domain/state/finished/StayTest.java @@ -7,6 +7,8 @@ import blackjack.domain.state.State; import org.junit.jupiter.api.DisplayName; import org.junit.jupiter.api.Test; +import org.junit.jupiter.params.ParameterizedTest; +import org.junit.jupiter.params.provider.CsvSource; import java.util.Arrays; @@ -14,16 +16,19 @@ class StayTest { - @Test - @DisplayName("다른 카드의 합보다 클 경우, 승리를 의미하는 1을 반환한다.") - void result_win() { + @ParameterizedTest + @CsvSource(value = {"FIVE, FOUR", "TEN, TWO"}) + @DisplayName("다른 카드의 합보다 크거나 다른 카드의 합이 21을 초과할 경우, 승리를 의미하는 1을 반환한다.") + void result_win(String score1, String score2) { //given - Card card1 = new Card(Score.EIGHT, Suit.CLUB); - Card card2 = new Card(Score.EIGHT, Suit.HEART); + Card card1 = new Card(Score.TEN, Suit.CLUB); + Card card2 = new Card(Score.TEN, Suit.HEART); GivenCards myCards = new GivenCards(Arrays.asList(card1, card2)); State stay = new Stay(myCards); - Card card3 = new Card(Score.SEVEN, Suit.DIAMOND); - GivenCards otherCards = new GivenCards(Arrays.asList(card1, card3)); + Card card3 = new Card(Score.TEN, Suit.DIAMOND); + Card card4 = new Card(Score.valueOf(score1), Suit.CLUB); + Card card5 = new Card(Score.valueOf(score2), Suit.CLUB); + GivenCards otherCards = new GivenCards(Arrays.asList(card3, card4, card5)); //when int result = stay.compare(otherCards); From e1451904641c17149991581ecd0dd516468af5be Mon Sep 17 00:00:00 2001 From: Beenie93 Date: Wed, 4 Aug 2021 01:44:03 +0900 Subject: [PATCH 67/80] =?UTF-8?q?feat:=20=ED=94=8C=EB=A0=88=EC=9D=B4?= =?UTF-8?q?=EC=96=B4=EB=93=A4=EC=9D=98=20=EC=8A=B9=ED=8C=A8=20=EA=B2=B0?= =?UTF-8?q?=EA=B3=BC=EB=A5=BC=20=EB=B0=98=ED=99=98=ED=95=98=EB=8A=94=20?= =?UTF-8?q?=ED=85=8C=EC=8A=A4=ED=8A=B8=20=EB=B0=8F=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 | 4 +-- .../java/blackjack/domain/GameSystem.java | 6 +++++ .../blackjack/domain/participant/Gamer.java | 5 ++++ .../blackjack/domain/participant/Person.java | 2 ++ .../java/blackjack/domain/GameSystemTest.java | 25 +++++++++++++++++++ 5 files changed, 40 insertions(+), 2 deletions(-) diff --git a/README.md b/README.md index c6369bb..894c0a2 100644 --- a/README.md +++ b/README.md @@ -175,7 +175,7 @@ Stay : 플레이어가 추가 카드를 원하지 않음, 딜러는 카드 합 1 - [x] 처음 2장 카드 반환 - [x] 추가 카드 반환 -- [] 게임 시스템 +- [x] 게임 시스템 - 속성 - [x] 딜러 - [x] 플레이어 목록 @@ -192,4 +192,4 @@ Stay : 플레이어가 추가 카드를 원하지 않음, 딜러는 카드 합 1 - [x] 딜러 종료 여부 반환 - [x] 딜러 점수 반환 - [x] 플레이어들의 점수 반환 - - [] 참여자 점수 비교 + - [x] 플레이어들의 승패 결과 반환 diff --git a/src/main/java/blackjack/domain/GameSystem.java b/src/main/java/blackjack/domain/GameSystem.java index f41bdc3..8584e45 100644 --- a/src/main/java/blackjack/domain/GameSystem.java +++ b/src/main/java/blackjack/domain/GameSystem.java @@ -108,4 +108,10 @@ public List getPlayerScores() { .map(Person::sum) .collect(Collectors.toList()); } + + public List getResults() { + return players.stream() + .map(player -> player.compare(dealer.getCards())) + .collect(Collectors.toList()); + } } diff --git a/src/main/java/blackjack/domain/participant/Gamer.java b/src/main/java/blackjack/domain/participant/Gamer.java index b4a5d54..80b0c8a 100644 --- a/src/main/java/blackjack/domain/participant/Gamer.java +++ b/src/main/java/blackjack/domain/participant/Gamer.java @@ -36,4 +36,9 @@ public void stay() { public boolean isFinished() { return state.isFinished(); } + + @Override + public int compare(GivenCards otherCards) { + return state.compare(otherCards); + } } diff --git a/src/main/java/blackjack/domain/participant/Person.java b/src/main/java/blackjack/domain/participant/Person.java index 7f5b9ce..17214e0 100644 --- a/src/main/java/blackjack/domain/participant/Person.java +++ b/src/main/java/blackjack/domain/participant/Person.java @@ -19,4 +19,6 @@ public interface Person { void stay(); boolean isFinished(); + + int compare(GivenCards otherCards); } diff --git a/src/test/java/blackjack/domain/GameSystemTest.java b/src/test/java/blackjack/domain/GameSystemTest.java index 683c89e..dac937f 100644 --- a/src/test/java/blackjack/domain/GameSystemTest.java +++ b/src/test/java/blackjack/domain/GameSystemTest.java @@ -219,4 +219,29 @@ void getPlayerScores(String score1, String score2, String score3, String score4, assertThat(playerScores).hasSize(2) .containsOnly(expectedSum1, expectedSum2); } + + @ParameterizedTest + @CsvSource(value = {"TEN, TEN, n, 1, 1", "TEN, TEN, y, 1, -1", "A, EIGHT, n, 1, 0"}) + @DisplayName("플레이어의 승패 결과를 반환한다.") + void getResults(String score1, String score2, String answer, int expectedResult1, int expectedResult2) { + //given + Card card1 = new Card(Score.A, Suit.CLUB); + Card card2 = new Card(Score.J, Suit.CLUB); + Card card3 = new Card(Score.valueOf(score1), Suit.HEART); + Card card4 = new Card(Score.valueOf(score2), Suit.HEART); + Card card5 = new Card(Score.A, Suit.DIAMOND); + Card card6 = new Card(Score.EIGHT, Suit.DIAMOND); + Person player1 = new Player("player1", new GivenCards(Arrays.asList(card1, card2))); + Person player2 = new Player("player2", new GivenCards(Arrays.asList(card3, card4))); + GivenCards dealerCards = new GivenCards(Arrays.asList(card5, card6)); + GameSystem gameSystem = new GameSystem(new Dealer("딜러", dealerCards), Arrays.asList(player1, player2)); + gameSystem.hit(answer, "player2"); + + //when + List results = gameSystem.getResults(); + + //then + assertThat(results).hasSize(2) + .containsOnly(expectedResult1, expectedResult2); + } } From c4340479112f9053150269226f07f8fb0fd6a391 Mon Sep 17 00:00:00 2001 From: Beenie93 Date: Wed, 4 Aug 2021 02:31:41 +0900 Subject: [PATCH 68/80] =?UTF-8?q?feat:=20=EC=B5=9C=EC=A2=85=20=EC=8A=B9?= =?UTF-8?q?=ED=8C=A8=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=EC=B6=94=EA=B0=80?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- README.md | 4 +-- .../controller/BlackjackController.java | 1 + src/main/java/blackjack/view/OutputView.java | 32 +++++++++++++++++++ 3 files changed, 35 insertions(+), 2 deletions(-) diff --git a/README.md b/README.md index 894c0a2..5f44b02 100644 --- a/README.md +++ b/README.md @@ -12,14 +12,14 @@ Stay : 플레이어가 추가 카드를 원하지 않음, 딜러는 카드 합 1 - [x] 플레이어 이름 - [x] 플레이어(딜러 제외) 추가 카드 요청 여부 -- [] 출력 +- [x] 출력 - [x] 각 플레이어(딜러 포함)에게 2장의 카드 지급 알림 - [x] 각 플레이어(딜러 포함)가 가진 카드 - [x] 추가 요청 후 플레이어의 카드 - [x] 추가 카드가 발급되지 않았고 3장 이상일 경우 출력 X - [x] 딜러의 추가 카드 지급 여부 결과 - [x] 각 플레이어(딜러 포함)의 총 카드의 합 - - [] 최종 승패 결과 + - [x] 최종 승패 결과 - [x] 상태 (State) - 기능 diff --git a/src/main/java/blackjack/controller/BlackjackController.java b/src/main/java/blackjack/controller/BlackjackController.java index 1289568..791973e 100644 --- a/src/main/java/blackjack/controller/BlackjackController.java +++ b/src/main/java/blackjack/controller/BlackjackController.java @@ -52,5 +52,6 @@ private void dealerMode(final GameSystem gameSystem) { private void printResult(final GameSystem gameSystem) { DealerAndPlayerCardsResponse dealerAndPlayerCardsResponse = new DealerAndPlayerCardsResponse(gameSystem.getDealerCards(), gameSystem.getPlayerCards()); outputView.printCardsAndScores(gameSystem.getPlayerNames(), dealerAndPlayerCardsResponse, gameSystem.getDealerScore(), gameSystem.getPlayerScores()); + outputView.printResults(gameSystem.getPlayerNames(), gameSystem.getResults()); } } diff --git a/src/main/java/blackjack/view/OutputView.java b/src/main/java/blackjack/view/OutputView.java index c83ac0a..edab733 100644 --- a/src/main/java/blackjack/view/OutputView.java +++ b/src/main/java/blackjack/view/OutputView.java @@ -4,7 +4,9 @@ import blackjack.domain.dto.CardsResponse; import blackjack.domain.dto.DealerAndPlayerCardsResponse; +import java.util.HashMap; import java.util.List; +import java.util.Map; import java.util.stream.Collectors; import java.util.stream.IntStream; @@ -12,6 +14,13 @@ public class OutputView { private static final String SEPARATOR = ", "; private static final String DECLINE_ANSWER = "n"; private static final int FIRST_TWO_CARDS = 2; + private static final Map gameResults = new HashMap<>(); + + static { + gameResults.put(1, "승"); + gameResults.put(0, "무"); + gameResults.put(-1, "패"); + } public void printGameStart(List playerNames) { String names = String.join(SEPARATOR, playerNames); @@ -55,5 +64,28 @@ public void printCardsAndScores(final List playerNames, DealerAndPlayerC IntStream.range(0, playerNames.size()) .forEach(i -> System.out.printf("%s카드: %s - 결과: %d%n", playerNames.get(i), join(dealerAndPlayerCardsResponse.getAllPlayerCards().get(i)), playerScores.get(i))); + System.out.println(); + } + + public void printResults(List playerNames, final List results) { + System.out.println("## 최종 승패"); + String dealerWin = convertToString(results, -1); + String dealerDraw = convertToString(results, 0); + String dealerLose = convertToString(results, 1); + System.out.printf("딜러: %s%n", String.join("", dealerWin, dealerDraw, dealerLose)); + IntStream.range(0, playerNames.size()) + .forEach(i -> System.out.printf("%s: %s%n", playerNames.get(i), gameResults.get(results.get(i)))); + } + + private String convertToString(List results, int result) { + long count = results.stream() + .filter(integer -> integer == result) + .count(); + + if (count == 0) { + return ""; + } + + return String.format("%d%s ", count, gameResults.get(-result)); } } From 035c28d30a90a10c0bc0517945aaea615365be8f Mon Sep 17 00:00:00 2001 From: Beenie93 Date: Wed, 4 Aug 2021 03:41:27 +0900 Subject: [PATCH 69/80] =?UTF-8?q?feat:=20GameSystem=EC=9D=98=20=ED=94=8C?= =?UTF-8?q?=EB=A0=88=EC=9D=B4=EC=96=B4=20=EA=B4=80=EB=A0=A8=20=EA=B8=B0?= =?UTF-8?q?=EB=8A=A5=20Players=EB=A1=9C=20=EC=9C=84=EC=9E=84?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../java/blackjack/domain/GameSystem.java | 48 ++--- .../blackjack/domain/participant/Player.java | 10 + .../blackjack/domain/participant/Players.java | 73 +++++++ .../java/blackjack/domain/GameSystemTest.java | 35 ++-- .../domain/participant/PlayersTest.java | 185 ++++++++++++++++++ 5 files changed, 304 insertions(+), 47 deletions(-) create mode 100644 src/main/java/blackjack/domain/participant/Players.java create mode 100644 src/test/java/blackjack/domain/participant/PlayersTest.java diff --git a/src/main/java/blackjack/domain/GameSystem.java b/src/main/java/blackjack/domain/GameSystem.java index 8584e45..d93c697 100644 --- a/src/main/java/blackjack/domain/GameSystem.java +++ b/src/main/java/blackjack/domain/GameSystem.java @@ -2,10 +2,10 @@ import blackjack.domain.card.Card; import blackjack.domain.card.Deck; -import blackjack.domain.card.GivenCards; import blackjack.domain.participant.Dealer; import blackjack.domain.participant.Person; import blackjack.domain.participant.Player; +import blackjack.domain.participant.Players; import java.util.Collections; import java.util.List; @@ -18,23 +18,21 @@ public class GameSystem { private static final String DECLINE_ANSWER = "n"; private final Person dealer; - private final List players; + private final Players players; - protected GameSystem(final Person dealer, final List players) { + protected GameSystem(final Person dealer, final Players players) { this.dealer = dealer; this.players = players; } public static GameSystem create(final List playerNames) { - return new GameSystem(new Dealer(DEFAULT_DEALER_NAME, Deck.getTwoCards()), playerNames.stream() + return new GameSystem(new Dealer(DEFAULT_DEALER_NAME, Deck.getTwoCards()), new Players(playerNames.stream() .map(name -> new Player(name, Deck.getTwoCards())) - .collect(Collectors.toList())); + .collect(Collectors.toList()))); } public List getPlayerNames() { - return Collections.unmodifiableList(players.stream() - .map(Person::getName) - .collect(Collectors.toList())); + return players.getPlayerNames(); } public List getDealerCards() { @@ -42,28 +40,20 @@ public List getDealerCards() { } public List> getPlayerCards() { - return Collections.unmodifiableList(players.stream() - .map(Person::getCards) - .map(GivenCards::list) - .collect(Collectors.toList())); + return players.getPlayerCards(); } public boolean allPlayersFinished() { - return players.stream() - .allMatch(Person::isFinished); + return players.allPlayersFinished(); } public String getCurrentPlayer() { - return players.stream() - .filter(player -> !player.isFinished()) - .map(Person::getName) - .findFirst() - .orElseThrow(IllegalStateException::new); + return players.getCurrentPlayer(); } public void hit(final String answer, final String name) { validate(answer); - Person player = findPlayerBy(name); + Person player = players.findPlayerBy(name); if (answer.equals(DECLINE_ANSWER)) { player.stay(); @@ -79,13 +69,6 @@ private void validate(final String answer) { } } - private Person findPlayerBy(final String name) { - return players.stream() - .filter(player -> player.getName().equals(name)) - .findFirst() - .orElseThrow(IllegalArgumentException::new); - } - public void hit() { dealer.hit(Deck.getCard()); } @@ -95,8 +78,7 @@ public boolean isDealerFinished() { } public List getCards(final String name) { - Person player = findPlayerBy(name); - return player.getCards().list(); + return players.getCards(name); } public int getDealerScore() { @@ -104,14 +86,10 @@ public int getDealerScore() { } public List getPlayerScores() { - return players.stream() - .map(Person::sum) - .collect(Collectors.toList()); + return players.getPlayerScores(); } public List getResults() { - return players.stream() - .map(player -> player.compare(dealer.getCards())) - .collect(Collectors.toList()); + return players.getResults(dealer.getCards()); } } diff --git a/src/main/java/blackjack/domain/participant/Player.java b/src/main/java/blackjack/domain/participant/Player.java index f4cebb3..ba7525c 100644 --- a/src/main/java/blackjack/domain/participant/Player.java +++ b/src/main/java/blackjack/domain/participant/Player.java @@ -4,6 +4,8 @@ import blackjack.domain.card.GivenCards; import blackjack.domain.state.State; import blackjack.domain.state.finished.Blackjack; +import blackjack.domain.state.finished.Burst; +import blackjack.domain.state.finished.Stay; import blackjack.domain.state.running.Hit; public class Player extends Gamer { @@ -19,6 +21,14 @@ public State injectStateBy(final GivenCards cards) { return new Blackjack(cards); } + if (cards.isBurst()) { + return new Burst(cards); + } + + if (cards.isMaximumThreshold()) { + return new Stay(cards); + } + return new Hit(cards); } diff --git a/src/main/java/blackjack/domain/participant/Players.java b/src/main/java/blackjack/domain/participant/Players.java new file mode 100644 index 0000000..69e2ef8 --- /dev/null +++ b/src/main/java/blackjack/domain/participant/Players.java @@ -0,0 +1,73 @@ +package blackjack.domain.participant; + +import blackjack.domain.card.Card; +import blackjack.domain.card.GivenCards; + +import java.util.ArrayList; +import java.util.Collections; +import java.util.LinkedHashMap; +import java.util.List; +import java.util.Map; +import java.util.stream.Collectors; + +public class Players { + private final Map players = new LinkedHashMap<>(); + + public Players(final List players) { + converToMap(players); + } + + private void converToMap(List players) { + players.forEach(player -> this.players.put(player.getName(), player)); + } + + public List getPlayerNames() { + return Collections.unmodifiableList(new ArrayList<>(players.keySet())); + } + + public List> getPlayerCards() { + return Collections.unmodifiableList(players.values() + .stream() + .map(Person::getCards) + .map(GivenCards::list) + .collect(Collectors.toList())); + } + + public boolean allPlayersFinished() { + return players.values() + .stream() + .allMatch(Person::isFinished); + } + + public String getCurrentPlayer() { + return players.values() + .stream() + .filter(player -> !player.isFinished()) + .map(Person::getName) + .findFirst() + .orElseThrow(IllegalStateException::new); + } + + public Person findPlayerBy(final String name) { + return players.get(name); + } + + public List getCards(final String name) { + Person player = findPlayerBy(name); + return player.getCards().list(); + } + + public List getPlayerScores() { + return players.values() + .stream() + .map(Person::sum) + .collect(Collectors.toList()); + } + + public List getResults(GivenCards dealerCards) { + return players.values() + .stream() + .map(player -> player.compare(dealerCards)) + .collect(Collectors.toList()); + } +} diff --git a/src/test/java/blackjack/domain/GameSystemTest.java b/src/test/java/blackjack/domain/GameSystemTest.java index dac937f..543a6a4 100644 --- a/src/test/java/blackjack/domain/GameSystemTest.java +++ b/src/test/java/blackjack/domain/GameSystemTest.java @@ -8,6 +8,7 @@ import blackjack.domain.participant.Dealer; import blackjack.domain.participant.Person; import blackjack.domain.participant.Player; +import blackjack.domain.participant.Players; import org.junit.jupiter.api.DisplayName; import org.junit.jupiter.api.Test; import org.junit.jupiter.params.ParameterizedTest; @@ -44,7 +45,8 @@ void getPlayerNames() { void getDealerCards() { //give Dealer dealer = new Dealer("딜러", Deck.getTwoCards()); - GameSystem gameSystem = new GameSystem(dealer, Collections.emptyList()); + Players players = new Players(Collections.emptyList()); + GameSystem gameSystem = new GameSystem(dealer, players); //when List dealerCards = gameSystem.getDealerCards(); @@ -81,7 +83,8 @@ void allPlayersFinished(String score1, String score2, boolean expected) { Card card4 = new Card(Score.valueOf(score2), Suit.CLUB); Person player1 = new Player("pobi", new GivenCards(Arrays.asList(card1, card2))); Person player2 = new Player("tobi", new GivenCards(Arrays.asList(card3, card4))); - GameSystem gameSystem = new GameSystem(new Dealer("딜러", Deck.getTwoCards()), Arrays.asList(player1, player2)); + Players players = new Players(Arrays.asList(player1, player2)); + GameSystem gameSystem = new GameSystem(new Dealer("딜러", new GivenCards(Collections.emptyList())), players); //when boolean isFinished = gameSystem.allPlayersFinished(); @@ -104,7 +107,8 @@ void getCurrentPlayer(String score1, String score2, String score3, String score4 Person player1 = new Player("player1", new GivenCards(Arrays.asList(card1, card2))); Person player2 = new Player("player2", new GivenCards(Arrays.asList(card3, card4))); Person player3 = new Player("player3", new GivenCards(Arrays.asList(card5, card6))); - GameSystem gameSystem = new GameSystem(new Dealer("딜러", Deck.getTwoCards()), Arrays.asList(player1, player2, player3)); + Players players = new Players(Arrays.asList(player1, player2, player3)); + GameSystem gameSystem = new GameSystem(new Dealer("딜러", new GivenCards(Collections.emptyList())), players); //when String player = gameSystem.getCurrentPlayer(); @@ -122,7 +126,8 @@ void hit(String answer, int expectedSize) { Card card1 = new Card(Score.A, Suit.HEART); Card card2 = new Card(Score.A, Suit.CLUB); Person player = new Player(name, new GivenCards(Arrays.asList(card1, card2))); - GameSystem gameSystem = new GameSystem(new Dealer("딜러", Deck.getTwoCards()), Collections.singletonList(player)); + Players players = new Players(Collections.singletonList(player)); + GameSystem gameSystem = new GameSystem(new Dealer("딜러", new GivenCards(Collections.emptyList())), players); //when gameSystem.hit(answer, name); @@ -140,7 +145,8 @@ void hit_with_invalid_answer(String answer) { Card card1 = new Card(Score.A, Suit.HEART); Card card2 = new Card(Score.A, Suit.CLUB); Person player = new Player(name, new GivenCards(Arrays.asList(card1, card2))); - GameSystem gameSystem = new GameSystem(new Dealer("딜러", Deck.getTwoCards()), Collections.singletonList(player)); + Players players = new Players(Collections.singletonList(player)); + GameSystem gameSystem = new GameSystem(new Dealer("딜러", new GivenCards(Collections.emptyList())), players); //when //then assertThatThrownBy(() -> gameSystem.hit(answer, name)) @@ -155,7 +161,8 @@ void hit_for_dealer() { Card card1 = new Card(Score.TWO, Suit.CLUB); Card card2 = new Card(Score.TWO, Suit.HEART); GivenCards givenCards = new GivenCards(Arrays.asList(card1, card2)); - GameSystem gameSystem = new GameSystem(new Dealer("딜러", givenCards), Collections.emptyList()); + Players players = new Players(Collections.emptyList()); + GameSystem gameSystem = new GameSystem(new Dealer("딜러", givenCards), players); //when gameSystem.hit(); @@ -172,7 +179,8 @@ void getCards() { Card card1 = new Card(Score.A, Suit.HEART); Card card2 = new Card(Score.A, Suit.CLUB); Person player = new Player(name, new GivenCards(Arrays.asList(card1, card2))); - GameSystem gameSystem = new GameSystem(new Dealer("딜러", Deck.getTwoCards()), Collections.singletonList(player)); + Players players = new Players(Collections.singletonList(player)); + GameSystem gameSystem = new GameSystem(new Dealer("딜러", new GivenCards(Collections.emptyList())), players); //when List cards = gameSystem.getCards(name); @@ -190,7 +198,8 @@ void getDealerScore() { Card card2 = new Card(Score.TEN, Suit.CLUB); GivenCards givenCards = new GivenCards(Arrays.asList(card1, card2)); Dealer dealer = new Dealer("딜러", givenCards); - GameSystem gameSystem = new GameSystem(dealer, Collections.emptyList()); + Players players = new Players(Collections.emptyList()); + GameSystem gameSystem = new GameSystem(dealer, players); //when int dealerScore = gameSystem.getDealerScore(); @@ -210,7 +219,8 @@ void getPlayerScores(String score1, String score2, String score3, String score4, Card card4 = new Card(Score.valueOf(score4), Suit.HEART); Person player1 = new Player("player1", new GivenCards(Arrays.asList(card1, card2))); Person player2 = new Player("player2", new GivenCards(Arrays.asList(card3, card4))); - GameSystem gameSystem = new GameSystem(new Dealer("딜러", Deck.getTwoCards()), Arrays.asList(player1, player2)); + Players players = new Players(Arrays.asList(player1, player2)); + GameSystem gameSystem = new GameSystem(new Dealer("딜러", new GivenCards(Collections.emptyList())), players); //when List playerScores = gameSystem.getPlayerScores(); @@ -227,14 +237,15 @@ void getResults(String score1, String score2, String answer, int expectedResult1 //given Card card1 = new Card(Score.A, Suit.CLUB); Card card2 = new Card(Score.J, Suit.CLUB); + Person player1 = new Player("player1", new GivenCards(Arrays.asList(card1, card2))); Card card3 = new Card(Score.valueOf(score1), Suit.HEART); Card card4 = new Card(Score.valueOf(score2), Suit.HEART); + Person player2 = new Player("player2", new GivenCards(Arrays.asList(card3, card4))); Card card5 = new Card(Score.A, Suit.DIAMOND); Card card6 = new Card(Score.EIGHT, Suit.DIAMOND); - Person player1 = new Player("player1", new GivenCards(Arrays.asList(card1, card2))); - Person player2 = new Player("player2", new GivenCards(Arrays.asList(card3, card4))); GivenCards dealerCards = new GivenCards(Arrays.asList(card5, card6)); - GameSystem gameSystem = new GameSystem(new Dealer("딜러", dealerCards), Arrays.asList(player1, player2)); + Players players = new Players(Arrays.asList(player1, player2)); + GameSystem gameSystem = new GameSystem(new Dealer("딜러", dealerCards), players); gameSystem.hit(answer, "player2"); //when diff --git a/src/test/java/blackjack/domain/participant/PlayersTest.java b/src/test/java/blackjack/domain/participant/PlayersTest.java new file mode 100644 index 0000000..5aa5280 --- /dev/null +++ b/src/test/java/blackjack/domain/participant/PlayersTest.java @@ -0,0 +1,185 @@ +package blackjack.domain.participant; + +import blackjack.domain.card.Card; +import blackjack.domain.card.Deck; +import blackjack.domain.card.GivenCards; +import blackjack.domain.enums.Score; +import blackjack.domain.enums.Suit; +import org.junit.jupiter.api.DisplayName; +import org.junit.jupiter.api.Test; +import org.junit.jupiter.params.ParameterizedTest; +import org.junit.jupiter.params.provider.CsvSource; + +import java.util.Arrays; +import java.util.Collections; +import java.util.List; + +import static org.assertj.core.api.Assertions.assertThat; + +class PlayersTest { + + @Test + @DisplayName("플레이어의 이름을 반환한다.") + void getPlayerNames() { + //given + String name1 = "pobi"; + Player player1 = new Player(name1, Deck.getTwoCards()); + String name2 = "tobi"; + Player player2 = new Player(name2, Deck.getTwoCards()); + Players players = new Players(Arrays.asList(player1, player2)); + + //when + List playerNames = players.getPlayerNames(); + + //then + assertThat(playerNames).hasSize(2) + .containsOnly(name1, name2); + } + + @Test + @DisplayName("플레이어들의 모든 카드를 반환한다.") + void getPlayerCards() { + //given + String name1 = "pobi"; + Player player1 = new Player(name1, Deck.getTwoCards()); + String name2 = "tobi"; + Player player2 = new Player(name2, Deck.getTwoCards()); + Players players = new Players(Arrays.asList(player1, player2)); + + //when + List> allPlayerCards = players.getPlayerCards(); + + //then + assertThat(allPlayerCards).hasSize(2); + allPlayerCards.forEach(playerCards -> assertThat(playerCards).hasSize(2)); + } + + @ParameterizedTest + @CsvSource(value = {"A, TEN, true", "TEN, TEN, false"}) + @DisplayName("모든 플레이어가 종료하였는지 여부를 반환한다.") + void allPlayersFinished(String score1, String score2, boolean expected) { + //given + Card card1 = new Card(Score.A, Suit.DIAMOND); + Card card2 = new Card(Score.J, Suit.DIAMOND); + Person player1 = new Player("pobi", new GivenCards(Arrays.asList(card1, card2))); + Card card3 = new Card(Score.valueOf(score1), Suit.CLUB); + Card card4 = new Card(Score.valueOf(score2), Suit.CLUB); + Person player2 = new Player("tobi", new GivenCards(Arrays.asList(card3, card4))); + Players players = new Players(Arrays.asList(player1, player2)); + + //when + boolean isFinished = players.allPlayersFinished(); + + //then + assertThat(isFinished).isEqualTo(expected); + } + + @ParameterizedTest + @CsvSource(value = {"A, TEN, A, NINE, player3", "TEN, TEN, TEN, TEN, player2"}) + @DisplayName("참여 종료상태가 아닌 플레이어 중 먼저 입력 받았던 플레이어의 이름을 반환한다.") + void getCurrentPlayer(String score1, String score2, String score3, String score4, String expectedPlayer) { + //given + Card card1 = new Card(Score.A, Suit.DIAMOND); + Card card2 = new Card(Score.J, Suit.DIAMOND); + Person player1 = new Player("player1", new GivenCards(Arrays.asList(card1, card2))); + Card card3 = new Card(Score.valueOf(score1), Suit.CLUB); + Card card4 = new Card(Score.valueOf(score2), Suit.CLUB); + Person player2 = new Player("player2", new GivenCards(Arrays.asList(card3, card4))); + Card card5 = new Card(Score.valueOf(score3), Suit.HEART); + Card card6 = new Card(Score.valueOf(score4), Suit.HEART); + Person player3 = new Player("player3", new GivenCards(Arrays.asList(card5, card6))); + Players players = new Players(Arrays.asList(player1, player2, player3)); + + //when + String player = players.getCurrentPlayer(); + + //then + assertThat(player).isEqualTo(expectedPlayer); + } + + @Test + @DisplayName("인자로 받은 플레이어의 카드를 반환한다.") + void getCards() { + //given + String name = "pobi"; + Card card1 = new Card(Score.A, Suit.HEART); + Card card2 = new Card(Score.A, Suit.CLUB); + Person player = new Player(name, new GivenCards(Arrays.asList(card1, card2))); + Players players = new Players(Arrays.asList(player)); + + //when + List cards = players.getCards(name); + + //then + assertThat(cards).hasSize(2) + .containsOnly(card1, card2); + } + + @ParameterizedTest + @CsvSource(value = {"A, TEN, A, NINE, 21, 20", "TEN, TEN, A, A, 20, 12"}) + @DisplayName("플레이어들의 점수를 반환한다.") + void getPlayerScores(String score1, String score2, String score3, String score4, int expectedSum1, int expectedSum2) { + //given + Card card1 = new Card(Score.valueOf(score1), Suit.CLUB); + Card card2 = new Card(Score.valueOf(score2), Suit.CLUB); + Person player1 = new Player("player1", new GivenCards(Arrays.asList(card1, card2))); + Card card3 = new Card(Score.valueOf(score3), Suit.HEART); + Card card4 = new Card(Score.valueOf(score4), Suit.HEART); + Person player2 = new Player("player2", new GivenCards(Arrays.asList(card3, card4))); + Players players = new Players(Arrays.asList(player1, player2)); + + //when + List playerScores = players.getPlayerScores(); + + //then + assertThat(playerScores).hasSize(2) + .containsOnly(expectedSum1, expectedSum2); + } + + @ParameterizedTest + @CsvSource(value = {"TEN, FIVE, SIX, 1, 1", "TEN, TEN, TWO, 1, -1"}) + @DisplayName("자신의 카드의 합이 크거나 블랙잭일 경우 1, 작을 경우 -1을 반환한다.") + void getResults_with_win_and_lose(String score1, String score2, String score3, int expectedResult1, int expectedResult2) { + //given + Card card1 = new Card(Score.A, Suit.CLUB); + Card card2 = new Card(Score.J, Suit.CLUB); + Person player1 = new Player("player1", new GivenCards(Arrays.asList(card1, card2))); + Card card3 = new Card(Score.valueOf(score1), Suit.HEART); + Card card4 = new Card(Score.valueOf(score2), Suit.HEART); + Card card5 = new Card(Score.valueOf(score3), Suit.HEART); + Person player2 = new Player("player2", new GivenCards(Arrays.asList(card3, card4, card5))); + Card card6 = new Card(Score.A, Suit.DIAMOND); + Card card7 = new Card(Score.NINE, Suit.DIAMOND); + GivenCards dealerCards = new GivenCards(Arrays.asList(card6, card7)); + Players players = new Players(Arrays.asList(player1, player2)); + + //when + List results = players.getResults(dealerCards); + + //then + assertThat(results).hasSize(2) + .containsOnly(expectedResult1, expectedResult2); + } + + @Test + @DisplayName("자신의 합과 같을 경우, 0을 반환한다.") + void getResults_with_draw() { + //given + Card card1 = new Card(Score.A, Suit.CLUB); + Card card2 = new Card(Score.FIVE, Suit.CLUB); + Card card3 = new Card(Score.FIVE, Suit.CLUB); + Person player = new Player("player", new GivenCards(Arrays.asList(card1, card2, card3))); + Card card4 = new Card(Score.A, Suit.DIAMOND); + Card card5 = new Card(Score.EIGHT, Suit.DIAMOND); + Card card6 = new Card(Score.TWO, Suit.DIAMOND); + GivenCards dealerCards = new GivenCards(Arrays.asList(card4, card5, card6)); + Players players = new Players(Collections.singletonList(player)); + + //when + List results = players.getResults(dealerCards); + + //then + assertThat(results).hasSize(1) + .containsOnly(0); + } +} From db0aa567ffa3593887f68250431f480d7e2b87c9 Mon Sep 17 00:00:00 2001 From: Beenie93 Date: Wed, 4 Aug 2021 09:24:53 +0900 Subject: [PATCH 70/80] =?UTF-8?q?refactor:=20Players=EC=97=90=EC=84=9C=20?= =?UTF-8?q?=EB=B0=98=ED=99=98=ED=95=98=EB=8A=94=20=EA=B0=9D=EC=B2=B4=20Lis?= =?UTF-8?q?t=20->=20GivenCards=EB=A1=9C=20=EC=88=98=EC=A0=95?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- src/main/java/blackjack/domain/GameSystem.java | 7 +++++-- .../java/blackjack/domain/participant/Players.java | 8 +++----- .../java/blackjack/domain/participant/PlayersTest.java | 10 +++++----- 3 files changed, 13 insertions(+), 12 deletions(-) diff --git a/src/main/java/blackjack/domain/GameSystem.java b/src/main/java/blackjack/domain/GameSystem.java index d93c697..4db1d3d 100644 --- a/src/main/java/blackjack/domain/GameSystem.java +++ b/src/main/java/blackjack/domain/GameSystem.java @@ -2,6 +2,7 @@ import blackjack.domain.card.Card; import blackjack.domain.card.Deck; +import blackjack.domain.card.GivenCards; import blackjack.domain.participant.Dealer; import blackjack.domain.participant.Person; import blackjack.domain.participant.Player; @@ -40,7 +41,9 @@ public List getDealerCards() { } public List> getPlayerCards() { - return players.getPlayerCards(); + return Collections.unmodifiableList(players.getPlayerCards().stream() + .map(GivenCards::list) + .collect(Collectors.toList())); } public boolean allPlayersFinished() { @@ -78,7 +81,7 @@ public boolean isDealerFinished() { } public List getCards(final String name) { - return players.getCards(name); + return players.getCards(name).list(); } public int getDealerScore() { diff --git a/src/main/java/blackjack/domain/participant/Players.java b/src/main/java/blackjack/domain/participant/Players.java index 69e2ef8..92c6e52 100644 --- a/src/main/java/blackjack/domain/participant/Players.java +++ b/src/main/java/blackjack/domain/participant/Players.java @@ -1,6 +1,5 @@ package blackjack.domain.participant; -import blackjack.domain.card.Card; import blackjack.domain.card.GivenCards; import java.util.ArrayList; @@ -25,11 +24,10 @@ public List getPlayerNames() { return Collections.unmodifiableList(new ArrayList<>(players.keySet())); } - public List> getPlayerCards() { + public List getPlayerCards() { return Collections.unmodifiableList(players.values() .stream() .map(Person::getCards) - .map(GivenCards::list) .collect(Collectors.toList())); } @@ -52,9 +50,9 @@ public Person findPlayerBy(final String name) { return players.get(name); } - public List getCards(final String name) { + public GivenCards getCards(final String name) { Person player = findPlayerBy(name); - return player.getCards().list(); + return player.getCards(); } public List getPlayerScores() { diff --git a/src/test/java/blackjack/domain/participant/PlayersTest.java b/src/test/java/blackjack/domain/participant/PlayersTest.java index 5aa5280..09ccd21 100644 --- a/src/test/java/blackjack/domain/participant/PlayersTest.java +++ b/src/test/java/blackjack/domain/participant/PlayersTest.java @@ -47,11 +47,11 @@ void getPlayerCards() { Players players = new Players(Arrays.asList(player1, player2)); //when - List> allPlayerCards = players.getPlayerCards(); + List allPlayerCards = players.getPlayerCards(); //then assertThat(allPlayerCards).hasSize(2); - allPlayerCards.forEach(playerCards -> assertThat(playerCards).hasSize(2)); + allPlayerCards.forEach(playerCards -> assertThat(playerCards.list()).hasSize(2)); } @ParameterizedTest @@ -105,13 +105,13 @@ void getCards() { Card card1 = new Card(Score.A, Suit.HEART); Card card2 = new Card(Score.A, Suit.CLUB); Person player = new Player(name, new GivenCards(Arrays.asList(card1, card2))); - Players players = new Players(Arrays.asList(player)); + Players players = new Players(Collections.singletonList(player)); //when - List cards = players.getCards(name); + GivenCards cards = players.getCards(name); //then - assertThat(cards).hasSize(2) + assertThat(cards.list()).hasSize(2) .containsOnly(card1, card2); } From 6f5254a2506d876b24dac5160530bc323a3ade15 Mon Sep 17 00:00:00 2001 From: Beenie93 Date: Sat, 7 Aug 2021 23:39:58 +0900 Subject: [PATCH 71/80] =?UTF-8?q?refactor:=20=EC=B9=B4=EB=93=9C=20?= =?UTF-8?q?=EC=BA=90=EC=8B=B1=20=EC=A0=81=EC=9A=A9?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- src/main/java/blackjack/domain/card/Card.java | 29 ++++++++- src/main/java/blackjack/domain/card/Deck.java | 2 +- .../java/blackjack/domain/GameSystemTest.java | 62 +++++++++---------- .../java/blackjack/domain/card/CardTest.java | 10 +-- .../blackjack/domain/card/GivenCardsTest.java | 56 ++++++++--------- .../domain/dto/CardResponseTest.java | 4 +- .../domain/dto/CardsResponseTest.java | 4 +- .../dto/DealerAndPlayerCardsResponseTest.java | 8 +-- .../domain/participant/DealerTest.java | 36 +++++------ .../domain/participant/GamerTest.java | 16 ++--- .../domain/participant/PlayerTest.java | 26 ++++---- .../domain/participant/PlayersTest.java | 58 ++++++++--------- .../java/blackjack/domain/state/InitTest.java | 8 +-- .../domain/state/finished/BlackjackTest.java | 4 +- .../domain/state/finished/BurstTest.java | 4 +- .../domain/state/finished/FinishedTest.java | 4 +- .../domain/state/finished/StayTest.java | 20 +++--- .../domain/state/running/HitTest.java | 22 +++---- .../domain/state/running/RunningTest.java | 2 +- 19 files changed, 201 insertions(+), 174 deletions(-) diff --git a/src/main/java/blackjack/domain/card/Card.java b/src/main/java/blackjack/domain/card/Card.java index ccfa364..0b23e2d 100644 --- a/src/main/java/blackjack/domain/card/Card.java +++ b/src/main/java/blackjack/domain/card/Card.java @@ -3,17 +3,44 @@ import blackjack.domain.enums.Score; import blackjack.domain.enums.Suit; +import java.util.Arrays; +import java.util.Map; import java.util.Objects; +import java.util.function.Function; +import java.util.stream.Collectors; +import java.util.stream.Stream; public class Card { + private static final Map CARDS = createCards(); + + private static Map createCards() { + return Arrays.stream(Score.values()) + .flatMap(Card::createCard) + .collect(Collectors.toMap(card -> generateKey(card.score, card.suit), Function.identity())); + } + + private static Stream createCard(final Score cardScore) { + return Arrays.stream(Suit.values()) + .map(cardSuit -> new Card(cardScore, cardSuit)); + } + + private static String generateKey(final Score score, final Suit suit) { + return score.getDenomination() + suit.getSuit(); + } + private final Score score; private final Suit suit; - public Card(final Score score, final Suit suit) { + private Card(final Score score, final Suit suit) { this.score = score; this.suit = suit; } + public static Card from(final Score score, final Suit suit) { + String key = generateKey(score, suit); + return CARDS.get(key); + } + public int getScore() { return score.getScore(); } diff --git a/src/main/java/blackjack/domain/card/Deck.java b/src/main/java/blackjack/domain/card/Deck.java index 9f4805d..dc78061 100644 --- a/src/main/java/blackjack/domain/card/Deck.java +++ b/src/main/java/blackjack/domain/card/Deck.java @@ -21,7 +21,7 @@ public class Deck { for (final Score score : Score.values()) { Arrays.stream(Suit.values()) - .forEach(suit -> cards.add(new Card(score, suit))); + .forEach(suit -> cards.add(Card.from(score, suit))); } Collections.shuffle(cards); diff --git a/src/test/java/blackjack/domain/GameSystemTest.java b/src/test/java/blackjack/domain/GameSystemTest.java index 543a6a4..8a2436f 100644 --- a/src/test/java/blackjack/domain/GameSystemTest.java +++ b/src/test/java/blackjack/domain/GameSystemTest.java @@ -77,10 +77,10 @@ void getPlayerCards() { @DisplayName("모든 플레이어가 종료하였는지 여부를 반환한다.") void allPlayersFinished(String score1, String score2, boolean expected) { //given - Card card1 = new Card(Score.A, Suit.DIAMOND); - Card card2 = new Card(Score.J, Suit.DIAMOND); - Card card3 = new Card(Score.valueOf(score1), Suit.CLUB); - Card card4 = new Card(Score.valueOf(score2), Suit.CLUB); + Card card1 = Card.from(Score.A, Suit.DIAMOND); + Card card2 = Card.from(Score.J, Suit.DIAMOND); + Card card3 = Card.from(Score.valueOf(score1), Suit.CLUB); + Card card4 = Card.from(Score.valueOf(score2), Suit.CLUB); Person player1 = new Player("pobi", new GivenCards(Arrays.asList(card1, card2))); Person player2 = new Player("tobi", new GivenCards(Arrays.asList(card3, card4))); Players players = new Players(Arrays.asList(player1, player2)); @@ -98,12 +98,12 @@ void allPlayersFinished(String score1, String score2, boolean expected) { @DisplayName("참여 종료상태가 아닌 플레이어 중 먼저 입력 받았던 플레이어의 이름을 반환한다.") void getCurrentPlayer(String score1, String score2, String score3, String score4, String expectedPlayer) { //given - Card card1 = new Card(Score.A, Suit.DIAMOND); - Card card2 = new Card(Score.J, Suit.DIAMOND); - Card card3 = new Card(Score.valueOf(score1), Suit.CLUB); - Card card4 = new Card(Score.valueOf(score2), Suit.CLUB); - Card card5 = new Card(Score.valueOf(score3), Suit.HEART); - Card card6 = new Card(Score.valueOf(score4), Suit.HEART); + Card card1 = Card.from(Score.A, Suit.DIAMOND); + Card card2 = Card.from(Score.J, Suit.DIAMOND); + Card card3 = Card.from(Score.valueOf(score1), Suit.CLUB); + Card card4 = Card.from(Score.valueOf(score2), Suit.CLUB); + Card card5 = Card.from(Score.valueOf(score3), Suit.HEART); + Card card6 = Card.from(Score.valueOf(score4), Suit.HEART); Person player1 = new Player("player1", new GivenCards(Arrays.asList(card1, card2))); Person player2 = new Player("player2", new GivenCards(Arrays.asList(card3, card4))); Person player3 = new Player("player3", new GivenCards(Arrays.asList(card5, card6))); @@ -123,8 +123,8 @@ void getCurrentPlayer(String score1, String score2, String score3, String score4 void hit(String answer, int expectedSize) { //given String name = "pobi"; - Card card1 = new Card(Score.A, Suit.HEART); - Card card2 = new Card(Score.A, Suit.CLUB); + Card card1 = Card.from(Score.A, Suit.HEART); + Card card2 = Card.from(Score.A, Suit.CLUB); Person player = new Player(name, new GivenCards(Arrays.asList(card1, card2))); Players players = new Players(Collections.singletonList(player)); GameSystem gameSystem = new GameSystem(new Dealer("딜러", new GivenCards(Collections.emptyList())), players); @@ -142,8 +142,8 @@ void hit(String answer, int expectedSize) { void hit_with_invalid_answer(String answer) { //given String name = "pobi"; - Card card1 = new Card(Score.A, Suit.HEART); - Card card2 = new Card(Score.A, Suit.CLUB); + Card card1 = Card.from(Score.A, Suit.HEART); + Card card2 = Card.from(Score.A, Suit.CLUB); Person player = new Player(name, new GivenCards(Arrays.asList(card1, card2))); Players players = new Players(Collections.singletonList(player)); GameSystem gameSystem = new GameSystem(new Dealer("딜러", new GivenCards(Collections.emptyList())), players); @@ -158,8 +158,8 @@ void hit_with_invalid_answer(String answer) { @DisplayName("딜러의 카드를 추가한다.") void hit_for_dealer() { //given - Card card1 = new Card(Score.TWO, Suit.CLUB); - Card card2 = new Card(Score.TWO, Suit.HEART); + Card card1 = Card.from(Score.TWO, Suit.CLUB); + Card card2 = Card.from(Score.TWO, Suit.HEART); GivenCards givenCards = new GivenCards(Arrays.asList(card1, card2)); Players players = new Players(Collections.emptyList()); GameSystem gameSystem = new GameSystem(new Dealer("딜러", givenCards), players); @@ -176,8 +176,8 @@ void hit_for_dealer() { void getCards() { //given String name = "pobi"; - Card card1 = new Card(Score.A, Suit.HEART); - Card card2 = new Card(Score.A, Suit.CLUB); + Card card1 = Card.from(Score.A, Suit.HEART); + Card card2 = Card.from(Score.A, Suit.CLUB); Person player = new Player(name, new GivenCards(Arrays.asList(card1, card2))); Players players = new Players(Collections.singletonList(player)); GameSystem gameSystem = new GameSystem(new Dealer("딜러", new GivenCards(Collections.emptyList())), players); @@ -194,8 +194,8 @@ void getCards() { @DisplayName("딜러의 점수 합을 반환한다.") void getDealerScore() { //give - Card card1 = new Card(Score.A, Suit.CLUB); - Card card2 = new Card(Score.TEN, Suit.CLUB); + Card card1 = Card.from(Score.A, Suit.CLUB); + Card card2 = Card.from(Score.TEN, Suit.CLUB); GivenCards givenCards = new GivenCards(Arrays.asList(card1, card2)); Dealer dealer = new Dealer("딜러", givenCards); Players players = new Players(Collections.emptyList()); @@ -213,10 +213,10 @@ void getDealerScore() { @DisplayName("플레이어들의 점수를 반환한다.") void getPlayerScores(String score1, String score2, String score3, String score4, int expectedSum1, int expectedSum2) { //given - Card card1 = new Card(Score.valueOf(score1), Suit.CLUB); - Card card2 = new Card(Score.valueOf(score2), Suit.CLUB); - Card card3 = new Card(Score.valueOf(score3), Suit.HEART); - Card card4 = new Card(Score.valueOf(score4), Suit.HEART); + Card card1 = Card.from(Score.valueOf(score1), Suit.CLUB); + Card card2 = Card.from(Score.valueOf(score2), Suit.CLUB); + Card card3 = Card.from(Score.valueOf(score3), Suit.HEART); + Card card4 = Card.from(Score.valueOf(score4), Suit.HEART); Person player1 = new Player("player1", new GivenCards(Arrays.asList(card1, card2))); Person player2 = new Player("player2", new GivenCards(Arrays.asList(card3, card4))); Players players = new Players(Arrays.asList(player1, player2)); @@ -231,18 +231,18 @@ void getPlayerScores(String score1, String score2, String score3, String score4, } @ParameterizedTest - @CsvSource(value = {"TEN, TEN, n, 1, 1", "TEN, TEN, y, 1, -1", "A, EIGHT, n, 1, 0"}) + @CsvSource(value = {"TEN, TEN, n, 1, 1", "TEN, EIGHT, n, 1, -1", "A, EIGHT, n, 1, 0"}) @DisplayName("플레이어의 승패 결과를 반환한다.") void getResults(String score1, String score2, String answer, int expectedResult1, int expectedResult2) { //given - Card card1 = new Card(Score.A, Suit.CLUB); - Card card2 = new Card(Score.J, Suit.CLUB); + Card card1 = Card.from(Score.A, Suit.CLUB); + Card card2 = Card.from(Score.J, Suit.CLUB); Person player1 = new Player("player1", new GivenCards(Arrays.asList(card1, card2))); - Card card3 = new Card(Score.valueOf(score1), Suit.HEART); - Card card4 = new Card(Score.valueOf(score2), Suit.HEART); + Card card3 = Card.from(Score.valueOf(score1), Suit.HEART); + Card card4 = Card.from(Score.valueOf(score2), Suit.HEART); Person player2 = new Player("player2", new GivenCards(Arrays.asList(card3, card4))); - Card card5 = new Card(Score.A, Suit.DIAMOND); - Card card6 = new Card(Score.EIGHT, Suit.DIAMOND); + Card card5 = Card.from(Score.A, Suit.DIAMOND); + Card card6 = Card.from(Score.EIGHT, Suit.DIAMOND); GivenCards dealerCards = new GivenCards(Arrays.asList(card5, card6)); Players players = new Players(Arrays.asList(player1, player2)); GameSystem gameSystem = new GameSystem(new Dealer("딜러", dealerCards), players); diff --git a/src/test/java/blackjack/domain/card/CardTest.java b/src/test/java/blackjack/domain/card/CardTest.java index 3ca1245..f1a5c01 100644 --- a/src/test/java/blackjack/domain/card/CardTest.java +++ b/src/test/java/blackjack/domain/card/CardTest.java @@ -19,10 +19,10 @@ void create() { Suit diamond = Suit.DIAMOND; //when - Card card = new Card(ace, diamond); + Card card = Card.from(ace, diamond); //then - assertThat(card).isEqualTo(new Card(ace, diamond)); + assertThat(card).isEqualTo(Card.from(ace, diamond)); } @Test @@ -31,7 +31,7 @@ void getScore() { //given Score jack = Score.J; Suit diamond = Suit.DIAMOND; - Card card = new Card(jack, diamond); + Card card = Card.from(jack, diamond); //when int score = card.getScore(); @@ -46,7 +46,7 @@ void getDenomination() { //given Score jack = Score.J; Suit diamond = Suit.DIAMOND; - Card card = new Card(jack, diamond); + Card card = Card.from(jack, diamond); //when String denomination = card.getDenomination(); @@ -62,7 +62,7 @@ void isAce(String scoreName, boolean expected) { //given Score score = Score.valueOf(scoreName); Suit diamond = Suit.DIAMOND; - Card card = new Card(score, diamond); + Card card = Card.from(score, diamond); //when boolean actual = card.isAce(); diff --git a/src/test/java/blackjack/domain/card/GivenCardsTest.java b/src/test/java/blackjack/domain/card/GivenCardsTest.java index e95070b..66db6cc 100644 --- a/src/test/java/blackjack/domain/card/GivenCardsTest.java +++ b/src/test/java/blackjack/domain/card/GivenCardsTest.java @@ -18,8 +18,8 @@ public class GivenCardsTest { @DisplayName("가지고 있는 카드의 합을 반환한다.") void sum() { //given - Card card1 = new Card(Score.EIGHT, Suit.CLUB); - Card card2 = new Card(Score.TWO, Suit.CLUB); + Card card1 = Card.from(Score.EIGHT, Suit.CLUB); + Card card2 = Card.from(Score.TWO, Suit.CLUB); GivenCards givenCards = new GivenCards(Arrays.asList(card1, card2)); //when @@ -33,9 +33,9 @@ void sum() { @DisplayName("Ace가 1로 계산된 카드의 합을 반환한다.") void sum_with_ace_value_1() { //given - Card card1 = new Card(Score.TEN, Suit.CLUB); - Card card2 = new Card(Score.TEN, Suit.CLUB); - Card card3 = new Card(Score.A, Suit.CLUB); + Card card1 = Card.from(Score.TEN, Suit.CLUB); + Card card2 = Card.from(Score.TEN, Suit.CLUB); + Card card3 = Card.from(Score.A, Suit.CLUB); GivenCards givenCards = new GivenCards(Arrays.asList(card1, card2, card3)); //when @@ -49,8 +49,8 @@ void sum_with_ace_value_1() { @DisplayName("Ace가 11로 계산된 카드의 합을 반환한다.") void sum_with_ace_value_11() { //given - Card card1 = new Card(Score.TEN, Suit.CLUB); - Card card2 = new Card(Score.A, Suit.CLUB); + Card card1 = Card.from(Score.TEN, Suit.CLUB); + Card card2 = Card.from(Score.A, Suit.CLUB); GivenCards givenCards = new GivenCards(Arrays.asList(card1, card2)); //when @@ -64,8 +64,8 @@ void sum_with_ace_value_11() { @DisplayName("카드 2장이 21일 경우, 참을 반환한다.") void isBlackjack() { //given - Card card1 = new Card(Score.TEN, Suit.CLUB); - Card card2 = new Card(Score.A, Suit.CLUB); + Card card1 = Card.from(Score.TEN, Suit.CLUB); + Card card2 = Card.from(Score.A, Suit.CLUB); GivenCards givenCards = new GivenCards(Arrays.asList(card1, card2)); //when @@ -79,9 +79,9 @@ void isBlackjack() { @DisplayName("카드의 합이 21을 초과할 경우, 참을 반환한다.") void isBurst() { //given - Card card1 = new Card(Score.TEN, Suit.CLUB); - Card card2 = new Card(Score.TEN, Suit.HEART); - Card card3 = new Card(Score.TWO, Suit.HEART); + Card card1 = Card.from(Score.TEN, Suit.CLUB); + Card card2 = Card.from(Score.TEN, Suit.HEART); + Card card3 = Card.from(Score.TWO, Suit.HEART); GivenCards givenCards = new GivenCards(Arrays.asList(card1, card2, card3)); //when @@ -95,8 +95,8 @@ void isBurst() { @DisplayName("가지고 있는 카드 목록을 반환한다.") void list() { //given - Card card1 = new Card(Score.TEN, Suit.CLUB); - Card card2 = new Card(Score.A, Suit.CLUB); + Card card1 = Card.from(Score.TEN, Suit.CLUB); + Card card2 = Card.from(Score.A, Suit.CLUB); GivenCards givenCards = new GivenCards(Arrays.asList(card1, card2)); //when @@ -111,10 +111,10 @@ void list() { @DisplayName("인자로 받은 카드를 추가한다.") void add() { //given - Card card1 = new Card(Score.TEN, Suit.CLUB); - Card card2 = new Card(Score.NINE, Suit.CLUB); + Card card1 = Card.from(Score.TEN, Suit.CLUB); + Card card2 = Card.from(Score.NINE, Suit.CLUB); GivenCards givenCards = new GivenCards(Arrays.asList(card1, card2)); - Card newCard = new Card(Score.TWO, Suit.CLUB); + Card newCard = Card.from(Score.TWO, Suit.CLUB); //when givenCards.add(newCard); @@ -128,10 +128,10 @@ void add() { @DisplayName("인자로 받은 카드보다 자신의 카드 합이 더 클 경우, 참을 반환한다.") void isGreaterThan() { //given - Card card1 = new Card(Score.TEN, Suit.CLUB); - Card card2 = new Card(Score.NINE, Suit.CLUB); + Card card1 = Card.from(Score.TEN, Suit.CLUB); + Card card2 = Card.from(Score.NINE, Suit.CLUB); GivenCards myCards = new GivenCards(Arrays.asList(card1, card2)); - Card card3 = new Card(Score.SEVEN, Suit.CLUB); + Card card3 = Card.from(Score.SEVEN, Suit.CLUB); GivenCards otherCards = new GivenCards(Arrays.asList(card1, card3)); //when @@ -145,10 +145,10 @@ void isGreaterThan() { @DisplayName("인자로 받은 카드보다 자신의 카드 합보다 작을 경우, 참을 반환한다.") void isLessThan() { //given - Card card1 = new Card(Score.TEN, Suit.CLUB); - Card card2 = new Card(Score.NINE, Suit.CLUB); + Card card1 = Card.from(Score.TEN, Suit.CLUB); + Card card2 = Card.from(Score.NINE, Suit.CLUB); GivenCards myCards = new GivenCards(Arrays.asList(card1, card2)); - Card card3 = new Card(Score.TEN, Suit.HEART); + Card card3 = Card.from(Score.TEN, Suit.HEART); GivenCards otherCards = new GivenCards(Arrays.asList(card1, card3)); //when @@ -163,8 +163,8 @@ void isLessThan() { @DisplayName("인자로 받은 값보다 자신의 카드 합이 작거나 같을 경우, 참을 반환한다.") void isLessThanEqualTo(int sum, boolean expected) { //given - Card card1 = new Card(Score.TEN, Suit.CLUB); - Card card2 = new Card(Score.NINE, Suit.CLUB); + Card card1 = Card.from(Score.TEN, Suit.CLUB); + Card card2 = Card.from(Score.NINE, Suit.CLUB); GivenCards myCards = new GivenCards(Arrays.asList(card1, card2)); //when @@ -179,9 +179,9 @@ void isLessThanEqualTo(int sum, boolean expected) { @DisplayName("카드의 합이 21일 경우, 참을 반환한다.") void isMaximumThreshhold(String score1, String score2, String score3, boolean expected) { //given - Card card1 = new Card(Score.valueOf(score1), Suit.CLUB); - Card card2 = new Card(Score.valueOf(score2), Suit.CLUB); - Card card3 = new Card(Score.valueOf(score3), Suit.CLUB); + Card card1 = Card.from(Score.valueOf(score1), Suit.CLUB); + Card card2 = Card.from(Score.valueOf(score2), Suit.CLUB); + Card card3 = Card.from(Score.valueOf(score3), Suit.CLUB); GivenCards myCards = new GivenCards(Arrays.asList(card1, card2, card3)); //when diff --git a/src/test/java/blackjack/domain/dto/CardResponseTest.java b/src/test/java/blackjack/domain/dto/CardResponseTest.java index bd8ad69..addc4cb 100644 --- a/src/test/java/blackjack/domain/dto/CardResponseTest.java +++ b/src/test/java/blackjack/domain/dto/CardResponseTest.java @@ -14,7 +14,7 @@ public class CardResponseTest { @DisplayName("카드의 점수 이름(끗수)을 반환한다.") void getScore() { //given - Card card = new Card(Score.A, Suit.CLUB); + Card card = Card.from(Score.A, Suit.CLUB); CardResponse cardResponse = new CardResponse(card.getDenomination(), card.getSuit()); //when @@ -28,7 +28,7 @@ void getScore() { @DisplayName("카드의 무늬를 반환한다.") void getSuit() { //given - Card card = new Card(Score.A, Suit.CLUB); + Card card = Card.from(Score.A, Suit.CLUB); CardResponse cardResponse = new CardResponse(card.getDenomination(), card.getSuit()); //when diff --git a/src/test/java/blackjack/domain/dto/CardsResponseTest.java b/src/test/java/blackjack/domain/dto/CardsResponseTest.java index aa35a10..28771c9 100644 --- a/src/test/java/blackjack/domain/dto/CardsResponseTest.java +++ b/src/test/java/blackjack/domain/dto/CardsResponseTest.java @@ -21,8 +21,8 @@ void getCards() { Score ace = Score.A; Suit club = Suit.CLUB; Suit diamond = Suit.DIAMOND; - Card card1 = new Card(ace, club); - Card card2 = new Card(ace, diamond); + Card card1 = Card.from(ace, club); + Card card2 = Card.from(ace, diamond); List playerCards = Arrays.asList(card1, card2); CardsResponse cardsResponse = new CardsResponse(playerCards); diff --git a/src/test/java/blackjack/domain/dto/DealerAndPlayerCardsResponseTest.java b/src/test/java/blackjack/domain/dto/DealerAndPlayerCardsResponseTest.java index 45c64c2..dffe75c 100644 --- a/src/test/java/blackjack/domain/dto/DealerAndPlayerCardsResponseTest.java +++ b/src/test/java/blackjack/domain/dto/DealerAndPlayerCardsResponseTest.java @@ -22,8 +22,8 @@ void getDealerCards() { Score ace = Score.A; Suit club = Suit.CLUB; Suit diamond = Suit.DIAMOND; - Card card1 = new Card(ace, club); - Card card2 = new Card(ace, diamond); + Card card1 = Card.from(ace, club); + Card card2 = Card.from(ace, diamond); List dealerCards = Arrays.asList(card1, card2); DealerAndPlayerCardsResponse dealerAndPlayerCardsResponse = new DealerAndPlayerCardsResponse(dealerCards, Collections.emptyList()); @@ -44,8 +44,8 @@ void getAllPlayerCards() { Score ace = Score.A; Suit club = Suit.CLUB; Suit diamond = Suit.DIAMOND; - Card card1 = new Card(ace, club); - Card card2 = new Card(ace, diamond); + Card card1 = Card.from(ace, club); + Card card2 = Card.from(ace, diamond); List playerCards = Arrays.asList(card1, card2); List> allPlayerCards = Arrays.asList(playerCards, playerCards, playerCards); DealerAndPlayerCardsResponse dealerAndPlayerCardsResponse = new DealerAndPlayerCardsResponse(Collections.emptyList(), allPlayerCards); diff --git a/src/test/java/blackjack/domain/participant/DealerTest.java b/src/test/java/blackjack/domain/participant/DealerTest.java index b194a0a..4ee1d13 100644 --- a/src/test/java/blackjack/domain/participant/DealerTest.java +++ b/src/test/java/blackjack/domain/participant/DealerTest.java @@ -24,8 +24,8 @@ public class DealerTest { @DisplayName("처음 받은 카드 두 장의 합이 21일 경우, Blackjack 상태가 된다.") void create_state_blackjack() { //given - Card card1 = new Card(Score.A, Suit.DIAMOND); - Card card2 = new Card(Score.TEN, Suit.DIAMOND); + Card card1 = Card.from(Score.A, Suit.DIAMOND); + Card card2 = Card.from(Score.TEN, Suit.DIAMOND); GivenCards givenCards = new GivenCards(Arrays.asList(card1, card2)); //when @@ -40,8 +40,8 @@ void create_state_blackjack() { @DisplayName("처음 받은 카드 두 장의 합이 16 이하일 경우, Hit 상태가 된다.") void create_state_hit() { //given - Card card1 = new Card(Score.TEN, Suit.DIAMOND); - Card card2 = new Card(Score.SIX, Suit.CLUB); + Card card1 = Card.from(Score.TEN, Suit.DIAMOND); + Card card2 = Card.from(Score.SIX, Suit.CLUB); GivenCards givenCards = new GivenCards(Arrays.asList(card1, card2)); //when @@ -56,8 +56,8 @@ void create_state_hit() { @DisplayName("처음 받은 카드 두 장의 합이 16을 초과할 경우, Stay 상태가 된다.") void create_state_stay() { //given - Card card1 = new Card(Score.TEN, Suit.DIAMOND); - Card card2 = new Card(Score.SEVEN, Suit.CLUB); + Card card1 = Card.from(Score.TEN, Suit.DIAMOND); + Card card2 = Card.from(Score.SEVEN, Suit.CLUB); GivenCards givenCards = new GivenCards(Arrays.asList(card1, card2)); //when @@ -72,11 +72,11 @@ void create_state_stay() { @DisplayName("발급 받은 카드를 더한 합이 21을 초과할 경우, Burst 상태가 된다.") void hit_become_burst_state() { //given - Card card1 = new Card(Score.TEN, Suit.DIAMOND); - Card card2 = new Card(Score.SIX, Suit.CLUB); + Card card1 = Card.from(Score.TEN, Suit.DIAMOND); + Card card2 = Card.from(Score.SIX, Suit.CLUB); GivenCards givenCards = new GivenCards(Arrays.asList(card1, card2)); Person dealer = new Dealer("pobi", givenCards); - Card card3 = new Card(Score.SIX, Suit.HEART); + Card card3 = Card.from(Score.SIX, Suit.HEART); //when dealer.hit(card3); @@ -90,11 +90,11 @@ void hit_become_burst_state() { @DisplayName("발급 받은 카드를 더한 합이 16 이하일 경우, Hit 상태가 된다.") void hit_remain_hit_state() { //given - Card card1 = new Card(Score.TEN, Suit.DIAMOND); - Card card2 = new Card(Score.FOUR, Suit.DIAMOND); + Card card1 = Card.from(Score.TEN, Suit.DIAMOND); + Card card2 = Card.from(Score.FOUR, Suit.DIAMOND); GivenCards givenCards = new GivenCards(Arrays.asList(card1, card2)); Person dealer = new Dealer("pobi", givenCards); - Card card3 = new Card(Score.TWO, Suit.HEART); + Card card3 = Card.from(Score.TWO, Suit.HEART); //when dealer.hit(card3); @@ -109,11 +109,11 @@ void hit_remain_hit_state() { @DisplayName("발급 받은 카드를 더한 합이 17 이상 21 이하일 경우, Stay 상태가 된다.") void hit_become_stay_state(String score) { //given - Card card1 = new Card(Score.TEN, Suit.DIAMOND); - Card card2 = new Card(Score.FIVE, Suit.DIAMOND); + Card card1 = Card.from(Score.TEN, Suit.DIAMOND); + Card card2 = Card.from(Score.FIVE, Suit.DIAMOND); GivenCards givenCards = new GivenCards(Arrays.asList(card1, card2)); Person dealer = new Dealer("pobi", givenCards); - Card card3 = new Card(Score.valueOf(score), Suit.HEART); + Card card3 = Card.from(Score.valueOf(score), Suit.HEART); //when dealer.hit(card3); @@ -128,11 +128,11 @@ void hit_become_stay_state(String score) { @DisplayName("블랙잭이 아니고 17 이상 21 이하일 경우 종료 여부를 참으로 반환한다.") void isFinished(String score, boolean expected) { //given - Card card1 = new Card(Score.TEN, Suit.DIAMOND); - Card card2 = new Card(Score.FOUR, Suit.DIAMOND); + Card card1 = Card.from(Score.TEN, Suit.DIAMOND); + Card card2 = Card.from(Score.FOUR, Suit.DIAMOND); GivenCards givenCards = new GivenCards(Arrays.asList(card1, card2)); Person dealer = new Dealer("pobi", givenCards); - Card card3 = new Card(Score.valueOf(score), Suit.HEART); + Card card3 = Card.from(Score.valueOf(score), Suit.HEART); dealer.hit(card3); //when diff --git a/src/test/java/blackjack/domain/participant/GamerTest.java b/src/test/java/blackjack/domain/participant/GamerTest.java index 8be8881..555a4f1 100644 --- a/src/test/java/blackjack/domain/participant/GamerTest.java +++ b/src/test/java/blackjack/domain/participant/GamerTest.java @@ -20,8 +20,8 @@ class GamerTest { @DisplayName("추가 카드 발급을 거부할 경우, Stay 상태가 된다.") void stay() { //given - Card card1 = new Card(Score.TEN, Suit.DIAMOND); - Card card2 = new Card(Score.NINE, Suit.DIAMOND); + Card card1 = Card.from(Score.TEN, Suit.DIAMOND); + Card card2 = Card.from(Score.NINE, Suit.DIAMOND); GivenCards givenCards = new GivenCards(Arrays.asList(card1, card2)); Person gamer = createGamer("pobi", givenCards, false); @@ -37,8 +37,8 @@ void stay() { @DisplayName("발급 받은 카드 목록을 반환한다.") void getCards() { //given - Card card1 = new Card(Score.TEN, Suit.DIAMOND); - Card card2 = new Card(Score.NINE, Suit.DIAMOND); + Card card1 = Card.from(Score.TEN, Suit.DIAMOND); + Card card2 = Card.from(Score.NINE, Suit.DIAMOND); GivenCards givenCards = new GivenCards(Arrays.asList(card1, card2)); Person gamer = createGamer("pobi", givenCards, false); @@ -53,8 +53,8 @@ void getCards() { @DisplayName("카드의 합을 반환한다.") void sum() { //given - Card card1 = new Card(Score.TEN, Suit.DIAMOND); - Card card2 = new Card(Score.NINE, Suit.DIAMOND); + Card card1 = Card.from(Score.TEN, Suit.DIAMOND); + Card card2 = Card.from(Score.NINE, Suit.DIAMOND); GivenCards givenCards = new GivenCards(Arrays.asList(card1, card2)); Person gamer = createGamer("pobi", givenCards, false); @@ -84,8 +84,8 @@ void getName() { @DisplayName("종료 여부를 반환한다.") void isFinished() { //given - Card card1 = new Card(Score.A, Suit.DIAMOND); - Card card2 = new Card(Score.TEN, Suit.DIAMOND); + Card card1 = Card.from(Score.A, Suit.DIAMOND); + Card card2 = Card.from(Score.TEN, Suit.DIAMOND); GivenCards givenCards = new GivenCards(Arrays.asList(card1, card2)); Person gamer = createGamer("pobi", givenCards, true); diff --git a/src/test/java/blackjack/domain/participant/PlayerTest.java b/src/test/java/blackjack/domain/participant/PlayerTest.java index 3904736..4e500ec 100644 --- a/src/test/java/blackjack/domain/participant/PlayerTest.java +++ b/src/test/java/blackjack/domain/participant/PlayerTest.java @@ -21,8 +21,8 @@ public class PlayerTest { @DisplayName("처음 받은 카드 두 장의 합이 21일 경우, Blackjack 상태가 된다.") void create_state_blackjack() { //given - Card card1 = new Card(Score.A, Suit.DIAMOND); - Card card2 = new Card(Score.TEN, Suit.DIAMOND); + Card card1 = Card.from(Score.A, Suit.DIAMOND); + Card card2 = Card.from(Score.TEN, Suit.DIAMOND); GivenCards givenCards = new GivenCards(Arrays.asList(card1, card2)); //when @@ -37,8 +37,8 @@ void create_state_blackjack() { @DisplayName("처음 받은 카드 두 장의 합이 21 미만일 경우, Hit 상태가 된다.") void create_state_hit() { //given - Card card1 = new Card(Score.TEN, Suit.DIAMOND); - Card card2 = new Card(Score.TEN, Suit.CLUB); + Card card1 = Card.from(Score.TEN, Suit.DIAMOND); + Card card2 = Card.from(Score.TEN, Suit.CLUB); GivenCards givenCards = new GivenCards(Arrays.asList(card1, card2)); //when @@ -53,11 +53,11 @@ void create_state_hit() { @DisplayName("발급 받은 카드를 더한 합이 21을 초과할 경우, Burst 상태가 된다.") void hit_become_burst_state() { //given - Card card1 = new Card(Score.TEN, Suit.DIAMOND); - Card card2 = new Card(Score.TEN, Suit.CLUB); + Card card1 = Card.from(Score.TEN, Suit.DIAMOND); + Card card2 = Card.from(Score.TEN, Suit.CLUB); GivenCards givenCards = new GivenCards(Arrays.asList(card1, card2)); Person player = new Player("pobi", givenCards); - Card card3 = new Card(Score.TWO, Suit.HEART); + Card card3 = Card.from(Score.TWO, Suit.HEART); //when player.hit(card3); @@ -71,11 +71,11 @@ void hit_become_burst_state() { @DisplayName("발급 받은 카드를 더한 합이 21 미만일 경우, Hit 상태가 된다.") void hit_remain_hit_state() { //given - Card card1 = new Card(Score.TEN, Suit.DIAMOND); - Card card2 = new Card(Score.EIGHT, Suit.DIAMOND); + Card card1 = Card.from(Score.TEN, Suit.DIAMOND); + Card card2 = Card.from(Score.EIGHT, Suit.DIAMOND); GivenCards givenCards = new GivenCards(Arrays.asList(card1, card2)); Person player = new Player("pobi", givenCards); - Card card3 = new Card(Score.TWO, Suit.HEART); + Card card3 = Card.from(Score.TWO, Suit.HEART); //when player.hit(card3); @@ -89,11 +89,11 @@ void hit_remain_hit_state() { @DisplayName("발급 받은 카드를 더한 합이 21일 경우, Stay 상태가 된다.") void hit_become_stay_state() { //given - Card card1 = new Card(Score.TEN, Suit.DIAMOND); - Card card2 = new Card(Score.NINE, Suit.DIAMOND); + Card card1 = Card.from(Score.TEN, Suit.DIAMOND); + Card card2 = Card.from(Score.NINE, Suit.DIAMOND); GivenCards givenCards = new GivenCards(Arrays.asList(card1, card2)); Person player = new Player("pobi", givenCards); - Card card3 = new Card(Score.TWO, Suit.HEART); + Card card3 = Card.from(Score.TWO, Suit.HEART); //when player.hit(card3); diff --git a/src/test/java/blackjack/domain/participant/PlayersTest.java b/src/test/java/blackjack/domain/participant/PlayersTest.java index 09ccd21..67ac534 100644 --- a/src/test/java/blackjack/domain/participant/PlayersTest.java +++ b/src/test/java/blackjack/domain/participant/PlayersTest.java @@ -59,11 +59,11 @@ void getPlayerCards() { @DisplayName("모든 플레이어가 종료하였는지 여부를 반환한다.") void allPlayersFinished(String score1, String score2, boolean expected) { //given - Card card1 = new Card(Score.A, Suit.DIAMOND); - Card card2 = new Card(Score.J, Suit.DIAMOND); + Card card1 = Card.from(Score.A, Suit.DIAMOND); + Card card2 = Card.from(Score.J, Suit.DIAMOND); Person player1 = new Player("pobi", new GivenCards(Arrays.asList(card1, card2))); - Card card3 = new Card(Score.valueOf(score1), Suit.CLUB); - Card card4 = new Card(Score.valueOf(score2), Suit.CLUB); + Card card3 = Card.from(Score.valueOf(score1), Suit.CLUB); + Card card4 = Card.from(Score.valueOf(score2), Suit.CLUB); Person player2 = new Player("tobi", new GivenCards(Arrays.asList(card3, card4))); Players players = new Players(Arrays.asList(player1, player2)); @@ -79,14 +79,14 @@ void allPlayersFinished(String score1, String score2, boolean expected) { @DisplayName("참여 종료상태가 아닌 플레이어 중 먼저 입력 받았던 플레이어의 이름을 반환한다.") void getCurrentPlayer(String score1, String score2, String score3, String score4, String expectedPlayer) { //given - Card card1 = new Card(Score.A, Suit.DIAMOND); - Card card2 = new Card(Score.J, Suit.DIAMOND); + Card card1 = Card.from(Score.A, Suit.DIAMOND); + Card card2 = Card.from(Score.J, Suit.DIAMOND); Person player1 = new Player("player1", new GivenCards(Arrays.asList(card1, card2))); - Card card3 = new Card(Score.valueOf(score1), Suit.CLUB); - Card card4 = new Card(Score.valueOf(score2), Suit.CLUB); + Card card3 = Card.from(Score.valueOf(score1), Suit.CLUB); + Card card4 = Card.from(Score.valueOf(score2), Suit.CLUB); Person player2 = new Player("player2", new GivenCards(Arrays.asList(card3, card4))); - Card card5 = new Card(Score.valueOf(score3), Suit.HEART); - Card card6 = new Card(Score.valueOf(score4), Suit.HEART); + Card card5 = Card.from(Score.valueOf(score3), Suit.HEART); + Card card6 = Card.from(Score.valueOf(score4), Suit.HEART); Person player3 = new Player("player3", new GivenCards(Arrays.asList(card5, card6))); Players players = new Players(Arrays.asList(player1, player2, player3)); @@ -102,8 +102,8 @@ void getCurrentPlayer(String score1, String score2, String score3, String score4 void getCards() { //given String name = "pobi"; - Card card1 = new Card(Score.A, Suit.HEART); - Card card2 = new Card(Score.A, Suit.CLUB); + Card card1 = Card.from(Score.A, Suit.HEART); + Card card2 = Card.from(Score.A, Suit.CLUB); Person player = new Player(name, new GivenCards(Arrays.asList(card1, card2))); Players players = new Players(Collections.singletonList(player)); @@ -120,11 +120,11 @@ void getCards() { @DisplayName("플레이어들의 점수를 반환한다.") void getPlayerScores(String score1, String score2, String score3, String score4, int expectedSum1, int expectedSum2) { //given - Card card1 = new Card(Score.valueOf(score1), Suit.CLUB); - Card card2 = new Card(Score.valueOf(score2), Suit.CLUB); + Card card1 = Card.from(Score.valueOf(score1), Suit.CLUB); + Card card2 = Card.from(Score.valueOf(score2), Suit.CLUB); Person player1 = new Player("player1", new GivenCards(Arrays.asList(card1, card2))); - Card card3 = new Card(Score.valueOf(score3), Suit.HEART); - Card card4 = new Card(Score.valueOf(score4), Suit.HEART); + Card card3 = Card.from(Score.valueOf(score3), Suit.HEART); + Card card4 = Card.from(Score.valueOf(score4), Suit.HEART); Person player2 = new Player("player2", new GivenCards(Arrays.asList(card3, card4))); Players players = new Players(Arrays.asList(player1, player2)); @@ -141,15 +141,15 @@ void getPlayerScores(String score1, String score2, String score3, String score4, @DisplayName("자신의 카드의 합이 크거나 블랙잭일 경우 1, 작을 경우 -1을 반환한다.") void getResults_with_win_and_lose(String score1, String score2, String score3, int expectedResult1, int expectedResult2) { //given - Card card1 = new Card(Score.A, Suit.CLUB); - Card card2 = new Card(Score.J, Suit.CLUB); + Card card1 = Card.from(Score.A, Suit.CLUB); + Card card2 = Card.from(Score.J, Suit.CLUB); Person player1 = new Player("player1", new GivenCards(Arrays.asList(card1, card2))); - Card card3 = new Card(Score.valueOf(score1), Suit.HEART); - Card card4 = new Card(Score.valueOf(score2), Suit.HEART); - Card card5 = new Card(Score.valueOf(score3), Suit.HEART); + Card card3 = Card.from(Score.valueOf(score1), Suit.HEART); + Card card4 = Card.from(Score.valueOf(score2), Suit.HEART); + Card card5 = Card.from(Score.valueOf(score3), Suit.HEART); Person player2 = new Player("player2", new GivenCards(Arrays.asList(card3, card4, card5))); - Card card6 = new Card(Score.A, Suit.DIAMOND); - Card card7 = new Card(Score.NINE, Suit.DIAMOND); + Card card6 = Card.from(Score.A, Suit.DIAMOND); + Card card7 = Card.from(Score.NINE, Suit.DIAMOND); GivenCards dealerCards = new GivenCards(Arrays.asList(card6, card7)); Players players = new Players(Arrays.asList(player1, player2)); @@ -165,13 +165,13 @@ void getResults_with_win_and_lose(String score1, String score2, String score3, i @DisplayName("자신의 합과 같을 경우, 0을 반환한다.") void getResults_with_draw() { //given - Card card1 = new Card(Score.A, Suit.CLUB); - Card card2 = new Card(Score.FIVE, Suit.CLUB); - Card card3 = new Card(Score.FIVE, Suit.CLUB); + Card card1 = Card.from(Score.A, Suit.CLUB); + Card card2 = Card.from(Score.FIVE, Suit.CLUB); + Card card3 = Card.from(Score.FIVE, Suit.CLUB); Person player = new Player("player", new GivenCards(Arrays.asList(card1, card2, card3))); - Card card4 = new Card(Score.A, Suit.DIAMOND); - Card card5 = new Card(Score.EIGHT, Suit.DIAMOND); - Card card6 = new Card(Score.TWO, Suit.DIAMOND); + Card card4 = Card.from(Score.A, Suit.DIAMOND); + Card card5 = Card.from(Score.EIGHT, Suit.DIAMOND); + Card card6 = Card.from(Score.TWO, Suit.DIAMOND); GivenCards dealerCards = new GivenCards(Arrays.asList(card4, card5, card6)); Players players = new Players(Collections.singletonList(player)); diff --git a/src/test/java/blackjack/domain/state/InitTest.java b/src/test/java/blackjack/domain/state/InitTest.java index df2fcd0..138403a 100644 --- a/src/test/java/blackjack/domain/state/InitTest.java +++ b/src/test/java/blackjack/domain/state/InitTest.java @@ -17,8 +17,8 @@ class InitTest { @DisplayName("모든 카드 목록을 반환한다.") void getCards() { ///given - Card card1 = new Card(Score.TEN, Suit.CLUB); - Card card2 = new Card(Score.TEN, Suit.HEART); + Card card1 = Card.from(Score.TEN, Suit.CLUB); + Card card2 = Card.from(Score.TEN, Suit.HEART); GivenCards givenCards = new GivenCards(Arrays.asList(card1, card2)); State init = createInitState(givenCards); @@ -33,8 +33,8 @@ void getCards() { @DisplayName("게임 진행 중 카드의 합을 요청할 경우, 예외가 발생한다.") void sum() { ///given - Card card1 = new Card(Score.TEN, Suit.CLUB); - Card card2 = new Card(Score.TEN, Suit.HEART); + Card card1 = Card.from(Score.TEN, Suit.CLUB); + Card card2 = Card.from(Score.TEN, Suit.HEART); GivenCards givenCards = new GivenCards(Arrays.asList(card1, card2)); State init = createInitState(givenCards); diff --git a/src/test/java/blackjack/domain/state/finished/BlackjackTest.java b/src/test/java/blackjack/domain/state/finished/BlackjackTest.java index 99d45cd..8207670 100644 --- a/src/test/java/blackjack/domain/state/finished/BlackjackTest.java +++ b/src/test/java/blackjack/domain/state/finished/BlackjackTest.java @@ -19,8 +19,8 @@ class BlackjackTest { @DisplayName("승리를 의미하는 1을 반환한다.") void result() { //given - Card card1 = new Card(Score.EIGHT, Suit.CLUB); - Card card2 = new Card(Score.EIGHT, Suit.HEART); + Card card1 = Card.from(Score.EIGHT, Suit.CLUB); + Card card2 = Card.from(Score.EIGHT, Suit.HEART); GivenCards myCards = new GivenCards(Arrays.asList(card1, card2)); State blackjack = new Blackjack(myCards); GivenCards otherCards = new GivenCards(Collections.emptyList()); diff --git a/src/test/java/blackjack/domain/state/finished/BurstTest.java b/src/test/java/blackjack/domain/state/finished/BurstTest.java index d80c400..5fc59d6 100644 --- a/src/test/java/blackjack/domain/state/finished/BurstTest.java +++ b/src/test/java/blackjack/domain/state/finished/BurstTest.java @@ -19,8 +19,8 @@ class BurstTest { @DisplayName("패배를 의미하는 -1을 반환한다.") void result() { //given - Card card1 = new Card(Score.EIGHT, Suit.CLUB); - Card card2 = new Card(Score.EIGHT, Suit.HEART); + Card card1 = Card.from(Score.EIGHT, Suit.CLUB); + Card card2 = Card.from(Score.EIGHT, Suit.HEART); GivenCards myCards = new GivenCards(Arrays.asList(card1, card2)); State burst = new Burst(myCards); GivenCards otherCards = new GivenCards(Collections.emptyList()); diff --git a/src/test/java/blackjack/domain/state/finished/FinishedTest.java b/src/test/java/blackjack/domain/state/finished/FinishedTest.java index e7eb78c..4923e27 100644 --- a/src/test/java/blackjack/domain/state/finished/FinishedTest.java +++ b/src/test/java/blackjack/domain/state/finished/FinishedTest.java @@ -20,7 +20,7 @@ class FinishedTest { void hit() { //given State finishedState = createFinishedState(); - Card card = new Card(Score.A, Suit.CLUB); + Card card = Card.from(Score.A, Suit.CLUB); //when //then assertThatThrownBy(() -> finishedState.hit(card)) @@ -54,7 +54,7 @@ void isFinished() { } private State createFinishedState() { - GivenCards givenCards = new GivenCards(Collections.singletonList(new Card(Score.A, Suit.CLUB))); + GivenCards givenCards = new GivenCards(Collections.singletonList(Card.from(Score.A, Suit.CLUB))); return new Finished(givenCards) { @Override diff --git a/src/test/java/blackjack/domain/state/finished/StayTest.java b/src/test/java/blackjack/domain/state/finished/StayTest.java index 9bffdd4..d5f2586 100644 --- a/src/test/java/blackjack/domain/state/finished/StayTest.java +++ b/src/test/java/blackjack/domain/state/finished/StayTest.java @@ -21,13 +21,13 @@ class StayTest { @DisplayName("다른 카드의 합보다 크거나 다른 카드의 합이 21을 초과할 경우, 승리를 의미하는 1을 반환한다.") void result_win(String score1, String score2) { //given - Card card1 = new Card(Score.TEN, Suit.CLUB); - Card card2 = new Card(Score.TEN, Suit.HEART); + Card card1 = Card.from(Score.TEN, Suit.CLUB); + Card card2 = Card.from(Score.TEN, Suit.HEART); GivenCards myCards = new GivenCards(Arrays.asList(card1, card2)); State stay = new Stay(myCards); - Card card3 = new Card(Score.TEN, Suit.DIAMOND); - Card card4 = new Card(Score.valueOf(score1), Suit.CLUB); - Card card5 = new Card(Score.valueOf(score2), Suit.CLUB); + Card card3 = Card.from(Score.TEN, Suit.DIAMOND); + Card card4 = Card.from(Score.valueOf(score1), Suit.CLUB); + Card card5 = Card.from(Score.valueOf(score2), Suit.CLUB); GivenCards otherCards = new GivenCards(Arrays.asList(card3, card4, card5)); //when @@ -41,11 +41,11 @@ void result_win(String score1, String score2) { @DisplayName("다른 카드의 합보다 작을 경우, 패배를 의미하는 -1을 반환한다.") void result_lose() { //given - Card card1 = new Card(Score.EIGHT, Suit.CLUB); - Card card2 = new Card(Score.EIGHT, Suit.HEART); + Card card1 = Card.from(Score.EIGHT, Suit.CLUB); + Card card2 = Card.from(Score.EIGHT, Suit.HEART); GivenCards myCards = new GivenCards(Arrays.asList(card1, card2)); State stay = new Stay(myCards); - Card card3 = new Card(Score.NINE, Suit.DIAMOND); + Card card3 = Card.from(Score.NINE, Suit.DIAMOND); GivenCards otherCards = new GivenCards(Arrays.asList(card1, card3)); //when @@ -59,8 +59,8 @@ void result_lose() { @DisplayName("다른 카드의 합과 같은 경우, 무승부를 의미하는 0을 반환한다.") void result_draw() { //given - Card card1 = new Card(Score.EIGHT, Suit.CLUB); - Card card2 = new Card(Score.EIGHT, Suit.HEART); + Card card1 = Card.from(Score.EIGHT, Suit.CLUB); + Card card2 = Card.from(Score.EIGHT, Suit.HEART); GivenCards myCards = new GivenCards(Arrays.asList(card1, card2)); State stay = new Stay(myCards); GivenCards otherCards = new GivenCards(Arrays.asList(card1, card2)); diff --git a/src/test/java/blackjack/domain/state/running/HitTest.java b/src/test/java/blackjack/domain/state/running/HitTest.java index ec6d1f7..6def088 100644 --- a/src/test/java/blackjack/domain/state/running/HitTest.java +++ b/src/test/java/blackjack/domain/state/running/HitTest.java @@ -20,11 +20,11 @@ class HitTest { @DisplayName("지급받은 카드 포함 합이 21을 초과할 경우, Burst 상태를 반환한다.") void hit_return_burst_state() { //given - Card card1 = new Card(Score.TEN, Suit.CLUB); - Card card2 = new Card(Score.TEN, Suit.HEART); + Card card1 = Card.from(Score.TEN, Suit.CLUB); + Card card2 = Card.from(Score.TEN, Suit.HEART); GivenCards givenCards = new GivenCards(Arrays.asList(card1, card2)); State hit = new Hit(givenCards); - Card newCard = new Card(Score.TWO, Suit.CLUB); + Card newCard = Card.from(Score.TWO, Suit.CLUB); //when State state = hit.hit(newCard); @@ -37,11 +37,11 @@ void hit_return_burst_state() { @DisplayName("지급받은 카드 포함 합이 21 미만일 경우, Hit 상태를 반환한다.") void hit_return_itself() { //given - Card card1 = new Card(Score.TEN, Suit.CLUB); - Card card2 = new Card(Score.NINE, Suit.HEART); + Card card1 = Card.from(Score.TEN, Suit.CLUB); + Card card2 = Card.from(Score.NINE, Suit.HEART); GivenCards givenCards = new GivenCards(Arrays.asList(card1, card2)); State hit = new Hit(givenCards); - Card newCard = new Card(Score.A, Suit.CLUB); + Card newCard = Card.from(Score.A, Suit.CLUB); //when State state = hit.hit(newCard); @@ -54,11 +54,11 @@ void hit_return_itself() { @DisplayName("지급받은 카드 포함 합이 21일 경우, Stay 상태를 반환한다.") void hit_return_stay_state() { //given - Card card1 = new Card(Score.TEN, Suit.CLUB); - Card card2 = new Card(Score.NINE, Suit.HEART); + Card card1 = Card.from(Score.TEN, Suit.CLUB); + Card card2 = Card.from(Score.NINE, Suit.HEART); GivenCards givenCards = new GivenCards(Arrays.asList(card1, card2)); State hit = new Hit(givenCards); - Card newCard = new Card(Score.TWO, Suit.CLUB); + Card newCard = Card.from(Score.TWO, Suit.CLUB); //when State state = hit.hit(newCard); @@ -71,8 +71,8 @@ void hit_return_stay_state() { @DisplayName("Stay 상태를 반환한다.") void stay() { ///given - Card card1 = new Card(Score.TEN, Suit.CLUB); - Card card2 = new Card(Score.TEN, Suit.HEART); + Card card1 = Card.from(Score.TEN, Suit.CLUB); + Card card2 = Card.from(Score.TEN, Suit.HEART); GivenCards givenCards = new GivenCards(Arrays.asList(card1, card2)); State hit = new Hit(givenCards); diff --git a/src/test/java/blackjack/domain/state/running/RunningTest.java b/src/test/java/blackjack/domain/state/running/RunningTest.java index 98125b4..9a5955f 100644 --- a/src/test/java/blackjack/domain/state/running/RunningTest.java +++ b/src/test/java/blackjack/domain/state/running/RunningTest.java @@ -40,7 +40,7 @@ void result() { } private State createRunningState() { - GivenCards givenCards = new GivenCards(Collections.singletonList(new Card(Score.A, Suit.CLUB))); + GivenCards givenCards = new GivenCards(Collections.singletonList(Card.from(Score.A, Suit.CLUB))); return new Running(givenCards) { @Override From bab3a7bfca7f1354d8c4315b088d51e0695acde9 Mon Sep 17 00:00:00 2001 From: Beenie93 Date: Sun, 8 Aug 2021 04:21:10 +0900 Subject: [PATCH 72/80] =?UTF-8?q?refactor:=20Deck=20=EC=BA=90=EC=8B=B1=20?= =?UTF-8?q?=EC=A0=81=EC=9A=A9?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../controller/BlackjackController.java | 11 ++++- .../java/blackjack/domain/GameSystem.java | 17 +++---- src/main/java/blackjack/domain/card/Card.java | 5 +++ src/main/java/blackjack/domain/card/Deck.java | 29 ++++-------- .../blackjack/domain/participant/Players.java | 11 +++++ .../java/blackjack/domain/GameSystemTest.java | 45 ++++++++++++------- .../java/blackjack/domain/card/DeckTest.java | 10 ++++- .../domain/participant/PlayersTest.java | 10 +++-- 8 files changed, 83 insertions(+), 55 deletions(-) diff --git a/src/main/java/blackjack/controller/BlackjackController.java b/src/main/java/blackjack/controller/BlackjackController.java index 791973e..e918138 100644 --- a/src/main/java/blackjack/controller/BlackjackController.java +++ b/src/main/java/blackjack/controller/BlackjackController.java @@ -1,14 +1,20 @@ package blackjack.controller; import blackjack.domain.GameSystem; +import blackjack.domain.card.Deck; import blackjack.domain.dto.CardsResponse; import blackjack.domain.dto.DealerAndPlayerCardsResponse; +import blackjack.domain.participant.Dealer; +import blackjack.domain.participant.Person; +import blackjack.domain.participant.Players; import blackjack.view.InputView; import blackjack.view.OutputView; import java.util.List; public class BlackjackController { + private final static String DEFAULT_DEALER_NAME = "딜러"; + private final InputView inputView; private final OutputView outputView; @@ -25,7 +31,10 @@ public void run() { } private GameSystem setup(final List playerNames) { - GameSystem gameSystem = GameSystem.create(playerNames); + Deck deck = new Deck(); + Person dealer = new Dealer(DEFAULT_DEALER_NAME, deck.getTwoCards()); + Players players = new Players(playerNames, deck); + GameSystem gameSystem = new GameSystem(dealer, players, deck); outputView.printGameStart(gameSystem.getPlayerNames()); DealerAndPlayerCardsResponse dealerAndPlayerCardsResponse = new DealerAndPlayerCardsResponse(gameSystem.getDealerCards(), gameSystem.getPlayerCards()); outputView.printFirstTwoCards(gameSystem.getPlayerNames(), dealerAndPlayerCardsResponse); diff --git a/src/main/java/blackjack/domain/GameSystem.java b/src/main/java/blackjack/domain/GameSystem.java index 4db1d3d..9707335 100644 --- a/src/main/java/blackjack/domain/GameSystem.java +++ b/src/main/java/blackjack/domain/GameSystem.java @@ -3,9 +3,7 @@ import blackjack.domain.card.Card; import blackjack.domain.card.Deck; import blackjack.domain.card.GivenCards; -import blackjack.domain.participant.Dealer; import blackjack.domain.participant.Person; -import blackjack.domain.participant.Player; import blackjack.domain.participant.Players; import java.util.Collections; @@ -14,22 +12,17 @@ public class GameSystem { public static final int BLACKJACK = 21; - private static final String DEFAULT_DEALER_NAME = "딜러"; private static final String ACCEPT_ANSWER = "y"; private static final String DECLINE_ANSWER = "n"; + private final Deck deck; private final Person dealer; private final Players players; - protected GameSystem(final Person dealer, final Players players) { + public GameSystem(final Person dealer, final Players players, final Deck deck) { this.dealer = dealer; this.players = players; - } - - public static GameSystem create(final List playerNames) { - return new GameSystem(new Dealer(DEFAULT_DEALER_NAME, Deck.getTwoCards()), new Players(playerNames.stream() - .map(name -> new Player(name, Deck.getTwoCards())) - .collect(Collectors.toList()))); + this.deck = deck; } public List getPlayerNames() { @@ -63,7 +56,7 @@ public void hit(final String answer, final String name) { return; } - player.hit(Deck.getCard()); + player.hit(deck.getCard()); } private void validate(final String answer) { @@ -73,7 +66,7 @@ private void validate(final String answer) { } public void hit() { - dealer.hit(Deck.getCard()); + dealer.hit(deck.getCard()); } public boolean isDealerFinished() { diff --git a/src/main/java/blackjack/domain/card/Card.java b/src/main/java/blackjack/domain/card/Card.java index 0b23e2d..041b31f 100644 --- a/src/main/java/blackjack/domain/card/Card.java +++ b/src/main/java/blackjack/domain/card/Card.java @@ -4,6 +4,7 @@ import blackjack.domain.enums.Suit; import java.util.Arrays; +import java.util.Collection; import java.util.Map; import java.util.Objects; import java.util.function.Function; @@ -41,6 +42,10 @@ public static Card from(final Score score, final Suit suit) { return CARDS.get(key); } + public static Collection getDeck() { + return CARDS.values(); + } + public int getScore() { return score.getScore(); } diff --git a/src/main/java/blackjack/domain/card/Deck.java b/src/main/java/blackjack/domain/card/Deck.java index dc78061..6bd1179 100644 --- a/src/main/java/blackjack/domain/card/Deck.java +++ b/src/main/java/blackjack/domain/card/Deck.java @@ -1,11 +1,7 @@ package blackjack.domain.card; -import blackjack.domain.enums.Score; -import blackjack.domain.enums.Suit; - import java.util.ArrayDeque; import java.util.ArrayList; -import java.util.Arrays; import java.util.Collections; import java.util.Deque; import java.util.List; @@ -14,30 +10,21 @@ public class Deck { static final int TWO_CARDS = 2; - private static final Deque cards = new ArrayDeque<>(); - - static { - List cards = new ArrayList<>(); - - for (final Score score : Score.values()) { - Arrays.stream(Suit.values()) - .forEach(suit -> cards.add(Card.from(score, suit))); - } + private final Deque deck; + public Deck() { + List cards = new ArrayList<>(Card.getDeck()); Collections.shuffle(cards); - Deck.cards.addAll(cards); - } - - private Deck() { + this.deck = new ArrayDeque<>(cards); } - public static Card getCard() { - return cards.pop(); + public Card getCard() { + return deck.pop(); } - public static GivenCards getTwoCards() { + public GivenCards getTwoCards() { return new GivenCards(Collections.unmodifiableList(IntStream.range(0, TWO_CARDS) - .mapToObj(i -> cards.pop()) + .mapToObj(i -> deck.pop()) .collect(Collectors.toList()))); } } diff --git a/src/main/java/blackjack/domain/participant/Players.java b/src/main/java/blackjack/domain/participant/Players.java index 92c6e52..56f1847 100644 --- a/src/main/java/blackjack/domain/participant/Players.java +++ b/src/main/java/blackjack/domain/participant/Players.java @@ -1,5 +1,6 @@ package blackjack.domain.participant; +import blackjack.domain.card.Deck; import blackjack.domain.card.GivenCards; import java.util.ArrayList; @@ -16,6 +17,16 @@ public Players(final List players) { converToMap(players); } + public Players(final List playerNames, final Deck deck) { + this(createPlayers(playerNames, deck)); + } + + private static List createPlayers(final List playerNames, final Deck deck) { + return playerNames.stream() + .map(playerName -> new Player(playerName, deck.getTwoCards())) + .collect(Collectors.toList()); + } + private void converToMap(List players) { players.forEach(player -> this.players.put(player.getName(), player)); } diff --git a/src/test/java/blackjack/domain/GameSystemTest.java b/src/test/java/blackjack/domain/GameSystemTest.java index 8a2436f..020996c 100644 --- a/src/test/java/blackjack/domain/GameSystemTest.java +++ b/src/test/java/blackjack/domain/GameSystemTest.java @@ -31,9 +31,12 @@ void getPlayerNames() { String name1 = "pobi"; String name2 = "tobi"; List names = Arrays.asList(name1, name2); + Deck deck = new Deck(); + Dealer dealer = new Dealer("딜러", new GivenCards(Collections.emptyList())); + Players players = new Players(names, deck); //when - GameSystem gameSystem = GameSystem.create(names); + GameSystem gameSystem = new GameSystem(dealer, players, deck); //then assertThat(gameSystem.getPlayerNames()).hasSize(2) @@ -41,12 +44,13 @@ void getPlayerNames() { } @Test - @DisplayName("딜러의 모든 카드를 반환한다,") + @DisplayName("딜러의 모든 카드를 반환한다.") void getDealerCards() { //give - Dealer dealer = new Dealer("딜러", Deck.getTwoCards()); - Players players = new Players(Collections.emptyList()); - GameSystem gameSystem = new GameSystem(dealer, players); + Deck deck = new Deck(); + Dealer dealer = new Dealer("딜러", deck.getTwoCards()); + Players players = new Players(Collections.emptyList(), deck); + GameSystem gameSystem = new GameSystem(dealer, players, deck); //when List dealerCards = gameSystem.getDealerCards(); @@ -62,7 +66,10 @@ void getPlayerCards() { String name1 = "pobi"; String name2 = "tobi"; List names = Arrays.asList(name1, name2); - GameSystem gameSystem = GameSystem.create(names); + Deck deck = new Deck(); + Dealer dealer = new Dealer("딜러", new GivenCards(Collections.emptyList())); + Players players = new Players(names, deck); + GameSystem gameSystem = new GameSystem(dealer, players, deck); //when List> allPlayerCards = gameSystem.getPlayerCards(); @@ -84,7 +91,8 @@ void allPlayersFinished(String score1, String score2, boolean expected) { Person player1 = new Player("pobi", new GivenCards(Arrays.asList(card1, card2))); Person player2 = new Player("tobi", new GivenCards(Arrays.asList(card3, card4))); Players players = new Players(Arrays.asList(player1, player2)); - GameSystem gameSystem = new GameSystem(new Dealer("딜러", new GivenCards(Collections.emptyList())), players); + Dealer dealer = new Dealer("딜러", new GivenCards(Collections.emptyList())); + GameSystem gameSystem = new GameSystem(dealer, players, new Deck()); //when boolean isFinished = gameSystem.allPlayersFinished(); @@ -108,7 +116,8 @@ void getCurrentPlayer(String score1, String score2, String score3, String score4 Person player2 = new Player("player2", new GivenCards(Arrays.asList(card3, card4))); Person player3 = new Player("player3", new GivenCards(Arrays.asList(card5, card6))); Players players = new Players(Arrays.asList(player1, player2, player3)); - GameSystem gameSystem = new GameSystem(new Dealer("딜러", new GivenCards(Collections.emptyList())), players); + Dealer dealer = new Dealer("dealer", new GivenCards(Collections.emptyList())); + GameSystem gameSystem = new GameSystem(dealer, players, new Deck()); //when String player = gameSystem.getCurrentPlayer(); @@ -127,7 +136,8 @@ void hit(String answer, int expectedSize) { Card card2 = Card.from(Score.A, Suit.CLUB); Person player = new Player(name, new GivenCards(Arrays.asList(card1, card2))); Players players = new Players(Collections.singletonList(player)); - GameSystem gameSystem = new GameSystem(new Dealer("딜러", new GivenCards(Collections.emptyList())), players); + Dealer dealer = new Dealer("딜러", new GivenCards(Collections.emptyList())); + GameSystem gameSystem = new GameSystem(dealer, players, new Deck()); //when gameSystem.hit(answer, name); @@ -146,7 +156,8 @@ void hit_with_invalid_answer(String answer) { Card card2 = Card.from(Score.A, Suit.CLUB); Person player = new Player(name, new GivenCards(Arrays.asList(card1, card2))); Players players = new Players(Collections.singletonList(player)); - GameSystem gameSystem = new GameSystem(new Dealer("딜러", new GivenCards(Collections.emptyList())), players); + Dealer dealer = new Dealer("딜러", new GivenCards(Collections.emptyList())); + GameSystem gameSystem = new GameSystem(dealer, players, new Deck()); //when //then assertThatThrownBy(() -> gameSystem.hit(answer, name)) @@ -162,7 +173,8 @@ void hit_for_dealer() { Card card2 = Card.from(Score.TWO, Suit.HEART); GivenCards givenCards = new GivenCards(Arrays.asList(card1, card2)); Players players = new Players(Collections.emptyList()); - GameSystem gameSystem = new GameSystem(new Dealer("딜러", givenCards), players); + Dealer dealer = new Dealer("딜러", givenCards); + GameSystem gameSystem = new GameSystem(dealer, players, new Deck()); //when gameSystem.hit(); @@ -180,7 +192,8 @@ void getCards() { Card card2 = Card.from(Score.A, Suit.CLUB); Person player = new Player(name, new GivenCards(Arrays.asList(card1, card2))); Players players = new Players(Collections.singletonList(player)); - GameSystem gameSystem = new GameSystem(new Dealer("딜러", new GivenCards(Collections.emptyList())), players); + Dealer dealer = new Dealer("딜러", new GivenCards(Collections.emptyList())); + GameSystem gameSystem = new GameSystem(dealer, players, new Deck()); //when List cards = gameSystem.getCards(name); @@ -199,7 +212,7 @@ void getDealerScore() { GivenCards givenCards = new GivenCards(Arrays.asList(card1, card2)); Dealer dealer = new Dealer("딜러", givenCards); Players players = new Players(Collections.emptyList()); - GameSystem gameSystem = new GameSystem(dealer, players); + GameSystem gameSystem = new GameSystem(dealer, players, new Deck()); //when int dealerScore = gameSystem.getDealerScore(); @@ -220,7 +233,8 @@ void getPlayerScores(String score1, String score2, String score3, String score4, Person player1 = new Player("player1", new GivenCards(Arrays.asList(card1, card2))); Person player2 = new Player("player2", new GivenCards(Arrays.asList(card3, card4))); Players players = new Players(Arrays.asList(player1, player2)); - GameSystem gameSystem = new GameSystem(new Dealer("딜러", new GivenCards(Collections.emptyList())), players); + Dealer dealer = new Dealer("딜러", new GivenCards(Collections.emptyList())); + GameSystem gameSystem = new GameSystem(dealer, players, new Deck()); //when List playerScores = gameSystem.getPlayerScores(); @@ -245,7 +259,8 @@ void getResults(String score1, String score2, String answer, int expectedResult1 Card card6 = Card.from(Score.EIGHT, Suit.DIAMOND); GivenCards dealerCards = new GivenCards(Arrays.asList(card5, card6)); Players players = new Players(Arrays.asList(player1, player2)); - GameSystem gameSystem = new GameSystem(new Dealer("딜러", dealerCards), players); + Dealer dealer = new Dealer("딜러", dealerCards); + GameSystem gameSystem = new GameSystem(dealer, players, new Deck()); gameSystem.hit(answer, "player2"); //when diff --git a/src/test/java/blackjack/domain/card/DeckTest.java b/src/test/java/blackjack/domain/card/DeckTest.java index c854bf2..a4f4436 100644 --- a/src/test/java/blackjack/domain/card/DeckTest.java +++ b/src/test/java/blackjack/domain/card/DeckTest.java @@ -10,8 +10,11 @@ public class DeckTest { @Test @DisplayName("카드 한 장을 반환한다.") void getCard() { + //given + Deck deck = new Deck(); + //when - Card card = Deck.getCard(); + Card card = deck.getCard(); //then assertThat(card).isNotNull(); @@ -20,8 +23,11 @@ void getCard() { @Test @DisplayName("카드 두 장을 반환한다.") void getTwoCards() { + //given + Deck deck = new Deck(); + //when - GivenCards cards = Deck.getTwoCards(); + GivenCards cards = deck.getTwoCards(); //then assertThat(cards.list()).hasSize(2); diff --git a/src/test/java/blackjack/domain/participant/PlayersTest.java b/src/test/java/blackjack/domain/participant/PlayersTest.java index 67ac534..0e53d01 100644 --- a/src/test/java/blackjack/domain/participant/PlayersTest.java +++ b/src/test/java/blackjack/domain/participant/PlayersTest.java @@ -22,10 +22,11 @@ class PlayersTest { @DisplayName("플레이어의 이름을 반환한다.") void getPlayerNames() { //given + Deck deck = new Deck(); String name1 = "pobi"; - Player player1 = new Player(name1, Deck.getTwoCards()); + Player player1 = new Player(name1, deck.getTwoCards()); String name2 = "tobi"; - Player player2 = new Player(name2, Deck.getTwoCards()); + Player player2 = new Player(name2, deck.getTwoCards()); Players players = new Players(Arrays.asList(player1, player2)); //when @@ -40,10 +41,11 @@ void getPlayerNames() { @DisplayName("플레이어들의 모든 카드를 반환한다.") void getPlayerCards() { //given + Deck deck = new Deck(); String name1 = "pobi"; - Player player1 = new Player(name1, Deck.getTwoCards()); + Player player1 = new Player(name1, deck.getTwoCards()); String name2 = "tobi"; - Player player2 = new Player(name2, Deck.getTwoCards()); + Player player2 = new Player(name2, deck.getTwoCards()); Players players = new Players(Arrays.asList(player1, player2)); //when From ef17f1630ce7f525e6679d819be6d052b6a7c6b3 Mon Sep 17 00:00:00 2001 From: Beenie93 Date: Sun, 8 Aug 2021 04:30:49 +0900 Subject: [PATCH 73/80] =?UTF-8?q?feat:=20GameSystem=20=EC=83=9D=EC=84=B1?= =?UTF-8?q?=EC=9E=90=20=EC=B6=94=EA=B0=80?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../blackjack/controller/BlackjackController.java | 10 +--------- src/main/java/blackjack/domain/GameSystem.java | 6 ++++++ src/test/java/blackjack/domain/GameSystemTest.java | 13 ++++--------- 3 files changed, 11 insertions(+), 18 deletions(-) diff --git a/src/main/java/blackjack/controller/BlackjackController.java b/src/main/java/blackjack/controller/BlackjackController.java index e918138..4246746 100644 --- a/src/main/java/blackjack/controller/BlackjackController.java +++ b/src/main/java/blackjack/controller/BlackjackController.java @@ -4,17 +4,12 @@ import blackjack.domain.card.Deck; import blackjack.domain.dto.CardsResponse; import blackjack.domain.dto.DealerAndPlayerCardsResponse; -import blackjack.domain.participant.Dealer; -import blackjack.domain.participant.Person; -import blackjack.domain.participant.Players; import blackjack.view.InputView; import blackjack.view.OutputView; import java.util.List; public class BlackjackController { - private final static String DEFAULT_DEALER_NAME = "딜러"; - private final InputView inputView; private final OutputView outputView; @@ -31,10 +26,7 @@ public void run() { } private GameSystem setup(final List playerNames) { - Deck deck = new Deck(); - Person dealer = new Dealer(DEFAULT_DEALER_NAME, deck.getTwoCards()); - Players players = new Players(playerNames, deck); - GameSystem gameSystem = new GameSystem(dealer, players, deck); + GameSystem gameSystem = new GameSystem(playerNames, new Deck()); outputView.printGameStart(gameSystem.getPlayerNames()); DealerAndPlayerCardsResponse dealerAndPlayerCardsResponse = new DealerAndPlayerCardsResponse(gameSystem.getDealerCards(), gameSystem.getPlayerCards()); outputView.printFirstTwoCards(gameSystem.getPlayerNames(), dealerAndPlayerCardsResponse); diff --git a/src/main/java/blackjack/domain/GameSystem.java b/src/main/java/blackjack/domain/GameSystem.java index 9707335..7b7a443 100644 --- a/src/main/java/blackjack/domain/GameSystem.java +++ b/src/main/java/blackjack/domain/GameSystem.java @@ -3,6 +3,7 @@ import blackjack.domain.card.Card; import blackjack.domain.card.Deck; import blackjack.domain.card.GivenCards; +import blackjack.domain.participant.Dealer; import blackjack.domain.participant.Person; import blackjack.domain.participant.Players; @@ -12,6 +13,7 @@ public class GameSystem { public static final int BLACKJACK = 21; + private static final String DEFAULT_DEALER_NAME = "딜러"; private static final String ACCEPT_ANSWER = "y"; private static final String DECLINE_ANSWER = "n"; @@ -19,6 +21,10 @@ public class GameSystem { private final Person dealer; private final Players players; + public GameSystem(final List playerNames, final Deck deck) { + this(new Dealer(DEFAULT_DEALER_NAME, deck.getTwoCards()), new Players(playerNames, deck), deck); + } + public GameSystem(final Person dealer, final Players players, final Deck deck) { this.dealer = dealer; this.players = players; diff --git a/src/test/java/blackjack/domain/GameSystemTest.java b/src/test/java/blackjack/domain/GameSystemTest.java index 020996c..c4516cd 100644 --- a/src/test/java/blackjack/domain/GameSystemTest.java +++ b/src/test/java/blackjack/domain/GameSystemTest.java @@ -32,11 +32,9 @@ void getPlayerNames() { String name2 = "tobi"; List names = Arrays.asList(name1, name2); Deck deck = new Deck(); - Dealer dealer = new Dealer("딜러", new GivenCards(Collections.emptyList())); - Players players = new Players(names, deck); //when - GameSystem gameSystem = new GameSystem(dealer, players, deck); + GameSystem gameSystem = new GameSystem(names, deck); //then assertThat(gameSystem.getPlayerNames()).hasSize(2) @@ -48,9 +46,8 @@ void getPlayerNames() { void getDealerCards() { //give Deck deck = new Deck(); - Dealer dealer = new Dealer("딜러", deck.getTwoCards()); - Players players = new Players(Collections.emptyList(), deck); - GameSystem gameSystem = new GameSystem(dealer, players, deck); + List playerNames = Arrays.asList("pobi", "dobi"); + GameSystem gameSystem = new GameSystem(playerNames, deck); //when List dealerCards = gameSystem.getDealerCards(); @@ -67,9 +64,7 @@ void getPlayerCards() { String name2 = "tobi"; List names = Arrays.asList(name1, name2); Deck deck = new Deck(); - Dealer dealer = new Dealer("딜러", new GivenCards(Collections.emptyList())); - Players players = new Players(names, deck); - GameSystem gameSystem = new GameSystem(dealer, players, deck); + GameSystem gameSystem = new GameSystem(names, deck); //when List> allPlayerCards = gameSystem.getPlayerCards(); From af9c00258591acdeef6fb92deefaf1a1ed286cf6 Mon Sep 17 00:00:00 2001 From: Beenie93 Date: Sun, 8 Aug 2021 11:05:57 +0900 Subject: [PATCH 74/80] =?UTF-8?q?refactor:=20=EC=99=B8=EB=B6=80=EC=97=90?= =?UTF-8?q?=EC=84=9C=20new=20=ED=82=A4=EC=9B=8C=EB=93=9C=EB=A1=9C=20GameSy?= =?UTF-8?q?stem=20=EC=83=9D=EC=84=B1=ED=95=98=EC=A7=80=20=EB=AA=BB?= =?UTF-8?q?=ED=95=98=EA=B2=8C=20=EC=88=98=EC=A0=95?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../blackjack/controller/BlackjackController.java | 3 +-- src/main/java/blackjack/domain/GameSystem.java | 11 ++++++----- src/test/java/blackjack/domain/GameSystemTest.java | 7 +++---- 3 files changed, 10 insertions(+), 11 deletions(-) diff --git a/src/main/java/blackjack/controller/BlackjackController.java b/src/main/java/blackjack/controller/BlackjackController.java index 4246746..791973e 100644 --- a/src/main/java/blackjack/controller/BlackjackController.java +++ b/src/main/java/blackjack/controller/BlackjackController.java @@ -1,7 +1,6 @@ package blackjack.controller; import blackjack.domain.GameSystem; -import blackjack.domain.card.Deck; import blackjack.domain.dto.CardsResponse; import blackjack.domain.dto.DealerAndPlayerCardsResponse; import blackjack.view.InputView; @@ -26,7 +25,7 @@ public void run() { } private GameSystem setup(final List playerNames) { - GameSystem gameSystem = new GameSystem(playerNames, new Deck()); + GameSystem gameSystem = GameSystem.create(playerNames); outputView.printGameStart(gameSystem.getPlayerNames()); DealerAndPlayerCardsResponse dealerAndPlayerCardsResponse = new DealerAndPlayerCardsResponse(gameSystem.getDealerCards(), gameSystem.getPlayerCards()); outputView.printFirstTwoCards(gameSystem.getPlayerNames(), dealerAndPlayerCardsResponse); diff --git a/src/main/java/blackjack/domain/GameSystem.java b/src/main/java/blackjack/domain/GameSystem.java index 7b7a443..256d1de 100644 --- a/src/main/java/blackjack/domain/GameSystem.java +++ b/src/main/java/blackjack/domain/GameSystem.java @@ -21,16 +21,17 @@ public class GameSystem { private final Person dealer; private final Players players; - public GameSystem(final List playerNames, final Deck deck) { - this(new Dealer(DEFAULT_DEALER_NAME, deck.getTwoCards()), new Players(playerNames, deck), deck); - } - - public GameSystem(final Person dealer, final Players players, final Deck deck) { + protected GameSystem(final Person dealer, final Players players, final Deck deck) { this.dealer = dealer; this.players = players; this.deck = deck; } + public static GameSystem create(final List playerNames) { + Deck deck = new Deck(); + return new GameSystem(new Dealer(DEFAULT_DEALER_NAME, deck.getTwoCards()), new Players(playerNames, deck), deck); + } + public List getPlayerNames() { return players.getPlayerNames(); } diff --git a/src/test/java/blackjack/domain/GameSystemTest.java b/src/test/java/blackjack/domain/GameSystemTest.java index c4516cd..ce34db3 100644 --- a/src/test/java/blackjack/domain/GameSystemTest.java +++ b/src/test/java/blackjack/domain/GameSystemTest.java @@ -31,10 +31,9 @@ void getPlayerNames() { String name1 = "pobi"; String name2 = "tobi"; List names = Arrays.asList(name1, name2); - Deck deck = new Deck(); //when - GameSystem gameSystem = new GameSystem(names, deck); + GameSystem gameSystem = GameSystem.create(names); //then assertThat(gameSystem.getPlayerNames()).hasSize(2) @@ -47,7 +46,7 @@ void getDealerCards() { //give Deck deck = new Deck(); List playerNames = Arrays.asList("pobi", "dobi"); - GameSystem gameSystem = new GameSystem(playerNames, deck); + GameSystem gameSystem = GameSystem.create(playerNames); //when List dealerCards = gameSystem.getDealerCards(); @@ -64,7 +63,7 @@ void getPlayerCards() { String name2 = "tobi"; List names = Arrays.asList(name1, name2); Deck deck = new Deck(); - GameSystem gameSystem = new GameSystem(names, deck); + GameSystem gameSystem = GameSystem.create(names); //when List> allPlayerCards = gameSystem.getPlayerCards(); From 27b59a89060b2c962c62b71a7556928aee0aeeb8 Mon Sep 17 00:00:00 2001 From: Beenie93 Date: Sun, 8 Aug 2021 11:07:02 +0900 Subject: [PATCH 75/80] =?UTF-8?q?refactor:=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=B3=80=EC=88=98=20=EC=A0=9C?= =?UTF-8?q?=EA=B1=B0?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- src/test/java/blackjack/domain/GameSystemTest.java | 2 -- 1 file changed, 2 deletions(-) diff --git a/src/test/java/blackjack/domain/GameSystemTest.java b/src/test/java/blackjack/domain/GameSystemTest.java index ce34db3..772fe48 100644 --- a/src/test/java/blackjack/domain/GameSystemTest.java +++ b/src/test/java/blackjack/domain/GameSystemTest.java @@ -44,7 +44,6 @@ void getPlayerNames() { @DisplayName("딜러의 모든 카드를 반환한다.") void getDealerCards() { //give - Deck deck = new Deck(); List playerNames = Arrays.asList("pobi", "dobi"); GameSystem gameSystem = GameSystem.create(playerNames); @@ -62,7 +61,6 @@ void getPlayerCards() { String name1 = "pobi"; String name2 = "tobi"; List names = Arrays.asList(name1, name2); - Deck deck = new Deck(); GameSystem gameSystem = GameSystem.create(names); //when From fb7caf3a7d5fe1f2de8b6be0a711e6e710f00b7c Mon Sep 17 00:00:00 2001 From: Beenie93 Date: Sun, 8 Aug 2021 12:01:52 +0900 Subject: [PATCH 76/80] =?UTF-8?q?style:=20dto=20=ED=8C=A8=ED=82=A4?= =?UTF-8?q?=EC=A7=80=20=EA=B2=BD=EB=A1=9C=20=EC=88=98=EC=A0=95?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../controller/BlackjackController.java | 4 +- .../blackjack/domain/dto/CardResponse.java | 19 ------ .../blackjack/domain/dto/CardsResponse.java | 20 ------ .../dto/DealerAndPlayerCardsResponse.java | 27 -------- src/main/java/blackjack/view/OutputView.java | 6 +- .../domain/dto/CardResponseTest.java | 40 ------------ .../domain/dto/CardsResponseTest.java | 38 ----------- .../dto/DealerAndPlayerCardsResponseTest.java | 65 ------------------- 8 files changed, 5 insertions(+), 214 deletions(-) delete mode 100644 src/main/java/blackjack/domain/dto/CardResponse.java delete mode 100644 src/main/java/blackjack/domain/dto/CardsResponse.java delete mode 100644 src/main/java/blackjack/domain/dto/DealerAndPlayerCardsResponse.java delete mode 100644 src/test/java/blackjack/domain/dto/CardResponseTest.java delete mode 100644 src/test/java/blackjack/domain/dto/CardsResponseTest.java delete mode 100644 src/test/java/blackjack/domain/dto/DealerAndPlayerCardsResponseTest.java diff --git a/src/main/java/blackjack/controller/BlackjackController.java b/src/main/java/blackjack/controller/BlackjackController.java index 791973e..965c1a3 100644 --- a/src/main/java/blackjack/controller/BlackjackController.java +++ b/src/main/java/blackjack/controller/BlackjackController.java @@ -1,8 +1,8 @@ package blackjack.controller; +import blackjack.controller.dto.CardsResponse; +import blackjack.controller.dto.DealerAndPlayerCardsResponse; import blackjack.domain.GameSystem; -import blackjack.domain.dto.CardsResponse; -import blackjack.domain.dto.DealerAndPlayerCardsResponse; import blackjack.view.InputView; import blackjack.view.OutputView; diff --git a/src/main/java/blackjack/domain/dto/CardResponse.java b/src/main/java/blackjack/domain/dto/CardResponse.java deleted file mode 100644 index 707c3b2..0000000 --- a/src/main/java/blackjack/domain/dto/CardResponse.java +++ /dev/null @@ -1,19 +0,0 @@ -package blackjack.domain.dto; - -public class CardResponse { - private final String denomination; - private final String suit; - - public CardResponse(final String denomination, final String suit) { - this.denomination = denomination; - this.suit = suit; - } - - public String getDenomination() { - return denomination; - } - - public String getSuit() { - return suit; - } -} diff --git a/src/main/java/blackjack/domain/dto/CardsResponse.java b/src/main/java/blackjack/domain/dto/CardsResponse.java deleted file mode 100644 index 9a81684..0000000 --- a/src/main/java/blackjack/domain/dto/CardsResponse.java +++ /dev/null @@ -1,20 +0,0 @@ -package blackjack.domain.dto; - -import blackjack.domain.card.Card; - -import java.util.List; -import java.util.stream.Collectors; - -public class CardsResponse { - private final List cards; - - public CardsResponse(final List cards) { - this.cards = cards; - } - - public List getCards() { - return cards.stream() - .map(card -> new CardResponse(card.getDenomination(), card.getSuit())) - .collect(Collectors.toList()); - } -} diff --git a/src/main/java/blackjack/domain/dto/DealerAndPlayerCardsResponse.java b/src/main/java/blackjack/domain/dto/DealerAndPlayerCardsResponse.java deleted file mode 100644 index e6525a3..0000000 --- a/src/main/java/blackjack/domain/dto/DealerAndPlayerCardsResponse.java +++ /dev/null @@ -1,27 +0,0 @@ -package blackjack.domain.dto; - -import blackjack.domain.card.Card; - -import java.util.ArrayList; -import java.util.List; -import java.util.stream.Collectors; - -public class DealerAndPlayerCardsResponse { - private final List dealerCards; - private final List> playerCards; - - public DealerAndPlayerCardsResponse(final List dealerCards, final List> playerCards) { - this.dealerCards = dealerCards; - this.playerCards = new ArrayList<>(playerCards); - } - - public CardsResponse getDealerCards() { - return new CardsResponse(dealerCards); - } - - public List getAllPlayerCards() { - return playerCards.stream() - .map(CardsResponse::new) - .collect(Collectors.toList()); - } -} diff --git a/src/main/java/blackjack/view/OutputView.java b/src/main/java/blackjack/view/OutputView.java index edab733..3586043 100644 --- a/src/main/java/blackjack/view/OutputView.java +++ b/src/main/java/blackjack/view/OutputView.java @@ -1,8 +1,8 @@ package blackjack.view; -import blackjack.domain.dto.CardResponse; -import blackjack.domain.dto.CardsResponse; -import blackjack.domain.dto.DealerAndPlayerCardsResponse; +import blackjack.controller.dto.CardResponse; +import blackjack.controller.dto.CardsResponse; +import blackjack.controller.dto.DealerAndPlayerCardsResponse; import java.util.HashMap; import java.util.List; diff --git a/src/test/java/blackjack/domain/dto/CardResponseTest.java b/src/test/java/blackjack/domain/dto/CardResponseTest.java deleted file mode 100644 index addc4cb..0000000 --- a/src/test/java/blackjack/domain/dto/CardResponseTest.java +++ /dev/null @@ -1,40 +0,0 @@ -package blackjack.domain.dto; - -import blackjack.domain.card.Card; -import blackjack.domain.enums.Score; -import blackjack.domain.enums.Suit; -import org.junit.jupiter.api.DisplayName; -import org.junit.jupiter.api.Test; - -import static org.assertj.core.api.Assertions.assertThat; - -public class CardResponseTest { - - @Test - @DisplayName("카드의 점수 이름(끗수)을 반환한다.") - void getScore() { - //given - Card card = Card.from(Score.A, Suit.CLUB); - CardResponse cardResponse = new CardResponse(card.getDenomination(), card.getSuit()); - - //when - String denomination = cardResponse.getDenomination(); - - //then - assertThat(denomination).isEqualTo(Score.A.getDenomination()); - } - - @Test - @DisplayName("카드의 무늬를 반환한다.") - void getSuit() { - //given - Card card = Card.from(Score.A, Suit.CLUB); - CardResponse cardResponse = new CardResponse(card.getDenomination(), card.getSuit()); - - //when - String suit = cardResponse.getSuit(); - - //then - assertThat(suit).isEqualTo(Suit.CLUB.getSuit()); - } -} diff --git a/src/test/java/blackjack/domain/dto/CardsResponseTest.java b/src/test/java/blackjack/domain/dto/CardsResponseTest.java deleted file mode 100644 index 28771c9..0000000 --- a/src/test/java/blackjack/domain/dto/CardsResponseTest.java +++ /dev/null @@ -1,38 +0,0 @@ -package blackjack.domain.dto; - -import blackjack.domain.card.Card; -import blackjack.domain.enums.Score; -import blackjack.domain.enums.Suit; -import org.junit.jupiter.api.DisplayName; -import org.junit.jupiter.api.Test; - -import java.util.Arrays; -import java.util.List; - -import static org.assertj.core.api.Assertions.assertThat; -import static org.assertj.core.api.Assertions.tuple; - -public class CardsResponseTest { - - @Test - @DisplayName("모든 카드를 반환한다.") - void getCards() { - //given - Score ace = Score.A; - Suit club = Suit.CLUB; - Suit diamond = Suit.DIAMOND; - Card card1 = Card.from(ace, club); - Card card2 = Card.from(ace, diamond); - List playerCards = Arrays.asList(card1, card2); - CardsResponse cardsResponse = new CardsResponse(playerCards); - - //when - List cards = cardsResponse.getCards(); - - //then - assertThat(cards).hasSize(2) - .extracting("denomination", "suit") - .containsOnly(tuple(ace.getDenomination(), club.getSuit()), - tuple(ace.getDenomination(), diamond.getSuit())); - } -} diff --git a/src/test/java/blackjack/domain/dto/DealerAndPlayerCardsResponseTest.java b/src/test/java/blackjack/domain/dto/DealerAndPlayerCardsResponseTest.java deleted file mode 100644 index dffe75c..0000000 --- a/src/test/java/blackjack/domain/dto/DealerAndPlayerCardsResponseTest.java +++ /dev/null @@ -1,65 +0,0 @@ -package blackjack.domain.dto; - -import blackjack.domain.card.Card; -import blackjack.domain.enums.Score; -import blackjack.domain.enums.Suit; -import org.junit.jupiter.api.DisplayName; -import org.junit.jupiter.api.Test; - -import java.util.Arrays; -import java.util.Collections; -import java.util.List; - -import static org.assertj.core.api.Assertions.assertThat; -import static org.assertj.core.api.Assertions.tuple; - -public class DealerAndPlayerCardsResponseTest { - - @Test - @DisplayName("딜러 카드를 반환한다.") - void getDealerCards() { - //given - Score ace = Score.A; - Suit club = Suit.CLUB; - Suit diamond = Suit.DIAMOND; - Card card1 = Card.from(ace, club); - Card card2 = Card.from(ace, diamond); - List dealerCards = Arrays.asList(card1, card2); - DealerAndPlayerCardsResponse dealerAndPlayerCardsResponse = new DealerAndPlayerCardsResponse(dealerCards, Collections.emptyList()); - - //when - CardsResponse dealerCard = dealerAndPlayerCardsResponse.getDealerCards(); - - //then - assertThat(dealerCard.getCards()).hasSize(2) - .extracting("denomination", "suit") - .containsOnly(tuple(ace.getDenomination(), club.getSuit()), - tuple(ace.getDenomination(), diamond.getSuit())); - } - - @Test - @DisplayName("모든 플레이어의 카드를 반환한다.") - void getAllPlayerCards() { - //given - Score ace = Score.A; - Suit club = Suit.CLUB; - Suit diamond = Suit.DIAMOND; - Card card1 = Card.from(ace, club); - Card card2 = Card.from(ace, diamond); - List playerCards = Arrays.asList(card1, card2); - List> allPlayerCards = Arrays.asList(playerCards, playerCards, playerCards); - DealerAndPlayerCardsResponse dealerAndPlayerCardsResponse = new DealerAndPlayerCardsResponse(Collections.emptyList(), allPlayerCards); - - //when - List allPlayerCardsResponse = dealerAndPlayerCardsResponse.getAllPlayerCards(); - - //then - assertThat(allPlayerCardsResponse).hasSize(3); - allPlayerCardsResponse.forEach( - playerCardsResponse -> assertThat(playerCardsResponse.getCards()).hasSize(2) - .extracting("denomination", "suit") - .containsOnly(tuple(ace.getDenomination(), club.getSuit()), - tuple(ace.getDenomination(), diamond.getSuit())) - ); - } -} From e3dac27046bfcb62a2cbbee2b00cc34f8439793b Mon Sep 17 00:00:00 2001 From: Beenie93 Date: Mon, 9 Aug 2021 00:12:10 +0900 Subject: [PATCH 77/80] =?UTF-8?q?style:=20dto=20=ED=8C=A8=ED=82=A4?= =?UTF-8?q?=EC=A7=80=20=EA=B2=BD=EB=A1=9C=20=EC=88=98=EC=A0=95?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../controller/dto/CardResponse.java | 19 ++++++ .../controller/dto/CardsResponse.java | 20 ++++++ .../dto/DealerAndPlayerCardsResponse.java | 27 ++++++++ .../controller/dto/CardResponseTest.java | 40 ++++++++++++ .../controller/dto/CardsResponseTest.java | 38 +++++++++++ .../dto/DealerAndPlayerCardsResponseTest.java | 65 +++++++++++++++++++ 6 files changed, 209 insertions(+) create mode 100644 src/main/java/blackjack/controller/dto/CardResponse.java create mode 100644 src/main/java/blackjack/controller/dto/CardsResponse.java create mode 100644 src/main/java/blackjack/controller/dto/DealerAndPlayerCardsResponse.java create mode 100644 src/test/java/blackjack/controller/dto/CardResponseTest.java create mode 100644 src/test/java/blackjack/controller/dto/CardsResponseTest.java create mode 100644 src/test/java/blackjack/controller/dto/DealerAndPlayerCardsResponseTest.java diff --git a/src/main/java/blackjack/controller/dto/CardResponse.java b/src/main/java/blackjack/controller/dto/CardResponse.java new file mode 100644 index 0000000..6463e2c --- /dev/null +++ b/src/main/java/blackjack/controller/dto/CardResponse.java @@ -0,0 +1,19 @@ +package blackjack.controller.dto; + +public class CardResponse { + private final String denomination; + private final String suit; + + public CardResponse(final String denomination, final String suit) { + this.denomination = denomination; + this.suit = suit; + } + + public String getDenomination() { + return denomination; + } + + public String getSuit() { + return suit; + } +} diff --git a/src/main/java/blackjack/controller/dto/CardsResponse.java b/src/main/java/blackjack/controller/dto/CardsResponse.java new file mode 100644 index 0000000..a017f79 --- /dev/null +++ b/src/main/java/blackjack/controller/dto/CardsResponse.java @@ -0,0 +1,20 @@ +package blackjack.controller.dto; + +import blackjack.domain.card.Card; + +import java.util.List; +import java.util.stream.Collectors; + +public class CardsResponse { + private final List cards; + + public CardsResponse(final List cards) { + this.cards = cards; + } + + public List getCards() { + return cards.stream() + .map(card -> new CardResponse(card.getDenomination(), card.getSuit())) + .collect(Collectors.toList()); + } +} diff --git a/src/main/java/blackjack/controller/dto/DealerAndPlayerCardsResponse.java b/src/main/java/blackjack/controller/dto/DealerAndPlayerCardsResponse.java new file mode 100644 index 0000000..5da67ba --- /dev/null +++ b/src/main/java/blackjack/controller/dto/DealerAndPlayerCardsResponse.java @@ -0,0 +1,27 @@ +package blackjack.controller.dto; + +import blackjack.domain.card.Card; + +import java.util.ArrayList; +import java.util.List; +import java.util.stream.Collectors; + +public class DealerAndPlayerCardsResponse { + private final List dealerCards; + private final List> playerCards; + + public DealerAndPlayerCardsResponse(final List dealerCards, final List> playerCards) { + this.dealerCards = dealerCards; + this.playerCards = new ArrayList<>(playerCards); + } + + public CardsResponse getDealerCards() { + return new CardsResponse(dealerCards); + } + + public List getAllPlayerCards() { + return playerCards.stream() + .map(CardsResponse::new) + .collect(Collectors.toList()); + } +} diff --git a/src/test/java/blackjack/controller/dto/CardResponseTest.java b/src/test/java/blackjack/controller/dto/CardResponseTest.java new file mode 100644 index 0000000..4a8588e --- /dev/null +++ b/src/test/java/blackjack/controller/dto/CardResponseTest.java @@ -0,0 +1,40 @@ +package blackjack.controller.dto; + +import blackjack.domain.card.Card; +import blackjack.domain.enums.Score; +import blackjack.domain.enums.Suit; +import org.junit.jupiter.api.DisplayName; +import org.junit.jupiter.api.Test; + +import static org.assertj.core.api.Assertions.assertThat; + +public class CardResponseTest { + + @Test + @DisplayName("카드의 점수 이름(끗수)을 반환한다.") + void getScore() { + //given + Card card = Card.from(Score.A, Suit.CLUB); + CardResponse cardResponse = new CardResponse(card.getDenomination(), card.getSuit()); + + //when + String denomination = cardResponse.getDenomination(); + + //then + assertThat(denomination).isEqualTo(Score.A.getDenomination()); + } + + @Test + @DisplayName("카드의 무늬를 반환한다.") + void getSuit() { + //given + Card card = Card.from(Score.A, Suit.CLUB); + CardResponse cardResponse = new CardResponse(card.getDenomination(), card.getSuit()); + + //when + String suit = cardResponse.getSuit(); + + //then + assertThat(suit).isEqualTo(Suit.CLUB.getSuit()); + } +} diff --git a/src/test/java/blackjack/controller/dto/CardsResponseTest.java b/src/test/java/blackjack/controller/dto/CardsResponseTest.java new file mode 100644 index 0000000..763878b --- /dev/null +++ b/src/test/java/blackjack/controller/dto/CardsResponseTest.java @@ -0,0 +1,38 @@ +package blackjack.controller.dto; + +import blackjack.domain.card.Card; +import blackjack.domain.enums.Score; +import blackjack.domain.enums.Suit; +import org.junit.jupiter.api.DisplayName; +import org.junit.jupiter.api.Test; + +import java.util.Arrays; +import java.util.List; + +import static org.assertj.core.api.Assertions.assertThat; +import static org.assertj.core.api.Assertions.tuple; + +public class CardsResponseTest { + + @Test + @DisplayName("모든 카드를 반환한다.") + void getCards() { + //given + Score ace = Score.A; + Suit club = Suit.CLUB; + Suit diamond = Suit.DIAMOND; + Card card1 = Card.from(ace, club); + Card card2 = Card.from(ace, diamond); + List playerCards = Arrays.asList(card1, card2); + CardsResponse cardsResponse = new CardsResponse(playerCards); + + //when + List cards = cardsResponse.getCards(); + + //then + assertThat(cards).hasSize(2) + .extracting("denomination", "suit") + .containsOnly(tuple(ace.getDenomination(), club.getSuit()), + tuple(ace.getDenomination(), diamond.getSuit())); + } +} diff --git a/src/test/java/blackjack/controller/dto/DealerAndPlayerCardsResponseTest.java b/src/test/java/blackjack/controller/dto/DealerAndPlayerCardsResponseTest.java new file mode 100644 index 0000000..73dfe02 --- /dev/null +++ b/src/test/java/blackjack/controller/dto/DealerAndPlayerCardsResponseTest.java @@ -0,0 +1,65 @@ +package blackjack.controller.dto; + +import blackjack.domain.card.Card; +import blackjack.domain.enums.Score; +import blackjack.domain.enums.Suit; +import org.junit.jupiter.api.DisplayName; +import org.junit.jupiter.api.Test; + +import java.util.Arrays; +import java.util.Collections; +import java.util.List; + +import static org.assertj.core.api.Assertions.assertThat; +import static org.assertj.core.api.Assertions.tuple; + +public class DealerAndPlayerCardsResponseTest { + + @Test + @DisplayName("딜러 카드를 반환한다.") + void getDealerCards() { + //given + Score ace = Score.A; + Suit club = Suit.CLUB; + Suit diamond = Suit.DIAMOND; + Card card1 = Card.from(ace, club); + Card card2 = Card.from(ace, diamond); + List dealerCards = Arrays.asList(card1, card2); + DealerAndPlayerCardsResponse dealerAndPlayerCardsResponse = new DealerAndPlayerCardsResponse(dealerCards, Collections.emptyList()); + + //when + CardsResponse dealerCard = dealerAndPlayerCardsResponse.getDealerCards(); + + //then + assertThat(dealerCard.getCards()).hasSize(2) + .extracting("denomination", "suit") + .containsOnly(tuple(ace.getDenomination(), club.getSuit()), + tuple(ace.getDenomination(), diamond.getSuit())); + } + + @Test + @DisplayName("모든 플레이어의 카드를 반환한다.") + void getAllPlayerCards() { + //given + Score ace = Score.A; + Suit club = Suit.CLUB; + Suit diamond = Suit.DIAMOND; + Card card1 = Card.from(ace, club); + Card card2 = Card.from(ace, diamond); + List playerCards = Arrays.asList(card1, card2); + List> allPlayerCards = Arrays.asList(playerCards, playerCards, playerCards); + DealerAndPlayerCardsResponse dealerAndPlayerCardsResponse = new DealerAndPlayerCardsResponse(Collections.emptyList(), allPlayerCards); + + //when + List allPlayerCardsResponse = dealerAndPlayerCardsResponse.getAllPlayerCards(); + + //then + assertThat(allPlayerCardsResponse).hasSize(3); + allPlayerCardsResponse.forEach( + playerCardsResponse -> assertThat(playerCardsResponse.getCards()).hasSize(2) + .extracting("denomination", "suit") + .containsOnly(tuple(ace.getDenomination(), club.getSuit()), + tuple(ace.getDenomination(), diamond.getSuit())) + ); + } +} From fe515c54963e2a021b0f9cfbb0ea90534eb32017 Mon Sep 17 00:00:00 2001 From: Beenie93 Date: Mon, 9 Aug 2021 00:19:14 +0900 Subject: [PATCH 78/80] =?UTF-8?q?refactor:=20@CsvSource=20String=20->=20En?= =?UTF-8?q?um=20=EA=B0=92=EC=9C=BC=EB=A1=9C=20=EC=A0=84=EB=8B=AC=ED=95=98?= =?UTF-8?q?=EA=B2=8C=20=EC=88=98=EC=A0=95?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../java/blackjack/domain/GameSystemTest.java | 32 ++++++++--------- .../java/blackjack/domain/card/CardTest.java | 3 +- .../blackjack/domain/card/GivenCardsTest.java | 8 ++--- .../blackjack/domain/enums/ResultTest.java | 5 +-- .../blackjack/domain/enums/ScoreTest.java | 15 ++------ .../java/blackjack/domain/enums/SuitTest.java | 5 +-- .../domain/participant/DealerTest.java | 8 ++--- .../domain/participant/PlayersTest.java | 34 +++++++++---------- .../domain/state/finished/StayTest.java | 6 ++-- 9 files changed, 50 insertions(+), 66 deletions(-) diff --git a/src/test/java/blackjack/domain/GameSystemTest.java b/src/test/java/blackjack/domain/GameSystemTest.java index 772fe48..eda1b46 100644 --- a/src/test/java/blackjack/domain/GameSystemTest.java +++ b/src/test/java/blackjack/domain/GameSystemTest.java @@ -74,12 +74,12 @@ void getPlayerCards() { @ParameterizedTest @CsvSource(value = {"A, TEN, true", "TEN, TEN, false"}) @DisplayName("모든 플레이어가 종료하였는지 여부를 반환한다.") - void allPlayersFinished(String score1, String score2, boolean expected) { + void allPlayersFinished(Score score1, Score score2, boolean expected) { //given Card card1 = Card.from(Score.A, Suit.DIAMOND); Card card2 = Card.from(Score.J, Suit.DIAMOND); - Card card3 = Card.from(Score.valueOf(score1), Suit.CLUB); - Card card4 = Card.from(Score.valueOf(score2), Suit.CLUB); + Card card3 = Card.from(score1, Suit.CLUB); + Card card4 = Card.from(score2, Suit.CLUB); Person player1 = new Player("pobi", new GivenCards(Arrays.asList(card1, card2))); Person player2 = new Player("tobi", new GivenCards(Arrays.asList(card3, card4))); Players players = new Players(Arrays.asList(player1, player2)); @@ -96,14 +96,14 @@ void allPlayersFinished(String score1, String score2, boolean expected) { @ParameterizedTest @CsvSource(value = {"A, TEN, A, NINE, player3", "TEN, TEN, TEN, TEN, player2"}) @DisplayName("참여 종료상태가 아닌 플레이어 중 먼저 입력 받았던 플레이어의 이름을 반환한다.") - void getCurrentPlayer(String score1, String score2, String score3, String score4, String expectedPlayer) { + void getCurrentPlayer(Score score1, Score score2, Score score3, Score score4, String expectedPlayer) { //given Card card1 = Card.from(Score.A, Suit.DIAMOND); Card card2 = Card.from(Score.J, Suit.DIAMOND); - Card card3 = Card.from(Score.valueOf(score1), Suit.CLUB); - Card card4 = Card.from(Score.valueOf(score2), Suit.CLUB); - Card card5 = Card.from(Score.valueOf(score3), Suit.HEART); - Card card6 = Card.from(Score.valueOf(score4), Suit.HEART); + Card card3 = Card.from(score1, Suit.CLUB); + Card card4 = Card.from(score2, Suit.CLUB); + Card card5 = Card.from(score3, Suit.HEART); + Card card6 = Card.from(score4, Suit.HEART); Person player1 = new Player("player1", new GivenCards(Arrays.asList(card1, card2))); Person player2 = new Player("player2", new GivenCards(Arrays.asList(card3, card4))); Person player3 = new Player("player3", new GivenCards(Arrays.asList(card5, card6))); @@ -216,12 +216,12 @@ void getDealerScore() { @ParameterizedTest @CsvSource(value = {"A, TEN, A, NINE, 21, 20", "TEN, TEN, A, A, 20, 12"}) @DisplayName("플레이어들의 점수를 반환한다.") - void getPlayerScores(String score1, String score2, String score3, String score4, int expectedSum1, int expectedSum2) { + void getPlayerScores(Score score1, Score score2, Score score3, Score score4, int expectedSum1, int expectedSum2) { //given - Card card1 = Card.from(Score.valueOf(score1), Suit.CLUB); - Card card2 = Card.from(Score.valueOf(score2), Suit.CLUB); - Card card3 = Card.from(Score.valueOf(score3), Suit.HEART); - Card card4 = Card.from(Score.valueOf(score4), Suit.HEART); + Card card1 = Card.from(score1, Suit.CLUB); + Card card2 = Card.from(score2, Suit.CLUB); + Card card3 = Card.from(score3, Suit.HEART); + Card card4 = Card.from(score4, Suit.HEART); Person player1 = new Player("player1", new GivenCards(Arrays.asList(card1, card2))); Person player2 = new Player("player2", new GivenCards(Arrays.asList(card3, card4))); Players players = new Players(Arrays.asList(player1, player2)); @@ -239,13 +239,13 @@ void getPlayerScores(String score1, String score2, String score3, String score4, @ParameterizedTest @CsvSource(value = {"TEN, TEN, n, 1, 1", "TEN, EIGHT, n, 1, -1", "A, EIGHT, n, 1, 0"}) @DisplayName("플레이어의 승패 결과를 반환한다.") - void getResults(String score1, String score2, String answer, int expectedResult1, int expectedResult2) { + void getResults(Score score1, Score score2, String answer, int expectedResult1, int expectedResult2) { //given Card card1 = Card.from(Score.A, Suit.CLUB); Card card2 = Card.from(Score.J, Suit.CLUB); Person player1 = new Player("player1", new GivenCards(Arrays.asList(card1, card2))); - Card card3 = Card.from(Score.valueOf(score1), Suit.HEART); - Card card4 = Card.from(Score.valueOf(score2), Suit.HEART); + Card card3 = Card.from(score1, Suit.HEART); + Card card4 = Card.from(score2, Suit.HEART); Person player2 = new Player("player2", new GivenCards(Arrays.asList(card3, card4))); Card card5 = Card.from(Score.A, Suit.DIAMOND); Card card6 = Card.from(Score.EIGHT, Suit.DIAMOND); diff --git a/src/test/java/blackjack/domain/card/CardTest.java b/src/test/java/blackjack/domain/card/CardTest.java index f1a5c01..f70c912 100644 --- a/src/test/java/blackjack/domain/card/CardTest.java +++ b/src/test/java/blackjack/domain/card/CardTest.java @@ -58,9 +58,8 @@ void getDenomination() { @ParameterizedTest @CsvSource(value = {"A, true", "TWO, false", "TEN, false", "J, false"}) @DisplayName("카드가 Ace일 경우 참을 반환한다.") - void isAce(String scoreName, boolean expected) { + void isAce(Score score, boolean expected) { //given - Score score = Score.valueOf(scoreName); Suit diamond = Suit.DIAMOND; Card card = Card.from(score, diamond); diff --git a/src/test/java/blackjack/domain/card/GivenCardsTest.java b/src/test/java/blackjack/domain/card/GivenCardsTest.java index 66db6cc..58d7810 100644 --- a/src/test/java/blackjack/domain/card/GivenCardsTest.java +++ b/src/test/java/blackjack/domain/card/GivenCardsTest.java @@ -177,11 +177,11 @@ void isLessThanEqualTo(int sum, boolean expected) { @ParameterizedTest @CsvSource(value = {"TEN, NINE, TWO, true", "TEN, EIGHT, TWO, false"}) @DisplayName("카드의 합이 21일 경우, 참을 반환한다.") - void isMaximumThreshhold(String score1, String score2, String score3, boolean expected) { + void isMaximumThreshhold(Score score1, Score score2, Score score3, boolean expected) { //given - Card card1 = Card.from(Score.valueOf(score1), Suit.CLUB); - Card card2 = Card.from(Score.valueOf(score2), Suit.CLUB); - Card card3 = Card.from(Score.valueOf(score3), Suit.CLUB); + Card card1 = Card.from(score1, Suit.CLUB); + Card card2 = Card.from(score2, Suit.CLUB); + Card card3 = Card.from(score3, Suit.CLUB); GivenCards myCards = new GivenCards(Arrays.asList(card1, card2, card3)); //when diff --git a/src/test/java/blackjack/domain/enums/ResultTest.java b/src/test/java/blackjack/domain/enums/ResultTest.java index b2699f4..a7caade 100644 --- a/src/test/java/blackjack/domain/enums/ResultTest.java +++ b/src/test/java/blackjack/domain/enums/ResultTest.java @@ -11,10 +11,7 @@ class ResultTest { @ParameterizedTest @CsvSource(value = {"WIN, 1", "LOSE, -1", "DRAW, 0"}) @DisplayName("게임 결과 포인트를 반환한다.") - void getPoint(String resultName, int expectedPoint) { - //given - Result result = Result.valueOf(resultName); - + void getPoint(Result result, int expectedPoint) { //when int point = result.getPoint(); diff --git a/src/test/java/blackjack/domain/enums/ScoreTest.java b/src/test/java/blackjack/domain/enums/ScoreTest.java index 01032aa..869c7b0 100644 --- a/src/test/java/blackjack/domain/enums/ScoreTest.java +++ b/src/test/java/blackjack/domain/enums/ScoreTest.java @@ -11,10 +11,7 @@ public class ScoreTest { @ParameterizedTest @CsvSource(value = {"A, 1", "TWO, 2", "THREE, 3", "FOUR, 4", "FIVE, 5", "SIX, 6", "SEVEN, 7", "EIGHT, 8", "NINE, 9", "TEN, 10", "J, 10", "Q, 10", "K, 10"}) @DisplayName("카드의 점수를 반환한다.") - void getScore(String scoreName, int expectedScore) { - //given - Score cardScore = Score.valueOf(scoreName); - + void getScore(Score cardScore, int expectedScore) { //when int score = cardScore.getScore(); @@ -25,10 +22,7 @@ void getScore(String scoreName, int expectedScore) { @ParameterizedTest @CsvSource(value = {"A, A", "TWO, 2", "THREE, 3", "FOUR, 4", "FIVE, 5", "SIX, 6", "SEVEN, 7", "EIGHT, 8", "NINE, 9", "TEN, 10", "J, J", "Q, Q", "K, K"}) @DisplayName("카드의 점수 이름을 반환한다.") - void getDenomination(String scoreName, String expectedDenomiantion) { - //given - Score score = Score.valueOf(scoreName); - + void getDenomination(Score score, String expectedDenomiantion) { //when String denomination = score.getDenomination(); @@ -39,10 +33,7 @@ void getDenomination(String scoreName, String expectedDenomiantion) { @ParameterizedTest @CsvSource(value = {"A, true", "TWO, false", "TEN, false", "J, false"}) @DisplayName("카드가 Ace일 경우 참을 반환한다.") - void isAce(String scoreName, boolean expected) { - //given - Score score = Score.valueOf(scoreName); - + void isAce(Score score, boolean expected) { //when boolean actual = score.isAce(); diff --git a/src/test/java/blackjack/domain/enums/SuitTest.java b/src/test/java/blackjack/domain/enums/SuitTest.java index 1d24f67..6f608be 100644 --- a/src/test/java/blackjack/domain/enums/SuitTest.java +++ b/src/test/java/blackjack/domain/enums/SuitTest.java @@ -11,10 +11,7 @@ public class SuitTest { @ParameterizedTest @CsvSource(value = {"SPADE, 스페이드", "DIAMOND, 다이아몬드", "CLUB, 클로버", "HEART, 하트"}) @DisplayName("카드 무늬 이름을 반환한다.") - void getSuit(String suitName, String expectedSuit) { - //given - Suit cardSuit = Suit.valueOf(suitName); - + void getSuit(Suit cardSuit, String expectedSuit) { //when String suit = cardSuit.getSuit(); diff --git a/src/test/java/blackjack/domain/participant/DealerTest.java b/src/test/java/blackjack/domain/participant/DealerTest.java index 4ee1d13..ae8ff04 100644 --- a/src/test/java/blackjack/domain/participant/DealerTest.java +++ b/src/test/java/blackjack/domain/participant/DealerTest.java @@ -107,13 +107,13 @@ void hit_remain_hit_state() { @ParameterizedTest @ValueSource(strings = {"TWO", "SIX"}) @DisplayName("발급 받은 카드를 더한 합이 17 이상 21 이하일 경우, Stay 상태가 된다.") - void hit_become_stay_state(String score) { + void hit_become_stay_state(Score score) { //given Card card1 = Card.from(Score.TEN, Suit.DIAMOND); Card card2 = Card.from(Score.FIVE, Suit.DIAMOND); GivenCards givenCards = new GivenCards(Arrays.asList(card1, card2)); Person dealer = new Dealer("pobi", givenCards); - Card card3 = Card.from(Score.valueOf(score), Suit.HEART); + Card card3 = Card.from(score, Suit.HEART); //when dealer.hit(card3); @@ -126,13 +126,13 @@ void hit_become_stay_state(String score) { @ParameterizedTest @CsvSource(value = {"THREE, true", "SEVEN, true", "TWO, false"}) @DisplayName("블랙잭이 아니고 17 이상 21 이하일 경우 종료 여부를 참으로 반환한다.") - void isFinished(String score, boolean expected) { + void isFinished(Score score, boolean expected) { //given Card card1 = Card.from(Score.TEN, Suit.DIAMOND); Card card2 = Card.from(Score.FOUR, Suit.DIAMOND); GivenCards givenCards = new GivenCards(Arrays.asList(card1, card2)); Person dealer = new Dealer("pobi", givenCards); - Card card3 = Card.from(Score.valueOf(score), Suit.HEART); + Card card3 = Card.from(score, Suit.HEART); dealer.hit(card3); //when diff --git a/src/test/java/blackjack/domain/participant/PlayersTest.java b/src/test/java/blackjack/domain/participant/PlayersTest.java index 0e53d01..56f2492 100644 --- a/src/test/java/blackjack/domain/participant/PlayersTest.java +++ b/src/test/java/blackjack/domain/participant/PlayersTest.java @@ -59,13 +59,13 @@ void getPlayerCards() { @ParameterizedTest @CsvSource(value = {"A, TEN, true", "TEN, TEN, false"}) @DisplayName("모든 플레이어가 종료하였는지 여부를 반환한다.") - void allPlayersFinished(String score1, String score2, boolean expected) { + void allPlayersFinished(Score score1, Score score2, boolean expected) { //given Card card1 = Card.from(Score.A, Suit.DIAMOND); Card card2 = Card.from(Score.J, Suit.DIAMOND); Person player1 = new Player("pobi", new GivenCards(Arrays.asList(card1, card2))); - Card card3 = Card.from(Score.valueOf(score1), Suit.CLUB); - Card card4 = Card.from(Score.valueOf(score2), Suit.CLUB); + Card card3 = Card.from(score1, Suit.CLUB); + Card card4 = Card.from(score2, Suit.CLUB); Person player2 = new Player("tobi", new GivenCards(Arrays.asList(card3, card4))); Players players = new Players(Arrays.asList(player1, player2)); @@ -79,16 +79,16 @@ void allPlayersFinished(String score1, String score2, boolean expected) { @ParameterizedTest @CsvSource(value = {"A, TEN, A, NINE, player3", "TEN, TEN, TEN, TEN, player2"}) @DisplayName("참여 종료상태가 아닌 플레이어 중 먼저 입력 받았던 플레이어의 이름을 반환한다.") - void getCurrentPlayer(String score1, String score2, String score3, String score4, String expectedPlayer) { + void getCurrentPlayer(Score score1, Score score2, Score score3, Score score4, String expectedPlayer) { //given Card card1 = Card.from(Score.A, Suit.DIAMOND); Card card2 = Card.from(Score.J, Suit.DIAMOND); Person player1 = new Player("player1", new GivenCards(Arrays.asList(card1, card2))); - Card card3 = Card.from(Score.valueOf(score1), Suit.CLUB); - Card card4 = Card.from(Score.valueOf(score2), Suit.CLUB); + Card card3 = Card.from(score1, Suit.CLUB); + Card card4 = Card.from(score2, Suit.CLUB); Person player2 = new Player("player2", new GivenCards(Arrays.asList(card3, card4))); - Card card5 = Card.from(Score.valueOf(score3), Suit.HEART); - Card card6 = Card.from(Score.valueOf(score4), Suit.HEART); + Card card5 = Card.from(score3, Suit.HEART); + Card card6 = Card.from(score4, Suit.HEART); Person player3 = new Player("player3", new GivenCards(Arrays.asList(card5, card6))); Players players = new Players(Arrays.asList(player1, player2, player3)); @@ -120,13 +120,13 @@ void getCards() { @ParameterizedTest @CsvSource(value = {"A, TEN, A, NINE, 21, 20", "TEN, TEN, A, A, 20, 12"}) @DisplayName("플레이어들의 점수를 반환한다.") - void getPlayerScores(String score1, String score2, String score3, String score4, int expectedSum1, int expectedSum2) { + void getPlayerScores(Score score1, Score score2, Score score3, Score score4, int expectedSum1, int expectedSum2) { //given - Card card1 = Card.from(Score.valueOf(score1), Suit.CLUB); - Card card2 = Card.from(Score.valueOf(score2), Suit.CLUB); + Card card1 = Card.from(score1, Suit.CLUB); + Card card2 = Card.from(score2, Suit.CLUB); Person player1 = new Player("player1", new GivenCards(Arrays.asList(card1, card2))); - Card card3 = Card.from(Score.valueOf(score3), Suit.HEART); - Card card4 = Card.from(Score.valueOf(score4), Suit.HEART); + Card card3 = Card.from(score3, Suit.HEART); + Card card4 = Card.from(score4, Suit.HEART); Person player2 = new Player("player2", new GivenCards(Arrays.asList(card3, card4))); Players players = new Players(Arrays.asList(player1, player2)); @@ -141,14 +141,14 @@ void getPlayerScores(String score1, String score2, String score3, String score4, @ParameterizedTest @CsvSource(value = {"TEN, FIVE, SIX, 1, 1", "TEN, TEN, TWO, 1, -1"}) @DisplayName("자신의 카드의 합이 크거나 블랙잭일 경우 1, 작을 경우 -1을 반환한다.") - void getResults_with_win_and_lose(String score1, String score2, String score3, int expectedResult1, int expectedResult2) { + void getResults_with_win_and_lose(Score score1, Score score2, Score score3, int expectedResult1, int expectedResult2) { //given Card card1 = Card.from(Score.A, Suit.CLUB); Card card2 = Card.from(Score.J, Suit.CLUB); Person player1 = new Player("player1", new GivenCards(Arrays.asList(card1, card2))); - Card card3 = Card.from(Score.valueOf(score1), Suit.HEART); - Card card4 = Card.from(Score.valueOf(score2), Suit.HEART); - Card card5 = Card.from(Score.valueOf(score3), Suit.HEART); + Card card3 = Card.from(score1, Suit.HEART); + Card card4 = Card.from(score2, Suit.HEART); + Card card5 = Card.from(score3, Suit.HEART); Person player2 = new Player("player2", new GivenCards(Arrays.asList(card3, card4, card5))); Card card6 = Card.from(Score.A, Suit.DIAMOND); Card card7 = Card.from(Score.NINE, Suit.DIAMOND); diff --git a/src/test/java/blackjack/domain/state/finished/StayTest.java b/src/test/java/blackjack/domain/state/finished/StayTest.java index d5f2586..1a8812f 100644 --- a/src/test/java/blackjack/domain/state/finished/StayTest.java +++ b/src/test/java/blackjack/domain/state/finished/StayTest.java @@ -19,15 +19,15 @@ class StayTest { @ParameterizedTest @CsvSource(value = {"FIVE, FOUR", "TEN, TWO"}) @DisplayName("다른 카드의 합보다 크거나 다른 카드의 합이 21을 초과할 경우, 승리를 의미하는 1을 반환한다.") - void result_win(String score1, String score2) { + void result_win(Score score1, Score score2) { //given Card card1 = Card.from(Score.TEN, Suit.CLUB); Card card2 = Card.from(Score.TEN, Suit.HEART); GivenCards myCards = new GivenCards(Arrays.asList(card1, card2)); State stay = new Stay(myCards); Card card3 = Card.from(Score.TEN, Suit.DIAMOND); - Card card4 = Card.from(Score.valueOf(score1), Suit.CLUB); - Card card5 = Card.from(Score.valueOf(score2), Suit.CLUB); + Card card4 = Card.from(score1, Suit.CLUB); + Card card5 = Card.from(score2, Suit.CLUB); GivenCards otherCards = new GivenCards(Arrays.asList(card3, card4, card5)); //when From ca4a94745df05e57e1b816c5a7cd2c577047c2de Mon Sep 17 00:00:00 2001 From: Beenie93 Date: Mon, 9 Aug 2021 20:23:37 +0900 Subject: [PATCH 79/80] =?UTF-8?q?refactor:=20unmodifiableCollection=20?= =?UTF-8?q?=EC=A0=81=EC=9A=A9?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- src/main/java/blackjack/domain/card/Card.java | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/src/main/java/blackjack/domain/card/Card.java b/src/main/java/blackjack/domain/card/Card.java index 041b31f..bbc1f34 100644 --- a/src/main/java/blackjack/domain/card/Card.java +++ b/src/main/java/blackjack/domain/card/Card.java @@ -5,6 +5,7 @@ import java.util.Arrays; import java.util.Collection; +import java.util.Collections; import java.util.Map; import java.util.Objects; import java.util.function.Function; @@ -43,7 +44,7 @@ public static Card from(final Score score, final Suit suit) { } public static Collection getDeck() { - return CARDS.values(); + return Collections.unmodifiableCollection(CARDS.values()); } public int getScore() { From 8a80512a924547bdd1ed93fce06f64d2b3803755 Mon Sep 17 00:00:00 2001 From: Beenie93 Date: Thu, 12 Aug 2021 18:20:37 +0900 Subject: [PATCH 80/80] =?UTF-8?q?refactor:=20=EB=B6=88=ED=95=84=EC=9A=94?= =?UTF-8?q?=ED=95=9C=20=EC=83=81=ED=83=9C=20=EC=A0=9C=EA=B1=B0?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- src/main/java/blackjack/domain/participant/Player.java | 10 ---------- .../java/blackjack/domain/participant/PlayersTest.java | 6 ++++-- 2 files changed, 4 insertions(+), 12 deletions(-) diff --git a/src/main/java/blackjack/domain/participant/Player.java b/src/main/java/blackjack/domain/participant/Player.java index ba7525c..f4cebb3 100644 --- a/src/main/java/blackjack/domain/participant/Player.java +++ b/src/main/java/blackjack/domain/participant/Player.java @@ -4,8 +4,6 @@ import blackjack.domain.card.GivenCards; import blackjack.domain.state.State; import blackjack.domain.state.finished.Blackjack; -import blackjack.domain.state.finished.Burst; -import blackjack.domain.state.finished.Stay; import blackjack.domain.state.running.Hit; public class Player extends Gamer { @@ -21,14 +19,6 @@ public State injectStateBy(final GivenCards cards) { return new Blackjack(cards); } - if (cards.isBurst()) { - return new Burst(cards); - } - - if (cards.isMaximumThreshold()) { - return new Stay(cards); - } - return new Hit(cards); } diff --git a/src/test/java/blackjack/domain/participant/PlayersTest.java b/src/test/java/blackjack/domain/participant/PlayersTest.java index 56f2492..547c9eb 100644 --- a/src/test/java/blackjack/domain/participant/PlayersTest.java +++ b/src/test/java/blackjack/domain/participant/PlayersTest.java @@ -149,7 +149,8 @@ void getResults_with_win_and_lose(Score score1, Score score2, Score score3, int Card card3 = Card.from(score1, Suit.HEART); Card card4 = Card.from(score2, Suit.HEART); Card card5 = Card.from(score3, Suit.HEART); - Person player2 = new Player("player2", new GivenCards(Arrays.asList(card3, card4, card5))); + Person player2 = new Player("player2", new GivenCards(Arrays.asList(card3, card4))); + player2.hit(card5); Card card6 = Card.from(Score.A, Suit.DIAMOND); Card card7 = Card.from(Score.NINE, Suit.DIAMOND); GivenCards dealerCards = new GivenCards(Arrays.asList(card6, card7)); @@ -170,7 +171,8 @@ void getResults_with_draw() { Card card1 = Card.from(Score.A, Suit.CLUB); Card card2 = Card.from(Score.FIVE, Suit.CLUB); Card card3 = Card.from(Score.FIVE, Suit.CLUB); - Person player = new Player("player", new GivenCards(Arrays.asList(card1, card2, card3))); + Person player = new Player("player", new GivenCards(Arrays.asList(card1, card2))); + player.hit(card3); Card card4 = Card.from(Score.A, Suit.DIAMOND); Card card5 = Card.from(Score.EIGHT, Suit.DIAMOND); Card card6 = Card.from(Score.TWO, Suit.DIAMOND);