From 1680d8eaa1d14f365518ded3a39e3f7d1a5397a3 Mon Sep 17 00:00:00 2001 From: HyungUk Ryu Date: Tue, 5 Mar 2024 16:30:47 +0900 Subject: [PATCH 01/59] =?UTF-8?q?docs(README):=20=EA=B8=B0=EB=8A=A5=20?= =?UTF-8?q?=EC=9A=94=EA=B5=AC=EC=82=AC=ED=95=AD=20=EB=AA=85=EC=84=B8=20?= =?UTF-8?q?=EC=B6=94=EA=B0=80?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Co-authored-by: haiseong --- .gitmessage.txt | 4 ++++ docs/README.md | 32 ++++++++++++++++++++++++++++++++ 2 files changed, 36 insertions(+) create mode 100644 .gitmessage.txt create mode 100644 docs/README.md diff --git a/.gitmessage.txt b/.gitmessage.txt new file mode 100644 index 00000000000..d389cb1c637 --- /dev/null +++ b/.gitmessage.txt @@ -0,0 +1,4 @@ + + + +Co-authored-by: haiseong \ No newline at end of file diff --git a/docs/README.md b/docs/README.md new file mode 100644 index 00000000000..74bc119cd56 --- /dev/null +++ b/docs/README.md @@ -0,0 +1,32 @@ +## 기능 요구사항 정리 + +### 카드 +- 카드는 4가지(스페이드, 클로버, 하트, 다이아몬드) 문양중 하나를 가진다. +- 카드는 2~9의 숫자 또는 'A', 'J', 'Q', 'K'의 문자를 가진다. + +### 덱 +- 자신이 가지고 있는 카드 중 한 장을 플레이어에게 제공할 수 있다. + +### 플레이어가 받은 카드 +- 플레이어가 받은 한 장의 카드를 추가할 수 있다. +- 숫자 카드는 해당 숫자만큼의 점수로 계산된다. +- A 카드는 1 또는 11 중 하나를 선택하여 계산할 수 있다. +- J, Q, K 카드는 모두 10으로 계산된다. +- 받은 카드의 총 점수를 계산할 수 있다. + +### 플레이어 +- 덱으로 부터 카드 한장을 받아올 수 있다. +- 자신의 점수를 계산할 수 있다. +- 자신의 버스트 여부를 판단할 수 있다. + +### 딜러 +- 덱으로 부터 카드 한장을 받아올 수 있다. +- 자신의 점수를 계산할 수 있다. +- 자신의 버스트 여부를 판단할 수 있다. +- 자신의 현재 점수가 17점 이상이 될 때까지 추가로 카드를 받는다. + +### 블랙잭 게임 +- 플레이어들의 승리/패배/무승부 여부를 계산할 수 있다. +- 특정 플레이어에게 카드를 줄 수 있다. +- 딜러가 17점 이상이 되도록 카드를 받게 할 수 있다. +- 특정 플레이어의 버스트 여부를 판단할 수 있다. From 0605ed31c1a202ac21a433adbe5438be89dcf56b Mon Sep 17 00:00:00 2001 From: HyungUk Ryu Date: Tue, 5 Mar 2024 17:14:59 +0900 Subject: [PATCH 02/59] =?UTF-8?q?test(deckTest):=20=EB=8D=B1=EC=97=90?= =?UTF-8?q?=EC=84=9C=20=EC=B9=B4=EB=93=9C=20=ED=95=9C=20=EC=9E=A5=EC=9D=84?= =?UTF-8?q?=20=EB=BD=91=EB=8A=94=20=EA=B8=B0=EB=8A=A5=EC=9D=98=20=ED=85=8C?= =?UTF-8?q?=EC=8A=A4=ED=8A=B8=20=EC=BD=94=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 Co-authored-by: haiseong --- src/test/java/blackjack/domain/DeckTest.java | 27 ++++++++++++++++++++ 1 file changed, 27 insertions(+) create mode 100644 src/test/java/blackjack/domain/DeckTest.java diff --git a/src/test/java/blackjack/domain/DeckTest.java b/src/test/java/blackjack/domain/DeckTest.java new file mode 100644 index 00000000000..4222423c5f8 --- /dev/null +++ b/src/test/java/blackjack/domain/DeckTest.java @@ -0,0 +1,27 @@ +package blackjack.domain; + + +import static org.assertj.core.api.Assertions.assertThat; + +import blackjack.domain.card.Shape; +import blackjack.domain.card.Value; +import java.util.ArrayList; +import java.util.List; +import org.junit.jupiter.api.DisplayName; +import org.junit.jupiter.api.Test; + +class DeckTest { + @Test + @DisplayName("자신이 가지고 있는 카드 중 한 장을 플레이어에게 제공할 수 있다.") + void draw() { + List cards = new ArrayList<>(List.of( + new Card(Shape.SPADE, Value.ACE), + new Card(Shape.CLOVER, Value.FOUR), + new Card(Shape.HEART, Value.KING) + )); + Deck deck = Deck.from(cards); + + Card expected = new Card(Shape.SPADE, Value.ACE); + assertThat(deck.draw()).isEqualTo(expected); + } +} From c71ef549f9fc2ca8de8f4f5cd254107b77d7ccd9 Mon Sep 17 00:00:00 2001 From: HyungUk Ryu Date: Tue, 5 Mar 2024 17:24:13 +0900 Subject: [PATCH 03/59] =?UTF-8?q?feat(deck,=20card):=20=EB=8D=B1=EC=97=90?= =?UTF-8?q?=EC=84=9C=20=EC=B9=B4=EB=93=9C=ED=95=9C=EC=9E=A5=EC=9D=84=20?= =?UTF-8?q?=EB=BD=91=EB=8A=94=20=EA=B8=B0=EB=8A=A5=20=EA=B5=AC=ED=98=84?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Co-authored-by: haiseong --- docs/README.md | 6 ++--- src/main/java/blackjack/domain/Deck.java | 21 +++++++++++++++++ src/main/java/blackjack/domain/card/Card.java | 4 ++++ .../java/blackjack/domain/card/Shape.java | 5 ++++ .../java/blackjack/domain/card/Value.java | 23 +++++++++++++++++++ src/test/java/blackjack/domain/DeckTest.java | 1 + 6 files changed, 57 insertions(+), 3 deletions(-) create mode 100644 src/main/java/blackjack/domain/Deck.java create mode 100644 src/main/java/blackjack/domain/card/Card.java create mode 100644 src/main/java/blackjack/domain/card/Shape.java create mode 100644 src/main/java/blackjack/domain/card/Value.java diff --git a/docs/README.md b/docs/README.md index 74bc119cd56..7dfae056c95 100644 --- a/docs/README.md +++ b/docs/README.md @@ -1,11 +1,11 @@ ## 기능 요구사항 정리 ### 카드 -- 카드는 4가지(스페이드, 클로버, 하트, 다이아몬드) 문양중 하나를 가진다. -- 카드는 2~9의 숫자 또는 'A', 'J', 'Q', 'K'의 문자를 가진다. +- [x] 카드는 4가지(스페이드, 클로버, 하트, 다이아몬드) 문양중 하나를 가진다. +- [x] 카드는 2~9의 숫자 또는 'A', 'J', 'Q', 'K'의 문자를 가진다. ### 덱 -- 자신이 가지고 있는 카드 중 한 장을 플레이어에게 제공할 수 있다. +- [x] 자신이 가지고 있는 카드 중 한 장을 플레이어에게 제공할 수 있다. ### 플레이어가 받은 카드 - 플레이어가 받은 한 장의 카드를 추가할 수 있다. diff --git a/src/main/java/blackjack/domain/Deck.java b/src/main/java/blackjack/domain/Deck.java new file mode 100644 index 00000000000..4c7f93954ee --- /dev/null +++ b/src/main/java/blackjack/domain/Deck.java @@ -0,0 +1,21 @@ +package blackjack.domain; + +import blackjack.domain.card.Card; +import java.util.List; + +public class Deck { + private final List cards; + + private Deck(List cards) { + this.cards = cards; + } + + public static Deck from(List cards) { + return new Deck(cards); + } + + public Card draw() { + return cards.remove(0); + } + +} diff --git a/src/main/java/blackjack/domain/card/Card.java b/src/main/java/blackjack/domain/card/Card.java new file mode 100644 index 00000000000..19e2bc02c32 --- /dev/null +++ b/src/main/java/blackjack/domain/card/Card.java @@ -0,0 +1,4 @@ +package blackjack.domain.card; + +public record Card(Shape shape, Value value) { +} diff --git a/src/main/java/blackjack/domain/card/Shape.java b/src/main/java/blackjack/domain/card/Shape.java new file mode 100644 index 00000000000..ee270ba85a8 --- /dev/null +++ b/src/main/java/blackjack/domain/card/Shape.java @@ -0,0 +1,5 @@ +package blackjack.domain.card; + +public enum Shape { + SPADE, HEART, DIAMOND, CLOVER +} diff --git a/src/main/java/blackjack/domain/card/Value.java b/src/main/java/blackjack/domain/card/Value.java new file mode 100644 index 00000000000..f890e29a5d1 --- /dev/null +++ b/src/main/java/blackjack/domain/card/Value.java @@ -0,0 +1,23 @@ +package blackjack.domain.card; + +public enum Value { + ACE(11), + TWO(2), + THREE(3), + FOUR(4), + FIVE(5), + SIX(6), + SEVEN(7), + EIGHT(8), + NINE(9), + TEN(10), + JACK(10), + QUEEN(10), + KING(10); + + final int score; + + Value(int score) { + this.score = score; + } +} diff --git a/src/test/java/blackjack/domain/DeckTest.java b/src/test/java/blackjack/domain/DeckTest.java index 4222423c5f8..630750b2de8 100644 --- a/src/test/java/blackjack/domain/DeckTest.java +++ b/src/test/java/blackjack/domain/DeckTest.java @@ -3,6 +3,7 @@ import static org.assertj.core.api.Assertions.assertThat; +import blackjack.domain.card.Card; import blackjack.domain.card.Shape; import blackjack.domain.card.Value; import java.util.ArrayList; From 98dc0124c39ac7bc5687c800620d5aad2c405fa5 Mon Sep 17 00:00:00 2001 From: HyungUk Ryu Date: Tue, 5 Mar 2024 17:37:45 +0900 Subject: [PATCH 04/59] =?UTF-8?q?test(playerCardsTest):=20=ED=94=8C?= =?UTF-8?q?=EB=A0=88=EC=9D=B4=EC=96=B4=EC=9D=98=20=ED=8C=A8=EC=97=90=20?= =?UTF-8?q?=EC=B9=B4=EB=93=9C=ED=95=9C=EC=9E=A5=EC=9D=84=20=EC=B6=94?= =?UTF-8?q?=EA=B0=80=ED=95=98=EB=8A=94=20=ED=85=8C=EC=8A=A4=ED=8A=B8=20?= =?UTF-8?q?=EC=9E=91=EC=84=B1?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Co-authored-by: haiseong cards = playerCards.getCards(); + assertThat(cards).hasSize(1); + } +} From ad74addc98c83808773c6b6ec489577af9745953 Mon Sep 17 00:00:00 2001 From: HyungUk Ryu Date: Tue, 5 Mar 2024 17:49:26 +0900 Subject: [PATCH 05/59] =?UTF-8?q?feat(playerCards):=20=ED=94=8C=EB=A0=88?= =?UTF-8?q?=EC=9D=B4=EC=96=B4=EC=9D=98=20=ED=8C=A8=EC=97=90=20=EC=B9=B4?= =?UTF-8?q?=EB=93=9C=EB=A5=BC=20=EC=B6=94=EA=B0=80=ED=95=98=EB=8A=94=20?= =?UTF-8?q?=EA=B8=B0=EB=8A=A5=20=EA=B5=AC=ED=98=84?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Co-authored-by: haiseong --- docs/README.md | 2 +- .../java/blackjack/domain/PlayerCards.java | 20 +++++++++++++++++++ .../blackjack/domain/PlayerCardsTest.java | 3 ++- 3 files changed, 23 insertions(+), 2 deletions(-) create mode 100644 src/main/java/blackjack/domain/PlayerCards.java diff --git a/docs/README.md b/docs/README.md index 7dfae056c95..e49df5939d0 100644 --- a/docs/README.md +++ b/docs/README.md @@ -8,7 +8,7 @@ - [x] 자신이 가지고 있는 카드 중 한 장을 플레이어에게 제공할 수 있다. ### 플레이어가 받은 카드 -- 플레이어가 받은 한 장의 카드를 추가할 수 있다. +- [x] 플레이어가 받은 한 장의 카드를 추가할 수 있다. - 숫자 카드는 해당 숫자만큼의 점수로 계산된다. - A 카드는 1 또는 11 중 하나를 선택하여 계산할 수 있다. - J, Q, K 카드는 모두 10으로 계산된다. diff --git a/src/main/java/blackjack/domain/PlayerCards.java b/src/main/java/blackjack/domain/PlayerCards.java new file mode 100644 index 00000000000..9c4898a1524 --- /dev/null +++ b/src/main/java/blackjack/domain/PlayerCards.java @@ -0,0 +1,20 @@ +package blackjack.domain; + +import blackjack.domain.card.Card; +import java.util.List; + +public class PlayerCards { + private final List cards; + + public PlayerCards(List cards) { + this.cards = cards; + } + + public void append(Card card) { + cards.add(card); + } + + public List getCards() { + return cards; + } +} diff --git a/src/test/java/blackjack/domain/PlayerCardsTest.java b/src/test/java/blackjack/domain/PlayerCardsTest.java index ed53ec79c7f..7273dac717e 100644 --- a/src/test/java/blackjack/domain/PlayerCardsTest.java +++ b/src/test/java/blackjack/domain/PlayerCardsTest.java @@ -5,6 +5,7 @@ import blackjack.domain.card.Card; import blackjack.domain.card.Shape; import blackjack.domain.card.Value; +import java.util.ArrayList; import java.util.List; import org.junit.jupiter.api.DisplayName; import org.junit.jupiter.api.Test; @@ -14,7 +15,7 @@ class PlayerCardsTest { @DisplayName("한 장의 카드를 추가할 수 있다.") void addCardTest() { Card card = new Card(Shape.DIAMOND, Value.ACE); - PlayerCards playerCards = new PlayerCards(); + PlayerCards playerCards = new PlayerCards(new ArrayList<>()); playerCards.append(card); List cards = playerCards.getCards(); From 48f1535f85325f395fe83fc16683054f4a42a137 Mon Sep 17 00:00:00 2001 From: HyungUk Ryu Date: Tue, 5 Mar 2024 17:58:14 +0900 Subject: [PATCH 06/59] =?UTF-8?q?feat(playerCards):=20=EC=88=AB=EC=9E=90?= =?UTF-8?q?=20=EC=B9=B4=EB=93=9C,=20J/Q/K=20=EC=9D=98=20=EC=A0=90=EC=88=98?= =?UTF-8?q?=20=EA=B3=84=EC=82=B0=20=EA=B8=B0=EB=8A=A5=20=EA=B5=AC=ED=98=84?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Co-authored-by: haiseong --- docs/README.md | 6 ++-- .../java/blackjack/domain/PlayerCards.java | 6 ++++ src/main/java/blackjack/domain/card/Card.java | 3 ++ .../java/blackjack/domain/card/Value.java | 4 +++ .../blackjack/domain/PlayerCardsTest.java | 32 +++++++++++++++++++ 5 files changed, 48 insertions(+), 3 deletions(-) diff --git a/docs/README.md b/docs/README.md index e49df5939d0..3802d48e1ac 100644 --- a/docs/README.md +++ b/docs/README.md @@ -9,10 +9,10 @@ ### 플레이어가 받은 카드 - [x] 플레이어가 받은 한 장의 카드를 추가할 수 있다. -- 숫자 카드는 해당 숫자만큼의 점수로 계산된다. +- [x] 받은 카드의 총 점수를 계산할 수 있다. + - 숫자 카드는 해당 숫자만큼의 점수로 계산된다. + - J, Q, K 카드는 모두 10으로 계산된다. - A 카드는 1 또는 11 중 하나를 선택하여 계산할 수 있다. -- J, Q, K 카드는 모두 10으로 계산된다. -- 받은 카드의 총 점수를 계산할 수 있다. ### 플레이어 - 덱으로 부터 카드 한장을 받아올 수 있다. diff --git a/src/main/java/blackjack/domain/PlayerCards.java b/src/main/java/blackjack/domain/PlayerCards.java index 9c4898a1524..b504f975e57 100644 --- a/src/main/java/blackjack/domain/PlayerCards.java +++ b/src/main/java/blackjack/domain/PlayerCards.java @@ -14,6 +14,12 @@ public void append(Card card) { cards.add(card); } + public int calculateScore() { + return cards.stream() + .mapToInt(Card::getScore) + .sum(); + } + public List getCards() { return cards; } diff --git a/src/main/java/blackjack/domain/card/Card.java b/src/main/java/blackjack/domain/card/Card.java index 19e2bc02c32..b3987d6f733 100644 --- a/src/main/java/blackjack/domain/card/Card.java +++ b/src/main/java/blackjack/domain/card/Card.java @@ -1,4 +1,7 @@ package blackjack.domain.card; public record Card(Shape shape, Value value) { + public int getScore() { + return value().getScore(); + } } diff --git a/src/main/java/blackjack/domain/card/Value.java b/src/main/java/blackjack/domain/card/Value.java index f890e29a5d1..f91e38c56c2 100644 --- a/src/main/java/blackjack/domain/card/Value.java +++ b/src/main/java/blackjack/domain/card/Value.java @@ -20,4 +20,8 @@ public enum Value { Value(int score) { this.score = score; } + + public int getScore() { + return score; + } } diff --git a/src/test/java/blackjack/domain/PlayerCardsTest.java b/src/test/java/blackjack/domain/PlayerCardsTest.java index 7273dac717e..5250db2485a 100644 --- a/src/test/java/blackjack/domain/PlayerCardsTest.java +++ b/src/test/java/blackjack/domain/PlayerCardsTest.java @@ -21,4 +21,36 @@ void addCardTest() { List cards = playerCards.getCards(); assertThat(cards).hasSize(1); } + + @Test + @DisplayName("숫자 카드는 해당 숫자만큼의 점수로 계산된다.") + void calculateScoreTest() { + List cards = List.of( + new Card(Shape.DIAMOND, Value.TWO), + new Card(Shape.DIAMOND, Value.THREE), + new Card(Shape.DIAMOND, Value.FOUR) + ); + PlayerCards playerCards = new PlayerCards(cards); + + // TODO: score를 래핑해야 할 지도. + int score = playerCards.calculateScore(); + + assertThat(score).isEqualTo(9); + } + + @Test + @DisplayName("J, Q, K 카드는 모두 10으로 계산된다.") + void calculateScoreWithAlphabetTest() { + List cards = List.of( + new Card(Shape.DIAMOND, Value.JACK), + new Card(Shape.DIAMOND, Value.QUEEN), + new Card(Shape.DIAMOND, Value.KING) + ); + PlayerCards playerCards = new PlayerCards(cards); + + // TODO: score를 래핑해야 할 지도. + int score = playerCards.calculateScore(); + + assertThat(score).isEqualTo(30); + } } From 57acebe2c62bb678c141bc28cf387e84bfb10990 Mon Sep 17 00:00:00 2001 From: HyungUk Ryu Date: Tue, 5 Mar 2024 19:55:27 +0900 Subject: [PATCH 07/59] =?UTF-8?q?test(playerCardsTest):=20=ED=94=8C?= =?UTF-8?q?=EB=A0=88=EC=9D=B4=EC=96=B4=EC=9D=98=20=ED=8C=A8=EC=97=90=20ACE?= =?UTF-8?q?=EA=B0=80=20=ED=8F=AC=ED=95=A8=EB=90=9C=20=EA=B2=BD=EC=9A=B0=20?= =?UTF-8?q?=ED=85=8C=EC=8A=A4=ED=8A=B8=20=EC=BD=94=EB=93=9C=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 Co-authored-by: haiseong --- .../blackjack/domain/PlayerCardsTest.java | 61 ++++++++++++++++++- 1 file changed, 60 insertions(+), 1 deletion(-) diff --git a/src/test/java/blackjack/domain/PlayerCardsTest.java b/src/test/java/blackjack/domain/PlayerCardsTest.java index 5250db2485a..cb19fea553f 100644 --- a/src/test/java/blackjack/domain/PlayerCardsTest.java +++ b/src/test/java/blackjack/domain/PlayerCardsTest.java @@ -38,6 +38,7 @@ void calculateScoreTest() { assertThat(score).isEqualTo(9); } + // TODO: ParameterizedTest 활용 @Test @DisplayName("J, Q, K 카드는 모두 10으로 계산된다.") void calculateScoreWithAlphabetTest() { @@ -48,9 +49,67 @@ void calculateScoreWithAlphabetTest() { ); PlayerCards playerCards = new PlayerCards(cards); - // TODO: score를 래핑해야 할 지도. int score = playerCards.calculateScore(); assertThat(score).isEqualTo(30); } + + @Test + @DisplayName("ACE가 11점으로 계산되는 경우") + void calculateScoreWithAceAsEleven() { + List cards = List.of( + new Card(Shape.DIAMOND, Value.JACK), + new Card(Shape.DIAMOND, Value.ACE) + ); + PlayerCards playerCards = new PlayerCards(cards); + + int score = playerCards.calculateScore(); + + assertThat(score).isEqualTo(21); + } + + @Test + @DisplayName("ACE가 1점으로 계산되는 경우") + void calculateScoreWithAceAsOne() { + List cards = List.of( + new Card(Shape.DIAMOND, Value.NINE), + new Card(Shape.DIAMOND, Value.ACE), + new Card(Shape.SPADE, Value.ACE) + ); + PlayerCards playerCards = new PlayerCards(cards); + + int score = playerCards.calculateScore(); + + assertThat(score).isEqualTo(21); + } + + @Test + @DisplayName("ACE가 1점으로 계산되는 경우") + void calculateScoreWithAceAsOne2() { + List cards = List.of( + new Card(Shape.DIAMOND, Value.KING), + new Card(Shape.DIAMOND, Value.QUEEN), + new Card(Shape.DIAMOND, Value.ACE) + ); + PlayerCards playerCards = new PlayerCards(cards); + + int score = playerCards.calculateScore(); + + assertThat(score).isEqualTo(21); + } + + @Test + @DisplayName("ACE가 1점으로 계산되는 경우") + void calculateScoreWithAceAsOne3() { + List cards = List.of( + new Card(Shape.DIAMOND, Value.ACE), + new Card(Shape.CLOVER, Value.ACE), + new Card(Shape.SPADE, Value.ACE) + ); + PlayerCards playerCards = new PlayerCards(cards); + + int score = playerCards.calculateScore(); + + assertThat(score).isEqualTo(13); + } } From 3c535ec4ea9cce764316160eb4ae4918bd0ee443 Mon Sep 17 00:00:00 2001 From: HyungUk Ryu Date: Tue, 5 Mar 2024 19:56:14 +0900 Subject: [PATCH 08/59] =?UTF-8?q?feat(playerCards):=20=ED=94=8C=EB=A0=88?= =?UTF-8?q?=EC=9D=B4=EC=96=B4=20=ED=8C=A8=EC=97=90=20ACE=EA=B0=80=20?= =?UTF-8?q?=ED=8F=AC=ED=95=A8=EB=90=9C=20=EA=B2=BD=EC=9A=B0=20=EC=A0=90?= =?UTF-8?q?=EC=88=98=20=EA=B3=84=EC=82=B0=20=EA=B8=B0=EB=8A=A5=20=EA=B5=AC?= =?UTF-8?q?=ED=98=84?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Co-authored-by: haiseong --- docs/README.md | 2 +- .../java/blackjack/domain/PlayerCards.java | 18 +++++++++++++++++- src/main/java/blackjack/domain/card/Card.java | 4 ++++ 3 files changed, 22 insertions(+), 2 deletions(-) diff --git a/docs/README.md b/docs/README.md index 3802d48e1ac..0a6df6a7d73 100644 --- a/docs/README.md +++ b/docs/README.md @@ -12,7 +12,7 @@ - [x] 받은 카드의 총 점수를 계산할 수 있다. - 숫자 카드는 해당 숫자만큼의 점수로 계산된다. - J, Q, K 카드는 모두 10으로 계산된다. -- A 카드는 1 또는 11 중 하나를 선택하여 계산할 수 있다. +- [x] A 카드는 1 또는 11 중 하나를 선택하여 계산할 수 있다. ### 플레이어 - 덱으로 부터 카드 한장을 받아올 수 있다. diff --git a/src/main/java/blackjack/domain/PlayerCards.java b/src/main/java/blackjack/domain/PlayerCards.java index b504f975e57..fc91ea962e4 100644 --- a/src/main/java/blackjack/domain/PlayerCards.java +++ b/src/main/java/blackjack/domain/PlayerCards.java @@ -15,9 +15,25 @@ public void append(Card card) { } public int calculateScore() { - return cards.stream() + int score = cards.stream() .mapToInt(Card::getScore) .sum(); + + int aceCount = getAceCount(); + + // TODO: 인덴트 줄이기, 로직 개선 + for (int i = 0; i < aceCount; i++) { + if (score <= 21) { + break; + } + score -= 10; + } + + return score; + } + + private int getAceCount() { + return (int) cards.stream().filter(Card::isAce).count(); } public List getCards() { diff --git a/src/main/java/blackjack/domain/card/Card.java b/src/main/java/blackjack/domain/card/Card.java index b3987d6f733..0b7b2c05f4e 100644 --- a/src/main/java/blackjack/domain/card/Card.java +++ b/src/main/java/blackjack/domain/card/Card.java @@ -4,4 +4,8 @@ public record Card(Shape shape, Value value) { public int getScore() { return value().getScore(); } + + public boolean isAce() { + return value == Value.ACE; + } } From 5c0e1e753243dd3c6cb89362051c50a9419bfd8f Mon Sep 17 00:00:00 2001 From: HyungUk Ryu Date: Tue, 5 Mar 2024 20:12:50 +0900 Subject: [PATCH 09/59] =?UTF-8?q?refactor(playerCardsTest):=20Parameterize?= =?UTF-8?q?dTest=20=ED=99=9C=EC=9A=A9?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Co-authored-by: haiseong --- .../blackjack/domain/PlayerCardsTest.java | 84 ++++++------------- 1 file changed, 24 insertions(+), 60 deletions(-) diff --git a/src/test/java/blackjack/domain/PlayerCardsTest.java b/src/test/java/blackjack/domain/PlayerCardsTest.java index cb19fea553f..31daab70f17 100644 --- a/src/test/java/blackjack/domain/PlayerCardsTest.java +++ b/src/test/java/blackjack/domain/PlayerCardsTest.java @@ -1,20 +1,24 @@ package blackjack.domain; import static org.assertj.core.api.Assertions.assertThat; +import static blackjack.domain.card.Shape.*; +import static blackjack.domain.card.Value.*; import blackjack.domain.card.Card; -import blackjack.domain.card.Shape; -import blackjack.domain.card.Value; 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; class PlayerCardsTest { @Test @DisplayName("한 장의 카드를 추가할 수 있다.") void addCardTest() { - Card card = new Card(Shape.DIAMOND, Value.ACE); + Card card = new Card(DIAMOND, ACE); PlayerCards playerCards = new PlayerCards(new ArrayList<>()); playerCards.append(card); @@ -26,9 +30,9 @@ void addCardTest() { @DisplayName("숫자 카드는 해당 숫자만큼의 점수로 계산된다.") void calculateScoreTest() { List cards = List.of( - new Card(Shape.DIAMOND, Value.TWO), - new Card(Shape.DIAMOND, Value.THREE), - new Card(Shape.DIAMOND, Value.FOUR) + new Card(DIAMOND, TWO), + new Card(DIAMOND, THREE), + new Card(DIAMOND, FOUR) ); PlayerCards playerCards = new PlayerCards(cards); @@ -38,14 +42,13 @@ void calculateScoreTest() { assertThat(score).isEqualTo(9); } - // TODO: ParameterizedTest 활용 @Test @DisplayName("J, Q, K 카드는 모두 10으로 계산된다.") void calculateScoreWithAlphabetTest() { List cards = List.of( - new Card(Shape.DIAMOND, Value.JACK), - new Card(Shape.DIAMOND, Value.QUEEN), - new Card(Shape.DIAMOND, Value.KING) + new Card(DIAMOND, JACK), + new Card(DIAMOND, QUEEN), + new Card(DIAMOND, KING) ); PlayerCards playerCards = new PlayerCards(cards); @@ -54,62 +57,23 @@ void calculateScoreWithAlphabetTest() { assertThat(score).isEqualTo(30); } - @Test - @DisplayName("ACE가 11점으로 계산되는 경우") - void calculateScoreWithAceAsEleven() { - List cards = List.of( - new Card(Shape.DIAMOND, Value.JACK), - new Card(Shape.DIAMOND, Value.ACE) - ); + @ParameterizedTest + @MethodSource("cardsAndScore") + @DisplayName("ACE 는 1점 혹은 11점으로 계산된다.") + void calculateScoreWithAce(List cards, int expected) { PlayerCards playerCards = new PlayerCards(cards); - int score = playerCards.calculateScore(); - assertThat(score).isEqualTo(21); + assertThat(score).isEqualTo(expected); } - @Test - @DisplayName("ACE가 1점으로 계산되는 경우") - void calculateScoreWithAceAsOne() { - List cards = List.of( - new Card(Shape.DIAMOND, Value.NINE), - new Card(Shape.DIAMOND, Value.ACE), - new Card(Shape.SPADE, Value.ACE) + static Stream cardsAndScore() { + return Stream.of( + Arguments.arguments(List.of(new Card(DIAMOND, JACK), new Card(DIAMOND, ACE)), 21), + Arguments.arguments(List.of(new Card(DIAMOND, NINE), new Card(DIAMOND, ACE), new Card(SPADE, ACE)), 21), + Arguments.arguments(List.of(new Card(DIAMOND, KING), new Card(DIAMOND, QUEEN), new Card(DIAMOND, ACE)), 21), + Arguments.arguments(List.of(new Card(DIAMOND, ACE), new Card(CLOVER, ACE), new Card(SPADE, ACE)), 13) ); - PlayerCards playerCards = new PlayerCards(cards); - - int score = playerCards.calculateScore(); - - assertThat(score).isEqualTo(21); } - @Test - @DisplayName("ACE가 1점으로 계산되는 경우") - void calculateScoreWithAceAsOne2() { - List cards = List.of( - new Card(Shape.DIAMOND, Value.KING), - new Card(Shape.DIAMOND, Value.QUEEN), - new Card(Shape.DIAMOND, Value.ACE) - ); - PlayerCards playerCards = new PlayerCards(cards); - - int score = playerCards.calculateScore(); - - assertThat(score).isEqualTo(21); - } - - @Test - @DisplayName("ACE가 1점으로 계산되는 경우") - void calculateScoreWithAceAsOne3() { - List cards = List.of( - new Card(Shape.DIAMOND, Value.ACE), - new Card(Shape.CLOVER, Value.ACE), - new Card(Shape.SPADE, Value.ACE) - ); - PlayerCards playerCards = new PlayerCards(cards); - - int score = playerCards.calculateScore(); - - assertThat(score).isEqualTo(13); - } } From 64e668c404fbcc5fd1daa2da863843b6d33617dd Mon Sep 17 00:00:00 2001 From: HyungUk Ryu Date: Tue, 5 Mar 2024 20:30:34 +0900 Subject: [PATCH 10/59] =?UTF-8?q?test(playerTest):=20=EB=8D=B1=EC=9C=BC?= =?UTF-8?q?=EB=A1=9C=20=EB=B6=80=ED=84=B0=20=EC=B9=B4=EB=93=9C=20=ED=95=9C?= =?UTF-8?q?=EC=9E=A5=EC=9D=84=20=EB=B0=9B=EC=95=84=EC=98=A4=EB=8A=94=20?= =?UTF-8?q?=ED=85=8C=EC=8A=A4=ED=8A=B8=20=EC=B6=94=EA=B0=80?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Co-authored-by: haiseong --- .../java/blackjack/domain/PlayerTest.java | 28 +++++++++++++++++++ 1 file changed, 28 insertions(+) create mode 100644 src/test/java/blackjack/domain/PlayerTest.java diff --git a/src/test/java/blackjack/domain/PlayerTest.java b/src/test/java/blackjack/domain/PlayerTest.java new file mode 100644 index 00000000000..bee3322fa82 --- /dev/null +++ b/src/test/java/blackjack/domain/PlayerTest.java @@ -0,0 +1,28 @@ +package blackjack.domain; + +import static blackjack.domain.card.Shape.DIAMOND; +import static blackjack.domain.card.Value.FOUR; +import static blackjack.domain.card.Value.THREE; +import static blackjack.domain.card.Value.TWO; +import static org.assertj.core.api.Assertions.assertThat; + +import blackjack.domain.card.Card; +import java.util.List; +import org.junit.jupiter.api.DisplayName; +import org.junit.jupiter.api.Test; + +class PlayerTest { + @Test + @DisplayName("덱으로 부터 카드 한장을 받아올 수 있다.") + void drawCardTest() { + List cards = List.of(new Card(DIAMOND, TWO), new Card(DIAMOND, THREE), new Card(DIAMOND, FOUR)); + Deck deck = Deck.from(cards); + + Player player = new Player(); + player.draw(deck); + + List playerCards = player.getCards(); + assertThat(playerCards).hasSize(1); + } + +} \ No newline at end of file From 85a9f442af4ea77fb086676d27b58c3e8dfff295 Mon Sep 17 00:00:00 2001 From: HyungUk Ryu Date: Tue, 5 Mar 2024 20:32:36 +0900 Subject: [PATCH 11/59] =?UTF-8?q?feat(player):=20=EB=8D=B1=EC=9C=BC?= =?UTF-8?q?=EB=A1=9C=20=EB=B6=80=ED=84=B0=20=EC=B9=B4=EB=93=9C=20=ED=95=9C?= =?UTF-8?q?=EC=9E=A5=EC=9D=84=20=EB=B0=9B=EC=95=84=EC=98=A4=EB=8A=94=20?= =?UTF-8?q?=EA=B8=B0=EB=8A=A5=20=EA=B5=AC=ED=98=84?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Co-authored-by: haiseong --- docs/README.md | 2 +- src/main/java/blackjack/domain/Player.java | 21 +++++++++++++++++++++ 2 files changed, 22 insertions(+), 1 deletion(-) create mode 100644 src/main/java/blackjack/domain/Player.java diff --git a/docs/README.md b/docs/README.md index 0a6df6a7d73..f5c4af11597 100644 --- a/docs/README.md +++ b/docs/README.md @@ -15,7 +15,7 @@ - [x] A 카드는 1 또는 11 중 하나를 선택하여 계산할 수 있다. ### 플레이어 -- 덱으로 부터 카드 한장을 받아올 수 있다. +- [x] 덱으로 부터 카드 한장을 받아올 수 있다. - 자신의 점수를 계산할 수 있다. - 자신의 버스트 여부를 판단할 수 있다. diff --git a/src/main/java/blackjack/domain/Player.java b/src/main/java/blackjack/domain/Player.java new file mode 100644 index 00000000000..2b9d3217d4b --- /dev/null +++ b/src/main/java/blackjack/domain/Player.java @@ -0,0 +1,21 @@ +package blackjack.domain; + +import blackjack.domain.card.Card; +import java.util.List; + +public class Player { + PlayerCards playerCards; + + public Player() { + this.playerCards = PlayerCards.createEmptyCards(); + } + + public void draw(Deck deck) { + Card card = deck.draw(); + playerCards.append(card); + } + + public List getCards() { + return playerCards.getCards(); + } +} From 70c941a9b50b989627ff6539303701524249cc6f Mon Sep 17 00:00:00 2001 From: HyungUk Ryu Date: Tue, 5 Mar 2024 20:34:13 +0900 Subject: [PATCH 12/59] =?UTF-8?q?refactor(playerCards):=20=EB=B9=88=20?= =?UTF-8?q?=ED=8C=A8=EB=A5=BC=20=EC=83=9D=EC=84=B1=ED=95=98=EB=8A=94=20?= =?UTF-8?q?=EC=A0=95=EC=A0=81=20=ED=8C=A9=ED=86=A0=EB=A6=AC=20=EB=A9=94?= =?UTF-8?q?=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 Co-authored-by: haiseong --- src/main/java/blackjack/domain/PlayerCards.java | 5 +++++ src/test/java/blackjack/domain/PlayerCardsTest.java | 4 +--- 2 files changed, 6 insertions(+), 3 deletions(-) diff --git a/src/main/java/blackjack/domain/PlayerCards.java b/src/main/java/blackjack/domain/PlayerCards.java index fc91ea962e4..cda6aeb3936 100644 --- a/src/main/java/blackjack/domain/PlayerCards.java +++ b/src/main/java/blackjack/domain/PlayerCards.java @@ -1,6 +1,7 @@ package blackjack.domain; import blackjack.domain.card.Card; +import java.util.ArrayList; import java.util.List; public class PlayerCards { @@ -10,6 +11,10 @@ public PlayerCards(List cards) { this.cards = cards; } + public static PlayerCards createEmptyCards() { + return new PlayerCards(new ArrayList<>()); + } + public void append(Card card) { cards.add(card); } diff --git a/src/test/java/blackjack/domain/PlayerCardsTest.java b/src/test/java/blackjack/domain/PlayerCardsTest.java index 31daab70f17..0b07f8063c1 100644 --- a/src/test/java/blackjack/domain/PlayerCardsTest.java +++ b/src/test/java/blackjack/domain/PlayerCardsTest.java @@ -5,7 +5,6 @@ import static blackjack.domain.card.Value.*; import blackjack.domain.card.Card; -import java.util.ArrayList; import java.util.List; import java.util.stream.Stream; import org.junit.jupiter.api.DisplayName; @@ -19,7 +18,7 @@ class PlayerCardsTest { @DisplayName("한 장의 카드를 추가할 수 있다.") void addCardTest() { Card card = new Card(DIAMOND, ACE); - PlayerCards playerCards = new PlayerCards(new ArrayList<>()); + PlayerCards playerCards = PlayerCards.createEmptyCards(); playerCards.append(card); List cards = playerCards.getCards(); @@ -75,5 +74,4 @@ static Stream cardsAndScore() { Arguments.arguments(List.of(new Card(DIAMOND, ACE), new Card(CLOVER, ACE), new Card(SPADE, ACE)), 13) ); } - } From bdb35971b42525dbec743cce9a7fc9650cfd30a5 Mon Sep 17 00:00:00 2001 From: HyungUk Ryu Date: Tue, 5 Mar 2024 20:34:42 +0900 Subject: [PATCH 13/59] =?UTF-8?q?refactor(deck):=20LinkedList=EB=A5=BC=20?= =?UTF-8?q?=EC=82=AC=EC=9A=A9=ED=95=98=EB=8F=84=EB=A1=9D=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 Co-authored-by: haiseong --- src/main/java/blackjack/domain/Deck.java | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/src/main/java/blackjack/domain/Deck.java b/src/main/java/blackjack/domain/Deck.java index 4c7f93954ee..c0f64c893df 100644 --- a/src/main/java/blackjack/domain/Deck.java +++ b/src/main/java/blackjack/domain/Deck.java @@ -1,6 +1,7 @@ package blackjack.domain; import blackjack.domain.card.Card; +import java.util.LinkedList; import java.util.List; public class Deck { @@ -11,7 +12,7 @@ private Deck(List cards) { } public static Deck from(List cards) { - return new Deck(cards); + return new Deck(new LinkedList<>(cards)); } public Card draw() { From 27a0495658f09ff0bd70c34bd4efb5998ac20c8b Mon Sep 17 00:00:00 2001 From: HyungUk Ryu Date: Tue, 5 Mar 2024 20:38:22 +0900 Subject: [PATCH 14/59] =?UTF-8?q?test(playerTest):=20=ED=94=8C=EB=A0=88?= =?UTF-8?q?=EC=9D=B4=EC=96=B4=EC=9D=98=20=EC=A0=90=EC=88=98=EB=A5=BC=20?= =?UTF-8?q?=EA=B3=84=EC=82=B0=ED=95=98=EB=8A=94=20=ED=85=8C=EC=8A=A4?= =?UTF-8?q?=ED=8A=B8=20=EC=B6=94=EA=B0=80?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Co-authored-by: haiseong --- src/test/java/blackjack/domain/PlayerTest.java | 16 ++++++++++++++++ 1 file changed, 16 insertions(+) diff --git a/src/test/java/blackjack/domain/PlayerTest.java b/src/test/java/blackjack/domain/PlayerTest.java index bee3322fa82..00f4e05ab42 100644 --- a/src/test/java/blackjack/domain/PlayerTest.java +++ b/src/test/java/blackjack/domain/PlayerTest.java @@ -25,4 +25,20 @@ void drawCardTest() { assertThat(playerCards).hasSize(1); } + @Test + @DisplayName("자신의 점수를 계산할 수 있다.") + void calculateScoreTest() { + List cards = List.of(new Card(DIAMOND, TWO), new Card(DIAMOND, THREE), new Card(DIAMOND, FOUR)); + Deck deck = Deck.from(cards); + + Player player = new Player(); + for (int i = 0; i < cards.size(); i++) { + player.draw(deck); + } + + int score = player.getScore(); + + assertThat(score).isEqualTo(9); + } + } \ No newline at end of file From 084a16681ca333aef9869bf4cf1cef381a4218a7 Mon Sep 17 00:00:00 2001 From: HyungUk Ryu Date: Tue, 5 Mar 2024 20:39:14 +0900 Subject: [PATCH 15/59] =?UTF-8?q?feat(player):=20=ED=94=8C=EB=A0=88?= =?UTF-8?q?=EC=9D=B4=EC=96=B4=EC=9D=98=20=EC=A0=90=EC=88=98=20=EA=B3=84?= =?UTF-8?q?=EC=82=B0=20=EA=B8=B0=EB=8A=A5=20=EA=B5=AC=ED=98=84?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Co-authored-by: haiseong --- docs/README.md | 2 +- src/main/java/blackjack/domain/Player.java | 4 ++++ src/test/java/blackjack/domain/PlayerTest.java | 1 - 3 files changed, 5 insertions(+), 2 deletions(-) diff --git a/docs/README.md b/docs/README.md index f5c4af11597..5ba1c5b69d8 100644 --- a/docs/README.md +++ b/docs/README.md @@ -16,7 +16,7 @@ ### 플레이어 - [x] 덱으로 부터 카드 한장을 받아올 수 있다. -- 자신의 점수를 계산할 수 있다. +- [x] 자신의 점수를 계산할 수 있다. - 자신의 버스트 여부를 판단할 수 있다. ### 딜러 diff --git a/src/main/java/blackjack/domain/Player.java b/src/main/java/blackjack/domain/Player.java index 2b9d3217d4b..53d406adbd1 100644 --- a/src/main/java/blackjack/domain/Player.java +++ b/src/main/java/blackjack/domain/Player.java @@ -18,4 +18,8 @@ public void draw(Deck deck) { public List getCards() { return playerCards.getCards(); } + + public int getScore() { + return playerCards.calculateScore(); + } } diff --git a/src/test/java/blackjack/domain/PlayerTest.java b/src/test/java/blackjack/domain/PlayerTest.java index 00f4e05ab42..6b922a4b587 100644 --- a/src/test/java/blackjack/domain/PlayerTest.java +++ b/src/test/java/blackjack/domain/PlayerTest.java @@ -40,5 +40,4 @@ void calculateScoreTest() { assertThat(score).isEqualTo(9); } - } \ No newline at end of file From 5831bb09ac012efe44d46c240664025555ebb447 Mon Sep 17 00:00:00 2001 From: HyungUk Ryu Date: Tue, 5 Mar 2024 20:48:09 +0900 Subject: [PATCH 16/59] =?UTF-8?q?test(playerTest):=20=ED=94=8C=EB=A0=88?= =?UTF-8?q?=EC=9D=B4=EC=96=B4=EC=9D=98=20=EB=B2=84=EC=8A=A4=ED=8A=B8=20?= =?UTF-8?q?=EC=97=AC=EB=B6=80=EB=A5=BC=20=ED=8C=90=EB=8B=A8=ED=95=98?= =?UTF-8?q?=EB=8A=94=20=ED=85=8C=EC=8A=A4=ED=8A=B8=20=EC=BD=94=EB=93=9C=20?= =?UTF-8?q?=EC=B6=94=EA=B0=80?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Co-authored-by: haiseong --- .../java/blackjack/domain/PlayerTest.java | 32 ++++++++++++++++++- 1 file changed, 31 insertions(+), 1 deletion(-) diff --git a/src/test/java/blackjack/domain/PlayerTest.java b/src/test/java/blackjack/domain/PlayerTest.java index 6b922a4b587..3b58591490c 100644 --- a/src/test/java/blackjack/domain/PlayerTest.java +++ b/src/test/java/blackjack/domain/PlayerTest.java @@ -1,15 +1,22 @@ package blackjack.domain; import static blackjack.domain.card.Shape.DIAMOND; +import static blackjack.domain.card.Value.ACE; import static blackjack.domain.card.Value.FOUR; +import static blackjack.domain.card.Value.JACK; +import static blackjack.domain.card.Value.QUEEN; import static blackjack.domain.card.Value.THREE; import static blackjack.domain.card.Value.TWO; import static org.assertj.core.api.Assertions.assertThat; import blackjack.domain.card.Card; 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; class PlayerTest { @Test @@ -40,4 +47,27 @@ void calculateScoreTest() { assertThat(score).isEqualTo(9); } -} \ No newline at end of file + + @ParameterizedTest + @MethodSource("cardsAndBustStatus") + @DisplayName("자신의 버스트 여부를 판단할 수 있다.") + void checkBustTest(List cards, boolean expected) { + Deck deck = Deck.from(cards); + + Player player = new Player(); + for (int i = 0; i < cards.size(); i++) { + player.draw(deck); + } + + boolean isBusted = player.isBusted(); + + assertThat(isBusted).isEqualTo(expected); + } + + static Stream cardsAndBustStatus() { + return Stream.of( + Arguments.arguments(List.of(new Card(DIAMOND, JACK), new Card(DIAMOND, QUEEN), new Card(DIAMOND, ACE)), false), + Arguments.arguments(List.of(new Card(DIAMOND, JACK), new Card(DIAMOND, QUEEN), new Card(DIAMOND, TWO)), true) + ); + } +} From 5a31b6824e2bd7c84bdb3650ba2d5aa0c4a9b81a Mon Sep 17 00:00:00 2001 From: HyungUk Ryu Date: Tue, 5 Mar 2024 20:51:54 +0900 Subject: [PATCH 17/59] =?UTF-8?q?feat(player):=20=ED=94=8C=EB=A0=88?= =?UTF-8?q?=EC=9D=B4=EC=96=B4=EC=9D=98=20=EB=B2=84=EC=8A=A4=ED=8A=B8=20?= =?UTF-8?q?=EC=97=AC=EB=B6=80=EB=A5=BC=20=ED=8C=90=EB=8B=A8=ED=95=98?= =?UTF-8?q?=EB=8A=94=20=EB=A1=9C=EC=A7=81=20=EA=B5=AC=ED=98=84?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Co-authored-by: haiseong --- docs/README.md | 3 ++- src/main/java/blackjack/domain/Player.java | 4 ++++ src/main/java/blackjack/domain/PlayerCards.java | 7 ++++++- 3 files changed, 12 insertions(+), 2 deletions(-) diff --git a/docs/README.md b/docs/README.md index 5ba1c5b69d8..de5f5531832 100644 --- a/docs/README.md +++ b/docs/README.md @@ -13,11 +13,12 @@ - 숫자 카드는 해당 숫자만큼의 점수로 계산된다. - J, Q, K 카드는 모두 10으로 계산된다. - [x] A 카드는 1 또는 11 중 하나를 선택하여 계산할 수 있다. +- [x] 현재 패의 버스트 여부를 판단할 수 있다. ### 플레이어 - [x] 덱으로 부터 카드 한장을 받아올 수 있다. - [x] 자신의 점수를 계산할 수 있다. -- 자신의 버스트 여부를 판단할 수 있다. +- [x] 자신의 버스트 여부를 판단할 수 있다. ### 딜러 - 덱으로 부터 카드 한장을 받아올 수 있다. diff --git a/src/main/java/blackjack/domain/Player.java b/src/main/java/blackjack/domain/Player.java index 53d406adbd1..feabcf8515c 100644 --- a/src/main/java/blackjack/domain/Player.java +++ b/src/main/java/blackjack/domain/Player.java @@ -22,4 +22,8 @@ public List getCards() { public int getScore() { return playerCards.calculateScore(); } + + public boolean isBusted() { + return playerCards.isBusted(); + } } diff --git a/src/main/java/blackjack/domain/PlayerCards.java b/src/main/java/blackjack/domain/PlayerCards.java index cda6aeb3936..f767f542d35 100644 --- a/src/main/java/blackjack/domain/PlayerCards.java +++ b/src/main/java/blackjack/domain/PlayerCards.java @@ -5,6 +5,7 @@ import java.util.List; public class PlayerCards { + private static final int BUST_THRESHOLD = 21; private final List cards; public PlayerCards(List cards) { @@ -28,7 +29,7 @@ public int calculateScore() { // TODO: 인덴트 줄이기, 로직 개선 for (int i = 0; i < aceCount; i++) { - if (score <= 21) { + if (score <= BUST_THRESHOLD) { break; } score -= 10; @@ -37,6 +38,10 @@ public int calculateScore() { return score; } + public boolean isBusted() { + return calculateScore() > BUST_THRESHOLD; + } + private int getAceCount() { return (int) cards.stream().filter(Card::isAce).count(); } From 157a2594aae9f1c8256c8952bdf45c480215f016 Mon Sep 17 00:00:00 2001 From: HyungUk Ryu Date: Tue, 5 Mar 2024 21:14:04 +0900 Subject: [PATCH 18/59] =?UTF-8?q?test(dealerTest):=20=EB=94=9C=EB=9F=AC?= =?UTF-8?q?=EA=B0=80=20=EC=B9=B4=EB=93=9C=EB=A5=BC=20=EB=B0=9B=EB=8A=94=20?= =?UTF-8?q?=ED=85=8C=EC=8A=A4=ED=8A=B8=20=EC=B6=94=EA=B0=80?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Co-authored-by: haiseong --- .../java/blackjack/domain/DealerTest.java | 43 +++++++++++++++++++ 1 file changed, 43 insertions(+) create mode 100644 src/test/java/blackjack/domain/DealerTest.java diff --git a/src/test/java/blackjack/domain/DealerTest.java b/src/test/java/blackjack/domain/DealerTest.java new file mode 100644 index 00000000000..15317c232de --- /dev/null +++ b/src/test/java/blackjack/domain/DealerTest.java @@ -0,0 +1,43 @@ +package blackjack.domain; + +import static blackjack.domain.card.Shape.DIAMOND; +import static blackjack.domain.card.Value.ACE; +import static blackjack.domain.card.Value.FOUR; +import static blackjack.domain.card.Value.KING; +import static blackjack.domain.card.Value.QUEEN; +import static blackjack.domain.card.Value.THREE; +import static blackjack.domain.card.Value.TWO; +import static org.assertj.core.api.Assertions.assertThat; + +import blackjack.domain.card.Card; +import java.util.List; +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 DealerTest { + @ParameterizedTest + @MethodSource("cardsAndScore") + @DisplayName("자신의 현재 점수가 17점 이상이 될 때까지 추가로 카드를 받는다.") + void drawCardsUntilScoreBelow17(List cards, int expected) { + Deck deck = Deck.from(cards); + Dealer dealer = new Dealer(); + + dealer.draw(deck); + int score = dealer.getScore(); + assertThat(score).isEqualTo(expected); + } + + static Stream cardsAndScore() { + return Stream.of( + Arguments.arguments(List.of( + new Card(DIAMOND, KING), new Card(DIAMOND, TWO), new Card(DIAMOND, FOUR), + new Card(DIAMOND, ACE), new Card(DIAMOND, THREE)), 17), + Arguments.arguments(List.of( + new Card(DIAMOND, KING), new Card(DIAMOND, ACE), + new Card(DIAMOND, QUEEN)), 21) + ); + } +} \ No newline at end of file From 67b00f900a17b99daa4ae0942cde9aa02b19dce9 Mon Sep 17 00:00:00 2001 From: HyungUk Ryu Date: Tue, 5 Mar 2024 21:16:00 +0900 Subject: [PATCH 19/59] =?UTF-8?q?feat(dealer):=20=EB=94=9C=EB=9F=AC?= =?UTF-8?q?=EA=B0=80=20=EC=B9=B4=EB=93=9C=EB=A5=BC=20=EB=B0=9B=EB=8A=94=20?= =?UTF-8?q?=EA=B0=80=EB=8A=A5=20=EC=B6=94=EA=B0=80?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Co-authored-by: haiseong --- docs/README.md | 8 +++--- src/main/java/blackjack/domain/Dealer.java | 32 ++++++++++++++++++++++ 2 files changed, 36 insertions(+), 4 deletions(-) create mode 100644 src/main/java/blackjack/domain/Dealer.java diff --git a/docs/README.md b/docs/README.md index de5f5531832..6bc365d7b7d 100644 --- a/docs/README.md +++ b/docs/README.md @@ -21,10 +21,10 @@ - [x] 자신의 버스트 여부를 판단할 수 있다. ### 딜러 -- 덱으로 부터 카드 한장을 받아올 수 있다. -- 자신의 점수를 계산할 수 있다. -- 자신의 버스트 여부를 판단할 수 있다. -- 자신의 현재 점수가 17점 이상이 될 때까지 추가로 카드를 받는다. +- [x] 덱으로 부터 카드 한장을 받아올 수 있다. +- [x] 자신의 점수를 계산할 수 있다. +- [x] 자신의 버스트 여부를 판단할 수 있다. +- [x] 자신의 현재 점수가 17점 이상이 될 때까지 추가로 카드를 받는다. ### 블랙잭 게임 - 플레이어들의 승리/패배/무승부 여부를 계산할 수 있다. diff --git a/src/main/java/blackjack/domain/Dealer.java b/src/main/java/blackjack/domain/Dealer.java new file mode 100644 index 00000000000..78d5b00cade --- /dev/null +++ b/src/main/java/blackjack/domain/Dealer.java @@ -0,0 +1,32 @@ +package blackjack.domain; + +import blackjack.domain.card.Card; +import java.util.List; + +public class Dealer { + private static final int MINIMUM_SCORE = 17; + + private final Player player; + + public Dealer() { + this.player = new Player(); + } + + public void draw(Deck deck) { + while (getScore() < MINIMUM_SCORE) { + player.draw(deck); + } + } + + public List getCards() { + return player.getCards(); + } + + public int getScore() { + return player.getScore(); + } + + public boolean isBusted() { + return player.isBusted(); + } +} From f8ef8d057ed97beb32280c218828918ac8c51ef1 Mon Sep 17 00:00:00 2001 From: HyungUk Ryu Date: Tue, 5 Mar 2024 22:42:55 +0900 Subject: [PATCH 20/59] =?UTF-8?q?feat(deck):=20=EC=85=94=ED=94=8C=EB=90=9C?= =?UTF-8?q?=20=EB=8C=81=20=EC=83=9D=EC=84=B1=20=ED=95=98=EB=8A=94=20?= =?UTF-8?q?=ED=8C=A9=ED=86=A0=EB=A6=AC=20=EB=A9=94=EC=84=9C=EB=93=9C=20?= =?UTF-8?q?=EC=B6=94=EA=B0=80?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Co-authored-by: haiseong --- src/main/java/blackjack/domain/Deck.java | 16 ++++++++++++++++ 1 file changed, 16 insertions(+) diff --git a/src/main/java/blackjack/domain/Deck.java b/src/main/java/blackjack/domain/Deck.java index c0f64c893df..e20ccb3c4f5 100644 --- a/src/main/java/blackjack/domain/Deck.java +++ b/src/main/java/blackjack/domain/Deck.java @@ -1,6 +1,10 @@ package blackjack.domain; import blackjack.domain.card.Card; +import blackjack.domain.card.Shape; +import blackjack.domain.card.Value; +import java.util.ArrayList; +import java.util.Arrays; import java.util.LinkedList; import java.util.List; @@ -8,6 +12,7 @@ public class Deck { private final List cards; private Deck(List cards) { + // TODO: 중복되는 카드 검사 로직 추가 this.cards = cards; } @@ -15,6 +20,17 @@ public static Deck from(List cards) { return new Deck(new LinkedList<>(cards)); } + public static Deck createShuffledDeck() { + List cards = new ArrayList<>(); + + // TODO: 구조개선 + for (Shape shape : Shape.values()) { + Arrays.stream(Value.values()) + .forEach(value -> cards.add(new Card(shape, value))); + } + return new Deck(cards); + } + public Card draw() { return cards.remove(0); } From 7c3952e1c5c3bd8db4db644105577536db0557d1 Mon Sep 17 00:00:00 2001 From: HyungUk Ryu Date: Wed, 6 Mar 2024 14:53:42 +0900 Subject: [PATCH 21/59] =?UTF-8?q?refactor(player):=20=ED=94=8C=EB=A0=88?= =?UTF-8?q?=EC=9D=B4=EC=96=B4=EA=B0=80=20=EC=9D=B4=EB=A6=84=EC=9D=84=20?= =?UTF-8?q?=EA=B0=80=EC=A7=80=EB=8F=84=EB=A1=9D=20=EC=88=98=EC=A0=95?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Co-authored-by: haiseong --- src/main/java/blackjack/domain/Dealer.java | 3 ++- src/main/java/blackjack/domain/Player.java | 6 ++++-- src/test/java/blackjack/domain/PlayerTest.java | 6 +++--- 3 files changed, 9 insertions(+), 6 deletions(-) diff --git a/src/main/java/blackjack/domain/Dealer.java b/src/main/java/blackjack/domain/Dealer.java index 78d5b00cade..eae1332d76d 100644 --- a/src/main/java/blackjack/domain/Dealer.java +++ b/src/main/java/blackjack/domain/Dealer.java @@ -4,12 +4,13 @@ import java.util.List; public class Dealer { + private static final String DEALER_NAME = "딜러"; private static final int MINIMUM_SCORE = 17; private final Player player; public Dealer() { - this.player = new Player(); + this.player = new Player(DEALER_NAME); } public void draw(Deck deck) { diff --git a/src/main/java/blackjack/domain/Player.java b/src/main/java/blackjack/domain/Player.java index feabcf8515c..0269d780779 100644 --- a/src/main/java/blackjack/domain/Player.java +++ b/src/main/java/blackjack/domain/Player.java @@ -4,9 +4,11 @@ import java.util.List; public class Player { - PlayerCards playerCards; + private final String name; // TODO: 감싸기 + private final PlayerCards playerCards; - public Player() { + public Player(String name) { + this.name = name; this.playerCards = PlayerCards.createEmptyCards(); } diff --git a/src/test/java/blackjack/domain/PlayerTest.java b/src/test/java/blackjack/domain/PlayerTest.java index 3b58591490c..f8315abce23 100644 --- a/src/test/java/blackjack/domain/PlayerTest.java +++ b/src/test/java/blackjack/domain/PlayerTest.java @@ -25,7 +25,7 @@ void drawCardTest() { List cards = List.of(new Card(DIAMOND, TWO), new Card(DIAMOND, THREE), new Card(DIAMOND, FOUR)); Deck deck = Deck.from(cards); - Player player = new Player(); + Player player = new Player("pedro"); player.draw(deck); List playerCards = player.getCards(); @@ -38,7 +38,7 @@ void calculateScoreTest() { List cards = List.of(new Card(DIAMOND, TWO), new Card(DIAMOND, THREE), new Card(DIAMOND, FOUR)); Deck deck = Deck.from(cards); - Player player = new Player(); + Player player = new Player("pedro"); for (int i = 0; i < cards.size(); i++) { player.draw(deck); } @@ -54,7 +54,7 @@ void calculateScoreTest() { void checkBustTest(List cards, boolean expected) { Deck deck = Deck.from(cards); - Player player = new Player(); + Player player = new Player("pedro"); for (int i = 0; i < cards.size(); i++) { player.draw(deck); } From b30c4ac5fac0cc5426e2cd0cc6f7fafaa54d7b69 Mon Sep 17 00:00:00 2001 From: HyungUk Ryu Date: Wed, 6 Mar 2024 15:02:08 +0900 Subject: [PATCH 22/59] =?UTF-8?q?test(dealerTest):=20=EB=94=9C=EB=9F=AC?= =?UTF-8?q?=EA=B0=80=20=EC=B9=B4=EB=93=9C=20=ED=95=9C=20=EC=9E=A5=EC=9D=84?= =?UTF-8?q?=20=EB=BD=91=EB=8A=94=20=EA=B8=B0=EB=8A=A5=20=ED=85=8C=EC=8A=A4?= =?UTF-8?q?=ED=8A=B8=20=EC=B6=94=EA=B0=80?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Co-authored-by: haiseong --- .../java/blackjack/domain/DealerTest.java | 20 ++++++++++++++++--- 1 file changed, 17 insertions(+), 3 deletions(-) diff --git a/src/test/java/blackjack/domain/DealerTest.java b/src/test/java/blackjack/domain/DealerTest.java index 15317c232de..03ca8598b38 100644 --- a/src/test/java/blackjack/domain/DealerTest.java +++ b/src/test/java/blackjack/domain/DealerTest.java @@ -13,19 +13,33 @@ 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; class DealerTest { + @Test + @DisplayName("딜러가 카드 한 장을 뽑는다.") + void drawCardTest() { + Deck deck = Deck.from(List.of( + new Card(DIAMOND, KING), new Card(DIAMOND, TWO), new Card(DIAMOND, FOUR) + )); + Dealer dealer = new Dealer(); + + dealer.draw(deck); + int score = dealer.getScore(); + assertThat(score).isEqualTo(10); + } + @ParameterizedTest @MethodSource("cardsAndScore") @DisplayName("자신의 현재 점수가 17점 이상이 될 때까지 추가로 카드를 받는다.") - void drawCardsUntilScoreBelow17(List cards, int expected) { + void drawCardsUntilScoreBelow17Test(List cards, int expected) { Deck deck = Deck.from(cards); Dealer dealer = new Dealer(); - dealer.draw(deck); + dealer.drawUntilExceedMinimum(deck); int score = dealer.getScore(); assertThat(score).isEqualTo(expected); } @@ -40,4 +54,4 @@ static Stream cardsAndScore() { new Card(DIAMOND, QUEEN)), 21) ); } -} \ No newline at end of file +} From 19446821b1844d6f6d3826a608a19306b998320d Mon Sep 17 00:00:00 2001 From: HyungUk Ryu Date: Wed, 6 Mar 2024 15:02:21 +0900 Subject: [PATCH 23/59] =?UTF-8?q?feat(dealer):=20=EB=94=9C=EB=9F=AC?= =?UTF-8?q?=EA=B0=80=20=EC=B9=B4=EB=93=9C=20=ED=95=9C=20=EC=9E=A5=EC=9D=84?= =?UTF-8?q?=20=EB=BD=91=EB=8A=94=20=EA=B8=B0=EB=8A=A5=20=EA=B5=AC=ED=98=84?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Co-authored-by: haiseong --- src/main/java/blackjack/domain/Dealer.java | 6 +++++- 1 file changed, 5 insertions(+), 1 deletion(-) diff --git a/src/main/java/blackjack/domain/Dealer.java b/src/main/java/blackjack/domain/Dealer.java index eae1332d76d..9351ab53a5a 100644 --- a/src/main/java/blackjack/domain/Dealer.java +++ b/src/main/java/blackjack/domain/Dealer.java @@ -14,8 +14,12 @@ public Dealer() { } public void draw(Deck deck) { + player.draw(deck); + } + + public void drawUntilExceedMinimum(Deck deck) { while (getScore() < MINIMUM_SCORE) { - player.draw(deck); + draw(deck); } } From 7053671fdc14487022a78d11c3ed3e13b9f883c8 Mon Sep 17 00:00:00 2001 From: HyungUk Ryu Date: Wed, 6 Mar 2024 15:44:08 +0900 Subject: [PATCH 24/59] =?UTF-8?q?feat(blackJackController):=20=EC=B4=88?= =?UTF-8?q?=EA=B8=B0=20=EA=B2=8C=EC=9E=84=20=EC=84=B8=ED=8C=85=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 Co-authored-by: haiseong --- src/main/java/blackjack/Application.java | 14 ++++++ .../controller/BlackJackController.java | 48 +++++++++++++++++++ src/main/java/blackjack/domain/Dealer.java | 16 ++++++- src/main/java/blackjack/domain/Deck.java | 2 + src/main/java/blackjack/domain/Player.java | 8 +++- src/main/java/blackjack/domain/card/Card.java | 8 ++++ .../java/blackjack/domain/card/Shape.java | 12 ++++- .../java/blackjack/domain/card/Value.java | 34 +++++++------ .../java/blackjack/domain/dto/PlayerDto.java | 11 +++++ src/main/java/blackjack/view/InputView.java | 15 ++++++ src/main/java/blackjack/view/OutputView.java | 36 ++++++++++++++ 11 files changed, 185 insertions(+), 19 deletions(-) create mode 100644 src/main/java/blackjack/Application.java create mode 100644 src/main/java/blackjack/controller/BlackJackController.java create mode 100644 src/main/java/blackjack/domain/dto/PlayerDto.java create mode 100644 src/main/java/blackjack/view/InputView.java create mode 100644 src/main/java/blackjack/view/OutputView.java diff --git a/src/main/java/blackjack/Application.java b/src/main/java/blackjack/Application.java new file mode 100644 index 00000000000..76839b84938 --- /dev/null +++ b/src/main/java/blackjack/Application.java @@ -0,0 +1,14 @@ +package blackjack; + +import blackjack.controller.BlackJackController; +import blackjack.view.InputView; +import blackjack.view.OutputView; + +public class Application { + public static void main(String[] args) { + InputView inputView = new InputView(); + OutputView outputView = new OutputView(); + BlackJackController blackJackController = new BlackJackController(inputView, outputView); + blackJackController.start(); + } +} diff --git a/src/main/java/blackjack/controller/BlackJackController.java b/src/main/java/blackjack/controller/BlackJackController.java new file mode 100644 index 00000000000..aa8336686bd --- /dev/null +++ b/src/main/java/blackjack/controller/BlackJackController.java @@ -0,0 +1,48 @@ +package blackjack.controller; + +import blackjack.domain.Dealer; +import blackjack.domain.Deck; +import blackjack.domain.Player; +import blackjack.domain.card.Card; +import blackjack.domain.dto.PlayerDto; +import blackjack.view.InputView; +import blackjack.view.OutputView; +import java.util.List; + +public class BlackJackController { + private final InputView inputView; + private final OutputView outputView; + + public BlackJackController(InputView inputView, OutputView outputView) { + this.inputView = inputView; + this.outputView = outputView; + } + + public void start() { + Deck deck = Deck.createShuffledDeck(); + + List playerNames = inputView.inputPlayerNames(); + List players = playerNames.stream() + .map(Player::new) + .toList(); + + for (Player player : players) { + player.draw(deck); + player.draw(deck); + } + + Dealer dealer = new Dealer(); + dealer.draw(deck); + dealer.draw(deck); + + outputView.printInitialMessage(playerNames); + + Card dealerCard = dealer.getFirstCard(); + outputView.printDealerInitialCard(dealerCard); + + List playerDtos = players.stream() + .map(PlayerDto::from) + .toList(); + outputView.printPlayerInitialCards(playerDtos); + } +} diff --git a/src/main/java/blackjack/domain/Dealer.java b/src/main/java/blackjack/domain/Dealer.java index 9351ab53a5a..e8b51f5573e 100644 --- a/src/main/java/blackjack/domain/Dealer.java +++ b/src/main/java/blackjack/domain/Dealer.java @@ -23,6 +23,10 @@ public void drawUntilExceedMinimum(Deck deck) { } } + public boolean isBusted() { + return player.isBusted(); + } + public List getCards() { return player.getCards(); } @@ -31,7 +35,15 @@ public int getScore() { return player.getScore(); } - public boolean isBusted() { - return player.isBusted(); + public Player getPlayer() { + return player; + } + + public Card getFirstCard() { + List cards = getCards(); + if (cards.isEmpty()) { + throw new IllegalStateException("아무 카드도 뽑지 않았습니다."); + } + return cards.get(0); } } diff --git a/src/main/java/blackjack/domain/Deck.java b/src/main/java/blackjack/domain/Deck.java index e20ccb3c4f5..88199f78f88 100644 --- a/src/main/java/blackjack/domain/Deck.java +++ b/src/main/java/blackjack/domain/Deck.java @@ -5,6 +5,7 @@ import blackjack.domain.card.Value; import java.util.ArrayList; import java.util.Arrays; +import java.util.Collections; import java.util.LinkedList; import java.util.List; @@ -28,6 +29,7 @@ public static Deck createShuffledDeck() { Arrays.stream(Value.values()) .forEach(value -> cards.add(new Card(shape, value))); } + Collections.shuffle(cards); return new Deck(cards); } diff --git a/src/main/java/blackjack/domain/Player.java b/src/main/java/blackjack/domain/Player.java index 0269d780779..9347459ee1f 100644 --- a/src/main/java/blackjack/domain/Player.java +++ b/src/main/java/blackjack/domain/Player.java @@ -17,6 +17,10 @@ public void draw(Deck deck) { playerCards.append(card); } + public boolean isBusted() { + return playerCards.isBusted(); + } + public List getCards() { return playerCards.getCards(); } @@ -25,7 +29,7 @@ public int getScore() { return playerCards.calculateScore(); } - public boolean isBusted() { - return playerCards.isBusted(); + public String getName() { + return name; } } diff --git a/src/main/java/blackjack/domain/card/Card.java b/src/main/java/blackjack/domain/card/Card.java index 0b7b2c05f4e..d5bfa66a956 100644 --- a/src/main/java/blackjack/domain/card/Card.java +++ b/src/main/java/blackjack/domain/card/Card.java @@ -8,4 +8,12 @@ public int getScore() { public boolean isAce() { return value == Value.ACE; } + + public String getShapeDescription() { + return shape.getDescription(); + } + + public String getValueDescription() { + return value.getDescription(); + } } diff --git a/src/main/java/blackjack/domain/card/Shape.java b/src/main/java/blackjack/domain/card/Shape.java index ee270ba85a8..fa388ed3eb3 100644 --- a/src/main/java/blackjack/domain/card/Shape.java +++ b/src/main/java/blackjack/domain/card/Shape.java @@ -1,5 +1,15 @@ package blackjack.domain.card; public enum Shape { - SPADE, HEART, DIAMOND, CLOVER + SPADE("스페이드"), HEART("하트"), DIAMOND("다이아몬드"), CLOVER("클로버"); + + final String description; + + Shape(String description) { + this.description = description; + } + + public String getDescription() { + return description; + } } diff --git a/src/main/java/blackjack/domain/card/Value.java b/src/main/java/blackjack/domain/card/Value.java index f91e38c56c2..344396d582d 100644 --- a/src/main/java/blackjack/domain/card/Value.java +++ b/src/main/java/blackjack/domain/card/Value.java @@ -1,27 +1,33 @@ package blackjack.domain.card; public enum Value { - ACE(11), - 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(11, "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"); final int score; + final String description; - Value(int score) { + Value(int score, String description) { this.score = score; + this.description = description; } public int getScore() { return score; } + + public String getDescription() { + return description; + } } diff --git a/src/main/java/blackjack/domain/dto/PlayerDto.java b/src/main/java/blackjack/domain/dto/PlayerDto.java new file mode 100644 index 00000000000..d24e84dd1d0 --- /dev/null +++ b/src/main/java/blackjack/domain/dto/PlayerDto.java @@ -0,0 +1,11 @@ +package blackjack.domain.dto; + +import blackjack.domain.Player; +import blackjack.domain.card.Card; +import java.util.List; + +public record PlayerDto(String name, List cards) { + public static PlayerDto from(Player player) { + return new PlayerDto(player.getName(), player.getCards()); + } +} diff --git a/src/main/java/blackjack/view/InputView.java b/src/main/java/blackjack/view/InputView.java new file mode 100644 index 00000000000..12481aea7ca --- /dev/null +++ b/src/main/java/blackjack/view/InputView.java @@ -0,0 +1,15 @@ +package blackjack.view; + + +import java.util.List; +import java.util.Scanner; + +public class InputView { + private final Scanner scanner = new Scanner(System.in); + + public List inputPlayerNames() { + System.out.println("게임에 참여할 사람의 이름을 입력하세요.(쉼표 기준으로 분리)"); + String line = scanner.nextLine(); + return List.of(line.split(",")); + } +} diff --git a/src/main/java/blackjack/view/OutputView.java b/src/main/java/blackjack/view/OutputView.java new file mode 100644 index 00000000000..4205ad9b698 --- /dev/null +++ b/src/main/java/blackjack/view/OutputView.java @@ -0,0 +1,36 @@ +package blackjack.view; + +import blackjack.domain.card.Card; +import blackjack.domain.dto.PlayerDto; +import java.util.List; + +public class OutputView { + public void printPlayerInitialCards(List playerDtos) { + StringBuilder stringBuilder = new StringBuilder(); + + playerDtos.forEach(playerDto -> + stringBuilder.append(playerDto.name()) + .append("카드: ") + .append(generateCardDescription(playerDto.cards())) + .append(System.lineSeparator()) + ); + + System.out.println(stringBuilder); + } + + public void printDealerInitialCard(Card dealerCard) { + String card = dealerCard.getValueDescription() + dealerCard.getShapeDescription(); + System.out.println("딜러: " + card); + } + + private String generateCardDescription(List cards) { + List list = cards.stream() + .map(card -> (card.getValueDescription()) + (card.getShapeDescription())) + .toList(); + return String.join(", ", list); + } + + public void printInitialMessage(List playerNames) { + System.out.println("딜러와 " + String.join(", ", playerNames) + " 에게 2장을 나누었습니다."); + } +} From 2901c953c89ab17db8e7905e643434ec57e65d23 Mon Sep 17 00:00:00 2001 From: HyungUk Ryu Date: Wed, 6 Mar 2024 17:11:02 +0900 Subject: [PATCH 25/59] =?UTF-8?q?feat(blackJackController):=20=EC=B6=94?= =?UTF-8?q?=EA=B0=80=20=EC=B9=B4=EB=93=9C=20=EB=B6=84=EB=B0=B0=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 Co-authored-by: haiseong --- docs/README.md | 5 +- .../controller/BlackJackController.java | 56 ++++++++++++++++--- src/main/java/blackjack/domain/Dealer.java | 6 ++ .../blackjack/domain/dto/PlayerResultDto.java | 19 +++++++ src/main/java/blackjack/view/InputView.java | 5 ++ src/main/java/blackjack/view/OutputView.java | 31 ++++++++++ 6 files changed, 110 insertions(+), 12 deletions(-) create mode 100644 src/main/java/blackjack/domain/dto/PlayerResultDto.java diff --git a/docs/README.md b/docs/README.md index 6bc365d7b7d..6784a697f66 100644 --- a/docs/README.md +++ b/docs/README.md @@ -26,8 +26,5 @@ - [x] 자신의 버스트 여부를 판단할 수 있다. - [x] 자신의 현재 점수가 17점 이상이 될 때까지 추가로 카드를 받는다. -### 블랙잭 게임 +### 게임 결과 계산 - 플레이어들의 승리/패배/무승부 여부를 계산할 수 있다. -- 특정 플레이어에게 카드를 줄 수 있다. -- 딜러가 17점 이상이 되도록 카드를 받게 할 수 있다. -- 특정 플레이어의 버스트 여부를 판단할 수 있다. diff --git a/src/main/java/blackjack/controller/BlackJackController.java b/src/main/java/blackjack/controller/BlackJackController.java index aa8336686bd..06cb746d55a 100644 --- a/src/main/java/blackjack/controller/BlackJackController.java +++ b/src/main/java/blackjack/controller/BlackJackController.java @@ -5,11 +5,13 @@ import blackjack.domain.Player; import blackjack.domain.card.Card; import blackjack.domain.dto.PlayerDto; +import blackjack.domain.dto.PlayerResultDto; import blackjack.view.InputView; import blackjack.view.OutputView; import java.util.List; public class BlackJackController { + public static final int INITIAL_CARDS_COUNT = 2; private final InputView inputView; private final OutputView outputView; @@ -19,24 +21,52 @@ public BlackJackController(InputView inputView, OutputView outputView) { } public void start() { - Deck deck = Deck.createShuffledDeck(); - + Dealer dealer = new Dealer(); List playerNames = inputView.inputPlayerNames(); List players = playerNames.stream() .map(Player::new) .toList(); + Deck deck = Deck.createShuffledDeck(); + doInitialDraw(dealer, players, deck); + + outputView.printInitialMessage(playerNames); + printInitialCards(dealer, players); for (Player player : players) { - player.draw(deck); - player.draw(deck); + while (!player.isBusted()) { + String drawChoice = inputView.inputDrawChoice(player.getName()); + if (drawChoice.equals("n")) { + break; + } + player.draw(deck); + outputView.printPlayerCard(PlayerDto.from(player)); + } } - Dealer dealer = new Dealer(); - dealer.draw(deck); - dealer.draw(deck); + dealer.drawUntilExceedMinimum(deck); + printExtraDealerDraw(dealer); - outputView.printInitialMessage(playerNames); + printResult(dealer, players); + } + + private void printResult(Dealer dealer, List players) { + PlayerResultDto dealerResult = PlayerResultDto.from(dealer.getPlayer()); + List playerResultDtos = players.stream() + .map(PlayerResultDto::from) + .toList(); + outputView.printResult(dealerResult, playerResultDtos); + } + + private void printExtraDealerDraw(Dealer dealer) { + int dealerCardsCount = dealer.getCardsCount(); + int extraDrawCount = dealerCardsCount - INITIAL_CARDS_COUNT; + if (extraDrawCount > 0) { + outputView.printExtraDealerDraw(extraDrawCount); + } + } + + private void printInitialCards(Dealer dealer, List players) { Card dealerCard = dealer.getFirstCard(); outputView.printDealerInitialCard(dealerCard); @@ -45,4 +75,14 @@ public void start() { .toList(); outputView.printPlayerInitialCards(playerDtos); } + + private static void doInitialDraw(Dealer dealer, List players, Deck deck) { + for (Player player : players) { + player.draw(deck); + player.draw(deck); + } + + dealer.draw(deck); + dealer.draw(deck); + } } diff --git a/src/main/java/blackjack/domain/Dealer.java b/src/main/java/blackjack/domain/Dealer.java index e8b51f5573e..eeddf17269f 100644 --- a/src/main/java/blackjack/domain/Dealer.java +++ b/src/main/java/blackjack/domain/Dealer.java @@ -40,10 +40,16 @@ public Player getPlayer() { } public Card getFirstCard() { + // TODO: 메시지 보내기 List cards = getCards(); if (cards.isEmpty()) { throw new IllegalStateException("아무 카드도 뽑지 않았습니다."); } return cards.get(0); } + + public int getCardsCount() { + // TODO: 메시지 보내기 + return player.getCards().size(); + } } diff --git a/src/main/java/blackjack/domain/dto/PlayerResultDto.java b/src/main/java/blackjack/domain/dto/PlayerResultDto.java new file mode 100644 index 00000000000..1bbd2ca493b --- /dev/null +++ b/src/main/java/blackjack/domain/dto/PlayerResultDto.java @@ -0,0 +1,19 @@ +package blackjack.domain.dto; + +import blackjack.domain.Player; +import blackjack.domain.card.Card; +import java.util.List; + +public record PlayerResultDto(PlayerDto playerDto, int score) { + public static PlayerResultDto from(Player player) { + return new PlayerResultDto(PlayerDto.from(player), player.getScore()); + } + + public String getName() { + return playerDto.name(); + } + + public List getCards() { + return playerDto.cards(); + } +} diff --git a/src/main/java/blackjack/view/InputView.java b/src/main/java/blackjack/view/InputView.java index 12481aea7ca..604b81e76b2 100644 --- a/src/main/java/blackjack/view/InputView.java +++ b/src/main/java/blackjack/view/InputView.java @@ -12,4 +12,9 @@ public List inputPlayerNames() { String line = scanner.nextLine(); return List.of(line.split(",")); } + + public String inputDrawChoice(String playerName) { + System.out.println(playerName + "는 한장의 카드를 더 받겠습니까? (y/n)"); + return scanner.nextLine(); + } } diff --git a/src/main/java/blackjack/view/OutputView.java b/src/main/java/blackjack/view/OutputView.java index 4205ad9b698..b58609ea4f1 100644 --- a/src/main/java/blackjack/view/OutputView.java +++ b/src/main/java/blackjack/view/OutputView.java @@ -2,6 +2,7 @@ import blackjack.domain.card.Card; import blackjack.domain.dto.PlayerDto; +import blackjack.domain.dto.PlayerResultDto; import java.util.List; public class OutputView { @@ -33,4 +34,34 @@ private String generateCardDescription(List cards) { public void printInitialMessage(List playerNames) { System.out.println("딜러와 " + String.join(", ", playerNames) + " 에게 2장을 나누었습니다."); } + + public void printPlayerCard(PlayerDto playerDto) { + String name = playerDto.name(); + System.out.println(name + "카드: " + generateCardDescription(playerDto.cards())); + } + + public void printExtraDealerDraw(int extraDrawCount) { + System.out.println("딜러는 16이하라 " + extraDrawCount + "장의 카드를 더 받았습니다."); + } + + public void printResult(PlayerResultDto dealerResult, List playerResultDtos) { + StringBuilder stringBuilder = new StringBuilder(); + + stringBuilder.append("딜러 카드: ") + .append(generateCardDescription(dealerResult.getCards())) + .append(" - 결과: ") + .append(dealerResult.score()) + .append(System.lineSeparator()); + + playerResultDtos.forEach(playerResultDto -> + stringBuilder.append(playerResultDto.getName()) + .append("카드: ") + .append(generateCardDescription(playerResultDto.getCards())) + .append(" - 결과: ") + .append(playerResultDto.score()) + .append(System.lineSeparator()) + ); + + System.out.println(stringBuilder); + } } From 5421c5300f2a6c6159fac8bc1fae15a4ef8bd6e5 Mon Sep 17 00:00:00 2001 From: HyungUk Ryu Date: Thu, 7 Mar 2024 12:00:08 +0900 Subject: [PATCH 26/59] =?UTF-8?q?test(gameResultBoardTest):=20=EA=B2=8C?= =?UTF-8?q?=EC=9E=84=EC=9D=98=EC=8A=B9=EB=A6=AC/=ED=8C=A8=EB=B0=B0/?= =?UTF-8?q?=EB=AC=B4=EC=8A=B9=EB=B6=80=20=EC=97=AC=EB=B6=80=EB=A5=BC=20?= =?UTF-8?q?=EA=B3=84=EC=82=B0=ED=95=98=EB=8A=94=20=ED=85=8C=EC=8A=A4?= =?UTF-8?q?=ED=8A=B8=20=EC=B6=94=EA=B0=80?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Co-authored-by: haiseong --- .../java/blackjack/domain/GameResult.java | 5 ++ .../blackjack/domain/GameResultBoardTest.java | 63 +++++++++++++++++++ 2 files changed, 68 insertions(+) create mode 100644 src/main/java/blackjack/domain/GameResult.java create mode 100644 src/test/java/blackjack/domain/GameResultBoardTest.java diff --git a/src/main/java/blackjack/domain/GameResult.java b/src/main/java/blackjack/domain/GameResult.java new file mode 100644 index 00000000000..8b894faa782 --- /dev/null +++ b/src/main/java/blackjack/domain/GameResult.java @@ -0,0 +1,5 @@ +package blackjack.domain; + +public enum GameResult { + WIN, LOSE, DRAW +} diff --git a/src/test/java/blackjack/domain/GameResultBoardTest.java b/src/test/java/blackjack/domain/GameResultBoardTest.java new file mode 100644 index 00000000000..7667ad58a2c --- /dev/null +++ b/src/test/java/blackjack/domain/GameResultBoardTest.java @@ -0,0 +1,63 @@ +package blackjack.domain; + +import static blackjack.domain.card.Shape.DIAMOND; +import static blackjack.domain.card.Shape.SPADE; +import static blackjack.domain.card.Value.ACE; +import static blackjack.domain.card.Value.EIGHT; +import static blackjack.domain.card.Value.KING; +import static blackjack.domain.card.Value.NINE; +import static blackjack.domain.card.Value.QUEEN; +import static blackjack.domain.card.Value.TEN; +import static org.assertj.core.api.Assertions.assertThat; + +import blackjack.domain.card.Card; +import java.util.ArrayList; +import java.util.List; +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 GameResultBoardTest { + @ParameterizedTest + @MethodSource("playerAndGameResult") + @DisplayName("딜러와 플레이어들을 전달받아 승리/패배/무승부 여부를 계산한다.") + void calculateGameResultTest(List playerCards, GameResult expected) { + List cards = new ArrayList<>(List.of(new Card(DIAMOND, KING), new Card(DIAMOND, NINE))); + cards.addAll(playerCards); + Deck deck = Deck.from(cards); + + Player player = new Player("testPlayer"); + Dealer dealer = new Dealer(); + drawCards(dealer, player, deck); + + GameResultBoard gameResultBoard = new GameResultBoard(dealer, List.of(player)); + + assertThat(gameResultBoard.getGameResult(player)).isEqualTo(expected); + } + + static Stream playerAndGameResult() { + return Stream.of( + Arguments.arguments( + List.of(new Card(DIAMOND, ACE), new Card(DIAMOND, QUEEN)), GameResult.WIN + ), + Arguments.arguments( + List.of(new Card(SPADE, ACE), new Card(SPADE, QUEEN)), GameResult.WIN + ), + Arguments.arguments( + List.of(new Card(SPADE, KING), new Card(SPADE, NINE)), GameResult.DRAW + ), + Arguments.arguments( + List.of(new Card(SPADE, TEN), new Card(SPADE, EIGHT)), GameResult.LOSE + ) + ); + } + + private static void drawCards(Dealer dealer, Player player, Deck deck) { + dealer.draw(deck); + dealer.draw(deck); + player.draw(deck); + player.draw(deck); + } +} \ No newline at end of file From 53eedb500872670a8998db00783adf3caa7946c8 Mon Sep 17 00:00:00 2001 From: HyungUk Ryu Date: Thu, 7 Mar 2024 15:13:45 +0900 Subject: [PATCH 27/59] =?UTF-8?q?feat(gameResultBoard):=20=EA=B2=8C?= =?UTF-8?q?=EC=9E=84=20=EA=B2=B0=EA=B3=BC=EB=A5=BC=20=EA=B3=84=EC=82=B0?= =?UTF-8?q?=ED=95=98=EB=8A=94=20=EA=B8=B0=EB=8A=A5=20=EA=B5=AC=ED=98=84?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Co-authored-by: haiseong --- docs/README.md | 2 +- .../blackjack/domain/GameResultBoard.java | 33 +++++++++++++++++++ 2 files changed, 34 insertions(+), 1 deletion(-) create mode 100644 src/main/java/blackjack/domain/GameResultBoard.java diff --git a/docs/README.md b/docs/README.md index 6784a697f66..fa3bb712048 100644 --- a/docs/README.md +++ b/docs/README.md @@ -27,4 +27,4 @@ - [x] 자신의 현재 점수가 17점 이상이 될 때까지 추가로 카드를 받는다. ### 게임 결과 계산 -- 플레이어들의 승리/패배/무승부 여부를 계산할 수 있다. +- [x] 플레이어들의 승리/패배/무승부 여부를 계산할 수 있다. diff --git a/src/main/java/blackjack/domain/GameResultBoard.java b/src/main/java/blackjack/domain/GameResultBoard.java new file mode 100644 index 00000000000..425f87f0cfb --- /dev/null +++ b/src/main/java/blackjack/domain/GameResultBoard.java @@ -0,0 +1,33 @@ +package blackjack.domain; + +import java.util.HashMap; +import java.util.List; +import java.util.Map; + +public class GameResultBoard { + private final Map resultBoard = new HashMap<>(); + + public GameResultBoard(Dealer dealer, List players) { + int dealerScore = dealer.getScore(); + for (Player player : players) { + String playerName = player.getName(); + int playerScore = player.getScore(); + GameResult gameResult = calculateGameResult(playerScore, dealerScore); + resultBoard.put(playerName, gameResult); + } + } + + private GameResult calculateGameResult(int playerScore, int dealerScore) { + if (playerScore > dealerScore) { + return GameResult.WIN; + } + if (playerScore < dealerScore) { + return GameResult.LOSE; + } + return GameResult.DRAW; + } + + public GameResult getGameResult(Player player) { + return resultBoard.get(player.getName()); + } +} From 74a5116d9ec507b9a19211aa6eef8fca47e6056c Mon Sep 17 00:00:00 2001 From: HyungUk Ryu Date: Thu, 7 Mar 2024 15:41:39 +0900 Subject: [PATCH 28/59] =?UTF-8?q?test(gameResultBoardTest):=20=EB=94=9C?= =?UTF-8?q?=EB=9F=AC=EC=9D=98=20=EC=A0=84=EC=A0=81=EC=9D=84=20=EA=B3=84?= =?UTF-8?q?=EC=82=B0=ED=95=98=EB=8A=94=20=ED=85=8C=EC=8A=A4=ED=8A=B8=20?= =?UTF-8?q?=EC=BD=94=EB=93=9C=20=EC=B6=94=EA=B0=80?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Co-authored-by: haiseong --- .../blackjack/domain/GameResultBoardTest.java | 58 ++++++++++++++++--- 1 file changed, 50 insertions(+), 8 deletions(-) diff --git a/src/test/java/blackjack/domain/GameResultBoardTest.java b/src/test/java/blackjack/domain/GameResultBoardTest.java index 7667ad58a2c..920a5944156 100644 --- a/src/test/java/blackjack/domain/GameResultBoardTest.java +++ b/src/test/java/blackjack/domain/GameResultBoardTest.java @@ -9,12 +9,15 @@ import static blackjack.domain.card.Value.QUEEN; import static blackjack.domain.card.Value.TEN; import static org.assertj.core.api.Assertions.assertThat; +import static org.junit.jupiter.api.Assertions.assertAll; import blackjack.domain.card.Card; import java.util.ArrayList; import java.util.List; +import java.util.Map; 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; @@ -28,9 +31,10 @@ void calculateGameResultTest(List playerCards, GameResult expected) { cards.addAll(playerCards); Deck deck = Deck.from(cards); - Player player = new Player("testPlayer"); Dealer dealer = new Dealer(); - drawCards(dealer, player, deck); + giveCardToPlayer(dealer.getPlayer(), deck, 2); + Player player = new Player("testPlayer"); + giveCardToPlayer(player, deck, 2); GameResultBoard gameResultBoard = new GameResultBoard(dealer, List.of(player)); @@ -54,10 +58,48 @@ static Stream playerAndGameResult() { ); } - private static void drawCards(Dealer dealer, Player player, Deck deck) { - dealer.draw(deck); - dealer.draw(deck); - player.draw(deck); - player.draw(deck); + @Test + @DisplayName("딜러의 전적을 반환할 수 있다.") + void calculateDealerResultTest() { + List cards = generateCards(); + Deck deck = Deck.from(cards); + + Dealer dealer = new Dealer(); + giveCardToPlayer(dealer.getPlayer(), deck, 2); + + List players = generatePlayers(); + players.forEach(player -> giveCardToPlayer(player, deck, 2)); + + GameResultBoard gameResultBoard = new GameResultBoard(dealer, players); + Map dealerResult = gameResultBoard.getDealerResult(); + + assertAll( + () -> assertThat(dealerResult).containsEntry(GameResult.WIN, 1), + () -> assertThat(dealerResult).containsEntry(GameResult.DRAW, 1), + () -> assertThat(dealerResult).containsEntry(GameResult.LOSE, 2) + ); + } + + private List generateCards() { + return List.of( + new Card(DIAMOND, KING), new Card(DIAMOND, NINE), // Dealer + new Card(DIAMOND, ACE), new Card(DIAMOND, QUEEN), // dealer lose + new Card(SPADE, ACE), new Card(SPADE, QUEEN), // dealer lose + new Card(SPADE, KING), new Card(SPADE, NINE), // draw + new Card(SPADE, TEN), new Card(SPADE, EIGHT) // dealer win + ); + } + + private List generatePlayers() { + List playerNames = List.of("loki", "pedro", "poke", "alpaca"); + return playerNames.stream() + .map(Player::new) + .toList(); + } + + private void giveCardToPlayer(Player player, Deck deck, int drawAmount) { + for (int i = 0; i < drawAmount; i++) { + player.draw(deck); + } } -} \ No newline at end of file +} From 308d0fa3912757015346a10445310decacf384bb Mon Sep 17 00:00:00 2001 From: HyungUk Ryu Date: Thu, 7 Mar 2024 16:10:57 +0900 Subject: [PATCH 29/59] =?UTF-8?q?feat(gameResultBoard):=20=EB=94=9C?= =?UTF-8?q?=EB=9F=AC=EC=9D=98=20=EA=B2=B0=EA=B3=BC=EB=A5=BC=20=EA=B3=84?= =?UTF-8?q?=EC=82=B0=ED=95=98=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 Co-authored-by: haiseong --- docs/README.md | 1 + .../blackjack/domain/GameResultBoard.java | 26 +++++++++++++++++++ 2 files changed, 27 insertions(+) diff --git a/docs/README.md b/docs/README.md index fa3bb712048..461f62efe6e 100644 --- a/docs/README.md +++ b/docs/README.md @@ -28,3 +28,4 @@ ### 게임 결과 계산 - [x] 플레이어들의 승리/패배/무승부 여부를 계산할 수 있다. +- [x] 딜러의 전적을 계산할 수 있다. diff --git a/src/main/java/blackjack/domain/GameResultBoard.java b/src/main/java/blackjack/domain/GameResultBoard.java index 425f87f0cfb..96e045d5f6d 100644 --- a/src/main/java/blackjack/domain/GameResultBoard.java +++ b/src/main/java/blackjack/domain/GameResultBoard.java @@ -30,4 +30,30 @@ private GameResult calculateGameResult(int playerScore, int dealerScore) { public GameResult getGameResult(Player player) { return resultBoard.get(player.getName()); } + + public Map getDealerResult() { + return Map.of( + GameResult.WIN, getDealerWinCount(), + GameResult.DRAW, getDealerDrawCount(), + GameResult.LOSE, getDealerLoseCount() + ); + } + + private int getDealerWinCount() { + return (int) resultBoard.values().stream() + .filter(playerResult -> playerResult.equals(GameResult.LOSE)) + .count(); + } + + private int getDealerLoseCount() { + return (int) resultBoard.values().stream() + .filter(playerResult -> playerResult.equals(GameResult.WIN)) + .count(); + } + + private int getDealerDrawCount() { + return (int) resultBoard.values().stream() + .filter(playerResult -> playerResult.equals(GameResult.DRAW)) + .count(); + } } From cd02e7b87c089245e87e51c38a9aa982b64281e1 Mon Sep 17 00:00:00 2001 From: HyungUk Ryu Date: Thu, 7 Mar 2024 17:12:41 +0900 Subject: [PATCH 30/59] =?UTF-8?q?feat(blackJackController):=20=EA=B2=8C?= =?UTF-8?q?=EC=9E=84=20=EA=B2=B0=EA=B3=BC=20=EC=B6=9C=EB=A0=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 Co-authored-by: haiseong --- .../controller/BlackJackController.java | 17 ++++++++++--- .../java/blackjack/domain/GameResult.java | 14 ++++++++++- .../blackjack/domain/GameResultBoard.java | 7 ++++++ src/main/java/blackjack/view/OutputView.java | 24 ++++++++++++++----- 4 files changed, 52 insertions(+), 10 deletions(-) diff --git a/src/main/java/blackjack/controller/BlackJackController.java b/src/main/java/blackjack/controller/BlackJackController.java index 06cb746d55a..1c9963867f1 100644 --- a/src/main/java/blackjack/controller/BlackJackController.java +++ b/src/main/java/blackjack/controller/BlackJackController.java @@ -2,6 +2,7 @@ import blackjack.domain.Dealer; import blackjack.domain.Deck; +import blackjack.domain.GameResultBoard; import blackjack.domain.Player; import blackjack.domain.card.Card; import blackjack.domain.dto.PlayerDto; @@ -46,16 +47,26 @@ public void start() { dealer.drawUntilExceedMinimum(deck); printExtraDealerDraw(dealer); - printResult(dealer, players); + printCardStatus(dealer, players); + printGameResult(dealer, players); } - private void printResult(Dealer dealer, List players) { + private void printGameResult(Dealer dealer, List players) { + GameResultBoard gameResultBoard = new GameResultBoard(dealer, players); + + outputView.printDealerResult(gameResultBoard.getDealerResult()); + for (Player player : players) { + outputView.printPlayerResult(player.getName(), gameResultBoard.getGameResult(player)); + } + } + + private void printCardStatus(Dealer dealer, List players) { PlayerResultDto dealerResult = PlayerResultDto.from(dealer.getPlayer()); List playerResultDtos = players.stream() .map(PlayerResultDto::from) .toList(); - outputView.printResult(dealerResult, playerResultDtos); + outputView.printCardStatus(dealerResult, playerResultDtos); } private void printExtraDealerDraw(Dealer dealer) { diff --git a/src/main/java/blackjack/domain/GameResult.java b/src/main/java/blackjack/domain/GameResult.java index 8b894faa782..c94d9aaae39 100644 --- a/src/main/java/blackjack/domain/GameResult.java +++ b/src/main/java/blackjack/domain/GameResult.java @@ -1,5 +1,17 @@ package blackjack.domain; public enum GameResult { - WIN, LOSE, DRAW + WIN("승"), + LOSE("패"), + DRAW("무"); + + private final String description; + + GameResult(String description) { + this.description = description; + } + + public String getDescription() { + return description; + } } diff --git a/src/main/java/blackjack/domain/GameResultBoard.java b/src/main/java/blackjack/domain/GameResultBoard.java index 96e045d5f6d..671157324f2 100644 --- a/src/main/java/blackjack/domain/GameResultBoard.java +++ b/src/main/java/blackjack/domain/GameResultBoard.java @@ -18,6 +18,13 @@ public GameResultBoard(Dealer dealer, List players) { } private GameResult calculateGameResult(int playerScore, int dealerScore) { + if (playerScore > 21) { + return GameResult.LOSE; + } + if (dealerScore > 21) { + return GameResult.WIN; + } + if (playerScore > dealerScore) { return GameResult.WIN; } diff --git a/src/main/java/blackjack/view/OutputView.java b/src/main/java/blackjack/view/OutputView.java index b58609ea4f1..9027d38b317 100644 --- a/src/main/java/blackjack/view/OutputView.java +++ b/src/main/java/blackjack/view/OutputView.java @@ -1,19 +1,21 @@ package blackjack.view; +import blackjack.domain.GameResult; import blackjack.domain.card.Card; import blackjack.domain.dto.PlayerDto; import blackjack.domain.dto.PlayerResultDto; import java.util.List; +import java.util.Map; public class OutputView { public void printPlayerInitialCards(List playerDtos) { StringBuilder stringBuilder = new StringBuilder(); playerDtos.forEach(playerDto -> - stringBuilder.append(playerDto.name()) - .append("카드: ") - .append(generateCardDescription(playerDto.cards())) - .append(System.lineSeparator()) + stringBuilder.append(playerDto.name()) + .append("카드: ") + .append(generateCardDescription(playerDto.cards())) + .append(System.lineSeparator()) ); System.out.println(stringBuilder); @@ -32,7 +34,7 @@ private String generateCardDescription(List cards) { } public void printInitialMessage(List playerNames) { - System.out.println("딜러와 " + String.join(", ", playerNames) + " 에게 2장을 나누었습니다."); + System.out.println("딜러와 " + String.join(", ", playerNames) + " 에게 2장을 나누었습니다."); } public void printPlayerCard(PlayerDto playerDto) { @@ -44,7 +46,7 @@ public void printExtraDealerDraw(int extraDrawCount) { System.out.println("딜러는 16이하라 " + extraDrawCount + "장의 카드를 더 받았습니다."); } - public void printResult(PlayerResultDto dealerResult, List playerResultDtos) { + public void printCardStatus(PlayerResultDto dealerResult, List playerResultDtos) { StringBuilder stringBuilder = new StringBuilder(); stringBuilder.append("딜러 카드: ") @@ -64,4 +66,14 @@ public void printResult(PlayerResultDto dealerResult, List play System.out.println(stringBuilder); } + + public void printDealerResult(Map dealerResult) { + System.out.println("## 최종 승패"); + System.out.println("딜러: " + dealerResult.get(GameResult.WIN) + "승" + dealerResult.get(GameResult.LOSE) + "패" + + dealerResult.get(GameResult.DRAW) + "무"); + } + + public void printPlayerResult(String playerName, GameResult gameResult) { + System.out.println(playerName + ": " + gameResult.getDescription()); + } } From 04573f138ef0d5375caf2c9789293f788831ec6b Mon Sep 17 00:00:00 2001 From: HyungUk Ryu Date: Thu, 7 Mar 2024 19:43:52 +0900 Subject: [PATCH 31/59] =?UTF-8?q?test(playersTest):=20=EC=A4=91=EB=B3=B5?= =?UTF-8?q?=EB=90=9C=20=EC=9D=B4=EB=A6=84=EC=9D=B4=20=EC=9E=88=EC=9C=BC?= =?UTF-8?q?=EB=A9=B4=20=EC=98=88=EC=99=B8=EA=B0=80=20=EB=B0=9C=EC=83=9D?= =?UTF-8?q?=ED=95=98=EB=8A=94=20=ED=85=8C=EC=8A=A4=ED=8A=B8=20=EC=B6=94?= =?UTF-8?q?=EA=B0=80?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Co-authored-by: haiseong --- docs/README.md | 1 + .../java/blackjack/domain/PlayersTest.java | 20 +++++++++++++++++++ 2 files changed, 21 insertions(+) create mode 100644 src/test/java/blackjack/domain/PlayersTest.java diff --git a/docs/README.md b/docs/README.md index 461f62efe6e..d3515932302 100644 --- a/docs/README.md +++ b/docs/README.md @@ -19,6 +19,7 @@ - [x] 덱으로 부터 카드 한장을 받아올 수 있다. - [x] 자신의 점수를 계산할 수 있다. - [x] 자신의 버스트 여부를 판단할 수 있다. +- [] 중복된 이름이 있으면 예외가 발생한다. ### 딜러 - [x] 덱으로 부터 카드 한장을 받아올 수 있다. diff --git a/src/test/java/blackjack/domain/PlayersTest.java b/src/test/java/blackjack/domain/PlayersTest.java new file mode 100644 index 00000000000..ab9b2f5048d --- /dev/null +++ b/src/test/java/blackjack/domain/PlayersTest.java @@ -0,0 +1,20 @@ +package blackjack.domain; + +import static org.assertj.core.api.Assertions.assertThatThrownBy; + +import java.util.List; +import org.junit.jupiter.api.DisplayName; +import org.junit.jupiter.api.Test; + +class PlayersTest { + + @Test + @DisplayName("중복된 이름이 있으면 예외가 발생한다.") + void duplicatedNamesTest() { + List names = List.of("loki", "pedro", "loki"); + + assertThatThrownBy(() -> Players.from(names)) + .isInstanceOf(IllegalArgumentException.class) + .hasMessage("중복된 이름이 존재합니다."); + } +} From 215fd5c0e979949e1df5adac23c5aefd2c53fe9d Mon Sep 17 00:00:00 2001 From: HyungUk Ryu Date: Thu, 7 Mar 2024 19:55:09 +0900 Subject: [PATCH 32/59] =?UTF-8?q?feat(players):=20=EC=A4=91=EB=B3=B5?= =?UTF-8?q?=EB=90=9C=20=ED=94=8C=EB=A0=88=EC=9D=B4=EC=96=B4=20=EC=9D=B4?= =?UTF-8?q?=EB=A6=84=20=EA=B2=80=EC=82=AC?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Co-authored-by: haiseong --- docs/README.md | 2 +- src/main/java/blackjack/domain/Players.java | 35 +++++++++++++++++++++ 2 files changed, 36 insertions(+), 1 deletion(-) create mode 100644 src/main/java/blackjack/domain/Players.java diff --git a/docs/README.md b/docs/README.md index d3515932302..79f53e860df 100644 --- a/docs/README.md +++ b/docs/README.md @@ -19,7 +19,7 @@ - [x] 덱으로 부터 카드 한장을 받아올 수 있다. - [x] 자신의 점수를 계산할 수 있다. - [x] 자신의 버스트 여부를 판단할 수 있다. -- [] 중복된 이름이 있으면 예외가 발생한다. +- [x] 중복된 이름이 있으면 예외가 발생한다. ### 딜러 - [x] 덱으로 부터 카드 한장을 받아올 수 있다. diff --git a/src/main/java/blackjack/domain/Players.java b/src/main/java/blackjack/domain/Players.java new file mode 100644 index 00000000000..a747266b1f5 --- /dev/null +++ b/src/main/java/blackjack/domain/Players.java @@ -0,0 +1,35 @@ +package blackjack.domain; + +import java.util.List; + +public class Players { + private final List players; + + public Players(List players) { + validate(players); + this.players = players; + } + + private static void validate(List players) { + if (duplicatedNameExist(players)) { + throw new IllegalArgumentException("중복된 이름이 존재합니다."); + } + } + + private static boolean duplicatedNameExist(List players) { + int distinctCount = (int) players.stream() + .map(Player::getName) + .distinct() + .count(); + + return distinctCount != players.size(); + } + + public static Players from(List names) { + List players = names.stream() + .map(Player::new) + .toList(); + + return new Players(players); + } +} From 4aa63277614f35a21b200992db05295bc2fece27 Mon Sep 17 00:00:00 2001 From: HyungUk Ryu Date: Thu, 7 Mar 2024 20:07:52 +0900 Subject: [PATCH 33/59] =?UTF-8?q?refactor(blackJackController):=20?= =?UTF-8?q?=EC=97=AC=EB=9F=AC=20=EC=82=AC=EC=9A=A9=EC=9E=90=EB=93=A4?= =?UTF-8?q?=EC=9D=84=20=ED=95=98=EB=82=98=EC=9D=98=20=EA=B0=9D=EC=B2=B4?= =?UTF-8?q?=EB=A1=9C=20=EA=B4=80=EB=A6=AC=ED=95=98=EB=8F=84=EB=A1=9D=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 Co-authored-by: haiseong --- .../controller/BlackJackController.java | 58 ++++++++++--------- src/main/java/blackjack/domain/Players.java | 4 ++ 2 files changed, 36 insertions(+), 26 deletions(-) diff --git a/src/main/java/blackjack/controller/BlackJackController.java b/src/main/java/blackjack/controller/BlackJackController.java index 1c9963867f1..c91e0f95db4 100644 --- a/src/main/java/blackjack/controller/BlackJackController.java +++ b/src/main/java/blackjack/controller/BlackJackController.java @@ -4,6 +4,7 @@ import blackjack.domain.Deck; import blackjack.domain.GameResultBoard; import blackjack.domain.Player; +import blackjack.domain.Players; import blackjack.domain.card.Card; import blackjack.domain.dto.PlayerDto; import blackjack.domain.dto.PlayerResultDto; @@ -24,24 +25,15 @@ public BlackJackController(InputView inputView, OutputView outputView) { public void start() { Dealer dealer = new Dealer(); List playerNames = inputView.inputPlayerNames(); - List players = playerNames.stream() - .map(Player::new) - .toList(); + Players players = Players.from(playerNames); Deck deck = Deck.createShuffledDeck(); doInitialDraw(dealer, players, deck); - outputView.printInitialMessage(playerNames); printInitialCards(dealer, players); - for (Player player : players) { - while (!player.isBusted()) { - String drawChoice = inputView.inputDrawChoice(player.getName()); - if (drawChoice.equals("n")) { - break; - } - player.draw(deck); - outputView.printPlayerCard(PlayerDto.from(player)); - } + + for (Player player : players.getPlayers()) { + doRound(player, deck); } dealer.drawUntilExceedMinimum(deck); @@ -51,19 +43,30 @@ public void start() { printGameResult(dealer, players); } - private void printGameResult(Dealer dealer, List players) { - GameResultBoard gameResultBoard = new GameResultBoard(dealer, players); + private void doRound(Player player, Deck deck) { + while (!player.isBusted()) { + String drawChoice = inputView.inputDrawChoice(player.getName()); + if (drawChoice.equals("n")) { + break; + } + player.draw(deck); + outputView.printPlayerCard(PlayerDto.from(player)); + } + } + + private void printGameResult(Dealer dealer, Players players) { + GameResultBoard gameResultBoard = new GameResultBoard(dealer, players.getPlayers()); outputView.printDealerResult(gameResultBoard.getDealerResult()); - for (Player player : players) { + for (Player player : players.getPlayers()) { outputView.printPlayerResult(player.getName(), gameResultBoard.getGameResult(player)); } } - private void printCardStatus(Dealer dealer, List players) { + private void printCardStatus(Dealer dealer, Players players) { PlayerResultDto dealerResult = PlayerResultDto.from(dealer.getPlayer()); - List playerResultDtos = players.stream() + List playerResultDtos = players.getPlayers().stream() .map(PlayerResultDto::from) .toList(); outputView.printCardStatus(dealerResult, playerResultDtos); @@ -77,23 +80,26 @@ private void printExtraDealerDraw(Dealer dealer) { } } - private void printInitialCards(Dealer dealer, List players) { + private void printInitialCards(Dealer dealer, Players players) { Card dealerCard = dealer.getFirstCard(); outputView.printDealerInitialCard(dealerCard); - List playerDtos = players.stream() + List playerDtos = players.getPlayers().stream() .map(PlayerDto::from) .toList(); outputView.printPlayerInitialCards(playerDtos); } - private static void doInitialDraw(Dealer dealer, List players, Deck deck) { - for (Player player : players) { - player.draw(deck); + private void doInitialDraw(Dealer dealer, Players players, Deck deck) { + players.getPlayers().forEach( + player -> drawCard(player, deck, INITIAL_CARDS_COUNT) + ); + drawCard(dealer.getPlayer(), deck, INITIAL_CARDS_COUNT); + } + + private void drawCard(Player player, Deck deck, int amount) { + for (int i = 0; i < amount; i++) { player.draw(deck); } - - dealer.draw(deck); - dealer.draw(deck); } } diff --git a/src/main/java/blackjack/domain/Players.java b/src/main/java/blackjack/domain/Players.java index a747266b1f5..a093c7aedaf 100644 --- a/src/main/java/blackjack/domain/Players.java +++ b/src/main/java/blackjack/domain/Players.java @@ -32,4 +32,8 @@ public static Players from(List names) { return new Players(players); } + + public List getPlayers() { + return players; + } } From 563c44094337a1286da7870c3002ca0f7acbd50c Mon Sep 17 00:00:00 2001 From: HyungUk Ryu Date: Thu, 7 Mar 2024 20:14:48 +0900 Subject: [PATCH 34/59] =?UTF-8?q?test(scoreTest):=20=EC=9D=8C=EC=88=98?= =?UTF-8?q?=EA=B0=80=20=EC=A0=90=EC=88=98=EB=A1=9C=20=EC=82=AC=EC=9A=A9?= =?UTF-8?q?=EB=90=98=EB=8A=94=20=EA=B2=BD=EC=9A=B0=EC=9D=98=20=ED=85=8C?= =?UTF-8?q?=EC=8A=A4=ED=8A=B8=20=EC=BD=94=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 Co-authored-by: haiseong --- src/test/java/blackjack/domain/ScoreTest.java | 18 ++++++++++++++++++ 1 file changed, 18 insertions(+) create mode 100644 src/test/java/blackjack/domain/ScoreTest.java diff --git a/src/test/java/blackjack/domain/ScoreTest.java b/src/test/java/blackjack/domain/ScoreTest.java new file mode 100644 index 00000000000..c593d56f1f9 --- /dev/null +++ b/src/test/java/blackjack/domain/ScoreTest.java @@ -0,0 +1,18 @@ +package blackjack.domain; + +import static org.assertj.core.api.Assertions.assertThatThrownBy; + +import org.junit.jupiter.api.DisplayName; +import org.junit.jupiter.api.Test; + +class ScoreTest { + @Test + @DisplayName("음수는 점수로 사용될 수 없다.") + void negativeScoreTest() { + int negativeValue = -1; + assertThatThrownBy(() -> new Score(negativeValue)) + .isInstanceOf(IllegalArgumentException.class) + .hasMessage("음수는 점수로 사용될 수 없습니다."); + } + +} From 683b13cb6cdd778cf603661fda8c643191268a40 Mon Sep 17 00:00:00 2001 From: HyungUk Ryu Date: Thu, 7 Mar 2024 20:18:12 +0900 Subject: [PATCH 35/59] =?UTF-8?q?feat(score):=20=EC=A0=90=EC=88=98=20?= =?UTF-8?q?=EB=B2=94=EC=9C=84=20=EA=B2=80=EC=A6=9D=20=EB=A1=9C=EC=A7=81=20?= =?UTF-8?q?=EC=B6=94=EA=B0=80?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Co-authored-by: haiseong --- src/main/java/blackjack/domain/Score.java | 15 +++++++++++++++ 1 file changed, 15 insertions(+) create mode 100644 src/main/java/blackjack/domain/Score.java diff --git a/src/main/java/blackjack/domain/Score.java b/src/main/java/blackjack/domain/Score.java new file mode 100644 index 00000000000..5049fb18e12 --- /dev/null +++ b/src/main/java/blackjack/domain/Score.java @@ -0,0 +1,15 @@ +package blackjack.domain; + +public record Score(int value) { + private static final int MINIMUM_VALUE = 0; + + public Score { + validateRange(value); + } + + private void validateRange(int value) { + if (value < MINIMUM_VALUE) { + throw new IllegalArgumentException("음수는 점수로 사용될 수 없습니다."); + } + } +} From bca4e224e9bfcf5419d0dac3081452f750c577c7 Mon Sep 17 00:00:00 2001 From: HyungUk Ryu Date: Thu, 7 Mar 2024 20:22:02 +0900 Subject: [PATCH 36/59] =?UTF-8?q?test(scoreTest):=20=EC=A0=90=EC=88=98?= =?UTF-8?q?=EC=97=90=20=EB=94=B0=EB=A5=B8=20=EB=B2=84=EC=8A=A4=ED=8A=B8=20?= =?UTF-8?q?=EC=97=AC=EB=B6=80=20=ED=85=8C=EC=8A=A4=ED=8A=B8=20=EC=B6=94?= =?UTF-8?q?=EA=B0=80?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Co-authored-by: haiseong --- src/test/java/blackjack/domain/ScoreTest.java | 11 +++++++++++ 1 file changed, 11 insertions(+) diff --git a/src/test/java/blackjack/domain/ScoreTest.java b/src/test/java/blackjack/domain/ScoreTest.java index c593d56f1f9..a3f677e2b1f 100644 --- a/src/test/java/blackjack/domain/ScoreTest.java +++ b/src/test/java/blackjack/domain/ScoreTest.java @@ -1,9 +1,12 @@ package blackjack.domain; +import static org.assertj.core.api.Assertions.assertThat; import static org.assertj.core.api.Assertions.assertThatThrownBy; import org.junit.jupiter.api.DisplayName; import org.junit.jupiter.api.Test; +import org.junit.jupiter.params.ParameterizedTest; +import org.junit.jupiter.params.provider.CsvSource; class ScoreTest { @Test @@ -15,4 +18,12 @@ void negativeScoreTest() { .hasMessage("음수는 점수로 사용될 수 없습니다."); } + @ParameterizedTest + @CsvSource({"21, false", "22, true"}) + @DisplayName("점수가 21점을 초과하면 버스트") + void burstIfExceed21Test(int value, boolean expected) { + Score score = new Score(value); + + assertThat(score.isBusted()).isEqualTo(expected); + } } From c79d12873d4e47daa83d9e0f0e921d1ce30ce5c6 Mon Sep 17 00:00:00 2001 From: HyungUk Ryu Date: Thu, 7 Mar 2024 20:23:32 +0900 Subject: [PATCH 37/59] =?UTF-8?q?feat(score):=20=EC=A0=90=EC=88=98?= =?UTF-8?q?=EA=B0=80=20=EB=B2=84=EC=8A=A4=ED=8A=B8=20=EC=9D=B8=EC=A7=80=20?= =?UTF-8?q?=EC=97=AC=EB=B6=80=EB=A5=BC=20=ED=8C=90=EB=8B=A8=ED=95=98?= =?UTF-8?q?=EB=8A=94=20=EA=B8=B0=EB=8A=A5=20=EA=B5=AC=ED=98=84?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Co-authored-by: haiseong --- src/main/java/blackjack/domain/Score.java | 5 +++++ 1 file changed, 5 insertions(+) diff --git a/src/main/java/blackjack/domain/Score.java b/src/main/java/blackjack/domain/Score.java index 5049fb18e12..2d41bc5877c 100644 --- a/src/main/java/blackjack/domain/Score.java +++ b/src/main/java/blackjack/domain/Score.java @@ -2,6 +2,7 @@ public record Score(int value) { private static final int MINIMUM_VALUE = 0; + private static final int BUST_THRESHOLD = 21; public Score { validateRange(value); @@ -12,4 +13,8 @@ private void validateRange(int value) { throw new IllegalArgumentException("음수는 점수로 사용될 수 없습니다."); } } + + public boolean isBusted() { + return value > BUST_THRESHOLD; + } } From cdbf41ab8ddde32f4614c62eb1e0d09c3fc8ca4a Mon Sep 17 00:00:00 2001 From: HyungUk Ryu Date: Thu, 7 Mar 2024 20:40:19 +0900 Subject: [PATCH 38/59] =?UTF-8?q?test(scoreTest):=20=EC=A0=90=EC=88=98=20?= =?UTF-8?q?=EB=B9=84=EA=B5=90=20=EB=A1=9C=EC=A7=81=20=ED=85=8C=EC=8A=A4?= =?UTF-8?q?=ED=8A=B8=20=EC=B6=94=EA=B0=80?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Co-authored-by: haiseong --- src/test/java/blackjack/domain/ScoreTest.java | 47 ++++++++++++++++++- 1 file changed, 46 insertions(+), 1 deletion(-) diff --git a/src/test/java/blackjack/domain/ScoreTest.java b/src/test/java/blackjack/domain/ScoreTest.java index a3f677e2b1f..61225d2673e 100644 --- a/src/test/java/blackjack/domain/ScoreTest.java +++ b/src/test/java/blackjack/domain/ScoreTest.java @@ -23,7 +23,52 @@ void negativeScoreTest() { @DisplayName("점수가 21점을 초과하면 버스트") void burstIfExceed21Test(int value, boolean expected) { Score score = new Score(value); - + assertThat(score.isBusted()).isEqualTo(expected); } + + @ParameterizedTest + @CsvSource({ + "21, 20, true", + "20, 20, false", + "19, 20, false", + }) + @DisplayName("현재 점수가 다른 점수보다 더 높은지 확인할 수 있다.") + void isGreaterThenTest(int currentValue, int relativeValue, boolean expected) { + Score currentScore = new Score(currentValue); + Score relativeScore = new Score(relativeValue); + + boolean actual = currentScore.isGreaterThen(relativeScore); + assertThat(actual).isEqualTo(expected); + } + + @ParameterizedTest + @CsvSource({ + "21, 20, false", + "20, 20, true", + "19, 20, false", + }) + @DisplayName("현재 점수가 다른 점수보다 더 높은지 확인할 수 있다.") + void isSameTest(int currentValue, int relativeValue, boolean expected) { + Score currentScore = new Score(currentValue); + Score relativeScore = new Score(relativeValue); + + boolean actual = currentScore.isSame(relativeScore); + assertThat(actual).isEqualTo(expected); + } + + @ParameterizedTest + @CsvSource({ + "21, 20, false", + "20, 20, false", + "19, 20, true", + }) + @DisplayName("현재 점수가 다른 점수보다 더 높은지 확인할 수 있다.") + void isLessThanTest(int currentValue, int relativeValue, boolean expected) { + Score currentScore = new Score(currentValue); + Score relativeScore = new Score(relativeValue); + + boolean actual = currentScore.isLessThan(relativeScore); + assertThat(actual).isEqualTo(expected); + } } From 7f9a82f843cbedaf83617c9bd8b6c727b7780710 Mon Sep 17 00:00:00 2001 From: HyungUk Ryu Date: Thu, 7 Mar 2024 20:43:00 +0900 Subject: [PATCH 39/59] =?UTF-8?q?feat(score):=20=EC=A0=90=EC=88=98=20?= =?UTF-8?q?=EB=B9=84=EA=B5=90=20=EB=A1=9C=EC=A7=81=20=EA=B5=AC=ED=98=84?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Co-authored-by: haiseong --- src/main/java/blackjack/domain/Score.java | 12 ++++++++++++ 1 file changed, 12 insertions(+) diff --git a/src/main/java/blackjack/domain/Score.java b/src/main/java/blackjack/domain/Score.java index 2d41bc5877c..cee87d7ac56 100644 --- a/src/main/java/blackjack/domain/Score.java +++ b/src/main/java/blackjack/domain/Score.java @@ -17,4 +17,16 @@ private void validateRange(int value) { public boolean isBusted() { return value > BUST_THRESHOLD; } + + public boolean isGreaterThen(Score relativeScore) { + return value > relativeScore.value; + } + + public boolean isSame(Score relativeScore) { + return value == relativeScore.value; + } + + public boolean isLessThan(Score relativeScore) { + return value < relativeScore.value; + } } From fcc94766ed25c903708f76b2063feba955ce246d Mon Sep 17 00:00:00 2001 From: HyungUk Ryu Date: Thu, 7 Mar 2024 21:04:09 +0900 Subject: [PATCH 40/59] =?UTF-8?q?refactor(score):=20=EC=A0=90=EC=88=98?= =?UTF-8?q?=EB=A5=BC=20=EA=B4=80=EB=A6=AC=ED=95=98=EA=B8=B0=20=EC=9C=84?= =?UTF-8?q?=ED=95=9C=20=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 Co-authored-by: haiseong --- src/main/java/blackjack/domain/Dealer.java | 5 ++--- .../java/blackjack/domain/GameResultBoard.java | 14 +++++++------- src/main/java/blackjack/domain/Player.java | 2 +- src/main/java/blackjack/domain/PlayerCards.java | 7 ++++--- src/main/java/blackjack/domain/Score.java | 7 ++++++- .../blackjack/domain/dto/PlayerResultDto.java | 3 ++- src/test/java/blackjack/domain/DealerTest.java | 12 ++++++++---- .../java/blackjack/domain/PlayerCardsTest.java | 16 +++++++++------- src/test/java/blackjack/domain/PlayerTest.java | 5 +++-- src/test/java/blackjack/domain/ScoreTest.java | 2 +- 10 files changed, 43 insertions(+), 30 deletions(-) diff --git a/src/main/java/blackjack/domain/Dealer.java b/src/main/java/blackjack/domain/Dealer.java index eeddf17269f..e4ac98201d8 100644 --- a/src/main/java/blackjack/domain/Dealer.java +++ b/src/main/java/blackjack/domain/Dealer.java @@ -5,7 +5,6 @@ public class Dealer { private static final String DEALER_NAME = "딜러"; - private static final int MINIMUM_SCORE = 17; private final Player player; @@ -18,7 +17,7 @@ public void draw(Deck deck) { } public void drawUntilExceedMinimum(Deck deck) { - while (getScore() < MINIMUM_SCORE) { + while (getScore().isLessThanDealerMinimumScore()) { draw(deck); } } @@ -31,7 +30,7 @@ public List getCards() { return player.getCards(); } - public int getScore() { + public Score getScore() { return player.getScore(); } diff --git a/src/main/java/blackjack/domain/GameResultBoard.java b/src/main/java/blackjack/domain/GameResultBoard.java index 671157324f2..efbcd943b4b 100644 --- a/src/main/java/blackjack/domain/GameResultBoard.java +++ b/src/main/java/blackjack/domain/GameResultBoard.java @@ -8,27 +8,27 @@ public class GameResultBoard { private final Map resultBoard = new HashMap<>(); public GameResultBoard(Dealer dealer, List players) { - int dealerScore = dealer.getScore(); + Score dealerScore = dealer.getScore(); for (Player player : players) { String playerName = player.getName(); - int playerScore = player.getScore(); + Score playerScore = player.getScore(); GameResult gameResult = calculateGameResult(playerScore, dealerScore); resultBoard.put(playerName, gameResult); } } - private GameResult calculateGameResult(int playerScore, int dealerScore) { - if (playerScore > 21) { + private GameResult calculateGameResult(Score playerScore, Score dealerScore) { + if (playerScore.isBusted()) { return GameResult.LOSE; } - if (dealerScore > 21) { + if (dealerScore.isBusted()) { return GameResult.WIN; } - if (playerScore > dealerScore) { + if (playerScore.isGreaterThan(dealerScore)) { return GameResult.WIN; } - if (playerScore < dealerScore) { + if (playerScore.isLessThan(dealerScore)) { return GameResult.LOSE; } return GameResult.DRAW; diff --git a/src/main/java/blackjack/domain/Player.java b/src/main/java/blackjack/domain/Player.java index 9347459ee1f..916dc239b28 100644 --- a/src/main/java/blackjack/domain/Player.java +++ b/src/main/java/blackjack/domain/Player.java @@ -25,7 +25,7 @@ public List getCards() { return playerCards.getCards(); } - public int getScore() { + public Score getScore() { return playerCards.calculateScore(); } diff --git a/src/main/java/blackjack/domain/PlayerCards.java b/src/main/java/blackjack/domain/PlayerCards.java index f767f542d35..8511753a5e7 100644 --- a/src/main/java/blackjack/domain/PlayerCards.java +++ b/src/main/java/blackjack/domain/PlayerCards.java @@ -20,7 +20,7 @@ public void append(Card card) { cards.add(card); } - public int calculateScore() { + public Score calculateScore() { int score = cards.stream() .mapToInt(Card::getScore) .sum(); @@ -35,11 +35,12 @@ public int calculateScore() { score -= 10; } - return score; + return new Score(score); } public boolean isBusted() { - return calculateScore() > BUST_THRESHOLD; + Score score = calculateScore(); + return score.isBusted(); } private int getAceCount() { diff --git a/src/main/java/blackjack/domain/Score.java b/src/main/java/blackjack/domain/Score.java index cee87d7ac56..77850b6b25c 100644 --- a/src/main/java/blackjack/domain/Score.java +++ b/src/main/java/blackjack/domain/Score.java @@ -3,6 +3,7 @@ public record Score(int value) { private static final int MINIMUM_VALUE = 0; private static final int BUST_THRESHOLD = 21; + private static final int DEALER_MINIMUM_SCORE = 17; public Score { validateRange(value); @@ -18,7 +19,11 @@ public boolean isBusted() { return value > BUST_THRESHOLD; } - public boolean isGreaterThen(Score relativeScore) { + public boolean isLessThanDealerMinimumScore() { + return value < DEALER_MINIMUM_SCORE; + } + + public boolean isGreaterThan(Score relativeScore) { return value > relativeScore.value; } diff --git a/src/main/java/blackjack/domain/dto/PlayerResultDto.java b/src/main/java/blackjack/domain/dto/PlayerResultDto.java index 1bbd2ca493b..caebdac6090 100644 --- a/src/main/java/blackjack/domain/dto/PlayerResultDto.java +++ b/src/main/java/blackjack/domain/dto/PlayerResultDto.java @@ -1,10 +1,11 @@ package blackjack.domain.dto; import blackjack.domain.Player; +import blackjack.domain.Score; import blackjack.domain.card.Card; import java.util.List; -public record PlayerResultDto(PlayerDto playerDto, int score) { +public record PlayerResultDto(PlayerDto playerDto, Score score) { public static PlayerResultDto from(Player player) { return new PlayerResultDto(PlayerDto.from(player), player.getScore()); } diff --git a/src/test/java/blackjack/domain/DealerTest.java b/src/test/java/blackjack/domain/DealerTest.java index 03ca8598b38..2582877b74a 100644 --- a/src/test/java/blackjack/domain/DealerTest.java +++ b/src/test/java/blackjack/domain/DealerTest.java @@ -28,19 +28,23 @@ void drawCardTest() { Dealer dealer = new Dealer(); dealer.draw(deck); - int score = dealer.getScore(); - assertThat(score).isEqualTo(10); + Score score = dealer.getScore(); + Score expected = new Score(10); + + assertThat(score).isEqualTo(expected); } @ParameterizedTest @MethodSource("cardsAndScore") @DisplayName("자신의 현재 점수가 17점 이상이 될 때까지 추가로 카드를 받는다.") - void drawCardsUntilScoreBelow17Test(List cards, int expected) { + void drawCardsUntilScoreBelow17Test(List cards, int expectedValue) { Deck deck = Deck.from(cards); Dealer dealer = new Dealer(); dealer.drawUntilExceedMinimum(deck); - int score = dealer.getScore(); + Score score = dealer.getScore(); + Score expected = new Score(expectedValue); + assertThat(score).isEqualTo(expected); } diff --git a/src/test/java/blackjack/domain/PlayerCardsTest.java b/src/test/java/blackjack/domain/PlayerCardsTest.java index 0b07f8063c1..96467b3cadd 100644 --- a/src/test/java/blackjack/domain/PlayerCardsTest.java +++ b/src/test/java/blackjack/domain/PlayerCardsTest.java @@ -35,10 +35,10 @@ void calculateScoreTest() { ); PlayerCards playerCards = new PlayerCards(cards); - // TODO: score를 래핑해야 할 지도. - int score = playerCards.calculateScore(); + Score score = playerCards.calculateScore(); + Score expected = new Score(9); - assertThat(score).isEqualTo(9); + assertThat(score).isEqualTo(expected); } @Test @@ -51,18 +51,20 @@ void calculateScoreWithAlphabetTest() { ); PlayerCards playerCards = new PlayerCards(cards); - int score = playerCards.calculateScore(); + Score score = playerCards.calculateScore(); + Score expected = new Score(30); - assertThat(score).isEqualTo(30); + assertThat(score).isEqualTo(expected); } @ParameterizedTest @MethodSource("cardsAndScore") @DisplayName("ACE 는 1점 혹은 11점으로 계산된다.") - void calculateScoreWithAce(List cards, int expected) { + void calculateScoreWithAce(List cards, int expectedValue) { PlayerCards playerCards = new PlayerCards(cards); - int score = playerCards.calculateScore(); + Score score = playerCards.calculateScore(); + Score expected = new Score(expectedValue); assertThat(score).isEqualTo(expected); } diff --git a/src/test/java/blackjack/domain/PlayerTest.java b/src/test/java/blackjack/domain/PlayerTest.java index f8315abce23..fce49ddacd0 100644 --- a/src/test/java/blackjack/domain/PlayerTest.java +++ b/src/test/java/blackjack/domain/PlayerTest.java @@ -43,9 +43,10 @@ void calculateScoreTest() { player.draw(deck); } - int score = player.getScore(); + Score score = player.getScore(); - assertThat(score).isEqualTo(9); + Score expected = new Score(9); + assertThat(score).isEqualTo(expected); } @ParameterizedTest diff --git a/src/test/java/blackjack/domain/ScoreTest.java b/src/test/java/blackjack/domain/ScoreTest.java index 61225d2673e..9c695593838 100644 --- a/src/test/java/blackjack/domain/ScoreTest.java +++ b/src/test/java/blackjack/domain/ScoreTest.java @@ -38,7 +38,7 @@ void isGreaterThenTest(int currentValue, int relativeValue, boolean expected) { Score currentScore = new Score(currentValue); Score relativeScore = new Score(relativeValue); - boolean actual = currentScore.isGreaterThen(relativeScore); + boolean actual = currentScore.isGreaterThan(relativeScore); assertThat(actual).isEqualTo(expected); } From 0a4ed67e15ddb9e7e6d5949c28ef65ad18eefac1 Mon Sep 17 00:00:00 2001 From: HyungUk Ryu Date: Thu, 7 Mar 2024 21:57:38 +0900 Subject: [PATCH 41/59] =?UTF-8?q?refactor(score,=20playerCards):=20Ace?= =?UTF-8?q?=EC=9D=98=20=EC=A0=90=EC=88=98=EB=A5=BC=20=EA=B3=84=EC=82=B0?= =?UTF-8?q?=ED=95=98=EB=8A=94=20=EB=A1=9C=EC=A7=81=EC=9D=98=20=EC=9C=84?= =?UTF-8?q?=EC=B9=98=20=EB=B3=80=EA=B2=BD?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Co-authored-by: haiseong --- .../java/blackjack/domain/PlayerCards.java | 17 ++++++----------- src/main/java/blackjack/domain/Score.java | 19 +++++++++++++++++-- 2 files changed, 23 insertions(+), 13 deletions(-) diff --git a/src/main/java/blackjack/domain/PlayerCards.java b/src/main/java/blackjack/domain/PlayerCards.java index 8511753a5e7..e583db1e373 100644 --- a/src/main/java/blackjack/domain/PlayerCards.java +++ b/src/main/java/blackjack/domain/PlayerCards.java @@ -5,7 +5,6 @@ import java.util.List; public class PlayerCards { - private static final int BUST_THRESHOLD = 21; private final List cards; public PlayerCards(List cards) { @@ -21,21 +20,17 @@ public void append(Card card) { } public Score calculateScore() { - int score = cards.stream() + int scoreValue = cards.stream() .mapToInt(Card::getScore) .sum(); - int aceCount = getAceCount(); + Score score = new Score(scoreValue); + int currentAceAmount = getAceCount(); - // TODO: 인덴트 줄이기, 로직 개선 - for (int i = 0; i < aceCount; i++) { - if (score <= BUST_THRESHOLD) { - break; - } - score -= 10; + if (currentAceAmount > 0 && score.isBusted()) { + return score.convertToSmallAce(currentAceAmount); } - - return new Score(score); + return score; } public boolean isBusted() { diff --git a/src/main/java/blackjack/domain/Score.java b/src/main/java/blackjack/domain/Score.java index 77850b6b25c..b3159e553be 100644 --- a/src/main/java/blackjack/domain/Score.java +++ b/src/main/java/blackjack/domain/Score.java @@ -19,8 +19,8 @@ public boolean isBusted() { return value > BUST_THRESHOLD; } - public boolean isLessThanDealerMinimumScore() { - return value < DEALER_MINIMUM_SCORE; + private boolean isBusted(int scoreValue) { + return scoreValue > BUST_THRESHOLD; } public boolean isGreaterThan(Score relativeScore) { @@ -34,4 +34,19 @@ public boolean isSame(Score relativeScore) { public boolean isLessThan(Score relativeScore) { return value < relativeScore.value; } + + public boolean isLessThanDealerMinimumScore() { + return value < DEALER_MINIMUM_SCORE; + } + + public Score convertToSmallAce(int currentBigAceAmount) { + int currentValue = value; + int convertedAceAmount = 0; + while (isBusted(currentValue) && convertedAceAmount < currentBigAceAmount) { + currentValue -= 10; + convertedAceAmount++; + } + + return new Score(currentValue); + } } From e40103e2d8e2a1143783b3ae2e5940729283c51c Mon Sep 17 00:00:00 2001 From: HyungUk Ryu Date: Thu, 7 Mar 2024 22:09:09 +0900 Subject: [PATCH 42/59] =?UTF-8?q?refactor(dealer):=20=EB=B6=88=ED=95=84?= =?UTF-8?q?=EC=9A=94=20=EB=A9=94=EC=84=9C=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 Co-authored-by: haiseong --- src/main/java/blackjack/domain/Dealer.java | 4 ---- 1 file changed, 4 deletions(-) diff --git a/src/main/java/blackjack/domain/Dealer.java b/src/main/java/blackjack/domain/Dealer.java index e4ac98201d8..947561d0467 100644 --- a/src/main/java/blackjack/domain/Dealer.java +++ b/src/main/java/blackjack/domain/Dealer.java @@ -22,10 +22,6 @@ public void drawUntilExceedMinimum(Deck deck) { } } - public boolean isBusted() { - return player.isBusted(); - } - public List getCards() { return player.getCards(); } From 33c10f307bc93c2446d550850113b1e873a1b0cd Mon Sep 17 00:00:00 2001 From: HyungUk Ryu Date: Thu, 7 Mar 2024 22:17:17 +0900 Subject: [PATCH 43/59] =?UTF-8?q?test(deckTest):=20=EC=A4=91=EB=B3=B5?= =?UTF-8?q?=EB=90=98=EB=8A=94=20=EC=B9=B4=EB=93=9C=EA=B0=80=20=EC=9E=88?= =?UTF-8?q?=EC=9D=84=20=EA=B2=BD=EC=9A=B0=20=ED=85=8C=EC=8A=A4=ED=8A=B8=20?= =?UTF-8?q?=EC=B6=94=EA=B0=80?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Co-authored-by: haiseong --- src/test/java/blackjack/domain/DeckTest.java | 14 ++++++++++++++ 1 file changed, 14 insertions(+) diff --git a/src/test/java/blackjack/domain/DeckTest.java b/src/test/java/blackjack/domain/DeckTest.java index 630750b2de8..2b0f149d01e 100644 --- a/src/test/java/blackjack/domain/DeckTest.java +++ b/src/test/java/blackjack/domain/DeckTest.java @@ -2,6 +2,7 @@ import static org.assertj.core.api.Assertions.assertThat; +import static org.assertj.core.api.Assertions.assertThatThrownBy; import blackjack.domain.card.Card; import blackjack.domain.card.Shape; @@ -25,4 +26,17 @@ void draw() { Card expected = new Card(Shape.SPADE, Value.ACE); assertThat(deck.draw()).isEqualTo(expected); } + + @Test + @DisplayName("중복되는 카드가 있다면 예외가 발생한다.") + void duplicatedCardsTest() { + List cards = List.of( + new Card(Shape.DIAMOND, Value.FOUR), + new Card(Shape.DIAMOND, Value.FOUR) + ); + + assertThatThrownBy(() -> Deck.from(cards)) + .isInstanceOf(IllegalArgumentException.class) + .hasMessage("중복되는 카드가 있습니다."); + } } From e4bb004f7b92f80645c0d5dd66bc714e45e507d9 Mon Sep 17 00:00:00 2001 From: HyungUk Ryu Date: Thu, 7 Mar 2024 22:17:42 +0900 Subject: [PATCH 44/59] =?UTF-8?q?feat(deck):=20=EC=B9=B4=EB=93=9C=EC=9D=98?= =?UTF-8?q?=20=EC=A4=91=EB=B3=B5=20=EC=97=AC=EB=B6=80=20=EA=B2=80=EC=82=AC?= =?UTF-8?q?=20=EA=B5=AC=ED=98=84?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Co-authored-by: haiseong --- src/main/java/blackjack/domain/Deck.java | 12 +++++++++++- 1 file changed, 11 insertions(+), 1 deletion(-) diff --git a/src/main/java/blackjack/domain/Deck.java b/src/main/java/blackjack/domain/Deck.java index 88199f78f88..3185de946db 100644 --- a/src/main/java/blackjack/domain/Deck.java +++ b/src/main/java/blackjack/domain/Deck.java @@ -13,10 +13,20 @@ public class Deck { private final List cards; private Deck(List cards) { - // TODO: 중복되는 카드 검사 로직 추가 + validateUniqueCard(cards); this.cards = cards; } + private void validateUniqueCard(List cards) { + int distinctCount = (int) cards.stream() + .distinct() + .count(); + + if (distinctCount != cards.size()) { + throw new IllegalArgumentException("중복되는 카드가 있습니다."); + } + } + public static Deck from(List cards) { return new Deck(new LinkedList<>(cards)); } From 62bb0cce871c211ebb4119947b3d374f8ab9d9c6 Mon Sep 17 00:00:00 2001 From: HyungUk Ryu Date: Thu, 7 Mar 2024 22:22:28 +0900 Subject: [PATCH 45/59] =?UTF-8?q?refactor(deck):=20=ED=85=8C=EC=8A=A4?= =?UTF-8?q?=ED=8A=B8=20=EC=9A=A9=EC=9C=BC=EB=A1=9C=EB=A7=8C=20=EC=82=AC?= =?UTF-8?q?=EC=9A=A9=EB=90=98=EB=8D=98=20=EC=A0=95=EC=A0=81=20=ED=8C=A9?= =?UTF-8?q?=ED=86=A0=EB=A6=AC=20=EB=A9=94=EC=84=9C=EB=93=9C=20=EC=82=AD?= =?UTF-8?q?=EC=A0=9C?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Co-authored-by: haiseong --- src/main/java/blackjack/domain/Deck.java | 8 ++------ src/test/java/blackjack/domain/DealerTest.java | 4 ++-- src/test/java/blackjack/domain/DeckTest.java | 4 ++-- src/test/java/blackjack/domain/GameResultBoardTest.java | 4 ++-- src/test/java/blackjack/domain/PlayerTest.java | 6 +++--- 5 files changed, 11 insertions(+), 15 deletions(-) diff --git a/src/main/java/blackjack/domain/Deck.java b/src/main/java/blackjack/domain/Deck.java index 3185de946db..a819c672605 100644 --- a/src/main/java/blackjack/domain/Deck.java +++ b/src/main/java/blackjack/domain/Deck.java @@ -12,9 +12,9 @@ public class Deck { private final List cards; - private Deck(List cards) { + public Deck(List cards) { validateUniqueCard(cards); - this.cards = cards; + this.cards = new LinkedList<>(cards); } private void validateUniqueCard(List cards) { @@ -27,10 +27,6 @@ private void validateUniqueCard(List cards) { } } - public static Deck from(List cards) { - return new Deck(new LinkedList<>(cards)); - } - public static Deck createShuffledDeck() { List cards = new ArrayList<>(); diff --git a/src/test/java/blackjack/domain/DealerTest.java b/src/test/java/blackjack/domain/DealerTest.java index 2582877b74a..f90640797be 100644 --- a/src/test/java/blackjack/domain/DealerTest.java +++ b/src/test/java/blackjack/domain/DealerTest.java @@ -22,7 +22,7 @@ class DealerTest { @Test @DisplayName("딜러가 카드 한 장을 뽑는다.") void drawCardTest() { - Deck deck = Deck.from(List.of( + Deck deck = new Deck(List.of( new Card(DIAMOND, KING), new Card(DIAMOND, TWO), new Card(DIAMOND, FOUR) )); Dealer dealer = new Dealer(); @@ -38,7 +38,7 @@ void drawCardTest() { @MethodSource("cardsAndScore") @DisplayName("자신의 현재 점수가 17점 이상이 될 때까지 추가로 카드를 받는다.") void drawCardsUntilScoreBelow17Test(List cards, int expectedValue) { - Deck deck = Deck.from(cards); + Deck deck = new Deck(cards); Dealer dealer = new Dealer(); dealer.drawUntilExceedMinimum(deck); diff --git a/src/test/java/blackjack/domain/DeckTest.java b/src/test/java/blackjack/domain/DeckTest.java index 2b0f149d01e..d17e26c7f93 100644 --- a/src/test/java/blackjack/domain/DeckTest.java +++ b/src/test/java/blackjack/domain/DeckTest.java @@ -21,7 +21,7 @@ void draw() { new Card(Shape.CLOVER, Value.FOUR), new Card(Shape.HEART, Value.KING) )); - Deck deck = Deck.from(cards); + Deck deck = new Deck(cards); Card expected = new Card(Shape.SPADE, Value.ACE); assertThat(deck.draw()).isEqualTo(expected); @@ -35,7 +35,7 @@ void duplicatedCardsTest() { new Card(Shape.DIAMOND, Value.FOUR) ); - assertThatThrownBy(() -> Deck.from(cards)) + assertThatThrownBy(() -> new Deck(cards)) .isInstanceOf(IllegalArgumentException.class) .hasMessage("중복되는 카드가 있습니다."); } diff --git a/src/test/java/blackjack/domain/GameResultBoardTest.java b/src/test/java/blackjack/domain/GameResultBoardTest.java index 920a5944156..1e83680f08b 100644 --- a/src/test/java/blackjack/domain/GameResultBoardTest.java +++ b/src/test/java/blackjack/domain/GameResultBoardTest.java @@ -29,7 +29,7 @@ class GameResultBoardTest { void calculateGameResultTest(List playerCards, GameResult expected) { List cards = new ArrayList<>(List.of(new Card(DIAMOND, KING), new Card(DIAMOND, NINE))); cards.addAll(playerCards); - Deck deck = Deck.from(cards); + Deck deck = new Deck(cards); Dealer dealer = new Dealer(); giveCardToPlayer(dealer.getPlayer(), deck, 2); @@ -62,7 +62,7 @@ static Stream playerAndGameResult() { @DisplayName("딜러의 전적을 반환할 수 있다.") void calculateDealerResultTest() { List cards = generateCards(); - Deck deck = Deck.from(cards); + Deck deck = new Deck(cards); Dealer dealer = new Dealer(); giveCardToPlayer(dealer.getPlayer(), deck, 2); diff --git a/src/test/java/blackjack/domain/PlayerTest.java b/src/test/java/blackjack/domain/PlayerTest.java index fce49ddacd0..c7bd111f8e1 100644 --- a/src/test/java/blackjack/domain/PlayerTest.java +++ b/src/test/java/blackjack/domain/PlayerTest.java @@ -23,7 +23,7 @@ class PlayerTest { @DisplayName("덱으로 부터 카드 한장을 받아올 수 있다.") void drawCardTest() { List cards = List.of(new Card(DIAMOND, TWO), new Card(DIAMOND, THREE), new Card(DIAMOND, FOUR)); - Deck deck = Deck.from(cards); + Deck deck = new Deck(cards); Player player = new Player("pedro"); player.draw(deck); @@ -36,7 +36,7 @@ void drawCardTest() { @DisplayName("자신의 점수를 계산할 수 있다.") void calculateScoreTest() { List cards = List.of(new Card(DIAMOND, TWO), new Card(DIAMOND, THREE), new Card(DIAMOND, FOUR)); - Deck deck = Deck.from(cards); + Deck deck = new Deck(cards); Player player = new Player("pedro"); for (int i = 0; i < cards.size(); i++) { @@ -53,7 +53,7 @@ void calculateScoreTest() { @MethodSource("cardsAndBustStatus") @DisplayName("자신의 버스트 여부를 판단할 수 있다.") void checkBustTest(List cards, boolean expected) { - Deck deck = Deck.from(cards); + Deck deck = new Deck(cards); Player player = new Player("pedro"); for (int i = 0; i < cards.size(); i++) { From 660aa6d69178b6f2910ec8a01ff253bfb5bbd18c Mon Sep 17 00:00:00 2001 From: HyungUk Ryu Date: Thu, 7 Mar 2024 22:33:16 +0900 Subject: [PATCH 46/59] =?UTF-8?q?refactor(deck):=20=EC=85=94=ED=94=8C?= =?UTF-8?q?=EB=90=9C=20=EB=8D=B1=20=EC=83=9D=EC=84=B1=20=EB=A1=9C=EC=A7=81?= =?UTF-8?q?=20=EA=B0=9C=EC=84=A0?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Co-authored-by: haiseong --- src/main/java/blackjack/domain/Deck.java | 16 +++++++++++----- 1 file changed, 11 insertions(+), 5 deletions(-) diff --git a/src/main/java/blackjack/domain/Deck.java b/src/main/java/blackjack/domain/Deck.java index a819c672605..52b7a582afd 100644 --- a/src/main/java/blackjack/domain/Deck.java +++ b/src/main/java/blackjack/domain/Deck.java @@ -10,6 +10,8 @@ import java.util.List; public class Deck { + private static final int SHUFFLED_DECK_SIZE = 52; + private final List cards; public Deck(List cards) { @@ -28,19 +30,23 @@ private void validateUniqueCard(List cards) { } public static Deck createShuffledDeck() { - List cards = new ArrayList<>(); + List cards = new ArrayList<>(SHUFFLED_DECK_SIZE); - // TODO: 구조개선 for (Shape shape : Shape.values()) { - Arrays.stream(Value.values()) - .forEach(value -> cards.add(new Card(shape, value))); + cards.addAll(createAllCardsOf(shape)); } Collections.shuffle(cards); + return new Deck(cards); } + private static List createAllCardsOf(Shape shape) { + return Arrays.stream(Value.values()) + .map(value -> new Card(shape, value)) + .toList(); + } + public Card draw() { return cards.remove(0); } - } From 8cc3a8f3f8dd1ee872287dac00d05ef595974dda Mon Sep 17 00:00:00 2001 From: HyungUk Ryu Date: Thu, 7 Mar 2024 22:35:56 +0900 Subject: [PATCH 47/59] =?UTF-8?q?refactor(deck):=20List=EA=B0=80=20?= =?UTF-8?q?=EC=95=84=EB=8B=8C=20Queue=EB=A5=BC=20=EC=82=AC=EC=9A=A9?= =?UTF-8?q?=ED=95=98=EB=8F=84=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 Co-authored-by: haiseong --- src/main/java/blackjack/domain/Deck.java | 5 +++-- 1 file changed, 3 insertions(+), 2 deletions(-) diff --git a/src/main/java/blackjack/domain/Deck.java b/src/main/java/blackjack/domain/Deck.java index 52b7a582afd..bfdddd1b05f 100644 --- a/src/main/java/blackjack/domain/Deck.java +++ b/src/main/java/blackjack/domain/Deck.java @@ -8,11 +8,12 @@ import java.util.Collections; import java.util.LinkedList; import java.util.List; +import java.util.Queue; public class Deck { private static final int SHUFFLED_DECK_SIZE = 52; - private final List cards; + private final Queue cards; public Deck(List cards) { validateUniqueCard(cards); @@ -47,6 +48,6 @@ private static List createAllCardsOf(Shape shape) { } public Card draw() { - return cards.remove(0); + return cards.poll(); } } From 2dc6c4cf30a64be6a869fca33d268681841d7ce7 Mon Sep 17 00:00:00 2001 From: HyungUk Ryu Date: Fri, 8 Mar 2024 09:53:00 +0900 Subject: [PATCH 48/59] =?UTF-8?q?refactor(blackJackController):=20?= =?UTF-8?q?=EC=BB=A8=ED=8A=B8=EB=A1=A4=EB=9F=AC=20=EB=A1=9C=EC=A7=81?= =?UTF-8?q?=EC=9D=98=20=EB=A9=94=EC=84=9C=EB=93=9C=20=EC=B6=94=EC=B6=9C?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Co-authored-by: haiseong --- .../controller/BlackJackController.java | 52 +++++++++++-------- src/main/java/blackjack/domain/Players.java | 6 +++ 2 files changed, 35 insertions(+), 23 deletions(-) diff --git a/src/main/java/blackjack/controller/BlackJackController.java b/src/main/java/blackjack/controller/BlackJackController.java index c91e0f95db4..5c1de44bae1 100644 --- a/src/main/java/blackjack/controller/BlackJackController.java +++ b/src/main/java/blackjack/controller/BlackJackController.java @@ -24,23 +24,20 @@ public BlackJackController(InputView inputView, OutputView outputView) { public void start() { Dealer dealer = new Dealer(); - List playerNames = inputView.inputPlayerNames(); - Players players = Players.from(playerNames); + Players players = Players.from(inputView.inputPlayerNames()); Deck deck = Deck.createShuffledDeck(); - doInitialDraw(dealer, players, deck); - outputView.printInitialMessage(playerNames); - printInitialCards(dealer, players); - - for (Player player : players.getPlayers()) { - doRound(player, deck); - } + playGame(dealer, players, deck); + printGameResult(dealer, players); + } - dealer.drawUntilExceedMinimum(deck); - printExtraDealerDraw(dealer); + private void playGame(Dealer dealer, Players players, Deck deck) { + doInitialDraw(dealer, players, deck); - printCardStatus(dealer, players); - printGameResult(dealer, players); + players.getPlayers().forEach( + player -> doRound(player, deck) + ); + doDealerRound(dealer, deck); } private void doRound(Player player, Deck deck) { @@ -54,7 +51,13 @@ private void doRound(Player player, Deck deck) { } } + private void doDealerRound(Dealer dealer, Deck deck) { + dealer.drawUntilExceedMinimum(deck); + printExtraDealerDraw(dealer); + } + private void printGameResult(Dealer dealer, Players players) { + printCardStatus(dealer, players); GameResultBoard gameResultBoard = new GameResultBoard(dealer, players.getPlayers()); outputView.printDealerResult(gameResultBoard.getDealerResult()); @@ -80,21 +83,14 @@ private void printExtraDealerDraw(Dealer dealer) { } } - private void printInitialCards(Dealer dealer, Players players) { - Card dealerCard = dealer.getFirstCard(); - outputView.printDealerInitialCard(dealerCard); - - List playerDtos = players.getPlayers().stream() - .map(PlayerDto::from) - .toList(); - outputView.printPlayerInitialCards(playerDtos); - } - private void doInitialDraw(Dealer dealer, Players players, Deck deck) { players.getPlayers().forEach( player -> drawCard(player, deck, INITIAL_CARDS_COUNT) ); drawCard(dealer.getPlayer(), deck, INITIAL_CARDS_COUNT); + + outputView.printInitialMessage(players.getPlayerNames()); + printInitialCards(dealer, players); } private void drawCard(Player player, Deck deck, int amount) { @@ -102,4 +98,14 @@ private void drawCard(Player player, Deck deck, int amount) { player.draw(deck); } } + + private void printInitialCards(Dealer dealer, Players players) { + Card dealerCard = dealer.getFirstCard(); + outputView.printDealerInitialCard(dealerCard); + + List playerDtos = players.getPlayers().stream() + .map(PlayerDto::from) + .toList(); + outputView.printPlayerInitialCards(playerDtos); + } } diff --git a/src/main/java/blackjack/domain/Players.java b/src/main/java/blackjack/domain/Players.java index a093c7aedaf..423c0055e39 100644 --- a/src/main/java/blackjack/domain/Players.java +++ b/src/main/java/blackjack/domain/Players.java @@ -36,4 +36,10 @@ public static Players from(List names) { public List getPlayers() { return players; } + + public List getPlayerNames() { + return players.stream() + .map(Player::getName) + .toList(); + } } From 26992e2e8664511ea6b2e1ec437ec7800be00563 Mon Sep 17 00:00:00 2001 From: HyungUk Ryu Date: Fri, 8 Mar 2024 13:41:58 +0900 Subject: [PATCH 49/59] =?UTF-8?q?refactor(blackJackController,=20inputView?= =?UTF-8?q?):=20=EC=82=AC=EC=9A=A9=EC=9E=90=EA=B0=80=20=EC=B9=B4=EB=93=9C?= =?UTF-8?q?=EB=A5=BC=20=EC=B6=94=EA=B0=80=EB=A1=9C=20=EB=B0=9B=EC=9D=84?= =?UTF-8?q?=EC=A7=80=20=EC=9E=85=EB=A0=A5=20=EB=A1=9C=EC=A7=81=20=EB=A9=94?= =?UTF-8?q?=EC=84=9C=EB=93=9C=20=EB=B6=84=EB=A6=AC?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Co-authored-by: haiseong --- .../controller/BlackJackController.java | 78 +++++++++---------- src/main/java/blackjack/view/InputView.java | 11 ++- 2 files changed, 48 insertions(+), 41 deletions(-) diff --git a/src/main/java/blackjack/controller/BlackJackController.java b/src/main/java/blackjack/controller/BlackJackController.java index 5c1de44bae1..c551e1c533d 100644 --- a/src/main/java/blackjack/controller/BlackJackController.java +++ b/src/main/java/blackjack/controller/BlackJackController.java @@ -40,22 +40,56 @@ private void playGame(Dealer dealer, Players players, Deck deck) { doDealerRound(dealer, deck); } + private void doInitialDraw(Dealer dealer, Players players, Deck deck) { + players.getPlayers().forEach( + player -> drawCard(player, deck, INITIAL_CARDS_COUNT) + ); + drawCard(dealer.getPlayer(), deck, INITIAL_CARDS_COUNT); + + outputView.printInitialMessage(players.getPlayerNames()); + printInitialCards(dealer, players); + } + + private void drawCard(Player player, Deck deck, int amount) { + for (int i = 0; i < amount; i++) { + player.draw(deck); + } + } + + private void printInitialCards(Dealer dealer, Players players) { + Card dealerCard = dealer.getFirstCard(); + outputView.printDealerInitialCard(dealerCard); + + List playerDtos = players.getPlayers().stream() + .map(PlayerDto::from) + .toList(); + outputView.printPlayerInitialCards(playerDtos); + } + private void doRound(Player player, Deck deck) { - while (!player.isBusted()) { - String drawChoice = inputView.inputDrawChoice(player.getName()); - if (drawChoice.equals("n")) { - break; - } + while (!player.isBusted() && hasAdditionalCardRequest(player)) { player.draw(deck); outputView.printPlayerCard(PlayerDto.from(player)); } } + private boolean hasAdditionalCardRequest(Player player) { + return inputView.inputDrawChoice(player.getName()); + } + private void doDealerRound(Dealer dealer, Deck deck) { dealer.drawUntilExceedMinimum(deck); printExtraDealerDraw(dealer); } + private void printExtraDealerDraw(Dealer dealer) { + int dealerCardsCount = dealer.getCardsCount(); + int extraDrawCount = dealerCardsCount - INITIAL_CARDS_COUNT; + if (extraDrawCount > 0) { + outputView.printExtraDealerDraw(extraDrawCount); + } + } + private void printGameResult(Dealer dealer, Players players) { printCardStatus(dealer, players); GameResultBoard gameResultBoard = new GameResultBoard(dealer, players.getPlayers()); @@ -74,38 +108,4 @@ private void printCardStatus(Dealer dealer, Players players) { .toList(); outputView.printCardStatus(dealerResult, playerResultDtos); } - - private void printExtraDealerDraw(Dealer dealer) { - int dealerCardsCount = dealer.getCardsCount(); - int extraDrawCount = dealerCardsCount - INITIAL_CARDS_COUNT; - if (extraDrawCount > 0) { - outputView.printExtraDealerDraw(extraDrawCount); - } - } - - private void doInitialDraw(Dealer dealer, Players players, Deck deck) { - players.getPlayers().forEach( - player -> drawCard(player, deck, INITIAL_CARDS_COUNT) - ); - drawCard(dealer.getPlayer(), deck, INITIAL_CARDS_COUNT); - - outputView.printInitialMessage(players.getPlayerNames()); - printInitialCards(dealer, players); - } - - private void drawCard(Player player, Deck deck, int amount) { - for (int i = 0; i < amount; i++) { - player.draw(deck); - } - } - - private void printInitialCards(Dealer dealer, Players players) { - Card dealerCard = dealer.getFirstCard(); - outputView.printDealerInitialCard(dealerCard); - - List playerDtos = players.getPlayers().stream() - .map(PlayerDto::from) - .toList(); - outputView.printPlayerInitialCards(playerDtos); - } } diff --git a/src/main/java/blackjack/view/InputView.java b/src/main/java/blackjack/view/InputView.java index 604b81e76b2..c4b5877307a 100644 --- a/src/main/java/blackjack/view/InputView.java +++ b/src/main/java/blackjack/view/InputView.java @@ -13,8 +13,15 @@ public List inputPlayerNames() { return List.of(line.split(",")); } - public String inputDrawChoice(String playerName) { + public boolean inputDrawChoice(String playerName) { System.out.println(playerName + "는 한장의 카드를 더 받겠습니까? (y/n)"); - return scanner.nextLine(); + String choice = scanner.nextLine(); + if ("y".equals(choice)) { + return true; + } + if ("n".equals(choice)) { + return false; + } + throw new IllegalArgumentException("y 또는 n만 선택할 수 있습니다."); } } From 791504f15d6814f33db6f84dcbeebb32fa901195 Mon Sep 17 00:00:00 2001 From: HyungUk Ryu Date: Fri, 8 Mar 2024 13:51:38 +0900 Subject: [PATCH 50/59] =?UTF-8?q?refactor(playerResultDto):=20Score=20?= =?UTF-8?q?=EA=B0=9D=EC=B2=B4=20=EB=8C=80=EC=8B=A0=20=EC=9B=90=EC=8B=9C?= =?UTF-8?q?=EA=B0=92=EC=9D=84=20=EA=B0=80=EC=A7=80=EB=8F=84=EB=A1=9D=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 Co-authored-by: haiseong --- src/main/java/blackjack/domain/Player.java | 4 ++++ src/main/java/blackjack/domain/dto/PlayerResultDto.java | 5 ++--- 2 files changed, 6 insertions(+), 3 deletions(-) diff --git a/src/main/java/blackjack/domain/Player.java b/src/main/java/blackjack/domain/Player.java index 916dc239b28..9672ae9c591 100644 --- a/src/main/java/blackjack/domain/Player.java +++ b/src/main/java/blackjack/domain/Player.java @@ -29,6 +29,10 @@ public Score getScore() { return playerCards.calculateScore(); } + public int getScoreValue() { + return getScore().value(); + } + public String getName() { return name; } diff --git a/src/main/java/blackjack/domain/dto/PlayerResultDto.java b/src/main/java/blackjack/domain/dto/PlayerResultDto.java index caebdac6090..06b5474a8e5 100644 --- a/src/main/java/blackjack/domain/dto/PlayerResultDto.java +++ b/src/main/java/blackjack/domain/dto/PlayerResultDto.java @@ -1,13 +1,12 @@ package blackjack.domain.dto; import blackjack.domain.Player; -import blackjack.domain.Score; import blackjack.domain.card.Card; import java.util.List; -public record PlayerResultDto(PlayerDto playerDto, Score score) { +public record PlayerResultDto(PlayerDto playerDto, int score) { public static PlayerResultDto from(Player player) { - return new PlayerResultDto(PlayerDto.from(player), player.getScore()); + return new PlayerResultDto(PlayerDto.from(player), player.getScoreValue()); } public String getName() { From cd2ce8ce5029671a52d2057e2ad7f2bed1513119 Mon Sep 17 00:00:00 2001 From: HyungUk Ryu Date: Fri, 8 Mar 2024 14:26:34 +0900 Subject: [PATCH 51/59] =?UTF-8?q?refactor(shapeDescription,=20valueDescrip?= =?UTF-8?q?tion):=20=EC=B9=B4=EB=93=9C=EC=97=90=20=EB=8C=80=ED=95=9C=20?= =?UTF-8?q?=EC=84=A4=EB=AA=85=EC=9D=84=20=EB=B7=B0=EC=97=90=EC=84=9C=20?= =?UTF-8?q?=EA=B4=80=EB=A6=AC=20=ED=95=98=EB=8F=84=EB=A1=9D=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 Co-authored-by: haiseong --- .../java/blackjack/domain/GameResult.java | 14 +------ src/main/java/blackjack/domain/card/Card.java | 8 ---- .../java/blackjack/domain/card/Shape.java | 12 +----- .../java/blackjack/domain/card/Value.java | 26 +++--------- src/main/java/blackjack/view/OutputView.java | 36 +++++++++++------ .../description/GameResultDescription.java | 30 ++++++++++++++ .../view/description/ShapeDescription.java | 31 ++++++++++++++ .../view/description/ValueDescription.java | 40 +++++++++++++++++++ 8 files changed, 133 insertions(+), 64 deletions(-) create mode 100644 src/main/java/blackjack/view/description/GameResultDescription.java create mode 100644 src/main/java/blackjack/view/description/ShapeDescription.java create mode 100644 src/main/java/blackjack/view/description/ValueDescription.java diff --git a/src/main/java/blackjack/domain/GameResult.java b/src/main/java/blackjack/domain/GameResult.java index c94d9aaae39..8b894faa782 100644 --- a/src/main/java/blackjack/domain/GameResult.java +++ b/src/main/java/blackjack/domain/GameResult.java @@ -1,17 +1,5 @@ package blackjack.domain; public enum GameResult { - WIN("승"), - LOSE("패"), - DRAW("무"); - - private final String description; - - GameResult(String description) { - this.description = description; - } - - public String getDescription() { - return description; - } + WIN, LOSE, DRAW } diff --git a/src/main/java/blackjack/domain/card/Card.java b/src/main/java/blackjack/domain/card/Card.java index d5bfa66a956..0b7b2c05f4e 100644 --- a/src/main/java/blackjack/domain/card/Card.java +++ b/src/main/java/blackjack/domain/card/Card.java @@ -8,12 +8,4 @@ public int getScore() { public boolean isAce() { return value == Value.ACE; } - - public String getShapeDescription() { - return shape.getDescription(); - } - - public String getValueDescription() { - return value.getDescription(); - } } diff --git a/src/main/java/blackjack/domain/card/Shape.java b/src/main/java/blackjack/domain/card/Shape.java index fa388ed3eb3..ee270ba85a8 100644 --- a/src/main/java/blackjack/domain/card/Shape.java +++ b/src/main/java/blackjack/domain/card/Shape.java @@ -1,15 +1,5 @@ package blackjack.domain.card; public enum Shape { - SPADE("스페이드"), HEART("하트"), DIAMOND("다이아몬드"), CLOVER("클로버"); - - final String description; - - Shape(String description) { - this.description = description; - } - - public String getDescription() { - return description; - } + SPADE, HEART, DIAMOND, CLOVER } diff --git a/src/main/java/blackjack/domain/card/Value.java b/src/main/java/blackjack/domain/card/Value.java index 344396d582d..04117d7cef9 100644 --- a/src/main/java/blackjack/domain/card/Value.java +++ b/src/main/java/blackjack/domain/card/Value.java @@ -1,33 +1,19 @@ package blackjack.domain.card; public enum Value { - ACE(11, "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"); + ACE(11), + TWO(2), THREE(3), FOUR(4), + FIVE(5), SIX(6), SEVEN(7), + EIGHT(8), NINE(9), TEN(10), + JACK(10), QUEEN(10), KING(10); final int score; - final String description; - Value(int score, String description) { + Value(int score) { this.score = score; - this.description = description; } public int getScore() { return score; } - - public String getDescription() { - return description; - } } diff --git a/src/main/java/blackjack/view/OutputView.java b/src/main/java/blackjack/view/OutputView.java index 9027d38b317..60c522bc6b1 100644 --- a/src/main/java/blackjack/view/OutputView.java +++ b/src/main/java/blackjack/view/OutputView.java @@ -4,6 +4,9 @@ import blackjack.domain.card.Card; import blackjack.domain.dto.PlayerDto; import blackjack.domain.dto.PlayerResultDto; +import blackjack.view.description.GameResultDescription; +import blackjack.view.description.ShapeDescription; +import blackjack.view.description.ValueDescription; import java.util.List; import java.util.Map; @@ -14,7 +17,7 @@ public void printPlayerInitialCards(List playerDtos) { playerDtos.forEach(playerDto -> stringBuilder.append(playerDto.name()) .append("카드: ") - .append(generateCardDescription(playerDto.cards())) + .append(generateCardsDescription(playerDto.cards())) .append(System.lineSeparator()) ); @@ -22,24 +25,29 @@ public void printPlayerInitialCards(List playerDtos) { } public void printDealerInitialCard(Card dealerCard) { - String card = dealerCard.getValueDescription() + dealerCard.getShapeDescription(); - System.out.println("딜러: " + card); + System.out.println("딜러: " + generateCardDescription(dealerCard)); } - private String generateCardDescription(List cards) { + private String generateCardsDescription(List cards) { List list = cards.stream() - .map(card -> (card.getValueDescription()) + (card.getShapeDescription())) + .map(this::generateCardDescription) .toList(); return String.join(", ", list); } + private String generateCardDescription(Card card) { + String shapeDescription = ShapeDescription.getDescription(card.shape()); + String valueDescription = ValueDescription.getDescription(card.value()); + return shapeDescription + valueDescription; + } + public void printInitialMessage(List playerNames) { System.out.println("딜러와 " + String.join(", ", playerNames) + " 에게 2장을 나누었습니다."); } public void printPlayerCard(PlayerDto playerDto) { String name = playerDto.name(); - System.out.println(name + "카드: " + generateCardDescription(playerDto.cards())); + System.out.println(name + "카드: " + generateCardsDescription(playerDto.cards())); } public void printExtraDealerDraw(int extraDrawCount) { @@ -50,7 +58,7 @@ public void printCardStatus(PlayerResultDto dealerResult, List StringBuilder stringBuilder = new StringBuilder(); stringBuilder.append("딜러 카드: ") - .append(generateCardDescription(dealerResult.getCards())) + .append(generateCardsDescription(dealerResult.getCards())) .append(" - 결과: ") .append(dealerResult.score()) .append(System.lineSeparator()); @@ -58,7 +66,7 @@ public void printCardStatus(PlayerResultDto dealerResult, List playerResultDtos.forEach(playerResultDto -> stringBuilder.append(playerResultDto.getName()) .append("카드: ") - .append(generateCardDescription(playerResultDto.getCards())) + .append(generateCardsDescription(playerResultDto.getCards())) .append(" - 결과: ") .append(playerResultDto.score()) .append(System.lineSeparator()) @@ -68,12 +76,16 @@ public void printCardStatus(PlayerResultDto dealerResult, List } public void printDealerResult(Map dealerResult) { - System.out.println("## 최종 승패"); - System.out.println("딜러: " + dealerResult.get(GameResult.WIN) + "승" + dealerResult.get(GameResult.LOSE) + "패" - + dealerResult.get(GameResult.DRAW) + "무"); + String result = "## 최종 승패" + System.lineSeparator() + + "딜러: " + + dealerResult.get(GameResult.WIN) + GameResultDescription.WIN.getDescription() + + dealerResult.get(GameResult.DRAW) + GameResultDescription.DRAW.getDescription() + + dealerResult.get(GameResult.LOSE) + GameResultDescription.LOSE.getDescription(); + + System.out.println(result); } public void printPlayerResult(String playerName, GameResult gameResult) { - System.out.println(playerName + ": " + gameResult.getDescription()); + System.out.println(playerName + ": " + GameResultDescription.getDescription(gameResult)); } } diff --git a/src/main/java/blackjack/view/description/GameResultDescription.java b/src/main/java/blackjack/view/description/GameResultDescription.java new file mode 100644 index 00000000000..02de33af83f --- /dev/null +++ b/src/main/java/blackjack/view/description/GameResultDescription.java @@ -0,0 +1,30 @@ +package blackjack.view.description; + +import blackjack.domain.GameResult; +import java.util.Arrays; + +public enum GameResultDescription { + WIN(GameResult.WIN, "승"), + LOSE(GameResult.LOSE, "패"), + DRAW(GameResult.DRAW, "무"); + + private final GameResult gameResult; + private final String description; + + GameResultDescription(GameResult gameResult, String description) { + this.gameResult = gameResult; + this.description = description; + } + + public String getDescription() { + return description; + } + + public static String getDescription(GameResult result) { + return Arrays.stream(values()) + .filter(resultDescription -> resultDescription.gameResult == result) + .findFirst() + .map(GameResultDescription::getDescription) + .orElseThrow(); + } +} diff --git a/src/main/java/blackjack/view/description/ShapeDescription.java b/src/main/java/blackjack/view/description/ShapeDescription.java new file mode 100644 index 00000000000..f966de3da13 --- /dev/null +++ b/src/main/java/blackjack/view/description/ShapeDescription.java @@ -0,0 +1,31 @@ +package blackjack.view.description; + +import blackjack.domain.card.Shape; +import java.util.Arrays; + +public enum ShapeDescription { + SPADE(Shape.SPADE, "스페이드"), + HEART(Shape.HEART, "하트"), + DIAMOND(Shape.DIAMOND, "다이아몬드"), + CLOVER(Shape.CLOVER, "클로버"); + + private final Shape shape; + private final String description; + + ShapeDescription(Shape shape, String description) { + this.shape = shape; + this.description = description; + } + + public String getDescription() { + return description; + } + + public static String getDescription(Shape shape) { + return Arrays.stream(values()) + .filter(shapeDescription -> shapeDescription.shape == shape) + .findFirst() + .map(ShapeDescription::getDescription) + .orElseThrow(); + } +} diff --git a/src/main/java/blackjack/view/description/ValueDescription.java b/src/main/java/blackjack/view/description/ValueDescription.java new file mode 100644 index 00000000000..5cfff91ce6f --- /dev/null +++ b/src/main/java/blackjack/view/description/ValueDescription.java @@ -0,0 +1,40 @@ +package blackjack.view.description; + +import blackjack.domain.card.Value; +import java.util.Arrays; + +public enum ValueDescription { + ACE(Value.ACE, "A"), + TWO(Value.TWO, "2"), + THREE(Value.THREE, "3"), + FOUR(Value.FOUR, "4"), + FIVE(Value.FIVE, "5"), + SIX(Value.SIX, "6"), + SEVEN(Value.SEVEN, "7"), + EIGHT(Value.EIGHT, "8"), + NINE(Value.NINE, "9"), + TEN(Value.TEN, "10"), + JACK(Value.JACK, "J"), + QUEEN(Value.QUEEN, "Q"), + KING(Value.KING, "K"); + + final Value value; + final String description; + + ValueDescription(Value value, String description) { + this.value = value; + this.description = description; + } + + public String getDescription() { + return description; + } + + public static String getDescription(Value value) { + return Arrays.stream(values()) + .filter(valueDescription -> valueDescription.value == value) + .findFirst() + .map(ValueDescription::getDescription) + .orElseThrow(); + } +} From 8056a273668dda6c7c5066c6690fe85c6ca61a24 Mon Sep 17 00:00:00 2001 From: HyungUk Ryu Date: Fri, 8 Mar 2024 15:23:47 +0900 Subject: [PATCH 52/59] =?UTF-8?q?test(gameResultTest):=20=EC=A0=90?= =?UTF-8?q?=EC=88=98=EC=97=90=20=EB=94=B0=EB=A5=B8=20=ED=94=8C=EB=A0=88?= =?UTF-8?q?=EC=9D=B4=EC=96=B4=EC=9D=98=20=EA=B2=8C=EC=9E=84=20=EA=B2=B0?= =?UTF-8?q?=EA=B3=BC=EB=A5=BC=20=EA=B3=84=EC=82=B0=ED=95=98=EB=8A=94=20?= =?UTF-8?q?=ED=85=8C=EC=8A=A4=ED=8A=B8=20=EC=B6=94=EA=B0=80?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Co-authored-by: haiseong --- .../java/blackjack/domain/GameResultTest.java | 54 +++++++++++++++++++ 1 file changed, 54 insertions(+) create mode 100644 src/test/java/blackjack/domain/GameResultTest.java diff --git a/src/test/java/blackjack/domain/GameResultTest.java b/src/test/java/blackjack/domain/GameResultTest.java new file mode 100644 index 00000000000..9fecef68d20 --- /dev/null +++ b/src/test/java/blackjack/domain/GameResultTest.java @@ -0,0 +1,54 @@ +package blackjack.domain; + +import static org.assertj.core.api.Assertions.assertThat; +import static org.junit.jupiter.api.Assertions.*; + +import org.junit.jupiter.api.DisplayName; +import org.junit.jupiter.api.Test; +import org.junit.jupiter.params.ParameterizedTest; +import org.junit.jupiter.params.provider.CsvSource; + +class GameResultTest { + @ParameterizedTest + @DisplayName("플레이어가 버스트 되지 않고 점수가 딜러보다 높으면 플레이어가 승리한다.") + @CsvSource({ + "20, 19", + "15, 22" + }) + void playerWinTest(int playerScoreValue, int dealerScoreValue) { + Score playerScore = new Score(playerScoreValue); + Score dealerScore = new Score(dealerScoreValue); + + GameResult winResult = GameResult.calculatePlayerResult(playerScore, dealerScore); + GameResult expected = GameResult.WIN; + assertThat(winResult).isEqualTo(expected); + } + + @ParameterizedTest + @DisplayName("플레이어가 버스트되거나 플레이어의 점수가 딜러보다 낮으면 플레이어가 패배한다.") + @CsvSource({ + "22, 18", + "18, 20", + "22, 22" + }) + void playerLoseTest(int playerScoreValue, int dealerScoreValue) { + Score playerScore = new Score(playerScoreValue); + Score dealerScore = new Score(dealerScoreValue); + + GameResult loseResult = GameResult.calculatePlayerResult(playerScore, dealerScore); + GameResult expected = GameResult.LOSE; + assertThat(loseResult).isEqualTo(expected); + } + + @Test + @DisplayName("플레이어와 딜러의 점수가 같은 경우 무승부로 판단한다.") + void drawTest() { + int sameScore = 21; + Score playerScore = new Score(sameScore); + Score dealerScore = new Score(sameScore); + + GameResult drawResult = GameResult.calculatePlayerResult(playerScore, dealerScore); + GameResult expected = GameResult.DRAW; + assertThat(drawResult).isEqualTo(expected); + } +} \ No newline at end of file From 25a210fddefded200b1c5ceb12c44710f98b6e00 Mon Sep 17 00:00:00 2001 From: HyungUk Ryu Date: Fri, 8 Mar 2024 15:26:07 +0900 Subject: [PATCH 53/59] =?UTF-8?q?refactor(gameResult):=20=ED=94=8C?= =?UTF-8?q?=EB=A0=88=EC=9D=B4=EC=96=B4=EC=9D=98=20=EA=B2=8C=EC=9E=84=20?= =?UTF-8?q?=EA=B2=B0=EA=B3=BC=EB=A5=BC=20=EA=B3=84=EC=82=B0=ED=95=98?= =?UTF-8?q?=EB=8A=94=20=EB=A1=9C=EC=A7=81=20=EC=9C=84=EC=B9=98=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 Co-authored-by: haiseong --- .../java/blackjack/domain/GameResult.java | 19 ++++++++++++++++++- .../blackjack/domain/GameResultBoard.java | 19 +------------------ 2 files changed, 19 insertions(+), 19 deletions(-) diff --git a/src/main/java/blackjack/domain/GameResult.java b/src/main/java/blackjack/domain/GameResult.java index 8b894faa782..9d0b0006160 100644 --- a/src/main/java/blackjack/domain/GameResult.java +++ b/src/main/java/blackjack/domain/GameResult.java @@ -1,5 +1,22 @@ package blackjack.domain; public enum GameResult { - WIN, LOSE, DRAW + WIN, LOSE, DRAW; + + public static GameResult calculatePlayerResult(Score playerScore, Score dealerScore) { + if (playerScore.isBusted()) { + return LOSE; + } + if (dealerScore.isBusted()) { + return WIN; + } + + if (playerScore.isGreaterThan(dealerScore)) { + return WIN; + } + if (playerScore.isLessThan(dealerScore)) { + return LOSE; + } + return DRAW; + } } diff --git a/src/main/java/blackjack/domain/GameResultBoard.java b/src/main/java/blackjack/domain/GameResultBoard.java index efbcd943b4b..615fabfb3f6 100644 --- a/src/main/java/blackjack/domain/GameResultBoard.java +++ b/src/main/java/blackjack/domain/GameResultBoard.java @@ -12,28 +12,11 @@ public GameResultBoard(Dealer dealer, List players) { for (Player player : players) { String playerName = player.getName(); Score playerScore = player.getScore(); - GameResult gameResult = calculateGameResult(playerScore, dealerScore); + GameResult gameResult = GameResult.calculatePlayerResult(playerScore, dealerScore); resultBoard.put(playerName, gameResult); } } - private GameResult calculateGameResult(Score playerScore, Score dealerScore) { - if (playerScore.isBusted()) { - return GameResult.LOSE; - } - if (dealerScore.isBusted()) { - return GameResult.WIN; - } - - if (playerScore.isGreaterThan(dealerScore)) { - return GameResult.WIN; - } - if (playerScore.isLessThan(dealerScore)) { - return GameResult.LOSE; - } - return GameResult.DRAW; - } - public GameResult getGameResult(Player player) { return resultBoard.get(player.getName()); } From 84290d635b3690672b626e8d6c2096f1212ed21d Mon Sep 17 00:00:00 2001 From: HyungUk Ryu Date: Fri, 8 Mar 2024 15:40:37 +0900 Subject: [PATCH 54/59] =?UTF-8?q?fix(/view/description):=20enum=20?= =?UTF-8?q?=EC=97=90=EC=84=9C=20=EA=B0=92=EC=9D=84=20=EC=B0=BE=EC=9D=84=20?= =?UTF-8?q?=EC=88=98=20=EC=97=86=EB=8A=94=20=EA=B2=BD=EC=9A=B0=20=EC=98=88?= =?UTF-8?q?=EC=99=B8=EB=A9=94=EC=8B=9C=EC=A7=80=20=EC=B6=94=EA=B0=80?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Co-authored-by: haiseong --- .../java/blackjack/view/description/GameResultDescription.java | 2 +- src/main/java/blackjack/view/description/ShapeDescription.java | 2 +- src/main/java/blackjack/view/description/ValueDescription.java | 2 +- 3 files changed, 3 insertions(+), 3 deletions(-) diff --git a/src/main/java/blackjack/view/description/GameResultDescription.java b/src/main/java/blackjack/view/description/GameResultDescription.java index 02de33af83f..629dfe293cf 100644 --- a/src/main/java/blackjack/view/description/GameResultDescription.java +++ b/src/main/java/blackjack/view/description/GameResultDescription.java @@ -25,6 +25,6 @@ public static String getDescription(GameResult result) { .filter(resultDescription -> resultDescription.gameResult == result) .findFirst() .map(GameResultDescription::getDescription) - .orElseThrow(); + .orElseThrow(() -> new IllegalArgumentException("해당하는 값을 찾을 수 없습니다.")); } } diff --git a/src/main/java/blackjack/view/description/ShapeDescription.java b/src/main/java/blackjack/view/description/ShapeDescription.java index f966de3da13..e9e825ef90d 100644 --- a/src/main/java/blackjack/view/description/ShapeDescription.java +++ b/src/main/java/blackjack/view/description/ShapeDescription.java @@ -26,6 +26,6 @@ public static String getDescription(Shape shape) { .filter(shapeDescription -> shapeDescription.shape == shape) .findFirst() .map(ShapeDescription::getDescription) - .orElseThrow(); + .orElseThrow(() -> new IllegalArgumentException("해당하는 값을 찾을 수 없습니다.")); } } diff --git a/src/main/java/blackjack/view/description/ValueDescription.java b/src/main/java/blackjack/view/description/ValueDescription.java index 5cfff91ce6f..09839cd3acf 100644 --- a/src/main/java/blackjack/view/description/ValueDescription.java +++ b/src/main/java/blackjack/view/description/ValueDescription.java @@ -35,6 +35,6 @@ public static String getDescription(Value value) { .filter(valueDescription -> valueDescription.value == value) .findFirst() .map(ValueDescription::getDescription) - .orElseThrow(); + .orElseThrow(() -> new IllegalArgumentException("해당하는 값을 찾을 수 없습니다.")); } } From c4ebb1f28c0c0cd1fedf00455050285fefa96ee4 Mon Sep 17 00:00:00 2001 From: HyungUk Ryu Date: Fri, 8 Mar 2024 15:41:19 +0900 Subject: [PATCH 55/59] =?UTF-8?q?test(playerTest):=20=ED=94=8C=EB=A0=88?= =?UTF-8?q?=EC=9D=B4=EC=96=B4=EC=9D=98=20=EC=9D=B4=EB=A6=84=EC=97=90=20?= =?UTF-8?q?=EB=8C=80=ED=95=9C=20=EA=B2=80=EC=A6=9D=20=ED=85=8C=EC=8A=A4?= =?UTF-8?q?=ED=8A=B8=20=EC=B6=94=EA=B0=80?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Co-authored-by: haiseong --- src/test/java/blackjack/domain/PlayerTest.java | 17 ++++++++++++++--- 1 file changed, 14 insertions(+), 3 deletions(-) diff --git a/src/test/java/blackjack/domain/PlayerTest.java b/src/test/java/blackjack/domain/PlayerTest.java index c7bd111f8e1..dce615dd22a 100644 --- a/src/test/java/blackjack/domain/PlayerTest.java +++ b/src/test/java/blackjack/domain/PlayerTest.java @@ -8,6 +8,7 @@ import static blackjack.domain.card.Value.THREE; import static blackjack.domain.card.Value.TWO; import static org.assertj.core.api.Assertions.assertThat; +import static org.assertj.core.api.Assertions.assertThatThrownBy; import blackjack.domain.card.Card; import java.util.List; @@ -17,15 +18,25 @@ import org.junit.jupiter.params.ParameterizedTest; import org.junit.jupiter.params.provider.Arguments; import org.junit.jupiter.params.provider.MethodSource; +import org.junit.jupiter.params.provider.ValueSource; class PlayerTest { + @ParameterizedTest + @ValueSource(strings = {"", " ", " ", "\n"}) + @DisplayName("공백 이름으로는 플레이어를 생성하면 예외가 발생한다.") + void throwsExceptionWhenNameIsBlankTest(String blankName) { + assertThatThrownBy(() -> Player.fromName(blankName)) + .isInstanceOf(IllegalArgumentException.class) + .hasMessage("이름이 비어있습니다."); + } + @Test @DisplayName("덱으로 부터 카드 한장을 받아올 수 있다.") void drawCardTest() { List cards = List.of(new Card(DIAMOND, TWO), new Card(DIAMOND, THREE), new Card(DIAMOND, FOUR)); Deck deck = new Deck(cards); - Player player = new Player("pedro"); + Player player = Player.fromName("pedro"); player.draw(deck); List playerCards = player.getCards(); @@ -38,7 +49,7 @@ void calculateScoreTest() { List cards = List.of(new Card(DIAMOND, TWO), new Card(DIAMOND, THREE), new Card(DIAMOND, FOUR)); Deck deck = new Deck(cards); - Player player = new Player("pedro"); + Player player = Player.fromName("pedro"); for (int i = 0; i < cards.size(); i++) { player.draw(deck); } @@ -55,7 +66,7 @@ void calculateScoreTest() { void checkBustTest(List cards, boolean expected) { Deck deck = new Deck(cards); - Player player = new Player("pedro"); + Player player = Player.fromName("pedro"); for (int i = 0; i < cards.size(); i++) { player.draw(deck); } From 997c9d89e6a16dff255b77bb69cc1de08d2a7281 Mon Sep 17 00:00:00 2001 From: HyungUk Ryu Date: Fri, 8 Mar 2024 15:43:49 +0900 Subject: [PATCH 56/59] =?UTF-8?q?refactor(playerName):=20=ED=94=8C?= =?UTF-8?q?=EB=A0=88=EC=9D=B4=EC=96=B4=EC=9D=98=20=EC=9D=B4=EB=A6=84=20?= =?UTF-8?q?=ED=8F=AC=EC=9E=A5?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Co-authored-by: haiseong --- src/main/java/blackjack/domain/Dealer.java | 2 +- src/main/java/blackjack/domain/Player.java | 12 ++++++++---- src/main/java/blackjack/domain/PlayerName.java | 9 +++++++++ src/main/java/blackjack/domain/Players.java | 14 +++++++------- .../java/blackjack/domain/GameResultBoardTest.java | 4 ++-- 5 files changed, 27 insertions(+), 14 deletions(-) create mode 100644 src/main/java/blackjack/domain/PlayerName.java diff --git a/src/main/java/blackjack/domain/Dealer.java b/src/main/java/blackjack/domain/Dealer.java index 947561d0467..fc0cb47b74a 100644 --- a/src/main/java/blackjack/domain/Dealer.java +++ b/src/main/java/blackjack/domain/Dealer.java @@ -9,7 +9,7 @@ public class Dealer { private final Player player; public Dealer() { - this.player = new Player(DEALER_NAME); + this.player = Player.fromName(DEALER_NAME); } public void draw(Deck deck) { diff --git a/src/main/java/blackjack/domain/Player.java b/src/main/java/blackjack/domain/Player.java index 9672ae9c591..e57be1d5cc5 100644 --- a/src/main/java/blackjack/domain/Player.java +++ b/src/main/java/blackjack/domain/Player.java @@ -4,14 +4,18 @@ import java.util.List; public class Player { - private final String name; // TODO: 감싸기 + private final PlayerName playerName; private final PlayerCards playerCards; - public Player(String name) { - this.name = name; + public Player(PlayerName playerName) { + this.playerName = playerName; this.playerCards = PlayerCards.createEmptyCards(); } + public static Player fromName(String name) { + return new Player(new PlayerName(name)); + } + public void draw(Deck deck) { Card card = deck.draw(); playerCards.append(card); @@ -34,6 +38,6 @@ public int getScoreValue() { } public String getName() { - return name; + return playerName.name(); } } diff --git a/src/main/java/blackjack/domain/PlayerName.java b/src/main/java/blackjack/domain/PlayerName.java new file mode 100644 index 00000000000..de35d9f90bf --- /dev/null +++ b/src/main/java/blackjack/domain/PlayerName.java @@ -0,0 +1,9 @@ +package blackjack.domain; + +public record PlayerName(String name) { + public PlayerName { + if (name.isBlank()) { + throw new IllegalArgumentException("이름이 비어있습니다."); + } + } +} diff --git a/src/main/java/blackjack/domain/Players.java b/src/main/java/blackjack/domain/Players.java index 423c0055e39..440fc8383be 100644 --- a/src/main/java/blackjack/domain/Players.java +++ b/src/main/java/blackjack/domain/Players.java @@ -3,11 +3,11 @@ import java.util.List; public class Players { - private final List players; + private final List playerGroup; - public Players(List players) { - validate(players); - this.players = players; + public Players(List playerGroup) { + validate(playerGroup); + this.playerGroup = playerGroup; } private static void validate(List players) { @@ -27,18 +27,18 @@ private static boolean duplicatedNameExist(List players) { public static Players from(List names) { List players = names.stream() - .map(Player::new) + .map(Player::fromName) .toList(); return new Players(players); } public List getPlayers() { - return players; + return playerGroup; } public List getPlayerNames() { - return players.stream() + return playerGroup.stream() .map(Player::getName) .toList(); } diff --git a/src/test/java/blackjack/domain/GameResultBoardTest.java b/src/test/java/blackjack/domain/GameResultBoardTest.java index 1e83680f08b..4a1b0fb1c0a 100644 --- a/src/test/java/blackjack/domain/GameResultBoardTest.java +++ b/src/test/java/blackjack/domain/GameResultBoardTest.java @@ -33,7 +33,7 @@ void calculateGameResultTest(List playerCards, GameResult expected) { Dealer dealer = new Dealer(); giveCardToPlayer(dealer.getPlayer(), deck, 2); - Player player = new Player("testPlayer"); + Player player = Player.fromName("testPlayer"); giveCardToPlayer(player, deck, 2); GameResultBoard gameResultBoard = new GameResultBoard(dealer, List.of(player)); @@ -93,7 +93,7 @@ private List generateCards() { private List generatePlayers() { List playerNames = List.of("loki", "pedro", "poke", "alpaca"); return playerNames.stream() - .map(Player::new) + .map(Player::fromName) .toList(); } From c2b374c5d048cc724087f2b84d448e011684ad07 Mon Sep 17 00:00:00 2001 From: HyungUk Ryu Date: Fri, 8 Mar 2024 16:12:06 +0900 Subject: [PATCH 57/59] =?UTF-8?q?fix(score):=20=EB=A7=A4=EC=A7=81=EB=84=98?= =?UTF-8?q?=EB=B2=84=20=EC=83=81=EC=88=98=ED=99=94?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Co-authored-by: haiseong --- src/main/java/blackjack/domain/Score.java | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/src/main/java/blackjack/domain/Score.java b/src/main/java/blackjack/domain/Score.java index b3159e553be..e50d519dbe0 100644 --- a/src/main/java/blackjack/domain/Score.java +++ b/src/main/java/blackjack/domain/Score.java @@ -4,6 +4,7 @@ public record Score(int value) { private static final int MINIMUM_VALUE = 0; private static final int BUST_THRESHOLD = 21; private static final int DEALER_MINIMUM_SCORE = 17; + public static final int CONVERTED_ACE_DIFFERENCE = 10; public Score { validateRange(value); @@ -43,7 +44,7 @@ public Score convertToSmallAce(int currentBigAceAmount) { int currentValue = value; int convertedAceAmount = 0; while (isBusted(currentValue) && convertedAceAmount < currentBigAceAmount) { - currentValue -= 10; + currentValue -= CONVERTED_ACE_DIFFERENCE; convertedAceAmount++; } From ecf3bc8362c0ab7250868e610a10a14a75e18baf Mon Sep 17 00:00:00 2001 From: HyungUk Ryu Date: Fri, 8 Mar 2024 16:34:38 +0900 Subject: [PATCH 58/59] =?UTF-8?q?refactor(playerCards):=20=ED=94=8C?= =?UTF-8?q?=EB=A0=88=EC=9D=B4=EC=96=B4=EA=B0=80=20=EA=B0=80=EC=A7=80?= =?UTF-8?q?=EA=B3=A0=20=EC=9E=88=EB=8A=94=20=EC=B9=B4=EB=93=9C=EC=9D=98=20?= =?UTF-8?q?=EA=B0=9C=EC=88=98=EB=A5=BC=20=EB=B0=98=ED=99=98=ED=95=A0=20?= =?UTF-8?q?=EC=88=98=20=EC=9E=88=EB=8F=84=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 Co-authored-by: haiseong --- src/main/java/blackjack/domain/Dealer.java | 3 +-- src/main/java/blackjack/domain/Player.java | 4 ++++ src/main/java/blackjack/domain/PlayerCards.java | 4 ++++ 3 files changed, 9 insertions(+), 2 deletions(-) diff --git a/src/main/java/blackjack/domain/Dealer.java b/src/main/java/blackjack/domain/Dealer.java index fc0cb47b74a..257ca909e1b 100644 --- a/src/main/java/blackjack/domain/Dealer.java +++ b/src/main/java/blackjack/domain/Dealer.java @@ -44,7 +44,6 @@ public Card getFirstCard() { } public int getCardsCount() { - // TODO: 메시지 보내기 - return player.getCards().size(); + return player.getTotalCardsCount(); } } diff --git a/src/main/java/blackjack/domain/Player.java b/src/main/java/blackjack/domain/Player.java index e57be1d5cc5..8e5620071ae 100644 --- a/src/main/java/blackjack/domain/Player.java +++ b/src/main/java/blackjack/domain/Player.java @@ -40,4 +40,8 @@ public int getScoreValue() { public String getName() { return playerName.name(); } + + public int getTotalCardsCount() { + return playerCards.size(); + } } diff --git a/src/main/java/blackjack/domain/PlayerCards.java b/src/main/java/blackjack/domain/PlayerCards.java index e583db1e373..62ea8536f79 100644 --- a/src/main/java/blackjack/domain/PlayerCards.java +++ b/src/main/java/blackjack/domain/PlayerCards.java @@ -45,4 +45,8 @@ private int getAceCount() { public List getCards() { return cards; } + + public int size() { + return cards.size(); + } } From edb1738df0c10d337d8bec52711b9dbe48bcd9eb Mon Sep 17 00:00:00 2001 From: HyungUk Ryu Date: Fri, 8 Mar 2024 16:44:41 +0900 Subject: [PATCH 59/59] =?UTF-8?q?refactor(dealer):=20=EB=AF=B8=EC=82=AC?= =?UTF-8?q?=EC=9A=A9=20=EB=A9=94=EC=84=9C=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 - 딜러의 첫 번째 카드를 출력할 때, 첫 카드를 가져오는 전용 메서드를 삭제하고 컨트롤러에서 뷰로 전달 시 하나만 전달하도록 변경 Co-authored-by: haiseong --- .../java/blackjack/controller/BlackJackController.java | 4 ++-- src/main/java/blackjack/domain/Dealer.java | 9 --------- src/test/java/blackjack/domain/GameResultTest.java | 1 - 3 files changed, 2 insertions(+), 12 deletions(-) diff --git a/src/main/java/blackjack/controller/BlackJackController.java b/src/main/java/blackjack/controller/BlackJackController.java index c551e1c533d..90e8f14eb61 100644 --- a/src/main/java/blackjack/controller/BlackJackController.java +++ b/src/main/java/blackjack/controller/BlackJackController.java @@ -57,8 +57,8 @@ private void drawCard(Player player, Deck deck, int amount) { } private void printInitialCards(Dealer dealer, Players players) { - Card dealerCard = dealer.getFirstCard(); - outputView.printDealerInitialCard(dealerCard); + List dealerCards = dealer.getCards(); + outputView.printDealerInitialCard(dealerCards.get(0)); List playerDtos = players.getPlayers().stream() .map(PlayerDto::from) diff --git a/src/main/java/blackjack/domain/Dealer.java b/src/main/java/blackjack/domain/Dealer.java index 257ca909e1b..6741aa3b323 100644 --- a/src/main/java/blackjack/domain/Dealer.java +++ b/src/main/java/blackjack/domain/Dealer.java @@ -34,15 +34,6 @@ public Player getPlayer() { return player; } - public Card getFirstCard() { - // TODO: 메시지 보내기 - List cards = getCards(); - if (cards.isEmpty()) { - throw new IllegalStateException("아무 카드도 뽑지 않았습니다."); - } - return cards.get(0); - } - public int getCardsCount() { return player.getTotalCardsCount(); } diff --git a/src/test/java/blackjack/domain/GameResultTest.java b/src/test/java/blackjack/domain/GameResultTest.java index 9fecef68d20..ab5f87069c8 100644 --- a/src/test/java/blackjack/domain/GameResultTest.java +++ b/src/test/java/blackjack/domain/GameResultTest.java @@ -1,7 +1,6 @@ package blackjack.domain; import static org.assertj.core.api.Assertions.assertThat; -import static org.junit.jupiter.api.Assertions.*; import org.junit.jupiter.api.DisplayName; import org.junit.jupiter.api.Test;