From 50fdc1c912e16dd690bf6fe6d9f95cef0c2e6726 Mon Sep 17 00:00:00 2001 From: kimchan Date: Tue, 8 Mar 2022 14:59:04 +0900 Subject: [PATCH 01/54] =?UTF-8?q?docs=20:=20=EA=B8=B0=EB=8A=A5=20=EA=B5=AC?= =?UTF-8?q?=ED=98=84=20=EB=AA=A9=EB=A1=9D=20=EC=9E=91=EC=84=B1?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- README.md | 35 ++++++++++++++++++++++++++++++++++- 1 file changed, 34 insertions(+), 1 deletion(-) diff --git a/README.md b/README.md index 556099c4de..ec7481641b 100644 --- a/README.md +++ b/README.md @@ -1,6 +1,39 @@ # java-blackjack -블랙잭 미션 저장소 +## 구현할 기능 목록 + +- [ ] 참여할 사람의 이름 입력 + - 쉼표 기준으로 분리 + - (e) 빈 값, 공백 불가 + - (e) 중복 불가 +- [ ] 카드 분배 + - 딜러, 참가자에게 카드 2장씩 분배 + - 딜러의 카드 1장 출력 + - 참가자의 카드 2장 출력 + - 참가자의 카드 합이 21이면 게임 종료 +- [ ] 참가자 카드 추가 분배 + - 카드 합이 21 이상인 참가자는 턴 종료 + - 참가자 별로 한장의 카드 추가 여부를 입력 받기 (y/n) + - 참가자가 카드 추가 여부 입력 + - y를 선택한 경우 카드 추가 분배 + - n를 선택한 경우 해당 참가자의 턴 종료 + - 참가자의 카드 목록 출력 +- [ ] 딜러 카드 추가 분배 + - 16 이하면 1장 추가 분배 + - 17 이상이면 턴 종료 +- [ ] 결과 출력 + - 카드 목록 및 총합 출력 (ex: 딜러 카드: 3다이아몬드, 9클로버, 8다이아몬드 - 결과: 20) + - 최종 승패 계산 + - 최종 승패 출력 + - 딜러 n승 n패 출력 + - 참가자 승/패 결과만 출력 + +## 기능 요구 사항 + +- 카드의 숫자 계산은 카드 숫자를 기본으로 하며, 예외로 Ace는 1 또는 11로 계산할 수 있으며, King, Queen, Jack은 각각 10으로 계산한다. +- 게임을 시작하면 플레이어는 두 장의 카드를 지급 받으며, 두 장의 카드 숫자를 합쳐 21을 초과하지 않으면서 21에 가깝게 만들면 이긴다. 21을 넘지 않을 경우 원한다면 얼마든지 카드를 계속 뽑을 수 있다. +- 딜러는 처음에 받은 2장의 합계가 16이하이면 반드시 1장의 카드를 추가로 받아야 하고, 17점 이상이면 추가로 받을 수 없다. +- 게임을 완료한 후 각 플레이어별로 승패를 출력한다. ## 우아한테크코스 코드리뷰 From 1433c94132ece69eddc4ca96996c016a61df49a4 Mon Sep 17 00:00:00 2001 From: kimchan Date: Tue, 8 Mar 2022 16:04:40 +0900 Subject: [PATCH 02/54] =?UTF-8?q?feat=20:=20=EC=B9=B4=EB=93=9C=20=EC=83=9D?= =?UTF-8?q?=EC=84=B1=20=EA=B8=B0=EB=8A=A5?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- src/main/java/domain/card/Card.java | 34 +++++++++++++++++++ .../java/domain/card/CardDistributor.java | 2 ++ src/main/java/domain/card/Denomination.java | 23 +++++++++++++ src/main/java/domain/card/Suit.java | 11 ++++++ .../java/domain/card/CardDistributorTest.java | 27 +++++++++++++++ src/test/java/domain/card/CardTest.java | 18 ++++++++++ 6 files changed, 115 insertions(+) create mode 100644 src/main/java/domain/card/Card.java create mode 100644 src/main/java/domain/card/CardDistributor.java create mode 100644 src/main/java/domain/card/Denomination.java create mode 100644 src/main/java/domain/card/Suit.java create mode 100644 src/test/java/domain/card/CardDistributorTest.java create mode 100644 src/test/java/domain/card/CardTest.java diff --git a/src/main/java/domain/card/Card.java b/src/main/java/domain/card/Card.java new file mode 100644 index 0000000000..fa53711dc9 --- /dev/null +++ b/src/main/java/domain/card/Card.java @@ -0,0 +1,34 @@ +package domain.card; + +import java.util.Objects; + +public class Card { + private final Denomination denomination; + private final Suit suit; + + public Card(Denomination denomination, Suit suit) { + this.denomination = denomination; + this.suit = suit; + } + + @Override + public boolean equals(Object o) { + if (this == o) return true; + if (o == null || getClass() != o.getClass()) return false; + Card card = (Card) o; + return denomination == card.denomination && suit == card.suit; + } + + @Override + public int hashCode() { + return Objects.hash(denomination, suit); + } + + @Override + public String toString() { + return "Card{" + + "denomination=" + denomination + + ", suit=" + suit + + '}'; + } +} diff --git a/src/main/java/domain/card/CardDistributor.java b/src/main/java/domain/card/CardDistributor.java new file mode 100644 index 0000000000..ab4617a073 --- /dev/null +++ b/src/main/java/domain/card/CardDistributor.java @@ -0,0 +1,2 @@ +package domain.card;public class CardDistributor { +} diff --git a/src/main/java/domain/card/Denomination.java b/src/main/java/domain/card/Denomination.java new file mode 100644 index 0000000000..61677ae4be --- /dev/null +++ b/src/main/java/domain/card/Denomination.java @@ -0,0 +1,23 @@ +package domain.card; + +public enum Denomination { + ACE(1), + TWO(2), + THREE(3), + FOUR(4), + FIVE(5), + SIX(6), + SEVEN(7), + EIGHT(8), + NINE(9), + TEN(10), + JACK(10), + QUEEN(10), + KING(10); + + private final int value; + + Denomination(int value) { + this.value = value; + } +} diff --git a/src/main/java/domain/card/Suit.java b/src/main/java/domain/card/Suit.java new file mode 100644 index 0000000000..dd1c9789b9 --- /dev/null +++ b/src/main/java/domain/card/Suit.java @@ -0,0 +1,11 @@ +package domain.card; + +public enum Suit { + CLOVER, + HEART, + DIAMOND, + SPADE; + + Suit() { + } +} diff --git a/src/test/java/domain/card/CardDistributorTest.java b/src/test/java/domain/card/CardDistributorTest.java new file mode 100644 index 0000000000..172fdb1c96 --- /dev/null +++ b/src/test/java/domain/card/CardDistributorTest.java @@ -0,0 +1,27 @@ +package domain; + +import domain.card.CardDistributor; +import org.junit.jupiter.api.Test; + +import static org.assertj.core.api.Assertions.assertThatNoException; +import static org.assertj.core.api.Assertions.assertThatThrownBy; + +public class CardDistributorTest { + + @Test + void distribute() { + CardDistributor cardDistributor = new CardDistributor(); + assertThatNoException().isThrownBy(cardDistributor::distribute); + } + + @Test + void failed() { + CardDistributor cardDistributor = new CardDistributor(); + for (int i = 0; i < 51; i++) { + cardDistributor.distribute(); + } + assertThatThrownBy(cardDistributor::distribute) + .isInstanceOf(IllegalArgumentException.class) + .hasMessageContaining("[ERROR]"); + } +} diff --git a/src/test/java/domain/card/CardTest.java b/src/test/java/domain/card/CardTest.java new file mode 100644 index 0000000000..e0dee2ce11 --- /dev/null +++ b/src/test/java/domain/card/CardTest.java @@ -0,0 +1,18 @@ +package domain.card; + +import domain.card.Card; +import domain.card.Denomination; +import domain.card.Suit; +import org.junit.jupiter.api.Test; + +import java.util.ArrayList; +import java.util.List; + +import static org.assertj.core.api.Assertions.assertThatNoException; + +public class CardTest { + @Test + void create() { + assertThatNoException().isThrownBy(() -> new Card(Denomination.ACE, Suit.CLOVER)); + } +} From aab3cc1ae9c37dfe94a75f2cc3c2033ceb298e99 Mon Sep 17 00:00:00 2001 From: kimchan Date: Tue, 8 Mar 2022 16:05:33 +0900 Subject: [PATCH 03/54] =?UTF-8?q?feat=20:=20=EC=B9=B4=EB=93=9C=20=EB=B6=84?= =?UTF-8?q?=EB=B0=B0=20=EA=B8=B0=EB=8A=A5?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../java/domain/card/CardDistributor.java | 24 ++++++++++++++++++- .../java/domain/card/CardDistributorTest.java | 2 +- 2 files changed, 24 insertions(+), 2 deletions(-) diff --git a/src/main/java/domain/card/CardDistributor.java b/src/main/java/domain/card/CardDistributor.java index ab4617a073..4105a21c26 100644 --- a/src/main/java/domain/card/CardDistributor.java +++ b/src/main/java/domain/card/CardDistributor.java @@ -1,2 +1,24 @@ -package domain.card;public class CardDistributor { +package domain.card; + +import java.util.Collections; +import java.util.Stack; + +public class CardDistributor { + private static final Stack deck = new Stack<>(); + + static { + for (Suit suit : Suit.values()) { + for (Denomination denomination : Denomination.values()) { + deck.push(new Card(denomination, suit)); + } + } + Collections.shuffle(deck); + } + + public Card distribute() { + if (deck == null || deck.empty()) { + throw new IllegalArgumentException("[ERROR]"); + } + return deck.pop(); + } } diff --git a/src/test/java/domain/card/CardDistributorTest.java b/src/test/java/domain/card/CardDistributorTest.java index 172fdb1c96..c2a0b133c9 100644 --- a/src/test/java/domain/card/CardDistributorTest.java +++ b/src/test/java/domain/card/CardDistributorTest.java @@ -1,4 +1,4 @@ -package domain; +package domain.card; import domain.card.CardDistributor; import org.junit.jupiter.api.Test; From 32abc934811ececa5256c71480e4e7bc0fd06411 Mon Sep 17 00:00:00 2001 From: kimchan Date: Tue, 8 Mar 2022 17:00:50 +0900 Subject: [PATCH 04/54] =?UTF-8?q?feat=20:=20=EC=B9=B4=EB=93=9C=20=EB=AA=A9?= =?UTF-8?q?=EB=A1=9D=20=ED=95=A9=EA=B3=84=20=EA=B3=84=EC=82=B0=20=EA=B8=B0?= =?UTF-8?q?=EB=8A=A5?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- src/main/java/domain/card/Cards.java | 35 +++++++++++++++++ src/test/java/domain/card/CardsTest.java | 49 ++++++++++++++++++++++++ 2 files changed, 84 insertions(+) create mode 100644 src/main/java/domain/card/Cards.java create mode 100644 src/test/java/domain/card/CardsTest.java diff --git a/src/main/java/domain/card/Cards.java b/src/main/java/domain/card/Cards.java new file mode 100644 index 0000000000..3e9f63a581 --- /dev/null +++ b/src/main/java/domain/card/Cards.java @@ -0,0 +1,35 @@ +package domain.card; + +import java.util.List; + +public class Cards { + private static final int ACE_ADDITIONAL_VALUE = 10; + private static final int BURST_COUNT = 21; + + private final List value; + + public Cards(List cards) { + this.value = cards; + } + + public int sum() { + int sum = value.stream() + .mapToInt(Card::toInt) + .sum(); + + if (hasAce() && !exceedBurst(sum)) { + sum += ACE_ADDITIONAL_VALUE; + } + + return sum; + } + + private boolean exceedBurst(int sum) { + return sum + ACE_ADDITIONAL_VALUE > BURST_COUNT; + } + + private boolean hasAce() { + return value.stream() + .anyMatch(Card::isAce); + } +} diff --git a/src/test/java/domain/card/CardsTest.java b/src/test/java/domain/card/CardsTest.java new file mode 100644 index 0000000000..b813954010 --- /dev/null +++ b/src/test/java/domain/card/CardsTest.java @@ -0,0 +1,49 @@ +package domain.card; + +import org.junit.jupiter.api.DisplayName; +import org.junit.jupiter.api.Test; +import org.junit.jupiter.params.ParameterizedTest; +import org.junit.jupiter.params.provider.Arguments; +import org.junit.jupiter.params.provider.MethodSource; + +import java.util.Arrays; +import java.util.stream.Stream; + +import static org.assertj.core.api.Assertions.assertThat; + +public class CardsTest { + + @ParameterizedTest(name = "[{index}] {0}인 경우 총합은 {1}") + @MethodSource("provideParameters") + @DisplayName("단일 카드 총합 구하기") + void sum(Denomination denomination, int expect) { + Cards cards = new Cards(Arrays.asList(new Card(denomination, Suit.CLOVER))); + assertThat(cards.sum()).isEqualTo(expect); + } + + private static Stream provideParameters() { + return Stream.of( + Arguments.arguments(Denomination.ACE, 11), + Arguments.arguments(Denomination.TWO, 2), + Arguments.arguments(Denomination.THREE, 3), + Arguments.arguments(Denomination.FOUR, 4), + Arguments.arguments(Denomination.FIVE, 5), + Arguments.arguments(Denomination.SIX, 6), + Arguments.arguments(Denomination.SEVEN, 7), + Arguments.arguments(Denomination.EIGHT, 8), + Arguments.arguments(Denomination.NINE, 9), + Arguments.arguments(Denomination.TEN, 10), + Arguments.arguments(Denomination.JACK, 10), + Arguments.arguments(Denomination.QUEEN, 10), + Arguments.arguments(Denomination.KING, 10) + ); + } + + @Test + @DisplayName("ACE 2개인 경우") + void sum2() { + Cards cards = new Cards(Arrays.asList(new Card(Denomination.ACE, Suit.CLOVER) + , new Card(Denomination.ACE, Suit.HEART))); + assertThat(cards.sum()).isEqualTo(12); + } +} From 043a1502c01b20f9f6023faa1b40e47bef871d7e Mon Sep 17 00:00:00 2001 From: kimchan Date: Tue, 8 Mar 2022 17:07:30 +0900 Subject: [PATCH 05/54] =?UTF-8?q?feat=20:=20=EC=B9=B4=EB=93=9C=20=EB=AA=A9?= =?UTF-8?q?=EB=A1=9D=20=EC=B6=94=EA=B0=80=20=EA=B8=B0=EB=8A=A5?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- src/main/java/domain/card/Cards.java | 8 ++++++++ src/test/java/domain/card/CardsTest.java | 15 +++++++++++++++ 2 files changed, 23 insertions(+) diff --git a/src/main/java/domain/card/Cards.java b/src/main/java/domain/card/Cards.java index 3e9f63a581..aa0d0e5445 100644 --- a/src/main/java/domain/card/Cards.java +++ b/src/main/java/domain/card/Cards.java @@ -12,6 +12,10 @@ public Cards(List cards) { this.value = cards; } + public void add(Card card) { + this.value.add(card); + } + public int sum() { int sum = value.stream() .mapToInt(Card::toInt) @@ -32,4 +36,8 @@ private boolean hasAce() { return value.stream() .anyMatch(Card::isAce); } + + public List getValue() { + return value; + } } diff --git a/src/test/java/domain/card/CardsTest.java b/src/test/java/domain/card/CardsTest.java index b813954010..56533c914e 100644 --- a/src/test/java/domain/card/CardsTest.java +++ b/src/test/java/domain/card/CardsTest.java @@ -6,7 +6,9 @@ import org.junit.jupiter.params.provider.Arguments; import org.junit.jupiter.params.provider.MethodSource; +import java.util.ArrayList; import java.util.Arrays; +import java.util.List; import java.util.stream.Stream; import static org.assertj.core.api.Assertions.assertThat; @@ -46,4 +48,17 @@ void sum2() { , new Card(Denomination.ACE, Suit.HEART))); assertThat(cards.sum()).isEqualTo(12); } + + @Test + @DisplayName("카드 추가하기") + void add() { + List list = new ArrayList<>(); + list.add(new Card(Denomination.ACE, Suit.CLOVER)); + Cards cards = new Cards(list); + + cards.add(new Card(Denomination.JACK, Suit.HEART)); + + List cardList = cards.getValue(); + assertThat(cardList.size()).isEqualTo(2); + } } From 8c793fa6ac74e63fe8752b439f76abbeb8c1db32 Mon Sep 17 00:00:00 2001 From: kimchan Date: Tue, 8 Mar 2022 18:52:02 +0900 Subject: [PATCH 06/54] =?UTF-8?q?feat=20:=20=ED=94=8C=EB=A0=88=EC=9D=B4?= =?UTF-8?q?=EC=96=B4=20=EC=83=9D=EC=84=B1=20=EA=B8=B0=EB=8A=A5?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- src/main/java/domain/player/Player.java | 26 +++++++++++ src/main/java/view/InputView.java | 2 + src/test/java/domain/player/PlayerTest.java | 50 +++++++++++++++++++++ 3 files changed, 78 insertions(+) create mode 100644 src/main/java/domain/player/Player.java create mode 100644 src/main/java/view/InputView.java create mode 100644 src/test/java/domain/player/PlayerTest.java diff --git a/src/main/java/domain/player/Player.java b/src/main/java/domain/player/Player.java new file mode 100644 index 0000000000..0f54da2891 --- /dev/null +++ b/src/main/java/domain/player/Player.java @@ -0,0 +1,26 @@ +package domain.player; + +import domain.card.Card; +import domain.card.Cards; + +public class Player { + private final String name; + private final Cards cards; + + public Player(String name, Cards cards) { + this.name = name; + this.cards = cards; + } + + public boolean isFinished() { + return cards.isBust(); + } + + public void drawCard(Card card) { + cards.add(card); + } + + public Cards getCards() { + return cards; + } +} diff --git a/src/main/java/view/InputView.java b/src/main/java/view/InputView.java new file mode 100644 index 0000000000..c6c5175856 --- /dev/null +++ b/src/main/java/view/InputView.java @@ -0,0 +1,2 @@ +package view;public class InputView { +} diff --git a/src/test/java/domain/player/PlayerTest.java b/src/test/java/domain/player/PlayerTest.java new file mode 100644 index 0000000000..83fa9ecb75 --- /dev/null +++ b/src/test/java/domain/player/PlayerTest.java @@ -0,0 +1,50 @@ +package domain.player; + +import domain.card.Card; +import domain.card.Cards; +import domain.card.Denomination; +import domain.card.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.Arguments; +import org.junit.jupiter.params.provider.MethodSource; + +import java.util.ArrayList; +import java.util.List; +import java.util.stream.Stream; + +import static org.assertj.core.api.Assertions.assertThat; + +public class PlayerTest { + + @ParameterizedTest(name = "{0}") + @MethodSource("provideParameters") + @DisplayName("턴 강제 종료 여부") + void player(String comment,Cards cards, boolean expect) { + Player player = new Player("name", cards); + assertThat(player.isFinished()).isEqualTo(expect); + } + + private static Stream provideParameters() { + return Stream.of( + Arguments.arguments("합계 22인 경우 true", new Cards(getCardList(Denomination.TWO, Denomination.QUEEN, Denomination.KING)), true), + Arguments.arguments("합계 20인 경우 false", new Cards(getCardList(Denomination.QUEEN, Denomination.KING)), false) + ); + } + + private static List getCardList(Denomination... arguments) { + List list = new ArrayList<>(); + for (Denomination denomination : arguments) { + list.add(new Card(denomination, Suit.CLOVER)); + } + return list; + } + + @Test + void drawCard() { + Player player = new Player("name", new Cards(getCardList(Denomination.QUEEN))); + player.drawCard(new Card(Denomination.ACE, Suit.CLOVER)); + assertThat(player.getCards().getValue().size()).isEqualTo(2); + } +} From 865c9eccac06ddaa921b9ef3c6d21778693c1c1c Mon Sep 17 00:00:00 2001 From: kimchan Date: Tue, 8 Mar 2022 18:54:35 +0900 Subject: [PATCH 07/54] =?UTF-8?q?feat=20:=20InputView=20=EC=83=9D=EC=84=B1?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- src/main/java/view/InputView.java | 64 ++++++++++++++++++++++++++++++- 1 file changed, 63 insertions(+), 1 deletion(-) diff --git a/src/main/java/view/InputView.java b/src/main/java/view/InputView.java index c6c5175856..dd13347f35 100644 --- a/src/main/java/view/InputView.java +++ b/src/main/java/view/InputView.java @@ -1,2 +1,64 @@ -package view;public class InputView { +package view; + +import java.util.Arrays; +import java.util.List; +import java.util.Scanner; + +public class InputView { + private static final Scanner scanner = new Scanner(System.in); + + private InputView() { + + } + + public static List inputPlayerNames() { + System.out.println("게임에 참여할 사람의 이름을 입력하세요.(쉼표 기준으로 분리)"); + String input = scanner.nextLine(); + + List names = Arrays.asList(input.split(",", -1)); + validateNames(names); + + return names; + } + + private static void validateNames(List list) { + checkEmpty(list); + checkDistinct(list); + } + + private static void checkEmpty(List list) { + boolean isEmpty = list.stream() + .anyMatch(string -> string == null || string.isBlank()); + + if (isEmpty) { + throw new IllegalArgumentException("[ERROR] 빈 값은 이름으로 등록할 수 없습니다."); + } + } + + private static void checkDistinct(List list) { + long distinctCount = list.stream() + .distinct() + .count(); + + if (distinctCount != list.size()) { + throw new IllegalArgumentException("[ERROR] 중복 이름은 불가능합니다."); + } + } + + public static boolean inputWantDraw(String name) { + System.out.printf("%s는 한장의 카드를 더 받겠습니까?(예는 y, 아니오는 n)%n", name); + String input = scanner.nextLine().toLowerCase(); + return toBoolean(input); + } + + private static boolean toBoolean(String input) { + validateWantDraw(input); + return "y".equals(input); + } + + private static void validateWantDraw(String input) { + if (!"y".equals(input) && !"n".equals(input)) { + throw new IllegalArgumentException("[ERROR] y 또는 n을 입력해주세요."); + } + } } From 06eaaa4cb86d88277af2f90135e6064cec04432a Mon Sep 17 00:00:00 2001 From: kimchan Date: Tue, 8 Mar 2022 18:58:09 +0900 Subject: [PATCH 08/54] =?UTF-8?q?refactor=20:=20isBust=20=EB=A9=94?= =?UTF-8?q?=EC=84=9C=EB=93=9C=20=EC=9D=B4=EB=8F=99,=20Denomination=20gette?= =?UTF-8?q?r=20=EC=B6=94=EA=B0=80?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- README.md | 24 +++++++++++++++++++ src/main/java/domain/card/Card.java | 12 ++++++++++ src/main/java/domain/card/Cards.java | 15 ++++++++---- src/main/java/domain/card/Denomination.java | 4 ++++ .../java/domain/card/CardDistributorTest.java | 1 - src/test/java/domain/card/CardTest.java | 6 ----- 6 files changed, 50 insertions(+), 12 deletions(-) diff --git a/README.md b/README.md index ec7481641b..2cc165d7b5 100644 --- a/README.md +++ b/README.md @@ -38,3 +38,27 @@ ## 우아한테크코스 코드리뷰 - [온라인 코드 리뷰 과정](https://github.com/woowacourse/woowacourse-docs/blob/master/maincourse/README.md) + + +// BlackJackGame(List players, Dealer dealer) +// blackJackGame.distributeCard() - 각자 카드 2장씩 + +// for (Player player : players) +// player.canDraw() - y입력되면 true, n 입력되면 false +// player.drawCard(Card){값추가} +// player.getter() -> view에서 보여주기 +// Dealer.drawCard() + +// 승패결과 BlackJackResult + +/* 보고계시나요~~~`~~`` 정리되셨나여 hrd 퇴실 +for(Player player: players) { + if(!player.isBurst() && InputView.wantDraw()) { + player.drawCard(CardDistributor.distribute()); + } +} + +if(!dealer.isBurst()) { + dealer.drawCard(CardDistributor.distribute()); +} +*/ diff --git a/src/main/java/domain/card/Card.java b/src/main/java/domain/card/Card.java index fa53711dc9..0a73cfc8c9 100644 --- a/src/main/java/domain/card/Card.java +++ b/src/main/java/domain/card/Card.java @@ -11,6 +11,18 @@ public Card(Denomination denomination, Suit suit) { this.suit = suit; } + public Denomination getDenomination() { + return denomination; + } + + public int toInt() { + return this.denomination.getValue(); + } + + public boolean isAce() { + return this.denomination == Denomination.ACE; + } + @Override public boolean equals(Object o) { if (this == o) return true; diff --git a/src/main/java/domain/card/Cards.java b/src/main/java/domain/card/Cards.java index aa0d0e5445..a20d05b019 100644 --- a/src/main/java/domain/card/Cards.java +++ b/src/main/java/domain/card/Cards.java @@ -1,35 +1,40 @@ package domain.card; +import java.util.ArrayList; import java.util.List; public class Cards { private static final int ACE_ADDITIONAL_VALUE = 10; - private static final int BURST_COUNT = 21; + private static final int BUST_COUNT = 21; private final List value; public Cards(List cards) { - this.value = cards; + this.value = new ArrayList<>(cards); } public void add(Card card) { this.value.add(card); } + public boolean isBust() { + return sum() >= BUST_COUNT; + } + public int sum() { int sum = value.stream() .mapToInt(Card::toInt) .sum(); - if (hasAce() && !exceedBurst(sum)) { + if (hasAce() && !exceedBust(sum)) { sum += ACE_ADDITIONAL_VALUE; } return sum; } - private boolean exceedBurst(int sum) { - return sum + ACE_ADDITIONAL_VALUE > BURST_COUNT; + private boolean exceedBust(int sum) { + return sum + ACE_ADDITIONAL_VALUE > BUST_COUNT; } private boolean hasAce() { diff --git a/src/main/java/domain/card/Denomination.java b/src/main/java/domain/card/Denomination.java index 61677ae4be..1b20ae1eb2 100644 --- a/src/main/java/domain/card/Denomination.java +++ b/src/main/java/domain/card/Denomination.java @@ -20,4 +20,8 @@ public enum Denomination { Denomination(int value) { this.value = value; } + + public int getValue() { + return value; + } } diff --git a/src/test/java/domain/card/CardDistributorTest.java b/src/test/java/domain/card/CardDistributorTest.java index c2a0b133c9..444e37598b 100644 --- a/src/test/java/domain/card/CardDistributorTest.java +++ b/src/test/java/domain/card/CardDistributorTest.java @@ -1,6 +1,5 @@ package domain.card; -import domain.card.CardDistributor; import org.junit.jupiter.api.Test; import static org.assertj.core.api.Assertions.assertThatNoException; diff --git a/src/test/java/domain/card/CardTest.java b/src/test/java/domain/card/CardTest.java index e0dee2ce11..d451dd6192 100644 --- a/src/test/java/domain/card/CardTest.java +++ b/src/test/java/domain/card/CardTest.java @@ -1,13 +1,7 @@ package domain.card; -import domain.card.Card; -import domain.card.Denomination; -import domain.card.Suit; import org.junit.jupiter.api.Test; -import java.util.ArrayList; -import java.util.List; - import static org.assertj.core.api.Assertions.assertThatNoException; public class CardTest { From 0d2c62a7f761f9594992e44fa9271da26c74932c Mon Sep 17 00:00:00 2001 From: kimchan Date: Tue, 8 Mar 2022 20:57:02 +0900 Subject: [PATCH 09/54] =?UTF-8?q?feat=20:=20=EB=94=9C=EB=9F=AC=20=EC=83=9D?= =?UTF-8?q?=EC=84=B1?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../controller/BlackJackController.java | 2 + src/main/java/domain/player/Dealer.java | 31 ++++++++++++ src/main/java/domain/player/Player.java | 4 ++ src/test/java/domain/player/DealerTest.java | 50 +++++++++++++++++++ 4 files changed, 87 insertions(+) create mode 100644 src/main/java/domain/controller/BlackJackController.java create mode 100644 src/main/java/domain/player/Dealer.java create mode 100644 src/test/java/domain/player/DealerTest.java diff --git a/src/main/java/domain/controller/BlackJackController.java b/src/main/java/domain/controller/BlackJackController.java new file mode 100644 index 0000000000..a5dc2e2827 --- /dev/null +++ b/src/main/java/domain/controller/BlackJackController.java @@ -0,0 +1,2 @@ +package domain.controller;public class BlackJackController { +} diff --git a/src/main/java/domain/player/Dealer.java b/src/main/java/domain/player/Dealer.java new file mode 100644 index 0000000000..d74ff78fe5 --- /dev/null +++ b/src/main/java/domain/player/Dealer.java @@ -0,0 +1,31 @@ +package domain.player; + +import domain.card.Card; +import domain.card.Cards; + +public class Dealer { + private static final int DRAW_STANDARD = 16; + + private final String name = "딜러"; + private final Cards cards; + + public Dealer(Cards cards) { + this.cards = cards; + } + + public boolean isFinished() { + return cards.isBust() || cards.sum() > DRAW_STANDARD; + } + + public void drawCard(Card card) { + cards.add(card); + } + + public String getName() { + return name; + } + + public Cards getCards() { + return cards; + } +} diff --git a/src/main/java/domain/player/Player.java b/src/main/java/domain/player/Player.java index 0f54da2891..5aa7f8db40 100644 --- a/src/main/java/domain/player/Player.java +++ b/src/main/java/domain/player/Player.java @@ -20,6 +20,10 @@ public void drawCard(Card card) { cards.add(card); } + public String getName() { + return name; + } + public Cards getCards() { return cards; } diff --git a/src/test/java/domain/player/DealerTest.java b/src/test/java/domain/player/DealerTest.java new file mode 100644 index 0000000000..2d7c992d1c --- /dev/null +++ b/src/test/java/domain/player/DealerTest.java @@ -0,0 +1,50 @@ +package domain.player; + +import domain.card.Card; +import domain.card.Cards; +import domain.card.Denomination; +import domain.card.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.Arguments; +import org.junit.jupiter.params.provider.MethodSource; + +import java.util.ArrayList; +import java.util.List; +import java.util.stream.Stream; + +import static org.assertj.core.api.Assertions.assertThat; + +public class DealerTest { + @ParameterizedTest(name = "{0}") + @MethodSource("provideParameters") + @DisplayName("턴 강제 종료 여부") + void Dealer(String comment, Cards cards, boolean expect) { + Dealer dealer = new Dealer(cards); + assertThat(dealer.isFinished()).isEqualTo(expect); + } + + private static Stream provideParameters() { + return Stream.of( + Arguments.arguments("합계 22인 경우 true", new Cards(getCardList(Denomination.TWO, Denomination.QUEEN, Denomination.KING)), true), + Arguments.arguments("합계 17인 경우 true", new Cards(getCardList(Denomination.SEVEN, Denomination.QUEEN)), true), + Arguments.arguments("합계 15인 경우 false", new Cards(getCardList(Denomination.QUEEN, Denomination.FIVE)), false) + ); + } + + private static List getCardList(Denomination... arguments) { + List list = new ArrayList<>(); + for (Denomination denomination : arguments) { + list.add(new Card(denomination, Suit.CLOVER)); + } + return list; + } + + @Test + void drawCard() { + Dealer dealer = new Dealer(new Cards(getCardList(Denomination.QUEEN))); + dealer.drawCard(new Card(Denomination.ACE, Suit.CLOVER)); + assertThat(dealer.getCards().getValue().size()).isEqualTo(2); + } +} From 34d85fad7871bea12522a9d4d23874f7e2e118cb Mon Sep 17 00:00:00 2001 From: kimchan Date: Tue, 8 Mar 2022 22:08:42 +0900 Subject: [PATCH 10/54] =?UTF-8?q?feat=20:=20=EC=B0=B8=EA=B0=80=EC=9E=90=20?= =?UTF-8?q?interface=20=EC=83=9D=EC=84=B1?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- src/main/java/domain/player/Dealer.java | 4 +++- src/main/java/domain/player/Participant.java | 8 ++++++++ src/main/java/domain/player/Player.java | 4 +++- 3 files changed, 14 insertions(+), 2 deletions(-) create mode 100644 src/main/java/domain/player/Participant.java diff --git a/src/main/java/domain/player/Dealer.java b/src/main/java/domain/player/Dealer.java index d74ff78fe5..7d076934b2 100644 --- a/src/main/java/domain/player/Dealer.java +++ b/src/main/java/domain/player/Dealer.java @@ -3,7 +3,7 @@ import domain.card.Card; import domain.card.Cards; -public class Dealer { +public class Dealer implements Participant { private static final int DRAW_STANDARD = 16; private final String name = "딜러"; @@ -13,10 +13,12 @@ public Dealer(Cards cards) { this.cards = cards; } + @Override public boolean isFinished() { return cards.isBust() || cards.sum() > DRAW_STANDARD; } + @Override public void drawCard(Card card) { cards.add(card); } diff --git a/src/main/java/domain/player/Participant.java b/src/main/java/domain/player/Participant.java new file mode 100644 index 0000000000..d4860f4201 --- /dev/null +++ b/src/main/java/domain/player/Participant.java @@ -0,0 +1,8 @@ +package domain.player; + +import domain.card.Card; + +public interface Participant { + boolean isFinished(); + void drawCard(Card card); +} diff --git a/src/main/java/domain/player/Player.java b/src/main/java/domain/player/Player.java index 5aa7f8db40..4c4c59ae9a 100644 --- a/src/main/java/domain/player/Player.java +++ b/src/main/java/domain/player/Player.java @@ -3,7 +3,7 @@ import domain.card.Card; import domain.card.Cards; -public class Player { +public class Player implements Participant { private final String name; private final Cards cards; @@ -12,10 +12,12 @@ public Player(String name, Cards cards) { this.cards = cards; } + @Override public boolean isFinished() { return cards.isBust(); } + @Override public void drawCard(Card card) { cards.add(card); } From 0b0200a7f5dc0e366b15de7f2ba8bf45558395b3 Mon Sep 17 00:00:00 2001 From: kimchan Date: Wed, 9 Mar 2022 10:29:48 +0900 Subject: [PATCH 11/54] =?UTF-8?q?feat=20:=20=EA=B2=8C=EC=9E=84=20=EC=8A=B9?= =?UTF-8?q?=ED=8C=A8=20=EA=B5=AC=ED=98=84?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- src/main/java/domain/card/Cards.java | 10 ++-- .../controller/BlackJackController.java | 2 - src/main/java/domain/game/GameResult.java | 33 +++++++++++++ src/main/java/domain/game/MatchResult.java | 12 +++++ src/main/java/domain/player/Dealer.java | 3 +- src/main/java/domain/player/Player.java | 17 ++++++- src/test/java/domain/game/GameResultTest.java | 48 +++++++++++++++++++ 7 files changed, 117 insertions(+), 8 deletions(-) delete mode 100644 src/main/java/domain/controller/BlackJackController.java create mode 100644 src/main/java/domain/game/GameResult.java create mode 100644 src/main/java/domain/game/MatchResult.java create mode 100644 src/test/java/domain/game/GameResultTest.java diff --git a/src/main/java/domain/card/Cards.java b/src/main/java/domain/card/Cards.java index a20d05b019..7bb826efcc 100644 --- a/src/main/java/domain/card/Cards.java +++ b/src/main/java/domain/card/Cards.java @@ -5,7 +5,7 @@ public class Cards { private static final int ACE_ADDITIONAL_VALUE = 10; - private static final int BUST_COUNT = 21; + private static final int BLACKJACK_COUNT = 21; private final List value; @@ -18,7 +18,11 @@ public void add(Card card) { } public boolean isBust() { - return sum() >= BUST_COUNT; + return sum() > BLACKJACK_COUNT; + } + + public boolean isBlackJack() { + return sum() == BLACKJACK_COUNT; } public int sum() { @@ -34,7 +38,7 @@ public int sum() { } private boolean exceedBust(int sum) { - return sum + ACE_ADDITIONAL_VALUE > BUST_COUNT; + return sum + ACE_ADDITIONAL_VALUE > BLACKJACK_COUNT; } private boolean hasAce() { diff --git a/src/main/java/domain/controller/BlackJackController.java b/src/main/java/domain/controller/BlackJackController.java deleted file mode 100644 index a5dc2e2827..0000000000 --- a/src/main/java/domain/controller/BlackJackController.java +++ /dev/null @@ -1,2 +0,0 @@ -package domain.controller;public class BlackJackController { -} diff --git a/src/main/java/domain/game/GameResult.java b/src/main/java/domain/game/GameResult.java new file mode 100644 index 0000000000..958596812b --- /dev/null +++ b/src/main/java/domain/game/GameResult.java @@ -0,0 +1,33 @@ +package domain.game; + +import domain.player.Dealer; +import domain.player.Participant; +import domain.player.Player; + +import java.util.LinkedHashMap; +import java.util.List; +import java.util.Map; + +public class GameResult { + + private final Map gameResult = new LinkedHashMap<>(); + + public GameResult(List players, Dealer dealer) { + for (Player player : players) { + if (playerWinCondition(player, dealer)) { + gameResult.put(player, MatchResult.WIN); + continue; + } + gameResult.put(player, MatchResult.LOSE); + } + } + + private boolean playerWinCondition(Player player, Dealer dealer) { + return !player.getCards().isBust() + && (dealer.getCards().isBust() || dealer.getCards().sum() < player.getCards().sum()); + } + + public MatchResult getMatchResult(Player player) { + return gameResult.get(player); + } +} diff --git a/src/main/java/domain/game/MatchResult.java b/src/main/java/domain/game/MatchResult.java new file mode 100644 index 0000000000..aade6bf588 --- /dev/null +++ b/src/main/java/domain/game/MatchResult.java @@ -0,0 +1,12 @@ +package domain.game; + +public enum MatchResult { + WIN("승"), + LOSE("패"); + + private final String value; + + MatchResult(String value) { + this.value = value; + } +} diff --git a/src/main/java/domain/player/Dealer.java b/src/main/java/domain/player/Dealer.java index 7d076934b2..b3df389b28 100644 --- a/src/main/java/domain/player/Dealer.java +++ b/src/main/java/domain/player/Dealer.java @@ -13,9 +13,8 @@ public Dealer(Cards cards) { this.cards = cards; } - @Override public boolean isFinished() { - return cards.isBust() || cards.sum() > DRAW_STANDARD; + return cards.isBust() || cards.sum() > DRAW_STANDARD || cards.isBlackJack(); } @Override diff --git a/src/main/java/domain/player/Player.java b/src/main/java/domain/player/Player.java index 4c4c59ae9a..f6294ebd62 100644 --- a/src/main/java/domain/player/Player.java +++ b/src/main/java/domain/player/Player.java @@ -3,6 +3,8 @@ import domain.card.Card; import domain.card.Cards; +import java.util.Objects; + public class Player implements Participant { private final String name; private final Cards cards; @@ -14,7 +16,7 @@ public Player(String name, Cards cards) { @Override public boolean isFinished() { - return cards.isBust(); + return cards.isBust() || cards.isBlackJack(); } @Override @@ -29,4 +31,17 @@ public String getName() { public Cards getCards() { return cards; } + + @Override + public boolean equals(Object o) { + if (this == o) return true; + if (o == null || getClass() != o.getClass()) return false; + Player player = (Player) o; + return name.equals(player.name); + } + + @Override + public int hashCode() { + return Objects.hash(name); + } } diff --git a/src/test/java/domain/game/GameResultTest.java b/src/test/java/domain/game/GameResultTest.java new file mode 100644 index 0000000000..cfd19142c8 --- /dev/null +++ b/src/test/java/domain/game/GameResultTest.java @@ -0,0 +1,48 @@ +package domain.game; + +import domain.card.Card; +import domain.card.Cards; +import domain.card.Denomination; +import domain.card.Suit; +import domain.player.Dealer; +import domain.player.Player; +import org.junit.jupiter.api.DisplayName; +import org.junit.jupiter.params.ParameterizedTest; +import org.junit.jupiter.params.provider.Arguments; +import org.junit.jupiter.params.provider.MethodSource; + +import java.util.ArrayList; +import java.util.Arrays; +import java.util.List; +import java.util.stream.Stream; + +import static org.assertj.core.api.Assertions.assertThat; + +class GameResultTest { + @ParameterizedTest(name = "{0}") + @MethodSource("provideParameters") + @DisplayName("플레이어 승리") + void test(String comment, Player player, Dealer dealer) { + GameResult gameResult = new GameResult(Arrays.asList(player), dealer); + assertThat(gameResult.getMatchResult(player)).isEqualTo(MatchResult.WIN); + } + + private static Stream provideParameters() { + return Stream.of( + Arguments.arguments("플레이어가 버스트가 아니고 딜러가 버스트인 경우", + new Player("abc", new Cards(getCardList(Denomination.ACE, Denomination.NINE))), + new Dealer(new Cards(getCardList(Denomination.QUEEN, Denomination.KING, Denomination.JACK)))), + Arguments.arguments("둘 다 버스트가 아니고 딜러보다 숫자가 높은 경우", + new Player("abc", new Cards(getCardList(Denomination.KING, Denomination.QUEEN))), + new Dealer(new Cards(getCardList(Denomination.QUEEN, Denomination.NINE)))) + ); + } + + private static List getCardList(Denomination... arguments) { + List list = new ArrayList<>(); + for (Denomination denomination : arguments) { + list.add(new Card(denomination, Suit.CLOVER)); + } + return list; + } +} From dd0bdee7b25f9d5b6a53b7f78f20021f6ba7052b Mon Sep 17 00:00:00 2001 From: kimchan Date: Wed, 9 Mar 2022 10:49:09 +0900 Subject: [PATCH 12/54] =?UTF-8?q?feat=20:=20=EB=94=9C=EB=9F=AC=20=EA=B2=8C?= =?UTF-8?q?=EC=9E=84=20=EC=8A=B9=ED=8C=A8=20=ED=9A=9F=EC=88=98=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 --- src/main/java/domain/game/GameResult.java | 10 +++++++ src/test/java/domain/game/GameResultTest.java | 29 +++++++++++++++++++ 2 files changed, 39 insertions(+) diff --git a/src/main/java/domain/game/GameResult.java b/src/main/java/domain/game/GameResult.java index 958596812b..c60d57de86 100644 --- a/src/main/java/domain/game/GameResult.java +++ b/src/main/java/domain/game/GameResult.java @@ -30,4 +30,14 @@ private boolean playerWinCondition(Player player, Dealer dealer) { public MatchResult getMatchResult(Player player) { return gameResult.get(player); } + + public long getDealerWinCount() { + return gameResult.entrySet().stream() + .filter(entry -> entry.getValue() == MatchResult.LOSE) + .count(); + } + + public long getDealerLoseCount() { + return gameResult.size() - getDealerWinCount(); + } } diff --git a/src/test/java/domain/game/GameResultTest.java b/src/test/java/domain/game/GameResultTest.java index cfd19142c8..919b513634 100644 --- a/src/test/java/domain/game/GameResultTest.java +++ b/src/test/java/domain/game/GameResultTest.java @@ -7,6 +7,7 @@ import domain.player.Dealer; import domain.player.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.Arguments; import org.junit.jupiter.params.provider.MethodSource; @@ -38,6 +39,34 @@ private static Stream provideParameters() { ); } + @Test + @DisplayName("딜러가 승리한 횟수") + void dealer_win_count_test() { + Player player1 = new Player("abc1", new Cards(getCardList(Denomination.ACE, Denomination.NINE))); // 20 + Player player2 = new Player("abc2", new Cards(getCardList(Denomination.EIGHT, Denomination.NINE))); // 17 + Player player3 = new Player("abc3", new Cards(getCardList(Denomination.ACE, Denomination.NINE))); // 20 + Dealer dealer = new Dealer(new Cards(getCardList(Denomination.QUEEN, Denomination.NINE))); // 19 + + List players = Arrays.asList(player1, player2, player3); + GameResult gameResult = new GameResult(players, dealer); + + assertThat(gameResult.getDealerWinCount()).isEqualTo(1); + } + + @Test + @DisplayName("딜러가 패배한 횟수") + void dealer_lose_count_test() { + Player player1 = new Player("abc1", new Cards(getCardList(Denomination.ACE, Denomination.NINE))); // 20 + Player player2 = new Player("abc2", new Cards(getCardList(Denomination.EIGHT, Denomination.NINE))); // 17 + Player player3 = new Player("abc3", new Cards(getCardList(Denomination.ACE, Denomination.NINE))); // 20 + Dealer dealer = new Dealer(new Cards(getCardList(Denomination.QUEEN, Denomination.NINE))); // 19 + + List players = Arrays.asList(player1, player2, player3); + GameResult gameResult = new GameResult(players, dealer); + + assertThat(gameResult.getDealerLoseCount()).isEqualTo(2); + } + private static List getCardList(Denomination... arguments) { List list = new ArrayList<>(); for (Denomination denomination : arguments) { From d5a2aa63dfa6e2f752f7a96386208670ad767010 Mon Sep 17 00:00:00 2001 From: kimchan Date: Wed, 9 Mar 2022 11:22:47 +0900 Subject: [PATCH 13/54] =?UTF-8?q?feat=20:=20OutputView=20=EC=9E=91?= =?UTF-8?q?=EC=84=B1?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- src/main/java/domain/card/Card.java | 4 ++ src/main/java/domain/card/Denomination.java | 34 ++++++----- src/main/java/domain/card/Suit.java | 17 ++++-- src/main/java/domain/game/GameResult.java | 7 ++- src/main/java/domain/game/MatchResult.java | 4 ++ src/main/java/view/OutputView.java | 65 +++++++++++++++++++++ 6 files changed, 111 insertions(+), 20 deletions(-) create mode 100644 src/main/java/view/OutputView.java diff --git a/src/main/java/domain/card/Card.java b/src/main/java/domain/card/Card.java index 0a73cfc8c9..04cab271cc 100644 --- a/src/main/java/domain/card/Card.java +++ b/src/main/java/domain/card/Card.java @@ -15,6 +15,10 @@ public Denomination getDenomination() { return denomination; } + public Suit getSuit() { + return suit; + } + public int toInt() { return this.denomination.getValue(); } diff --git a/src/main/java/domain/card/Denomination.java b/src/main/java/domain/card/Denomination.java index 1b20ae1eb2..4fd7e8c447 100644 --- a/src/main/java/domain/card/Denomination.java +++ b/src/main/java/domain/card/Denomination.java @@ -1,27 +1,33 @@ package domain.card; public enum Denomination { - ACE(1), - TWO(2), - THREE(3), - FOUR(4), - FIVE(5), - SIX(6), - SEVEN(7), - EIGHT(8), - NINE(9), - TEN(10), - JACK(10), - QUEEN(10), - KING(10); + ACE(1, "A"), + TWO(2, "2"), + THREE(3, "3"), + FOUR(4, "4"), + FIVE(5, "5"), + SIX(6, "6"), + SEVEN(7, "7"), + EIGHT(8, "8"), + NINE(9, "9"), + TEN(10, "10"), + JACK(10, "J"), + QUEEN(10, "Q"), + KING(10, "K"); private final int value; + private final String name; - Denomination(int value) { + Denomination(int value, String name) { this.value = value; + this.name = name; } public int getValue() { return value; } + + public String getName() { + return name; + } } diff --git a/src/main/java/domain/card/Suit.java b/src/main/java/domain/card/Suit.java index dd1c9789b9..0df0149711 100644 --- a/src/main/java/domain/card/Suit.java +++ b/src/main/java/domain/card/Suit.java @@ -1,11 +1,18 @@ package domain.card; public enum Suit { - CLOVER, - HEART, - DIAMOND, - SPADE; + CLOVER("클로버"), + HEART("하트"), + DIAMOND("다이아몬드"), + SPADE("스페이드"); - Suit() { + private final String name; + + Suit(String name) { + this.name = name; + } + + public String getName() { + return name; } } diff --git a/src/main/java/domain/game/GameResult.java b/src/main/java/domain/game/GameResult.java index c60d57de86..2e1aaf8911 100644 --- a/src/main/java/domain/game/GameResult.java +++ b/src/main/java/domain/game/GameResult.java @@ -4,13 +4,14 @@ import domain.player.Participant; import domain.player.Player; +import java.util.Collections; import java.util.LinkedHashMap; import java.util.List; import java.util.Map; public class GameResult { - private final Map gameResult = new LinkedHashMap<>(); + private final Map gameResult = new LinkedHashMap<>(); public GameResult(List players, Dealer dealer) { for (Player player : players) { @@ -40,4 +41,8 @@ public long getDealerWinCount() { public long getDealerLoseCount() { return gameResult.size() - getDealerWinCount(); } + + public Map getGameResult() { + return Collections.unmodifiableMap(gameResult); + } } diff --git a/src/main/java/domain/game/MatchResult.java b/src/main/java/domain/game/MatchResult.java index aade6bf588..cb2acf203c 100644 --- a/src/main/java/domain/game/MatchResult.java +++ b/src/main/java/domain/game/MatchResult.java @@ -9,4 +9,8 @@ public enum MatchResult { MatchResult(String value) { this.value = value; } + + public String getValue() { + return value; + } } diff --git a/src/main/java/view/OutputView.java b/src/main/java/view/OutputView.java new file mode 100644 index 0000000000..eeb0e07f74 --- /dev/null +++ b/src/main/java/view/OutputView.java @@ -0,0 +1,65 @@ +package view; + +import domain.card.Card; +import domain.card.Cards; +import domain.game.GameResult; +import domain.game.MatchResult; +import domain.player.Dealer; +import domain.player.Player; + +import java.util.List; +import java.util.Map; +import java.util.stream.Collectors; + +public class OutputView { + private OutputView() { + + } + + public static void printInitialCards(Dealer dealer, List players) { + System.out.printf("%s와 %s에게 2장의 카드를 나누었습니다.%n", dealer.getName(), getPlayerNames(players)); + System.out.printf("%s: %s%n", dealer.getName(), getCardName(dealer.getCards().getValue().get(0))); + for (Player player : players) { + printCards(player); + } + } + + private static String getPlayerNames(List players) { + return players.stream() + .map(Player::getName) + .collect(Collectors.joining(", ")); + } + + private static String getCardNames(Cards cards) { + return cards.getValue().stream() + .map(card -> getCardName(card)) + .collect(Collectors.joining(", ")); + } + + private static String getCardName(Card card) { + return card.getDenomination().getName() + card.getSuit().getName(); + } + + public static void printCards(Player player) { + System.out.printf("%s카드: %s%n", player.getName(), getCardNames(player.getCards())); + } + + public static void printDealerDrawInfo() { + System.out.println("딜러는 16이하라 한장의 카드를 더 받았습니다."); + } + + public static void printCardsResult(Dealer dealer, List players) { + System.out.printf("%s 카드: %s - 결과: %d%n", dealer.getName(), getCardNames(dealer.getCards()), dealer.getCards().sum()); + for (Player player : players) { + System.out.printf("%s 카드: %s - 결과: %d%n", player.getName(), getCardNames(player.getCards()), player.getCards().sum()); + } + } + + public static void printGameResult(GameResult gameResult) { + Map map = gameResult.getGameResult(); + System.out.printf("딜러: %d승 %패%n", gameResult.getDealerWinCount(), gameResult.getDealerLoseCount()); + for (Player player : map.keySet()) { + System.out.printf("%s: %s%n", player.getName(), gameResult.getMatchResult(player).getValue()); + } + } +} From 54b55495ef1c39cf43b3dcdf3daa4276329c267b Mon Sep 17 00:00:00 2001 From: kimchan Date: Wed, 9 Mar 2022 11:32:18 +0900 Subject: [PATCH 14/54] =?UTF-8?q?fix=20:=20=ED=8F=AC=EB=A7=B7=20=EC=98=A4?= =?UTF-8?q?=EB=A5=98=20=EC=88=98=EC=A0=95?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- src/main/java/view/OutputView.java | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/main/java/view/OutputView.java b/src/main/java/view/OutputView.java index eeb0e07f74..c21ddcb598 100644 --- a/src/main/java/view/OutputView.java +++ b/src/main/java/view/OutputView.java @@ -57,7 +57,7 @@ public static void printCardsResult(Dealer dealer, List players) { public static void printGameResult(GameResult gameResult) { Map map = gameResult.getGameResult(); - System.out.printf("딜러: %d승 %패%n", gameResult.getDealerWinCount(), gameResult.getDealerLoseCount()); + System.out.printf("딜러: %d승 %d패%n", gameResult.getDealerWinCount(), gameResult.getDealerLoseCount()); for (Player player : map.keySet()) { System.out.printf("%s: %s%n", player.getName(), gameResult.getMatchResult(player).getValue()); } From 88fe46873e5aaa96bf9f83783bc682fe7d5b1cf4 Mon Sep 17 00:00:00 2001 From: kimchan Date: Wed, 9 Mar 2022 19:57:13 +0900 Subject: [PATCH 15/54] =?UTF-8?q?fix=20:=20=EC=B9=B4=EB=93=9C=20=EB=B6=84?= =?UTF-8?q?=EB=B0=B0=20=EB=A1=9C=EC=A7=81=20=EC=88=98=EC=A0=95?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- src/main/java/domain/card/CardDistributor.java | 18 +++++++++++------- .../java/domain/card/CardDistributorTest.java | 4 ++-- 2 files changed, 13 insertions(+), 9 deletions(-) diff --git a/src/main/java/domain/card/CardDistributor.java b/src/main/java/domain/card/CardDistributor.java index 4105a21c26..10a06ee343 100644 --- a/src/main/java/domain/card/CardDistributor.java +++ b/src/main/java/domain/card/CardDistributor.java @@ -1,23 +1,27 @@ package domain.card; -import java.util.Collections; -import java.util.Stack; +import java.util.*; public class CardDistributor { - private static final Stack deck = new Stack<>(); + private static final List CACHE = new ArrayList<>(); + private final Stack deck = new Stack<>(); static { for (Suit suit : Suit.values()) { for (Denomination denomination : Denomination.values()) { - deck.push(new Card(denomination, suit)); + CACHE.add(new Card(denomination, suit)); } } - Collections.shuffle(deck); + } + + public CardDistributor() { + Collections.shuffle(CACHE); + deck.addAll(CACHE); } public Card distribute() { - if (deck == null || deck.empty()) { - throw new IllegalArgumentException("[ERROR]"); + if (deck == null || deck.isEmpty()) { + throw new IllegalArgumentException("[ERROR] 카드가 모두 소요됐습니다."); } return deck.pop(); } diff --git a/src/test/java/domain/card/CardDistributorTest.java b/src/test/java/domain/card/CardDistributorTest.java index 444e37598b..2e24f1b1c4 100644 --- a/src/test/java/domain/card/CardDistributorTest.java +++ b/src/test/java/domain/card/CardDistributorTest.java @@ -16,11 +16,11 @@ void distribute() { @Test void failed() { CardDistributor cardDistributor = new CardDistributor(); - for (int i = 0; i < 51; i++) { + for (int i = 0; i < 52; i++) { cardDistributor.distribute(); } assertThatThrownBy(cardDistributor::distribute) .isInstanceOf(IllegalArgumentException.class) - .hasMessageContaining("[ERROR]"); + .hasMessageContaining("[ERROR] 카드가 모두 소요됐습니다."); } } From a4d8dfc6a3cac3e13f6a8bc0ec290766fe531720 Mon Sep 17 00:00:00 2001 From: kimchan Date: Wed, 9 Mar 2022 20:00:10 +0900 Subject: [PATCH 16/54] =?UTF-8?q?feat=20:=20Name=EC=9C=BC=EB=A1=9C=20?= =?UTF-8?q?=EC=9B=90=EC=8B=9C=EA=B0=92=20=ED=8F=AC=EC=9E=A5?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- src/main/java/domain/player/Dealer.java | 4 +-- src/main/java/domain/player/Name.java | 35 +++++++++++++++++++ src/main/java/domain/player/Player.java | 6 ++-- src/main/java/view/InputView.java | 28 ++++++--------- src/main/java/view/OutputView.java | 2 +- src/test/java/domain/card/CardTest.java | 3 ++ src/test/java/domain/card/CardsTest.java | 3 +- src/test/java/domain/game/GameResultTest.java | 17 ++++----- src/test/java/domain/player/PlayerTest.java | 4 +-- 9 files changed, 68 insertions(+), 34 deletions(-) create mode 100644 src/main/java/domain/player/Name.java diff --git a/src/main/java/domain/player/Dealer.java b/src/main/java/domain/player/Dealer.java index b3df389b28..22a25690cc 100644 --- a/src/main/java/domain/player/Dealer.java +++ b/src/main/java/domain/player/Dealer.java @@ -6,7 +6,7 @@ public class Dealer implements Participant { private static final int DRAW_STANDARD = 16; - private final String name = "딜러"; + private final Name name = new Name("딜러"); private final Cards cards; public Dealer(Cards cards) { @@ -22,7 +22,7 @@ public void drawCard(Card card) { cards.add(card); } - public String getName() { + public Name getName() { return name; } diff --git a/src/main/java/domain/player/Name.java b/src/main/java/domain/player/Name.java new file mode 100644 index 0000000000..4cdf9f702d --- /dev/null +++ b/src/main/java/domain/player/Name.java @@ -0,0 +1,35 @@ +package domain.player; + +import java.util.Objects; + +public class Name { + private final String value; + + public Name(String value) { + validate(value); + this.value = value; + } + + private void validate(String value) { + if (value == null || value.isBlank()) { + throw new IllegalArgumentException("[ERROR] 빈 값은 이름으로 등록할 수 없습니다."); + } + } + + public String getValue() { + return value; + } + + @Override + public boolean equals(Object o) { + if (this == o) return true; + if (o == null || getClass() != o.getClass()) return false; + Name name = (Name) o; + return value.equals(name.value); + } + + @Override + public int hashCode() { + return Objects.hash(value); + } +} diff --git a/src/main/java/domain/player/Player.java b/src/main/java/domain/player/Player.java index f6294ebd62..dbfa59b37d 100644 --- a/src/main/java/domain/player/Player.java +++ b/src/main/java/domain/player/Player.java @@ -6,10 +6,10 @@ import java.util.Objects; public class Player implements Participant { - private final String name; + private final Name name; private final Cards cards; - public Player(String name, Cards cards) { + public Player(Name name, Cards cards) { this.name = name; this.cards = cards; } @@ -24,7 +24,7 @@ public void drawCard(Card card) { cards.add(card); } - public String getName() { + public Name getName() { return name; } diff --git a/src/main/java/view/InputView.java b/src/main/java/view/InputView.java index dd13347f35..22a31c33af 100644 --- a/src/main/java/view/InputView.java +++ b/src/main/java/view/InputView.java @@ -1,8 +1,11 @@ package view; +import domain.player.Name; + 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); @@ -11,31 +14,22 @@ private InputView() { } - public static List inputPlayerNames() { + public static List inputPlayerNames() { System.out.println("게임에 참여할 사람의 이름을 입력하세요.(쉼표 기준으로 분리)"); String input = scanner.nextLine(); - List names = Arrays.asList(input.split(",", -1)); - validateNames(names); - + List names = toNameList(Arrays.asList(input.split(",", -1))); + checkDistinct(names); return names; } - private static void validateNames(List list) { - checkEmpty(list); - checkDistinct(list); - } - - private static void checkEmpty(List list) { - boolean isEmpty = list.stream() - .anyMatch(string -> string == null || string.isBlank()); - - if (isEmpty) { - throw new IllegalArgumentException("[ERROR] 빈 값은 이름으로 등록할 수 없습니다."); - } + private static List toNameList(List names) { + return names.stream() + .map(name -> new Name(name.trim())) + .collect(Collectors.toUnmodifiableList()); } - private static void checkDistinct(List list) { + private static void checkDistinct(List list) { long distinctCount = list.stream() .distinct() .count(); diff --git a/src/main/java/view/OutputView.java b/src/main/java/view/OutputView.java index c21ddcb598..a627056419 100644 --- a/src/main/java/view/OutputView.java +++ b/src/main/java/view/OutputView.java @@ -26,7 +26,7 @@ public static void printInitialCards(Dealer dealer, List players) { private static String getPlayerNames(List players) { return players.stream() - .map(Player::getName) + .map(player -> player.getName().getValue()) .collect(Collectors.joining(", ")); } diff --git a/src/test/java/domain/card/CardTest.java b/src/test/java/domain/card/CardTest.java index d451dd6192..6bb7434e64 100644 --- a/src/test/java/domain/card/CardTest.java +++ b/src/test/java/domain/card/CardTest.java @@ -1,6 +1,9 @@ package domain.card; import org.junit.jupiter.api.Test; +import org.junit.jupiter.params.ParameterizedTest; +import org.junit.jupiter.params.provider.ValueSource; +import org.junit.jupiter.params.shadow.com.univocity.parsers.annotations.Validate; import static org.assertj.core.api.Assertions.assertThatNoException; diff --git a/src/test/java/domain/card/CardsTest.java b/src/test/java/domain/card/CardsTest.java index 56533c914e..1c8041b4d1 100644 --- a/src/test/java/domain/card/CardsTest.java +++ b/src/test/java/domain/card/CardsTest.java @@ -8,6 +8,7 @@ import java.util.ArrayList; import java.util.Arrays; +import java.util.Collections; import java.util.List; import java.util.stream.Stream; @@ -19,7 +20,7 @@ public class CardsTest { @MethodSource("provideParameters") @DisplayName("단일 카드 총합 구하기") void sum(Denomination denomination, int expect) { - Cards cards = new Cards(Arrays.asList(new Card(denomination, Suit.CLOVER))); + Cards cards = new Cards(Collections.singletonList(new Card(denomination, Suit.CLOVER))); assertThat(cards.sum()).isEqualTo(expect); } diff --git a/src/test/java/domain/game/GameResultTest.java b/src/test/java/domain/game/GameResultTest.java index 919b513634..022323b4ec 100644 --- a/src/test/java/domain/game/GameResultTest.java +++ b/src/test/java/domain/game/GameResultTest.java @@ -5,6 +5,7 @@ import domain.card.Denomination; import domain.card.Suit; import domain.player.Dealer; +import domain.player.Name; import domain.player.Player; import org.junit.jupiter.api.DisplayName; import org.junit.jupiter.api.Test; @@ -31,10 +32,10 @@ void test(String comment, Player player, Dealer dealer) { private static Stream provideParameters() { return Stream.of( Arguments.arguments("플레이어가 버스트가 아니고 딜러가 버스트인 경우", - new Player("abc", new Cards(getCardList(Denomination.ACE, Denomination.NINE))), + new Player(new Name("abc"), new Cards(getCardList(Denomination.ACE, Denomination.NINE))), new Dealer(new Cards(getCardList(Denomination.QUEEN, Denomination.KING, Denomination.JACK)))), Arguments.arguments("둘 다 버스트가 아니고 딜러보다 숫자가 높은 경우", - new Player("abc", new Cards(getCardList(Denomination.KING, Denomination.QUEEN))), + new Player(new Name("abc"), new Cards(getCardList(Denomination.KING, Denomination.QUEEN))), new Dealer(new Cards(getCardList(Denomination.QUEEN, Denomination.NINE)))) ); } @@ -42,9 +43,9 @@ private static Stream provideParameters() { @Test @DisplayName("딜러가 승리한 횟수") void dealer_win_count_test() { - Player player1 = new Player("abc1", new Cards(getCardList(Denomination.ACE, Denomination.NINE))); // 20 - Player player2 = new Player("abc2", new Cards(getCardList(Denomination.EIGHT, Denomination.NINE))); // 17 - Player player3 = new Player("abc3", new Cards(getCardList(Denomination.ACE, Denomination.NINE))); // 20 + Player player1 = new Player(new Name("abc1"), new Cards(getCardList(Denomination.ACE, Denomination.NINE))); // 20 + Player player2 = new Player(new Name("abc2"), new Cards(getCardList(Denomination.EIGHT, Denomination.NINE))); // 17 + Player player3 = new Player(new Name("abc3"), new Cards(getCardList(Denomination.ACE, Denomination.NINE))); // 20 Dealer dealer = new Dealer(new Cards(getCardList(Denomination.QUEEN, Denomination.NINE))); // 19 List players = Arrays.asList(player1, player2, player3); @@ -56,9 +57,9 @@ void dealer_win_count_test() { @Test @DisplayName("딜러가 패배한 횟수") void dealer_lose_count_test() { - Player player1 = new Player("abc1", new Cards(getCardList(Denomination.ACE, Denomination.NINE))); // 20 - Player player2 = new Player("abc2", new Cards(getCardList(Denomination.EIGHT, Denomination.NINE))); // 17 - Player player3 = new Player("abc3", new Cards(getCardList(Denomination.ACE, Denomination.NINE))); // 20 + Player player1 = new Player(new Name("abc1"), new Cards(getCardList(Denomination.ACE, Denomination.NINE))); // 20 + Player player2 = new Player(new Name("abc2"), new Cards(getCardList(Denomination.EIGHT, Denomination.NINE))); // 17 + Player player3 = new Player(new Name("abc3"), new Cards(getCardList(Denomination.ACE, Denomination.NINE))); // 20 Dealer dealer = new Dealer(new Cards(getCardList(Denomination.QUEEN, Denomination.NINE))); // 19 List players = Arrays.asList(player1, player2, player3); diff --git a/src/test/java/domain/player/PlayerTest.java b/src/test/java/domain/player/PlayerTest.java index 83fa9ecb75..dd7e1f9ebe 100644 --- a/src/test/java/domain/player/PlayerTest.java +++ b/src/test/java/domain/player/PlayerTest.java @@ -22,7 +22,7 @@ public class PlayerTest { @MethodSource("provideParameters") @DisplayName("턴 강제 종료 여부") void player(String comment,Cards cards, boolean expect) { - Player player = new Player("name", cards); + Player player = new Player(new Name("name"), cards); assertThat(player.isFinished()).isEqualTo(expect); } @@ -43,7 +43,7 @@ private static List getCardList(Denomination... arguments) { @Test void drawCard() { - Player player = new Player("name", new Cards(getCardList(Denomination.QUEEN))); + Player player = new Player(new Name("name"), new Cards(getCardList(Denomination.QUEEN))); player.drawCard(new Card(Denomination.ACE, Suit.CLOVER)); assertThat(player.getCards().getValue().size()).isEqualTo(2); } From 572574435d4170a663edfa694b3335acdbf60ff0 Mon Sep 17 00:00:00 2001 From: kimchan Date: Wed, 9 Mar 2022 20:03:35 +0900 Subject: [PATCH 17/54] =?UTF-8?q?style=20:=20=EB=B6=88=ED=95=84=EC=9A=94?= =?UTF-8?q?=ED=95=9C=20import=20=EC=A0=9C=EA=B1=B0?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- src/main/java/domain/game/GameResult.java | 1 - 1 file changed, 1 deletion(-) diff --git a/src/main/java/domain/game/GameResult.java b/src/main/java/domain/game/GameResult.java index 2e1aaf8911..63ca355862 100644 --- a/src/main/java/domain/game/GameResult.java +++ b/src/main/java/domain/game/GameResult.java @@ -1,7 +1,6 @@ package domain.game; import domain.player.Dealer; -import domain.player.Participant; import domain.player.Player; import java.util.Collections; From 197bc05112c47ce12428670eb6804278df96556a Mon Sep 17 00:00:00 2001 From: kimchan Date: Wed, 9 Mar 2022 20:44:51 +0900 Subject: [PATCH 18/54] =?UTF-8?q?refactor=20:=20=ED=95=98=EB=93=9C=20?= =?UTF-8?q?=EC=BD=94=EB=94=A9=20=EC=A0=9C=EA=B1=B0=20=EB=B0=8F=20toString?= =?UTF-8?q?=20=EB=A9=94=EC=84=9C=EB=93=9C=20=EC=B6=94=EA=B0=80?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- src/main/java/domain/card/Card.java | 2 +- .../java/domain/card/CardDistributor.java | 16 ++++++++++++++-- src/main/java/domain/card/Cards.java | 10 +++++++++- src/main/java/domain/game/GameResult.java | 16 ++++++++++++---- src/main/java/domain/player/Dealer.java | 13 +++++++++++-- src/main/java/domain/player/Name.java | 13 +++++++++++-- src/main/java/domain/player/Player.java | 8 ++++++++ src/main/java/view/InputView.java | 19 +++++++++++-------- src/main/java/view/OutputView.java | 15 ++++++++++----- 9 files changed, 87 insertions(+), 25 deletions(-) diff --git a/src/main/java/domain/card/Card.java b/src/main/java/domain/card/Card.java index 04cab271cc..e54c36ea62 100644 --- a/src/main/java/domain/card/Card.java +++ b/src/main/java/domain/card/Card.java @@ -6,7 +6,7 @@ public class Card { private final Denomination denomination; private final Suit suit; - public Card(Denomination denomination, Suit suit) { + public Card(final Denomination denomination, final Suit suit) { this.denomination = denomination; this.suit = suit; } diff --git a/src/main/java/domain/card/CardDistributor.java b/src/main/java/domain/card/CardDistributor.java index 10a06ee343..2e98c720ad 100644 --- a/src/main/java/domain/card/CardDistributor.java +++ b/src/main/java/domain/card/CardDistributor.java @@ -1,9 +1,14 @@ package domain.card; -import java.util.*; +import java.util.ArrayList; +import java.util.Collections; +import java.util.List; +import java.util.Stack; public class CardDistributor { + private static final String DECK_IS_EMPTY = "[ERROR] 카드가 모두 소요됐습니다."; private static final List CACHE = new ArrayList<>(); + private final Stack deck = new Stack<>(); static { @@ -21,8 +26,15 @@ public CardDistributor() { public Card distribute() { if (deck == null || deck.isEmpty()) { - throw new IllegalArgumentException("[ERROR] 카드가 모두 소요됐습니다."); + throw new IllegalArgumentException(DECK_IS_EMPTY); } return deck.pop(); } + + @Override + public String toString() { + return "CardDistributor{" + + "deck=" + deck + + '}'; + } } diff --git a/src/main/java/domain/card/Cards.java b/src/main/java/domain/card/Cards.java index 7bb826efcc..30d7e65f4d 100644 --- a/src/main/java/domain/card/Cards.java +++ b/src/main/java/domain/card/Cards.java @@ -1,6 +1,7 @@ package domain.card; import java.util.ArrayList; +import java.util.Collections; import java.util.List; public class Cards { @@ -47,6 +48,13 @@ private boolean hasAce() { } public List getValue() { - return value; + return Collections.unmodifiableList(value); + } + + @Override + public String toString() { + return "Cards{" + + "value=" + value + + '}'; } } diff --git a/src/main/java/domain/game/GameResult.java b/src/main/java/domain/game/GameResult.java index 63ca355862..615b5a2e22 100644 --- a/src/main/java/domain/game/GameResult.java +++ b/src/main/java/domain/game/GameResult.java @@ -3,16 +3,17 @@ import domain.player.Dealer; import domain.player.Player; -import java.util.Collections; -import java.util.LinkedHashMap; -import java.util.List; -import java.util.Map; +import java.util.*; public class GameResult { private final Map gameResult = new LinkedHashMap<>(); public GameResult(List players, Dealer dealer) { + initialGameResult(new ArrayList<>(players), dealer); + } + + private void initialGameResult(List players, Dealer dealer) { for (Player player : players) { if (playerWinCondition(player, dealer)) { gameResult.put(player, MatchResult.WIN); @@ -44,4 +45,11 @@ public long getDealerLoseCount() { public Map getGameResult() { return Collections.unmodifiableMap(gameResult); } + + @Override + public String toString() { + return "GameResult{" + + "gameResult=" + gameResult + + '}'; + } } diff --git a/src/main/java/domain/player/Dealer.java b/src/main/java/domain/player/Dealer.java index 22a25690cc..39ef703942 100644 --- a/src/main/java/domain/player/Dealer.java +++ b/src/main/java/domain/player/Dealer.java @@ -4,9 +4,10 @@ import domain.card.Cards; public class Dealer implements Participant { - private static final int DRAW_STANDARD = 16; + private static final String DEALER_NAME = "딜러"; + public static final int DRAW_STANDARD = 16; - private final Name name = new Name("딜러"); + private final Name name = new Name(DEALER_NAME); private final Cards cards; public Dealer(Cards cards) { @@ -29,4 +30,12 @@ public Name getName() { public Cards getCards() { return cards; } + + @Override + public String toString() { + return "Dealer{" + + "name=" + name + + ", cards=" + cards + + '}'; + } } diff --git a/src/main/java/domain/player/Name.java b/src/main/java/domain/player/Name.java index 4cdf9f702d..8f889fc03a 100644 --- a/src/main/java/domain/player/Name.java +++ b/src/main/java/domain/player/Name.java @@ -3,16 +3,18 @@ import java.util.Objects; public class Name { + private static final String EMPTY_NAME_ERROR = "[ERROR] 빈 값은 이름으로 등록할 수 없습니다."; + private final String value; - public Name(String value) { + public Name(final String value) { validate(value); this.value = value; } private void validate(String value) { if (value == null || value.isBlank()) { - throw new IllegalArgumentException("[ERROR] 빈 값은 이름으로 등록할 수 없습니다."); + throw new IllegalArgumentException(EMPTY_NAME_ERROR); } } @@ -32,4 +34,11 @@ public boolean equals(Object o) { public int hashCode() { return Objects.hash(value); } + + @Override + public String toString() { + return "Name{" + + "value='" + value + '\'' + + '}'; + } } diff --git a/src/main/java/domain/player/Player.java b/src/main/java/domain/player/Player.java index dbfa59b37d..07a091dde7 100644 --- a/src/main/java/domain/player/Player.java +++ b/src/main/java/domain/player/Player.java @@ -44,4 +44,12 @@ public boolean equals(Object o) { public int hashCode() { return Objects.hash(name); } + + @Override + public String toString() { + return "Player{" + + "name=" + name + + ", cards=" + cards + + '}'; + } } diff --git a/src/main/java/view/InputView.java b/src/main/java/view/InputView.java index 22a31c33af..540c140531 100644 --- a/src/main/java/view/InputView.java +++ b/src/main/java/view/InputView.java @@ -9,6 +9,9 @@ public class InputView { private static final Scanner scanner = new Scanner(System.in); + private static final String NAME_DELIMITER = ","; + private static final String YES = "y"; + private static final String NO = "n"; private InputView() { @@ -18,7 +21,7 @@ public static List inputPlayerNames() { System.out.println("게임에 참여할 사람의 이름을 입력하세요.(쉼표 기준으로 분리)"); String input = scanner.nextLine(); - List names = toNameList(Arrays.asList(input.split(",", -1))); + List names = toNameList(Arrays.asList(input.split(NAME_DELIMITER, -1))); checkDistinct(names); return names; } @@ -29,30 +32,30 @@ private static List toNameList(List names) { .collect(Collectors.toUnmodifiableList()); } - private static void checkDistinct(List list) { - long distinctCount = list.stream() + private static void checkDistinct(List names) { + long distinctCount = names.stream() .distinct() .count(); - if (distinctCount != list.size()) { + if (distinctCount != names.size()) { throw new IllegalArgumentException("[ERROR] 중복 이름은 불가능합니다."); } } public static boolean inputWantDraw(String name) { - System.out.printf("%s는 한장의 카드를 더 받겠습니까?(예는 y, 아니오는 n)%n", name); + System.out.printf("%s는 한장의 카드를 더 받겠습니까?(예는 %s, 아니오는 %s)%n", name, YES, NO); String input = scanner.nextLine().toLowerCase(); return toBoolean(input); } private static boolean toBoolean(String input) { validateWantDraw(input); - return "y".equals(input); + return YES.equals(input); } private static void validateWantDraw(String input) { - if (!"y".equals(input) && !"n".equals(input)) { - throw new IllegalArgumentException("[ERROR] y 또는 n을 입력해주세요."); + if (!YES.equals(input) && !NO.equals(input)) { + throw new IllegalArgumentException(String.format("[ERROR] %s 또는 %s을 입력해주세요.", YES, NO)); } } } diff --git a/src/main/java/view/OutputView.java b/src/main/java/view/OutputView.java index a627056419..c387c2da74 100644 --- a/src/main/java/view/OutputView.java +++ b/src/main/java/view/OutputView.java @@ -12,6 +12,9 @@ import java.util.stream.Collectors; public class OutputView { + + private static final String JOIN_DELIMITER = ", "; + private OutputView() { } @@ -27,13 +30,13 @@ public static void printInitialCards(Dealer dealer, List players) { private static String getPlayerNames(List players) { return players.stream() .map(player -> player.getName().getValue()) - .collect(Collectors.joining(", ")); + .collect(Collectors.joining(JOIN_DELIMITER)); } private static String getCardNames(Cards cards) { return cards.getValue().stream() .map(card -> getCardName(card)) - .collect(Collectors.joining(", ")); + .collect(Collectors.joining(JOIN_DELIMITER)); } private static String getCardName(Card card) { @@ -45,13 +48,15 @@ public static void printCards(Player player) { } public static void printDealerDrawInfo() { - System.out.println("딜러는 16이하라 한장의 카드를 더 받았습니다."); + System.out.printf("딜러는 %d이하라 한장의 카드를 더 받았습니다.%n", Dealer.DRAW_STANDARD); } public static void printCardsResult(Dealer dealer, List players) { - System.out.printf("%s 카드: %s - 결과: %d%n", dealer.getName(), getCardNames(dealer.getCards()), dealer.getCards().sum()); + System.out.printf("%s 카드: %s - 결과: %d%n", + dealer.getName(), getCardNames(dealer.getCards()), dealer.getCards().sum()); for (Player player : players) { - System.out.printf("%s 카드: %s - 결과: %d%n", player.getName(), getCardNames(player.getCards()), player.getCards().sum()); + System.out.printf("%s 카드: %s - 결과: %d%n", + player.getName(), getCardNames(player.getCards()), player.getCards().sum()); } } From 66912dba0703c4f43dd70c731de4ab48568ec869 Mon Sep 17 00:00:00 2001 From: kimchan Date: Wed, 9 Mar 2022 20:47:33 +0900 Subject: [PATCH 19/54] =?UTF-8?q?feat=20:=20=EA=B2=8C=EC=9E=84=EC=9D=84=20?= =?UTF-8?q?=EC=A7=84=ED=96=89=ED=95=98=EB=8A=94=20BlackJackGame=20?= =?UTF-8?q?=EC=83=9D=EC=84=B1?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- src/main/java/domain/game/BlackJackGame.java | 52 +++++++++++++++++++ .../java/domain/game/BlackJackGameTest.java | 36 +++++++++++++ 2 files changed, 88 insertions(+) create mode 100644 src/main/java/domain/game/BlackJackGame.java create mode 100644 src/test/java/domain/game/BlackJackGameTest.java diff --git a/src/main/java/domain/game/BlackJackGame.java b/src/main/java/domain/game/BlackJackGame.java new file mode 100644 index 0000000000..34fd04b6c1 --- /dev/null +++ b/src/main/java/domain/game/BlackJackGame.java @@ -0,0 +1,52 @@ +package domain.game; + +import domain.card.Card; +import domain.card.CardDistributor; +import domain.card.Cards; +import domain.player.Dealer; +import domain.player.Name; +import domain.player.Player; + +import java.util.ArrayList; +import java.util.List; +import java.util.stream.Collectors; + +public class BlackJackGame { + // TODO players + dealer 합칠 방법 생각해보기 + private final List players; + private final Dealer dealer; + private final CardDistributor cardDistributor; + + public BlackJackGame(List names) { + this.cardDistributor = new CardDistributor(); + this.players = initializePlayers(new ArrayList<>(names)); + this.dealer = new Dealer(drawInitialCards()); + } + + private List initializePlayers(List names) { + return names.stream() + .map(name -> new Player(name, drawInitialCards())) + .collect(Collectors.toUnmodifiableList()); + } + + private Cards drawInitialCards() { + List cards = new ArrayList<>(); + cards.add(cardDistributor.distribute()); + cards.add(cardDistributor.distribute()); + return new Cards(cards); + } + + public void drawPlayerCard(Player player) { + int index = players.indexOf(player); + Player nowPlayer = players.get(index); + nowPlayer.drawCard(cardDistributor.distribute()); + } + + public List getPlayers() { + return players; + } + + public Dealer getDealer() { + return dealer; + } +} diff --git a/src/test/java/domain/game/BlackJackGameTest.java b/src/test/java/domain/game/BlackJackGameTest.java new file mode 100644 index 0000000000..a14a9e4103 --- /dev/null +++ b/src/test/java/domain/game/BlackJackGameTest.java @@ -0,0 +1,36 @@ +package domain.game; + +import domain.player.Name; +import domain.player.Player; +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 BlackJackGameTest { + @Test + @DisplayName("게임 초기화 시 각 플레이어는 2장의 카드를 분배받는다.") + void create() { + List names = Arrays.asList(new Name("pobi"), new Name("jason")); + BlackJackGame blackJackGame = new BlackJackGame(names); + boolean match = blackJackGame.getPlayers().stream() + .mapToInt(player -> player.getCards().getValue().size()) + .anyMatch(cardSize -> cardSize != 2); + assertThat(match).isFalse(); + } + + @Test + @DisplayName("플레이어 카드 추가") + void player_card_add() { + List names = Arrays.asList(new Name("pobi"), new Name("jason")); + BlackJackGame blackJackGame = new BlackJackGame(names); + Player player = blackJackGame.getPlayers().get(0); + blackJackGame.drawPlayerCard(player); + + assertThat(blackJackGame.getPlayers().get(0).getCards().getValue().size()) + .isEqualTo(3); + } +} From aad861c9796c76c66d8def4f800c91bd8694cf32 Mon Sep 17 00:00:00 2001 From: kimchan Date: Thu, 10 Mar 2022 12:01:47 +0900 Subject: [PATCH 20/54] =?UTF-8?q?refactor=20:=20Participant=EB=A5=BC=20?= =?UTF-8?q?=EC=9D=B8=ED=84=B0=ED=8E=98=EC=9D=B4=EC=8A=A4=EC=97=90=EC=84=9C?= =?UTF-8?q?=20=EC=B6=94=EC=83=81=ED=81=B4=EB=9E=98=EC=8A=A4=EB=A1=9C=20?= =?UTF-8?q?=EB=B3=80=EA=B2=BD?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- src/main/java/domain/game/BlackJackGame.java | 9 ++-- src/main/java/domain/game/GameResult.java | 4 +- src/main/java/domain/participant/Dealer.java | 25 +++++++++++ .../domain/{player => participant}/Name.java | 15 +------ .../Participant.java} | 28 ++++--------- src/main/java/domain/participant/Player.java | 23 +++++++++++ src/main/java/domain/player/Dealer.java | 41 ------------------- src/main/java/domain/player/Participant.java | 8 ---- src/main/java/view/InputView.java | 2 +- src/main/java/view/OutputView.java | 4 +- .../java/domain/game/BlackJackGameTest.java | 4 +- src/test/java/domain/game/GameResultTest.java | 14 +++---- .../{player => participant}/DealerTest.java | 6 +-- .../{player => participant}/PlayerTest.java | 2 +- 14 files changed, 79 insertions(+), 106 deletions(-) create mode 100644 src/main/java/domain/participant/Dealer.java rename src/main/java/domain/{player => participant}/Name.java (66%) rename src/main/java/domain/{player/Player.java => participant/Participant.java} (51%) create mode 100644 src/main/java/domain/participant/Player.java delete mode 100644 src/main/java/domain/player/Dealer.java delete mode 100644 src/main/java/domain/player/Participant.java rename src/test/java/domain/{player => participant}/DealerTest.java (90%) rename src/test/java/domain/{player => participant}/PlayerTest.java (98%) diff --git a/src/main/java/domain/game/BlackJackGame.java b/src/main/java/domain/game/BlackJackGame.java index 34fd04b6c1..41611a46b6 100644 --- a/src/main/java/domain/game/BlackJackGame.java +++ b/src/main/java/domain/game/BlackJackGame.java @@ -3,16 +3,15 @@ import domain.card.Card; import domain.card.CardDistributor; import domain.card.Cards; -import domain.player.Dealer; -import domain.player.Name; -import domain.player.Player; +import domain.participant.Dealer; +import domain.participant.Name; +import domain.participant.Player; import java.util.ArrayList; import java.util.List; import java.util.stream.Collectors; public class BlackJackGame { - // TODO players + dealer 합칠 방법 생각해보기 private final List players; private final Dealer dealer; private final CardDistributor cardDistributor; @@ -20,7 +19,7 @@ public class BlackJackGame { public BlackJackGame(List names) { this.cardDistributor = new CardDistributor(); this.players = initializePlayers(new ArrayList<>(names)); - this.dealer = new Dealer(drawInitialCards()); + this.dealer = new Dealer(new Name("딜러"), drawInitialCards()); } private List initializePlayers(List names) { diff --git a/src/main/java/domain/game/GameResult.java b/src/main/java/domain/game/GameResult.java index 615b5a2e22..d790d221e1 100644 --- a/src/main/java/domain/game/GameResult.java +++ b/src/main/java/domain/game/GameResult.java @@ -1,7 +1,7 @@ package domain.game; -import domain.player.Dealer; -import domain.player.Player; +import domain.participant.Dealer; +import domain.participant.Player; import java.util.*; diff --git a/src/main/java/domain/participant/Dealer.java b/src/main/java/domain/participant/Dealer.java new file mode 100644 index 0000000000..bfea36611e --- /dev/null +++ b/src/main/java/domain/participant/Dealer.java @@ -0,0 +1,25 @@ +package domain.participant; + +import domain.card.Cards; + +public class Dealer extends Participant { + + public static final int DRAW_STANDARD = 16; + + public Dealer(Name name, Cards cards) { + super(name, cards); + } + + @Override + public boolean isFinished() { + return cards.isBust() || cards.sum() > DRAW_STANDARD || cards.isBlackJack(); + } + + @Override + public String toString() { + return "Dealer{" + + "name=" + name + + ", cards=" + cards + + '}'; + } +} diff --git a/src/main/java/domain/player/Name.java b/src/main/java/domain/participant/Name.java similarity index 66% rename from src/main/java/domain/player/Name.java rename to src/main/java/domain/participant/Name.java index 8f889fc03a..1d43cf0c98 100644 --- a/src/main/java/domain/player/Name.java +++ b/src/main/java/domain/participant/Name.java @@ -1,4 +1,4 @@ -package domain.player; +package domain.participant; import java.util.Objects; @@ -22,19 +22,6 @@ public String getValue() { return value; } - @Override - public boolean equals(Object o) { - if (this == o) return true; - if (o == null || getClass() != o.getClass()) return false; - Name name = (Name) o; - return value.equals(name.value); - } - - @Override - public int hashCode() { - return Objects.hash(value); - } - @Override public String toString() { return "Name{" + diff --git a/src/main/java/domain/player/Player.java b/src/main/java/domain/participant/Participant.java similarity index 51% rename from src/main/java/domain/player/Player.java rename to src/main/java/domain/participant/Participant.java index 07a091dde7..e9e0b86f2b 100644 --- a/src/main/java/domain/player/Player.java +++ b/src/main/java/domain/participant/Participant.java @@ -1,25 +1,21 @@ -package domain.player; +package domain.participant; import domain.card.Card; import domain.card.Cards; import java.util.Objects; -public class Player implements Participant { - private final Name name; - private final Cards cards; +public abstract class Participant { + protected final Name name; + protected final Cards cards; - public Player(Name name, Cards cards) { + public Participant(Name name, Cards cards) { this.name = name; this.cards = cards; } - @Override - public boolean isFinished() { - return cards.isBust() || cards.isBlackJack(); - } + abstract boolean isFinished(); - @Override public void drawCard(Card card) { cards.add(card); } @@ -36,20 +32,12 @@ public Cards getCards() { public boolean equals(Object o) { if (this == o) return true; if (o == null || getClass() != o.getClass()) return false; - Player player = (Player) o; - return name.equals(player.name); + Participant that = (Participant) o; + return name.equals(that.name); } @Override public int hashCode() { return Objects.hash(name); } - - @Override - public String toString() { - return "Player{" + - "name=" + name + - ", cards=" + cards + - '}'; - } } diff --git a/src/main/java/domain/participant/Player.java b/src/main/java/domain/participant/Player.java new file mode 100644 index 0000000000..ffbc6df142 --- /dev/null +++ b/src/main/java/domain/participant/Player.java @@ -0,0 +1,23 @@ +package domain.participant; + +import domain.card.Cards; + +public class Player extends Participant { + + public Player(Name name, Cards cards) { + super(name, cards); + } + + @Override + public boolean isFinished() { + return cards.isBust() || cards.isBlackJack(); + } + + @Override + public String toString() { + return "Player{" + + "name=" + name + + ", cards=" + cards + + '}'; + } +} diff --git a/src/main/java/domain/player/Dealer.java b/src/main/java/domain/player/Dealer.java deleted file mode 100644 index 39ef703942..0000000000 --- a/src/main/java/domain/player/Dealer.java +++ /dev/null @@ -1,41 +0,0 @@ -package domain.player; - -import domain.card.Card; -import domain.card.Cards; - -public class Dealer implements Participant { - private static final String DEALER_NAME = "딜러"; - public static final int DRAW_STANDARD = 16; - - private final Name name = new Name(DEALER_NAME); - private final Cards cards; - - public Dealer(Cards cards) { - this.cards = cards; - } - - public boolean isFinished() { - return cards.isBust() || cards.sum() > DRAW_STANDARD || cards.isBlackJack(); - } - - @Override - public void drawCard(Card card) { - cards.add(card); - } - - public Name getName() { - return name; - } - - public Cards getCards() { - return cards; - } - - @Override - public String toString() { - return "Dealer{" + - "name=" + name + - ", cards=" + cards + - '}'; - } -} diff --git a/src/main/java/domain/player/Participant.java b/src/main/java/domain/player/Participant.java deleted file mode 100644 index d4860f4201..0000000000 --- a/src/main/java/domain/player/Participant.java +++ /dev/null @@ -1,8 +0,0 @@ -package domain.player; - -import domain.card.Card; - -public interface Participant { - boolean isFinished(); - void drawCard(Card card); -} diff --git a/src/main/java/view/InputView.java b/src/main/java/view/InputView.java index 540c140531..89cde780e8 100644 --- a/src/main/java/view/InputView.java +++ b/src/main/java/view/InputView.java @@ -1,6 +1,6 @@ package view; -import domain.player.Name; +import domain.participant.Name; import java.util.Arrays; import java.util.List; diff --git a/src/main/java/view/OutputView.java b/src/main/java/view/OutputView.java index c387c2da74..9da61b6c7f 100644 --- a/src/main/java/view/OutputView.java +++ b/src/main/java/view/OutputView.java @@ -4,8 +4,8 @@ import domain.card.Cards; import domain.game.GameResult; import domain.game.MatchResult; -import domain.player.Dealer; -import domain.player.Player; +import domain.participant.Dealer; +import domain.participant.Player; import java.util.List; import java.util.Map; diff --git a/src/test/java/domain/game/BlackJackGameTest.java b/src/test/java/domain/game/BlackJackGameTest.java index a14a9e4103..1769788416 100644 --- a/src/test/java/domain/game/BlackJackGameTest.java +++ b/src/test/java/domain/game/BlackJackGameTest.java @@ -1,7 +1,7 @@ package domain.game; -import domain.player.Name; -import domain.player.Player; +import domain.participant.Name; +import domain.participant.Player; import org.junit.jupiter.api.DisplayName; import org.junit.jupiter.api.Test; diff --git a/src/test/java/domain/game/GameResultTest.java b/src/test/java/domain/game/GameResultTest.java index 022323b4ec..51ff0c9211 100644 --- a/src/test/java/domain/game/GameResultTest.java +++ b/src/test/java/domain/game/GameResultTest.java @@ -4,9 +4,9 @@ import domain.card.Cards; import domain.card.Denomination; import domain.card.Suit; -import domain.player.Dealer; -import domain.player.Name; -import domain.player.Player; +import domain.participant.Dealer; +import domain.participant.Name; +import domain.participant.Player; import org.junit.jupiter.api.DisplayName; import org.junit.jupiter.api.Test; import org.junit.jupiter.params.ParameterizedTest; @@ -33,10 +33,10 @@ private static Stream provideParameters() { return Stream.of( Arguments.arguments("플레이어가 버스트가 아니고 딜러가 버스트인 경우", new Player(new Name("abc"), new Cards(getCardList(Denomination.ACE, Denomination.NINE))), - new Dealer(new Cards(getCardList(Denomination.QUEEN, Denomination.KING, Denomination.JACK)))), + new Dealer(new Name("딜러"), new Cards(getCardList(Denomination.QUEEN, Denomination.KING, Denomination.JACK)))), Arguments.arguments("둘 다 버스트가 아니고 딜러보다 숫자가 높은 경우", new Player(new Name("abc"), new Cards(getCardList(Denomination.KING, Denomination.QUEEN))), - new Dealer(new Cards(getCardList(Denomination.QUEEN, Denomination.NINE)))) + new Dealer(new Name("딜러"), new Cards(getCardList(Denomination.QUEEN, Denomination.NINE)))) ); } @@ -46,7 +46,7 @@ void dealer_win_count_test() { Player player1 = new Player(new Name("abc1"), new Cards(getCardList(Denomination.ACE, Denomination.NINE))); // 20 Player player2 = new Player(new Name("abc2"), new Cards(getCardList(Denomination.EIGHT, Denomination.NINE))); // 17 Player player3 = new Player(new Name("abc3"), new Cards(getCardList(Denomination.ACE, Denomination.NINE))); // 20 - Dealer dealer = new Dealer(new Cards(getCardList(Denomination.QUEEN, Denomination.NINE))); // 19 + Dealer dealer = new Dealer(new Name("딜러"), new Cards(getCardList(Denomination.QUEEN, Denomination.NINE))); // 19 List players = Arrays.asList(player1, player2, player3); GameResult gameResult = new GameResult(players, dealer); @@ -60,7 +60,7 @@ void dealer_lose_count_test() { Player player1 = new Player(new Name("abc1"), new Cards(getCardList(Denomination.ACE, Denomination.NINE))); // 20 Player player2 = new Player(new Name("abc2"), new Cards(getCardList(Denomination.EIGHT, Denomination.NINE))); // 17 Player player3 = new Player(new Name("abc3"), new Cards(getCardList(Denomination.ACE, Denomination.NINE))); // 20 - Dealer dealer = new Dealer(new Cards(getCardList(Denomination.QUEEN, Denomination.NINE))); // 19 + Dealer dealer = new Dealer(new Name("딜러"), new Cards(getCardList(Denomination.QUEEN, Denomination.NINE))); // 19 List players = Arrays.asList(player1, player2, player3); GameResult gameResult = new GameResult(players, dealer); diff --git a/src/test/java/domain/player/DealerTest.java b/src/test/java/domain/participant/DealerTest.java similarity index 90% rename from src/test/java/domain/player/DealerTest.java rename to src/test/java/domain/participant/DealerTest.java index 2d7c992d1c..a0f324e8cb 100644 --- a/src/test/java/domain/player/DealerTest.java +++ b/src/test/java/domain/participant/DealerTest.java @@ -1,4 +1,4 @@ -package domain.player; +package domain.participant; import domain.card.Card; import domain.card.Cards; @@ -21,7 +21,7 @@ public class DealerTest { @MethodSource("provideParameters") @DisplayName("턴 강제 종료 여부") void Dealer(String comment, Cards cards, boolean expect) { - Dealer dealer = new Dealer(cards); + Dealer dealer = new Dealer(new Name("딜러"), cards); assertThat(dealer.isFinished()).isEqualTo(expect); } @@ -43,7 +43,7 @@ private static List getCardList(Denomination... arguments) { @Test void drawCard() { - Dealer dealer = new Dealer(new Cards(getCardList(Denomination.QUEEN))); + Dealer dealer = new Dealer(new Name("딜러"), new Cards(getCardList(Denomination.QUEEN))); dealer.drawCard(new Card(Denomination.ACE, Suit.CLOVER)); assertThat(dealer.getCards().getValue().size()).isEqualTo(2); } diff --git a/src/test/java/domain/player/PlayerTest.java b/src/test/java/domain/participant/PlayerTest.java similarity index 98% rename from src/test/java/domain/player/PlayerTest.java rename to src/test/java/domain/participant/PlayerTest.java index dd7e1f9ebe..077a42af3c 100644 --- a/src/test/java/domain/player/PlayerTest.java +++ b/src/test/java/domain/participant/PlayerTest.java @@ -1,4 +1,4 @@ -package domain.player; +package domain.participant; import domain.card.Card; import domain.card.Cards; From 276985156c356e727bf86c0414e10891e6c7ffc5 Mon Sep 17 00:00:00 2001 From: kimchan Date: Thu, 10 Mar 2022 12:31:26 +0900 Subject: [PATCH 21/54] =?UTF-8?q?feat=20:=20=ED=94=8C=EB=A0=88=EC=9D=B4?= =?UTF-8?q?=EC=96=B4=EC=99=80=20=EB=94=9C=EB=9F=AC=EB=A5=BC=20=EA=B0=80?= =?UTF-8?q?=EC=A0=B8=EC=98=A4=EB=8A=94=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 --- src/main/java/domain/game/BlackJackGame.java | 35 +++++++++++-------- src/main/java/domain/participant/Name.java | 13 +++++++ .../java/domain/game/BlackJackGameTest.java | 35 +++++++++++++++---- 3 files changed, 63 insertions(+), 20 deletions(-) diff --git a/src/main/java/domain/game/BlackJackGame.java b/src/main/java/domain/game/BlackJackGame.java index 41611a46b6..8f38ce80e6 100644 --- a/src/main/java/domain/game/BlackJackGame.java +++ b/src/main/java/domain/game/BlackJackGame.java @@ -5,6 +5,7 @@ import domain.card.Cards; import domain.participant.Dealer; import domain.participant.Name; +import domain.participant.Participant; import domain.participant.Player; import java.util.ArrayList; @@ -12,14 +13,15 @@ import java.util.stream.Collectors; public class BlackJackGame { - private final List players; - private final Dealer dealer; - private final CardDistributor cardDistributor; + + private static final String DEALER_NAME = "딜러"; + + private final List participants = new ArrayList<>(); + private final CardDistributor cardDistributor = new CardDistributor(); public BlackJackGame(List names) { - this.cardDistributor = new CardDistributor(); - this.players = initializePlayers(new ArrayList<>(names)); - this.dealer = new Dealer(new Name("딜러"), drawInitialCards()); + this.participants.add(new Dealer(new Name(DEALER_NAME), drawInitialCards())); + this.participants.addAll(initializePlayers(new ArrayList<>(names))); } private List initializePlayers(List names) { @@ -35,17 +37,22 @@ private Cards drawInitialCards() { return new Cards(cards); } - public void drawPlayerCard(Player player) { - int index = players.indexOf(player); - Player nowPlayer = players.get(index); - nowPlayer.drawCard(cardDistributor.distribute()); + public void drawPlayerCard(Participant participant) { + int index = participants.indexOf(participant); + Participant nowParticipant = participants.get(index); + nowParticipant.drawCard(cardDistributor.distribute()); } - public List getPlayers() { - return players; + public List getPlayers() { + return participants.stream() + .filter(participant -> participant instanceof Player) + .collect(Collectors.toUnmodifiableList()); } - public Dealer getDealer() { - return dealer; + public Participant getDealer() { + return participants.stream() + .filter(participant -> participant instanceof Dealer) + .findFirst() + .orElseThrow(() -> new IllegalArgumentException("[ERROR] 딜러가 존재하지 않습니다.")); } } diff --git a/src/main/java/domain/participant/Name.java b/src/main/java/domain/participant/Name.java index 1d43cf0c98..5d9f76a9ab 100644 --- a/src/main/java/domain/participant/Name.java +++ b/src/main/java/domain/participant/Name.java @@ -22,6 +22,19 @@ public String getValue() { return value; } + @Override + public boolean equals(Object o) { + if (this == o) return true; + if (o == null || getClass() != o.getClass()) return false; + Name name = (Name) o; + return value.equals(name.value); + } + + @Override + public int hashCode() { + return Objects.hash(value); + } + @Override public String toString() { return "Name{" + diff --git a/src/test/java/domain/game/BlackJackGameTest.java b/src/test/java/domain/game/BlackJackGameTest.java index 1769788416..0dab8c2b78 100644 --- a/src/test/java/domain/game/BlackJackGameTest.java +++ b/src/test/java/domain/game/BlackJackGameTest.java @@ -1,21 +1,30 @@ package domain.game; +import domain.participant.Dealer; import domain.participant.Name; -import domain.participant.Player; +import domain.participant.Participant; +import org.junit.jupiter.api.BeforeEach; import org.junit.jupiter.api.DisplayName; import org.junit.jupiter.api.Test; import java.util.Arrays; import java.util.List; +import java.util.stream.Collectors; import static org.assertj.core.api.Assertions.assertThat; public class BlackJackGameTest { + private BlackJackGame blackJackGame; + + @BeforeEach + void init() { + List names = Arrays.asList(new Name("pobi"), new Name("jason")); + blackJackGame = new BlackJackGame(names); + } + @Test @DisplayName("게임 초기화 시 각 플레이어는 2장의 카드를 분배받는다.") void create() { - List names = Arrays.asList(new Name("pobi"), new Name("jason")); - BlackJackGame blackJackGame = new BlackJackGame(names); boolean match = blackJackGame.getPlayers().stream() .mapToInt(player -> player.getCards().getValue().size()) .anyMatch(cardSize -> cardSize != 2); @@ -25,12 +34,26 @@ void create() { @Test @DisplayName("플레이어 카드 추가") void player_card_add() { - List names = Arrays.asList(new Name("pobi"), new Name("jason")); - BlackJackGame blackJackGame = new BlackJackGame(names); - Player player = blackJackGame.getPlayers().get(0); + Participant player = blackJackGame.getPlayers().get(0); blackJackGame.drawPlayerCard(player); assertThat(blackJackGame.getPlayers().get(0).getCards().getValue().size()) .isEqualTo(3); } + + @Test + @DisplayName("딜러 가져오기") + void find_dealer() { + assertThat(blackJackGame.getDealer()).isInstanceOf(Dealer.class); + } + + @Test + @DisplayName("플레이어들 가져오기") + void find_players() { + List playerNames = blackJackGame.getPlayers().stream() + .map(Participant::getName) + .collect(Collectors.toUnmodifiableList()); + + assertThat(playerNames).contains(new Name("pobi"), new Name("jason")); + } } From 37d9882471f6c7d0e16395c21f7125b0ee46f116 Mon Sep 17 00:00:00 2001 From: kimchan Date: Thu, 10 Mar 2022 12:41:02 +0900 Subject: [PATCH 22/54] =?UTF-8?q?feat=20:=20GameResult=20=EC=83=9D?= =?UTF-8?q?=EC=84=B1?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- src/main/java/domain/game/BlackJackGame.java | 8 ++++++-- src/main/java/domain/game/GameResult.java | 17 ++++++++--------- src/main/java/view/OutputView.java | 5 +++-- .../java/domain/game/BlackJackGameTest.java | 10 +++++----- src/test/java/domain/game/GameResultTest.java | 6 +++--- 5 files changed, 25 insertions(+), 21 deletions(-) diff --git a/src/main/java/domain/game/BlackJackGame.java b/src/main/java/domain/game/BlackJackGame.java index 8f38ce80e6..d2f599e84e 100644 --- a/src/main/java/domain/game/BlackJackGame.java +++ b/src/main/java/domain/game/BlackJackGame.java @@ -43,13 +43,17 @@ public void drawPlayerCard(Participant participant) { nowParticipant.drawCard(cardDistributor.distribute()); } - public List getPlayers() { + public GameResult createGameResult() { + return new GameResult(findPlayers(), findDealer()); + } + + public List findPlayers() { return participants.stream() .filter(participant -> participant instanceof Player) .collect(Collectors.toUnmodifiableList()); } - public Participant getDealer() { + public Participant findDealer() { return participants.stream() .filter(participant -> participant instanceof Dealer) .findFirst() diff --git a/src/main/java/domain/game/GameResult.java b/src/main/java/domain/game/GameResult.java index d790d221e1..5fbcf0c4cb 100644 --- a/src/main/java/domain/game/GameResult.java +++ b/src/main/java/domain/game/GameResult.java @@ -1,20 +1,19 @@ package domain.game; -import domain.participant.Dealer; -import domain.participant.Player; +import domain.participant.Participant; import java.util.*; public class GameResult { - private final Map gameResult = new LinkedHashMap<>(); + private final Map gameResult = new LinkedHashMap<>(); - public GameResult(List players, Dealer dealer) { + public GameResult(List players, Participant dealer) { initialGameResult(new ArrayList<>(players), dealer); } - private void initialGameResult(List players, Dealer dealer) { - for (Player player : players) { + private void initialGameResult(List players, Participant dealer) { + for (Participant player : players) { if (playerWinCondition(player, dealer)) { gameResult.put(player, MatchResult.WIN); continue; @@ -23,12 +22,12 @@ private void initialGameResult(List players, Dealer dealer) { } } - private boolean playerWinCondition(Player player, Dealer dealer) { + private boolean playerWinCondition(Participant player, Participant dealer) { return !player.getCards().isBust() && (dealer.getCards().isBust() || dealer.getCards().sum() < player.getCards().sum()); } - public MatchResult getMatchResult(Player player) { + public MatchResult getMatchResult(Participant player) { return gameResult.get(player); } @@ -42,7 +41,7 @@ public long getDealerLoseCount() { return gameResult.size() - getDealerWinCount(); } - public Map getGameResult() { + public Map getGameResult() { return Collections.unmodifiableMap(gameResult); } diff --git a/src/main/java/view/OutputView.java b/src/main/java/view/OutputView.java index 9da61b6c7f..0a55cad9eb 100644 --- a/src/main/java/view/OutputView.java +++ b/src/main/java/view/OutputView.java @@ -5,6 +5,7 @@ import domain.game.GameResult; import domain.game.MatchResult; import domain.participant.Dealer; +import domain.participant.Participant; import domain.participant.Player; import java.util.List; @@ -61,9 +62,9 @@ public static void printCardsResult(Dealer dealer, List players) { } public static void printGameResult(GameResult gameResult) { - Map map = gameResult.getGameResult(); + Map map = gameResult.getGameResult(); System.out.printf("딜러: %d승 %d패%n", gameResult.getDealerWinCount(), gameResult.getDealerLoseCount()); - for (Player player : map.keySet()) { + for (Participant player : map.keySet()) { System.out.printf("%s: %s%n", player.getName(), gameResult.getMatchResult(player).getValue()); } } diff --git a/src/test/java/domain/game/BlackJackGameTest.java b/src/test/java/domain/game/BlackJackGameTest.java index 0dab8c2b78..c64ca63c02 100644 --- a/src/test/java/domain/game/BlackJackGameTest.java +++ b/src/test/java/domain/game/BlackJackGameTest.java @@ -25,7 +25,7 @@ void init() { @Test @DisplayName("게임 초기화 시 각 플레이어는 2장의 카드를 분배받는다.") void create() { - boolean match = blackJackGame.getPlayers().stream() + boolean match = blackJackGame.findPlayers().stream() .mapToInt(player -> player.getCards().getValue().size()) .anyMatch(cardSize -> cardSize != 2); assertThat(match).isFalse(); @@ -34,23 +34,23 @@ void create() { @Test @DisplayName("플레이어 카드 추가") void player_card_add() { - Participant player = blackJackGame.getPlayers().get(0); + Participant player = blackJackGame.findPlayers().get(0); blackJackGame.drawPlayerCard(player); - assertThat(blackJackGame.getPlayers().get(0).getCards().getValue().size()) + assertThat(blackJackGame.findPlayers().get(0).getCards().getValue().size()) .isEqualTo(3); } @Test @DisplayName("딜러 가져오기") void find_dealer() { - assertThat(blackJackGame.getDealer()).isInstanceOf(Dealer.class); + assertThat(blackJackGame.findDealer()).isInstanceOf(Dealer.class); } @Test @DisplayName("플레이어들 가져오기") void find_players() { - List playerNames = blackJackGame.getPlayers().stream() + List playerNames = blackJackGame.findPlayers().stream() .map(Participant::getName) .collect(Collectors.toUnmodifiableList()); diff --git a/src/test/java/domain/game/GameResultTest.java b/src/test/java/domain/game/GameResultTest.java index 51ff0c9211..6bcd6292e8 100644 --- a/src/test/java/domain/game/GameResultTest.java +++ b/src/test/java/domain/game/GameResultTest.java @@ -6,6 +6,7 @@ import domain.card.Suit; import domain.participant.Dealer; import domain.participant.Name; +import domain.participant.Participant; import domain.participant.Player; import org.junit.jupiter.api.DisplayName; import org.junit.jupiter.api.Test; @@ -47,8 +48,7 @@ void dealer_win_count_test() { Player player2 = new Player(new Name("abc2"), new Cards(getCardList(Denomination.EIGHT, Denomination.NINE))); // 17 Player player3 = new Player(new Name("abc3"), new Cards(getCardList(Denomination.ACE, Denomination.NINE))); // 20 Dealer dealer = new Dealer(new Name("딜러"), new Cards(getCardList(Denomination.QUEEN, Denomination.NINE))); // 19 - - List players = Arrays.asList(player1, player2, player3); + List players = Arrays.asList(player1, player2, player3); GameResult gameResult = new GameResult(players, dealer); assertThat(gameResult.getDealerWinCount()).isEqualTo(1); @@ -62,7 +62,7 @@ void dealer_lose_count_test() { Player player3 = new Player(new Name("abc3"), new Cards(getCardList(Denomination.ACE, Denomination.NINE))); // 20 Dealer dealer = new Dealer(new Name("딜러"), new Cards(getCardList(Denomination.QUEEN, Denomination.NINE))); // 19 - List players = Arrays.asList(player1, player2, player3); + List players = Arrays.asList(player1, player2, player3); GameResult gameResult = new GameResult(players, dealer); assertThat(gameResult.getDealerLoseCount()).isEqualTo(2); From 3a07b4cc420ccc752e45c57e99fd237d51ddd3d9 Mon Sep 17 00:00:00 2001 From: kimchan Date: Thu, 10 Mar 2022 15:52:03 +0900 Subject: [PATCH 23/54] =?UTF-8?q?refactor=20:=20getName=20=EB=A9=94?= =?UTF-8?q?=EC=84=9C=EB=93=9C=EC=97=90=EC=84=9C=20=EC=9D=B4=EB=A6=84?= =?UTF-8?q?=EC=9D=84=20=EB=B0=94=EB=A1=9C=20=EB=B0=98=ED=99=98?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- src/main/java/domain/participant/Name.java | 3 +- .../java/domain/participant/Participant.java | 7 +-- src/main/java/view/OutputView.java | 44 ++++++++++++------- .../java/domain/game/BlackJackGameTest.java | 4 +- 4 files changed, 37 insertions(+), 21 deletions(-) diff --git a/src/main/java/domain/participant/Name.java b/src/main/java/domain/participant/Name.java index 5d9f76a9ab..82de22bbbb 100644 --- a/src/main/java/domain/participant/Name.java +++ b/src/main/java/domain/participant/Name.java @@ -3,7 +3,8 @@ import java.util.Objects; public class Name { - private static final String EMPTY_NAME_ERROR = "[ERROR] 빈 값은 이름으로 등록할 수 없습니다."; + + private static final String EMPTY_NAME_ERROR = "빈 값은 이름으로 등록할 수 없습니다."; private final String value; diff --git a/src/main/java/domain/participant/Participant.java b/src/main/java/domain/participant/Participant.java index e9e0b86f2b..4ab9f4cfde 100644 --- a/src/main/java/domain/participant/Participant.java +++ b/src/main/java/domain/participant/Participant.java @@ -6,6 +6,7 @@ import java.util.Objects; public abstract class Participant { + protected final Name name; protected final Cards cards; @@ -14,14 +15,14 @@ public Participant(Name name, Cards cards) { this.cards = cards; } - abstract boolean isFinished(); + public abstract boolean isFinished(); public void drawCard(Card card) { cards.add(card); } - public Name getName() { - return name; + public String getName() { + return name.getValue(); } public Cards getCards() { diff --git a/src/main/java/view/OutputView.java b/src/main/java/view/OutputView.java index 0a55cad9eb..0a4be14988 100644 --- a/src/main/java/view/OutputView.java +++ b/src/main/java/view/OutputView.java @@ -2,12 +2,13 @@ import domain.card.Card; import domain.card.Cards; +import domain.game.BlackJackGame; import domain.game.GameResult; import domain.game.MatchResult; import domain.participant.Dealer; import domain.participant.Participant; -import domain.participant.Player; +import java.io.PrintStream; import java.util.List; import java.util.Map; import java.util.stream.Collectors; @@ -15,22 +16,24 @@ public class OutputView { private static final String JOIN_DELIMITER = ", "; + private static final String ERROR_MESSAGE = "[ERROR] "; private OutputView() { } - public static void printInitialCards(Dealer dealer, List players) { - System.out.printf("%s와 %s에게 2장의 카드를 나누었습니다.%n", dealer.getName(), getPlayerNames(players)); + public static void printInitialCards(Participant dealer, List players) { + System.out.printf("%n%s와 %s에게 2장의 카드를 나누었습니다.%n", dealer.getName(), getPlayerNames(players)); System.out.printf("%s: %s%n", dealer.getName(), getCardName(dealer.getCards().getValue().get(0))); - for (Player player : players) { + for (Participant player : players) { printCards(player); } + System.out.println(); } - private static String getPlayerNames(List players) { + private static String getPlayerNames(List players) { return players.stream() - .map(player -> player.getName().getValue()) + .map(player -> player.getName()) .collect(Collectors.joining(JOIN_DELIMITER)); } @@ -44,28 +47,39 @@ private static String getCardName(Card card) { return card.getDenomination().getName() + card.getSuit().getName(); } - public static void printCards(Player player) { + public static void printCards(Participant player) { System.out.printf("%s카드: %s%n", player.getName(), getCardNames(player.getCards())); } public static void printDealerDrawInfo() { - System.out.printf("딜러는 %d이하라 한장의 카드를 더 받았습니다.%n", Dealer.DRAW_STANDARD); + System.out.printf("%n딜러는 %d이하라 한장의 카드를 더 받았습니다.%n", Dealer.DRAW_STANDARD); } - public static void printCardsResult(Dealer dealer, List players) { - System.out.printf("%s 카드: %s - 결과: %d%n", - dealer.getName(), getCardNames(dealer.getCards()), dealer.getCards().sum()); - for (Player player : players) { - System.out.printf("%s 카드: %s - 결과: %d%n", - player.getName(), getCardNames(player.getCards()), player.getCards().sum()); + public static void printCardsResult(Participant dealer, List players) { + System.out.println(); + printCardResult(dealer); + for (Participant player : players) { + printCardResult(player); } } + private static PrintStream printCardResult(Participant participant) { + return System.out.printf("%s 카드: %s - 결과: %d%n", + participant.getName(), getCardNames(participant.getCards()), participant.getCards().sum()); + } + public static void printGameResult(GameResult gameResult) { Map map = gameResult.getGameResult(); - System.out.printf("딜러: %d승 %d패%n", gameResult.getDealerWinCount(), gameResult.getDealerLoseCount()); + + System.out.printf("%n%s: %d승 %d패%n", + BlackJackGame.DEALER_NAME, gameResult.getDealerWinCount(), gameResult.getDealerLoseCount()); + for (Participant player : map.keySet()) { System.out.printf("%s: %s%n", player.getName(), gameResult.getMatchResult(player).getValue()); } } + + public static void printException(Exception e) { + System.out.println(ERROR_MESSAGE + e.getMessage()); + } } diff --git a/src/test/java/domain/game/BlackJackGameTest.java b/src/test/java/domain/game/BlackJackGameTest.java index c64ca63c02..fee45a97fc 100644 --- a/src/test/java/domain/game/BlackJackGameTest.java +++ b/src/test/java/domain/game/BlackJackGameTest.java @@ -50,10 +50,10 @@ void find_dealer() { @Test @DisplayName("플레이어들 가져오기") void find_players() { - List playerNames = blackJackGame.findPlayers().stream() + List playerNames = blackJackGame.findPlayers().stream() .map(Participant::getName) .collect(Collectors.toUnmodifiableList()); - assertThat(playerNames).contains(new Name("pobi"), new Name("jason")); + assertThat(playerNames).contains("pobi", "jason"); } } From 8087eb69dc189f7fb1f98ae64f0bda5b5fa4b724 Mon Sep 17 00:00:00 2001 From: kimchan Date: Thu, 10 Mar 2022 15:54:16 +0900 Subject: [PATCH 24/54] =?UTF-8?q?refactor=20:=20=EC=9E=90=EB=B0=94=20?= =?UTF-8?q?=EC=BB=A8=EB=B2=A4=EC=85=98=20=ED=86=B5=EC=9D=BC?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- src/main/java/domain/card/Card.java | 1 + src/main/java/domain/card/CardDistributor.java | 9 +++++++-- src/main/java/domain/card/Cards.java | 11 ++++++++--- src/main/java/domain/card/Denomination.java | 1 + src/main/java/domain/card/Suit.java | 1 + src/main/java/domain/game/BlackJackGame.java | 13 +++++++++++-- src/main/java/domain/game/MatchResult.java | 1 + src/main/java/view/InputView.java | 7 ++++--- src/test/java/domain/card/CardDistributorTest.java | 5 ++++- 9 files changed, 38 insertions(+), 11 deletions(-) diff --git a/src/main/java/domain/card/Card.java b/src/main/java/domain/card/Card.java index e54c36ea62..414ccab631 100644 --- a/src/main/java/domain/card/Card.java +++ b/src/main/java/domain/card/Card.java @@ -3,6 +3,7 @@ import java.util.Objects; public class Card { + private final Denomination denomination; private final Suit suit; diff --git a/src/main/java/domain/card/CardDistributor.java b/src/main/java/domain/card/CardDistributor.java index 2e98c720ad..4edbdb8a2a 100644 --- a/src/main/java/domain/card/CardDistributor.java +++ b/src/main/java/domain/card/CardDistributor.java @@ -6,7 +6,8 @@ import java.util.Stack; public class CardDistributor { - private static final String DECK_IS_EMPTY = "[ERROR] 카드가 모두 소요됐습니다."; + + private static final String DECK_IS_EMPTY = "카드가 모두 소요됐습니다."; private static final List CACHE = new ArrayList<>(); private final Stack deck = new Stack<>(); @@ -25,12 +26,16 @@ public CardDistributor() { } public Card distribute() { - if (deck == null || deck.isEmpty()) { + if (isEmpty()) { throw new IllegalArgumentException(DECK_IS_EMPTY); } return deck.pop(); } + private boolean isEmpty() { + return deck == null || deck.isEmpty(); + } + @Override public String toString() { return "CardDistributor{" + diff --git a/src/main/java/domain/card/Cards.java b/src/main/java/domain/card/Cards.java index 30d7e65f4d..60ae53a585 100644 --- a/src/main/java/domain/card/Cards.java +++ b/src/main/java/domain/card/Cards.java @@ -5,6 +5,7 @@ import java.util.List; public class Cards { + private static final int ACE_ADDITIONAL_VALUE = 10; private static final int BLACKJACK_COUNT = 21; @@ -31,15 +32,15 @@ public int sum() { .mapToInt(Card::toInt) .sum(); - if (hasAce() && !exceedBust(sum)) { + if (canAddAddtionalValue(sum)) { sum += ACE_ADDITIONAL_VALUE; } return sum; } - private boolean exceedBust(int sum) { - return sum + ACE_ADDITIONAL_VALUE > BLACKJACK_COUNT; + private boolean canAddAddtionalValue(int sum) { + return hasAce() && !exceedBust(sum); } private boolean hasAce() { @@ -47,6 +48,10 @@ private boolean hasAce() { .anyMatch(Card::isAce); } + private boolean exceedBust(int sum) { + return sum + ACE_ADDITIONAL_VALUE > BLACKJACK_COUNT; + } + public List getValue() { return Collections.unmodifiableList(value); } diff --git a/src/main/java/domain/card/Denomination.java b/src/main/java/domain/card/Denomination.java index 4fd7e8c447..98a711abcd 100644 --- a/src/main/java/domain/card/Denomination.java +++ b/src/main/java/domain/card/Denomination.java @@ -1,6 +1,7 @@ package domain.card; public enum Denomination { + ACE(1, "A"), TWO(2, "2"), THREE(3, "3"), diff --git a/src/main/java/domain/card/Suit.java b/src/main/java/domain/card/Suit.java index 0df0149711..f92c0d8ceb 100644 --- a/src/main/java/domain/card/Suit.java +++ b/src/main/java/domain/card/Suit.java @@ -1,6 +1,7 @@ package domain.card; public enum Suit { + CLOVER("클로버"), HEART("하트"), DIAMOND("다이아몬드"), diff --git a/src/main/java/domain/game/BlackJackGame.java b/src/main/java/domain/game/BlackJackGame.java index d2f599e84e..a00a8bed2b 100644 --- a/src/main/java/domain/game/BlackJackGame.java +++ b/src/main/java/domain/game/BlackJackGame.java @@ -14,7 +14,8 @@ public class BlackJackGame { - private static final String DEALER_NAME = "딜러"; + public static final String DEALER_NAME = "딜러"; + private static final String NOT_EXIST_DEALER_ERROR = "딜러가 존재하지 않습니다."; private final List participants = new ArrayList<>(); private final CardDistributor cardDistributor = new CardDistributor(); @@ -57,6 +58,14 @@ public Participant findDealer() { return participants.stream() .filter(participant -> participant instanceof Dealer) .findFirst() - .orElseThrow(() -> new IllegalArgumentException("[ERROR] 딜러가 존재하지 않습니다.")); + .orElseThrow(() -> new IllegalArgumentException(NOT_EXIST_DEALER_ERROR)); + } + + @Override + public String toString() { + return "BlackJackGame{" + + "participants=" + participants + + ", cardDistributor=" + cardDistributor + + '}'; } } diff --git a/src/main/java/domain/game/MatchResult.java b/src/main/java/domain/game/MatchResult.java index cb2acf203c..f1e65a7f95 100644 --- a/src/main/java/domain/game/MatchResult.java +++ b/src/main/java/domain/game/MatchResult.java @@ -1,6 +1,7 @@ package domain.game; public enum MatchResult { + WIN("승"), LOSE("패"); diff --git a/src/main/java/view/InputView.java b/src/main/java/view/InputView.java index 89cde780e8..70e10ec481 100644 --- a/src/main/java/view/InputView.java +++ b/src/main/java/view/InputView.java @@ -8,6 +8,7 @@ import java.util.stream.Collectors; public class InputView { + private static final Scanner scanner = new Scanner(System.in); private static final String NAME_DELIMITER = ","; private static final String YES = "y"; @@ -38,12 +39,12 @@ private static void checkDistinct(List names) { .count(); if (distinctCount != names.size()) { - throw new IllegalArgumentException("[ERROR] 중복 이름은 불가능합니다."); + throw new IllegalArgumentException("중복 이름은 불가능합니다."); } } public static boolean inputWantDraw(String name) { - System.out.printf("%s는 한장의 카드를 더 받겠습니까?(예는 %s, 아니오는 %s)%n", name, YES, NO); + System.out.printf("%n%s는 한장의 카드를 더 받겠습니까?(예는 %s, 아니오는 %s)%n", name, YES, NO); String input = scanner.nextLine().toLowerCase(); return toBoolean(input); } @@ -55,7 +56,7 @@ private static boolean toBoolean(String input) { private static void validateWantDraw(String input) { if (!YES.equals(input) && !NO.equals(input)) { - throw new IllegalArgumentException(String.format("[ERROR] %s 또는 %s을 입력해주세요.", YES, NO)); + throw new IllegalArgumentException(String.format("%s 또는 %s을 입력해주세요.", YES, NO)); } } } diff --git a/src/test/java/domain/card/CardDistributorTest.java b/src/test/java/domain/card/CardDistributorTest.java index 2e24f1b1c4..db3335dc27 100644 --- a/src/test/java/domain/card/CardDistributorTest.java +++ b/src/test/java/domain/card/CardDistributorTest.java @@ -1,5 +1,6 @@ package domain.card; +import org.junit.jupiter.api.DisplayName; import org.junit.jupiter.api.Test; import static org.assertj.core.api.Assertions.assertThatNoException; @@ -8,12 +9,14 @@ public class CardDistributorTest { @Test + @DisplayName("생성 확인") void distribute() { CardDistributor cardDistributor = new CardDistributor(); assertThatNoException().isThrownBy(cardDistributor::distribute); } @Test + @DisplayName("카드가 다 소요되면 에러가 발생한다.") void failed() { CardDistributor cardDistributor = new CardDistributor(); for (int i = 0; i < 52; i++) { @@ -21,6 +24,6 @@ void failed() { } assertThatThrownBy(cardDistributor::distribute) .isInstanceOf(IllegalArgumentException.class) - .hasMessageContaining("[ERROR] 카드가 모두 소요됐습니다."); + .hasMessageContaining("카드가 모두 소요됐습니다."); } } From 1d798b838e2b397cc31f52a7592ccdee72362cc2 Mon Sep 17 00:00:00 2001 From: kimchan Date: Thu, 10 Mar 2022 15:55:45 +0900 Subject: [PATCH 25/54] =?UTF-8?q?feat=20:=20Controller=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 --- src/main/java/Application.java | 8 ++ .../java/controller/BlackJackController.java | 83 +++++++++++++++++++ 2 files changed, 91 insertions(+) create mode 100644 src/main/java/Application.java create mode 100644 src/main/java/controller/BlackJackController.java diff --git a/src/main/java/Application.java b/src/main/java/Application.java new file mode 100644 index 0000000000..758dd4e4c8 --- /dev/null +++ b/src/main/java/Application.java @@ -0,0 +1,8 @@ +import controller.BlackJackController; + +public class Application { + public static void main(String[] args) { + BlackJackController blackJackController = new BlackJackController(); + blackJackController.run(); + } +} diff --git a/src/main/java/controller/BlackJackController.java b/src/main/java/controller/BlackJackController.java new file mode 100644 index 0000000000..c1da63fec5 --- /dev/null +++ b/src/main/java/controller/BlackJackController.java @@ -0,0 +1,83 @@ +package controller; + +import domain.game.BlackJackGame; +import domain.game.GameResult; +import domain.participant.Name; +import domain.participant.Participant; +import view.InputView; +import view.OutputView; + +import java.util.List; + +public class BlackJackController { + + public void run() { + BlackJackGame blackJackGame = createBlackJackGame(); + + Participant dealer = blackJackGame.findDealer(); + List players = blackJackGame.findPlayers(); + + OutputView.printInitialCards(dealer, players); + + playPlayersTurn(blackJackGame, players); + playDealerTurn(blackJackGame, dealer); + + showGameResult(blackJackGame, dealer, players); + } + + private BlackJackGame createBlackJackGame() { + try { + List playerNames = InputView.inputPlayerNames(); + return new BlackJackGame(playerNames); + } catch (IllegalArgumentException e) { + OutputView.printException(e); + return createBlackJackGame(); + } + } + + private void playPlayersTurn(BlackJackGame blackJackGame, List players) { + for (Participant player : players) { + playPlayerTurn(blackJackGame, player); + } + } + + private void playPlayerTurn(BlackJackGame blackJackGame, Participant player) { + boolean draw = true; + + while (draw && !player.isFinished()) { + draw = wantDraw(player); + drawPlayerCard(blackJackGame, player, draw); + OutputView.printCards(player); + } + } + + private void drawPlayerCard(BlackJackGame blackJackGame, Participant player, boolean draw) { + if (draw) { + blackJackGame.drawPlayerCard(player); + } + } + + private boolean wantDraw(Participant player) { + try { + return InputView.inputWantDraw(player.getName()); + + } catch (IllegalArgumentException e) { + OutputView.printException(e); + return wantDraw(player); + } + } + + private void playDealerTurn(BlackJackGame blackJackGame, Participant dealer) { + while (!dealer.isFinished()) { + OutputView.printDealerDrawInfo(); + blackJackGame.drawPlayerCard(dealer); + } + } + + private void showGameResult(BlackJackGame blackJackGame, Participant dealer, List players) { + GameResult gameResult = blackJackGame.createGameResult(); + OutputView.printCardsResult(dealer, players); + OutputView.printGameResult(gameResult); + } + +} From 06c4eb66877c0694fa574f6640dd3704a9c9b2b9 Mon Sep 17 00:00:00 2001 From: kimchan Date: Thu, 10 Mar 2022 16:13:25 +0900 Subject: [PATCH 26/54] =?UTF-8?q?feat=20:=20=EC=97=B0=EB=A3=8C=20=EC=A3=BC?= =?UTF-8?q?=EC=9E=85=20=EA=B5=AC=ED=98=84?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- src/main/java/rentcar/Avante.java | 28 ++++++++++++++++++ src/main/java/rentcar/Car.java | 14 +++++++++ src/main/java/rentcar/K5.java | 28 ++++++++++++++++++ src/main/java/rentcar/RentCompany.java | 34 ++++++++++++++++++++++ src/main/java/rentcar/Sonata.java | 28 ++++++++++++++++++ src/test/java/rentcar/RentCompanyTest.java | 30 +++++++++++++++++++ 6 files changed, 162 insertions(+) create mode 100644 src/main/java/rentcar/Avante.java create mode 100644 src/main/java/rentcar/Car.java create mode 100644 src/main/java/rentcar/K5.java create mode 100644 src/main/java/rentcar/RentCompany.java create mode 100644 src/main/java/rentcar/Sonata.java create mode 100644 src/test/java/rentcar/RentCompanyTest.java diff --git a/src/main/java/rentcar/Avante.java b/src/main/java/rentcar/Avante.java new file mode 100644 index 0000000000..f28b7e9586 --- /dev/null +++ b/src/main/java/rentcar/Avante.java @@ -0,0 +1,28 @@ +package rentcar; + +public class Avante extends Car { + + private static final String NAME = "Avante"; + private static final double PER_LITER = 15; + + private double distance; + + public Avante(double distance) { + this.distance = distance; + } + + @Override + double getDistancePerLiter() { + return PER_LITER; + } + + @Override + double getTripDistance() { + return distance; + } + + @Override + String getName() { + return NAME; + } +} diff --git a/src/main/java/rentcar/Car.java b/src/main/java/rentcar/Car.java new file mode 100644 index 0000000000..557c3af560 --- /dev/null +++ b/src/main/java/rentcar/Car.java @@ -0,0 +1,14 @@ +package rentcar; + +public abstract class Car { + + abstract double getDistancePerLiter(); + + abstract double getTripDistance(); + + abstract String getName(); + + double getChargeQuantity() { + return getTripDistance() / getDistancePerLiter(); + } +} diff --git a/src/main/java/rentcar/K5.java b/src/main/java/rentcar/K5.java new file mode 100644 index 0000000000..769354ac8a --- /dev/null +++ b/src/main/java/rentcar/K5.java @@ -0,0 +1,28 @@ +package rentcar; + +public class K5 extends Car { + + private static final String NAME = "K5"; + private static final double PER_LITER = 13; + + private final double distance; + + public K5(double distance) { + this.distance = distance; + } + + @Override + double getDistancePerLiter() { + return PER_LITER; + } + + @Override + double getTripDistance() { + return distance; + } + + @Override + String getName() { + return NAME; + } +} diff --git a/src/main/java/rentcar/RentCompany.java b/src/main/java/rentcar/RentCompany.java new file mode 100644 index 0000000000..1ad84de3e9 --- /dev/null +++ b/src/main/java/rentcar/RentCompany.java @@ -0,0 +1,34 @@ +package rentcar; + +import java.util.ArrayList; +import java.util.List; + +public class RentCompany { + private static final String NEWLINE = System.getProperty("line.separator"); + + private final List cars = new ArrayList<>(); + + private RentCompany() { + + } + + public static RentCompany create() { + return new RentCompany(); + } + + public void addCar (Car car){ + cars.add(car); + } + + public String generateReport() { + StringBuilder stringBuilder = new StringBuilder(); + for(Car car: cars) { + stringBuilder.append(car.getName()) + .append(" : ") + .append(String.format("%.0f", car.getChargeQuantity())) + .append("리터") + .append(NEWLINE); + } + return stringBuilder.toString(); + } +} diff --git a/src/main/java/rentcar/Sonata.java b/src/main/java/rentcar/Sonata.java new file mode 100644 index 0000000000..2e3175d8af --- /dev/null +++ b/src/main/java/rentcar/Sonata.java @@ -0,0 +1,28 @@ +package rentcar; + +public class Sonata extends Car { + + private static final String NAME = "Sonata"; + private static final double PER_LITER = 10; + + private final double distance; + + public Sonata(double distance) { + this.distance = distance; + } + + @Override + double getDistancePerLiter() { + return PER_LITER; + } + + @Override + double getTripDistance() { + return distance; + } + + @Override + String getName() { + return NAME; + } +} diff --git a/src/test/java/rentcar/RentCompanyTest.java b/src/test/java/rentcar/RentCompanyTest.java new file mode 100644 index 0000000000..16b81243e7 --- /dev/null +++ b/src/test/java/rentcar/RentCompanyTest.java @@ -0,0 +1,30 @@ +package rentcar; + +import org.junit.jupiter.api.DisplayName; +import org.junit.jupiter.api.Test; + +import static org.assertj.core.api.Assertions.assertThat; + +class RentCompanyTest { + private static final String NEWLINE = System.getProperty("line.separator"); + + @Test + @DisplayName("report 결과 확인") + public void report() throws Exception { + RentCompany company = RentCompany.create(); + company.addCar(new Sonata(150)); + company.addCar(new K5(260)); + company.addCar(new Sonata(120)); + company.addCar(new Avante(300)); + company.addCar(new K5(390)); + + String report = company.generateReport(); + assertThat(report).isEqualTo( + "Sonata : 15리터" + NEWLINE + + "K5 : 20리터" + NEWLINE + + "Sonata : 12리터" + NEWLINE + + "Avante : 20리터" + NEWLINE + + "K5 : 30리터" + NEWLINE + ); + } +} From d065ece1a5455ee7839753fa6b916817c28ca1b9 Mon Sep 17 00:00:00 2001 From: yeon-06 Date: Thu, 10 Mar 2022 18:39:45 +0900 Subject: [PATCH 27/54] =?UTF-8?q?refactor:=20Command=20Enum=20=EB=8F=84?= =?UTF-8?q?=EC=9E=85?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../java/controller/BlackJackController.java | 24 +++++++----------- src/main/java/domain/game/BlackJackGame.java | 10 ++++++-- src/main/java/domain/participant/Command.java | 25 +++++++++++++++++++ src/main/java/view/InputView.java | 22 ++++------------ .../java/domain/game/BlackJackGameTest.java | 14 +++++------ 5 files changed, 54 insertions(+), 41 deletions(-) create mode 100644 src/main/java/domain/participant/Command.java diff --git a/src/main/java/controller/BlackJackController.java b/src/main/java/controller/BlackJackController.java index c1da63fec5..ed9697b26e 100644 --- a/src/main/java/controller/BlackJackController.java +++ b/src/main/java/controller/BlackJackController.java @@ -2,13 +2,13 @@ import domain.game.BlackJackGame; import domain.game.GameResult; +import domain.participant.Command; import domain.participant.Name; import domain.participant.Participant; +import java.util.List; import view.InputView; import view.OutputView; -import java.util.List; - public class BlackJackController { public void run() { @@ -42,35 +42,29 @@ private void playPlayersTurn(BlackJackGame blackJackGame, List play } private void playPlayerTurn(BlackJackGame blackJackGame, Participant player) { - boolean draw = true; + Command command = Command.HIT; - while (draw && !player.isFinished()) { - draw = wantDraw(player); - drawPlayerCard(blackJackGame, player, draw); + while (command != Command.STAY && !player.isFinished()) { + command = inputCommand(player); + blackJackGame.drawCardByCommand(player, command); OutputView.printCards(player); } } - private void drawPlayerCard(BlackJackGame blackJackGame, Participant player, boolean draw) { - if (draw) { - blackJackGame.drawPlayerCard(player); - } - } - - private boolean wantDraw(Participant player) { + private Command inputCommand(Participant player) { try { return InputView.inputWantDraw(player.getName()); } catch (IllegalArgumentException e) { OutputView.printException(e); - return wantDraw(player); + return inputCommand(player); } } private void playDealerTurn(BlackJackGame blackJackGame, Participant dealer) { while (!dealer.isFinished()) { OutputView.printDealerDrawInfo(); - blackJackGame.drawPlayerCard(dealer); + blackJackGame.drawCard(dealer); } } diff --git a/src/main/java/domain/game/BlackJackGame.java b/src/main/java/domain/game/BlackJackGame.java index a00a8bed2b..3c139afa01 100644 --- a/src/main/java/domain/game/BlackJackGame.java +++ b/src/main/java/domain/game/BlackJackGame.java @@ -3,11 +3,11 @@ import domain.card.Card; import domain.card.CardDistributor; import domain.card.Cards; +import domain.participant.Command; import domain.participant.Dealer; import domain.participant.Name; import domain.participant.Participant; import domain.participant.Player; - import java.util.ArrayList; import java.util.List; import java.util.stream.Collectors; @@ -38,7 +38,13 @@ private Cards drawInitialCards() { return new Cards(cards); } - public void drawPlayerCard(Participant participant) { + public void drawCardByCommand(Participant participant, Command command) { + if (command == Command.HIT) { + drawCard(participant); + } + } + + public void drawCard(Participant participant) { int index = participants.indexOf(participant); Participant nowParticipant = participants.get(index); nowParticipant.drawCard(cardDistributor.distribute()); diff --git a/src/main/java/domain/participant/Command.java b/src/main/java/domain/participant/Command.java new file mode 100644 index 0000000000..0dea4fef8c --- /dev/null +++ b/src/main/java/domain/participant/Command.java @@ -0,0 +1,25 @@ +package domain.participant; + +import java.util.Arrays; + +public enum Command { + HIT("y"), + STAY("n"); + + private final String value; + + Command(String value) { + this.value = value; + } + + public static Command findCommand(String value) { + return Arrays.stream(Command.values()) + .filter(command -> command.getValue().equals(value)) + .findFirst() + .orElseThrow(() -> new IllegalArgumentException("올바른 명령어를 입력해야합니다.")); + } + + public String getValue() { + return value; + } +} diff --git a/src/main/java/view/InputView.java b/src/main/java/view/InputView.java index 70e10ec481..739c5a8d63 100644 --- a/src/main/java/view/InputView.java +++ b/src/main/java/view/InputView.java @@ -1,7 +1,7 @@ package view; +import domain.participant.Command; import domain.participant.Name; - import java.util.Arrays; import java.util.List; import java.util.Scanner; @@ -11,8 +11,6 @@ public class InputView { private static final Scanner scanner = new Scanner(System.in); private static final String NAME_DELIMITER = ","; - private static final String YES = "y"; - private static final String NO = "n"; private InputView() { @@ -43,20 +41,10 @@ private static void checkDistinct(List names) { } } - public static boolean inputWantDraw(String name) { - System.out.printf("%n%s는 한장의 카드를 더 받겠습니까?(예는 %s, 아니오는 %s)%n", name, YES, NO); + public static Command inputWantDraw(String name) { + System.out.printf("%n%s는 한장의 카드를 더 받겠습니까?(예는 %s, 아니오는 %s)%n" + , name, Command.HIT.getValue(), Command.STAY.getValue()); String input = scanner.nextLine().toLowerCase(); - return toBoolean(input); - } - - private static boolean toBoolean(String input) { - validateWantDraw(input); - return YES.equals(input); - } - - private static void validateWantDraw(String input) { - if (!YES.equals(input) && !NO.equals(input)) { - throw new IllegalArgumentException(String.format("%s 또는 %s을 입력해주세요.", YES, NO)); - } + return Command.findCommand(input); } } diff --git a/src/test/java/domain/game/BlackJackGameTest.java b/src/test/java/domain/game/BlackJackGameTest.java index fee45a97fc..e834231f3f 100644 --- a/src/test/java/domain/game/BlackJackGameTest.java +++ b/src/test/java/domain/game/BlackJackGameTest.java @@ -1,17 +1,17 @@ package domain.game; +import static org.assertj.core.api.Assertions.assertThat; + +import domain.participant.Command; import domain.participant.Dealer; import domain.participant.Name; import domain.participant.Participant; -import org.junit.jupiter.api.BeforeEach; -import org.junit.jupiter.api.DisplayName; -import org.junit.jupiter.api.Test; - import java.util.Arrays; import java.util.List; import java.util.stream.Collectors; - -import static org.assertj.core.api.Assertions.assertThat; +import org.junit.jupiter.api.BeforeEach; +import org.junit.jupiter.api.DisplayName; +import org.junit.jupiter.api.Test; public class BlackJackGameTest { private BlackJackGame blackJackGame; @@ -35,7 +35,7 @@ void create() { @DisplayName("플레이어 카드 추가") void player_card_add() { Participant player = blackJackGame.findPlayers().get(0); - blackJackGame.drawPlayerCard(player); + blackJackGame.drawCardByCommand(player, Command.HIT); assertThat(blackJackGame.findPlayers().get(0).getCards().getValue().size()) .isEqualTo(3); From 181e279a238e549889c3f93b1773b160f9a77360 Mon Sep 17 00:00:00 2001 From: yeon-06 Date: Thu, 10 Mar 2022 18:49:05 +0900 Subject: [PATCH 28/54] =?UTF-8?q?refactor:=20=EB=B6=88=ED=95=84=EC=9A=94?= =?UTF-8?q?=ED=95=9C=20getValue=20=ED=98=B8=EC=B6=9C=20=EC=A0=9C=EA=B1=B0?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- src/main/java/domain/participant/Command.java | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/main/java/domain/participant/Command.java b/src/main/java/domain/participant/Command.java index 0dea4fef8c..23a22484f0 100644 --- a/src/main/java/domain/participant/Command.java +++ b/src/main/java/domain/participant/Command.java @@ -14,7 +14,7 @@ public enum Command { public static Command findCommand(String value) { return Arrays.stream(Command.values()) - .filter(command -> command.getValue().equals(value)) + .filter(command -> command.value.equals(value)) .findFirst() .orElseThrow(() -> new IllegalArgumentException("올바른 명령어를 입력해야합니다.")); } From 742b5ca7ff7ec1eb71c0e208d05ac58d14fcc61d Mon Sep 17 00:00:00 2001 From: yeon-06 Date: Thu, 10 Mar 2022 19:57:43 +0900 Subject: [PATCH 29/54] =?UTF-8?q?refactor:=20=EC=B9=B4=EB=93=9C=20?= =?UTF-8?q?=EC=B2=AB=20=EB=B6=84=EB=B0=B0=20=EB=A1=9C=EC=A7=81=20=EB=B3=80?= =?UTF-8?q?=EA=B2=BD?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- src/main/java/domain/game/BlackJackGame.java | 6 ++++-- 1 file changed, 4 insertions(+), 2 deletions(-) diff --git a/src/main/java/domain/game/BlackJackGame.java b/src/main/java/domain/game/BlackJackGame.java index 3c139afa01..e193d84b9c 100644 --- a/src/main/java/domain/game/BlackJackGame.java +++ b/src/main/java/domain/game/BlackJackGame.java @@ -16,6 +16,7 @@ public class BlackJackGame { public static final String DEALER_NAME = "딜러"; private static final String NOT_EXIST_DEALER_ERROR = "딜러가 존재하지 않습니다."; + private static final int INIT_CARD_COUNT = 2; private final List participants = new ArrayList<>(); private final CardDistributor cardDistributor = new CardDistributor(); @@ -33,8 +34,9 @@ private List initializePlayers(List names) { private Cards drawInitialCards() { List cards = new ArrayList<>(); - cards.add(cardDistributor.distribute()); - cards.add(cardDistributor.distribute()); + for (int i = 0; i < INIT_CARD_COUNT; i++) { + cards.add(cardDistributor.distribute()); + } return new Cards(cards); } From 8d59b771f7fd92c4768f05ac089efc0ccd4463a3 Mon Sep 17 00:00:00 2001 From: yeon-06 Date: Thu, 10 Mar 2022 20:00:55 +0900 Subject: [PATCH 30/54] =?UTF-8?q?refactor:=20=EB=AC=B4=EC=8A=B9=EB=B6=80?= =?UTF-8?q?=20=EA=B2=BD=EC=9A=B0=20=EC=83=9D=EC=84=B1?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- src/main/java/domain/game/GameResult.java | 35 +++++++------- src/main/java/domain/game/MatchResult.java | 1 + .../java/domain/participant/Participant.java | 24 ++++++++-- src/main/java/view/OutputView.java | 18 ++++---- src/test/java/domain/game/GameResultTest.java | 46 +++++++++++-------- 5 files changed, 76 insertions(+), 48 deletions(-) diff --git a/src/main/java/domain/game/GameResult.java b/src/main/java/domain/game/GameResult.java index 5fbcf0c4cb..9b71087f37 100644 --- a/src/main/java/domain/game/GameResult.java +++ b/src/main/java/domain/game/GameResult.java @@ -1,8 +1,11 @@ package domain.game; import domain.participant.Participant; - -import java.util.*; +import java.util.ArrayList; +import java.util.Collections; +import java.util.LinkedHashMap; +import java.util.List; +import java.util.Map; public class GameResult { @@ -14,31 +17,27 @@ public GameResult(List players, Participant dealer) { private void initialGameResult(List players, Participant dealer) { for (Participant player : players) { - if (playerWinCondition(player, dealer)) { - gameResult.put(player, MatchResult.WIN); - continue; - } - gameResult.put(player, MatchResult.LOSE); + gameResult.put(player, player.playResult(dealer)); } } - private boolean playerWinCondition(Participant player, Participant dealer) { - return !player.getCards().isBust() - && (dealer.getCards().isBust() || dealer.getCards().sum() < player.getCards().sum()); - } - public MatchResult getMatchResult(Participant player) { return gameResult.get(player); } - public long getDealerWinCount() { - return gameResult.entrySet().stream() - .filter(entry -> entry.getValue() == MatchResult.LOSE) - .count(); + public long calculateDealerMatchResultCount(MatchResult matchResult) { + long matchCount = getMatchResultCount(matchResult); + + if (matchResult == MatchResult.PUSH) { + return matchCount; + } + return gameResult.size() - matchCount; } - public long getDealerLoseCount() { - return gameResult.size() - getDealerWinCount(); + private long getMatchResultCount(MatchResult matchResult) { + return gameResult.entrySet().stream() + .filter(entry -> entry.getValue() == matchResult) + .count(); } public Map getGameResult() { diff --git a/src/main/java/domain/game/MatchResult.java b/src/main/java/domain/game/MatchResult.java index f1e65a7f95..5ecb34f571 100644 --- a/src/main/java/domain/game/MatchResult.java +++ b/src/main/java/domain/game/MatchResult.java @@ -3,6 +3,7 @@ public enum MatchResult { WIN("승"), + PUSH("무"), LOSE("패"); private final String value; diff --git a/src/main/java/domain/participant/Participant.java b/src/main/java/domain/participant/Participant.java index 4ab9f4cfde..53159ec097 100644 --- a/src/main/java/domain/participant/Participant.java +++ b/src/main/java/domain/participant/Participant.java @@ -2,7 +2,7 @@ import domain.card.Card; import domain.card.Cards; - +import domain.game.MatchResult; import java.util.Objects; public abstract class Participant { @@ -17,6 +17,20 @@ public Participant(Name name, Cards cards) { public abstract boolean isFinished(); + public MatchResult playResult(Participant participant) { + int thisSum = cards.sum(); + int otherSum = participant.cards.sum(); + + if (thisSum == otherSum || (cards.isBust() && participant.cards.isBust())) { + return MatchResult.PUSH; + } + if (cards.isBust() || (!participant.cards.isBust() && thisSum < otherSum)) { + return MatchResult.LOSE; + } + + return MatchResult.WIN; + } + public void drawCard(Card card) { cards.add(card); } @@ -31,8 +45,12 @@ public Cards getCards() { @Override public boolean equals(Object o) { - if (this == o) return true; - if (o == null || getClass() != o.getClass()) return false; + if (this == o) { + return true; + } + if (o == null || getClass() != o.getClass()) { + return false; + } Participant that = (Participant) o; return name.equals(that.name); } diff --git a/src/main/java/view/OutputView.java b/src/main/java/view/OutputView.java index 0a4be14988..fc8ef81db4 100644 --- a/src/main/java/view/OutputView.java +++ b/src/main/java/view/OutputView.java @@ -7,8 +7,6 @@ import domain.game.MatchResult; import domain.participant.Dealer; import domain.participant.Participant; - -import java.io.PrintStream; import java.util.List; import java.util.Map; import java.util.stream.Collectors; @@ -33,13 +31,13 @@ public static void printInitialCards(Participant dealer, List playe private static String getPlayerNames(List players) { return players.stream() - .map(player -> player.getName()) + .map(Participant::getName) .collect(Collectors.joining(JOIN_DELIMITER)); } private static String getCardNames(Cards cards) { return cards.getValue().stream() - .map(card -> getCardName(card)) + .map(OutputView::getCardName) .collect(Collectors.joining(JOIN_DELIMITER)); } @@ -63,16 +61,20 @@ public static void printCardsResult(Participant dealer, List player } } - private static PrintStream printCardResult(Participant participant) { - return System.out.printf("%s 카드: %s - 결과: %d%n", + private static void printCardResult(Participant participant) { + System.out.printf("%s 카드: %s - 결과: %d%n", participant.getName(), getCardNames(participant.getCards()), participant.getCards().sum()); } public static void printGameResult(GameResult gameResult) { Map map = gameResult.getGameResult(); - System.out.printf("%n%s: %d승 %d패%n", - BlackJackGame.DEALER_NAME, gameResult.getDealerWinCount(), gameResult.getDealerLoseCount()); + System.out.printf("%n%s: %d승 %d무 %d패%n" + , BlackJackGame.DEALER_NAME + , gameResult.calculateDealerMatchResultCount(MatchResult.WIN) + , gameResult.calculateDealerMatchResultCount(MatchResult.PUSH) + , gameResult.calculateDealerMatchResultCount(MatchResult.LOSE) + ); for (Participant player : map.keySet()) { System.out.printf("%s: %s%n", player.getName(), gameResult.getMatchResult(player).getValue()); diff --git a/src/test/java/domain/game/GameResultTest.java b/src/test/java/domain/game/GameResultTest.java index 6bcd6292e8..e61340f115 100644 --- a/src/test/java/domain/game/GameResultTest.java +++ b/src/test/java/domain/game/GameResultTest.java @@ -1,5 +1,7 @@ package domain.game; +import static org.assertj.core.api.Assertions.assertThat; + import domain.card.Card; import domain.card.Cards; import domain.card.Denomination; @@ -8,25 +10,22 @@ import domain.participant.Name; import domain.participant.Participant; import domain.participant.Player; +import java.util.ArrayList; +import java.util.Arrays; +import java.util.List; +import java.util.stream.Stream; import org.junit.jupiter.api.DisplayName; import org.junit.jupiter.api.Test; import org.junit.jupiter.params.ParameterizedTest; import org.junit.jupiter.params.provider.Arguments; import org.junit.jupiter.params.provider.MethodSource; -import java.util.ArrayList; -import java.util.Arrays; -import java.util.List; -import java.util.stream.Stream; - -import static org.assertj.core.api.Assertions.assertThat; - class GameResultTest { @ParameterizedTest(name = "{0}") @MethodSource("provideParameters") @DisplayName("플레이어 승리") void test(String comment, Player player, Dealer dealer) { - GameResult gameResult = new GameResult(Arrays.asList(player), dealer); + GameResult gameResult = new GameResult(List.of(player), dealer); assertThat(gameResult.getMatchResult(player)).isEqualTo(MatchResult.WIN); } @@ -34,7 +33,8 @@ private static Stream provideParameters() { return Stream.of( Arguments.arguments("플레이어가 버스트가 아니고 딜러가 버스트인 경우", new Player(new Name("abc"), new Cards(getCardList(Denomination.ACE, Denomination.NINE))), - new Dealer(new Name("딜러"), new Cards(getCardList(Denomination.QUEEN, Denomination.KING, Denomination.JACK)))), + new Dealer(new Name("딜러"), + new Cards(getCardList(Denomination.QUEEN, Denomination.KING, Denomination.JACK)))), Arguments.arguments("둘 다 버스트가 아니고 딜러보다 숫자가 높은 경우", new Player(new Name("abc"), new Cards(getCardList(Denomination.KING, Denomination.QUEEN))), new Dealer(new Name("딜러"), new Cards(getCardList(Denomination.QUEEN, Denomination.NINE)))) @@ -44,28 +44,36 @@ private static Stream provideParameters() { @Test @DisplayName("딜러가 승리한 횟수") void dealer_win_count_test() { - Player player1 = new Player(new Name("abc1"), new Cards(getCardList(Denomination.ACE, Denomination.NINE))); // 20 - Player player2 = new Player(new Name("abc2"), new Cards(getCardList(Denomination.EIGHT, Denomination.NINE))); // 17 - Player player3 = new Player(new Name("abc3"), new Cards(getCardList(Denomination.ACE, Denomination.NINE))); // 20 - Dealer dealer = new Dealer(new Name("딜러"), new Cards(getCardList(Denomination.QUEEN, Denomination.NINE))); // 19 + Player player1 = new Player(new Name("abc1"), + new Cards(getCardList(Denomination.ACE, Denomination.NINE))); // 20 + Player player2 = new Player(new Name("abc2"), + new Cards(getCardList(Denomination.EIGHT, Denomination.NINE))); // 17 + Player player3 = new Player(new Name("abc3"), + new Cards(getCardList(Denomination.ACE, Denomination.NINE))); // 20 + Dealer dealer = new Dealer(new Name("딜러"), + new Cards(getCardList(Denomination.QUEEN, Denomination.NINE))); // 19 List players = Arrays.asList(player1, player2, player3); GameResult gameResult = new GameResult(players, dealer); - assertThat(gameResult.getDealerWinCount()).isEqualTo(1); + assertThat(gameResult.calculateDealerMatchResultCount(MatchResult.WIN)).isEqualTo(1); } @Test @DisplayName("딜러가 패배한 횟수") void dealer_lose_count_test() { - Player player1 = new Player(new Name("abc1"), new Cards(getCardList(Denomination.ACE, Denomination.NINE))); // 20 - Player player2 = new Player(new Name("abc2"), new Cards(getCardList(Denomination.EIGHT, Denomination.NINE))); // 17 - Player player3 = new Player(new Name("abc3"), new Cards(getCardList(Denomination.ACE, Denomination.NINE))); // 20 - Dealer dealer = new Dealer(new Name("딜러"), new Cards(getCardList(Denomination.QUEEN, Denomination.NINE))); // 19 + Player player1 = new Player(new Name("abc1"), + new Cards(getCardList(Denomination.ACE, Denomination.NINE))); // 20 + Player player2 = new Player(new Name("abc2"), + new Cards(getCardList(Denomination.EIGHT, Denomination.NINE))); // 17 + Player player3 = new Player(new Name("abc3"), + new Cards(getCardList(Denomination.ACE, Denomination.NINE))); // 20 + Dealer dealer = new Dealer(new Name("딜러"), + new Cards(getCardList(Denomination.QUEEN, Denomination.NINE))); // 19 List players = Arrays.asList(player1, player2, player3); GameResult gameResult = new GameResult(players, dealer); - assertThat(gameResult.getDealerLoseCount()).isEqualTo(2); + assertThat(gameResult.calculateDealerMatchResultCount(MatchResult.LOSE)).isEqualTo(2); } private static List getCardList(Denomination... arguments) { From 3bf49502b7c615785f46f8ad21fa7f70e37e8b51 Mon Sep 17 00:00:00 2001 From: yeon-06 Date: Thu, 10 Mar 2022 20:10:38 +0900 Subject: [PATCH 31/54] =?UTF-8?q?refactor:=20=EC=B9=B4=EB=93=9C=20?= =?UTF-8?q?=EB=B0=9C=EA=B8=89=20=EC=97=AC=EB=B6=80=20=EC=9E=85=EB=A0=A5=20?= =?UTF-8?q?=EC=8B=9C=20trim=20=EC=B2=98=EB=A6=AC?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- src/main/java/view/InputView.java | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/main/java/view/InputView.java b/src/main/java/view/InputView.java index 739c5a8d63..fc83f6b016 100644 --- a/src/main/java/view/InputView.java +++ b/src/main/java/view/InputView.java @@ -44,7 +44,7 @@ private static void checkDistinct(List names) { public static Command inputWantDraw(String name) { System.out.printf("%n%s는 한장의 카드를 더 받겠습니까?(예는 %s, 아니오는 %s)%n" , name, Command.HIT.getValue(), Command.STAY.getValue()); - String input = scanner.nextLine().toLowerCase(); + String input = scanner.nextLine().toLowerCase().trim(); return Command.findCommand(input); } } From ee935fa1c4a8daca3065080d9fcba5c6df4ae3c6 Mon Sep 17 00:00:00 2001 From: yeon-06 Date: Thu, 10 Mar 2022 23:47:20 +0900 Subject: [PATCH 32/54] =?UTF-8?q?docs:=20=EB=A6=AC=EB=93=9C=EB=AF=B8=20?= =?UTF-8?q?=EA=B0=B1=EC=8B=A0=20-=20=EC=9A=A9=EC=96=B4=20=EC=A0=95?= =?UTF-8?q?=EB=A6=AC=20=EB=B0=8F=20=EA=B8=B0=EB=8A=A5=20=EB=AA=A9=EB=A1=9D?= =?UTF-8?q?=20=EC=B2=B4=ED=81=AC?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- README.md | 43 +++++++++++++------------------------------ 1 file changed, 13 insertions(+), 30 deletions(-) diff --git a/README.md b/README.md index 2cc165d7b5..e96319b85a 100644 --- a/README.md +++ b/README.md @@ -1,27 +1,34 @@ # java-blackjack +## 블랙잭 용어 정리 +- 버스트: 숫자 카드의 합이 21 초과 +- 블랙잭: 숫자 카드 합이 21 +- 푸시: 딜러와 플레이어 카드 동점 (=비김) +- 스테이: 카드를 그만 받겠다 +- 힛: 카드를 한장 더 받겠다 + ## 구현할 기능 목록 -- [ ] 참여할 사람의 이름 입력 +- [x] 참여할 사람의 이름 입력 - 쉼표 기준으로 분리 - (e) 빈 값, 공백 불가 - (e) 중복 불가 -- [ ] 카드 분배 +- [x] 카드 분배 - 딜러, 참가자에게 카드 2장씩 분배 - 딜러의 카드 1장 출력 - 참가자의 카드 2장 출력 - 참가자의 카드 합이 21이면 게임 종료 -- [ ] 참가자 카드 추가 분배 +- [x] 참가자 카드 추가 분배 - 카드 합이 21 이상인 참가자는 턴 종료 - 참가자 별로 한장의 카드 추가 여부를 입력 받기 (y/n) - 참가자가 카드 추가 여부 입력 - y를 선택한 경우 카드 추가 분배 - n를 선택한 경우 해당 참가자의 턴 종료 - 참가자의 카드 목록 출력 -- [ ] 딜러 카드 추가 분배 +- [x] 딜러 카드 추가 분배 - 16 이하면 1장 추가 분배 - 17 이상이면 턴 종료 -- [ ] 결과 출력 +- [x] 결과 출력 - 카드 목록 및 총합 출력 (ex: 딜러 카드: 3다이아몬드, 9클로버, 8다이아몬드 - 결과: 20) - 최종 승패 계산 - 최종 승패 출력 @@ -37,28 +44,4 @@ ## 우아한테크코스 코드리뷰 -- [온라인 코드 리뷰 과정](https://github.com/woowacourse/woowacourse-docs/blob/master/maincourse/README.md) - - -// BlackJackGame(List players, Dealer dealer) -// blackJackGame.distributeCard() - 각자 카드 2장씩 - -// for (Player player : players) -// player.canDraw() - y입력되면 true, n 입력되면 false -// player.drawCard(Card){값추가} -// player.getter() -> view에서 보여주기 -// Dealer.drawCard() - -// 승패결과 BlackJackResult - -/* 보고계시나요~~~`~~`` 정리되셨나여 hrd 퇴실 -for(Player player: players) { - if(!player.isBurst() && InputView.wantDraw()) { - player.drawCard(CardDistributor.distribute()); - } -} - -if(!dealer.isBurst()) { - dealer.drawCard(CardDistributor.distribute()); -} -*/ +- [온라인 코드 리뷰 과정](https://github.com/woowacourse/woowacourse-docs/blob/master/maincourse/README.md) \ No newline at end of file From 75518e7b40f9d89f21ff5d19f1bad0516253862c Mon Sep 17 00:00:00 2001 From: yeon-06 Date: Fri, 11 Mar 2022 00:16:04 +0900 Subject: [PATCH 33/54] =?UTF-8?q?test:=20=ED=85=8C=EC=8A=A4=ED=8A=B8=20?= =?UTF-8?q?=EC=BD=94=EB=93=9C=20=EB=A6=AC=ED=8C=A9=ED=86=A0=EB=A7=81?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../java/domain/card/CardDistributorTest.java | 8 +++ src/test/java/domain/card/CardTest.java | 1 + src/test/java/domain/card/CardsTest.java | 15 +++- .../java/domain/game/BlackJackGameTest.java | 56 ++++++++++++--- src/test/java/domain/game/GameResultTest.java | 69 +++++++++---------- .../java/domain/participant/DealerTest.java | 38 ++++++---- .../java/domain/participant/PlayerTest.java | 37 ++++++---- 7 files changed, 147 insertions(+), 77 deletions(-) diff --git a/src/test/java/domain/card/CardDistributorTest.java b/src/test/java/domain/card/CardDistributorTest.java index db3335dc27..c7ca305ef8 100644 --- a/src/test/java/domain/card/CardDistributorTest.java +++ b/src/test/java/domain/card/CardDistributorTest.java @@ -11,17 +11,25 @@ public class CardDistributorTest { @Test @DisplayName("생성 확인") void distribute() { + // given CardDistributor cardDistributor = new CardDistributor(); + + // then assertThatNoException().isThrownBy(cardDistributor::distribute); } @Test @DisplayName("카드가 다 소요되면 에러가 발생한다.") void failed() { + // given CardDistributor cardDistributor = new CardDistributor(); + + // when for (int i = 0; i < 52; i++) { cardDistributor.distribute(); } + + // then assertThatThrownBy(cardDistributor::distribute) .isInstanceOf(IllegalArgumentException.class) .hasMessageContaining("카드가 모두 소요됐습니다."); diff --git a/src/test/java/domain/card/CardTest.java b/src/test/java/domain/card/CardTest.java index 6bb7434e64..3ab318fa77 100644 --- a/src/test/java/domain/card/CardTest.java +++ b/src/test/java/domain/card/CardTest.java @@ -10,6 +10,7 @@ public class CardTest { @Test void create() { + // then assertThatNoException().isThrownBy(() -> new Card(Denomination.ACE, Suit.CLOVER)); } } diff --git a/src/test/java/domain/card/CardsTest.java b/src/test/java/domain/card/CardsTest.java index 1c8041b4d1..c0ae0b7ac9 100644 --- a/src/test/java/domain/card/CardsTest.java +++ b/src/test/java/domain/card/CardsTest.java @@ -20,7 +20,10 @@ public class CardsTest { @MethodSource("provideParameters") @DisplayName("단일 카드 총합 구하기") void sum(Denomination denomination, int expect) { + // given Cards cards = new Cards(Collections.singletonList(new Card(denomination, Suit.CLOVER))); + + // then assertThat(cards.sum()).isEqualTo(expect); } @@ -45,21 +48,27 @@ private static Stream provideParameters() { @Test @DisplayName("ACE 2개인 경우") void sum2() { + // given Cards cards = new Cards(Arrays.asList(new Card(Denomination.ACE, Suit.CLOVER) , new Card(Denomination.ACE, Suit.HEART))); + + // then assertThat(cards.sum()).isEqualTo(12); } @Test @DisplayName("카드 추가하기") void add() { + // given List list = new ArrayList<>(); list.add(new Card(Denomination.ACE, Suit.CLOVER)); Cards cards = new Cards(list); + Card newCard = new Card(Denomination.JACK, Suit.HEART); - cards.add(new Card(Denomination.JACK, Suit.HEART)); + // when + cards.add(newCard); - List cardList = cards.getValue(); - assertThat(cardList.size()).isEqualTo(2); + // then + assertThat(cards.getValue()).contains(newCard); } } diff --git a/src/test/java/domain/game/BlackJackGameTest.java b/src/test/java/domain/game/BlackJackGameTest.java index e834231f3f..b67950adf6 100644 --- a/src/test/java/domain/game/BlackJackGameTest.java +++ b/src/test/java/domain/game/BlackJackGameTest.java @@ -2,58 +2,94 @@ import static org.assertj.core.api.Assertions.assertThat; +import domain.card.Card; +import domain.card.Cards; +import domain.card.Denomination; +import domain.card.Suit; import domain.participant.Command; import domain.participant.Dealer; import domain.participant.Name; import domain.participant.Participant; +import domain.participant.Player; +import java.util.ArrayList; import java.util.Arrays; import java.util.List; -import java.util.stream.Collectors; import org.junit.jupiter.api.BeforeEach; import org.junit.jupiter.api.DisplayName; import org.junit.jupiter.api.Test; public class BlackJackGameTest { + private List names; private BlackJackGame blackJackGame; @BeforeEach void init() { - List names = Arrays.asList(new Name("pobi"), new Name("jason")); + names = Arrays.asList(new Name("pobi"), new Name("jason")); blackJackGame = new BlackJackGame(names); } @Test @DisplayName("게임 초기화 시 각 플레이어는 2장의 카드를 분배받는다.") void create() { - boolean match = blackJackGame.findPlayers().stream() - .mapToInt(player -> player.getCards().getValue().size()) + // when + boolean match = blackJackGame + .findPlayers() + .stream() + .mapToInt(this::calculateCardsSize) .anyMatch(cardSize -> cardSize != 2); + + // then assertThat(match).isFalse(); } @Test @DisplayName("플레이어 카드 추가") void player_card_add() { + // given Participant player = blackJackGame.findPlayers().get(0); + + // when blackJackGame.drawCardByCommand(player, Command.HIT); - assertThat(blackJackGame.findPlayers().get(0).getCards().getValue().size()) - .isEqualTo(3); + // then + assertThat(calculateCardsSize(player)).isEqualTo(3); + } + + private int calculateCardsSize(Participant participant) { + return participant + .getCards() + .getValue() + .size(); } @Test @DisplayName("딜러 가져오기") void find_dealer() { + // then assertThat(blackJackGame.findDealer()).isInstanceOf(Dealer.class); } @Test @DisplayName("플레이어들 가져오기") void find_players() { - List playerNames = blackJackGame.findPlayers().stream() - .map(Participant::getName) - .collect(Collectors.toUnmodifiableList()); + // given + List expectPlayers = new ArrayList<>(); + for (Name name : names) { + expectPlayers.add(new Player(name, getCards(Denomination.SEVEN, Denomination.QUEEN))); + } + + // when + List playerNames = blackJackGame.findPlayers(); + + // then + assertThat(playerNames).containsAll(expectPlayers); + } - assertThat(playerNames).contains("pobi", "jason"); + private static Cards getCards(Denomination... arguments) { + List list = new ArrayList<>(); + for (Denomination denomination : arguments) { + list.add(new Card(denomination, Suit.CLOVER)); + } + return new Cards(list); } } diff --git a/src/test/java/domain/game/GameResultTest.java b/src/test/java/domain/game/GameResultTest.java index e61340f115..52a73c4025 100644 --- a/src/test/java/domain/game/GameResultTest.java +++ b/src/test/java/domain/game/GameResultTest.java @@ -15,7 +15,6 @@ import java.util.List; import java.util.stream.Stream; import org.junit.jupiter.api.DisplayName; -import org.junit.jupiter.api.Test; import org.junit.jupiter.params.ParameterizedTest; import org.junit.jupiter.params.provider.Arguments; import org.junit.jupiter.params.provider.MethodSource; @@ -25,62 +24,60 @@ class GameResultTest { @MethodSource("provideParameters") @DisplayName("플레이어 승리") void test(String comment, Player player, Dealer dealer) { + // given GameResult gameResult = new GameResult(List.of(player), dealer); + + // then assertThat(gameResult.getMatchResult(player)).isEqualTo(MatchResult.WIN); } private static Stream provideParameters() { return Stream.of( Arguments.arguments("플레이어가 버스트가 아니고 딜러가 버스트인 경우", - new Player(new Name("abc"), new Cards(getCardList(Denomination.ACE, Denomination.NINE))), - new Dealer(new Name("딜러"), - new Cards(getCardList(Denomination.QUEEN, Denomination.KING, Denomination.JACK)))), + new Player(new Name("abc"), getCards(Denomination.ACE, Denomination.NINE)), + new Dealer(new Name("딜러"), getCards(Denomination.QUEEN, Denomination.KING, Denomination.JACK))), Arguments.arguments("둘 다 버스트가 아니고 딜러보다 숫자가 높은 경우", - new Player(new Name("abc"), new Cards(getCardList(Denomination.KING, Denomination.QUEEN))), - new Dealer(new Name("딜러"), new Cards(getCardList(Denomination.QUEEN, Denomination.NINE)))) + new Player(new Name("abc"), getCards(Denomination.KING, Denomination.QUEEN)), + new Dealer(new Name("딜러"), getCards(Denomination.QUEEN, Denomination.NINE))) ); } - @Test + @ParameterizedTest(name = "{3} 개수 -> {4}회") + @MethodSource("provideParameters2") @DisplayName("딜러가 승리한 횟수") - void dealer_win_count_test() { - Player player1 = new Player(new Name("abc1"), - new Cards(getCardList(Denomination.ACE, Denomination.NINE))); // 20 - Player player2 = new Player(new Name("abc2"), - new Cards(getCardList(Denomination.EIGHT, Denomination.NINE))); // 17 - Player player3 = new Player(new Name("abc3"), - new Cards(getCardList(Denomination.ACE, Denomination.NINE))); // 20 - Dealer dealer = new Dealer(new Name("딜러"), - new Cards(getCardList(Denomination.QUEEN, Denomination.NINE))); // 19 - List players = Arrays.asList(player1, player2, player3); + void dealer_count_test(Player player1, Player player2, Dealer dealer, MatchResult result, int expect) { + // given + List players = Arrays.asList(player1, player2); GameResult gameResult = new GameResult(players, dealer); - assertThat(gameResult.calculateDealerMatchResultCount(MatchResult.WIN)).isEqualTo(1); + // then + assertThat(gameResult.calculateDealerMatchResultCount(result)).isEqualTo(expect); } - @Test - @DisplayName("딜러가 패배한 횟수") - void dealer_lose_count_test() { - Player player1 = new Player(new Name("abc1"), - new Cards(getCardList(Denomination.ACE, Denomination.NINE))); // 20 - Player player2 = new Player(new Name("abc2"), - new Cards(getCardList(Denomination.EIGHT, Denomination.NINE))); // 17 - Player player3 = new Player(new Name("abc3"), - new Cards(getCardList(Denomination.ACE, Denomination.NINE))); // 20 - Dealer dealer = new Dealer(new Name("딜러"), - new Cards(getCardList(Denomination.QUEEN, Denomination.NINE))); // 19 - - List players = Arrays.asList(player1, player2, player3); - GameResult gameResult = new GameResult(players, dealer); - - assertThat(gameResult.calculateDealerMatchResultCount(MatchResult.LOSE)).isEqualTo(2); + private static Stream provideParameters2() { + return Stream.of( + Arguments.arguments( + new Player(new Name("abc1"), getCards(Denomination.ACE, Denomination.NINE)), + new Player(new Name("abc2"), getCards(Denomination.EIGHT, Denomination.NINE)), + new Dealer(new Name("딜러"), getCards(Denomination.QUEEN, Denomination.NINE)), + MatchResult.WIN, + 1 + ), + Arguments.arguments( + new Player(new Name("abc1"), getCards(Denomination.ACE, Denomination.NINE)), + new Player(new Name("abc2"), getCards(Denomination.NINE, Denomination.NINE)), + new Dealer(new Name("딜러"), getCards(Denomination.EIGHT, Denomination.NINE)), + MatchResult.LOSE, + 2 + ) + ); } - private static List getCardList(Denomination... arguments) { + private static Cards getCards(Denomination... arguments) { List list = new ArrayList<>(); for (Denomination denomination : arguments) { list.add(new Card(denomination, Suit.CLOVER)); } - return list; + return new Cards(list); } } diff --git a/src/test/java/domain/participant/DealerTest.java b/src/test/java/domain/participant/DealerTest.java index a0f324e8cb..a00a3356d4 100644 --- a/src/test/java/domain/participant/DealerTest.java +++ b/src/test/java/domain/participant/DealerTest.java @@ -1,50 +1,60 @@ package domain.participant; +import static org.assertj.core.api.Assertions.assertThat; + import domain.card.Card; import domain.card.Cards; import domain.card.Denomination; import domain.card.Suit; +import java.util.ArrayList; +import java.util.List; +import java.util.stream.Stream; import org.junit.jupiter.api.DisplayName; import org.junit.jupiter.api.Test; import org.junit.jupiter.params.ParameterizedTest; import org.junit.jupiter.params.provider.Arguments; import org.junit.jupiter.params.provider.MethodSource; -import java.util.ArrayList; -import java.util.List; -import java.util.stream.Stream; - -import static org.assertj.core.api.Assertions.assertThat; - public class DealerTest { @ParameterizedTest(name = "{0}") @MethodSource("provideParameters") @DisplayName("턴 강제 종료 여부") void Dealer(String comment, Cards cards, boolean expect) { + // given Dealer dealer = new Dealer(new Name("딜러"), cards); + + // then assertThat(dealer.isFinished()).isEqualTo(expect); } private static Stream provideParameters() { return Stream.of( - Arguments.arguments("합계 22인 경우 true", new Cards(getCardList(Denomination.TWO, Denomination.QUEEN, Denomination.KING)), true), - Arguments.arguments("합계 17인 경우 true", new Cards(getCardList(Denomination.SEVEN, Denomination.QUEEN)), true), - Arguments.arguments("합계 15인 경우 false", new Cards(getCardList(Denomination.QUEEN, Denomination.FIVE)), false) + Arguments.arguments("합계 22인 경우 true", getCards(Denomination.TWO, Denomination.QUEEN, Denomination.KING), + true), + Arguments.arguments("합계 17인 경우 true", getCards(Denomination.SEVEN, Denomination.QUEEN), true), + Arguments.arguments("합계 15인 경우 false", getCards(Denomination.QUEEN, Denomination.FIVE), false) ); } - private static List getCardList(Denomination... arguments) { + private static Cards getCards(Denomination... arguments) { List list = new ArrayList<>(); for (Denomination denomination : arguments) { list.add(new Card(denomination, Suit.CLOVER)); } - return list; + return new Cards(list); } @Test + @DisplayName("딜러 draw 확인") void drawCard() { - Dealer dealer = new Dealer(new Name("딜러"), new Cards(getCardList(Denomination.QUEEN))); - dealer.drawCard(new Card(Denomination.ACE, Suit.CLOVER)); - assertThat(dealer.getCards().getValue().size()).isEqualTo(2); + // given + Dealer dealer = new Dealer(new Name("딜러"), getCards(Denomination.QUEEN)); + Card newCard = new Card(Denomination.ACE, Suit.CLOVER); + + // when + dealer.drawCard(newCard); + + // then + assertThat(dealer.getCards().getValue()).contains(newCard); } } diff --git a/src/test/java/domain/participant/PlayerTest.java b/src/test/java/domain/participant/PlayerTest.java index 077a42af3c..8c21f82149 100644 --- a/src/test/java/domain/participant/PlayerTest.java +++ b/src/test/java/domain/participant/PlayerTest.java @@ -1,50 +1,59 @@ package domain.participant; +import static org.assertj.core.api.Assertions.assertThat; + import domain.card.Card; import domain.card.Cards; import domain.card.Denomination; import domain.card.Suit; +import java.util.ArrayList; +import java.util.List; +import java.util.stream.Stream; import org.junit.jupiter.api.DisplayName; import org.junit.jupiter.api.Test; import org.junit.jupiter.params.ParameterizedTest; import org.junit.jupiter.params.provider.Arguments; import org.junit.jupiter.params.provider.MethodSource; -import java.util.ArrayList; -import java.util.List; -import java.util.stream.Stream; - -import static org.assertj.core.api.Assertions.assertThat; - public class PlayerTest { @ParameterizedTest(name = "{0}") @MethodSource("provideParameters") @DisplayName("턴 강제 종료 여부") - void player(String comment,Cards cards, boolean expect) { + void player(String comment, Cards cards, boolean expect) { + // given Player player = new Player(new Name("name"), cards); + + // then assertThat(player.isFinished()).isEqualTo(expect); } private static Stream provideParameters() { return Stream.of( - Arguments.arguments("합계 22인 경우 true", new Cards(getCardList(Denomination.TWO, Denomination.QUEEN, Denomination.KING)), true), - Arguments.arguments("합계 20인 경우 false", new Cards(getCardList(Denomination.QUEEN, Denomination.KING)), false) + Arguments.arguments("합계 22인 경우 true", getCards(Denomination.TWO, Denomination.QUEEN, Denomination.KING), + true), + Arguments.arguments("합계 20인 경우 false", getCards(Denomination.QUEEN, Denomination.KING), false) ); } - private static List getCardList(Denomination... arguments) { + private static Cards getCards(Denomination... arguments) { List list = new ArrayList<>(); for (Denomination denomination : arguments) { list.add(new Card(denomination, Suit.CLOVER)); } - return list; + return new Cards(list); } @Test void drawCard() { - Player player = new Player(new Name("name"), new Cards(getCardList(Denomination.QUEEN))); - player.drawCard(new Card(Denomination.ACE, Suit.CLOVER)); - assertThat(player.getCards().getValue().size()).isEqualTo(2); + // given + Player player = new Player(new Name("name"), getCards(Denomination.QUEEN)); + Card newCard = new Card(Denomination.ACE, Suit.CLOVER); + + // when + player.drawCard(newCard); + + // then + assertThat(player.getCards().getValue()).contains(newCard); } } From c9375bf4f4627918178768b90688c3d399e3b443 Mon Sep 17 00:00:00 2001 From: yeon-06 Date: Mon, 14 Mar 2022 11:20:53 +0900 Subject: [PATCH 34/54] =?UTF-8?q?docs:=20=EB=B8=94=EB=9E=99=EC=9E=AD=20?= =?UTF-8?q?=EC=9A=A9=EC=96=B4=20=EB=B3=B4=EC=B6=A9=20=EC=84=A4=EB=AA=85?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- README.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/README.md b/README.md index e96319b85a..05f95eafc2 100644 --- a/README.md +++ b/README.md @@ -2,7 +2,7 @@ ## 블랙잭 용어 정리 - 버스트: 숫자 카드의 합이 21 초과 -- 블랙잭: 숫자 카드 합이 21 +- 블랙잭: 숫자 카드 합이 21 + 카드 수가 2장 - 푸시: 딜러와 플레이어 카드 동점 (=비김) - 스테이: 카드를 그만 받겠다 - 힛: 카드를 한장 더 받겠다 From 848c1d69bc7507dd0bbf7e3e4b0a71d1b08e9815 Mon Sep 17 00:00:00 2001 From: yeon-06 Date: Mon, 14 Mar 2022 11:21:47 +0900 Subject: [PATCH 35/54] =?UTF-8?q?style:=20controller=20=EC=9D=B4=EB=A6=84?= =?UTF-8?q?=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/Application.java | 6 +++--- .../BlackJackController.java => game/ConsoleGame.java} | 4 ++-- 2 files changed, 5 insertions(+), 5 deletions(-) rename src/main/java/{controller/BlackJackController.java => game/ConsoleGame.java} (97%) diff --git a/src/main/java/Application.java b/src/main/java/Application.java index 758dd4e4c8..7480060302 100644 --- a/src/main/java/Application.java +++ b/src/main/java/Application.java @@ -1,8 +1,8 @@ -import controller.BlackJackController; +import game.ConsoleGame; public class Application { public static void main(String[] args) { - BlackJackController blackJackController = new BlackJackController(); - blackJackController.run(); + ConsoleGame consoleGame = new ConsoleGame(); + consoleGame.run(); } } diff --git a/src/main/java/controller/BlackJackController.java b/src/main/java/game/ConsoleGame.java similarity index 97% rename from src/main/java/controller/BlackJackController.java rename to src/main/java/game/ConsoleGame.java index ed9697b26e..dbc416eccf 100644 --- a/src/main/java/controller/BlackJackController.java +++ b/src/main/java/game/ConsoleGame.java @@ -1,4 +1,4 @@ -package controller; +package game; import domain.game.BlackJackGame; import domain.game.GameResult; @@ -9,7 +9,7 @@ import view.InputView; import view.OutputView; -public class BlackJackController { +public class ConsoleGame { public void run() { BlackJackGame blackJackGame = createBlackJackGame(); From 61162cf0a1e2603d3f4695702a5232030e714a11 Mon Sep 17 00:00:00 2001 From: yeon-06 Date: Mon, 14 Mar 2022 11:34:37 +0900 Subject: [PATCH 36/54] =?UTF-8?q?refactor:=20while=EB=AC=B8=20=EC=A1=B0?= =?UTF-8?q?=EA=B1=B4=20=EB=8B=A8=EC=88=9C=ED=99=94?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- src/main/java/domain/game/BlackJackGame.java | 6 ------ src/main/java/domain/participant/Command.java | 4 ++++ src/main/java/game/ConsoleGame.java | 7 ++----- src/test/java/domain/game/BlackJackGameTest.java | 13 ------------- 4 files changed, 6 insertions(+), 24 deletions(-) diff --git a/src/main/java/domain/game/BlackJackGame.java b/src/main/java/domain/game/BlackJackGame.java index e193d84b9c..72606ac7c0 100644 --- a/src/main/java/domain/game/BlackJackGame.java +++ b/src/main/java/domain/game/BlackJackGame.java @@ -40,12 +40,6 @@ private Cards drawInitialCards() { return new Cards(cards); } - public void drawCardByCommand(Participant participant, Command command) { - if (command == Command.HIT) { - drawCard(participant); - } - } - public void drawCard(Participant participant) { int index = participants.indexOf(participant); Participant nowParticipant = participants.get(index); diff --git a/src/main/java/domain/participant/Command.java b/src/main/java/domain/participant/Command.java index 23a22484f0..6545b5cc72 100644 --- a/src/main/java/domain/participant/Command.java +++ b/src/main/java/domain/participant/Command.java @@ -22,4 +22,8 @@ public static Command findCommand(String value) { public String getValue() { return value; } + + public boolean isStay() { + return this == STAY; + } } diff --git a/src/main/java/game/ConsoleGame.java b/src/main/java/game/ConsoleGame.java index dbc416eccf..19ae35d44e 100644 --- a/src/main/java/game/ConsoleGame.java +++ b/src/main/java/game/ConsoleGame.java @@ -42,11 +42,8 @@ private void playPlayersTurn(BlackJackGame blackJackGame, List play } private void playPlayerTurn(BlackJackGame blackJackGame, Participant player) { - Command command = Command.HIT; - - while (command != Command.STAY && !player.isFinished()) { - command = inputCommand(player); - blackJackGame.drawCardByCommand(player, command); + while (!player.isFinished() && !inputCommand(player).isStay()) { + blackJackGame.drawCard(player); OutputView.printCards(player); } } diff --git a/src/test/java/domain/game/BlackJackGameTest.java b/src/test/java/domain/game/BlackJackGameTest.java index b67950adf6..ee512f7d60 100644 --- a/src/test/java/domain/game/BlackJackGameTest.java +++ b/src/test/java/domain/game/BlackJackGameTest.java @@ -42,19 +42,6 @@ void create() { assertThat(match).isFalse(); } - @Test - @DisplayName("플레이어 카드 추가") - void player_card_add() { - // given - Participant player = blackJackGame.findPlayers().get(0); - - // when - blackJackGame.drawCardByCommand(player, Command.HIT); - - // then - assertThat(calculateCardsSize(player)).isEqualTo(3); - } - private int calculateCardsSize(Participant participant) { return participant .getCards() From 8e314c7a588d9b3461f1747b26862c3b385d931a Mon Sep 17 00:00:00 2001 From: yeon-06 Date: Mon, 14 Mar 2022 11:42:15 +0900 Subject: [PATCH 37/54] =?UTF-8?q?style:=20=ED=81=B4=EB=9E=98=EC=8A=A4?= =?UTF-8?q?=EB=AA=85=20=EB=B3=80=EA=B2=BD=20Denomination=20->=20Number?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- src/main/java/domain/card/Card.java | 20 +++++----- .../java/domain/card/CardDistributor.java | 4 +- .../card/{Denomination.java => Number.java} | 4 +- src/test/java/domain/card/CardTest.java | 5 +-- src/test/java/domain/card/CardsTest.java | 38 +++++++++---------- .../java/domain/game/BlackJackGameTest.java | 11 +++--- src/test/java/domain/game/GameResultTest.java | 28 +++++++------- .../java/domain/participant/DealerTest.java | 18 ++++----- .../java/domain/participant/PlayerTest.java | 16 ++++---- 9 files changed, 70 insertions(+), 74 deletions(-) rename src/main/java/domain/card/{Denomination.java => Number.java} (87%) diff --git a/src/main/java/domain/card/Card.java b/src/main/java/domain/card/Card.java index 414ccab631..ae8db35020 100644 --- a/src/main/java/domain/card/Card.java +++ b/src/main/java/domain/card/Card.java @@ -4,16 +4,16 @@ public class Card { - private final Denomination denomination; + private final Number number; private final Suit suit; - public Card(final Denomination denomination, final Suit suit) { - this.denomination = denomination; + public Card(final Number number, final Suit suit) { + this.number = number; this.suit = suit; } - public Denomination getDenomination() { - return denomination; + public Number getDenomination() { + return number; } public Suit getSuit() { @@ -21,11 +21,11 @@ public Suit getSuit() { } public int toInt() { - return this.denomination.getValue(); + return this.number.getValue(); } public boolean isAce() { - return this.denomination == Denomination.ACE; + return this.number == Number.ACE; } @Override @@ -33,18 +33,18 @@ public boolean equals(Object o) { if (this == o) return true; if (o == null || getClass() != o.getClass()) return false; Card card = (Card) o; - return denomination == card.denomination && suit == card.suit; + return number == card.number && suit == card.suit; } @Override public int hashCode() { - return Objects.hash(denomination, suit); + return Objects.hash(number, suit); } @Override public String toString() { return "Card{" + - "denomination=" + denomination + + "denomination=" + number + ", suit=" + suit + '}'; } diff --git a/src/main/java/domain/card/CardDistributor.java b/src/main/java/domain/card/CardDistributor.java index 4edbdb8a2a..6b29dd0b5b 100644 --- a/src/main/java/domain/card/CardDistributor.java +++ b/src/main/java/domain/card/CardDistributor.java @@ -14,8 +14,8 @@ public class CardDistributor { static { for (Suit suit : Suit.values()) { - for (Denomination denomination : Denomination.values()) { - CACHE.add(new Card(denomination, suit)); + for (Number number : Number.values()) { + CACHE.add(new Card(number, suit)); } } } diff --git a/src/main/java/domain/card/Denomination.java b/src/main/java/domain/card/Number.java similarity index 87% rename from src/main/java/domain/card/Denomination.java rename to src/main/java/domain/card/Number.java index 98a711abcd..544f2b62b4 100644 --- a/src/main/java/domain/card/Denomination.java +++ b/src/main/java/domain/card/Number.java @@ -1,6 +1,6 @@ package domain.card; -public enum Denomination { +public enum Number { ACE(1, "A"), TWO(2, "2"), @@ -19,7 +19,7 @@ public enum Denomination { private final int value; private final String name; - Denomination(int value, String name) { + Number(int value, String name) { this.value = value; this.name = name; } diff --git a/src/test/java/domain/card/CardTest.java b/src/test/java/domain/card/CardTest.java index 3ab318fa77..51969d322a 100644 --- a/src/test/java/domain/card/CardTest.java +++ b/src/test/java/domain/card/CardTest.java @@ -1,9 +1,6 @@ package domain.card; import org.junit.jupiter.api.Test; -import org.junit.jupiter.params.ParameterizedTest; -import org.junit.jupiter.params.provider.ValueSource; -import org.junit.jupiter.params.shadow.com.univocity.parsers.annotations.Validate; import static org.assertj.core.api.Assertions.assertThatNoException; @@ -11,6 +8,6 @@ public class CardTest { @Test void create() { // then - assertThatNoException().isThrownBy(() -> new Card(Denomination.ACE, Suit.CLOVER)); + assertThatNoException().isThrownBy(() -> new Card(Number.ACE, Suit.CLOVER)); } } diff --git a/src/test/java/domain/card/CardsTest.java b/src/test/java/domain/card/CardsTest.java index c0ae0b7ac9..d914855763 100644 --- a/src/test/java/domain/card/CardsTest.java +++ b/src/test/java/domain/card/CardsTest.java @@ -19,9 +19,9 @@ public class CardsTest { @ParameterizedTest(name = "[{index}] {0}인 경우 총합은 {1}") @MethodSource("provideParameters") @DisplayName("단일 카드 총합 구하기") - void sum(Denomination denomination, int expect) { + void sum(Number number, int expect) { // given - Cards cards = new Cards(Collections.singletonList(new Card(denomination, Suit.CLOVER))); + Cards cards = new Cards(Collections.singletonList(new Card(number, Suit.CLOVER))); // then assertThat(cards.sum()).isEqualTo(expect); @@ -29,19 +29,19 @@ void sum(Denomination denomination, int expect) { private static Stream provideParameters() { return Stream.of( - Arguments.arguments(Denomination.ACE, 11), - Arguments.arguments(Denomination.TWO, 2), - Arguments.arguments(Denomination.THREE, 3), - Arguments.arguments(Denomination.FOUR, 4), - Arguments.arguments(Denomination.FIVE, 5), - Arguments.arguments(Denomination.SIX, 6), - Arguments.arguments(Denomination.SEVEN, 7), - Arguments.arguments(Denomination.EIGHT, 8), - Arguments.arguments(Denomination.NINE, 9), - Arguments.arguments(Denomination.TEN, 10), - Arguments.arguments(Denomination.JACK, 10), - Arguments.arguments(Denomination.QUEEN, 10), - Arguments.arguments(Denomination.KING, 10) + Arguments.arguments(Number.ACE, 11), + Arguments.arguments(Number.TWO, 2), + Arguments.arguments(Number.THREE, 3), + Arguments.arguments(Number.FOUR, 4), + Arguments.arguments(Number.FIVE, 5), + Arguments.arguments(Number.SIX, 6), + Arguments.arguments(Number.SEVEN, 7), + Arguments.arguments(Number.EIGHT, 8), + Arguments.arguments(Number.NINE, 9), + Arguments.arguments(Number.TEN, 10), + Arguments.arguments(Number.JACK, 10), + Arguments.arguments(Number.QUEEN, 10), + Arguments.arguments(Number.KING, 10) ); } @@ -49,8 +49,8 @@ private static Stream provideParameters() { @DisplayName("ACE 2개인 경우") void sum2() { // given - Cards cards = new Cards(Arrays.asList(new Card(Denomination.ACE, Suit.CLOVER) - , new Card(Denomination.ACE, Suit.HEART))); + Cards cards = new Cards(Arrays.asList(new Card(Number.ACE, Suit.CLOVER) + , new Card(Number.ACE, Suit.HEART))); // then assertThat(cards.sum()).isEqualTo(12); @@ -61,9 +61,9 @@ void sum2() { void add() { // given List list = new ArrayList<>(); - list.add(new Card(Denomination.ACE, Suit.CLOVER)); + list.add(new Card(Number.ACE, Suit.CLOVER)); Cards cards = new Cards(list); - Card newCard = new Card(Denomination.JACK, Suit.HEART); + Card newCard = new Card(Number.JACK, Suit.HEART); // when cards.add(newCard); diff --git a/src/test/java/domain/game/BlackJackGameTest.java b/src/test/java/domain/game/BlackJackGameTest.java index ee512f7d60..bbd02edc40 100644 --- a/src/test/java/domain/game/BlackJackGameTest.java +++ b/src/test/java/domain/game/BlackJackGameTest.java @@ -4,9 +4,8 @@ import domain.card.Card; import domain.card.Cards; -import domain.card.Denomination; +import domain.card.Number; import domain.card.Suit; -import domain.participant.Command; import domain.participant.Dealer; import domain.participant.Name; import domain.participant.Participant; @@ -62,7 +61,7 @@ void find_players() { // given List expectPlayers = new ArrayList<>(); for (Name name : names) { - expectPlayers.add(new Player(name, getCards(Denomination.SEVEN, Denomination.QUEEN))); + expectPlayers.add(new Player(name, getCards(Number.SEVEN, Number.QUEEN))); } // when @@ -72,10 +71,10 @@ void find_players() { assertThat(playerNames).containsAll(expectPlayers); } - private static Cards getCards(Denomination... arguments) { + private static Cards getCards(Number... arguments) { List list = new ArrayList<>(); - for (Denomination denomination : arguments) { - list.add(new Card(denomination, Suit.CLOVER)); + for (Number number : arguments) { + list.add(new Card(number, Suit.CLOVER)); } return new Cards(list); } diff --git a/src/test/java/domain/game/GameResultTest.java b/src/test/java/domain/game/GameResultTest.java index 52a73c4025..7c66d52972 100644 --- a/src/test/java/domain/game/GameResultTest.java +++ b/src/test/java/domain/game/GameResultTest.java @@ -4,7 +4,7 @@ import domain.card.Card; import domain.card.Cards; -import domain.card.Denomination; +import domain.card.Number; import domain.card.Suit; import domain.participant.Dealer; import domain.participant.Name; @@ -34,11 +34,11 @@ void test(String comment, Player player, Dealer dealer) { private static Stream provideParameters() { return Stream.of( Arguments.arguments("플레이어가 버스트가 아니고 딜러가 버스트인 경우", - new Player(new Name("abc"), getCards(Denomination.ACE, Denomination.NINE)), - new Dealer(new Name("딜러"), getCards(Denomination.QUEEN, Denomination.KING, Denomination.JACK))), + new Player(new Name("abc"), getCards(Number.ACE, Number.NINE)), + new Dealer(new Name("딜러"), getCards(Number.QUEEN, Number.KING, Number.JACK))), Arguments.arguments("둘 다 버스트가 아니고 딜러보다 숫자가 높은 경우", - new Player(new Name("abc"), getCards(Denomination.KING, Denomination.QUEEN)), - new Dealer(new Name("딜러"), getCards(Denomination.QUEEN, Denomination.NINE))) + new Player(new Name("abc"), getCards(Number.KING, Number.QUEEN)), + new Dealer(new Name("딜러"), getCards(Number.QUEEN, Number.NINE))) ); } @@ -57,26 +57,26 @@ void dealer_count_test(Player player1, Player player2, Dealer dealer, MatchResul private static Stream provideParameters2() { return Stream.of( Arguments.arguments( - new Player(new Name("abc1"), getCards(Denomination.ACE, Denomination.NINE)), - new Player(new Name("abc2"), getCards(Denomination.EIGHT, Denomination.NINE)), - new Dealer(new Name("딜러"), getCards(Denomination.QUEEN, Denomination.NINE)), + new Player(new Name("abc1"), getCards(Number.ACE, Number.NINE)), + new Player(new Name("abc2"), getCards(Number.EIGHT, Number.NINE)), + new Dealer(new Name("딜러"), getCards(Number.QUEEN, Number.NINE)), MatchResult.WIN, 1 ), Arguments.arguments( - new Player(new Name("abc1"), getCards(Denomination.ACE, Denomination.NINE)), - new Player(new Name("abc2"), getCards(Denomination.NINE, Denomination.NINE)), - new Dealer(new Name("딜러"), getCards(Denomination.EIGHT, Denomination.NINE)), + new Player(new Name("abc1"), getCards(Number.ACE, Number.NINE)), + new Player(new Name("abc2"), getCards(Number.NINE, Number.NINE)), + new Dealer(new Name("딜러"), getCards(Number.EIGHT, Number.NINE)), MatchResult.LOSE, 2 ) ); } - private static Cards getCards(Denomination... arguments) { + private static Cards getCards(Number... arguments) { List list = new ArrayList<>(); - for (Denomination denomination : arguments) { - list.add(new Card(denomination, Suit.CLOVER)); + for (Number number : arguments) { + list.add(new Card(number, Suit.CLOVER)); } return new Cards(list); } diff --git a/src/test/java/domain/participant/DealerTest.java b/src/test/java/domain/participant/DealerTest.java index a00a3356d4..2f927bee03 100644 --- a/src/test/java/domain/participant/DealerTest.java +++ b/src/test/java/domain/participant/DealerTest.java @@ -4,7 +4,7 @@ import domain.card.Card; import domain.card.Cards; -import domain.card.Denomination; +import domain.card.Number; import domain.card.Suit; import java.util.ArrayList; import java.util.List; @@ -29,17 +29,17 @@ void Dealer(String comment, Cards cards, boolean expect) { private static Stream provideParameters() { return Stream.of( - Arguments.arguments("합계 22인 경우 true", getCards(Denomination.TWO, Denomination.QUEEN, Denomination.KING), + Arguments.arguments("합계 22인 경우 true", getCards(Number.TWO, Number.QUEEN, Number.KING), true), - Arguments.arguments("합계 17인 경우 true", getCards(Denomination.SEVEN, Denomination.QUEEN), true), - Arguments.arguments("합계 15인 경우 false", getCards(Denomination.QUEEN, Denomination.FIVE), false) + Arguments.arguments("합계 17인 경우 true", getCards(Number.SEVEN, Number.QUEEN), true), + Arguments.arguments("합계 15인 경우 false", getCards(Number.QUEEN, Number.FIVE), false) ); } - private static Cards getCards(Denomination... arguments) { + private static Cards getCards(Number... arguments) { List list = new ArrayList<>(); - for (Denomination denomination : arguments) { - list.add(new Card(denomination, Suit.CLOVER)); + for (Number number : arguments) { + list.add(new Card(number, Suit.CLOVER)); } return new Cards(list); } @@ -48,8 +48,8 @@ private static Cards getCards(Denomination... arguments) { @DisplayName("딜러 draw 확인") void drawCard() { // given - Dealer dealer = new Dealer(new Name("딜러"), getCards(Denomination.QUEEN)); - Card newCard = new Card(Denomination.ACE, Suit.CLOVER); + Dealer dealer = new Dealer(new Name("딜러"), getCards(Number.QUEEN)); + Card newCard = new Card(Number.ACE, Suit.CLOVER); // when dealer.drawCard(newCard); diff --git a/src/test/java/domain/participant/PlayerTest.java b/src/test/java/domain/participant/PlayerTest.java index 8c21f82149..9d2cd22474 100644 --- a/src/test/java/domain/participant/PlayerTest.java +++ b/src/test/java/domain/participant/PlayerTest.java @@ -4,7 +4,7 @@ import domain.card.Card; import domain.card.Cards; -import domain.card.Denomination; +import domain.card.Number; import domain.card.Suit; import java.util.ArrayList; import java.util.List; @@ -30,16 +30,16 @@ void player(String comment, Cards cards, boolean expect) { private static Stream provideParameters() { return Stream.of( - Arguments.arguments("합계 22인 경우 true", getCards(Denomination.TWO, Denomination.QUEEN, Denomination.KING), + Arguments.arguments("합계 22인 경우 true", getCards(Number.TWO, Number.QUEEN, Number.KING), true), - Arguments.arguments("합계 20인 경우 false", getCards(Denomination.QUEEN, Denomination.KING), false) + Arguments.arguments("합계 20인 경우 false", getCards(Number.QUEEN, Number.KING), false) ); } - private static Cards getCards(Denomination... arguments) { + private static Cards getCards(Number... arguments) { List list = new ArrayList<>(); - for (Denomination denomination : arguments) { - list.add(new Card(denomination, Suit.CLOVER)); + for (Number number : arguments) { + list.add(new Card(number, Suit.CLOVER)); } return new Cards(list); } @@ -47,8 +47,8 @@ private static Cards getCards(Denomination... arguments) { @Test void drawCard() { // given - Player player = new Player(new Name("name"), getCards(Denomination.QUEEN)); - Card newCard = new Card(Denomination.ACE, Suit.CLOVER); + Player player = new Player(new Name("name"), getCards(Number.QUEEN)); + Card newCard = new Card(Number.ACE, Suit.CLOVER); // when player.drawCard(newCard); From e4103fd3ed2240e7e6198a74ba2e00d85de01b8a Mon Sep 17 00:00:00 2001 From: yeon-06 Date: Mon, 14 Mar 2022 11:42:38 +0900 Subject: [PATCH 38/54] =?UTF-8?q?refactor:=20=EB=B6=88=ED=95=84=EC=9A=94?= =?UTF-8?q?=ED=95=9C=20=EC=A1=B0=EA=B1=B4=20=EC=A0=9C=EA=B1=B0?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- src/main/java/domain/card/CardDistributor.java | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/main/java/domain/card/CardDistributor.java b/src/main/java/domain/card/CardDistributor.java index 6b29dd0b5b..eb1f70675b 100644 --- a/src/main/java/domain/card/CardDistributor.java +++ b/src/main/java/domain/card/CardDistributor.java @@ -33,7 +33,7 @@ public Card distribute() { } private boolean isEmpty() { - return deck == null || deck.isEmpty(); + return deck.isEmpty(); } @Override From 15e593ee720d2b1850254d233577e909f5a3d7c7 Mon Sep 17 00:00:00 2001 From: yeon-06 Date: Mon, 14 Mar 2022 11:46:23 +0900 Subject: [PATCH 39/54] =?UTF-8?q?test:=20=ED=85=8C=EC=8A=A4=ED=8A=B8=20?= =?UTF-8?q?=EC=9C=A0=ED=8B=B8=20=EB=B6=84=EB=A6=AC?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../java/domain/game/BlackJackGameTest.java | 12 +---------- src/test/java/domain/game/GameResultTest.java | 13 +----------- .../java/domain/participant/DealerTest.java | 11 +--------- .../java/domain/participant/PlayerTest.java | 11 +--------- src/test/java/utils/TestUtil.java | 20 +++++++++++++++++++ 5 files changed, 24 insertions(+), 43 deletions(-) create mode 100644 src/test/java/utils/TestUtil.java diff --git a/src/test/java/domain/game/BlackJackGameTest.java b/src/test/java/domain/game/BlackJackGameTest.java index bbd02edc40..bcf12d277b 100644 --- a/src/test/java/domain/game/BlackJackGameTest.java +++ b/src/test/java/domain/game/BlackJackGameTest.java @@ -1,11 +1,9 @@ package domain.game; import static org.assertj.core.api.Assertions.assertThat; +import static utils.TestUtil.getCards; -import domain.card.Card; -import domain.card.Cards; import domain.card.Number; -import domain.card.Suit; import domain.participant.Dealer; import domain.participant.Name; import domain.participant.Participant; @@ -70,12 +68,4 @@ void find_players() { // then assertThat(playerNames).containsAll(expectPlayers); } - - private static Cards getCards(Number... arguments) { - List list = new ArrayList<>(); - for (Number number : arguments) { - list.add(new Card(number, Suit.CLOVER)); - } - return new Cards(list); - } } diff --git a/src/test/java/domain/game/GameResultTest.java b/src/test/java/domain/game/GameResultTest.java index 7c66d52972..9dec7fd0e3 100644 --- a/src/test/java/domain/game/GameResultTest.java +++ b/src/test/java/domain/game/GameResultTest.java @@ -1,16 +1,13 @@ package domain.game; import static org.assertj.core.api.Assertions.assertThat; +import static utils.TestUtil.getCards; -import domain.card.Card; -import domain.card.Cards; import domain.card.Number; -import domain.card.Suit; import domain.participant.Dealer; import domain.participant.Name; import domain.participant.Participant; import domain.participant.Player; -import java.util.ArrayList; import java.util.Arrays; import java.util.List; import java.util.stream.Stream; @@ -72,12 +69,4 @@ private static Stream provideParameters2() { ) ); } - - private static Cards getCards(Number... arguments) { - List list = new ArrayList<>(); - for (Number number : arguments) { - list.add(new Card(number, Suit.CLOVER)); - } - return new Cards(list); - } } diff --git a/src/test/java/domain/participant/DealerTest.java b/src/test/java/domain/participant/DealerTest.java index 2f927bee03..6da7b925a2 100644 --- a/src/test/java/domain/participant/DealerTest.java +++ b/src/test/java/domain/participant/DealerTest.java @@ -1,13 +1,12 @@ package domain.participant; import static org.assertj.core.api.Assertions.assertThat; +import static utils.TestUtil.getCards; import domain.card.Card; import domain.card.Cards; import domain.card.Number; import domain.card.Suit; -import java.util.ArrayList; -import java.util.List; import java.util.stream.Stream; import org.junit.jupiter.api.DisplayName; import org.junit.jupiter.api.Test; @@ -36,14 +35,6 @@ private static Stream provideParameters() { ); } - private static Cards getCards(Number... arguments) { - List list = new ArrayList<>(); - for (Number number : arguments) { - list.add(new Card(number, Suit.CLOVER)); - } - return new Cards(list); - } - @Test @DisplayName("딜러 draw 확인") void drawCard() { diff --git a/src/test/java/domain/participant/PlayerTest.java b/src/test/java/domain/participant/PlayerTest.java index 9d2cd22474..a63c2f2245 100644 --- a/src/test/java/domain/participant/PlayerTest.java +++ b/src/test/java/domain/participant/PlayerTest.java @@ -1,13 +1,12 @@ package domain.participant; import static org.assertj.core.api.Assertions.assertThat; +import static utils.TestUtil.getCards; import domain.card.Card; import domain.card.Cards; import domain.card.Number; import domain.card.Suit; -import java.util.ArrayList; -import java.util.List; import java.util.stream.Stream; import org.junit.jupiter.api.DisplayName; import org.junit.jupiter.api.Test; @@ -36,14 +35,6 @@ private static Stream provideParameters() { ); } - private static Cards getCards(Number... arguments) { - List list = new ArrayList<>(); - for (Number number : arguments) { - list.add(new Card(number, Suit.CLOVER)); - } - return new Cards(list); - } - @Test void drawCard() { // given diff --git a/src/test/java/utils/TestUtil.java b/src/test/java/utils/TestUtil.java new file mode 100644 index 0000000000..668d1fd883 --- /dev/null +++ b/src/test/java/utils/TestUtil.java @@ -0,0 +1,20 @@ +package utils; + +import domain.card.Card; +import domain.card.Cards; +import domain.card.Number; +import domain.card.Suit; +import java.util.ArrayList; +import java.util.List; + +public class TestUtil { + + public static Cards getCards(Number... arguments) { + List list = new ArrayList<>(); + for (Number number : arguments) { + list.add(new Card(number, Suit.CLOVER)); + } + return new Cards(list); + } + +} From 2b18befde1b011d17e16161a17c04a2efa27e881 Mon Sep 17 00:00:00 2001 From: yeon-06 Date: Mon, 14 Mar 2022 17:01:47 +0900 Subject: [PATCH 40/54] =?UTF-8?q?refactor:=20List=EB=A5=BC=20?= =?UTF-8?q?Participants=EB=A1=9C=20=EB=8C=80=EC=B2=B4?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- src/main/java/domain/game/BlackJackGame.java | 28 +++------- .../java/domain/participant/Participants.java | 39 +++++++++++++ src/main/java/game/ConsoleGame.java | 8 ++- .../java/domain/game/BlackJackGameTest.java | 43 ++------------- .../domain/participant/ParticipantsTest.java | 55 +++++++++++++++++++ 5 files changed, 112 insertions(+), 61 deletions(-) create mode 100644 src/main/java/domain/participant/Participants.java create mode 100644 src/test/java/domain/participant/ParticipantsTest.java diff --git a/src/main/java/domain/game/BlackJackGame.java b/src/main/java/domain/game/BlackJackGame.java index 72606ac7c0..9658815382 100644 --- a/src/main/java/domain/game/BlackJackGame.java +++ b/src/main/java/domain/game/BlackJackGame.java @@ -3,10 +3,10 @@ import domain.card.Card; import domain.card.CardDistributor; import domain.card.Cards; -import domain.participant.Command; import domain.participant.Dealer; import domain.participant.Name; import domain.participant.Participant; +import domain.participant.Participants; import domain.participant.Player; import java.util.ArrayList; import java.util.List; @@ -15,18 +15,17 @@ public class BlackJackGame { public static final String DEALER_NAME = "딜러"; - private static final String NOT_EXIST_DEALER_ERROR = "딜러가 존재하지 않습니다."; private static final int INIT_CARD_COUNT = 2; - private final List participants = new ArrayList<>(); + private final Participants participants; private final CardDistributor cardDistributor = new CardDistributor(); public BlackJackGame(List names) { + this.participants = new Participants(initializePlayers(new ArrayList<>(names))); this.participants.add(new Dealer(new Name(DEALER_NAME), drawInitialCards())); - this.participants.addAll(initializePlayers(new ArrayList<>(names))); } - private List initializePlayers(List names) { + private List initializePlayers(List names) { return names.stream() .map(name -> new Player(name, drawInitialCards())) .collect(Collectors.toUnmodifiableList()); @@ -41,26 +40,15 @@ private Cards drawInitialCards() { } public void drawCard(Participant participant) { - int index = participants.indexOf(participant); - Participant nowParticipant = participants.get(index); - nowParticipant.drawCard(cardDistributor.distribute()); + participants.drawCard(participant, cardDistributor.distribute()); } public GameResult createGameResult() { - return new GameResult(findPlayers(), findDealer()); + return new GameResult(participants.findPlayers(), participants.findDealer()); } - public List findPlayers() { - return participants.stream() - .filter(participant -> participant instanceof Player) - .collect(Collectors.toUnmodifiableList()); - } - - public Participant findDealer() { - return participants.stream() - .filter(participant -> participant instanceof Dealer) - .findFirst() - .orElseThrow(() -> new IllegalArgumentException(NOT_EXIST_DEALER_ERROR)); + public Participants getParticipants() { + return participants; } @Override diff --git a/src/main/java/domain/participant/Participants.java b/src/main/java/domain/participant/Participants.java new file mode 100644 index 0000000000..0b8d6e8e31 --- /dev/null +++ b/src/main/java/domain/participant/Participants.java @@ -0,0 +1,39 @@ +package domain.participant; + +import domain.card.Card; +import java.util.ArrayList; +import java.util.List; +import java.util.stream.Collectors; + +public class Participants { + private static final String NOT_EXIST_DEALER_ERROR = "딜러가 존재하지 않습니다."; + + private final List participants = new ArrayList<>(); + + public Participants(List participants) { + this.participants.addAll(participants); + } + + public void add(Participant participant) { + this.participants.add(participant); + } + + public List findPlayers() { + return participants.stream() + .filter(participant -> participant instanceof Player) + .collect(Collectors.toUnmodifiableList()); + } + + public Participant findDealer() { + return participants.stream() + .filter(participant -> participant instanceof Dealer) + .findFirst() + .orElseThrow(() -> new IllegalArgumentException(NOT_EXIST_DEALER_ERROR)); + } + + public void drawCard(Participant participant, Card card) { + int index = participants.indexOf(participant); + Participant nowParticipant = participants.get(index); + nowParticipant.drawCard(card); + } +} diff --git a/src/main/java/game/ConsoleGame.java b/src/main/java/game/ConsoleGame.java index 19ae35d44e..4163b9a08e 100644 --- a/src/main/java/game/ConsoleGame.java +++ b/src/main/java/game/ConsoleGame.java @@ -5,6 +5,7 @@ import domain.participant.Command; import domain.participant.Name; import domain.participant.Participant; +import domain.participant.Participants; import java.util.List; import view.InputView; import view.OutputView; @@ -14,10 +15,11 @@ public class ConsoleGame { public void run() { BlackJackGame blackJackGame = createBlackJackGame(); - Participant dealer = blackJackGame.findDealer(); - List players = blackJackGame.findPlayers(); + Participants participants = blackJackGame.getParticipants(); + Participant dealer = participants.findDealer(); + List players = participants.findPlayers(); - OutputView.printInitialCards(dealer, players); + OutputView.printInitialCards(participants.findDealer(), participants.findPlayers()); playPlayersTurn(blackJackGame, players); playDealerTurn(blackJackGame, dealer); diff --git a/src/test/java/domain/game/BlackJackGameTest.java b/src/test/java/domain/game/BlackJackGameTest.java index bcf12d277b..e57c0c95a5 100644 --- a/src/test/java/domain/game/BlackJackGameTest.java +++ b/src/test/java/domain/game/BlackJackGameTest.java @@ -1,35 +1,25 @@ package domain.game; import static org.assertj.core.api.Assertions.assertThat; -import static utils.TestUtil.getCards; -import domain.card.Number; -import domain.participant.Dealer; import domain.participant.Name; import domain.participant.Participant; -import domain.participant.Player; -import java.util.ArrayList; import java.util.Arrays; import java.util.List; -import org.junit.jupiter.api.BeforeEach; import org.junit.jupiter.api.DisplayName; import org.junit.jupiter.api.Test; public class BlackJackGameTest { - private List names; - private BlackJackGame blackJackGame; - - @BeforeEach - void init() { - names = Arrays.asList(new Name("pobi"), new Name("jason")); - blackJackGame = new BlackJackGame(names); - } - @Test @DisplayName("게임 초기화 시 각 플레이어는 2장의 카드를 분배받는다.") void create() { + // given + List names = Arrays.asList(new Name("pobi"), new Name("jason")); + BlackJackGame blackJackGame = new BlackJackGame(names); + // when boolean match = blackJackGame + .getParticipants() .findPlayers() .stream() .mapToInt(this::calculateCardsSize) @@ -45,27 +35,4 @@ private int calculateCardsSize(Participant participant) { .getValue() .size(); } - - @Test - @DisplayName("딜러 가져오기") - void find_dealer() { - // then - assertThat(blackJackGame.findDealer()).isInstanceOf(Dealer.class); - } - - @Test - @DisplayName("플레이어들 가져오기") - void find_players() { - // given - List expectPlayers = new ArrayList<>(); - for (Name name : names) { - expectPlayers.add(new Player(name, getCards(Number.SEVEN, Number.QUEEN))); - } - - // when - List playerNames = blackJackGame.findPlayers(); - - // then - assertThat(playerNames).containsAll(expectPlayers); - } } diff --git a/src/test/java/domain/participant/ParticipantsTest.java b/src/test/java/domain/participant/ParticipantsTest.java new file mode 100644 index 0000000000..8c962dd393 --- /dev/null +++ b/src/test/java/domain/participant/ParticipantsTest.java @@ -0,0 +1,55 @@ +package domain.participant; + +import static org.assertj.core.api.Assertions.assertThat; +import static utils.TestUtil.getCards; + +import domain.card.Number; +import java.util.ArrayList; +import java.util.Arrays; +import java.util.List; +import org.junit.jupiter.api.BeforeEach; +import org.junit.jupiter.api.DisplayName; +import org.junit.jupiter.api.Test; + +class ParticipantsTest { + private List names; + private Participants participants; + + @BeforeEach + void init() { + names = Arrays.asList(new Name("pobi"), new Name("jason")); + + participants = new Participants(toPlayerList(names)); + participants.add(new Dealer(new Name("딜러"), getCards(Number.SEVEN, Number.QUEEN))); + } + + @Test + @DisplayName("플레이어들 가져오기") + void find_players() { + // given + List expectPlayers = toPlayerList(names); + + // when + List playerNames = participants.findPlayers(); + + // then + assertThat(playerNames).containsAll(expectPlayers); + } + + private List toPlayerList(List names) { + List participantsList = new ArrayList<>(); + for (Name name : names) { + participantsList.add(new Player(name, getCards(Number.SEVEN, Number.QUEEN))); + } + return participantsList; + } + + @Test + @DisplayName("딜러 가져오기") + void find_dealer() { + // then + assertThat(participants + .findDealer()) + .isInstanceOf(Dealer.class); + } +} \ No newline at end of file From 1818dd32340aca3d49654d0ba5d1a2555e8b16dc Mon Sep 17 00:00:00 2001 From: yeon-06 Date: Mon, 14 Mar 2022 19:52:37 +0900 Subject: [PATCH 41/54] =?UTF-8?q?refactor:=20instanceof=20=EB=8C=80?= =?UTF-8?q?=EC=8B=A0=20getClass=EB=A1=9C=20=EB=B9=84=EA=B5=90?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../java/domain/participant/Participant.java | 4 ++ .../java/domain/participant/Participants.java | 4 +- .../domain/participant/ParticipantTest.java | 38 +++++++++++++++++++ 3 files changed, 44 insertions(+), 2 deletions(-) create mode 100644 src/test/java/domain/participant/ParticipantTest.java diff --git a/src/main/java/domain/participant/Participant.java b/src/main/java/domain/participant/Participant.java index 53159ec097..353f379ae6 100644 --- a/src/main/java/domain/participant/Participant.java +++ b/src/main/java/domain/participant/Participant.java @@ -43,6 +43,10 @@ public Cards getCards() { return cards; } + public boolean isSameClass(Class classType) { + return getClass() == classType; + } + @Override public boolean equals(Object o) { if (this == o) { diff --git a/src/main/java/domain/participant/Participants.java b/src/main/java/domain/participant/Participants.java index 0b8d6e8e31..1b03f8b2d7 100644 --- a/src/main/java/domain/participant/Participants.java +++ b/src/main/java/domain/participant/Participants.java @@ -20,13 +20,13 @@ public void add(Participant participant) { public List findPlayers() { return participants.stream() - .filter(participant -> participant instanceof Player) + .filter(participant -> participant.isSameClass(Player.class)) .collect(Collectors.toUnmodifiableList()); } public Participant findDealer() { return participants.stream() - .filter(participant -> participant instanceof Dealer) + .filter(participant -> participant.isSameClass(Dealer.class)) .findFirst() .orElseThrow(() -> new IllegalArgumentException(NOT_EXIST_DEALER_ERROR)); } diff --git a/src/test/java/domain/participant/ParticipantTest.java b/src/test/java/domain/participant/ParticipantTest.java new file mode 100644 index 0000000000..4d9468e4ff --- /dev/null +++ b/src/test/java/domain/participant/ParticipantTest.java @@ -0,0 +1,38 @@ +package domain.participant; + +import static org.assertj.core.api.Assertions.assertThat; +import static utils.TestUtil.getCards; + +import domain.card.Cards; +import domain.card.Number; +import java.util.stream.Stream; +import org.junit.jupiter.api.DisplayName; +import org.junit.jupiter.params.ParameterizedTest; +import org.junit.jupiter.params.provider.Arguments; +import org.junit.jupiter.params.provider.MethodSource; + +class ParticipantTest { + + @ParameterizedTest + @MethodSource("provideParameters") + @DisplayName("클래스 동일 여부 확인") + void isSameClass(Participant participant, Class className, boolean expect) { + // when + boolean result = participant.isSameClass(className); + + // then + assertThat(result).isEqualTo(expect); + } + + private static Stream provideParameters() { + Cards cards = getCards(Number.TWO, Number.QUEEN, Number.KING); + return Stream.of( + Arguments.arguments(new Player(new Name("yeonLog"), cards), Participant.class, false), + Arguments.arguments(new Player(new Name("yeonLog"), cards), Player.class, true), + Arguments.arguments(new Player(new Name("yeonLog"), cards), Dealer.class, false), + Arguments.arguments(new Dealer(new Name("yeonLog"), cards), Participant.class, false), + Arguments.arguments(new Dealer(new Name("yeonLog"), cards), Player.class, false), + Arguments.arguments(new Dealer(new Name("yeonLog"), cards), Dealer.class, true) + ); + } +} \ No newline at end of file From c29202c2198c2bc3483b0babd940592410474678 Mon Sep 17 00:00:00 2001 From: yeon-06 Date: Mon, 14 Mar 2022 20:06:54 +0900 Subject: [PATCH 42/54] =?UTF-8?q?refactor:=20=ED=94=8C=EB=A0=88=EC=9D=B4?= =?UTF-8?q?=20=EA=B2=B0=EA=B3=BC=EB=A5=BC=20=EB=B0=98=ED=99=98=ED=95=98?= =?UTF-8?q?=EB=8A=94=20=EB=A9=94=EC=86=8C=EB=93=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/domain/game/GameResult.java | 22 ++++++++++++++++++- .../java/domain/participant/Participant.java | 15 ------------- 2 files changed, 21 insertions(+), 16 deletions(-) diff --git a/src/main/java/domain/game/GameResult.java b/src/main/java/domain/game/GameResult.java index 9b71087f37..f1eb42edc4 100644 --- a/src/main/java/domain/game/GameResult.java +++ b/src/main/java/domain/game/GameResult.java @@ -1,5 +1,6 @@ package domain.game; +import domain.card.Cards; import domain.participant.Participant; import java.util.ArrayList; import java.util.Collections; @@ -17,10 +18,29 @@ public GameResult(List players, Participant dealer) { private void initialGameResult(List players, Participant dealer) { for (Participant player : players) { - gameResult.put(player, player.playResult(dealer)); + gameResult.put(player, playResult(player, dealer)); } } + private MatchResult playResult(Participant player, Participant dealer) { + Cards playerCards = player.getCards(); + Cards dealerCards = dealer.getCards(); + + if (isFirstCardsLose(playerCards, dealerCards)) { + return MatchResult.LOSE; + } + + if (isFirstCardsLose(dealerCards, playerCards)) { + return MatchResult.WIN; + } + + return MatchResult.PUSH; + } + + private boolean isFirstCardsLose(Cards cards1, Cards cards2) { + return cards1.isBust() || (!cards2.isBust() && cards1.sum() < cards2.sum()); + } + public MatchResult getMatchResult(Participant player) { return gameResult.get(player); } diff --git a/src/main/java/domain/participant/Participant.java b/src/main/java/domain/participant/Participant.java index 353f379ae6..a454aa8c0e 100644 --- a/src/main/java/domain/participant/Participant.java +++ b/src/main/java/domain/participant/Participant.java @@ -2,7 +2,6 @@ import domain.card.Card; import domain.card.Cards; -import domain.game.MatchResult; import java.util.Objects; public abstract class Participant { @@ -17,20 +16,6 @@ public Participant(Name name, Cards cards) { public abstract boolean isFinished(); - public MatchResult playResult(Participant participant) { - int thisSum = cards.sum(); - int otherSum = participant.cards.sum(); - - if (thisSum == otherSum || (cards.isBust() && participant.cards.isBust())) { - return MatchResult.PUSH; - } - if (cards.isBust() || (!participant.cards.isBust() && thisSum < otherSum)) { - return MatchResult.LOSE; - } - - return MatchResult.WIN; - } - public void drawCard(Card card) { cards.add(card); } From 42d265f6c6767066b35133d8d6c2b111f48bc8a0 Mon Sep 17 00:00:00 2001 From: yeon-06 Date: Mon, 14 Mar 2022 20:07:57 +0900 Subject: [PATCH 43/54] =?UTF-8?q?style:=20=EB=B3=80=EC=88=98=EB=AA=85=20?= =?UTF-8?q?=EB=B3=80=EA=B2=BD?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- src/main/java/domain/card/Cards.java | 8 ++++---- 1 file changed, 4 insertions(+), 4 deletions(-) diff --git a/src/main/java/domain/card/Cards.java b/src/main/java/domain/card/Cards.java index 60ae53a585..3b55e5c324 100644 --- a/src/main/java/domain/card/Cards.java +++ b/src/main/java/domain/card/Cards.java @@ -7,7 +7,7 @@ public class Cards { private static final int ACE_ADDITIONAL_VALUE = 10; - private static final int BLACKJACK_COUNT = 21; + private static final int BLACKJACK_VALUE = 21; private final List value; @@ -20,11 +20,11 @@ public void add(Card card) { } public boolean isBust() { - return sum() > BLACKJACK_COUNT; + return sum() > BLACKJACK_VALUE; } public boolean isBlackJack() { - return sum() == BLACKJACK_COUNT; + return sum() == BLACKJACK_VALUE; } public int sum() { @@ -49,7 +49,7 @@ private boolean hasAce() { } private boolean exceedBust(int sum) { - return sum + ACE_ADDITIONAL_VALUE > BLACKJACK_COUNT; + return sum + ACE_ADDITIONAL_VALUE > BLACKJACK_VALUE; } public List getValue() { From 2df5fe6d2fc8768671ebc8188f2ffc46d58942f6 Mon Sep 17 00:00:00 2001 From: yeon-06 Date: Mon, 14 Mar 2022 20:29:50 +0900 Subject: [PATCH 44/54] =?UTF-8?q?style:=20BlackJack=20->=20Blackjack=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/domain/card/Cards.java | 2 +- ...{BlackJackGame.java => BlackjackGame.java} | 6 ++-- src/main/java/domain/participant/Dealer.java | 2 +- src/main/java/domain/participant/Player.java | 2 +- src/main/java/domain/participant/Role.java | 4 +++ src/main/java/game/ConsoleGame.java | 34 +++++++++---------- src/main/java/view/OutputView.java | 4 +-- ...ckGameTest.java => BlackjackGameTest.java} | 6 ++-- 8 files changed, 32 insertions(+), 28 deletions(-) rename src/main/java/domain/game/{BlackJackGame.java => BlackjackGame.java} (94%) create mode 100644 src/main/java/domain/participant/Role.java rename src/test/java/domain/game/{BlackJackGameTest.java => BlackjackGameTest.java} (87%) diff --git a/src/main/java/domain/card/Cards.java b/src/main/java/domain/card/Cards.java index 3b55e5c324..f6e5ee7da1 100644 --- a/src/main/java/domain/card/Cards.java +++ b/src/main/java/domain/card/Cards.java @@ -23,7 +23,7 @@ public boolean isBust() { return sum() > BLACKJACK_VALUE; } - public boolean isBlackJack() { + public boolean isBlackjack() { return sum() == BLACKJACK_VALUE; } diff --git a/src/main/java/domain/game/BlackJackGame.java b/src/main/java/domain/game/BlackjackGame.java similarity index 94% rename from src/main/java/domain/game/BlackJackGame.java rename to src/main/java/domain/game/BlackjackGame.java index 9658815382..e45afc2b48 100644 --- a/src/main/java/domain/game/BlackJackGame.java +++ b/src/main/java/domain/game/BlackjackGame.java @@ -12,7 +12,7 @@ import java.util.List; import java.util.stream.Collectors; -public class BlackJackGame { +public class BlackjackGame { public static final String DEALER_NAME = "딜러"; private static final int INIT_CARD_COUNT = 2; @@ -20,7 +20,7 @@ public class BlackJackGame { private final Participants participants; private final CardDistributor cardDistributor = new CardDistributor(); - public BlackJackGame(List names) { + public BlackjackGame(List names) { this.participants = new Participants(initializePlayers(new ArrayList<>(names))); this.participants.add(new Dealer(new Name(DEALER_NAME), drawInitialCards())); } @@ -53,7 +53,7 @@ public Participants getParticipants() { @Override public String toString() { - return "BlackJackGame{" + + return "BlackjackGame{" + "participants=" + participants + ", cardDistributor=" + cardDistributor + '}'; diff --git a/src/main/java/domain/participant/Dealer.java b/src/main/java/domain/participant/Dealer.java index bfea36611e..b8700bc08a 100644 --- a/src/main/java/domain/participant/Dealer.java +++ b/src/main/java/domain/participant/Dealer.java @@ -12,7 +12,7 @@ public Dealer(Name name, Cards cards) { @Override public boolean isFinished() { - return cards.isBust() || cards.sum() > DRAW_STANDARD || cards.isBlackJack(); + return cards.isBust() || cards.sum() > DRAW_STANDARD || cards.isBlackjack(); } @Override diff --git a/src/main/java/domain/participant/Player.java b/src/main/java/domain/participant/Player.java index ffbc6df142..72c5ee1f92 100644 --- a/src/main/java/domain/participant/Player.java +++ b/src/main/java/domain/participant/Player.java @@ -10,7 +10,7 @@ public Player(Name name, Cards cards) { @Override public boolean isFinished() { - return cards.isBust() || cards.isBlackJack(); + return cards.isBust() || cards.isBlackjack(); } @Override diff --git a/src/main/java/domain/participant/Role.java b/src/main/java/domain/participant/Role.java new file mode 100644 index 0000000000..61adff75d4 --- /dev/null +++ b/src/main/java/domain/participant/Role.java @@ -0,0 +1,4 @@ +package domain.participant; + +public interface Role { +} diff --git a/src/main/java/game/ConsoleGame.java b/src/main/java/game/ConsoleGame.java index 4163b9a08e..1c71fe6091 100644 --- a/src/main/java/game/ConsoleGame.java +++ b/src/main/java/game/ConsoleGame.java @@ -1,6 +1,6 @@ package game; -import domain.game.BlackJackGame; +import domain.game.BlackjackGame; import domain.game.GameResult; import domain.participant.Command; import domain.participant.Name; @@ -13,39 +13,39 @@ public class ConsoleGame { public void run() { - BlackJackGame blackJackGame = createBlackJackGame(); + BlackjackGame blackjackGame = createBlackjackGame(); - Participants participants = blackJackGame.getParticipants(); + Participants participants = blackjackGame.getParticipants(); Participant dealer = participants.findDealer(); List players = participants.findPlayers(); OutputView.printInitialCards(participants.findDealer(), participants.findPlayers()); - playPlayersTurn(blackJackGame, players); - playDealerTurn(blackJackGame, dealer); + playPlayersTurn(blackjackGame, players); + playDealerTurn(blackjackGame, dealer); - showGameResult(blackJackGame, dealer, players); + showGameResult(blackjackGame, dealer, players); } - private BlackJackGame createBlackJackGame() { + private BlackjackGame createBlackjackGame() { try { List playerNames = InputView.inputPlayerNames(); - return new BlackJackGame(playerNames); + return new BlackjackGame(playerNames); } catch (IllegalArgumentException e) { OutputView.printException(e); - return createBlackJackGame(); + return createBlackjackGame(); } } - private void playPlayersTurn(BlackJackGame blackJackGame, List players) { + private void playPlayersTurn(BlackjackGame blackjackGame, List players) { for (Participant player : players) { - playPlayerTurn(blackJackGame, player); + playPlayerTurn(blackjackGame, player); } } - private void playPlayerTurn(BlackJackGame blackJackGame, Participant player) { + private void playPlayerTurn(BlackjackGame blackjackGame, Participant player) { while (!player.isFinished() && !inputCommand(player).isStay()) { - blackJackGame.drawCard(player); + blackjackGame.drawCard(player); OutputView.printCards(player); } } @@ -60,15 +60,15 @@ private Command inputCommand(Participant player) { } } - private void playDealerTurn(BlackJackGame blackJackGame, Participant dealer) { + private void playDealerTurn(BlackjackGame blackjackGame, Participant dealer) { while (!dealer.isFinished()) { OutputView.printDealerDrawInfo(); - blackJackGame.drawCard(dealer); + blackjackGame.drawCard(dealer); } } - private void showGameResult(BlackJackGame blackJackGame, Participant dealer, List players) { - GameResult gameResult = blackJackGame.createGameResult(); + private void showGameResult(BlackjackGame blackjackGame, Participant dealer, List players) { + GameResult gameResult = blackjackGame.createGameResult(); OutputView.printCardsResult(dealer, players); OutputView.printGameResult(gameResult); } diff --git a/src/main/java/view/OutputView.java b/src/main/java/view/OutputView.java index fc8ef81db4..b732cad5d7 100644 --- a/src/main/java/view/OutputView.java +++ b/src/main/java/view/OutputView.java @@ -2,7 +2,7 @@ import domain.card.Card; import domain.card.Cards; -import domain.game.BlackJackGame; +import domain.game.BlackjackGame; import domain.game.GameResult; import domain.game.MatchResult; import domain.participant.Dealer; @@ -70,7 +70,7 @@ public static void printGameResult(GameResult gameResult) { Map map = gameResult.getGameResult(); System.out.printf("%n%s: %d승 %d무 %d패%n" - , BlackJackGame.DEALER_NAME + , BlackjackGame.DEALER_NAME , gameResult.calculateDealerMatchResultCount(MatchResult.WIN) , gameResult.calculateDealerMatchResultCount(MatchResult.PUSH) , gameResult.calculateDealerMatchResultCount(MatchResult.LOSE) diff --git a/src/test/java/domain/game/BlackJackGameTest.java b/src/test/java/domain/game/BlackjackGameTest.java similarity index 87% rename from src/test/java/domain/game/BlackJackGameTest.java rename to src/test/java/domain/game/BlackjackGameTest.java index e57c0c95a5..80570463c7 100644 --- a/src/test/java/domain/game/BlackJackGameTest.java +++ b/src/test/java/domain/game/BlackjackGameTest.java @@ -9,16 +9,16 @@ import org.junit.jupiter.api.DisplayName; import org.junit.jupiter.api.Test; -public class BlackJackGameTest { +public class BlackjackGameTest { @Test @DisplayName("게임 초기화 시 각 플레이어는 2장의 카드를 분배받는다.") void create() { // given List names = Arrays.asList(new Name("pobi"), new Name("jason")); - BlackJackGame blackJackGame = new BlackJackGame(names); + BlackjackGame blackjackGame = new BlackjackGame(names); // when - boolean match = blackJackGame + boolean match = blackjackGame .getParticipants() .findPlayers() .stream() From 77a5dafcb0acaf6783df9ecad75b0a3be0cc8580 Mon Sep 17 00:00:00 2001 From: yeon-06 Date: Tue, 15 Mar 2022 00:26:29 +0900 Subject: [PATCH 45/54] =?UTF-8?q?style:=20blackjack=20=EA=B4=80=EB=A0=A8?= =?UTF-8?q?=20=ED=81=B4=EB=9E=98=EC=8A=A4=EB=93=A4=20=ED=8C=A8=ED=82=A4?= =?UTF-8?q?=EC=A7=80=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/Application.java | 2 +- .../{ => blackjack}/domain/card/Card.java | 2 +- .../domain/card/CardDistributor.java | 2 +- .../{ => blackjack}/domain/card/Cards.java | 2 +- .../{ => blackjack}/domain/card/Number.java | 2 +- .../{ => blackjack}/domain/card/Suit.java | 2 +- .../domain/game/BlackjackGame.java | 20 +++++++++---------- .../domain/game/GameResult.java | 6 +++--- .../domain/game/MatchResult.java | 2 +- .../domain/participant/Command.java | 2 +- .../domain/participant/Dealer.java | 4 ++-- .../domain/participant/Name.java | 2 +- .../domain/participant/Participant.java | 6 +++--- .../domain/participant/Participants.java | 4 ++-- .../domain/participant/Player.java | 4 ++-- .../{ => blackjack}/game/ConsoleGame.java | 18 ++++++++--------- .../java/{ => blackjack}/view/InputView.java | 6 +++--- .../java/{ => blackjack}/view/OutputView.java | 18 ++++++++--------- src/main/java/domain/participant/Role.java | 4 ---- .../domain/card/CardDistributorTest.java | 2 +- .../{ => blackjack}/domain/card/CardTest.java | 2 +- .../domain/card/CardsTest.java | 2 +- .../domain/game/BlackjackGameTest.java | 6 +++--- .../domain/game/GameResultTest.java | 12 +++++------ .../domain/participant/DealerTest.java | 10 +++++----- .../domain/participant/ParticipantTest.java | 6 +++--- .../domain/participant/ParticipantsTest.java | 4 ++-- .../domain/participant/PlayerTest.java | 10 +++++----- src/test/java/utils/TestUtil.java | 8 ++++---- 29 files changed, 83 insertions(+), 87 deletions(-) rename src/main/java/{ => blackjack}/domain/card/Card.java (97%) rename src/main/java/{ => blackjack}/domain/card/CardDistributor.java (97%) rename src/main/java/{ => blackjack}/domain/card/Cards.java (97%) rename src/main/java/{ => blackjack}/domain/card/Number.java (94%) rename src/main/java/{ => blackjack}/domain/card/Suit.java (89%) rename src/main/java/{ => blackjack}/domain/game/BlackjackGame.java (80%) rename src/main/java/{ => blackjack}/domain/game/GameResult.java (94%) rename src/main/java/{ => blackjack}/domain/game/MatchResult.java (88%) rename src/main/java/{ => blackjack}/domain/participant/Command.java (94%) rename src/main/java/{ => blackjack}/domain/participant/Dealer.java (86%) rename src/main/java/{ => blackjack}/domain/participant/Name.java (96%) rename src/main/java/{ => blackjack}/domain/participant/Participant.java (89%) rename src/main/java/{ => blackjack}/domain/participant/Participants.java (94%) rename src/main/java/{ => blackjack}/domain/participant/Player.java (84%) rename src/main/java/{ => blackjack}/game/ConsoleGame.java (85%) rename src/main/java/{ => blackjack}/view/InputView.java (93%) rename src/main/java/{ => blackjack}/view/OutputView.java (90%) delete mode 100644 src/main/java/domain/participant/Role.java rename src/test/java/{ => blackjack}/domain/card/CardDistributorTest.java (97%) rename src/test/java/{ => blackjack}/domain/card/CardTest.java (89%) rename src/test/java/{ => blackjack}/domain/card/CardsTest.java (98%) rename src/test/java/{ => blackjack}/domain/game/BlackjackGameTest.java (89%) rename src/test/java/{ => blackjack}/domain/game/GameResultTest.java (92%) rename src/test/java/{ => blackjack}/domain/participant/DealerTest.java (89%) rename src/test/java/{ => blackjack}/domain/participant/ParticipantTest.java (92%) rename src/test/java/{ => blackjack}/domain/participant/ParticipantsTest.java (95%) rename src/test/java/{ => blackjack}/domain/participant/PlayerTest.java (88%) diff --git a/src/main/java/Application.java b/src/main/java/Application.java index 7480060302..b2b34dcaa9 100644 --- a/src/main/java/Application.java +++ b/src/main/java/Application.java @@ -1,4 +1,4 @@ -import game.ConsoleGame; +import blackjack.game.ConsoleGame; public class Application { public static void main(String[] args) { diff --git a/src/main/java/domain/card/Card.java b/src/main/java/blackjack/domain/card/Card.java similarity index 97% rename from src/main/java/domain/card/Card.java rename to src/main/java/blackjack/domain/card/Card.java index ae8db35020..6df4fd69cc 100644 --- a/src/main/java/domain/card/Card.java +++ b/src/main/java/blackjack/domain/card/Card.java @@ -1,4 +1,4 @@ -package domain.card; +package blackjack.domain.card; import java.util.Objects; diff --git a/src/main/java/domain/card/CardDistributor.java b/src/main/java/blackjack/domain/card/CardDistributor.java similarity index 97% rename from src/main/java/domain/card/CardDistributor.java rename to src/main/java/blackjack/domain/card/CardDistributor.java index eb1f70675b..a0eac97788 100644 --- a/src/main/java/domain/card/CardDistributor.java +++ b/src/main/java/blackjack/domain/card/CardDistributor.java @@ -1,4 +1,4 @@ -package domain.card; +package blackjack.domain.card; import java.util.ArrayList; import java.util.Collections; diff --git a/src/main/java/domain/card/Cards.java b/src/main/java/blackjack/domain/card/Cards.java similarity index 97% rename from src/main/java/domain/card/Cards.java rename to src/main/java/blackjack/domain/card/Cards.java index f6e5ee7da1..b340b8df26 100644 --- a/src/main/java/domain/card/Cards.java +++ b/src/main/java/blackjack/domain/card/Cards.java @@ -1,4 +1,4 @@ -package domain.card; +package blackjack.domain.card; import java.util.ArrayList; import java.util.Collections; diff --git a/src/main/java/domain/card/Number.java b/src/main/java/blackjack/domain/card/Number.java similarity index 94% rename from src/main/java/domain/card/Number.java rename to src/main/java/blackjack/domain/card/Number.java index 544f2b62b4..722ac3a201 100644 --- a/src/main/java/domain/card/Number.java +++ b/src/main/java/blackjack/domain/card/Number.java @@ -1,4 +1,4 @@ -package domain.card; +package blackjack.domain.card; public enum Number { diff --git a/src/main/java/domain/card/Suit.java b/src/main/java/blackjack/domain/card/Suit.java similarity index 89% rename from src/main/java/domain/card/Suit.java rename to src/main/java/blackjack/domain/card/Suit.java index f92c0d8ceb..46048d31fa 100644 --- a/src/main/java/domain/card/Suit.java +++ b/src/main/java/blackjack/domain/card/Suit.java @@ -1,4 +1,4 @@ -package domain.card; +package blackjack.domain.card; public enum Suit { diff --git a/src/main/java/domain/game/BlackjackGame.java b/src/main/java/blackjack/domain/game/BlackjackGame.java similarity index 80% rename from src/main/java/domain/game/BlackjackGame.java rename to src/main/java/blackjack/domain/game/BlackjackGame.java index e45afc2b48..dcdf8eadc4 100644 --- a/src/main/java/domain/game/BlackjackGame.java +++ b/src/main/java/blackjack/domain/game/BlackjackGame.java @@ -1,13 +1,13 @@ -package domain.game; - -import domain.card.Card; -import domain.card.CardDistributor; -import domain.card.Cards; -import domain.participant.Dealer; -import domain.participant.Name; -import domain.participant.Participant; -import domain.participant.Participants; -import domain.participant.Player; +package blackjack.domain.game; + +import blackjack.domain.card.Card; +import blackjack.domain.card.CardDistributor; +import blackjack.domain.card.Cards; +import blackjack.domain.participant.Dealer; +import blackjack.domain.participant.Name; +import blackjack.domain.participant.Participant; +import blackjack.domain.participant.Participants; +import blackjack.domain.participant.Player; import java.util.ArrayList; import java.util.List; import java.util.stream.Collectors; diff --git a/src/main/java/domain/game/GameResult.java b/src/main/java/blackjack/domain/game/GameResult.java similarity index 94% rename from src/main/java/domain/game/GameResult.java rename to src/main/java/blackjack/domain/game/GameResult.java index f1eb42edc4..02aebf32e5 100644 --- a/src/main/java/domain/game/GameResult.java +++ b/src/main/java/blackjack/domain/game/GameResult.java @@ -1,7 +1,7 @@ -package domain.game; +package blackjack.domain.game; -import domain.card.Cards; -import domain.participant.Participant; +import blackjack.domain.card.Cards; +import blackjack.domain.participant.Participant; import java.util.ArrayList; import java.util.Collections; import java.util.LinkedHashMap; diff --git a/src/main/java/domain/game/MatchResult.java b/src/main/java/blackjack/domain/game/MatchResult.java similarity index 88% rename from src/main/java/domain/game/MatchResult.java rename to src/main/java/blackjack/domain/game/MatchResult.java index 5ecb34f571..5fbc04eb87 100644 --- a/src/main/java/domain/game/MatchResult.java +++ b/src/main/java/blackjack/domain/game/MatchResult.java @@ -1,4 +1,4 @@ -package domain.game; +package blackjack.domain.game; public enum MatchResult { diff --git a/src/main/java/domain/participant/Command.java b/src/main/java/blackjack/domain/participant/Command.java similarity index 94% rename from src/main/java/domain/participant/Command.java rename to src/main/java/blackjack/domain/participant/Command.java index 6545b5cc72..d0aec91840 100644 --- a/src/main/java/domain/participant/Command.java +++ b/src/main/java/blackjack/domain/participant/Command.java @@ -1,4 +1,4 @@ -package domain.participant; +package blackjack.domain.participant; import java.util.Arrays; diff --git a/src/main/java/domain/participant/Dealer.java b/src/main/java/blackjack/domain/participant/Dealer.java similarity index 86% rename from src/main/java/domain/participant/Dealer.java rename to src/main/java/blackjack/domain/participant/Dealer.java index b8700bc08a..ead3e52141 100644 --- a/src/main/java/domain/participant/Dealer.java +++ b/src/main/java/blackjack/domain/participant/Dealer.java @@ -1,6 +1,6 @@ -package domain.participant; +package blackjack.domain.participant; -import domain.card.Cards; +import blackjack.domain.card.Cards; public class Dealer extends Participant { diff --git a/src/main/java/domain/participant/Name.java b/src/main/java/blackjack/domain/participant/Name.java similarity index 96% rename from src/main/java/domain/participant/Name.java rename to src/main/java/blackjack/domain/participant/Name.java index 82de22bbbb..aeb6d181d0 100644 --- a/src/main/java/domain/participant/Name.java +++ b/src/main/java/blackjack/domain/participant/Name.java @@ -1,4 +1,4 @@ -package domain.participant; +package blackjack.domain.participant; import java.util.Objects; diff --git a/src/main/java/domain/participant/Participant.java b/src/main/java/blackjack/domain/participant/Participant.java similarity index 89% rename from src/main/java/domain/participant/Participant.java rename to src/main/java/blackjack/domain/participant/Participant.java index a454aa8c0e..72c8fe197a 100644 --- a/src/main/java/domain/participant/Participant.java +++ b/src/main/java/blackjack/domain/participant/Participant.java @@ -1,7 +1,7 @@ -package domain.participant; +package blackjack.domain.participant; -import domain.card.Card; -import domain.card.Cards; +import blackjack.domain.card.Card; +import blackjack.domain.card.Cards; import java.util.Objects; public abstract class Participant { diff --git a/src/main/java/domain/participant/Participants.java b/src/main/java/blackjack/domain/participant/Participants.java similarity index 94% rename from src/main/java/domain/participant/Participants.java rename to src/main/java/blackjack/domain/participant/Participants.java index 1b03f8b2d7..69b0498435 100644 --- a/src/main/java/domain/participant/Participants.java +++ b/src/main/java/blackjack/domain/participant/Participants.java @@ -1,6 +1,6 @@ -package domain.participant; +package blackjack.domain.participant; -import domain.card.Card; +import blackjack.domain.card.Card; import java.util.ArrayList; import java.util.List; import java.util.stream.Collectors; diff --git a/src/main/java/domain/participant/Player.java b/src/main/java/blackjack/domain/participant/Player.java similarity index 84% rename from src/main/java/domain/participant/Player.java rename to src/main/java/blackjack/domain/participant/Player.java index 72c5ee1f92..f677ea82a2 100644 --- a/src/main/java/domain/participant/Player.java +++ b/src/main/java/blackjack/domain/participant/Player.java @@ -1,6 +1,6 @@ -package domain.participant; +package blackjack.domain.participant; -import domain.card.Cards; +import blackjack.domain.card.Cards; public class Player extends Participant { diff --git a/src/main/java/game/ConsoleGame.java b/src/main/java/blackjack/game/ConsoleGame.java similarity index 85% rename from src/main/java/game/ConsoleGame.java rename to src/main/java/blackjack/game/ConsoleGame.java index 1c71fe6091..0073ed7519 100644 --- a/src/main/java/game/ConsoleGame.java +++ b/src/main/java/blackjack/game/ConsoleGame.java @@ -1,14 +1,14 @@ -package game; +package blackjack.game; -import domain.game.BlackjackGame; -import domain.game.GameResult; -import domain.participant.Command; -import domain.participant.Name; -import domain.participant.Participant; -import domain.participant.Participants; +import blackjack.domain.game.BlackjackGame; +import blackjack.domain.game.GameResult; +import blackjack.domain.participant.Command; +import blackjack.domain.participant.Name; +import blackjack.domain.participant.Participant; +import blackjack.domain.participant.Participants; import java.util.List; -import view.InputView; -import view.OutputView; +import blackjack.view.InputView; +import blackjack.view.OutputView; public class ConsoleGame { diff --git a/src/main/java/view/InputView.java b/src/main/java/blackjack/view/InputView.java similarity index 93% rename from src/main/java/view/InputView.java rename to src/main/java/blackjack/view/InputView.java index fc83f6b016..f25b383383 100644 --- a/src/main/java/view/InputView.java +++ b/src/main/java/blackjack/view/InputView.java @@ -1,7 +1,7 @@ -package view; +package blackjack.view; -import domain.participant.Command; -import domain.participant.Name; +import blackjack.domain.participant.Command; +import blackjack.domain.participant.Name; import java.util.Arrays; import java.util.List; import java.util.Scanner; diff --git a/src/main/java/view/OutputView.java b/src/main/java/blackjack/view/OutputView.java similarity index 90% rename from src/main/java/view/OutputView.java rename to src/main/java/blackjack/view/OutputView.java index b732cad5d7..5c646f67b7 100644 --- a/src/main/java/view/OutputView.java +++ b/src/main/java/blackjack/view/OutputView.java @@ -1,12 +1,12 @@ -package view; - -import domain.card.Card; -import domain.card.Cards; -import domain.game.BlackjackGame; -import domain.game.GameResult; -import domain.game.MatchResult; -import domain.participant.Dealer; -import domain.participant.Participant; +package blackjack.view; + +import blackjack.domain.card.Card; +import blackjack.domain.card.Cards; +import blackjack.domain.game.BlackjackGame; +import blackjack.domain.game.GameResult; +import blackjack.domain.game.MatchResult; +import blackjack.domain.participant.Dealer; +import blackjack.domain.participant.Participant; import java.util.List; import java.util.Map; import java.util.stream.Collectors; diff --git a/src/main/java/domain/participant/Role.java b/src/main/java/domain/participant/Role.java deleted file mode 100644 index 61adff75d4..0000000000 --- a/src/main/java/domain/participant/Role.java +++ /dev/null @@ -1,4 +0,0 @@ -package domain.participant; - -public interface Role { -} diff --git a/src/test/java/domain/card/CardDistributorTest.java b/src/test/java/blackjack/domain/card/CardDistributorTest.java similarity index 97% rename from src/test/java/domain/card/CardDistributorTest.java rename to src/test/java/blackjack/domain/card/CardDistributorTest.java index c7ca305ef8..b09ef81c5a 100644 --- a/src/test/java/domain/card/CardDistributorTest.java +++ b/src/test/java/blackjack/domain/card/CardDistributorTest.java @@ -1,4 +1,4 @@ -package domain.card; +package blackjack.domain.card; import org.junit.jupiter.api.DisplayName; import org.junit.jupiter.api.Test; diff --git a/src/test/java/domain/card/CardTest.java b/src/test/java/blackjack/domain/card/CardTest.java similarity index 89% rename from src/test/java/domain/card/CardTest.java rename to src/test/java/blackjack/domain/card/CardTest.java index 51969d322a..29642affed 100644 --- a/src/test/java/domain/card/CardTest.java +++ b/src/test/java/blackjack/domain/card/CardTest.java @@ -1,4 +1,4 @@ -package domain.card; +package blackjack.domain.card; import org.junit.jupiter.api.Test; diff --git a/src/test/java/domain/card/CardsTest.java b/src/test/java/blackjack/domain/card/CardsTest.java similarity index 98% rename from src/test/java/domain/card/CardsTest.java rename to src/test/java/blackjack/domain/card/CardsTest.java index d914855763..3c97ee7795 100644 --- a/src/test/java/domain/card/CardsTest.java +++ b/src/test/java/blackjack/domain/card/CardsTest.java @@ -1,4 +1,4 @@ -package domain.card; +package blackjack.domain.card; import org.junit.jupiter.api.DisplayName; import org.junit.jupiter.api.Test; diff --git a/src/test/java/domain/game/BlackjackGameTest.java b/src/test/java/blackjack/domain/game/BlackjackGameTest.java similarity index 89% rename from src/test/java/domain/game/BlackjackGameTest.java rename to src/test/java/blackjack/domain/game/BlackjackGameTest.java index 80570463c7..d531c72fcb 100644 --- a/src/test/java/domain/game/BlackjackGameTest.java +++ b/src/test/java/blackjack/domain/game/BlackjackGameTest.java @@ -1,9 +1,9 @@ -package domain.game; +package blackjack.domain.game; import static org.assertj.core.api.Assertions.assertThat; -import domain.participant.Name; -import domain.participant.Participant; +import blackjack.domain.participant.Name; +import blackjack.domain.participant.Participant; import java.util.Arrays; import java.util.List; import org.junit.jupiter.api.DisplayName; diff --git a/src/test/java/domain/game/GameResultTest.java b/src/test/java/blackjack/domain/game/GameResultTest.java similarity index 92% rename from src/test/java/domain/game/GameResultTest.java rename to src/test/java/blackjack/domain/game/GameResultTest.java index 9dec7fd0e3..c330e5ad81 100644 --- a/src/test/java/domain/game/GameResultTest.java +++ b/src/test/java/blackjack/domain/game/GameResultTest.java @@ -1,13 +1,13 @@ -package domain.game; +package blackjack.domain.game; import static org.assertj.core.api.Assertions.assertThat; import static utils.TestUtil.getCards; -import domain.card.Number; -import domain.participant.Dealer; -import domain.participant.Name; -import domain.participant.Participant; -import domain.participant.Player; +import blackjack.domain.card.Number; +import blackjack.domain.participant.Dealer; +import blackjack.domain.participant.Name; +import blackjack.domain.participant.Participant; +import blackjack.domain.participant.Player; import java.util.Arrays; import java.util.List; import java.util.stream.Stream; diff --git a/src/test/java/domain/participant/DealerTest.java b/src/test/java/blackjack/domain/participant/DealerTest.java similarity index 89% rename from src/test/java/domain/participant/DealerTest.java rename to src/test/java/blackjack/domain/participant/DealerTest.java index 6da7b925a2..a1aec81499 100644 --- a/src/test/java/domain/participant/DealerTest.java +++ b/src/test/java/blackjack/domain/participant/DealerTest.java @@ -1,12 +1,12 @@ -package domain.participant; +package blackjack.domain.participant; import static org.assertj.core.api.Assertions.assertThat; import static utils.TestUtil.getCards; -import domain.card.Card; -import domain.card.Cards; -import domain.card.Number; -import domain.card.Suit; +import blackjack.domain.card.Card; +import blackjack.domain.card.Cards; +import blackjack.domain.card.Number; +import blackjack.domain.card.Suit; import java.util.stream.Stream; import org.junit.jupiter.api.DisplayName; import org.junit.jupiter.api.Test; diff --git a/src/test/java/domain/participant/ParticipantTest.java b/src/test/java/blackjack/domain/participant/ParticipantTest.java similarity index 92% rename from src/test/java/domain/participant/ParticipantTest.java rename to src/test/java/blackjack/domain/participant/ParticipantTest.java index 4d9468e4ff..90a09d2339 100644 --- a/src/test/java/domain/participant/ParticipantTest.java +++ b/src/test/java/blackjack/domain/participant/ParticipantTest.java @@ -1,10 +1,10 @@ -package domain.participant; +package blackjack.domain.participant; import static org.assertj.core.api.Assertions.assertThat; import static utils.TestUtil.getCards; -import domain.card.Cards; -import domain.card.Number; +import blackjack.domain.card.Cards; +import blackjack.domain.card.Number; import java.util.stream.Stream; import org.junit.jupiter.api.DisplayName; import org.junit.jupiter.params.ParameterizedTest; diff --git a/src/test/java/domain/participant/ParticipantsTest.java b/src/test/java/blackjack/domain/participant/ParticipantsTest.java similarity index 95% rename from src/test/java/domain/participant/ParticipantsTest.java rename to src/test/java/blackjack/domain/participant/ParticipantsTest.java index 8c962dd393..a258e772c9 100644 --- a/src/test/java/domain/participant/ParticipantsTest.java +++ b/src/test/java/blackjack/domain/participant/ParticipantsTest.java @@ -1,9 +1,9 @@ -package domain.participant; +package blackjack.domain.participant; import static org.assertj.core.api.Assertions.assertThat; import static utils.TestUtil.getCards; -import domain.card.Number; +import blackjack.domain.card.Number; import java.util.ArrayList; import java.util.Arrays; import java.util.List; diff --git a/src/test/java/domain/participant/PlayerTest.java b/src/test/java/blackjack/domain/participant/PlayerTest.java similarity index 88% rename from src/test/java/domain/participant/PlayerTest.java rename to src/test/java/blackjack/domain/participant/PlayerTest.java index a63c2f2245..e511cc675f 100644 --- a/src/test/java/domain/participant/PlayerTest.java +++ b/src/test/java/blackjack/domain/participant/PlayerTest.java @@ -1,12 +1,12 @@ -package domain.participant; +package blackjack.domain.participant; import static org.assertj.core.api.Assertions.assertThat; import static utils.TestUtil.getCards; -import domain.card.Card; -import domain.card.Cards; -import domain.card.Number; -import domain.card.Suit; +import blackjack.domain.card.Card; +import blackjack.domain.card.Cards; +import blackjack.domain.card.Number; +import blackjack.domain.card.Suit; import java.util.stream.Stream; import org.junit.jupiter.api.DisplayName; import org.junit.jupiter.api.Test; diff --git a/src/test/java/utils/TestUtil.java b/src/test/java/utils/TestUtil.java index 668d1fd883..1526c7ef9d 100644 --- a/src/test/java/utils/TestUtil.java +++ b/src/test/java/utils/TestUtil.java @@ -1,9 +1,9 @@ package utils; -import domain.card.Card; -import domain.card.Cards; -import domain.card.Number; -import domain.card.Suit; +import blackjack.domain.card.Card; +import blackjack.domain.card.Cards; +import blackjack.domain.card.Number; +import blackjack.domain.card.Suit; import java.util.ArrayList; import java.util.List; From 13d6d80d5399e76b59bb99ca625a9c348cf28449 Mon Sep 17 00:00:00 2001 From: yeon-06 Date: Tue, 15 Mar 2022 09:25:31 +0900 Subject: [PATCH 46/54] =?UTF-8?q?refactor:=20=EC=97=90=EB=9F=AC=20?= =?UTF-8?q?=EC=A2=85=EB=A5=98=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/CardDistributor.java | 2 +- .../java/blackjack/domain/card/CardDistributorTest.java | 8 ++++---- 2 files changed, 5 insertions(+), 5 deletions(-) diff --git a/src/main/java/blackjack/domain/card/CardDistributor.java b/src/main/java/blackjack/domain/card/CardDistributor.java index a0eac97788..4b348c3d8c 100644 --- a/src/main/java/blackjack/domain/card/CardDistributor.java +++ b/src/main/java/blackjack/domain/card/CardDistributor.java @@ -27,7 +27,7 @@ public CardDistributor() { public Card distribute() { if (isEmpty()) { - throw new IllegalArgumentException(DECK_IS_EMPTY); + throw new IllegalStateException(DECK_IS_EMPTY); } return deck.pop(); } diff --git a/src/test/java/blackjack/domain/card/CardDistributorTest.java b/src/test/java/blackjack/domain/card/CardDistributorTest.java index b09ef81c5a..821015779a 100644 --- a/src/test/java/blackjack/domain/card/CardDistributorTest.java +++ b/src/test/java/blackjack/domain/card/CardDistributorTest.java @@ -1,11 +1,11 @@ package blackjack.domain.card; -import org.junit.jupiter.api.DisplayName; -import org.junit.jupiter.api.Test; - import static org.assertj.core.api.Assertions.assertThatNoException; import static org.assertj.core.api.Assertions.assertThatThrownBy; +import org.junit.jupiter.api.DisplayName; +import org.junit.jupiter.api.Test; + public class CardDistributorTest { @Test @@ -31,7 +31,7 @@ void failed() { // then assertThatThrownBy(cardDistributor::distribute) - .isInstanceOf(IllegalArgumentException.class) + .isInstanceOf(IllegalStateException.class) .hasMessageContaining("카드가 모두 소요됐습니다."); } } From a8759aa7bf40c734404248d4bf09d66f82c648db Mon Sep 17 00:00:00 2001 From: yeon-06 Date: Tue, 15 Mar 2022 09:26:27 +0900 Subject: [PATCH 47/54] =?UTF-8?q?style:=20Command=20=ED=81=B4=EB=9E=98?= =?UTF-8?q?=EC=8A=A4=20=EC=A0=81=ED=95=A9=ED=95=9C=20=EC=9C=84=EC=B9=98?= =?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/game/ConsoleGame.java | 2 +- .../java/blackjack/{domain/participant => view}/Command.java | 2 +- src/main/java/blackjack/view/InputView.java | 1 - 3 files changed, 2 insertions(+), 3 deletions(-) rename src/main/java/blackjack/{domain/participant => view}/Command.java (94%) diff --git a/src/main/java/blackjack/game/ConsoleGame.java b/src/main/java/blackjack/game/ConsoleGame.java index 0073ed7519..5a63bedd38 100644 --- a/src/main/java/blackjack/game/ConsoleGame.java +++ b/src/main/java/blackjack/game/ConsoleGame.java @@ -2,7 +2,7 @@ import blackjack.domain.game.BlackjackGame; import blackjack.domain.game.GameResult; -import blackjack.domain.participant.Command; +import blackjack.view.Command; import blackjack.domain.participant.Name; import blackjack.domain.participant.Participant; import blackjack.domain.participant.Participants; diff --git a/src/main/java/blackjack/domain/participant/Command.java b/src/main/java/blackjack/view/Command.java similarity index 94% rename from src/main/java/blackjack/domain/participant/Command.java rename to src/main/java/blackjack/view/Command.java index d0aec91840..a3e5772c67 100644 --- a/src/main/java/blackjack/domain/participant/Command.java +++ b/src/main/java/blackjack/view/Command.java @@ -1,4 +1,4 @@ -package blackjack.domain.participant; +package blackjack.view; import java.util.Arrays; diff --git a/src/main/java/blackjack/view/InputView.java b/src/main/java/blackjack/view/InputView.java index f25b383383..e974591c70 100644 --- a/src/main/java/blackjack/view/InputView.java +++ b/src/main/java/blackjack/view/InputView.java @@ -1,6 +1,5 @@ package blackjack.view; -import blackjack.domain.participant.Command; import blackjack.domain.participant.Name; import java.util.Arrays; import java.util.List; From 2e27244e5f741ed3395820793a628821a441be8e Mon Sep 17 00:00:00 2001 From: yeon-06 Date: Tue, 15 Mar 2022 09:40:29 +0900 Subject: [PATCH 48/54] =?UTF-8?q?refactor:=20Participants=EC=97=90?= =?UTF-8?q?=EC=84=9C=20Player=EC=99=80=20Dealer=20=EA=B5=AC=EB=B6=84?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../blackjack/domain/game/BlackjackGame.java | 9 +++-- .../blackjack/domain/game/GameResult.java | 4 +- .../domain/participant/Participants.java | 39 +++++++++---------- src/main/java/blackjack/game/ConsoleGame.java | 23 +++++------ src/main/java/blackjack/view/OutputView.java | 11 +++--- .../domain/game/BlackjackGameTest.java | 2 +- .../blackjack/domain/game/GameResultTest.java | 3 +- .../domain/participant/ParticipantsTest.java | 18 ++++----- 8 files changed, 55 insertions(+), 54 deletions(-) diff --git a/src/main/java/blackjack/domain/game/BlackjackGame.java b/src/main/java/blackjack/domain/game/BlackjackGame.java index dcdf8eadc4..36d320bb00 100644 --- a/src/main/java/blackjack/domain/game/BlackjackGame.java +++ b/src/main/java/blackjack/domain/game/BlackjackGame.java @@ -21,11 +21,12 @@ public class BlackjackGame { private final CardDistributor cardDistributor = new CardDistributor(); public BlackjackGame(List names) { - this.participants = new Participants(initializePlayers(new ArrayList<>(names))); - this.participants.add(new Dealer(new Name(DEALER_NAME), drawInitialCards())); + Dealer dealer = new Dealer(new Name(DEALER_NAME), drawInitialCards()); + List players = initializePlayers(new ArrayList<>(names)); + this.participants = new Participants(players, dealer); } - private List initializePlayers(List names) { + private List initializePlayers(List names) { return names.stream() .map(name -> new Player(name, drawInitialCards())) .collect(Collectors.toUnmodifiableList()); @@ -44,7 +45,7 @@ public void drawCard(Participant participant) { } public GameResult createGameResult() { - return new GameResult(participants.findPlayers(), participants.findDealer()); + return new GameResult(participants.getPlayers(), participants.getDealer()); } public Participants getParticipants() { diff --git a/src/main/java/blackjack/domain/game/GameResult.java b/src/main/java/blackjack/domain/game/GameResult.java index 02aebf32e5..4ea9fbdb25 100644 --- a/src/main/java/blackjack/domain/game/GameResult.java +++ b/src/main/java/blackjack/domain/game/GameResult.java @@ -1,7 +1,9 @@ package blackjack.domain.game; import blackjack.domain.card.Cards; +import blackjack.domain.participant.Dealer; import blackjack.domain.participant.Participant; +import blackjack.domain.participant.Player; import java.util.ArrayList; import java.util.Collections; import java.util.LinkedHashMap; @@ -12,7 +14,7 @@ public class GameResult { private final Map gameResult = new LinkedHashMap<>(); - public GameResult(List players, Participant dealer) { + public GameResult(List players, Dealer dealer) { initialGameResult(new ArrayList<>(players), dealer); } diff --git a/src/main/java/blackjack/domain/participant/Participants.java b/src/main/java/blackjack/domain/participant/Participants.java index 69b0498435..3a958f120f 100644 --- a/src/main/java/blackjack/domain/participant/Participants.java +++ b/src/main/java/blackjack/domain/participant/Participants.java @@ -1,39 +1,36 @@ package blackjack.domain.participant; import blackjack.domain.card.Card; -import java.util.ArrayList; import java.util.List; -import java.util.stream.Collectors; public class Participants { - private static final String NOT_EXIST_DEALER_ERROR = "딜러가 존재하지 않습니다."; - private final List participants = new ArrayList<>(); + private final List players; + private final Dealer dealer; - public Participants(List participants) { - this.participants.addAll(participants); + public Participants(List players, Dealer dealer) { + this.players = players; + this.dealer = dealer; } - public void add(Participant participant) { - this.participants.add(participant); + public void drawCard(Participant participant, Card card) { + if (participant.getClass() == Player.class) { + findPlayer((Player) participant).drawCard(card); + return; + } + dealer.drawCard(card); } - public List findPlayers() { - return participants.stream() - .filter(participant -> participant.isSameClass(Player.class)) - .collect(Collectors.toUnmodifiableList()); + public Player findPlayer(Player player) { + int index = players.indexOf(player); + return players.get(index); } - public Participant findDealer() { - return participants.stream() - .filter(participant -> participant.isSameClass(Dealer.class)) - .findFirst() - .orElseThrow(() -> new IllegalArgumentException(NOT_EXIST_DEALER_ERROR)); + public List getPlayers() { + return players; } - public void drawCard(Participant participant, Card card) { - int index = participants.indexOf(participant); - Participant nowParticipant = participants.get(index); - nowParticipant.drawCard(card); + public Dealer getDealer() { + return dealer; } } diff --git a/src/main/java/blackjack/game/ConsoleGame.java b/src/main/java/blackjack/game/ConsoleGame.java index 5a63bedd38..18f1ea1376 100644 --- a/src/main/java/blackjack/game/ConsoleGame.java +++ b/src/main/java/blackjack/game/ConsoleGame.java @@ -2,13 +2,15 @@ import blackjack.domain.game.BlackjackGame; import blackjack.domain.game.GameResult; -import blackjack.view.Command; +import blackjack.domain.participant.Dealer; import blackjack.domain.participant.Name; import blackjack.domain.participant.Participant; import blackjack.domain.participant.Participants; -import java.util.List; +import blackjack.domain.participant.Player; +import blackjack.view.Command; import blackjack.view.InputView; import blackjack.view.OutputView; +import java.util.List; public class ConsoleGame { @@ -16,10 +18,10 @@ public void run() { BlackjackGame blackjackGame = createBlackjackGame(); Participants participants = blackjackGame.getParticipants(); - Participant dealer = participants.findDealer(); - List players = participants.findPlayers(); + Dealer dealer = participants.getDealer(); + List players = participants.getPlayers(); - OutputView.printInitialCards(participants.findDealer(), participants.findPlayers()); + OutputView.printInitialCards(dealer, players); playPlayersTurn(blackjackGame, players); playDealerTurn(blackjackGame, dealer); @@ -37,13 +39,13 @@ private BlackjackGame createBlackjackGame() { } } - private void playPlayersTurn(BlackjackGame blackjackGame, List players) { - for (Participant player : players) { + private void playPlayersTurn(BlackjackGame blackjackGame, List players) { + for (Player player : players) { playPlayerTurn(blackjackGame, player); } } - private void playPlayerTurn(BlackjackGame blackjackGame, Participant player) { + private void playPlayerTurn(BlackjackGame blackjackGame, Player player) { while (!player.isFinished() && !inputCommand(player).isStay()) { blackjackGame.drawCard(player); OutputView.printCards(player); @@ -60,17 +62,16 @@ private Command inputCommand(Participant player) { } } - private void playDealerTurn(BlackjackGame blackjackGame, Participant dealer) { + private void playDealerTurn(BlackjackGame blackjackGame, Dealer dealer) { while (!dealer.isFinished()) { OutputView.printDealerDrawInfo(); blackjackGame.drawCard(dealer); } } - private void showGameResult(BlackjackGame blackjackGame, Participant dealer, List players) { + private void showGameResult(BlackjackGame blackjackGame, Dealer dealer, List players) { GameResult gameResult = blackjackGame.createGameResult(); OutputView.printCardsResult(dealer, players); OutputView.printGameResult(gameResult); } - } diff --git a/src/main/java/blackjack/view/OutputView.java b/src/main/java/blackjack/view/OutputView.java index 5c646f67b7..d47c5c5f65 100644 --- a/src/main/java/blackjack/view/OutputView.java +++ b/src/main/java/blackjack/view/OutputView.java @@ -7,6 +7,7 @@ import blackjack.domain.game.MatchResult; import blackjack.domain.participant.Dealer; import blackjack.domain.participant.Participant; +import blackjack.domain.participant.Player; import java.util.List; import java.util.Map; import java.util.stream.Collectors; @@ -20,16 +21,16 @@ private OutputView() { } - public static void printInitialCards(Participant dealer, List players) { + public static void printInitialCards(Dealer dealer, List players) { System.out.printf("%n%s와 %s에게 2장의 카드를 나누었습니다.%n", dealer.getName(), getPlayerNames(players)); System.out.printf("%s: %s%n", dealer.getName(), getCardName(dealer.getCards().getValue().get(0))); - for (Participant player : players) { + for (Player player : players) { printCards(player); } System.out.println(); } - private static String getPlayerNames(List players) { + private static String getPlayerNames(List players) { return players.stream() .map(Participant::getName) .collect(Collectors.joining(JOIN_DELIMITER)); @@ -53,10 +54,10 @@ public static void printDealerDrawInfo() { System.out.printf("%n딜러는 %d이하라 한장의 카드를 더 받았습니다.%n", Dealer.DRAW_STANDARD); } - public static void printCardsResult(Participant dealer, List players) { + public static void printCardsResult(Dealer dealer, List players) { System.out.println(); printCardResult(dealer); - for (Participant player : players) { + for (Player player : players) { printCardResult(player); } } diff --git a/src/test/java/blackjack/domain/game/BlackjackGameTest.java b/src/test/java/blackjack/domain/game/BlackjackGameTest.java index d531c72fcb..014e66b001 100644 --- a/src/test/java/blackjack/domain/game/BlackjackGameTest.java +++ b/src/test/java/blackjack/domain/game/BlackjackGameTest.java @@ -20,7 +20,7 @@ void create() { // when boolean match = blackjackGame .getParticipants() - .findPlayers() + .getPlayers() .stream() .mapToInt(this::calculateCardsSize) .anyMatch(cardSize -> cardSize != 2); diff --git a/src/test/java/blackjack/domain/game/GameResultTest.java b/src/test/java/blackjack/domain/game/GameResultTest.java index c330e5ad81..d730436c66 100644 --- a/src/test/java/blackjack/domain/game/GameResultTest.java +++ b/src/test/java/blackjack/domain/game/GameResultTest.java @@ -6,7 +6,6 @@ import blackjack.domain.card.Number; import blackjack.domain.participant.Dealer; import blackjack.domain.participant.Name; -import blackjack.domain.participant.Participant; import blackjack.domain.participant.Player; import java.util.Arrays; import java.util.List; @@ -44,7 +43,7 @@ private static Stream provideParameters() { @DisplayName("딜러가 승리한 횟수") void dealer_count_test(Player player1, Player player2, Dealer dealer, MatchResult result, int expect) { // given - List players = Arrays.asList(player1, player2); + List players = Arrays.asList(player1, player2); GameResult gameResult = new GameResult(players, dealer); // then diff --git a/src/test/java/blackjack/domain/participant/ParticipantsTest.java b/src/test/java/blackjack/domain/participant/ParticipantsTest.java index a258e772c9..5e59e09fe4 100644 --- a/src/test/java/blackjack/domain/participant/ParticipantsTest.java +++ b/src/test/java/blackjack/domain/participant/ParticipantsTest.java @@ -19,29 +19,29 @@ class ParticipantsTest { void init() { names = Arrays.asList(new Name("pobi"), new Name("jason")); - participants = new Participants(toPlayerList(names)); - participants.add(new Dealer(new Name("딜러"), getCards(Number.SEVEN, Number.QUEEN))); + participants = new Participants(toPlayerList(names), + new Dealer(new Name("딜러"), getCards(Number.SEVEN, Number.QUEEN))); } @Test @DisplayName("플레이어들 가져오기") void find_players() { // given - List expectPlayers = toPlayerList(names); + List expectPlayers = toPlayerList(names); // when - List playerNames = participants.findPlayers(); + List playerNames = participants.getPlayers(); // then assertThat(playerNames).containsAll(expectPlayers); } - private List toPlayerList(List names) { - List participantsList = new ArrayList<>(); + private List toPlayerList(List names) { + List playerList = new ArrayList<>(); for (Name name : names) { - participantsList.add(new Player(name, getCards(Number.SEVEN, Number.QUEEN))); + playerList.add(new Player(name, getCards(Number.SEVEN, Number.QUEEN))); } - return participantsList; + return playerList; } @Test @@ -49,7 +49,7 @@ private List toPlayerList(List names) { void find_dealer() { // then assertThat(participants - .findDealer()) + .getDealer()) .isInstanceOf(Dealer.class); } } \ No newline at end of file From 50fc6e6972aa5000dd3ac3ccc2ce26881a464fc9 Mon Sep 17 00:00:00 2001 From: yeon-06 Date: Tue, 15 Mar 2022 09:46:53 +0900 Subject: [PATCH 49/54] =?UTF-8?q?refactor:=20=EC=B0=B8=EA=B0=80=EC=9E=90?= =?UTF-8?q?=EC=9D=98=20=EC=9D=B8=EC=9B=90=20=EC=A0=9C=ED=95=9C?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../blackjack/domain/participant/Participants.java | 14 ++++++++++++-- 1 file changed, 12 insertions(+), 2 deletions(-) diff --git a/src/main/java/blackjack/domain/participant/Participants.java b/src/main/java/blackjack/domain/participant/Participants.java index 3a958f120f..7aaf536e56 100644 --- a/src/main/java/blackjack/domain/participant/Participants.java +++ b/src/main/java/blackjack/domain/participant/Participants.java @@ -1,16 +1,26 @@ package blackjack.domain.participant; import blackjack.domain.card.Card; +import java.util.Collections; import java.util.List; public class Participants { + private static final int MAX_PLAYER_COUNT = 8; + private static final String ERROR_OVER_PLAYER_COUNT = String.format("게임에 참여하는 최대 인원은 %d명 입니다.", MAX_PLAYER_COUNT); private final List players; private final Dealer dealer; - public Participants(List players, Dealer dealer) { - this.players = players; + public Participants(final List players, final Dealer dealer) { + this.players = Collections.unmodifiableList(players); this.dealer = dealer; + validatePlayers(players); + } + + private void validatePlayers(List players) { + if (players.size() > MAX_PLAYER_COUNT) { + throw new IllegalArgumentException(ERROR_OVER_PLAYER_COUNT); + } } public void drawCard(Participant participant, Card card) { From a24d9ed0fff3c6edf69a27d938bdbc2cef76e526 Mon Sep 17 00:00:00 2001 From: yeon-06 Date: Tue, 15 Mar 2022 09:49:36 +0900 Subject: [PATCH 50/54] =?UTF-8?q?refactor:=20Player=EC=99=80=20Dealer=20?= =?UTF-8?q?=EA=B5=AC=EB=B6=84?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../java/blackjack/domain/game/GameResult.java | 15 +++++++-------- src/main/java/blackjack/view/OutputView.java | 4 ++-- 2 files changed, 9 insertions(+), 10 deletions(-) diff --git a/src/main/java/blackjack/domain/game/GameResult.java b/src/main/java/blackjack/domain/game/GameResult.java index 4ea9fbdb25..e73a91096f 100644 --- a/src/main/java/blackjack/domain/game/GameResult.java +++ b/src/main/java/blackjack/domain/game/GameResult.java @@ -2,7 +2,6 @@ import blackjack.domain.card.Cards; import blackjack.domain.participant.Dealer; -import blackjack.domain.participant.Participant; import blackjack.domain.participant.Player; import java.util.ArrayList; import java.util.Collections; @@ -12,19 +11,19 @@ public class GameResult { - private final Map gameResult = new LinkedHashMap<>(); + private final Map gameResult = new LinkedHashMap<>(); public GameResult(List players, Dealer dealer) { - initialGameResult(new ArrayList<>(players), dealer); + initGameResult(new ArrayList<>(players), dealer); } - private void initialGameResult(List players, Participant dealer) { - for (Participant player : players) { + private void initGameResult(List players, Dealer dealer) { + for (Player player : players) { gameResult.put(player, playResult(player, dealer)); } } - private MatchResult playResult(Participant player, Participant dealer) { + private MatchResult playResult(Player player, Dealer dealer) { Cards playerCards = player.getCards(); Cards dealerCards = dealer.getCards(); @@ -43,7 +42,7 @@ private boolean isFirstCardsLose(Cards cards1, Cards cards2) { return cards1.isBust() || (!cards2.isBust() && cards1.sum() < cards2.sum()); } - public MatchResult getMatchResult(Participant player) { + public MatchResult getMatchResult(Player player) { return gameResult.get(player); } @@ -62,7 +61,7 @@ private long getMatchResultCount(MatchResult matchResult) { .count(); } - public Map getGameResult() { + public Map getGameResult() { return Collections.unmodifiableMap(gameResult); } diff --git a/src/main/java/blackjack/view/OutputView.java b/src/main/java/blackjack/view/OutputView.java index d47c5c5f65..2343ed9696 100644 --- a/src/main/java/blackjack/view/OutputView.java +++ b/src/main/java/blackjack/view/OutputView.java @@ -68,7 +68,7 @@ private static void printCardResult(Participant participant) { } public static void printGameResult(GameResult gameResult) { - Map map = gameResult.getGameResult(); + Map map = gameResult.getGameResult(); System.out.printf("%n%s: %d승 %d무 %d패%n" , BlackjackGame.DEALER_NAME @@ -77,7 +77,7 @@ public static void printGameResult(GameResult gameResult) { , gameResult.calculateDealerMatchResultCount(MatchResult.LOSE) ); - for (Participant player : map.keySet()) { + for (Player player : map.keySet()) { System.out.printf("%s: %s%n", player.getName(), gameResult.getMatchResult(player).getValue()); } } From 66dc29c8a046be4f7a058d69bcecd257ec5cdee5 Mon Sep 17 00:00:00 2001 From: yeon-06 Date: Tue, 15 Mar 2022 12:06:31 +0900 Subject: [PATCH 51/54] =?UTF-8?q?refactor:=20=EB=B6=88=ED=95=84=EC=9A=94?= =?UTF-8?q?=ED=95=9C=20=EB=A9=94=EC=86=8C=EB=93=9C=20=EC=82=AD=EC=A0=9C?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../domain/participant/Participant.java | 4 -- .../domain/participant/ParticipantTest.java | 38 ------------------- 2 files changed, 42 deletions(-) delete mode 100644 src/test/java/blackjack/domain/participant/ParticipantTest.java diff --git a/src/main/java/blackjack/domain/participant/Participant.java b/src/main/java/blackjack/domain/participant/Participant.java index 72c8fe197a..213c224e4d 100644 --- a/src/main/java/blackjack/domain/participant/Participant.java +++ b/src/main/java/blackjack/domain/participant/Participant.java @@ -28,10 +28,6 @@ public Cards getCards() { return cards; } - public boolean isSameClass(Class classType) { - return getClass() == classType; - } - @Override public boolean equals(Object o) { if (this == o) { diff --git a/src/test/java/blackjack/domain/participant/ParticipantTest.java b/src/test/java/blackjack/domain/participant/ParticipantTest.java deleted file mode 100644 index 90a09d2339..0000000000 --- a/src/test/java/blackjack/domain/participant/ParticipantTest.java +++ /dev/null @@ -1,38 +0,0 @@ -package blackjack.domain.participant; - -import static org.assertj.core.api.Assertions.assertThat; -import static utils.TestUtil.getCards; - -import blackjack.domain.card.Cards; -import blackjack.domain.card.Number; -import java.util.stream.Stream; -import org.junit.jupiter.api.DisplayName; -import org.junit.jupiter.params.ParameterizedTest; -import org.junit.jupiter.params.provider.Arguments; -import org.junit.jupiter.params.provider.MethodSource; - -class ParticipantTest { - - @ParameterizedTest - @MethodSource("provideParameters") - @DisplayName("클래스 동일 여부 확인") - void isSameClass(Participant participant, Class className, boolean expect) { - // when - boolean result = participant.isSameClass(className); - - // then - assertThat(result).isEqualTo(expect); - } - - private static Stream provideParameters() { - Cards cards = getCards(Number.TWO, Number.QUEEN, Number.KING); - return Stream.of( - Arguments.arguments(new Player(new Name("yeonLog"), cards), Participant.class, false), - Arguments.arguments(new Player(new Name("yeonLog"), cards), Player.class, true), - Arguments.arguments(new Player(new Name("yeonLog"), cards), Dealer.class, false), - Arguments.arguments(new Dealer(new Name("yeonLog"), cards), Participant.class, false), - Arguments.arguments(new Dealer(new Name("yeonLog"), cards), Player.class, false), - Arguments.arguments(new Dealer(new Name("yeonLog"), cards), Dealer.class, true) - ); - } -} \ No newline at end of file From 760f5434c79c8eea926f2979466eda51ca3b6740 Mon Sep 17 00:00:00 2001 From: yeon-06 Date: Tue, 15 Mar 2022 14:20:21 +0900 Subject: [PATCH 52/54] =?UTF-8?q?refactor:=20=EC=B9=B4=EB=93=9C=EC=9D=98?= =?UTF-8?q?=20=ED=98=84=EC=9E=AC=20=EC=83=81=ED=83=9C(Status)=20=EB=8F=84?= =?UTF-8?q?=EC=9E=85?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../java/blackjack/domain/card/Cards.java | 11 +++++---- .../java/blackjack/domain/card/Status.java | 24 +++++++++++++++++++ .../blackjack/domain/game/GameResult.java | 24 ++++++++++++++----- .../blackjack/domain/participant/Dealer.java | 2 +- .../blackjack/domain/participant/Player.java | 3 ++- .../blackjack/domain/game/GameResultTest.java | 5 +++- 6 files changed, 55 insertions(+), 14 deletions(-) create mode 100644 src/main/java/blackjack/domain/card/Status.java diff --git a/src/main/java/blackjack/domain/card/Cards.java b/src/main/java/blackjack/domain/card/Cards.java index b340b8df26..2e4d4eaa62 100644 --- a/src/main/java/blackjack/domain/card/Cards.java +++ b/src/main/java/blackjack/domain/card/Cards.java @@ -7,7 +7,8 @@ public class Cards { private static final int ACE_ADDITIONAL_VALUE = 10; - private static final int BLACKJACK_VALUE = 21; + protected static final int BLACKJACK_VALUE = 21; + protected static final int BLACKJACK_COUNT = 2; private final List value; @@ -19,12 +20,12 @@ public void add(Card card) { this.value.add(card); } - public boolean isBust() { - return sum() > BLACKJACK_VALUE; + public Status getStatus() { + return Status.findStatus(this); } - public boolean isBlackjack() { - return sum() == BLACKJACK_VALUE; + public int getCount() { + return value.size(); } public int sum() { diff --git a/src/main/java/blackjack/domain/card/Status.java b/src/main/java/blackjack/domain/card/Status.java new file mode 100644 index 0000000000..a92cb3e4c7 --- /dev/null +++ b/src/main/java/blackjack/domain/card/Status.java @@ -0,0 +1,24 @@ +package blackjack.domain.card; + +import java.util.Arrays; +import java.util.function.Predicate; + +public enum Status { + BLACKJACK((cards) -> cards.getCount() == Cards.BLACKJACK_COUNT && cards.sum() == Cards.BLACKJACK_VALUE), + BUST((cards) -> cards.sum() > Cards.BLACKJACK_VALUE), + NONE((cards) -> cards.sum() < Cards.BLACKJACK_VALUE + || (cards.sum() == Cards.BLACKJACK_VALUE && cards.getCount() != Cards.BLACKJACK_COUNT)); + + private final Predicate condition; + + Status(Predicate condition) { + this.condition = condition; + } + + public static Status findStatus(Cards cards) { + return Arrays.stream(Status.values()) + .filter(status -> status.condition.test(cards)) + .findAny() + .orElseThrow(() -> new IllegalArgumentException("유효하지 않은 cards 입니다.")); + } +} diff --git a/src/main/java/blackjack/domain/game/GameResult.java b/src/main/java/blackjack/domain/game/GameResult.java index e73a91096f..7d1e1bcbdf 100644 --- a/src/main/java/blackjack/domain/game/GameResult.java +++ b/src/main/java/blackjack/domain/game/GameResult.java @@ -1,6 +1,7 @@ package blackjack.domain.game; import blackjack.domain.card.Cards; +import blackjack.domain.card.Status; import blackjack.domain.participant.Dealer; import blackjack.domain.participant.Player; import java.util.ArrayList; @@ -27,19 +28,30 @@ private MatchResult playResult(Player player, Dealer dealer) { Cards playerCards = player.getCards(); Cards dealerCards = dealer.getCards(); - if (isFirstCardsLose(playerCards, dealerCards)) { - return MatchResult.LOSE; + if (compareCards(playerCards, dealerCards)) { + return MatchResult.WIN; } - if (isFirstCardsLose(dealerCards, playerCards)) { - return MatchResult.WIN; + if (compareCards(dealerCards, playerCards)) { + return MatchResult.LOSE; } return MatchResult.PUSH; } - private boolean isFirstCardsLose(Cards cards1, Cards cards2) { - return cards1.isBust() || (!cards2.isBust() && cards1.sum() < cards2.sum()); + /** + * 파라미터로 주어진 카드 목록 두 개를 비교하고, 첫 번째 카드 목록이 승리할 경우 true 반환. + * + * @param cards1 - 카드 목록, cards2 - cards1과 비교할 카드 목록 + * @return cards1이 승리 조건에 부합하면 true + */ + private boolean compareCards(Cards cards1, Cards cards2) { + Status status1 = cards1.getStatus(); + Status status2 = cards2.getStatus(); + + return (status1 == Status.BLACKJACK && status2 != Status.BLACKJACK) + || (status1 != Status.BUST && status2 == Status.BUST) + || (status1 == Status.NONE && status2 == Status.NONE && cards1.sum() > cards2.sum()); } public MatchResult getMatchResult(Player player) { diff --git a/src/main/java/blackjack/domain/participant/Dealer.java b/src/main/java/blackjack/domain/participant/Dealer.java index ead3e52141..aa04b118d7 100644 --- a/src/main/java/blackjack/domain/participant/Dealer.java +++ b/src/main/java/blackjack/domain/participant/Dealer.java @@ -12,7 +12,7 @@ public Dealer(Name name, Cards cards) { @Override public boolean isFinished() { - return cards.isBust() || cards.sum() > DRAW_STANDARD || cards.isBlackjack(); + return cards.sum() > DRAW_STANDARD; } @Override diff --git a/src/main/java/blackjack/domain/participant/Player.java b/src/main/java/blackjack/domain/participant/Player.java index f677ea82a2..0c1701b61e 100644 --- a/src/main/java/blackjack/domain/participant/Player.java +++ b/src/main/java/blackjack/domain/participant/Player.java @@ -1,6 +1,7 @@ package blackjack.domain.participant; import blackjack.domain.card.Cards; +import blackjack.domain.card.Status; public class Player extends Participant { @@ -10,7 +11,7 @@ public Player(Name name, Cards cards) { @Override public boolean isFinished() { - return cards.isBust() || cards.isBlackjack(); + return cards.getStatus() != Status.NONE; } @Override diff --git a/src/test/java/blackjack/domain/game/GameResultTest.java b/src/test/java/blackjack/domain/game/GameResultTest.java index d730436c66..740b771e61 100644 --- a/src/test/java/blackjack/domain/game/GameResultTest.java +++ b/src/test/java/blackjack/domain/game/GameResultTest.java @@ -34,7 +34,10 @@ private static Stream provideParameters() { new Dealer(new Name("딜러"), getCards(Number.QUEEN, Number.KING, Number.JACK))), Arguments.arguments("둘 다 버스트가 아니고 딜러보다 숫자가 높은 경우", new Player(new Name("abc"), getCards(Number.KING, Number.QUEEN)), - new Dealer(new Name("딜러"), getCards(Number.QUEEN, Number.NINE))) + new Dealer(new Name("딜러"), getCards(Number.QUEEN, Number.NINE))), + Arguments.arguments("플레이어만 블랙잭", + new Player(new Name("abc"), getCards(Number.KING, Number.ACE)), + new Dealer(new Name("딜러"), getCards(Number.QUEEN, Number.TEN, Number.ACE))) ); } From 64be231e79e497665343aab1df2d2bd1d0e01c08 Mon Sep 17 00:00:00 2001 From: yeon-06 Date: Tue, 15 Mar 2022 14:33:44 +0900 Subject: [PATCH 53/54] =?UTF-8?q?refactor:=20=EA=B0=92=20=EB=B9=84?= =?UTF-8?q?=EA=B5=90=EB=A5=BC=20=EB=8F=84=EB=A9=94=EC=9D=B8=20=EB=82=B4?= =?UTF-8?q?=EC=97=90=EC=84=9C=20=EC=A7=84=ED=96=89=ED=95=98=EB=8F=84?= =?UTF-8?q?=EB=A1=9D=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/Number.java | 4 ++++ 2 files changed, 5 insertions(+), 1 deletion(-) diff --git a/src/main/java/blackjack/domain/card/Card.java b/src/main/java/blackjack/domain/card/Card.java index 6df4fd69cc..b1ae327545 100644 --- a/src/main/java/blackjack/domain/card/Card.java +++ b/src/main/java/blackjack/domain/card/Card.java @@ -25,7 +25,7 @@ public int toInt() { } public boolean isAce() { - return this.number == Number.ACE; + return number.isAce(); } @Override diff --git a/src/main/java/blackjack/domain/card/Number.java b/src/main/java/blackjack/domain/card/Number.java index 722ac3a201..5a58ccf536 100644 --- a/src/main/java/blackjack/domain/card/Number.java +++ b/src/main/java/blackjack/domain/card/Number.java @@ -24,6 +24,10 @@ public enum Number { this.name = name; } + public boolean isAce() { + return this == ACE; + } + public int getValue() { return value; } From b95466ef02fc7b90ec1b61ade7e123f7e68627b2 Mon Sep 17 00:00:00 2001 From: yeon-06 Date: Tue, 15 Mar 2022 14:40:58 +0900 Subject: [PATCH 54/54] =?UTF-8?q?docs:=20=EA=B5=AC=ED=98=84=20=EA=B8=B0?= =?UTF-8?q?=EB=8A=A5=20=EB=AA=A9=EB=A1=9D=20=EC=84=A4=EB=AA=85=20=EC=B6=94?= =?UTF-8?q?=EA=B0=80?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- README.md | 10 ++++++---- 1 file changed, 6 insertions(+), 4 deletions(-) diff --git a/README.md b/README.md index 05f95eafc2..c2122fd785 100644 --- a/README.md +++ b/README.md @@ -7,12 +7,13 @@ - 스테이: 카드를 그만 받겠다 - 힛: 카드를 한장 더 받겠다 -## 구현할 기능 목록 +## 구현 기능 목록 - [x] 참여할 사람의 이름 입력 - 쉼표 기준으로 분리 - (e) 빈 값, 공백 불가 - (e) 중복 불가 + - (e) 참가 인원은 최대 8명 - [x] 카드 분배 - 딜러, 참가자에게 카드 2장씩 분배 - 딜러의 카드 1장 출력 @@ -29,11 +30,12 @@ - 16 이하면 1장 추가 분배 - 17 이상이면 턴 종료 - [x] 결과 출력 - - 카드 목록 및 총합 출력 (ex: 딜러 카드: 3다이아몬드, 9클로버, 8다이아몬드 - 결과: 20) + - 카드 목록 및 총합 출력 + (ex: 딜러 카드: 3다이아몬드, 9클로버, 8다이아몬드 - 결과: 20) - 최종 승패 계산 - 최종 승패 출력 - - 딜러 n승 n패 출력 - - 참가자 승/패 결과만 출력 + - 딜러 %d승 %d무 %d패 출력 + - 참가자 승/무/패 결과 출력 ## 기능 요구 사항