From 6a4844dae968ac63d20e20ce1d13ea2a1509bb73 Mon Sep 17 00:00:00 2001 From: 3juhwan <13selfesteem91@naver.com> Date: Tue, 5 Mar 2024 15:22:16 +0900 Subject: [PATCH 01/56] =?UTF-8?q?docs:=20=EA=B8=B0=EB=8A=A5=20=EC=9A=94?= =?UTF-8?q?=EA=B5=AC=20=EC=82=AC=ED=95=AD=20=EC=9E=91=EC=84=B1?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Co-authored-by: jeongjiho0731@gmail.com --- README.md | 44 ++++++++++++++++++++++++++++++++++++++++---- 1 file changed, 40 insertions(+), 4 deletions(-) diff --git a/README.md b/README.md index 556099c4de3..a84f801321b 100644 --- a/README.md +++ b/README.md @@ -1,7 +1,43 @@ -# java-blackjack +# 블랙잭 -블랙잭 미션 저장소 -## 우아한테크코스 코드리뷰 +## 기능 요구 사항 -- [온라인 코드 리뷰 과정](https://github.com/woowacourse/woowacourse-docs/blob/master/maincourse/README.md) +### 플레이어 이름 + +### 플레이어 + +- [ ] 플레이어는 이름을 갖는다 +- [ ] 플레이어는 카드들을 갖는다 +- [ ] 플레이어는 카드를 저장한다 +- [ ] 죽었는지 안 죽었는지 여부를 반환한다 (21을 초과하는지) + + +### 카드 + +- [ ] 문자와 모양을 상태로 갖는다 + + +### 카드들 + +- [ ] 여러개의 카드를 갖는다 +- [ ] 카드의 총합이 21 초과 여부를 반환한다 +- [ ] 카드의 총합 계산한다 +- [ ] 카드 추가한다 + + +### 카드 게임 + +- [ ] 각 플레이어에게 카드를 2장씩 지급한다 +- [ ] 플레이어마다 추가 지급한다 + + +### 인풋 뷰 + +- [ ] 사용자 카드 합이 21을 초과하면, 카드 추가 여부를 묻지 않는다. +- [ ] 플레이어가 n을 입력할 때 까지 카드 추가 여부를 묻는다. + + +### 아웃풋 뷰 + +- [ ] 딜러가 추가 카드를 발급 받았는지 여부 출력 From 34f668ec37f7516bdeed2d3a422df28094865bbb Mon Sep 17 00:00:00 2001 From: 3juhwan <13selfesteem91@naver.com> Date: Tue, 5 Mar 2024 16:02:51 +0900 Subject: [PATCH 02/56] =?UTF-8?q?feat:=20=ED=94=8C=EB=A0=88=EC=9D=B4?= =?UTF-8?q?=EC=96=B4=EC=97=90=EA=B2=8C=20=EC=B9=B4=EB=93=9C=EB=A5=BC=20?= =?UTF-8?q?=EB=B6=84=EB=B0=B0=ED=95=98=EB=8A=94=20=EA=B8=B0=EB=8A=A5=20?= =?UTF-8?q?=EA=B5=AC=ED=98=84?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Co-authored-by: J-I-H-O --- src/main/java/blackjack/domain/Card.java | 4 ++++ src/main/java/blackjack/domain/CardGame.java | 7 +++++++ src/main/java/blackjack/domain/Player.java | 17 +++++++++++++++++ .../java/blackjack/domain/CardGameTest.java | 18 ++++++++++++++++++ 4 files changed, 46 insertions(+) create mode 100644 src/main/java/blackjack/domain/Card.java create mode 100644 src/main/java/blackjack/domain/CardGame.java create mode 100644 src/main/java/blackjack/domain/Player.java create mode 100644 src/test/java/blackjack/domain/CardGameTest.java diff --git a/src/main/java/blackjack/domain/Card.java b/src/main/java/blackjack/domain/Card.java new file mode 100644 index 00000000000..5879aa37896 --- /dev/null +++ b/src/main/java/blackjack/domain/Card.java @@ -0,0 +1,4 @@ +package blackjack.domain; + +public class Card { +} diff --git a/src/main/java/blackjack/domain/CardGame.java b/src/main/java/blackjack/domain/CardGame.java new file mode 100644 index 00000000000..620bdee685d --- /dev/null +++ b/src/main/java/blackjack/domain/CardGame.java @@ -0,0 +1,7 @@ +package blackjack.domain; + +public class CardGame { + public void giveCard(final Player player, final Card card) { + player.addCard(card); + } +} diff --git a/src/main/java/blackjack/domain/Player.java b/src/main/java/blackjack/domain/Player.java new file mode 100644 index 00000000000..14d9c76e558 --- /dev/null +++ b/src/main/java/blackjack/domain/Player.java @@ -0,0 +1,17 @@ +package blackjack.domain; + +import java.util.ArrayList; +import java.util.Collections; +import java.util.List; + +public class Player { + private final List cards = new ArrayList<>(); + + public void addCard(final Card card) { + cards.add(card); + } + + public List getCards() { + return Collections.unmodifiableList(cards); + } +} diff --git a/src/test/java/blackjack/domain/CardGameTest.java b/src/test/java/blackjack/domain/CardGameTest.java new file mode 100644 index 00000000000..44e44f150c5 --- /dev/null +++ b/src/test/java/blackjack/domain/CardGameTest.java @@ -0,0 +1,18 @@ +package blackjack.domain; + +import org.junit.jupiter.api.Test; + +import static org.assertj.core.api.Assertions.assertThat; + +public class CardGameTest { + @Test + void 카드_한_장을_플레이어에게_준다() { + Player player = new Player(); + Card card = new Card(); + + CardGame cardGame = new CardGame(); + cardGame.giveCard(player, card); + + assertThat(player.getCards().size()).isEqualTo(1); + } +} From 8163280b6b1cec45e449f4389b094378a94ee09d Mon Sep 17 00:00:00 2001 From: 3juhwan <13selfesteem91@naver.com> Date: Tue, 5 Mar 2024 16:43:42 +0900 Subject: [PATCH 03/56] =?UTF-8?q?feat:=20=EA=B0=81=20=ED=94=8C=EB=A0=88?= =?UTF-8?q?=EC=9D=B4=EC=96=B4=EC=97=90=EA=B2=8C=202=EC=9E=A5=EC=94=A9=20?= =?UTF-8?q?=EC=B9=B4=EB=93=9C=EB=A5=BC=20=EB=B6=84=EB=B0=B0=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: MangCho <13selfesteem91@naver.com> Co-authored-by: J-I-H-O --- src/main/java/blackjack/domain/CardGame.java | 13 ++++++++++++ .../java/blackjack/domain/CardGenerator.java | 5 +++++ .../blackjack/domain/RandomCardGenerator.java | 12 +++++++++++ .../java/blackjack/domain/CardGameTest.java | 20 ++++++++++++++++++- 4 files changed, 49 insertions(+), 1 deletion(-) create mode 100644 src/main/java/blackjack/domain/CardGenerator.java create mode 100644 src/main/java/blackjack/domain/RandomCardGenerator.java diff --git a/src/main/java/blackjack/domain/CardGame.java b/src/main/java/blackjack/domain/CardGame.java index 620bdee685d..ba890a177da 100644 --- a/src/main/java/blackjack/domain/CardGame.java +++ b/src/main/java/blackjack/domain/CardGame.java @@ -1,7 +1,20 @@ package blackjack.domain; +import java.util.List; + public class CardGame { public void giveCard(final Player player, final Card card) { player.addCard(card); } + + // TODO: 이름 수정 + void giveTwoCardsEachPlayer(final List players) { + // TODO: 주입 받도록 변경 + final CardGenerator cardGenerator = new RandomCardGenerator(); + for (Player player : players) { + // TODO: 개선 필요 + giveCard(player, cardGenerator.generate()); + giveCard(player, cardGenerator.generate()); + } + } } diff --git a/src/main/java/blackjack/domain/CardGenerator.java b/src/main/java/blackjack/domain/CardGenerator.java new file mode 100644 index 00000000000..b805367b1b5 --- /dev/null +++ b/src/main/java/blackjack/domain/CardGenerator.java @@ -0,0 +1,5 @@ +package blackjack.domain; + +public interface CardGenerator { + Card generate(); +} diff --git a/src/main/java/blackjack/domain/RandomCardGenerator.java b/src/main/java/blackjack/domain/RandomCardGenerator.java new file mode 100644 index 00000000000..edfcff77e5f --- /dev/null +++ b/src/main/java/blackjack/domain/RandomCardGenerator.java @@ -0,0 +1,12 @@ +package blackjack.domain; + +import java.util.Random; + +public class RandomCardGenerator implements CardGenerator { + private static final Random RANDOM = new Random(); + + @Override + public Card generate() { + return new Card(); + } +} diff --git a/src/test/java/blackjack/domain/CardGameTest.java b/src/test/java/blackjack/domain/CardGameTest.java index 44e44f150c5..d50de929038 100644 --- a/src/test/java/blackjack/domain/CardGameTest.java +++ b/src/test/java/blackjack/domain/CardGameTest.java @@ -1,12 +1,15 @@ package blackjack.domain; +import org.assertj.core.api.SoftAssertions; import org.junit.jupiter.api.Test; +import java.util.List; + import static org.assertj.core.api.Assertions.assertThat; public class CardGameTest { @Test - void 카드_한_장을_플레이어에게_준다() { + void 카드_한_장을_플레이어에게_지급한다() { Player player = new Player(); Card card = new Card(); @@ -15,4 +18,19 @@ public class CardGameTest { assertThat(player.getCards().size()).isEqualTo(1); } + + @Test + void 모든_플레이어에게_카드_2장을_지급한다() { + Player mangcho = new Player(); + Player ddang = new Player(); + List players = List.of(mangcho, ddang); + + CardGame cardGame = new CardGame(); + cardGame.giveTwoCardsEachPlayer(players); + + SoftAssertions.assertSoftly(softly -> { + softly.assertThat(mangcho.getCards().size()).isEqualTo(2); + softly.assertThat(ddang.getCards().size()).isEqualTo(2); + }); + } } From 4d55c54bbc3936f8e8af96fc5dc7be6681d165b9 Mon Sep 17 00:00:00 2001 From: 3juhwan <13selfesteem91@naver.com> Date: Wed, 6 Mar 2024 12:31:06 +0900 Subject: [PATCH 04/56] =?UTF-8?q?feat:=20=EA=B0=80=EC=A7=84=20=ED=8C=A8?= =?UTF-8?q?=EC=9D=98=20=ED=95=A9=EA=B3=84=EB=A5=BC=20=EA=B5=AC=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: MangCho <13selfesteem91@naver.com> Co-authored-by: J-I-H-O --- README.md | 18 ++++++------- src/main/java/blackjack/domain/Card.java | 11 ++++++++ .../java/blackjack/domain/CardNumber.java | 27 +++++++++++++++++++ src/main/java/blackjack/domain/CardShape.java | 8 ++++++ src/main/java/blackjack/domain/Hand.java | 18 +++++++++++++ .../blackjack/domain/RandomCardGenerator.java | 5 +++- .../java/blackjack/domain/CardGameTest.java | 2 +- src/test/java/blackjack/domain/HandTest.java | 23 ++++++++++++++++ 8 files changed, 101 insertions(+), 11 deletions(-) create mode 100644 src/main/java/blackjack/domain/CardNumber.java create mode 100644 src/main/java/blackjack/domain/CardShape.java create mode 100644 src/main/java/blackjack/domain/Hand.java create mode 100644 src/test/java/blackjack/domain/HandTest.java diff --git a/README.md b/README.md index a84f801321b..6122a46dc6c 100644 --- a/README.md +++ b/README.md @@ -8,28 +8,28 @@ ### 플레이어 - [ ] 플레이어는 이름을 갖는다 -- [ ] 플레이어는 카드들을 갖는다 -- [ ] 플레이어는 카드를 저장한다 +- [X] 플레이어는 카드들을 갖는다 +- [X] 플레이어는 카드를 저장한다 - [ ] 죽었는지 안 죽었는지 여부를 반환한다 (21을 초과하는지) ### 카드 -- [ ] 문자와 모양을 상태로 갖는다 +- [x] 문자와 모양을 상태로 갖는다 -### 카드들 +### Hand(카드들) -- [ ] 여러개의 카드를 갖는다 +- [x] 여러개의 카드를 갖는다 - [ ] 카드의 총합이 21 초과 여부를 반환한다 -- [ ] 카드의 총합 계산한다 -- [ ] 카드 추가한다 +- [x] 카드의 총합 계산한다 +- [x] 카드 추가한다 ### 카드 게임 -- [ ] 각 플레이어에게 카드를 2장씩 지급한다 -- [ ] 플레이어마다 추가 지급한다 +- [x] 각 플레이어에게 카드를 2장씩 지급한다 +- [x] 플레이어마다 추가 지급한다 ### 인풋 뷰 diff --git a/src/main/java/blackjack/domain/Card.java b/src/main/java/blackjack/domain/Card.java index 5879aa37896..4839fbba332 100644 --- a/src/main/java/blackjack/domain/Card.java +++ b/src/main/java/blackjack/domain/Card.java @@ -1,4 +1,15 @@ package blackjack.domain; public class Card { + private final CardNumber cardNumber; + private final CardShape cardShape; + + public Card(final CardNumber cardNumber, final CardShape cardShape) { + this.cardNumber = cardNumber; + this.cardShape = cardShape; + } + + public int getNumber() { + return cardNumber.getValue(); + } } diff --git a/src/main/java/blackjack/domain/CardNumber.java b/src/main/java/blackjack/domain/CardNumber.java new file mode 100644 index 00000000000..cae663f1d79 --- /dev/null +++ b/src/main/java/blackjack/domain/CardNumber.java @@ -0,0 +1,27 @@ +package blackjack.domain; + +public enum CardNumber { + ACE(1), + TWO(2), + THREE(3), + FOUR(4), + FIVE(5), + SIX(6), + SEVEN(7), + EIGHT(8), + NINE(9), + TEN(10), + JACK(10), + QUEEN(10), + KING(10); + + private final int value; + + CardNumber(final int value) { + this.value = value; + } + + public int getValue() { + return value; + } +} diff --git a/src/main/java/blackjack/domain/CardShape.java b/src/main/java/blackjack/domain/CardShape.java new file mode 100644 index 00000000000..9724bfdc63f --- /dev/null +++ b/src/main/java/blackjack/domain/CardShape.java @@ -0,0 +1,8 @@ +package blackjack.domain; + +public enum CardShape { + SPADE, + HEART, + DIAMOND, + CLOVER +} diff --git a/src/main/java/blackjack/domain/Hand.java b/src/main/java/blackjack/domain/Hand.java new file mode 100644 index 00000000000..9a6cd71c79d --- /dev/null +++ b/src/main/java/blackjack/domain/Hand.java @@ -0,0 +1,18 @@ +package blackjack.domain; + +import java.util.ArrayList; +import java.util.List; + +public class Hand { + private final List cards = new ArrayList<>(); + + public int getSum() { + return cards.stream() + .mapToInt(Card::getNumber) + .sum(); + } + + public void add(final Card card) { + cards.add(card); + } +} diff --git a/src/main/java/blackjack/domain/RandomCardGenerator.java b/src/main/java/blackjack/domain/RandomCardGenerator.java index edfcff77e5f..72ecfcb490d 100644 --- a/src/main/java/blackjack/domain/RandomCardGenerator.java +++ b/src/main/java/blackjack/domain/RandomCardGenerator.java @@ -2,11 +2,14 @@ import java.util.Random; +import static blackjack.domain.CardNumber.ACE; +import static blackjack.domain.CardShape.SPADE; + public class RandomCardGenerator implements CardGenerator { private static final Random RANDOM = new Random(); @Override public Card generate() { - return new Card(); + return new Card(ACE, SPADE); } } diff --git a/src/test/java/blackjack/domain/CardGameTest.java b/src/test/java/blackjack/domain/CardGameTest.java index d50de929038..3bf612b7de2 100644 --- a/src/test/java/blackjack/domain/CardGameTest.java +++ b/src/test/java/blackjack/domain/CardGameTest.java @@ -11,7 +11,7 @@ public class CardGameTest { @Test void 카드_한_장을_플레이어에게_지급한다() { Player player = new Player(); - Card card = new Card(); + Card card = new Card(CardNumber.ACE, CardShape.SPADE); CardGame cardGame = new CardGame(); cardGame.giveCard(player, card); diff --git a/src/test/java/blackjack/domain/HandTest.java b/src/test/java/blackjack/domain/HandTest.java new file mode 100644 index 00000000000..668b247cd54 --- /dev/null +++ b/src/test/java/blackjack/domain/HandTest.java @@ -0,0 +1,23 @@ +package blackjack.domain; + +import org.junit.jupiter.api.Test; + +import static blackjack.domain.CardNumber.JACK; +import static blackjack.domain.CardNumber.KING; +import static blackjack.domain.CardNumber.QUEEN; +import static blackjack.domain.CardShape.SPADE; +import static org.assertj.core.api.Assertions.assertThat; + +public class HandTest { + @Test + void 가진_패의_숫자의_합계를_구할_수_있다() { + Hand hand = new Hand(); + hand.add(new Card(JACK, SPADE)); + hand.add(new Card(QUEEN, SPADE)); + hand.add(new Card(KING, SPADE)); + + int sum = hand.getSum(); + + assertThat(sum).isEqualTo(30); + } +} From b180f62571b59b2edafbb9af490e3246bacf33ca Mon Sep 17 00:00:00 2001 From: 3juhwan <13selfesteem91@naver.com> Date: Wed, 6 Mar 2024 14:46:21 +0900 Subject: [PATCH 05/56] =?UTF-8?q?feat:=20=ED=94=8C=EB=A0=88=EC=9D=B4?= =?UTF-8?q?=EC=96=B4=EA=B0=80=20=EC=A3=BD=EC=97=88=EB=8A=94=EC=A7=80=20?= =?UTF-8?q?=EC=97=AC=EB=B6=80=EB=A5=BC=20=EB=B0=98=ED=99=98=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: MangCho <13selfesteem91@naver.com> Co-authored-by: J-I-H-O --- README.md | 5 ++--- src/main/java/blackjack/domain/CardGame.java | 2 +- src/main/java/blackjack/domain/Hand.java | 5 +++++ src/main/java/blackjack/domain/Player.java | 20 ++++++++++++----- .../java/blackjack/domain/CardGameTest.java | 6 ++--- .../java/blackjack/domain/PlayerTest.java | 22 +++++++++++++++++++ 6 files changed, 47 insertions(+), 13 deletions(-) create mode 100644 src/test/java/blackjack/domain/PlayerTest.java diff --git a/README.md b/README.md index 6122a46dc6c..6bb8924012e 100644 --- a/README.md +++ b/README.md @@ -9,8 +9,8 @@ - [ ] 플레이어는 이름을 갖는다 - [X] 플레이어는 카드들을 갖는다 -- [X] 플레이어는 카드를 저장한다 -- [ ] 죽었는지 안 죽었는지 여부를 반환한다 (21을 초과하는지) +- [X] 플레이어는 카드를 저장한다 +- [X] 죽었는지 안 죽었는지 여부를 반환한다 (21을 초과하는지) ### 카드 @@ -21,7 +21,6 @@ ### Hand(카드들) - [x] 여러개의 카드를 갖는다 -- [ ] 카드의 총합이 21 초과 여부를 반환한다 - [x] 카드의 총합 계산한다 - [x] 카드 추가한다 diff --git a/src/main/java/blackjack/domain/CardGame.java b/src/main/java/blackjack/domain/CardGame.java index ba890a177da..718e2433725 100644 --- a/src/main/java/blackjack/domain/CardGame.java +++ b/src/main/java/blackjack/domain/CardGame.java @@ -4,7 +4,7 @@ public class CardGame { public void giveCard(final Player player, final Card card) { - player.addCard(card); + player.addCards(card); } // TODO: 이름 수정 diff --git a/src/main/java/blackjack/domain/Hand.java b/src/main/java/blackjack/domain/Hand.java index 9a6cd71c79d..b948356dde8 100644 --- a/src/main/java/blackjack/domain/Hand.java +++ b/src/main/java/blackjack/domain/Hand.java @@ -1,6 +1,7 @@ package blackjack.domain; import java.util.ArrayList; +import java.util.Collections; import java.util.List; public class Hand { @@ -15,4 +16,8 @@ public int getSum() { public void add(final Card card) { cards.add(card); } + + public List getAllCards() { + return Collections.unmodifiableList(cards); + } } diff --git a/src/main/java/blackjack/domain/Player.java b/src/main/java/blackjack/domain/Player.java index 14d9c76e558..e82558048af 100644 --- a/src/main/java/blackjack/domain/Player.java +++ b/src/main/java/blackjack/domain/Player.java @@ -1,17 +1,25 @@ package blackjack.domain; -import java.util.ArrayList; -import java.util.Collections; import java.util.List; public class Player { - private final List cards = new ArrayList<>(); + private final Hand hand; - public void addCard(final Card card) { - cards.add(card); + public Player(final Hand hand) { + this.hand = hand; + } + + public void addCards(final Card... cards) { + for (Card card : cards) { + hand.add(card); + } } public List getCards() { - return Collections.unmodifiableList(cards); + return hand.getAllCards(); + } + + public boolean isDead() { + return hand.getSum() > 21; } } diff --git a/src/test/java/blackjack/domain/CardGameTest.java b/src/test/java/blackjack/domain/CardGameTest.java index 3bf612b7de2..5940764cc9a 100644 --- a/src/test/java/blackjack/domain/CardGameTest.java +++ b/src/test/java/blackjack/domain/CardGameTest.java @@ -10,7 +10,7 @@ public class CardGameTest { @Test void 카드_한_장을_플레이어에게_지급한다() { - Player player = new Player(); + Player player = new Player(new Hand()); Card card = new Card(CardNumber.ACE, CardShape.SPADE); CardGame cardGame = new CardGame(); @@ -21,8 +21,8 @@ public class CardGameTest { @Test void 모든_플레이어에게_카드_2장을_지급한다() { - Player mangcho = new Player(); - Player ddang = new Player(); + Player mangcho = new Player(new Hand()); + Player ddang = new Player(new Hand()); List players = List.of(mangcho, ddang); CardGame cardGame = new CardGame(); diff --git a/src/test/java/blackjack/domain/PlayerTest.java b/src/test/java/blackjack/domain/PlayerTest.java new file mode 100644 index 00000000000..ba40d2f9d8e --- /dev/null +++ b/src/test/java/blackjack/domain/PlayerTest.java @@ -0,0 +1,22 @@ +package blackjack.domain; + +import org.junit.jupiter.api.Test; + +import static blackjack.domain.CardNumber.KING; +import static blackjack.domain.CardShape.CLOVER; +import static blackjack.domain.CardShape.HEART; +import static blackjack.domain.CardShape.SPADE; +import static org.assertj.core.api.Assertions.assertThat; + +public class PlayerTest { + + @Test + void 플레이어는_죽었는지_여부를_반환한다() { + Player player = new Player(new Hand()); + player.addCards(new Card(KING, CLOVER), new Card(KING, SPADE), new Card(KING, HEART)); + + boolean isDead = player.isDead(); + + assertThat(isDead).isTrue(); + } +} From 5135ec3ef3efb97e69f8174b7dc525ae2c18ea6b Mon Sep 17 00:00:00 2001 From: 3juhwan <13selfesteem91@naver.com> Date: Wed, 6 Mar 2024 15:30:00 +0900 Subject: [PATCH 06/56] =?UTF-8?q?feat:=20=EC=B9=B4=EB=93=9C=20=EB=8D=B1?= =?UTF-8?q?=EC=97=90=EC=84=9C=20=EB=AC=B4=EC=9E=91=EC=9C=84=20=EC=B9=B4?= =?UTF-8?q?=EB=93=9C=EB=A5=BC=20=EB=BD=91=EB=8A=94=20=EA=B8=B0=EB=8A=A5=20?= =?UTF-8?q?=EA=B5=AC=ED=98=84?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Co-authored-by: MangCho <13selfesteem91@naver.com> Co-authored-by: J-I-H-O --- README.md | 6 +++++ src/main/java/blackjack/domain/CardDeck.java | 25 +++++++++++++++++++ .../java/blackjack/domain/CardDeckTest.java | 17 +++++++++++++ 3 files changed, 48 insertions(+) create mode 100644 src/main/java/blackjack/domain/CardDeck.java create mode 100644 src/test/java/blackjack/domain/CardDeckTest.java diff --git a/README.md b/README.md index 6bb8924012e..4af8ff1088d 100644 --- a/README.md +++ b/README.md @@ -31,6 +31,12 @@ - [x] 플레이어마다 추가 지급한다 +### 덱 + +- [x] 모든 카드를 1장씩 갖고 있다. +- [x] 랜덤으로 카드를 뽑는다. + + ### 인풋 뷰 - [ ] 사용자 카드 합이 21을 초과하면, 카드 추가 여부를 묻지 않는다. diff --git a/src/main/java/blackjack/domain/CardDeck.java b/src/main/java/blackjack/domain/CardDeck.java new file mode 100644 index 00000000000..bcab9901f13 --- /dev/null +++ b/src/main/java/blackjack/domain/CardDeck.java @@ -0,0 +1,25 @@ +package blackjack.domain; + +import java.util.Collections; +import java.util.Stack; + +public class CardDeck { + private final Stack deck; + + public CardDeck() { + final Stack deck = new Stack<>(); + for (CardNumber cardNumber : CardNumber.values()) { + for (CardShape cardShape : CardShape.values()) { + deck.push(new Card(cardNumber, cardShape)); + } + } + + Collections.shuffle(deck); + + this.deck = deck; + } + + public Card draw() { + return deck.pop(); + } +} diff --git a/src/test/java/blackjack/domain/CardDeckTest.java b/src/test/java/blackjack/domain/CardDeckTest.java new file mode 100644 index 00000000000..62e28a3942c --- /dev/null +++ b/src/test/java/blackjack/domain/CardDeckTest.java @@ -0,0 +1,17 @@ +package blackjack.domain; + +import org.junit.jupiter.api.Test; + +import static org.assertj.core.api.Assertions.assertThat; + +public class CardDeckTest { + + @Test + void 덱에서_카드를_뽑을_수_있다() { + CardDeck deck = new CardDeck(); + + Card card = deck.draw(); + + assertThat(card).isNotNull(); + } +} From 49b516877c2989980fd551f4185a86fb2030c022 Mon Sep 17 00:00:00 2001 From: 3juhwan <13selfesteem91@naver.com> Date: Wed, 6 Mar 2024 16:58:42 +0900 Subject: [PATCH 07/56] =?UTF-8?q?feat:=20=EB=94=9C=EB=9F=AC=EC=99=80=20?= =?UTF-8?q?=EB=8B=A8=EC=9D=BC=20=ED=94=8C=EB=A0=88=EC=9D=B4=EC=96=B4?= =?UTF-8?q?=EC=9D=98=20=EC=8A=B9=ED=8C=A8=EB=A5=BC=20=ED=8C=90=EB=8B=A8?= =?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: MangCho <13selfesteem91@naver.com> Co-authored-by: J-I-H-O --- README.md | 10 +++++- .../java/blackjack/domain/CardGameJudge.java | 32 +++++++++++++++++++ .../java/blackjack/domain/CardGameResult.java | 19 +++++++++++ src/main/java/blackjack/domain/Player.java | 5 +++ .../java/blackjack/domain/WinningStatus.java | 7 ++++ .../java/blackjack/domain/CardGameTest.java | 32 +++++++++++++++++-- 6 files changed, 101 insertions(+), 4 deletions(-) create mode 100644 src/main/java/blackjack/domain/CardGameJudge.java create mode 100644 src/main/java/blackjack/domain/CardGameResult.java create mode 100644 src/main/java/blackjack/domain/WinningStatus.java diff --git a/README.md b/README.md index 4af8ff1088d..2df539ac19b 100644 --- a/README.md +++ b/README.md @@ -34,7 +34,15 @@ ### 덱 - [x] 모든 카드를 1장씩 갖고 있다. -- [x] 랜덤으로 카드를 뽑는다. +- [x] 랜덤으로 카드를 뽑는다. + + +### 게임 승패 결정 + +- [ ] 딜러와 모든 플레이어의 승패 여부를 결정한다. + - [ ] 21을 초과한 사람이 패배한다. + - [ ] 딜러와 플레이어 둘다 21을 초과할 경우에, 딜러가 승리한다. + - [ ] 숫자가 큰 사람이 승리한다. ### 인풋 뷰 diff --git a/src/main/java/blackjack/domain/CardGameJudge.java b/src/main/java/blackjack/domain/CardGameJudge.java new file mode 100644 index 00000000000..cf0db66efce --- /dev/null +++ b/src/main/java/blackjack/domain/CardGameJudge.java @@ -0,0 +1,32 @@ +package blackjack.domain; + +import java.util.LinkedHashMap; +import java.util.Map; + +public class CardGameJudge { + + // TODO : 판단의 책임을 dealer가 담당할 수 있지 않을까? + public CardGameResult judge(Player dealer, Player player) { + int dealerScore = dealer.getScore(); + int playerScore = player.getScore(); + + // TODO : 이름 바꾸기 + WinningStatus status = isPlayerWin(dealerScore, playerScore); + + Map result = new LinkedHashMap<>(); + result.put(player, status); + + return new CardGameResult(result); + } + + // TODO: 이름 바꾸기 + private WinningStatus isPlayerWin(int score1, int score2) { + if (score1 == score2) { + return WinningStatus.PUSH; // TODO: 도메인 지식 없으면 이해하기 힘듦 + } + if (score1 < score2) { + return WinningStatus.WIN; + } + return WinningStatus.LOSE; + } +} diff --git a/src/main/java/blackjack/domain/CardGameResult.java b/src/main/java/blackjack/domain/CardGameResult.java new file mode 100644 index 00000000000..15bbfb687eb --- /dev/null +++ b/src/main/java/blackjack/domain/CardGameResult.java @@ -0,0 +1,19 @@ +package blackjack.domain; + +import java.util.Collections; +import java.util.Map; + +public class CardGameResult { + private final Map totalResult; + + public CardGameResult(Map totalResult) { + this.totalResult = totalResult; + } + + public Map getTotalResult() { + return Collections.unmodifiableMap(totalResult); + } + + // TODO : cardGameResult.getDealerWinCount(); + // TODO : cardGameResult.getDealerLoseCount(); +} diff --git a/src/main/java/blackjack/domain/Player.java b/src/main/java/blackjack/domain/Player.java index e82558048af..8630a3fbc36 100644 --- a/src/main/java/blackjack/domain/Player.java +++ b/src/main/java/blackjack/domain/Player.java @@ -22,4 +22,9 @@ public List getCards() { public boolean isDead() { return hand.getSum() > 21; } + + // TODO : 꼭 필요한 메서드일까? + public int getScore() { + return hand.getSum(); + } } diff --git a/src/main/java/blackjack/domain/WinningStatus.java b/src/main/java/blackjack/domain/WinningStatus.java new file mode 100644 index 00000000000..f6d548b0fe7 --- /dev/null +++ b/src/main/java/blackjack/domain/WinningStatus.java @@ -0,0 +1,7 @@ +package blackjack.domain; + +public enum WinningStatus { + WIN, + PUSH, + LOSE +} diff --git a/src/test/java/blackjack/domain/CardGameTest.java b/src/test/java/blackjack/domain/CardGameTest.java index 5940764cc9a..a5981a176a8 100644 --- a/src/test/java/blackjack/domain/CardGameTest.java +++ b/src/test/java/blackjack/domain/CardGameTest.java @@ -1,17 +1,21 @@ package blackjack.domain; -import org.assertj.core.api.SoftAssertions; import org.junit.jupiter.api.Test; import java.util.List; +import static blackjack.domain.CardNumber.ACE; +import static blackjack.domain.CardNumber.KING; +import static blackjack.domain.CardShape.HEART; +import static blackjack.domain.CardShape.SPADE; import static org.assertj.core.api.Assertions.assertThat; +import static org.assertj.core.api.SoftAssertions.assertSoftly; public class CardGameTest { @Test void 카드_한_장을_플레이어에게_지급한다() { Player player = new Player(new Hand()); - Card card = new Card(CardNumber.ACE, CardShape.SPADE); + Card card = new Card(ACE, SPADE); CardGame cardGame = new CardGame(); cardGame.giveCard(player, card); @@ -28,9 +32,31 @@ public class CardGameTest { CardGame cardGame = new CardGame(); cardGame.giveTwoCardsEachPlayer(players); - SoftAssertions.assertSoftly(softly -> { + assertSoftly(softly -> { softly.assertThat(mangcho.getCards().size()).isEqualTo(2); softly.assertThat(ddang.getCards().size()).isEqualTo(2); }); } + + @Test + void 딜러와_모든_플레이어의_숫자가_21_이하인_경우_숫자가_큰_사람이_이긴다() { + CardGameJudge cardGameJudge = new CardGameJudge(); + + Hand mangchoHand = new Hand(); + mangchoHand.add(new Card(ACE, HEART)); + mangchoHand.add(new Card(KING, HEART)); + mangchoHand.add(new Card(KING, SPADE)); + Player mangcho = new Player(mangchoHand); + + Hand dealerHand = new Hand(); + dealerHand.add(new Card(ACE, HEART)); + dealerHand.add(new Card(ACE, HEART)); + dealerHand.add(new Card(KING, SPADE)); + Player dealer = new Player(dealerHand); + + var result = cardGameJudge.judge(dealer, mangcho).getTotalResult(); + + assertThat(result.get(mangcho)).isEqualTo(WinningStatus.WIN); + } + } From 280ef53372db03f286141bab969635170b5a4da5 Mon Sep 17 00:00:00 2001 From: 3juhwan <13selfesteem91@naver.com> Date: Wed, 6 Mar 2024 17:34:47 +0900 Subject: [PATCH 08/56] =?UTF-8?q?feat:=20=EB=94=9C=EB=9F=AC=EC=99=80=20?= =?UTF-8?q?=EC=97=AC=EB=9F=AC=20=ED=94=8C=EB=A0=88=EC=9D=B4=EC=96=B4?= =?UTF-8?q?=EC=9D=98=20=EC=8A=B9=ED=8C=A8=EB=A5=BC=20=ED=8C=90=EB=8B=A8?= =?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: MangCho <13selfesteem91@naver.com> Co-authored-by: J-I-H-O --- README.md | 3 ++ .../java/blackjack/domain/CardGameJudge.java | 28 +++++++++++-------- .../java/blackjack/domain/CardGameTest.java | 12 ++++++-- 3 files changed, 29 insertions(+), 14 deletions(-) diff --git a/README.md b/README.md index 2df539ac19b..79efda8ce8c 100644 --- a/README.md +++ b/README.md @@ -38,6 +38,9 @@ ### 게임 승패 결정 + +sangseok0609 +5910원 - [ ] 딜러와 모든 플레이어의 승패 여부를 결정한다. - [ ] 21을 초과한 사람이 패배한다. diff --git a/src/main/java/blackjack/domain/CardGameJudge.java b/src/main/java/blackjack/domain/CardGameJudge.java index cf0db66efce..d7f4bd0356e 100644 --- a/src/main/java/blackjack/domain/CardGameJudge.java +++ b/src/main/java/blackjack/domain/CardGameJudge.java @@ -1,30 +1,36 @@ package blackjack.domain; import java.util.LinkedHashMap; +import java.util.List; import java.util.Map; public class CardGameJudge { + public CardGameResult judge(final Player dealer, final List players) { + Map result = new LinkedHashMap<>(); + + for (final Player player : players) { + WinningStatus winningStatus = judge(dealer, player); + result.put(player, winningStatus); + } + + return new CardGameResult(result); + } + // TODO : 판단의 책임을 dealer가 담당할 수 있지 않을까? - public CardGameResult judge(Player dealer, Player player) { + private WinningStatus judge(final Player dealer, final Player player) { int dealerScore = dealer.getScore(); int playerScore = player.getScore(); - // TODO : 이름 바꾸기 - WinningStatus status = isPlayerWin(dealerScore, playerScore); - - Map result = new LinkedHashMap<>(); - result.put(player, status); - - return new CardGameResult(result); + return doesPlayerWin(dealerScore, playerScore); } // TODO: 이름 바꾸기 - private WinningStatus isPlayerWin(int score1, int score2) { - if (score1 == score2) { + private WinningStatus doesPlayerWin(final int dealerScore, final int playerScore) { + if (dealerScore == playerScore) { return WinningStatus.PUSH; // TODO: 도메인 지식 없으면 이해하기 힘듦 } - if (score1 < score2) { + if (dealerScore < playerScore) { return WinningStatus.WIN; } return WinningStatus.LOSE; diff --git a/src/test/java/blackjack/domain/CardGameTest.java b/src/test/java/blackjack/domain/CardGameTest.java index a5981a176a8..198400a269d 100644 --- a/src/test/java/blackjack/domain/CardGameTest.java +++ b/src/test/java/blackjack/domain/CardGameTest.java @@ -39,7 +39,7 @@ public class CardGameTest { } @Test - void 딜러와_모든_플레이어의_숫자가_21_이하인_경우_숫자가_큰_사람이_이긴다() { + void 딜러와_여러_플레이어의_숫자가_21_이하인_경우_숫자가_큰_사람이_이긴다() { CardGameJudge cardGameJudge = new CardGameJudge(); Hand mangchoHand = new Hand(); @@ -48,15 +48,21 @@ public class CardGameTest { mangchoHand.add(new Card(KING, SPADE)); Player mangcho = new Player(mangchoHand); + Hand ddangHand = new Hand(); + ddangHand.add(new Card(ACE, HEART)); + ddangHand.add(new Card(KING, HEART)); + ddangHand.add(new Card(KING, SPADE)); + Player ddang = new Player(ddangHand); + Hand dealerHand = new Hand(); dealerHand.add(new Card(ACE, HEART)); dealerHand.add(new Card(ACE, HEART)); dealerHand.add(new Card(KING, SPADE)); Player dealer = new Player(dealerHand); - var result = cardGameJudge.judge(dealer, mangcho).getTotalResult(); + var result = cardGameJudge.judge(dealer, List.of(mangcho, ddang)).getTotalResult(); assertThat(result.get(mangcho)).isEqualTo(WinningStatus.WIN); + assertThat(result.get(ddang)).isEqualTo(WinningStatus.WIN); } - } From 14abcca7301838222ed7842d78ef942a909c5d1f Mon Sep 17 00:00:00 2001 From: 3juhwan <13selfesteem91@naver.com> Date: Wed, 6 Mar 2024 18:06:15 +0900 Subject: [PATCH 09/56] =?UTF-8?q?refactor:=20=ED=94=8C=EB=A0=88=EC=9D=B4?= =?UTF-8?q?=EC=96=B4=EC=97=90=20=ED=94=BD=EC=8A=A4=EC=B2=98=20=EC=A0=81?= =?UTF-8?q?=EC=9A=A9?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Co-authored-by: MangCho <13selfesteem91@naver.com> Co-authored-by: J-I-H-O --- .../java/blackjack/domain/CardGameTest.java | 26 +++---------- .../java/blackjack/fixture/PlayerFixture.java | 39 +++++++++++++++++++ 2 files changed, 45 insertions(+), 20 deletions(-) create mode 100644 src/test/java/blackjack/fixture/PlayerFixture.java diff --git a/src/test/java/blackjack/domain/CardGameTest.java b/src/test/java/blackjack/domain/CardGameTest.java index 198400a269d..bb6a3662753 100644 --- a/src/test/java/blackjack/domain/CardGameTest.java +++ b/src/test/java/blackjack/domain/CardGameTest.java @@ -5,9 +5,10 @@ import java.util.List; import static blackjack.domain.CardNumber.ACE; -import static blackjack.domain.CardNumber.KING; -import static blackjack.domain.CardShape.HEART; import static blackjack.domain.CardShape.SPADE; +import static blackjack.fixture.PlayerFixture.ddang; +import static blackjack.fixture.PlayerFixture.dealer; +import static blackjack.fixture.PlayerFixture.mangcho; import static org.assertj.core.api.Assertions.assertThat; import static org.assertj.core.api.SoftAssertions.assertSoftly; @@ -41,24 +42,9 @@ public class CardGameTest { @Test void 딜러와_여러_플레이어의_숫자가_21_이하인_경우_숫자가_큰_사람이_이긴다() { CardGameJudge cardGameJudge = new CardGameJudge(); - - Hand mangchoHand = new Hand(); - mangchoHand.add(new Card(ACE, HEART)); - mangchoHand.add(new Card(KING, HEART)); - mangchoHand.add(new Card(KING, SPADE)); - Player mangcho = new Player(mangchoHand); - - Hand ddangHand = new Hand(); - ddangHand.add(new Card(ACE, HEART)); - ddangHand.add(new Card(KING, HEART)); - ddangHand.add(new Card(KING, SPADE)); - Player ddang = new Player(ddangHand); - - Hand dealerHand = new Hand(); - dealerHand.add(new Card(ACE, HEART)); - dealerHand.add(new Card(ACE, HEART)); - dealerHand.add(new Card(KING, SPADE)); - Player dealer = new Player(dealerHand); + Player mangcho = mangcho(); + Player ddang = ddang(); + Player dealer = dealer(); var result = cardGameJudge.judge(dealer, List.of(mangcho, ddang)).getTotalResult(); diff --git a/src/test/java/blackjack/fixture/PlayerFixture.java b/src/test/java/blackjack/fixture/PlayerFixture.java new file mode 100644 index 00000000000..aed6242f814 --- /dev/null +++ b/src/test/java/blackjack/fixture/PlayerFixture.java @@ -0,0 +1,39 @@ +package blackjack.fixture; + +import blackjack.domain.Card; +import blackjack.domain.Hand; +import blackjack.domain.Player; + +import static blackjack.domain.CardNumber.ACE; +import static blackjack.domain.CardNumber.KING; +import static blackjack.domain.CardNumber.QUEEN; +import static blackjack.domain.CardShape.HEART; +import static blackjack.domain.CardShape.SPADE; + +public class PlayerFixture { + public static Player mangcho() { + Hand hand = new Hand(); + hand.add(new Card(ACE, HEART)); + hand.add(new Card(KING, HEART)); + hand.add(new Card(KING, SPADE)); + + return new Player(hand); + } + + public static Player ddang() { + Hand hand = new Hand(); + hand.add(new Card(QUEEN, HEART)); + hand.add(new Card(KING, HEART)); + + return new Player(hand); + } + + public static Player dealer() { + Hand hand = new Hand(); + hand.add(new Card(ACE, HEART)); + hand.add(new Card(ACE, HEART)); + hand.add(new Card(KING, SPADE)); + + return new Player(hand); + } +} From 987e85604b633acf8500442f4593dbdff6ebc19c Mon Sep 17 00:00:00 2001 From: 3juhwan <13selfesteem91@naver.com> Date: Wed, 6 Mar 2024 18:22:01 +0900 Subject: [PATCH 10/56] =?UTF-8?q?refactor:=20Dealer=20=ED=81=B4=EB=9E=98?= =?UTF-8?q?=EC=8A=A4=20=EB=B6=84=EB=A6=AC=20=EB=B0=8F=20=ED=94=BD=EC=8A=A4?= =?UTF-8?q?=EC=B3=90=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: MangCho <13selfesteem91@naver.com> Co-authored-by: J-I-H-O --- README.md | 3 -- src/main/java/blackjack/domain/Dealer.java | 8 ++++++ .../java/blackjack/domain/CardGameTest.java | 28 ++++++++++--------- .../java/blackjack/domain/PlayerTest.java | 3 +- .../java/blackjack/fixture/PlayerFixture.java | 17 ++++++++--- 5 files changed, 38 insertions(+), 21 deletions(-) create mode 100644 src/main/java/blackjack/domain/Dealer.java diff --git a/README.md b/README.md index 79efda8ce8c..bc4c8e81d24 100644 --- a/README.md +++ b/README.md @@ -39,9 +39,6 @@ ### 게임 승패 결정 -sangseok0609 -5910원 - - [ ] 딜러와 모든 플레이어의 승패 여부를 결정한다. - [ ] 21을 초과한 사람이 패배한다. - [ ] 딜러와 플레이어 둘다 21을 초과할 경우에, 딜러가 승리한다. diff --git a/src/main/java/blackjack/domain/Dealer.java b/src/main/java/blackjack/domain/Dealer.java new file mode 100644 index 00000000000..31ad2d6aa73 --- /dev/null +++ b/src/main/java/blackjack/domain/Dealer.java @@ -0,0 +1,8 @@ +package blackjack.domain; + +public class Dealer extends Player { + + public Dealer(final Hand hand) { + super(hand); + } +} diff --git a/src/test/java/blackjack/domain/CardGameTest.java b/src/test/java/blackjack/domain/CardGameTest.java index bb6a3662753..1adaaa7dd94 100644 --- a/src/test/java/blackjack/domain/CardGameTest.java +++ b/src/test/java/blackjack/domain/CardGameTest.java @@ -6,32 +6,33 @@ import static blackjack.domain.CardNumber.ACE; import static blackjack.domain.CardShape.SPADE; -import static blackjack.fixture.PlayerFixture.ddang; import static blackjack.fixture.PlayerFixture.dealer; -import static blackjack.fixture.PlayerFixture.mangcho; +import static blackjack.fixture.PlayerFixture.playerA; +import static blackjack.fixture.PlayerFixture.playerAWithEmptyHand; +import static blackjack.fixture.PlayerFixture.playerB; +import static blackjack.fixture.PlayerFixture.playerBWithEmptyHand; import static org.assertj.core.api.Assertions.assertThat; import static org.assertj.core.api.SoftAssertions.assertSoftly; public class CardGameTest { @Test void 카드_한_장을_플레이어에게_지급한다() { - Player player = new Player(new Hand()); + Player mangcho = playerAWithEmptyHand(); Card card = new Card(ACE, SPADE); CardGame cardGame = new CardGame(); - cardGame.giveCard(player, card); + cardGame.giveCard(mangcho, card); - assertThat(player.getCards().size()).isEqualTo(1); + assertThat(mangcho.getCards().size()).isEqualTo(1); } @Test void 모든_플레이어에게_카드_2장을_지급한다() { - Player mangcho = new Player(new Hand()); - Player ddang = new Player(new Hand()); - List players = List.of(mangcho, ddang); + Player mangcho = playerAWithEmptyHand(); + Player ddang = playerBWithEmptyHand(); CardGame cardGame = new CardGame(); - cardGame.giveTwoCardsEachPlayer(players); + cardGame.giveTwoCardsEachPlayer(List.of(mangcho, ddang)); assertSoftly(softly -> { softly.assertThat(mangcho.getCards().size()).isEqualTo(2); @@ -42,11 +43,12 @@ public class CardGameTest { @Test void 딜러와_여러_플레이어의_숫자가_21_이하인_경우_숫자가_큰_사람이_이긴다() { CardGameJudge cardGameJudge = new CardGameJudge(); - Player mangcho = mangcho(); - Player ddang = ddang(); - Player dealer = dealer(); + Player mangcho = playerA(); + Player ddang = playerB(); + Dealer dealer = dealer(); - var result = cardGameJudge.judge(dealer, List.of(mangcho, ddang)).getTotalResult(); + var result = cardGameJudge.judge(dealer, List.of(mangcho, ddang)) + .getTotalResult(); assertThat(result.get(mangcho)).isEqualTo(WinningStatus.WIN); assertThat(result.get(ddang)).isEqualTo(WinningStatus.WIN); diff --git a/src/test/java/blackjack/domain/PlayerTest.java b/src/test/java/blackjack/domain/PlayerTest.java index ba40d2f9d8e..ce801475a79 100644 --- a/src/test/java/blackjack/domain/PlayerTest.java +++ b/src/test/java/blackjack/domain/PlayerTest.java @@ -6,13 +6,14 @@ import static blackjack.domain.CardShape.CLOVER; import static blackjack.domain.CardShape.HEART; import static blackjack.domain.CardShape.SPADE; +import static blackjack.fixture.PlayerFixture.playerAWithEmptyHand; import static org.assertj.core.api.Assertions.assertThat; public class PlayerTest { @Test void 플레이어는_죽었는지_여부를_반환한다() { - Player player = new Player(new Hand()); + Player player = playerAWithEmptyHand(); player.addCards(new Card(KING, CLOVER), new Card(KING, SPADE), new Card(KING, HEART)); boolean isDead = player.isDead(); diff --git a/src/test/java/blackjack/fixture/PlayerFixture.java b/src/test/java/blackjack/fixture/PlayerFixture.java index aed6242f814..54b18c74109 100644 --- a/src/test/java/blackjack/fixture/PlayerFixture.java +++ b/src/test/java/blackjack/fixture/PlayerFixture.java @@ -1,6 +1,7 @@ package blackjack.fixture; import blackjack.domain.Card; +import blackjack.domain.Dealer; import blackjack.domain.Hand; import blackjack.domain.Player; @@ -11,7 +12,7 @@ import static blackjack.domain.CardShape.SPADE; public class PlayerFixture { - public static Player mangcho() { + public static Player playerA() { Hand hand = new Hand(); hand.add(new Card(ACE, HEART)); hand.add(new Card(KING, HEART)); @@ -20,7 +21,11 @@ public static Player mangcho() { return new Player(hand); } - public static Player ddang() { + public static Player playerAWithEmptyHand() { + return new Player(new Hand()); + } + + public static Player playerB() { Hand hand = new Hand(); hand.add(new Card(QUEEN, HEART)); hand.add(new Card(KING, HEART)); @@ -28,12 +33,16 @@ public static Player ddang() { return new Player(hand); } - public static Player dealer() { + public static Player playerBWithEmptyHand() { + return new Player(new Hand()); + } + + public static Dealer dealer() { Hand hand = new Hand(); hand.add(new Card(ACE, HEART)); hand.add(new Card(ACE, HEART)); hand.add(new Card(KING, SPADE)); - return new Player(hand); + return new Dealer(hand); } } From 12bbf040f0ec4b3fb108abb37775715d7e5d3bd9 Mon Sep 17 00:00:00 2001 From: 3juhwan <13selfesteem91@naver.com> Date: Wed, 6 Mar 2024 18:40:40 +0900 Subject: [PATCH 11/56] =?UTF-8?q?refactor:=20=ED=94=BD=EC=8A=A4=EC=B3=90?= =?UTF-8?q?=20=EB=82=B4=20=EC=A4=91=EB=B3=B5=20=EC=A0=9C=EA=B1=B0?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Co-authored-by: MangCho <13selfesteem91@naver.com> Co-authored-by: J-I-H-O --- .../java/blackjack/domain/CardGameTest.java | 31 +++++++++----- .../java/blackjack/domain/PlayerTest.java | 4 +- .../java/blackjack/fixture/PlayerFixture.java | 40 ++++--------------- 3 files changed, 31 insertions(+), 44 deletions(-) diff --git a/src/test/java/blackjack/domain/CardGameTest.java b/src/test/java/blackjack/domain/CardGameTest.java index 1adaaa7dd94..b5915d5595d 100644 --- a/src/test/java/blackjack/domain/CardGameTest.java +++ b/src/test/java/blackjack/domain/CardGameTest.java @@ -5,19 +5,19 @@ import java.util.List; import static blackjack.domain.CardNumber.ACE; +import static blackjack.domain.CardNumber.KING; +import static blackjack.domain.CardNumber.QUEEN; +import static blackjack.domain.CardShape.HEART; import static blackjack.domain.CardShape.SPADE; import static blackjack.fixture.PlayerFixture.dealer; -import static blackjack.fixture.PlayerFixture.playerA; -import static blackjack.fixture.PlayerFixture.playerAWithEmptyHand; -import static blackjack.fixture.PlayerFixture.playerB; -import static blackjack.fixture.PlayerFixture.playerBWithEmptyHand; +import static blackjack.fixture.PlayerFixture.player; import static org.assertj.core.api.Assertions.assertThat; import static org.assertj.core.api.SoftAssertions.assertSoftly; public class CardGameTest { @Test void 카드_한_장을_플레이어에게_지급한다() { - Player mangcho = playerAWithEmptyHand(); + Player mangcho = player(); Card card = new Card(ACE, SPADE); CardGame cardGame = new CardGame(); @@ -28,8 +28,8 @@ public class CardGameTest { @Test void 모든_플레이어에게_카드_2장을_지급한다() { - Player mangcho = playerAWithEmptyHand(); - Player ddang = playerBWithEmptyHand(); + Player mangcho = player(); + Player ddang = player(); CardGame cardGame = new CardGame(); cardGame.giveTwoCardsEachPlayer(List.of(mangcho, ddang)); @@ -43,9 +43,20 @@ public class CardGameTest { @Test void 딜러와_여러_플레이어의_숫자가_21_이하인_경우_숫자가_큰_사람이_이긴다() { CardGameJudge cardGameJudge = new CardGameJudge(); - Player mangcho = playerA(); - Player ddang = playerB(); - Dealer dealer = dealer(); + + Player mangcho = player( + new Card(ACE, HEART), + new Card(KING, HEART), + new Card(KING, SPADE)); + + Player ddang = player( + new Card(QUEEN, HEART), + new Card(KING, HEART)); + + Dealer dealer = dealer( + new Card(ACE, HEART), + new Card(ACE, SPADE), + new Card(KING, SPADE)); var result = cardGameJudge.judge(dealer, List.of(mangcho, ddang)) .getTotalResult(); diff --git a/src/test/java/blackjack/domain/PlayerTest.java b/src/test/java/blackjack/domain/PlayerTest.java index ce801475a79..4df0125953c 100644 --- a/src/test/java/blackjack/domain/PlayerTest.java +++ b/src/test/java/blackjack/domain/PlayerTest.java @@ -6,14 +6,14 @@ import static blackjack.domain.CardShape.CLOVER; import static blackjack.domain.CardShape.HEART; import static blackjack.domain.CardShape.SPADE; -import static blackjack.fixture.PlayerFixture.playerAWithEmptyHand; +import static blackjack.fixture.PlayerFixture.player; import static org.assertj.core.api.Assertions.assertThat; public class PlayerTest { @Test void 플레이어는_죽었는지_여부를_반환한다() { - Player player = playerAWithEmptyHand(); + Player player = player(); player.addCards(new Card(KING, CLOVER), new Card(KING, SPADE), new Card(KING, HEART)); boolean isDead = player.isDead(); diff --git a/src/test/java/blackjack/fixture/PlayerFixture.java b/src/test/java/blackjack/fixture/PlayerFixture.java index 54b18c74109..ff51fd9f8a4 100644 --- a/src/test/java/blackjack/fixture/PlayerFixture.java +++ b/src/test/java/blackjack/fixture/PlayerFixture.java @@ -5,44 +5,20 @@ import blackjack.domain.Hand; import blackjack.domain.Player; -import static blackjack.domain.CardNumber.ACE; -import static blackjack.domain.CardNumber.KING; -import static blackjack.domain.CardNumber.QUEEN; -import static blackjack.domain.CardShape.HEART; -import static blackjack.domain.CardShape.SPADE; - public class PlayerFixture { - public static Player playerA() { - Hand hand = new Hand(); - hand.add(new Card(ACE, HEART)); - hand.add(new Card(KING, HEART)); - hand.add(new Card(KING, SPADE)); - - return new Player(hand); - } - - public static Player playerAWithEmptyHand() { - return new Player(new Hand()); - } - - public static Player playerB() { + public static Player player(Card... cards) { Hand hand = new Hand(); - hand.add(new Card(QUEEN, HEART)); - hand.add(new Card(KING, HEART)); - + for (Card card : cards) { + hand.add(card); + } return new Player(hand); } - public static Player playerBWithEmptyHand() { - return new Player(new Hand()); - } - - public static Dealer dealer() { + public static Dealer dealer(Card... cards) { Hand hand = new Hand(); - hand.add(new Card(ACE, HEART)); - hand.add(new Card(ACE, HEART)); - hand.add(new Card(KING, SPADE)); - + for (Card card : cards) { + hand.add(card); + } return new Dealer(hand); } } From 240e40817d0bc94abe91b996e8338192b2b69bf2 Mon Sep 17 00:00:00 2001 From: 3juhwan <13selfesteem91@naver.com> Date: Wed, 6 Mar 2024 18:45:17 +0900 Subject: [PATCH 12/56] =?UTF-8?q?docs:=20=EA=B2=8C=EC=9E=84=20=EC=8A=B9?= =?UTF-8?q?=ED=8C=A8=20=EA=B2=B0=EC=A0=95=20=EB=A1=9C=EC=A7=81=20=EC=9E=91?= =?UTF-8?q?=EC=84=B1?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Co-authored-by: MangCho <13selfesteem91@naver.com> Co-authored-by: J-I-H-O --- README.md | 7 ++++--- 1 file changed, 4 insertions(+), 3 deletions(-) diff --git a/README.md b/README.md index bc4c8e81d24..64f7b760923 100644 --- a/README.md +++ b/README.md @@ -40,9 +40,10 @@ ### 게임 승패 결정 - [ ] 딜러와 모든 플레이어의 승패 여부를 결정한다. - - [ ] 21을 초과한 사람이 패배한다. - - [ ] 딜러와 플레이어 둘다 21을 초과할 경우에, 딜러가 승리한다. - - [ ] 숫자가 큰 사람이 승리한다. + - [ ] 딜러와 플레이어 둘다 21을 초과할 경우에, 플레이어가 패배한다. + - [ ] 카드 합계가 딜러는 21 이하, 플레이어는 21 초과인 경우에, 플레이어가 패배한다. + - [ ] 카드 합계가 딜러는 21 초과, 플레이어는 21 이하인 경우에, 플레이어가 승리한다. + - [ ] 카드 합계가 딜러와 플레이어 모두 21 이하인 경우에, 숫자가 큰 사람이 승리한다. ### 인풋 뷰 From 933b4229e0c22ce522cb0dab3f673fe889cad05d Mon Sep 17 00:00:00 2001 From: 3juhwan <13selfesteem91@naver.com> Date: Thu, 7 Mar 2024 12:41:14 +0900 Subject: [PATCH 13/56] =?UTF-8?q?feat:=20=EC=8A=B9=ED=8C=A8=20=ED=8C=90?= =?UTF-8?q?=EB=8B=A8=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: MangCho <13selfesteem91@naver.com> Co-authored-by: J-I-H-O --- README.md | 9 +- .../java/blackjack/domain/CardGameJudge.java | 9 ++ .../blackjack/domain/CardGameJudgeTest.java | 112 ++++++++++++++++++ .../java/blackjack/domain/CardGameTest.java | 29 ----- 4 files changed, 126 insertions(+), 33 deletions(-) create mode 100644 src/test/java/blackjack/domain/CardGameJudgeTest.java diff --git a/README.md b/README.md index 64f7b760923..ffc6db607d2 100644 --- a/README.md +++ b/README.md @@ -40,10 +40,11 @@ ### 게임 승패 결정 - [ ] 딜러와 모든 플레이어의 승패 여부를 결정한다. - - [ ] 딜러와 플레이어 둘다 21을 초과할 경우에, 플레이어가 패배한다. - - [ ] 카드 합계가 딜러는 21 이하, 플레이어는 21 초과인 경우에, 플레이어가 패배한다. - - [ ] 카드 합계가 딜러는 21 초과, 플레이어는 21 이하인 경우에, 플레이어가 승리한다. - - [ ] 카드 합계가 딜러와 플레이어 모두 21 이하인 경우에, 숫자가 큰 사람이 승리한다. + - [x] 딜러와 플레이어 둘다 21을 초과할 경우, 플레이어가 패배한다. + - [x] 카드 합계가 딜러는 21 이하, 플레이어는 21 초과인 경우, 플레이어가 패배한다. + - [x] 카드 합계가 딜러는 21 초과, 플레이어는 21 이하인 경우, 플레이어가 승리한다. + - [x] 카드 합계가 딜러와 플레이어 모두 21 이하인 경우, 숫자가 큰 사람이 승리한다. + - [x] 카드 합계가 딜러와 플레이어 모두 21 이하이고 동일한 경우, 무승부다. ### 인풋 뷰 diff --git a/src/main/java/blackjack/domain/CardGameJudge.java b/src/main/java/blackjack/domain/CardGameJudge.java index d7f4bd0356e..e9ee7612e90 100644 --- a/src/main/java/blackjack/domain/CardGameJudge.java +++ b/src/main/java/blackjack/domain/CardGameJudge.java @@ -6,6 +6,8 @@ public class CardGameJudge { + public static final int BUST_CONDITION = 21; + public CardGameResult judge(final Player dealer, final List players) { Map result = new LinkedHashMap<>(); @@ -26,7 +28,14 @@ private WinningStatus judge(final Player dealer, final Player player) { } // TODO: 이름 바꾸기 + // TODO: 정리 private WinningStatus doesPlayerWin(final int dealerScore, final int playerScore) { + if (playerScore > BUST_CONDITION) { + return WinningStatus.LOSE; + } + if (dealerScore > BUST_CONDITION) { + return WinningStatus.WIN; + } if (dealerScore == playerScore) { return WinningStatus.PUSH; // TODO: 도메인 지식 없으면 이해하기 힘듦 } diff --git a/src/test/java/blackjack/domain/CardGameJudgeTest.java b/src/test/java/blackjack/domain/CardGameJudgeTest.java new file mode 100644 index 00000000000..aaf6bde5679 --- /dev/null +++ b/src/test/java/blackjack/domain/CardGameJudgeTest.java @@ -0,0 +1,112 @@ +package blackjack.domain; + +import org.junit.jupiter.api.Test; + +import java.util.List; + +import static blackjack.domain.CardNumber.ACE; +import static blackjack.domain.CardNumber.KING; +import static blackjack.domain.CardNumber.QUEEN; +import static blackjack.domain.CardNumber.TWO; +import static blackjack.domain.CardShape.CLOVER; +import static blackjack.domain.CardShape.DIAMOND; +import static blackjack.domain.CardShape.HEART; +import static blackjack.domain.CardShape.SPADE; +import static blackjack.fixture.PlayerFixture.dealer; +import static blackjack.fixture.PlayerFixture.player; +import static org.assertj.core.api.Assertions.assertThat; + +public class CardGameJudgeTest { + @Test + void 딜러와_플레이어_둘다_21을_초과할_경우에_플레이어가_패배한다() { + CardGameJudge cardGameJudge = new CardGameJudge(); + + Player mangcho = player( + new Card(KING, CLOVER), + new Card(KING, HEART), + new Card(KING, SPADE)); + + Dealer dealer = dealer( + new Card(QUEEN, CLOVER), + new Card(QUEEN, HEART), + new Card(QUEEN, SPADE)); + + var result = cardGameJudge.judge(dealer, List.of(mangcho)) + .getTotalResult(); + + assertThat(result.get(mangcho)).isEqualTo(WinningStatus.LOSE); + } + + @Test + void 딜러와_여러_플레이어의_숫자가_21_이하인_경우_숫자가_큰_사람이_이긴다() { + CardGameJudge cardGameJudge = new CardGameJudge(); + + Player mangcho = player(new Card(KING, SPADE)); + Dealer dealer = dealer(new Card(TWO, SPADE)); + + var result = cardGameJudge.judge(dealer, List.of(mangcho)) + .getTotalResult(); + + assertThat(result.get(mangcho)).isEqualTo(WinningStatus.WIN); + } + + @Test + void 카드_합계가_딜러는_21_이하_플레이어는_21_초과인_경우_플레이어가_패배한다() { + CardGameJudge cardGameJudge = new CardGameJudge(); + + Player player = player( + new Card(KING, CLOVER), + new Card(KING, HEART), + new Card(KING, DIAMOND)); + + Dealer dealer = dealer(new Card(TWO, HEART)); + + var result = cardGameJudge.judge(dealer, List.of(player)) + .getTotalResult(); + + assertThat(result.get(player)).isEqualTo(WinningStatus.LOSE); + } + + @Test + void 카드_합계가_딜러는_21_초과_플레이어는_21_이하인_경우_플레이어가_승리한다() { + CardGameJudge cardGameJudge = new CardGameJudge(); + + Player player = player(new Card(TWO, HEART)); + + Dealer dealer = dealer( + new Card(KING, CLOVER), + new Card(KING, HEART), + new Card(KING, SPADE)); + + var result = cardGameJudge.judge(dealer, List.of(player)) + .getTotalResult(); + + assertThat(result.get(player)).isEqualTo(WinningStatus.WIN); + } + + @Test + void 카드_합계가_딜러와_플레이어_모두_21_이하인_경우_숫자가_큰_사람이_승리한다() { + CardGameJudge cardGameJudge = new CardGameJudge(); + + Player player = player(new Card(ACE, HEART)); + Dealer dealer = dealer(new Card(KING, SPADE)); + + var result = cardGameJudge.judge(dealer, List.of(player)) + .getTotalResult(); + + assertThat(result.get(player)).isEqualTo(WinningStatus.LOSE); + } + + @Test + void 카드_합계가_딜러와_플레이어_모두_21_이하이고_동일한_경우_무승부다() { + CardGameJudge cardGameJudge = new CardGameJudge(); + + Player player = player(new Card(ACE, HEART)); + Dealer dealer = dealer(new Card(ACE, HEART)); + + var result = cardGameJudge.judge(dealer, List.of(player)) + .getTotalResult(); + + assertThat(result.get(player)).isEqualTo(WinningStatus.PUSH); + } +} diff --git a/src/test/java/blackjack/domain/CardGameTest.java b/src/test/java/blackjack/domain/CardGameTest.java index b5915d5595d..43b8d219a3e 100644 --- a/src/test/java/blackjack/domain/CardGameTest.java +++ b/src/test/java/blackjack/domain/CardGameTest.java @@ -5,11 +5,7 @@ import java.util.List; import static blackjack.domain.CardNumber.ACE; -import static blackjack.domain.CardNumber.KING; -import static blackjack.domain.CardNumber.QUEEN; -import static blackjack.domain.CardShape.HEART; import static blackjack.domain.CardShape.SPADE; -import static blackjack.fixture.PlayerFixture.dealer; import static blackjack.fixture.PlayerFixture.player; import static org.assertj.core.api.Assertions.assertThat; import static org.assertj.core.api.SoftAssertions.assertSoftly; @@ -39,29 +35,4 @@ public class CardGameTest { softly.assertThat(ddang.getCards().size()).isEqualTo(2); }); } - - @Test - void 딜러와_여러_플레이어의_숫자가_21_이하인_경우_숫자가_큰_사람이_이긴다() { - CardGameJudge cardGameJudge = new CardGameJudge(); - - Player mangcho = player( - new Card(ACE, HEART), - new Card(KING, HEART), - new Card(KING, SPADE)); - - Player ddang = player( - new Card(QUEEN, HEART), - new Card(KING, HEART)); - - Dealer dealer = dealer( - new Card(ACE, HEART), - new Card(ACE, SPADE), - new Card(KING, SPADE)); - - var result = cardGameJudge.judge(dealer, List.of(mangcho, ddang)) - .getTotalResult(); - - assertThat(result.get(mangcho)).isEqualTo(WinningStatus.WIN); - assertThat(result.get(ddang)).isEqualTo(WinningStatus.WIN); - } } From b42c767a2bd5f36e2bea0c7037e73b3cedb4d155 Mon Sep 17 00:00:00 2001 From: 3juhwan <13selfesteem91@naver.com> Date: Thu, 7 Mar 2024 15:08:41 +0900 Subject: [PATCH 14/56] =?UTF-8?q?chore:=20=EB=B6=88=ED=95=84=EC=9A=94?= =?UTF-8?q?=ED=95=9C=20=ED=81=B4=EB=9E=98=EC=8A=A4=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: MangCho <13selfesteem91@naver.com> Co-authored-by: J-I-H-O --- src/main/java/blackjack/domain/CardGame.java | 14 +++++++++----- src/main/java/blackjack/domain/CardGenerator.java | 5 ----- .../blackjack/domain/RandomCardGenerator.java | 15 --------------- 3 files changed, 9 insertions(+), 25 deletions(-) delete mode 100644 src/main/java/blackjack/domain/CardGenerator.java delete mode 100644 src/main/java/blackjack/domain/RandomCardGenerator.java diff --git a/src/main/java/blackjack/domain/CardGame.java b/src/main/java/blackjack/domain/CardGame.java index 718e2433725..159932450b2 100644 --- a/src/main/java/blackjack/domain/CardGame.java +++ b/src/main/java/blackjack/domain/CardGame.java @@ -3,18 +3,22 @@ import java.util.List; public class CardGame { + private final CardDeck cardDeck; + + public CardGame() { + this.cardDeck = new CardDeck(); + } + public void giveCard(final Player player, final Card card) { player.addCards(card); } // TODO: 이름 수정 - void giveTwoCardsEachPlayer(final List players) { - // TODO: 주입 받도록 변경 - final CardGenerator cardGenerator = new RandomCardGenerator(); + public void giveTwoCardsEachPlayer(final List players) { for (Player player : players) { // TODO: 개선 필요 - giveCard(player, cardGenerator.generate()); - giveCard(player, cardGenerator.generate()); + giveCard(player, cardDeck.draw()); + giveCard(player, cardDeck.draw()); } } } diff --git a/src/main/java/blackjack/domain/CardGenerator.java b/src/main/java/blackjack/domain/CardGenerator.java deleted file mode 100644 index b805367b1b5..00000000000 --- a/src/main/java/blackjack/domain/CardGenerator.java +++ /dev/null @@ -1,5 +0,0 @@ -package blackjack.domain; - -public interface CardGenerator { - Card generate(); -} diff --git a/src/main/java/blackjack/domain/RandomCardGenerator.java b/src/main/java/blackjack/domain/RandomCardGenerator.java deleted file mode 100644 index 72ecfcb490d..00000000000 --- a/src/main/java/blackjack/domain/RandomCardGenerator.java +++ /dev/null @@ -1,15 +0,0 @@ -package blackjack.domain; - -import java.util.Random; - -import static blackjack.domain.CardNumber.ACE; -import static blackjack.domain.CardShape.SPADE; - -public class RandomCardGenerator implements CardGenerator { - private static final Random RANDOM = new Random(); - - @Override - public Card generate() { - return new Card(ACE, SPADE); - } -} From dc3387fa6adc0fa113d3be162f7ae23cb2c04eac Mon Sep 17 00:00:00 2001 From: 3juhwan <13selfesteem91@naver.com> Date: Thu, 7 Mar 2024 15:16:43 +0900 Subject: [PATCH 15/56] =?UTF-8?q?docs:=20=EB=B7=B0=EC=97=90=20=EB=8C=80?= =?UTF-8?q?=ED=95=9C=20=EA=B8=B0=EB=8A=A5=20=EC=9A=94=EA=B5=AC=EC=82=AC?= =?UTF-8?q?=ED=95=AD=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: MangCho <13selfesteem91@naver.com> Co-authored-by: J-I-H-O --- README.md | 14 +++++++++++--- 1 file changed, 11 insertions(+), 3 deletions(-) diff --git a/README.md b/README.md index ffc6db607d2..90561444b38 100644 --- a/README.md +++ b/README.md @@ -49,10 +49,18 @@ ### 인풋 뷰 -- [ ] 사용자 카드 합이 21을 초과하면, 카드 추가 여부를 묻지 않는다. -- [ ] 플레이어가 n을 입력할 때 까지 카드 추가 여부를 묻는다. +- [ ] 참가자의 이름을 입력받는다. + - [ ] 이름은 쉼표 기준으로 분리한다. +- [ ] 카드 추가 여부를 입력받는다. + - [ ] 사용자 카드 합이 21을 초과하면, 카드 추가 여부를 묻지 않는다. + - [ ] 플레이어가 n을 입력할 때 까지 카드 추가 여부를 묻는다. ### 아웃풋 뷰 -- [ ] 딜러가 추가 카드를 발급 받았는지 여부 출력 +- [ ] 딜러와 플레이어 전원에게 초기에 분배한 카드 출력한다. + - [ ] 딜러의 카드는 1장만 공개한다. +- [ ] 플레이어가 보유한 모든 카드를 출력한다. +- [ ] 딜러가 추가 카드를 발급 받았는지 여부 출력한다. +- [ ] 보유한 모든 카드의 합을 출력한다. +- [ ] 최종 승패를 출력한다. From 043a26f1cec166dce99f7b6d0f5f6d8365c87b88 Mon Sep 17 00:00:00 2001 From: 3juhwan <13selfesteem91@naver.com> Date: Thu, 7 Mar 2024 15:34:52 +0900 Subject: [PATCH 16/56] =?UTF-8?q?feat:=20=EB=94=9C=EB=9F=AC=EC=9D=98=20?= =?UTF-8?q?=EC=8A=B9=ED=8C=A8=20=ED=9A=9F=EC=88=98=20=EA=B3=84=EC=82=B0=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: MangCho <13selfesteem91@naver.com> Co-authored-by: J-I-H-O --- .../java/blackjack/domain/CardGameResult.java | 19 ++++++++++-- .../blackjack/domain/CardGameResultTest.java | 30 +++++++++++++++++++ 2 files changed, 47 insertions(+), 2 deletions(-) create mode 100644 src/test/java/blackjack/domain/CardGameResultTest.java diff --git a/src/main/java/blackjack/domain/CardGameResult.java b/src/main/java/blackjack/domain/CardGameResult.java index 15bbfb687eb..96c63fea05e 100644 --- a/src/main/java/blackjack/domain/CardGameResult.java +++ b/src/main/java/blackjack/domain/CardGameResult.java @@ -3,6 +3,9 @@ import java.util.Collections; import java.util.Map; +import static blackjack.domain.WinningStatus.LOSE; +import static blackjack.domain.WinningStatus.WIN; + public class CardGameResult { private final Map totalResult; @@ -14,6 +17,18 @@ public Map getTotalResult() { return Collections.unmodifiableMap(totalResult); } - // TODO : cardGameResult.getDealerWinCount(); - // TODO : cardGameResult.getDealerLoseCount(); + // TODO: 어지러움 + public int getDealerWinCount() { + return (int) totalResult.values() + .stream() + .filter(playerWinningstatus -> playerWinningstatus.equals(LOSE)) + .count(); + } + + public int getDealerLoseCount() { + return (int) totalResult.values() + .stream() + .filter(status -> status.equals(WIN)) + .count(); + } } diff --git a/src/test/java/blackjack/domain/CardGameResultTest.java b/src/test/java/blackjack/domain/CardGameResultTest.java new file mode 100644 index 00000000000..349d60615d6 --- /dev/null +++ b/src/test/java/blackjack/domain/CardGameResultTest.java @@ -0,0 +1,30 @@ +package blackjack.domain; + +import org.assertj.core.api.Assertions; +import org.junit.jupiter.api.Test; + +import java.util.LinkedHashMap; +import java.util.Map; + +import static blackjack.domain.WinningStatus.LOSE; +import static blackjack.domain.WinningStatus.WIN; +import static blackjack.fixture.PlayerFixture.player; + +class CardGameResultTest { + + @Test + void 딜러가_승패_횟수를_계산할_수_있다() { + Map result = new LinkedHashMap<>(); + result.put(player(), WIN); + result.put(player(), WIN); + result.put(player(), LOSE); + + CardGameResult cardGameResult = new CardGameResult(result); + + int dealerWinCount = cardGameResult.getDealerWinCount(); + int dealerLoseCount = cardGameResult.getDealerLoseCount(); + + Assertions.assertThat(dealerWinCount).isEqualTo(1); + Assertions.assertThat(dealerLoseCount).isEqualTo(2); + } +} From 2ad912da4d6adaabad1ca929783ecffa86ec8239 Mon Sep 17 00:00:00 2001 From: 3juhwan <13selfesteem91@naver.com> Date: Thu, 7 Mar 2024 16:21:09 +0900 Subject: [PATCH 17/56] =?UTF-8?q?feat:=20InputView=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: MangCho <13selfesteem91@naver.com> Co-authored-by: J-I-H-O --- README.md | 9 +++-- src/main/java/blackjack/view/InputView.java | 43 +++++++++++++++++++++ 2 files changed, 48 insertions(+), 4 deletions(-) create mode 100644 src/main/java/blackjack/view/InputView.java diff --git a/README.md b/README.md index 90561444b38..194f33db6ca 100644 --- a/README.md +++ b/README.md @@ -49,11 +49,12 @@ ### 인풋 뷰 -- [ ] 참가자의 이름을 입력받는다. - - [ ] 이름은 쉼표 기준으로 분리한다. -- [ ] 카드 추가 여부를 입력받는다. +- [x] 참가자의 이름을 입력받는다. + - [x] 이름은 쉼표 기준으로 분리한다. +- [x] 카드 추가 여부를 입력받는다. + - [x] y 또는 n이 아닌 경우, 예외를 발생한다. - [ ] 사용자 카드 합이 21을 초과하면, 카드 추가 여부를 묻지 않는다. - - [ ] 플레이어가 n을 입력할 때 까지 카드 추가 여부를 묻는다. + - [ ] 플레이어가 n을 입력할 때까지 카드 추가 여부를 묻는다. ### 아웃풋 뷰 diff --git a/src/main/java/blackjack/view/InputView.java b/src/main/java/blackjack/view/InputView.java new file mode 100644 index 00000000000..3a9f091e6f4 --- /dev/null +++ b/src/main/java/blackjack/view/InputView.java @@ -0,0 +1,43 @@ +package blackjack.view; + +import java.util.List; +import java.util.Scanner; + +public class InputView { + // TODO: 상수명 변경 + private static final Scanner scanner = new Scanner(System.in); + public static final String YES = "y"; + public static final String NO = "n"; + + public static List readPlayerNames() { + printPlayerNamesInputMessage(); + String rawInput = scanner.nextLine(); + return List.of(rawInput.split(",", -1)); + } + + // TODO: 메서드명 변경 + public static boolean askForAnotherCard(final String name) { + printAskingForAnotherCardMessage(name); + final String rawInput = scanner.nextLine(); + validateYesOrNo(rawInput); + return YES.equals(rawInput); + } + + // TODO: 메서드명 변경 + private static void validateYesOrNo(final String input) { + if (YES.equals(input) || NO.equals(input)) { + return; + } + + final String errorMessage = String.format("%s 또는 %s 만 입력할 수 있습니다.", YES, NO); + throw new IllegalArgumentException(errorMessage); + } + + private static void printPlayerNamesInputMessage() { + System.out.println("게임에 참여할 사람의 이름을 입력하세요.(쉼표 기준으로 분리)"); + } + + private static void printAskingForAnotherCardMessage(final String name) { + System.out.println(name + "는 한장의 카드를 더 받겠습니까?(예는 y, 아니오는 n)"); + } +} From f252caacfbe02f10a99fde84dff6016916341faf Mon Sep 17 00:00:00 2001 From: 3juhwan <13selfesteem91@naver.com> Date: Thu, 7 Mar 2024 16:46:40 +0900 Subject: [PATCH 18/56] =?UTF-8?q?feat:=20Player=20=EC=9D=B4=EB=A6=84=20?= =?UTF-8?q?=EA=B8=B8=EC=9D=B4=EB=A5=BC=20=EA=B2=80=EC=A6=9D=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: MangCho <13selfesteem91@naver.com> Co-authored-by: J-I-H-O --- src/main/java/blackjack/domain/Name.java | 23 ++++++++++++++++++++ src/test/java/blackjack/domain/NameTest.java | 14 ++++++++++++ 2 files changed, 37 insertions(+) create mode 100644 src/main/java/blackjack/domain/Name.java create mode 100644 src/test/java/blackjack/domain/NameTest.java diff --git a/src/main/java/blackjack/domain/Name.java b/src/main/java/blackjack/domain/Name.java new file mode 100644 index 00000000000..956777266c7 --- /dev/null +++ b/src/main/java/blackjack/domain/Name.java @@ -0,0 +1,23 @@ +package blackjack.domain; + +public class Name { + private static final int MINIMUM_LENGTH = 1; + private static final int MAXIMUM_LENGTH = 10; + + private final String value; + + public Name(final String value) { + validateLength(value); + this.value = value; + } + + private void validateLength(final String value) { + if (MINIMUM_LENGTH <= value.length() && value.length() <= MAXIMUM_LENGTH) { + return; + } + + final String errorMessage = String.format("[ERROR] 이름의 길이는 %s 이상, %s 이하여야 합니다.", + MINIMUM_LENGTH, MAXIMUM_LENGTH); + throw new IllegalArgumentException(errorMessage); + } +} diff --git a/src/test/java/blackjack/domain/NameTest.java b/src/test/java/blackjack/domain/NameTest.java new file mode 100644 index 00000000000..2e5f1fee52a --- /dev/null +++ b/src/test/java/blackjack/domain/NameTest.java @@ -0,0 +1,14 @@ +package blackjack.domain; + +import org.assertj.core.api.Assertions; +import org.junit.jupiter.params.ParameterizedTest; +import org.junit.jupiter.params.provider.ValueSource; + +public class NameTest { + @ParameterizedTest + @ValueSource(strings = {"", "01234567890"}) + void 이름의_길이는_1이상_10이하여야_한다(String value) { + Assertions.assertThatCode(() -> new Name(value)) + .isInstanceOf(IllegalArgumentException.class); + } +} From cdb2713b4631d7244ac577524d28340a65b87c7c Mon Sep 17 00:00:00 2001 From: 3juhwan <13selfesteem91@naver.com> Date: Thu, 7 Mar 2024 17:38:29 +0900 Subject: [PATCH 19/56] =?UTF-8?q?feat:=20=EB=94=9C=EB=9F=AC=EC=99=80=20?= =?UTF-8?q?=ED=94=8C=EB=A0=88=EC=9D=B4=EC=96=B4=20=EC=A0=84=EC=9B=90?= =?UTF-8?q?=EC=97=90=EA=B2=8C=20=EC=B4=88=EA=B8=B0=EC=97=90=20=EB=B6=84?= =?UTF-8?q?=EB=B0=B0=ED=95=9C=20=EC=B9=B4=EB=93=9C=20=EC=B6=9C=EB=A0=A5?= =?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: MangCho <13selfesteem91@naver.com> Co-authored-by: J-I-H-O --- README.md | 4 +- src/main/java/blackjack/domain/Card.java | 4 ++ src/main/java/blackjack/domain/CardShape.java | 18 +++++++-- src/main/java/blackjack/domain/Dealer.java | 8 +++- src/main/java/blackjack/domain/Name.java | 4 ++ src/main/java/blackjack/domain/Player.java | 10 ++++- src/main/java/blackjack/view/OutputView.java | 40 +++++++++++++++++++ .../java/blackjack/fixture/PlayerFixture.java | 7 +++- 8 files changed, 83 insertions(+), 12 deletions(-) create mode 100644 src/main/java/blackjack/view/OutputView.java diff --git a/README.md b/README.md index 194f33db6ca..05ed23753bc 100644 --- a/README.md +++ b/README.md @@ -59,8 +59,8 @@ ### 아웃풋 뷰 -- [ ] 딜러와 플레이어 전원에게 초기에 분배한 카드 출력한다. - - [ ] 딜러의 카드는 1장만 공개한다. +- [x] 딜러와 플레이어 전원에게 초기에 분배한 카드 출력한다. + - [x] 딜러의 카드는 1장만 공개한다. - [ ] 플레이어가 보유한 모든 카드를 출력한다. - [ ] 딜러가 추가 카드를 발급 받았는지 여부 출력한다. - [ ] 보유한 모든 카드의 합을 출력한다. diff --git a/src/main/java/blackjack/domain/Card.java b/src/main/java/blackjack/domain/Card.java index 4839fbba332..05bcd6ec18b 100644 --- a/src/main/java/blackjack/domain/Card.java +++ b/src/main/java/blackjack/domain/Card.java @@ -12,4 +12,8 @@ public Card(final CardNumber cardNumber, final CardShape cardShape) { public int getNumber() { return cardNumber.getValue(); } + + public String getShape() { + return cardShape.getName(); + } } diff --git a/src/main/java/blackjack/domain/CardShape.java b/src/main/java/blackjack/domain/CardShape.java index 9724bfdc63f..7e2a15f50c3 100644 --- a/src/main/java/blackjack/domain/CardShape.java +++ b/src/main/java/blackjack/domain/CardShape.java @@ -1,8 +1,18 @@ package blackjack.domain; public enum CardShape { - SPADE, - HEART, - DIAMOND, - CLOVER + SPADE("스페이드"), + HEART("하트"), + DIAMOND("다이아몬드"), + CLOVER("클로버"); + + private final String name; + + CardShape(final String name) { + this.name = name; + } + + public String getName() { + return name; + } } diff --git a/src/main/java/blackjack/domain/Dealer.java b/src/main/java/blackjack/domain/Dealer.java index 31ad2d6aa73..f0e4fdccd9a 100644 --- a/src/main/java/blackjack/domain/Dealer.java +++ b/src/main/java/blackjack/domain/Dealer.java @@ -2,7 +2,11 @@ public class Dealer extends Player { - public Dealer(final Hand hand) { - super(hand); + public Dealer(final Name name, final Hand hand) { + super(name, hand); + } + + public Card getFirstCard() { + return hand.getAllCards().get(0); } } diff --git a/src/main/java/blackjack/domain/Name.java b/src/main/java/blackjack/domain/Name.java index 956777266c7..7c0fd077005 100644 --- a/src/main/java/blackjack/domain/Name.java +++ b/src/main/java/blackjack/domain/Name.java @@ -20,4 +20,8 @@ private void validateLength(final String value) { MINIMUM_LENGTH, MAXIMUM_LENGTH); throw new IllegalArgumentException(errorMessage); } + + public String getValue() { + return value; + } } diff --git a/src/main/java/blackjack/domain/Player.java b/src/main/java/blackjack/domain/Player.java index 8630a3fbc36..d63f99ec94a 100644 --- a/src/main/java/blackjack/domain/Player.java +++ b/src/main/java/blackjack/domain/Player.java @@ -3,9 +3,11 @@ import java.util.List; public class Player { - private final Hand hand; + private final Name name; + protected final Hand hand; - public Player(final Hand hand) { + public Player(final Name name, final Hand hand) { + this.name = name; this.hand = hand; } @@ -27,4 +29,8 @@ public boolean isDead() { public int getScore() { return hand.getSum(); } + + public String getName() { + return name.getValue(); + } } diff --git a/src/main/java/blackjack/view/OutputView.java b/src/main/java/blackjack/view/OutputView.java new file mode 100644 index 00000000000..1dedbdccc7c --- /dev/null +++ b/src/main/java/blackjack/view/OutputView.java @@ -0,0 +1,40 @@ +package blackjack.view; + +import blackjack.domain.Card; +import blackjack.domain.Dealer; +import blackjack.domain.Player; + +import java.util.List; +import java.util.stream.Collectors; + +public class OutputView { + public static void printInitialHandOfEachPlayer(final Dealer dealer, final List players) { + printInitialDistributionMessage(dealer, players); + printDealerCard(dealer); + players.forEach(OutputView::printPlayerCard); + } + + private static void printInitialDistributionMessage(final Dealer dealer, final List players) { + final String names = players.stream() + .map(Player::getName) + .collect(Collectors.joining(", ")); + + System.out.println(String.format("%s와 %s에게 2장을 나누었습니다.", dealer.getName(), names)); + } + + private static void printDealerCard(final Dealer dealer) { + final Card card = dealer.getFirstCard(); + + System.out.println(dealer.getName() + ": " + card.getNumber() + card.getShape()); + } + + private static void printPlayerCard(final Player player) { + // TODO: 문자열 분리 (상수 or 메서드) + String cardInfo = player.getName() + "카드: " + player.getCards() + .stream() + // TODO: 이름 합치는 책임을 어디로 할 것인가 (도메인 vs 뷰) + .map(card -> card.getNumber() + card.getShape()) + .collect(Collectors.joining(", ")); + System.out.println(player.getName() + ": " + cardInfo); + } +} diff --git a/src/test/java/blackjack/fixture/PlayerFixture.java b/src/test/java/blackjack/fixture/PlayerFixture.java index ff51fd9f8a4..0e3f91c7bf3 100644 --- a/src/test/java/blackjack/fixture/PlayerFixture.java +++ b/src/test/java/blackjack/fixture/PlayerFixture.java @@ -3,15 +3,18 @@ import blackjack.domain.Card; import blackjack.domain.Dealer; import blackjack.domain.Hand; +import blackjack.domain.Name; import blackjack.domain.Player; public class PlayerFixture { + private static final Name name = new Name("player"); + public static Player player(Card... cards) { Hand hand = new Hand(); for (Card card : cards) { hand.add(card); } - return new Player(hand); + return new Player(name, hand); } public static Dealer dealer(Card... cards) { @@ -19,6 +22,6 @@ public static Dealer dealer(Card... cards) { for (Card card : cards) { hand.add(card); } - return new Dealer(hand); + return new Dealer(name, hand); } } From 710ec427bc9314e2cf7000f702ea41a21a9839ad Mon Sep 17 00:00:00 2001 From: 3juhwan <13selfesteem91@naver.com> Date: Thu, 7 Mar 2024 17:41:38 +0900 Subject: [PATCH 20/56] =?UTF-8?q?feat:=20=ED=94=8C=EB=A0=88=EC=9D=B4?= =?UTF-8?q?=EC=96=B4=EA=B0=80=20=EB=B3=B4=EC=9C=A0=ED=95=9C=20=EB=AA=A8?= =?UTF-8?q?=EB=93=A0=20=EC=B9=B4=EB=93=9C=EB=A5=BC=20=EC=B6=9C=EB=A0=A5?= =?UTF-8?q?=ED=95=98=EB=8A=94=20=EA=B8=B0=EB=8A=A5=20=EA=B5=AC=ED=98=84?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Co-authored-by: MangCho <13selfesteem91@naver.com> Co-authored-by: J-I-H-O --- README.md | 2 +- src/main/java/blackjack/view/OutputView.java | 2 +- 2 files changed, 2 insertions(+), 2 deletions(-) diff --git a/README.md b/README.md index 05ed23753bc..745f0fa0c58 100644 --- a/README.md +++ b/README.md @@ -61,7 +61,7 @@ - [x] 딜러와 플레이어 전원에게 초기에 분배한 카드 출력한다. - [x] 딜러의 카드는 1장만 공개한다. -- [ ] 플레이어가 보유한 모든 카드를 출력한다. +- [x] 플레이어가 보유한 모든 카드를 출력한다. - [ ] 딜러가 추가 카드를 발급 받았는지 여부 출력한다. - [ ] 보유한 모든 카드의 합을 출력한다. - [ ] 최종 승패를 출력한다. diff --git a/src/main/java/blackjack/view/OutputView.java b/src/main/java/blackjack/view/OutputView.java index 1dedbdccc7c..0f6fa40c1fd 100644 --- a/src/main/java/blackjack/view/OutputView.java +++ b/src/main/java/blackjack/view/OutputView.java @@ -28,7 +28,7 @@ private static void printDealerCard(final Dealer dealer) { System.out.println(dealer.getName() + ": " + card.getNumber() + card.getShape()); } - private static void printPlayerCard(final Player player) { + public static void printPlayerCard(final Player player) { // TODO: 문자열 분리 (상수 or 메서드) String cardInfo = player.getName() + "카드: " + player.getCards() .stream() From 972dee8f5deb050848adbffc3dc25180aded596b Mon Sep 17 00:00:00 2001 From: 3juhwan <13selfesteem91@naver.com> Date: Thu, 7 Mar 2024 17:45:35 +0900 Subject: [PATCH 21/56] =?UTF-8?q?feat:=20=EB=94=9C=EB=9F=AC=EA=B0=80=20?= =?UTF-8?q?=EC=B6=94=EA=B0=80=20=EC=B9=B4=EB=93=9C=EB=A5=BC=20=EB=B0=9C?= =?UTF-8?q?=EA=B8=89=20=EB=B0=9B=EC=95=98=EB=8A=94=EC=A7=80=20=EC=97=AC?= =?UTF-8?q?=EB=B6=80=20=EC=B6=9C=EB=A0=A5=ED=95=98=EB=8A=94=20=EA=B8=B0?= =?UTF-8?q?=EB=8A=A5=20=EA=B5=AC=ED=98=84?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Co-authored-by: MangCho <13selfesteem91@naver.com> Co-authored-by: J-I-H-O --- README.md | 2 +- src/main/java/blackjack/view/OutputView.java | 8 +++++++- 2 files changed, 8 insertions(+), 2 deletions(-) diff --git a/README.md b/README.md index 745f0fa0c58..19949f89c5f 100644 --- a/README.md +++ b/README.md @@ -62,6 +62,6 @@ - [x] 딜러와 플레이어 전원에게 초기에 분배한 카드 출력한다. - [x] 딜러의 카드는 1장만 공개한다. - [x] 플레이어가 보유한 모든 카드를 출력한다. -- [ ] 딜러가 추가 카드를 발급 받았는지 여부 출력한다. +- [x] 딜러가 추가 카드를 발급 받았는지 여부 출력한다. - [ ] 보유한 모든 카드의 합을 출력한다. - [ ] 최종 승패를 출력한다. diff --git a/src/main/java/blackjack/view/OutputView.java b/src/main/java/blackjack/view/OutputView.java index 0f6fa40c1fd..f8f25a9c1f5 100644 --- a/src/main/java/blackjack/view/OutputView.java +++ b/src/main/java/blackjack/view/OutputView.java @@ -19,7 +19,8 @@ private static void printInitialDistributionMessage(final Dealer dealer, final L .map(Player::getName) .collect(Collectors.joining(", ")); - System.out.println(String.format("%s와 %s에게 2장을 나누었습니다.", dealer.getName(), names)); + final String initialDistributionMessage = String.format("%s와 %s에게 2장을 나누었습니다.", dealer.getName(), names); + System.out.println(initialDistributionMessage); } private static void printDealerCard(final Dealer dealer) { @@ -37,4 +38,9 @@ public static void printPlayerCard(final Player player) { .collect(Collectors.joining(", ")); System.out.println(player.getName() + ": " + cardInfo); } + + public static void printDealerDrawMessage(final Dealer dealer) { + final String dealerDrawMessage = String.format("%s는 16이하라 한장의 카드를 더 받았습니다.", dealer.getName()); + System.out.println(dealerDrawMessage); + } } From 4371415592ff2b93b38e2834384824bc52257dad Mon Sep 17 00:00:00 2001 From: 3juhwan <13selfesteem91@naver.com> Date: Thu, 7 Mar 2024 17:50:44 +0900 Subject: [PATCH 22/56] =?UTF-8?q?feat:=20=EB=B3=B4=EC=9C=A0=ED=95=9C=20?= =?UTF-8?q?=EB=AA=A8=EB=93=A0=20=EC=B9=B4=EB=93=9C=EC=9D=98=20=ED=95=A9?= =?UTF-8?q?=EC=9D=84=20=EC=B6=9C=EB=A0=A5=ED=95=98=EB=8A=94=20=EA=B8=B0?= =?UTF-8?q?=EB=8A=A5=20=EA=B5=AC=ED=98=84?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Co-authored-by: MangCho <13selfesteem91@naver.com> Co-authored-by: J-I-H-O --- README.md | 2 +- src/main/java/blackjack/view/OutputView.java | 12 ++++++++++++ 2 files changed, 13 insertions(+), 1 deletion(-) diff --git a/README.md b/README.md index 19949f89c5f..f082e9f7262 100644 --- a/README.md +++ b/README.md @@ -63,5 +63,5 @@ - [x] 딜러의 카드는 1장만 공개한다. - [x] 플레이어가 보유한 모든 카드를 출력한다. - [x] 딜러가 추가 카드를 발급 받았는지 여부 출력한다. -- [ ] 보유한 모든 카드의 합을 출력한다. +- [x] 보유한 모든 카드의 합을 출력한다. - [ ] 최종 승패를 출력한다. diff --git a/src/main/java/blackjack/view/OutputView.java b/src/main/java/blackjack/view/OutputView.java index f8f25a9c1f5..80e6563eee4 100644 --- a/src/main/java/blackjack/view/OutputView.java +++ b/src/main/java/blackjack/view/OutputView.java @@ -43,4 +43,16 @@ public static void printDealerDrawMessage(final Dealer dealer) { final String dealerDrawMessage = String.format("%s는 16이하라 한장의 카드를 더 받았습니다.", dealer.getName()); System.out.println(dealerDrawMessage); } + + // 보유한 모든 카드의 합을 출력한다. + // TODO: 중복 제거 + public static void printHandSum(final Player player) { + // TODO: 문자열 분리 (상수 or 메서드) + String cardInfo = player.getName() + "카드: " + player.getCards() + .stream() + // TODO: 이름 합치는 책임을 어디로 할 것인가 (도메인 vs 뷰) + .map(card -> card.getNumber() + card.getShape()) + .collect(Collectors.joining(", ")); + System.out.println(player.getName() + ": " + cardInfo + " - 결과: " + player.getScore()); + } } From 8bb8fd25a8f54245a7827f8d89d352703c46e0db Mon Sep 17 00:00:00 2001 From: 3juhwan <13selfesteem91@naver.com> Date: Thu, 7 Mar 2024 17:55:40 +0900 Subject: [PATCH 23/56] =?UTF-8?q?feat:=20=EC=B5=9C=EC=A2=85=20=EC=8A=B9?= =?UTF-8?q?=ED=8C=A8=EB=A5=BC=20=EC=B6=9C=EB=A0=A5=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: MangCho <13selfesteem91@naver.com> Co-authored-by: J-I-H-O --- README.md | 2 +- src/main/java/blackjack/view/OutputView.java | 11 +++++++++++ 2 files changed, 12 insertions(+), 1 deletion(-) diff --git a/README.md b/README.md index f082e9f7262..28d5e1291fa 100644 --- a/README.md +++ b/README.md @@ -64,4 +64,4 @@ - [x] 플레이어가 보유한 모든 카드를 출력한다. - [x] 딜러가 추가 카드를 발급 받았는지 여부 출력한다. - [x] 보유한 모든 카드의 합을 출력한다. -- [ ] 최종 승패를 출력한다. +- [x] 최종 승패를 출력한다. diff --git a/src/main/java/blackjack/view/OutputView.java b/src/main/java/blackjack/view/OutputView.java index 80e6563eee4..cb10adc19e8 100644 --- a/src/main/java/blackjack/view/OutputView.java +++ b/src/main/java/blackjack/view/OutputView.java @@ -1,6 +1,7 @@ package blackjack.view; import blackjack.domain.Card; +import blackjack.domain.CardGameResult; import blackjack.domain.Dealer; import blackjack.domain.Player; @@ -55,4 +56,14 @@ public static void printHandSum(final Player player) { .collect(Collectors.joining(", ")); System.out.println(player.getName() + ": " + cardInfo + " - 결과: " + player.getScore()); } + + public static void printResult(final CardGameResult cardGameResult) { + System.out.println("## 최종 승패"); + System.out.println("딜러: " + cardGameResult.getDealerWinCount() + "승 " + cardGameResult.getDealerLoseCount() + "패"); + cardGameResult.getTotalResult() + .entrySet() + .stream() + .map(result -> result.getKey().getName() + ": " + result.getValue().name()) + .forEach(System.out::println); + } } From 35de8540a6d9a134b99759890b4264f08a5556b2 Mon Sep 17 00:00:00 2001 From: 3juhwan <13selfesteem91@naver.com> Date: Thu, 7 Mar 2024 18:10:58 +0900 Subject: [PATCH 24/56] =?UTF-8?q?feat:=20controller=EC=97=90=EC=84=9C=20?= =?UTF-8?q?=EC=82=AC=EC=9A=A9=EC=9E=90=EC=97=90=EA=B2=8C=20=EC=B2=98?= =?UTF-8?q?=EC=9D=8C=20=EC=B9=B4=EB=93=9C=202=EC=9E=A5=EC=94=A9=20?= =?UTF-8?q?=EB=B6=80=EC=97=AC=ED=95=98=EB=8A=94=20=EA=B8=B0=EB=8A=A5=20?= =?UTF-8?q?=EA=B5=AC=ED=98=84?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Co-authored-by: MangCho <13selfesteem91@naver.com> Co-authored-by: J-I-H-O --- .../java/blackjack/BlackjackController.java | 31 +++++++++++++++++++ src/main/java/blackjack/domain/CardGame.java | 9 +++--- src/main/java/blackjack/view/InputView.java | 4 +-- .../java/blackjack/domain/CardGameTest.java | 3 +- 4 files changed, 38 insertions(+), 9 deletions(-) create mode 100644 src/main/java/blackjack/BlackjackController.java diff --git a/src/main/java/blackjack/BlackjackController.java b/src/main/java/blackjack/BlackjackController.java new file mode 100644 index 00000000000..021e79e8168 --- /dev/null +++ b/src/main/java/blackjack/BlackjackController.java @@ -0,0 +1,31 @@ +package blackjack; + +import blackjack.domain.CardGame; +import blackjack.domain.Dealer; +import blackjack.domain.Hand; +import blackjack.domain.Name; +import blackjack.domain.Player; +import blackjack.view.InputView; +import blackjack.view.OutputView; + +import java.util.List; + +public class BlackjackController { + + public static void main(String[] args) { + List names = InputView.readPlayerNames(); + + List players = names.stream() + .map(name -> new Player(new Name(name), new Hand())) + .toList(); + + CardGame cardGame = new CardGame(); + cardGame.giveTwoCardsEachPlayer(players); + + Dealer dealer = new Dealer(new Name("딜러"), new Hand()); + cardGame.giveCard(dealer); + cardGame.giveCard(dealer); + + OutputView.printInitialHandOfEachPlayer(dealer, players); + } +} diff --git a/src/main/java/blackjack/domain/CardGame.java b/src/main/java/blackjack/domain/CardGame.java index 159932450b2..e72edd4b2f6 100644 --- a/src/main/java/blackjack/domain/CardGame.java +++ b/src/main/java/blackjack/domain/CardGame.java @@ -9,16 +9,15 @@ public CardGame() { this.cardDeck = new CardDeck(); } - public void giveCard(final Player player, final Card card) { - player.addCards(card); + public void giveCard(final Player player) { + player.addCards(cardDeck.draw()); } // TODO: 이름 수정 public void giveTwoCardsEachPlayer(final List players) { for (Player player : players) { - // TODO: 개선 필요 - giveCard(player, cardDeck.draw()); - giveCard(player, cardDeck.draw()); + giveCard(player); + giveCard(player); } } } diff --git a/src/main/java/blackjack/view/InputView.java b/src/main/java/blackjack/view/InputView.java index 3a9f091e6f4..e67371926cc 100644 --- a/src/main/java/blackjack/view/InputView.java +++ b/src/main/java/blackjack/view/InputView.java @@ -6,8 +6,8 @@ public class InputView { // TODO: 상수명 변경 private static final Scanner scanner = new Scanner(System.in); - public static final String YES = "y"; - public static final String NO = "n"; + private static final String YES = "y"; + private static final String NO = "n"; public static List readPlayerNames() { printPlayerNamesInputMessage(); diff --git a/src/test/java/blackjack/domain/CardGameTest.java b/src/test/java/blackjack/domain/CardGameTest.java index 43b8d219a3e..8a3da0ee476 100644 --- a/src/test/java/blackjack/domain/CardGameTest.java +++ b/src/test/java/blackjack/domain/CardGameTest.java @@ -14,10 +14,9 @@ public class CardGameTest { @Test void 카드_한_장을_플레이어에게_지급한다() { Player mangcho = player(); - Card card = new Card(ACE, SPADE); CardGame cardGame = new CardGame(); - cardGame.giveCard(mangcho, card); + cardGame.giveCard(mangcho); assertThat(mangcho.getCards().size()).isEqualTo(1); } From 2b06dd1f5fd9eef05953fd37a3a227dc13d03833 Mon Sep 17 00:00:00 2001 From: 3juhwan <13selfesteem91@naver.com> Date: Fri, 8 Mar 2024 11:31:46 +0900 Subject: [PATCH 25/56] =?UTF-8?q?fix:=20=ED=94=8C=EB=A0=88=EC=9D=B4?= =?UTF-8?q?=EC=96=B4=20=EC=B9=B4=EB=93=9C=EB=A5=BC=20=EC=B6=9C=EB=A0=A5?= =?UTF-8?q?=ED=95=98=EB=8A=94=20=EA=B5=AC=EB=AC=B8=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: MangCho <13selfesteem91@naver.com> Co-authored-by: J-I-H-O --- src/main/java/blackjack/view/OutputView.java | 5 +++-- 1 file changed, 3 insertions(+), 2 deletions(-) diff --git a/src/main/java/blackjack/view/OutputView.java b/src/main/java/blackjack/view/OutputView.java index cb10adc19e8..595c03014a2 100644 --- a/src/main/java/blackjack/view/OutputView.java +++ b/src/main/java/blackjack/view/OutputView.java @@ -37,9 +37,10 @@ public static void printPlayerCard(final Player player) { // TODO: 이름 합치는 책임을 어디로 할 것인가 (도메인 vs 뷰) .map(card -> card.getNumber() + card.getShape()) .collect(Collectors.joining(", ")); - System.out.println(player.getName() + ": " + cardInfo); + System.out.println(cardInfo); } + // TODO: Dealer 타입이 아닌 Name을 받도록 수정 public static void printDealerDrawMessage(final Dealer dealer) { final String dealerDrawMessage = String.format("%s는 16이하라 한장의 카드를 더 받았습니다.", dealer.getName()); System.out.println(dealerDrawMessage); @@ -54,7 +55,7 @@ public static void printHandSum(final Player player) { // TODO: 이름 합치는 책임을 어디로 할 것인가 (도메인 vs 뷰) .map(card -> card.getNumber() + card.getShape()) .collect(Collectors.joining(", ")); - System.out.println(player.getName() + ": " + cardInfo + " - 결과: " + player.getScore()); + System.out.println(cardInfo + " - 결과: " + player.getScore()); } public static void printResult(final CardGameResult cardGameResult) { From 0f5681d2aed212fe8b20bfd68534b43c113e6d45 Mon Sep 17 00:00:00 2001 From: 3juhwan <13selfesteem91@naver.com> Date: Fri, 8 Mar 2024 13:21:41 +0900 Subject: [PATCH 26/56] =?UTF-8?q?feat:=20Controller=20=EC=A0=84=EC=B2=B4?= =?UTF-8?q?=20=EA=B8=B0=EB=8A=A5=20=EA=B5=AC=ED=98=84?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Co-authored-by: MangCho <13selfesteem91@naver.com> Co-authored-by: J-I-H-O --- .../java/blackjack/BlackjackController.java | 56 +++++++++++++++---- src/main/java/blackjack/domain/CardGame.java | 6 ++ src/main/java/blackjack/domain/Dealer.java | 6 ++ .../java/blackjack/domain/WinningStatus.java | 17 +++++- src/main/java/blackjack/view/OutputView.java | 7 ++- 5 files changed, 77 insertions(+), 15 deletions(-) diff --git a/src/main/java/blackjack/BlackjackController.java b/src/main/java/blackjack/BlackjackController.java index 021e79e8168..f09ad919d8d 100644 --- a/src/main/java/blackjack/BlackjackController.java +++ b/src/main/java/blackjack/BlackjackController.java @@ -1,6 +1,8 @@ package blackjack; import blackjack.domain.CardGame; +import blackjack.domain.CardGameJudge; +import blackjack.domain.CardGameResult; import blackjack.domain.Dealer; import blackjack.domain.Hand; import blackjack.domain.Name; @@ -11,21 +13,55 @@ import java.util.List; public class BlackjackController { - public static void main(String[] args) { - List names = InputView.readPlayerNames(); - - List players = names.stream() + final CardGame cardGame = new CardGame(); + final List names = InputView.readPlayerNames(); + final List players = names.stream() .map(name -> new Player(new Name(name), new Hand())) .toList(); + final Dealer dealer = new Dealer(new Name("딜러"), new Hand()); + + cardGame.initializeHand(dealer, players); + OutputView.printInitialHandOfEachPlayer(dealer, players); - CardGame cardGame = new CardGame(); - cardGame.giveTwoCardsEachPlayer(players); + givePlayerMoreCardsIfWanted(cardGame, players); + giveDealerMoreCardsIfNeeded(cardGame, dealer); - Dealer dealer = new Dealer(new Name("딜러"), new Hand()); - cardGame.giveCard(dealer); - cardGame.giveCard(dealer); + printHandStatusOfEachPlayer(dealer, players); + printCardGameResult(dealer, players); + } - OutputView.printInitialHandOfEachPlayer(dealer, players); + private static void givePlayerMoreCardsIfWanted(final CardGame cardGame, final List players) { + for (Player player : players) { + while (!player.isDead()) { + // TODO: 변수명 수정 + boolean needAnotherCard = InputView.askForAnotherCard(player.getName()); + if (!needAnotherCard) { + break; + } + cardGame.giveCard(player); + OutputView.printPlayerCard(player); + } + } + } + + private static void giveDealerMoreCardsIfNeeded(final CardGame cardGame, final Dealer dealer) { + while (dealer.needMoreCard()) { + cardGame.giveCard(dealer); + OutputView.printDealerDrawMessage(dealer); + } + } + + private static void printHandStatusOfEachPlayer(final Dealer dealer, final List players) { + OutputView.printHandSum(dealer); + for (Player player : players) { + OutputView.printHandSum(player); + } + } + + private static void printCardGameResult(final Dealer dealer, final List players) { + final CardGameJudge cardGameJudge = new CardGameJudge(); + final CardGameResult cardGameResult = cardGameJudge.judge(dealer, players); + OutputView.printResult(cardGameResult); } } diff --git a/src/main/java/blackjack/domain/CardGame.java b/src/main/java/blackjack/domain/CardGame.java index e72edd4b2f6..dc77cb9f0c2 100644 --- a/src/main/java/blackjack/domain/CardGame.java +++ b/src/main/java/blackjack/domain/CardGame.java @@ -13,6 +13,12 @@ public void giveCard(final Player player) { player.addCards(cardDeck.draw()); } + public void initializeHand(final Dealer dealer, final List players) { + giveCard(dealer); + giveCard(dealer); + giveTwoCardsEachPlayer(players); + } + // TODO: 이름 수정 public void giveTwoCardsEachPlayer(final List players) { for (Player player : players) { diff --git a/src/main/java/blackjack/domain/Dealer.java b/src/main/java/blackjack/domain/Dealer.java index f0e4fdccd9a..567af4b8f51 100644 --- a/src/main/java/blackjack/domain/Dealer.java +++ b/src/main/java/blackjack/domain/Dealer.java @@ -1,11 +1,17 @@ package blackjack.domain; public class Dealer extends Player { + // TODO: 이름 고민 + public static final int MINIMUM_NUMBER_OF_CARD = 16; public Dealer(final Name name, final Hand hand) { super(name, hand); } + public boolean needMoreCard() { + return this.hand.getSum() <= MINIMUM_NUMBER_OF_CARD; + } + public Card getFirstCard() { return hand.getAllCards().get(0); } diff --git a/src/main/java/blackjack/domain/WinningStatus.java b/src/main/java/blackjack/domain/WinningStatus.java index f6d548b0fe7..bbf8ef56442 100644 --- a/src/main/java/blackjack/domain/WinningStatus.java +++ b/src/main/java/blackjack/domain/WinningStatus.java @@ -1,7 +1,18 @@ package blackjack.domain; public enum WinningStatus { - WIN, - PUSH, - LOSE + WIN("승"), + PUSH("무"), + LOSE("패"); + + // TODO: 이름 바꾸기 + private final String value; + + WinningStatus(final String value) { + this.value = value; + } + + public String getValue() { + return value; + } } diff --git a/src/main/java/blackjack/view/OutputView.java b/src/main/java/blackjack/view/OutputView.java index 595c03014a2..5e8ec2943e4 100644 --- a/src/main/java/blackjack/view/OutputView.java +++ b/src/main/java/blackjack/view/OutputView.java @@ -8,6 +8,8 @@ import java.util.List; import java.util.stream.Collectors; +import static blackjack.domain.WinningStatus.*; + public class OutputView { public static void printInitialHandOfEachPlayer(final Dealer dealer, final List players) { printInitialDistributionMessage(dealer, players); @@ -60,11 +62,12 @@ public static void printHandSum(final Player player) { public static void printResult(final CardGameResult cardGameResult) { System.out.println("## 최종 승패"); - System.out.println("딜러: " + cardGameResult.getDealerWinCount() + "승 " + cardGameResult.getDealerLoseCount() + "패"); + // TODO: 무승부 처리 추가 + System.out.println("딜러: " + cardGameResult.getDealerWinCount() + WIN.getValue() + " " + cardGameResult.getDealerLoseCount() + LOSE.getValue()); cardGameResult.getTotalResult() .entrySet() .stream() - .map(result -> result.getKey().getName() + ": " + result.getValue().name()) + .map(result -> result.getKey().getName() + ": " + result.getValue().getValue()) .forEach(System.out::println); } } From 5d0237039c1e5b5ce84a8b7d4921fe68bf11dcbc Mon Sep 17 00:00:00 2001 From: 3juhwan <13selfesteem91@naver.com> Date: Fri, 8 Mar 2024 13:49:50 +0900 Subject: [PATCH 27/56] =?UTF-8?q?refactor:=20=EB=94=9C=EB=9F=AC,=20?= =?UTF-8?q?=ED=94=8C=EB=A0=88=EC=9D=B4=EC=96=B4=20=EC=83=9D=EC=84=B1?= =?UTF-8?q?=EC=9E=90=EC=97=90=20=EB=A7=A4=EA=B0=9C=EB=B3=80=EC=88=98=20?= =?UTF-8?q?=EC=B5=9C=EC=86=8C=ED=99=94?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Co-authored-by: MangCho <13selfesteem91@naver.com> Co-authored-by: J-I-H-O --- src/main/java/blackjack/BlackjackController.java | 6 ++---- src/main/java/blackjack/domain/CardGame.java | 2 +- src/main/java/blackjack/domain/Dealer.java | 5 +++-- src/main/java/blackjack/domain/Player.java | 14 ++++++-------- .../java/blackjack/fixture/PlayerFixture.java | 16 ++++++---------- 5 files changed, 18 insertions(+), 25 deletions(-) diff --git a/src/main/java/blackjack/BlackjackController.java b/src/main/java/blackjack/BlackjackController.java index f09ad919d8d..77c435556e4 100644 --- a/src/main/java/blackjack/BlackjackController.java +++ b/src/main/java/blackjack/BlackjackController.java @@ -4,8 +4,6 @@ import blackjack.domain.CardGameJudge; import blackjack.domain.CardGameResult; import blackjack.domain.Dealer; -import blackjack.domain.Hand; -import blackjack.domain.Name; import blackjack.domain.Player; import blackjack.view.InputView; import blackjack.view.OutputView; @@ -17,9 +15,9 @@ public static void main(String[] args) { final CardGame cardGame = new CardGame(); final List names = InputView.readPlayerNames(); final List players = names.stream() - .map(name -> new Player(new Name(name), new Hand())) + .map(Player::new) .toList(); - final Dealer dealer = new Dealer(new Name("딜러"), new Hand()); + final Dealer dealer = new Dealer(); cardGame.initializeHand(dealer, players); OutputView.printInitialHandOfEachPlayer(dealer, players); diff --git a/src/main/java/blackjack/domain/CardGame.java b/src/main/java/blackjack/domain/CardGame.java index dc77cb9f0c2..a370bab6837 100644 --- a/src/main/java/blackjack/domain/CardGame.java +++ b/src/main/java/blackjack/domain/CardGame.java @@ -10,7 +10,7 @@ public CardGame() { } public void giveCard(final Player player) { - player.addCards(cardDeck.draw()); + player.addCard(cardDeck.draw()); } public void initializeHand(final Dealer dealer, final List players) { diff --git a/src/main/java/blackjack/domain/Dealer.java b/src/main/java/blackjack/domain/Dealer.java index 567af4b8f51..cc055fa2d09 100644 --- a/src/main/java/blackjack/domain/Dealer.java +++ b/src/main/java/blackjack/domain/Dealer.java @@ -2,10 +2,11 @@ public class Dealer extends Player { // TODO: 이름 고민 + public static final String DEALER_NAME = "딜러"; public static final int MINIMUM_NUMBER_OF_CARD = 16; - public Dealer(final Name name, final Hand hand) { - super(name, hand); + public Dealer() { + super(DEALER_NAME); } public boolean needMoreCard() { diff --git a/src/main/java/blackjack/domain/Player.java b/src/main/java/blackjack/domain/Player.java index d63f99ec94a..a951224b077 100644 --- a/src/main/java/blackjack/domain/Player.java +++ b/src/main/java/blackjack/domain/Player.java @@ -3,18 +3,16 @@ import java.util.List; public class Player { - private final Name name; protected final Hand hand; + private final Name name; - public Player(final Name name, final Hand hand) { - this.name = name; - this.hand = hand; + public Player(final String name) { + this.hand = new Hand(); + this.name = new Name(name); } - public void addCards(final Card... cards) { - for (Card card : cards) { - hand.add(card); - } + public void addCard(final Card card) { + hand.add(card); } public List getCards() { diff --git a/src/test/java/blackjack/fixture/PlayerFixture.java b/src/test/java/blackjack/fixture/PlayerFixture.java index 0e3f91c7bf3..95a3c228985 100644 --- a/src/test/java/blackjack/fixture/PlayerFixture.java +++ b/src/test/java/blackjack/fixture/PlayerFixture.java @@ -2,26 +2,22 @@ import blackjack.domain.Card; import blackjack.domain.Dealer; -import blackjack.domain.Hand; -import blackjack.domain.Name; import blackjack.domain.Player; public class PlayerFixture { - private static final Name name = new Name("player"); - public static Player player(Card... cards) { - Hand hand = new Hand(); + Player player = new Player("player"); for (Card card : cards) { - hand.add(card); + player.addCard(card); } - return new Player(name, hand); + return player; } public static Dealer dealer(Card... cards) { - Hand hand = new Hand(); + Dealer dealer = new Dealer(); for (Card card : cards) { - hand.add(card); + dealer.addCard(card); } - return new Dealer(name, hand); + return dealer; } } From 6e32df2b8dd83803499384ca78a00412223a3198 Mon Sep 17 00:00:00 2001 From: 3juhwan <13selfesteem91@naver.com> Date: Fri, 8 Mar 2024 14:01:07 +0900 Subject: [PATCH 28/56] =?UTF-8?q?refactor:=20=EB=94=9C=EB=9F=AC=20?= =?UTF-8?q?=ED=81=B4=EB=9E=98=EC=8A=A4=EC=9D=98=20=EB=A9=94=EC=84=9C?= =?UTF-8?q?=EB=93=9C=EB=AA=85=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: MangCho <13selfesteem91@naver.com> Co-authored-by: J-I-H-O --- .../java/blackjack/BlackjackController.java | 2 +- src/main/java/blackjack/domain/Dealer.java | 17 ++++++++++------- .../blackjack/domain/CardGameJudgeTest.java | 4 ++-- src/test/java/blackjack/domain/PlayerTest.java | 6 ++++-- 4 files changed, 17 insertions(+), 12 deletions(-) diff --git a/src/main/java/blackjack/BlackjackController.java b/src/main/java/blackjack/BlackjackController.java index 77c435556e4..fffccaa6b2f 100644 --- a/src/main/java/blackjack/BlackjackController.java +++ b/src/main/java/blackjack/BlackjackController.java @@ -44,7 +44,7 @@ private static void givePlayerMoreCardsIfWanted(final CardGame cardGame, final L } private static void giveDealerMoreCardsIfNeeded(final CardGame cardGame, final Dealer dealer) { - while (dealer.needMoreCard()) { + while (dealer.isMoreCardNeeded()) { cardGame.giveCard(dealer); OutputView.printDealerDrawMessage(dealer); } diff --git a/src/main/java/blackjack/domain/Dealer.java b/src/main/java/blackjack/domain/Dealer.java index cc055fa2d09..935d9750588 100644 --- a/src/main/java/blackjack/domain/Dealer.java +++ b/src/main/java/blackjack/domain/Dealer.java @@ -1,19 +1,22 @@ package blackjack.domain; public class Dealer extends Player { - // TODO: 이름 고민 - public static final String DEALER_NAME = "딜러"; - public static final int MINIMUM_NUMBER_OF_CARD = 16; + public static final String NAME = "딜러"; + public static final int HIT_THRESHOLD = 16; public Dealer() { - super(DEALER_NAME); + super(NAME); } - public boolean needMoreCard() { - return this.hand.getSum() <= MINIMUM_NUMBER_OF_CARD; + public boolean isMoreCardNeeded() { + return this.hand.getSum() <= HIT_THRESHOLD; } public Card getFirstCard() { - return hand.getAllCards().get(0); + try { + return hand.getAllCards().get(0); + } catch (IndexOutOfBoundsException e) { + throw new RuntimeException("[ERROR] 딜러가 카드를 갖고 있지 않습니다."); + } } } diff --git a/src/test/java/blackjack/domain/CardGameJudgeTest.java b/src/test/java/blackjack/domain/CardGameJudgeTest.java index aaf6bde5679..21df534a31a 100644 --- a/src/test/java/blackjack/domain/CardGameJudgeTest.java +++ b/src/test/java/blackjack/domain/CardGameJudgeTest.java @@ -31,10 +31,10 @@ public class CardGameJudgeTest { new Card(QUEEN, HEART), new Card(QUEEN, SPADE)); - var result = cardGameJudge.judge(dealer, List.of(mangcho)) + var totalResult = cardGameJudge.judge(dealer, List.of(mangcho)) .getTotalResult(); - assertThat(result.get(mangcho)).isEqualTo(WinningStatus.LOSE); + assertThat(totalResult.get(mangcho)).isEqualTo(WinningStatus.LOSE); } @Test diff --git a/src/test/java/blackjack/domain/PlayerTest.java b/src/test/java/blackjack/domain/PlayerTest.java index 4df0125953c..6d47d05d683 100644 --- a/src/test/java/blackjack/domain/PlayerTest.java +++ b/src/test/java/blackjack/domain/PlayerTest.java @@ -13,8 +13,10 @@ public class PlayerTest { @Test void 플레이어는_죽었는지_여부를_반환한다() { - Player player = player(); - player.addCards(new Card(KING, CLOVER), new Card(KING, SPADE), new Card(KING, HEART)); + Player player = player( + new Card(KING, CLOVER), + new Card(KING, SPADE), + new Card(KING, HEART)); boolean isDead = player.isDead(); From 4940a10279a061f95e8d3e934fdfe5f49f6ba7e6 Mon Sep 17 00:00:00 2001 From: 3juhwan <13selfesteem91@naver.com> Date: Fri, 8 Mar 2024 14:04:52 +0900 Subject: [PATCH 29/56] =?UTF-8?q?refactor:=20=EB=8F=84=EB=A9=94=EC=9D=B8?= =?UTF-8?q?=20=EC=9A=A9=EC=96=B4=EB=A1=9C=20=EB=B3=80=EA=B2=BD=20(draw=20-?= =?UTF-8?q?>=20hit)?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Co-authored-by: MangCho <13selfesteem91@naver.com> Co-authored-by: J-I-H-O --- src/main/java/blackjack/BlackjackController.java | 2 +- src/main/java/blackjack/view/OutputView.java | 6 +++--- 2 files changed, 4 insertions(+), 4 deletions(-) diff --git a/src/main/java/blackjack/BlackjackController.java b/src/main/java/blackjack/BlackjackController.java index fffccaa6b2f..f0c9ab13277 100644 --- a/src/main/java/blackjack/BlackjackController.java +++ b/src/main/java/blackjack/BlackjackController.java @@ -46,7 +46,7 @@ private static void givePlayerMoreCardsIfWanted(final CardGame cardGame, final L private static void giveDealerMoreCardsIfNeeded(final CardGame cardGame, final Dealer dealer) { while (dealer.isMoreCardNeeded()) { cardGame.giveCard(dealer); - OutputView.printDealerDrawMessage(dealer); + OutputView.printDealerHitMessage(dealer); } } diff --git a/src/main/java/blackjack/view/OutputView.java b/src/main/java/blackjack/view/OutputView.java index 5e8ec2943e4..29f9bf78d79 100644 --- a/src/main/java/blackjack/view/OutputView.java +++ b/src/main/java/blackjack/view/OutputView.java @@ -43,9 +43,9 @@ public static void printPlayerCard(final Player player) { } // TODO: Dealer 타입이 아닌 Name을 받도록 수정 - public static void printDealerDrawMessage(final Dealer dealer) { - final String dealerDrawMessage = String.format("%s는 16이하라 한장의 카드를 더 받았습니다.", dealer.getName()); - System.out.println(dealerDrawMessage); + public static void printDealerHitMessage(final Dealer dealer) { + final String dealerHitMessage = String.format("%s는 16이하라 한장의 카드를 더 받았습니다.", dealer.getName()); + System.out.println(dealerHitMessage); } // 보유한 모든 카드의 합을 출력한다. From cbe46ac87a04b9cd705d36d51064bce7147bfb17 Mon Sep 17 00:00:00 2001 From: 3juhwan <13selfesteem91@naver.com> Date: Fri, 8 Mar 2024 14:13:03 +0900 Subject: [PATCH 30/56] =?UTF-8?q?refactor:=20=ED=8C=A8=ED=82=A4=EC=A7=80?= =?UTF-8?q?=20=EB=B6=84=EB=A6=AC?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Co-authored-by: MangCho <13selfesteem91@naver.com> Co-authored-by: J-I-H-O --- .../java/blackjack/BlackjackController.java | 10 ++++---- .../blackjack/domain/{ => card}/Card.java | 2 +- .../domain/{ => card}/CardNumber.java | 2 +- .../domain/{ => card}/CardShape.java | 2 +- .../domain/{ => cardgame}/CardDeck.java | 7 +++++- .../domain/{ => cardgame}/CardGame.java | 5 +++- .../domain/{ => cardgame}/CardGameJudge.java | 4 +++- .../domain/{ => cardgame}/CardGameResult.java | 8 ++++--- .../domain/{ => cardgame}/WinningStatus.java | 2 +- .../blackjack/domain/{ => player}/Dealer.java | 4 +++- .../blackjack/domain/{ => player}/Hand.java | 4 +++- .../blackjack/domain/{ => player}/Name.java | 2 +- .../blackjack/domain/{ => player}/Player.java | 4 +++- src/main/java/blackjack/view/OutputView.java | 10 ++++---- .../domain/{ => cardgame}/CardDeckTest.java | 4 +++- .../{ => cardgame}/CardGameJudgeTest.java | 23 +++++++++++-------- .../{ => cardgame}/CardGameResultTest.java | 9 +++++--- .../domain/{ => cardgame}/CardGameTest.java | 6 ++--- .../domain/{ => player}/HandTest.java | 12 ++++++---- .../domain/{ => player}/NameTest.java | 3 ++- .../domain/{ => player}/PlayerTest.java | 12 ++++++---- .../java/blackjack/fixture/PlayerFixture.java | 6 ++--- 22 files changed, 87 insertions(+), 54 deletions(-) rename src/main/java/blackjack/domain/{ => card}/Card.java (92%) rename src/main/java/blackjack/domain/{ => card}/CardNumber.java (92%) rename src/main/java/blackjack/domain/{ => card}/CardShape.java (90%) rename src/main/java/blackjack/domain/{ => cardgame}/CardDeck.java (73%) rename src/main/java/blackjack/domain/{ => cardgame}/CardGame.java (85%) rename src/main/java/blackjack/domain/{ => cardgame}/CardGameJudge.java (95%) rename src/main/java/blackjack/domain/{ => cardgame}/CardGameResult.java (80%) rename src/main/java/blackjack/domain/{ => cardgame}/WinningStatus.java (88%) rename src/main/java/blackjack/domain/{ => player}/Dealer.java (88%) rename src/main/java/blackjack/domain/{ => player}/Hand.java (86%) rename src/main/java/blackjack/domain/{ => player}/Name.java (95%) rename src/main/java/blackjack/domain/{ => player}/Player.java (90%) rename src/test/java/blackjack/domain/{ => cardgame}/CardDeckTest.java (73%) rename src/test/java/blackjack/domain/{ => cardgame}/CardGameJudgeTest.java (83%) rename src/test/java/blackjack/domain/{ => cardgame}/CardGameResultTest.java (73%) rename src/test/java/blackjack/domain/{ => cardgame}/CardGameTest.java (88%) rename src/test/java/blackjack/domain/{ => player}/HandTest.java (57%) rename src/test/java/blackjack/domain/{ => player}/NameTest.java (86%) rename src/test/java/blackjack/domain/{ => player}/PlayerTest.java (60%) diff --git a/src/main/java/blackjack/BlackjackController.java b/src/main/java/blackjack/BlackjackController.java index f0c9ab13277..4c06fdbf4c2 100644 --- a/src/main/java/blackjack/BlackjackController.java +++ b/src/main/java/blackjack/BlackjackController.java @@ -1,10 +1,10 @@ package blackjack; -import blackjack.domain.CardGame; -import blackjack.domain.CardGameJudge; -import blackjack.domain.CardGameResult; -import blackjack.domain.Dealer; -import blackjack.domain.Player; +import blackjack.domain.cardgame.CardGame; +import blackjack.domain.cardgame.CardGameJudge; +import blackjack.domain.cardgame.CardGameResult; +import blackjack.domain.player.Dealer; +import blackjack.domain.player.Player; import blackjack.view.InputView; import blackjack.view.OutputView; diff --git a/src/main/java/blackjack/domain/Card.java b/src/main/java/blackjack/domain/card/Card.java similarity index 92% rename from src/main/java/blackjack/domain/Card.java rename to src/main/java/blackjack/domain/card/Card.java index 05bcd6ec18b..a5a2d23c591 100644 --- a/src/main/java/blackjack/domain/Card.java +++ b/src/main/java/blackjack/domain/card/Card.java @@ -1,4 +1,4 @@ -package blackjack.domain; +package blackjack.domain.card; public class Card { private final CardNumber cardNumber; diff --git a/src/main/java/blackjack/domain/CardNumber.java b/src/main/java/blackjack/domain/card/CardNumber.java similarity index 92% rename from src/main/java/blackjack/domain/CardNumber.java rename to src/main/java/blackjack/domain/card/CardNumber.java index cae663f1d79..471e3384c94 100644 --- a/src/main/java/blackjack/domain/CardNumber.java +++ b/src/main/java/blackjack/domain/card/CardNumber.java @@ -1,4 +1,4 @@ -package blackjack.domain; +package blackjack.domain.card; public enum CardNumber { ACE(1), diff --git a/src/main/java/blackjack/domain/CardShape.java b/src/main/java/blackjack/domain/card/CardShape.java similarity index 90% rename from src/main/java/blackjack/domain/CardShape.java rename to src/main/java/blackjack/domain/card/CardShape.java index 7e2a15f50c3..af675f9d6ff 100644 --- a/src/main/java/blackjack/domain/CardShape.java +++ b/src/main/java/blackjack/domain/card/CardShape.java @@ -1,4 +1,4 @@ -package blackjack.domain; +package blackjack.domain.card; public enum CardShape { SPADE("스페이드"), diff --git a/src/main/java/blackjack/domain/CardDeck.java b/src/main/java/blackjack/domain/cardgame/CardDeck.java similarity index 73% rename from src/main/java/blackjack/domain/CardDeck.java rename to src/main/java/blackjack/domain/cardgame/CardDeck.java index bcab9901f13..b91de784d52 100644 --- a/src/main/java/blackjack/domain/CardDeck.java +++ b/src/main/java/blackjack/domain/cardgame/CardDeck.java @@ -1,4 +1,8 @@ -package blackjack.domain; +package blackjack.domain.cardgame; + +import blackjack.domain.card.Card; +import blackjack.domain.card.CardNumber; +import blackjack.domain.card.CardShape; import java.util.Collections; import java.util.Stack; @@ -8,6 +12,7 @@ public class CardDeck { public CardDeck() { final Stack deck = new Stack<>(); + // TODO: 2중 for문 제거 for (CardNumber cardNumber : CardNumber.values()) { for (CardShape cardShape : CardShape.values()) { deck.push(new Card(cardNumber, cardShape)); diff --git a/src/main/java/blackjack/domain/CardGame.java b/src/main/java/blackjack/domain/cardgame/CardGame.java similarity index 85% rename from src/main/java/blackjack/domain/CardGame.java rename to src/main/java/blackjack/domain/cardgame/CardGame.java index a370bab6837..095fd57f23a 100644 --- a/src/main/java/blackjack/domain/CardGame.java +++ b/src/main/java/blackjack/domain/cardgame/CardGame.java @@ -1,4 +1,7 @@ -package blackjack.domain; +package blackjack.domain.cardgame; + +import blackjack.domain.player.Dealer; +import blackjack.domain.player.Player; import java.util.List; diff --git a/src/main/java/blackjack/domain/CardGameJudge.java b/src/main/java/blackjack/domain/cardgame/CardGameJudge.java similarity index 95% rename from src/main/java/blackjack/domain/CardGameJudge.java rename to src/main/java/blackjack/domain/cardgame/CardGameJudge.java index e9ee7612e90..2a492463e96 100644 --- a/src/main/java/blackjack/domain/CardGameJudge.java +++ b/src/main/java/blackjack/domain/cardgame/CardGameJudge.java @@ -1,4 +1,6 @@ -package blackjack.domain; +package blackjack.domain.cardgame; + +import blackjack.domain.player.Player; import java.util.LinkedHashMap; import java.util.List; diff --git a/src/main/java/blackjack/domain/CardGameResult.java b/src/main/java/blackjack/domain/cardgame/CardGameResult.java similarity index 80% rename from src/main/java/blackjack/domain/CardGameResult.java rename to src/main/java/blackjack/domain/cardgame/CardGameResult.java index 96c63fea05e..9dfe8a73fc6 100644 --- a/src/main/java/blackjack/domain/CardGameResult.java +++ b/src/main/java/blackjack/domain/cardgame/CardGameResult.java @@ -1,10 +1,12 @@ -package blackjack.domain; +package blackjack.domain.cardgame; + +import blackjack.domain.player.Player; import java.util.Collections; import java.util.Map; -import static blackjack.domain.WinningStatus.LOSE; -import static blackjack.domain.WinningStatus.WIN; +import static blackjack.domain.cardgame.WinningStatus.LOSE; +import static blackjack.domain.cardgame.WinningStatus.WIN; public class CardGameResult { private final Map totalResult; diff --git a/src/main/java/blackjack/domain/WinningStatus.java b/src/main/java/blackjack/domain/cardgame/WinningStatus.java similarity index 88% rename from src/main/java/blackjack/domain/WinningStatus.java rename to src/main/java/blackjack/domain/cardgame/WinningStatus.java index bbf8ef56442..dbe131dde72 100644 --- a/src/main/java/blackjack/domain/WinningStatus.java +++ b/src/main/java/blackjack/domain/cardgame/WinningStatus.java @@ -1,4 +1,4 @@ -package blackjack.domain; +package blackjack.domain.cardgame; public enum WinningStatus { WIN("승"), diff --git a/src/main/java/blackjack/domain/Dealer.java b/src/main/java/blackjack/domain/player/Dealer.java similarity index 88% rename from src/main/java/blackjack/domain/Dealer.java rename to src/main/java/blackjack/domain/player/Dealer.java index 935d9750588..9dec85ae9d7 100644 --- a/src/main/java/blackjack/domain/Dealer.java +++ b/src/main/java/blackjack/domain/player/Dealer.java @@ -1,4 +1,6 @@ -package blackjack.domain; +package blackjack.domain.player; + +import blackjack.domain.card.Card; public class Dealer extends Player { public static final String NAME = "딜러"; diff --git a/src/main/java/blackjack/domain/Hand.java b/src/main/java/blackjack/domain/player/Hand.java similarity index 86% rename from src/main/java/blackjack/domain/Hand.java rename to src/main/java/blackjack/domain/player/Hand.java index b948356dde8..f1731309acf 100644 --- a/src/main/java/blackjack/domain/Hand.java +++ b/src/main/java/blackjack/domain/player/Hand.java @@ -1,4 +1,6 @@ -package blackjack.domain; +package blackjack.domain.player; + +import blackjack.domain.card.Card; import java.util.ArrayList; import java.util.Collections; diff --git a/src/main/java/blackjack/domain/Name.java b/src/main/java/blackjack/domain/player/Name.java similarity index 95% rename from src/main/java/blackjack/domain/Name.java rename to src/main/java/blackjack/domain/player/Name.java index 7c0fd077005..e0ac8a7555d 100644 --- a/src/main/java/blackjack/domain/Name.java +++ b/src/main/java/blackjack/domain/player/Name.java @@ -1,4 +1,4 @@ -package blackjack.domain; +package blackjack.domain.player; public class Name { private static final int MINIMUM_LENGTH = 1; diff --git a/src/main/java/blackjack/domain/Player.java b/src/main/java/blackjack/domain/player/Player.java similarity index 90% rename from src/main/java/blackjack/domain/Player.java rename to src/main/java/blackjack/domain/player/Player.java index a951224b077..0da4a25cb69 100644 --- a/src/main/java/blackjack/domain/Player.java +++ b/src/main/java/blackjack/domain/player/Player.java @@ -1,4 +1,6 @@ -package blackjack.domain; +package blackjack.domain.player; + +import blackjack.domain.card.Card; import java.util.List; diff --git a/src/main/java/blackjack/view/OutputView.java b/src/main/java/blackjack/view/OutputView.java index 29f9bf78d79..6af5ea5e5b8 100644 --- a/src/main/java/blackjack/view/OutputView.java +++ b/src/main/java/blackjack/view/OutputView.java @@ -1,14 +1,14 @@ package blackjack.view; -import blackjack.domain.Card; -import blackjack.domain.CardGameResult; -import blackjack.domain.Dealer; -import blackjack.domain.Player; +import blackjack.domain.card.Card; +import blackjack.domain.cardgame.CardGameResult; +import blackjack.domain.player.Dealer; +import blackjack.domain.player.Player; import java.util.List; import java.util.stream.Collectors; -import static blackjack.domain.WinningStatus.*; +import static blackjack.domain.cardgame.WinningStatus.*; public class OutputView { public static void printInitialHandOfEachPlayer(final Dealer dealer, final List players) { diff --git a/src/test/java/blackjack/domain/CardDeckTest.java b/src/test/java/blackjack/domain/cardgame/CardDeckTest.java similarity index 73% rename from src/test/java/blackjack/domain/CardDeckTest.java rename to src/test/java/blackjack/domain/cardgame/CardDeckTest.java index 62e28a3942c..f6909eb27a9 100644 --- a/src/test/java/blackjack/domain/CardDeckTest.java +++ b/src/test/java/blackjack/domain/cardgame/CardDeckTest.java @@ -1,5 +1,7 @@ -package blackjack.domain; +package blackjack.domain.cardgame; +import blackjack.domain.card.Card; +import blackjack.domain.cardgame.CardDeck; import org.junit.jupiter.api.Test; import static org.assertj.core.api.Assertions.assertThat; diff --git a/src/test/java/blackjack/domain/CardGameJudgeTest.java b/src/test/java/blackjack/domain/cardgame/CardGameJudgeTest.java similarity index 83% rename from src/test/java/blackjack/domain/CardGameJudgeTest.java rename to src/test/java/blackjack/domain/cardgame/CardGameJudgeTest.java index 21df534a31a..56280f5e874 100644 --- a/src/test/java/blackjack/domain/CardGameJudgeTest.java +++ b/src/test/java/blackjack/domain/cardgame/CardGameJudgeTest.java @@ -1,17 +1,22 @@ -package blackjack.domain; +package blackjack.domain.cardgame; +import blackjack.domain.card.Card; +import blackjack.domain.cardgame.CardGameJudge; +import blackjack.domain.cardgame.WinningStatus; +import blackjack.domain.player.Dealer; +import blackjack.domain.player.Player; import org.junit.jupiter.api.Test; import java.util.List; -import static blackjack.domain.CardNumber.ACE; -import static blackjack.domain.CardNumber.KING; -import static blackjack.domain.CardNumber.QUEEN; -import static blackjack.domain.CardNumber.TWO; -import static blackjack.domain.CardShape.CLOVER; -import static blackjack.domain.CardShape.DIAMOND; -import static blackjack.domain.CardShape.HEART; -import static blackjack.domain.CardShape.SPADE; +import static blackjack.domain.card.CardNumber.ACE; +import static blackjack.domain.card.CardNumber.KING; +import static blackjack.domain.card.CardNumber.QUEEN; +import static blackjack.domain.card.CardNumber.TWO; +import static blackjack.domain.card.CardShape.CLOVER; +import static blackjack.domain.card.CardShape.DIAMOND; +import static blackjack.domain.card.CardShape.HEART; +import static blackjack.domain.card.CardShape.SPADE; import static blackjack.fixture.PlayerFixture.dealer; import static blackjack.fixture.PlayerFixture.player; import static org.assertj.core.api.Assertions.assertThat; diff --git a/src/test/java/blackjack/domain/CardGameResultTest.java b/src/test/java/blackjack/domain/cardgame/CardGameResultTest.java similarity index 73% rename from src/test/java/blackjack/domain/CardGameResultTest.java rename to src/test/java/blackjack/domain/cardgame/CardGameResultTest.java index 349d60615d6..6d6918af764 100644 --- a/src/test/java/blackjack/domain/CardGameResultTest.java +++ b/src/test/java/blackjack/domain/cardgame/CardGameResultTest.java @@ -1,13 +1,16 @@ -package blackjack.domain; +package blackjack.domain.cardgame; +import blackjack.domain.cardgame.CardGameResult; +import blackjack.domain.cardgame.WinningStatus; +import blackjack.domain.player.Player; import org.assertj.core.api.Assertions; import org.junit.jupiter.api.Test; import java.util.LinkedHashMap; import java.util.Map; -import static blackjack.domain.WinningStatus.LOSE; -import static blackjack.domain.WinningStatus.WIN; +import static blackjack.domain.cardgame.WinningStatus.LOSE; +import static blackjack.domain.cardgame.WinningStatus.WIN; import static blackjack.fixture.PlayerFixture.player; class CardGameResultTest { diff --git a/src/test/java/blackjack/domain/CardGameTest.java b/src/test/java/blackjack/domain/cardgame/CardGameTest.java similarity index 88% rename from src/test/java/blackjack/domain/CardGameTest.java rename to src/test/java/blackjack/domain/cardgame/CardGameTest.java index 8a3da0ee476..34aef29286e 100644 --- a/src/test/java/blackjack/domain/CardGameTest.java +++ b/src/test/java/blackjack/domain/cardgame/CardGameTest.java @@ -1,11 +1,11 @@ -package blackjack.domain; +package blackjack.domain.cardgame; +import blackjack.domain.cardgame.CardGame; +import blackjack.domain.player.Player; import org.junit.jupiter.api.Test; import java.util.List; -import static blackjack.domain.CardNumber.ACE; -import static blackjack.domain.CardShape.SPADE; import static blackjack.fixture.PlayerFixture.player; import static org.assertj.core.api.Assertions.assertThat; import static org.assertj.core.api.SoftAssertions.assertSoftly; diff --git a/src/test/java/blackjack/domain/HandTest.java b/src/test/java/blackjack/domain/player/HandTest.java similarity index 57% rename from src/test/java/blackjack/domain/HandTest.java rename to src/test/java/blackjack/domain/player/HandTest.java index 668b247cd54..5bc92eb6d86 100644 --- a/src/test/java/blackjack/domain/HandTest.java +++ b/src/test/java/blackjack/domain/player/HandTest.java @@ -1,11 +1,13 @@ -package blackjack.domain; +package blackjack.domain.player; +import blackjack.domain.card.Card; +import blackjack.domain.player.Hand; import org.junit.jupiter.api.Test; -import static blackjack.domain.CardNumber.JACK; -import static blackjack.domain.CardNumber.KING; -import static blackjack.domain.CardNumber.QUEEN; -import static blackjack.domain.CardShape.SPADE; +import static blackjack.domain.card.CardNumber.JACK; +import static blackjack.domain.card.CardNumber.KING; +import static blackjack.domain.card.CardNumber.QUEEN; +import static blackjack.domain.card.CardShape.SPADE; import static org.assertj.core.api.Assertions.assertThat; public class HandTest { diff --git a/src/test/java/blackjack/domain/NameTest.java b/src/test/java/blackjack/domain/player/NameTest.java similarity index 86% rename from src/test/java/blackjack/domain/NameTest.java rename to src/test/java/blackjack/domain/player/NameTest.java index 2e5f1fee52a..04d57f3b476 100644 --- a/src/test/java/blackjack/domain/NameTest.java +++ b/src/test/java/blackjack/domain/player/NameTest.java @@ -1,5 +1,6 @@ -package blackjack.domain; +package blackjack.domain.player; +import blackjack.domain.player.Name; import org.assertj.core.api.Assertions; import org.junit.jupiter.params.ParameterizedTest; import org.junit.jupiter.params.provider.ValueSource; diff --git a/src/test/java/blackjack/domain/PlayerTest.java b/src/test/java/blackjack/domain/player/PlayerTest.java similarity index 60% rename from src/test/java/blackjack/domain/PlayerTest.java rename to src/test/java/blackjack/domain/player/PlayerTest.java index 6d47d05d683..de1071347e2 100644 --- a/src/test/java/blackjack/domain/PlayerTest.java +++ b/src/test/java/blackjack/domain/player/PlayerTest.java @@ -1,11 +1,13 @@ -package blackjack.domain; +package blackjack.domain.player; +import blackjack.domain.card.Card; +import blackjack.domain.player.Player; import org.junit.jupiter.api.Test; -import static blackjack.domain.CardNumber.KING; -import static blackjack.domain.CardShape.CLOVER; -import static blackjack.domain.CardShape.HEART; -import static blackjack.domain.CardShape.SPADE; +import static blackjack.domain.card.CardNumber.KING; +import static blackjack.domain.card.CardShape.CLOVER; +import static blackjack.domain.card.CardShape.HEART; +import static blackjack.domain.card.CardShape.SPADE; import static blackjack.fixture.PlayerFixture.player; import static org.assertj.core.api.Assertions.assertThat; diff --git a/src/test/java/blackjack/fixture/PlayerFixture.java b/src/test/java/blackjack/fixture/PlayerFixture.java index 95a3c228985..a5b541e8ee7 100644 --- a/src/test/java/blackjack/fixture/PlayerFixture.java +++ b/src/test/java/blackjack/fixture/PlayerFixture.java @@ -1,8 +1,8 @@ package blackjack.fixture; -import blackjack.domain.Card; -import blackjack.domain.Dealer; -import blackjack.domain.Player; +import blackjack.domain.card.Card; +import blackjack.domain.player.Dealer; +import blackjack.domain.player.Player; public class PlayerFixture { public static Player player(Card... cards) { From 09725609ee2ca7c4ce94c9ca31bc28ec5ad60c01 Mon Sep 17 00:00:00 2001 From: 3juhwan <13selfesteem91@naver.com> Date: Fri, 8 Mar 2024 16:09:42 +0900 Subject: [PATCH 31/56] =?UTF-8?q?refactor:=20view,=20controller=20?= =?UTF-8?q?=EB=A6=AC=ED=8C=A9=ED=84=B0=EB=A7=81?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Co-authored-by: MangCho <13selfesteem91@naver.com> Co-authored-by: J-I-H-O --- .../java/blackjack/BlackjackController.java | 30 ++++----- .../blackjack/domain/cardgame/CardDeck.java | 4 +- .../blackjack/domain/cardgame/CardGame.java | 4 +- .../domain/cardgame/CardGameJudge.java | 7 +-- .../java/blackjack/domain/player/Dealer.java | 4 +- .../java/blackjack/domain/player/Player.java | 11 ++-- src/main/java/blackjack/view/InputView.java | 31 ++++------ src/main/java/blackjack/view/OutputView.java | 62 ++++++++++++------- .../java/blackjack/view/PlayerChoice.java | 28 +++++++++ .../domain/cardgame/CardGameTest.java | 9 ++- .../blackjack/domain/player/PlayerTest.java | 5 +- 11 files changed, 115 insertions(+), 80 deletions(-) create mode 100644 src/main/java/blackjack/view/PlayerChoice.java diff --git a/src/main/java/blackjack/BlackjackController.java b/src/main/java/blackjack/BlackjackController.java index 4c06fdbf4c2..d4bed2ae664 100644 --- a/src/main/java/blackjack/BlackjackController.java +++ b/src/main/java/blackjack/BlackjackController.java @@ -13,33 +13,29 @@ public class BlackjackController { public static void main(String[] args) { final CardGame cardGame = new CardGame(); - final List names = InputView.readPlayerNames(); + final List names = InputView.askPlayerNames(); + final Dealer dealer = new Dealer(); final List players = names.stream() .map(Player::new) .toList(); - final Dealer dealer = new Dealer(); cardGame.initializeHand(dealer, players); OutputView.printInitialHandOfEachPlayer(dealer, players); - givePlayerMoreCardsIfWanted(cardGame, players); + for (final Player player : players) { + givePlayerMoreCardsIfWanted(cardGame, player); + } giveDealerMoreCardsIfNeeded(cardGame, dealer); printHandStatusOfEachPlayer(dealer, players); printCardGameResult(dealer, players); } - private static void givePlayerMoreCardsIfWanted(final CardGame cardGame, final List players) { - for (Player player : players) { - while (!player.isDead()) { - // TODO: 변수명 수정 - boolean needAnotherCard = InputView.askForAnotherCard(player.getName()); - if (!needAnotherCard) { - break; - } - cardGame.giveCard(player); - OutputView.printPlayerCard(player); - } + private static void givePlayerMoreCardsIfWanted(final CardGame cardGame, final Player player) { + final String playerName = player.getName(); + while (player.isAlive() && InputView.askForMoreCard(playerName)) { + cardGame.giveCard(player); + OutputView.printPlayerCard(player); } } @@ -51,9 +47,9 @@ private static void giveDealerMoreCardsIfNeeded(final CardGame cardGame, final D } private static void printHandStatusOfEachPlayer(final Dealer dealer, final List players) { - OutputView.printHandSum(dealer); - for (Player player : players) { - OutputView.printHandSum(player); + OutputView.printPlayerCardWithScore(dealer); + for (final Player player : players) { + OutputView.printPlayerCardWithScore(player); } } diff --git a/src/main/java/blackjack/domain/cardgame/CardDeck.java b/src/main/java/blackjack/domain/cardgame/CardDeck.java index b91de784d52..2173b486682 100644 --- a/src/main/java/blackjack/domain/cardgame/CardDeck.java +++ b/src/main/java/blackjack/domain/cardgame/CardDeck.java @@ -13,8 +13,8 @@ public class CardDeck { public CardDeck() { final Stack deck = new Stack<>(); // TODO: 2중 for문 제거 - for (CardNumber cardNumber : CardNumber.values()) { - for (CardShape cardShape : CardShape.values()) { + for (final CardNumber cardNumber : CardNumber.values()) { + for (final CardShape cardShape : CardShape.values()) { deck.push(new Card(cardNumber, cardShape)); } } diff --git a/src/main/java/blackjack/domain/cardgame/CardGame.java b/src/main/java/blackjack/domain/cardgame/CardGame.java index 095fd57f23a..36d6beb386c 100644 --- a/src/main/java/blackjack/domain/cardgame/CardGame.java +++ b/src/main/java/blackjack/domain/cardgame/CardGame.java @@ -23,8 +23,8 @@ public void initializeHand(final Dealer dealer, final List players) { } // TODO: 이름 수정 - public void giveTwoCardsEachPlayer(final List players) { - for (Player player : players) { + private void giveTwoCardsEachPlayer(final List players) { + for (final Player player : players) { giveCard(player); giveCard(player); } diff --git a/src/main/java/blackjack/domain/cardgame/CardGameJudge.java b/src/main/java/blackjack/domain/cardgame/CardGameJudge.java index 2a492463e96..dd21390f3f1 100644 --- a/src/main/java/blackjack/domain/cardgame/CardGameJudge.java +++ b/src/main/java/blackjack/domain/cardgame/CardGameJudge.java @@ -7,8 +7,7 @@ import java.util.Map; public class CardGameJudge { - - public static final int BUST_CONDITION = 21; + public static final int BUST_THRESHOLD = 21; public CardGameResult judge(final Player dealer, final List players) { Map result = new LinkedHashMap<>(); @@ -32,10 +31,10 @@ private WinningStatus judge(final Player dealer, final Player player) { // TODO: 이름 바꾸기 // TODO: 정리 private WinningStatus doesPlayerWin(final int dealerScore, final int playerScore) { - if (playerScore > BUST_CONDITION) { + if (playerScore > BUST_THRESHOLD) { return WinningStatus.LOSE; } - if (dealerScore > BUST_CONDITION) { + if (dealerScore > BUST_THRESHOLD) { return WinningStatus.WIN; } if (dealerScore == playerScore) { diff --git a/src/main/java/blackjack/domain/player/Dealer.java b/src/main/java/blackjack/domain/player/Dealer.java index 9dec85ae9d7..e4678e6b21a 100644 --- a/src/main/java/blackjack/domain/player/Dealer.java +++ b/src/main/java/blackjack/domain/player/Dealer.java @@ -3,8 +3,8 @@ import blackjack.domain.card.Card; public class Dealer extends Player { - public static final String NAME = "딜러"; - public static final int HIT_THRESHOLD = 16; + private static final String NAME = "딜러"; + private static final int HIT_THRESHOLD = 16; // TODO: 16이라는 조건을 어디서 관리해야 하는가| public Dealer() { super(NAME); diff --git a/src/main/java/blackjack/domain/player/Player.java b/src/main/java/blackjack/domain/player/Player.java index 0da4a25cb69..7bf6d2516b4 100644 --- a/src/main/java/blackjack/domain/player/Player.java +++ b/src/main/java/blackjack/domain/player/Player.java @@ -5,6 +5,8 @@ import java.util.List; public class Player { + private static final int BUST_THRESHOLD = 21; + protected final Hand hand; private final Name name; @@ -17,15 +19,14 @@ public void addCard(final Card card) { hand.add(card); } - public List getCards() { - return hand.getAllCards(); + public boolean isAlive() { + return hand.getSum() <= BUST_THRESHOLD; } - public boolean isDead() { - return hand.getSum() > 21; + public List getCards() { + return hand.getAllCards(); } - // TODO : 꼭 필요한 메서드일까? public int getScore() { return hand.getSum(); } diff --git a/src/main/java/blackjack/view/InputView.java b/src/main/java/blackjack/view/InputView.java index e67371926cc..694b723beac 100644 --- a/src/main/java/blackjack/view/InputView.java +++ b/src/main/java/blackjack/view/InputView.java @@ -3,34 +3,21 @@ import java.util.List; import java.util.Scanner; +import static blackjack.view.PlayerChoice.*; + public class InputView { - // TODO: 상수명 변경 private static final Scanner scanner = new Scanner(System.in); - private static final String YES = "y"; - private static final String NO = "n"; - public static List readPlayerNames() { + public static List askPlayerNames() { printPlayerNamesInputMessage(); String rawInput = scanner.nextLine(); return List.of(rawInput.split(",", -1)); } - // TODO: 메서드명 변경 - public static boolean askForAnotherCard(final String name) { + public static boolean askForMoreCard(final String name) { printAskingForAnotherCardMessage(name); final String rawInput = scanner.nextLine(); - validateYesOrNo(rawInput); - return YES.equals(rawInput); - } - - // TODO: 메서드명 변경 - private static void validateYesOrNo(final String input) { - if (YES.equals(input) || NO.equals(input)) { - return; - } - - final String errorMessage = String.format("%s 또는 %s 만 입력할 수 있습니다.", YES, NO); - throw new IllegalArgumentException(errorMessage); + return PlayerChoice.isDrawable(rawInput); } private static void printPlayerNamesInputMessage() { @@ -38,6 +25,12 @@ private static void printPlayerNamesInputMessage() { } private static void printAskingForAnotherCardMessage(final String name) { - System.out.println(name + "는 한장의 카드를 더 받겠습니까?(예는 y, 아니오는 n)"); + printLineSeparator(); + System.out.println(name + "는 한장의 카드를 더 받겠습니까?(예는 " + HIT.getMessage() + + ", 아니오는 " + STAND.getMessage() + ")"); + } + + private static void printLineSeparator() { + System.out.println(); } } diff --git a/src/main/java/blackjack/view/OutputView.java b/src/main/java/blackjack/view/OutputView.java index 6af5ea5e5b8..04522bb4221 100644 --- a/src/main/java/blackjack/view/OutputView.java +++ b/src/main/java/blackjack/view/OutputView.java @@ -8,7 +8,8 @@ import java.util.List; import java.util.stream.Collectors; -import static blackjack.domain.cardgame.WinningStatus.*; +import static blackjack.domain.cardgame.WinningStatus.LOSE; +import static blackjack.domain.cardgame.WinningStatus.WIN; public class OutputView { public static void printInitialHandOfEachPlayer(final Dealer dealer, final List players) { @@ -22,52 +23,67 @@ private static void printInitialDistributionMessage(final Dealer dealer, final L .map(Player::getName) .collect(Collectors.joining(", ")); + printLineSeparator(); final String initialDistributionMessage = String.format("%s와 %s에게 2장을 나누었습니다.", dealer.getName(), names); System.out.println(initialDistributionMessage); } private static void printDealerCard(final Dealer dealer) { final Card card = dealer.getFirstCard(); - - System.out.println(dealer.getName() + ": " + card.getNumber() + card.getShape()); + System.out.println(dealer.getName() + ": " + getCardInfo(card)); } public static void printPlayerCard(final Player player) { - // TODO: 문자열 분리 (상수 or 메서드) - String cardInfo = player.getName() + "카드: " + player.getCards() - .stream() - // TODO: 이름 합치는 책임을 어디로 할 것인가 (도메인 vs 뷰) - .map(card -> card.getNumber() + card.getShape()) - .collect(Collectors.joining(", ")); - System.out.println(cardInfo); + String playerCardInfo = getPlayerCardInfo(player); + System.out.println(playerCardInfo); } // TODO: Dealer 타입이 아닌 Name을 받도록 수정 + // TODO: 16이라는 조건을 어디서 관리해야 하는가 public static void printDealerHitMessage(final Dealer dealer) { final String dealerHitMessage = String.format("%s는 16이하라 한장의 카드를 더 받았습니다.", dealer.getName()); System.out.println(dealerHitMessage); + printLineSeparator(); } - - // 보유한 모든 카드의 합을 출력한다. - // TODO: 중복 제거 - public static void printHandSum(final Player player) { - // TODO: 문자열 분리 (상수 or 메서드) - String cardInfo = player.getName() + "카드: " + player.getCards() - .stream() - // TODO: 이름 합치는 책임을 어디로 할 것인가 (도메인 vs 뷰) - .map(card -> card.getNumber() + card.getShape()) - .collect(Collectors.joining(", ")); - System.out.println(cardInfo + " - 결과: " + player.getScore()); + public static void printPlayerCardWithScore(final Player player) { + String playerCardInfo = getPlayerCardInfo(player); + System.out.println(playerCardInfo + " - 결과: " + player.getScore()); } public static void printResult(final CardGameResult cardGameResult) { + printResultOfDealer(cardGameResult); + printResultOfEachPlayer(cardGameResult); + } + + private static void printResultOfDealer(final CardGameResult cardGameResult) { + printLineSeparator(); System.out.println("## 최종 승패"); - // TODO: 무승부 처리 추가 - System.out.println("딜러: " + cardGameResult.getDealerWinCount() + WIN.getValue() + " " + cardGameResult.getDealerLoseCount() + LOSE.getValue()); + System.out.println("딜러: " + + cardGameResult.getDealerWinCount() + WIN.getValue() + " " + + cardGameResult.getDealerLoseCount() + LOSE.getValue()); + } + + private static void printResultOfEachPlayer(final CardGameResult cardGameResult) { cardGameResult.getTotalResult() .entrySet() .stream() .map(result -> result.getKey().getName() + ": " + result.getValue().getValue()) .forEach(System.out::println); } + + private static String getPlayerCardInfo(final Player player) { + return player.getName() + "카드: " + + player.getCards() + .stream() + .map(OutputView::getCardInfo) + .collect(Collectors.joining(", ")); + } + + private static String getCardInfo(final Card card) { + return card.getNumber() + card.getShape(); + } + + private static void printLineSeparator() { + System.out.println(); + } } diff --git a/src/main/java/blackjack/view/PlayerChoice.java b/src/main/java/blackjack/view/PlayerChoice.java new file mode 100644 index 00000000000..cab73a8229c --- /dev/null +++ b/src/main/java/blackjack/view/PlayerChoice.java @@ -0,0 +1,28 @@ +package blackjack.view; + +public enum PlayerChoice { + HIT("y"), + STAND("n"); + + private final String message; + + PlayerChoice(final String message) { + this.message = message; + } + + static boolean isDrawable(final String choice) { + if (HIT.message.equals(choice)) { + return true; + } + if (STAND.message.equals(choice)) { + return false; + } + + final String errorMessage = String.format("%s 또는 %s 만 입력할 수 있습니다.", HIT.message, STAND.message); + throw new IllegalArgumentException(errorMessage); + } + + public String getMessage() { + return message; + } +} diff --git a/src/test/java/blackjack/domain/cardgame/CardGameTest.java b/src/test/java/blackjack/domain/cardgame/CardGameTest.java index 34aef29286e..800c0fe7e8f 100644 --- a/src/test/java/blackjack/domain/cardgame/CardGameTest.java +++ b/src/test/java/blackjack/domain/cardgame/CardGameTest.java @@ -1,11 +1,12 @@ package blackjack.domain.cardgame; -import blackjack.domain.cardgame.CardGame; +import blackjack.domain.player.Dealer; import blackjack.domain.player.Player; import org.junit.jupiter.api.Test; import java.util.List; +import static blackjack.fixture.PlayerFixture.dealer; import static blackjack.fixture.PlayerFixture.player; import static org.assertj.core.api.Assertions.assertThat; import static org.assertj.core.api.SoftAssertions.assertSoftly; @@ -22,14 +23,16 @@ public class CardGameTest { } @Test - void 모든_플레이어에게_카드_2장을_지급한다() { + void 딜러와_모든_플레이어에게_카드_2장을_지급한다() { + Dealer dealer = dealer(); Player mangcho = player(); Player ddang = player(); CardGame cardGame = new CardGame(); - cardGame.giveTwoCardsEachPlayer(List.of(mangcho, ddang)); + cardGame.initializeHand(dealer, List.of(mangcho, ddang)); assertSoftly(softly -> { + softly.assertThat(dealer.getCards().size()).isEqualTo(2); softly.assertThat(mangcho.getCards().size()).isEqualTo(2); softly.assertThat(ddang.getCards().size()).isEqualTo(2); }); diff --git a/src/test/java/blackjack/domain/player/PlayerTest.java b/src/test/java/blackjack/domain/player/PlayerTest.java index de1071347e2..166025abcbc 100644 --- a/src/test/java/blackjack/domain/player/PlayerTest.java +++ b/src/test/java/blackjack/domain/player/PlayerTest.java @@ -1,7 +1,6 @@ package blackjack.domain.player; import blackjack.domain.card.Card; -import blackjack.domain.player.Player; import org.junit.jupiter.api.Test; import static blackjack.domain.card.CardNumber.KING; @@ -20,8 +19,8 @@ public class PlayerTest { new Card(KING, SPADE), new Card(KING, HEART)); - boolean isDead = player.isDead(); + boolean isAlive = player.isAlive(); - assertThat(isDead).isTrue(); + assertThat(isAlive).isFalse(); } } From ac428c6a4cf644bf8d720aa49bdef823cca4c22c Mon Sep 17 00:00:00 2001 From: 3juhwan <13selfesteem91@naver.com> Date: Fri, 8 Mar 2024 16:59:36 +0900 Subject: [PATCH 32/56] =?UTF-8?q?refactor:=20=EB=8F=84=EB=A9=94=EC=9D=B8?= =?UTF-8?q?=20=EB=A1=9C=EC=A7=81=20=EB=A6=AC=ED=8C=A9=ED=84=B0=EB=A7=81?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Co-authored-by: MangCho <13selfesteem91@naver.com> Co-authored-by: J-I-H-O --- src/main/java/blackjack/domain/card/Card.java | 4 ++++ src/main/java/blackjack/domain/cardgame/CardDeck.java | 2 +- src/main/java/blackjack/domain/cardgame/CardGame.java | 1 - .../java/blackjack/domain/cardgame/CardGameJudge.java | 5 +---- .../java/blackjack/domain/cardgame/CardGameResult.java | 1 - .../java/blackjack/domain/cardgame/WinningStatus.java | 3 +-- src/main/java/blackjack/domain/player/Dealer.java | 2 +- src/main/java/blackjack/domain/player/Player.java | 8 ++++---- src/main/java/blackjack/view/OutputView.java | 2 -- 9 files changed, 12 insertions(+), 16 deletions(-) diff --git a/src/main/java/blackjack/domain/card/Card.java b/src/main/java/blackjack/domain/card/Card.java index a5a2d23c591..98249697e83 100644 --- a/src/main/java/blackjack/domain/card/Card.java +++ b/src/main/java/blackjack/domain/card/Card.java @@ -9,6 +9,10 @@ public Card(final CardNumber cardNumber, final CardShape cardShape) { this.cardShape = cardShape; } + public boolean isAceCard() { + return cardNumber == CardNumber.ACE; + } + public int getNumber() { return cardNumber.getValue(); } diff --git a/src/main/java/blackjack/domain/cardgame/CardDeck.java b/src/main/java/blackjack/domain/cardgame/CardDeck.java index 2173b486682..abc0f2a8fa5 100644 --- a/src/main/java/blackjack/domain/cardgame/CardDeck.java +++ b/src/main/java/blackjack/domain/cardgame/CardDeck.java @@ -12,7 +12,7 @@ public class CardDeck { public CardDeck() { final Stack deck = new Stack<>(); - // TODO: 2중 for문 제거 + for (final CardNumber cardNumber : CardNumber.values()) { for (final CardShape cardShape : CardShape.values()) { deck.push(new Card(cardNumber, cardShape)); diff --git a/src/main/java/blackjack/domain/cardgame/CardGame.java b/src/main/java/blackjack/domain/cardgame/CardGame.java index 36d6beb386c..7f884edf2fb 100644 --- a/src/main/java/blackjack/domain/cardgame/CardGame.java +++ b/src/main/java/blackjack/domain/cardgame/CardGame.java @@ -22,7 +22,6 @@ public void initializeHand(final Dealer dealer, final List players) { giveTwoCardsEachPlayer(players); } - // TODO: 이름 수정 private void giveTwoCardsEachPlayer(final List players) { for (final Player player : players) { giveCard(player); diff --git a/src/main/java/blackjack/domain/cardgame/CardGameJudge.java b/src/main/java/blackjack/domain/cardgame/CardGameJudge.java index dd21390f3f1..118424f288e 100644 --- a/src/main/java/blackjack/domain/cardgame/CardGameJudge.java +++ b/src/main/java/blackjack/domain/cardgame/CardGameJudge.java @@ -20,7 +20,6 @@ public CardGameResult judge(final Player dealer, final List players) { return new CardGameResult(result); } - // TODO : 판단의 책임을 dealer가 담당할 수 있지 않을까? private WinningStatus judge(final Player dealer, final Player player) { int dealerScore = dealer.getScore(); int playerScore = player.getScore(); @@ -28,8 +27,6 @@ private WinningStatus judge(final Player dealer, final Player player) { return doesPlayerWin(dealerScore, playerScore); } - // TODO: 이름 바꾸기 - // TODO: 정리 private WinningStatus doesPlayerWin(final int dealerScore, final int playerScore) { if (playerScore > BUST_THRESHOLD) { return WinningStatus.LOSE; @@ -38,7 +35,7 @@ private WinningStatus doesPlayerWin(final int dealerScore, final int playerScore return WinningStatus.WIN; } if (dealerScore == playerScore) { - return WinningStatus.PUSH; // TODO: 도메인 지식 없으면 이해하기 힘듦 + return WinningStatus.PUSH; } if (dealerScore < playerScore) { return WinningStatus.WIN; diff --git a/src/main/java/blackjack/domain/cardgame/CardGameResult.java b/src/main/java/blackjack/domain/cardgame/CardGameResult.java index 9dfe8a73fc6..b0f8756803e 100644 --- a/src/main/java/blackjack/domain/cardgame/CardGameResult.java +++ b/src/main/java/blackjack/domain/cardgame/CardGameResult.java @@ -19,7 +19,6 @@ public Map getTotalResult() { return Collections.unmodifiableMap(totalResult); } - // TODO: 어지러움 public int getDealerWinCount() { return (int) totalResult.values() .stream() diff --git a/src/main/java/blackjack/domain/cardgame/WinningStatus.java b/src/main/java/blackjack/domain/cardgame/WinningStatus.java index dbe131dde72..dce985c7e14 100644 --- a/src/main/java/blackjack/domain/cardgame/WinningStatus.java +++ b/src/main/java/blackjack/domain/cardgame/WinningStatus.java @@ -4,8 +4,7 @@ public enum WinningStatus { WIN("승"), PUSH("무"), LOSE("패"); - - // TODO: 이름 바꾸기 + private final String value; WinningStatus(final String value) { diff --git a/src/main/java/blackjack/domain/player/Dealer.java b/src/main/java/blackjack/domain/player/Dealer.java index e4678e6b21a..de370955dd4 100644 --- a/src/main/java/blackjack/domain/player/Dealer.java +++ b/src/main/java/blackjack/domain/player/Dealer.java @@ -4,7 +4,7 @@ public class Dealer extends Player { private static final String NAME = "딜러"; - private static final int HIT_THRESHOLD = 16; // TODO: 16이라는 조건을 어디서 관리해야 하는가| + private static final int HIT_THRESHOLD = 16; public Dealer() { super(NAME); diff --git a/src/main/java/blackjack/domain/player/Player.java b/src/main/java/blackjack/domain/player/Player.java index 7bf6d2516b4..f3415070f45 100644 --- a/src/main/java/blackjack/domain/player/Player.java +++ b/src/main/java/blackjack/domain/player/Player.java @@ -23,14 +23,14 @@ public boolean isAlive() { return hand.getSum() <= BUST_THRESHOLD; } - public List getCards() { - return hand.getAllCards(); - } - public int getScore() { return hand.getSum(); } + public List getCards() { + return hand.getAllCards(); + } + public String getName() { return name.getValue(); } diff --git a/src/main/java/blackjack/view/OutputView.java b/src/main/java/blackjack/view/OutputView.java index 04522bb4221..a3f664db025 100644 --- a/src/main/java/blackjack/view/OutputView.java +++ b/src/main/java/blackjack/view/OutputView.java @@ -38,8 +38,6 @@ public static void printPlayerCard(final Player player) { System.out.println(playerCardInfo); } - // TODO: Dealer 타입이 아닌 Name을 받도록 수정 - // TODO: 16이라는 조건을 어디서 관리해야 하는가 public static void printDealerHitMessage(final Dealer dealer) { final String dealerHitMessage = String.format("%s는 16이하라 한장의 카드를 더 받았습니다.", dealer.getName()); System.out.println(dealerHitMessage); From 8ba77c3e6395d14330e1da50e6038cc39541af2d Mon Sep 17 00:00:00 2001 From: 3juhwan <13selfesteem91@naver.com> Date: Fri, 8 Mar 2024 17:00:21 +0900 Subject: [PATCH 33/56] =?UTF-8?q?feat:=20=EC=97=90=EC=9D=B4=EC=8A=A4=20?= =?UTF-8?q?=EA=B4=80=EB=A0=A8=20=EC=B2=98=EB=A6=AC=20=EA=B8=B0=EB=8A=A5=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: MangCho <13selfesteem91@naver.com> Co-authored-by: J-I-H-O --- .../java/blackjack/domain/player/Hand.java | 18 +++++++++++++++++- 1 file changed, 17 insertions(+), 1 deletion(-) diff --git a/src/main/java/blackjack/domain/player/Hand.java b/src/main/java/blackjack/domain/player/Hand.java index f1731309acf..92e23feb2f8 100644 --- a/src/main/java/blackjack/domain/player/Hand.java +++ b/src/main/java/blackjack/domain/player/Hand.java @@ -9,10 +9,26 @@ public class Hand { private final List cards = new ArrayList<>(); + // TODO: 메서드 분리, 상수 분리 필요 public int getSum() { - return cards.stream() + int minimumSum = cards.stream() .mapToInt(Card::getNumber) .sum(); + + final int aceCount = getAceCount(); + for (int i = 0; i < aceCount; i++) { + if (minimumSum + 10 <= 21) { + minimumSum += 10; + } + } + + return minimumSum; + } + + private int getAceCount() { + return (int) cards.stream() + .filter(Card::isAceCard) + .count(); } public void add(final Card card) { From c29212d564f90489df902b43139a0a1fb42ff55d Mon Sep 17 00:00:00 2001 From: 3juhwan <13selfesteem91@naver.com> Date: Fri, 8 Mar 2024 17:18:58 +0900 Subject: [PATCH 34/56] =?UTF-8?q?docs:=20=EA=B5=AC=ED=98=84=ED=95=9C=20?= =?UTF-8?q?=EC=82=AC=ED=95=AD=20=EC=B2=B4=ED=81=AC?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Co-authored-by: MangCho <13selfesteem91@naver.com> Co-authored-by: J-I-H-O --- README.md | 54 +++++++++++++++++++++++++++--------------------------- 1 file changed, 27 insertions(+), 27 deletions(-) diff --git a/README.md b/README.md index 28d5e1291fa..dc5ba957975 100644 --- a/README.md +++ b/README.md @@ -7,7 +7,7 @@ ### 플레이어 -- [ ] 플레이어는 이름을 갖는다 +- [X] 플레이어는 이름을 갖는다 - [X] 플레이어는 카드들을 갖는다 - [X] 플레이어는 카드를 저장한다 - [X] 죽었는지 안 죽었는지 여부를 반환한다 (21을 초과하는지) @@ -15,53 +15,53 @@ ### 카드 -- [x] 문자와 모양을 상태로 갖는다 +- [X] 문자와 모양을 상태로 갖는다 ### Hand(카드들) -- [x] 여러개의 카드를 갖는다 -- [x] 카드의 총합 계산한다 -- [x] 카드 추가한다 +- [X] 여러개의 카드를 갖는다 +- [X] 카드의 총합 계산한다 +- [X] 카드 추가한다 ### 카드 게임 -- [x] 각 플레이어에게 카드를 2장씩 지급한다 -- [x] 플레이어마다 추가 지급한다 +- [X] 각 플레이어에게 카드를 2장씩 지급한다 +- [X] 플레이어마다 추가 지급한다 ### 덱 -- [x] 모든 카드를 1장씩 갖고 있다. -- [x] 랜덤으로 카드를 뽑는다. +- [X] 모든 카드를 1장씩 갖고 있다. +- [X] 랜덤으로 카드를 뽑는다. ### 게임 승패 결정 -- [ ] 딜러와 모든 플레이어의 승패 여부를 결정한다. - - [x] 딜러와 플레이어 둘다 21을 초과할 경우, 플레이어가 패배한다. - - [x] 카드 합계가 딜러는 21 이하, 플레이어는 21 초과인 경우, 플레이어가 패배한다. - - [x] 카드 합계가 딜러는 21 초과, 플레이어는 21 이하인 경우, 플레이어가 승리한다. - - [x] 카드 합계가 딜러와 플레이어 모두 21 이하인 경우, 숫자가 큰 사람이 승리한다. - - [x] 카드 합계가 딜러와 플레이어 모두 21 이하이고 동일한 경우, 무승부다. +- [X] 딜러와 모든 플레이어의 승패 여부를 결정한다. + - [X] 딜러와 플레이어 둘다 21을 초과할 경우, 플레이어가 패배한다. + - [X] 카드 합계가 딜러는 21 이하, 플레이어는 21 초과인 경우, 플레이어가 패배한다. + - [X] 카드 합계가 딜러는 21 초과, 플레이어는 21 이하인 경우, 플레이어가 승리한다. + - [X] 카드 합계가 딜러와 플레이어 모두 21 이하인 경우, 숫자가 큰 사람이 승리한다. + - [X] 카드 합계가 딜러와 플레이어 모두 21 이하이고 동일한 경우, 무승부다. ### 인풋 뷰 -- [x] 참가자의 이름을 입력받는다. - - [x] 이름은 쉼표 기준으로 분리한다. -- [x] 카드 추가 여부를 입력받는다. - - [x] y 또는 n이 아닌 경우, 예외를 발생한다. - - [ ] 사용자 카드 합이 21을 초과하면, 카드 추가 여부를 묻지 않는다. - - [ ] 플레이어가 n을 입력할 때까지 카드 추가 여부를 묻는다. +- [X] 참가자의 이름을 입력받는다. + - [X] 이름은 쉼표 기준으로 분리한다. +- [X] 카드 추가 여부를 입력받는다. + - [X] y 또는 n이 아닌 경우, 예외를 발생한다. + - [X] 사용자 카드 합이 21을 초과하면, 카드 추가 여부를 묻지 않는다. + - [X] 플레이어가 n을 입력할 때까지 카드 추가 여부를 묻는다. ### 아웃풋 뷰 -- [x] 딜러와 플레이어 전원에게 초기에 분배한 카드 출력한다. - - [x] 딜러의 카드는 1장만 공개한다. -- [x] 플레이어가 보유한 모든 카드를 출력한다. -- [x] 딜러가 추가 카드를 발급 받았는지 여부 출력한다. -- [x] 보유한 모든 카드의 합을 출력한다. -- [x] 최종 승패를 출력한다. +- [X] 딜러와 플레이어 전원에게 초기에 분배한 카드 출력한다. + - [X] 딜러의 카드는 1장만 공개한다. +- [X] 플레이어가 보유한 모든 카드를 출력한다. +- [X] 딜러가 추가 카드를 발급 받았는지 여부 출력한다. +- [X] 보유한 모든 카드의 합을 출력한다. +- [X] 최종 승패를 출력한다. From c5555e58919ee5e45d450219a864ebed684f06e4 Mon Sep 17 00:00:00 2001 From: 3juhwan <13selfesteem91@naver.com> Date: Sat, 9 Mar 2024 14:34:07 +0900 Subject: [PATCH 35/56] =?UTF-8?q?chore:=20=EC=9E=98=EB=AA=BB=EB=90=9C=20?= =?UTF-8?q?=EB=B3=80=EC=88=98=EB=AA=85=20=EC=88=98=EC=A0=95?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- src/main/java/blackjack/domain/cardgame/CardGameResult.java | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/main/java/blackjack/domain/cardgame/CardGameResult.java b/src/main/java/blackjack/domain/cardgame/CardGameResult.java index b0f8756803e..558c8c6b21b 100644 --- a/src/main/java/blackjack/domain/cardgame/CardGameResult.java +++ b/src/main/java/blackjack/domain/cardgame/CardGameResult.java @@ -22,7 +22,7 @@ public Map getTotalResult() { public int getDealerWinCount() { return (int) totalResult.values() .stream() - .filter(playerWinningstatus -> playerWinningstatus.equals(LOSE)) + .filter(playerWinningStatus -> playerWinningStatus.equals(LOSE)) .count(); } From a0e22417014e8aea646ec885560fc87eddfbae3b Mon Sep 17 00:00:00 2001 From: 3juhwan <13selfesteem91@naver.com> Date: Mon, 11 Mar 2024 10:56:42 +0900 Subject: [PATCH 36/56] =?UTF-8?q?fix:=20=EC=B9=B4=EB=93=9C=20=EA=B3=84?= =?UTF-8?q?=EC=82=B0=20=EB=A1=9C=EC=A7=81=20=EB=B3=80=EA=B2=BD=EC=9C=BC?= =?UTF-8?q?=EB=A1=9C=20=ED=85=8C=EC=8A=A4=ED=8A=B8=20=EA=B2=B0=EA=B3=BC=20?= =?UTF-8?q?=EC=88=98=EC=A0=95?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../java/blackjack/domain/card/CardTest.java | 26 +++++++++++++++++++ .../domain/cardgame/CardGameJudgeTest.java | 4 +-- 2 files changed, 27 insertions(+), 3 deletions(-) create mode 100644 src/test/java/blackjack/domain/card/CardTest.java diff --git a/src/test/java/blackjack/domain/card/CardTest.java b/src/test/java/blackjack/domain/card/CardTest.java new file mode 100644 index 00000000000..a788e638056 --- /dev/null +++ b/src/test/java/blackjack/domain/card/CardTest.java @@ -0,0 +1,26 @@ +package blackjack.domain.card; + +import org.junit.jupiter.api.Test; + +import static blackjack.domain.card.CardNumber.ACE; +import static blackjack.domain.card.CardNumber.TWO; +import static blackjack.domain.card.CardShape.HEART; +import static org.assertj.core.api.Assertions.assertThat; + +public class CardTest { + + @Test + void 에이스_카드인지_확인한다() { + Card aceCard = new Card(ACE, HEART); + + assertThat(aceCard.isAceCard()).isTrue(); + } + + @Test + void 에이스_카드가_아닌지_확인한다() { + Card notAceCard = new Card(TWO, HEART); + + assertThat(notAceCard.isAceCard()).isFalse(); + } + +} diff --git a/src/test/java/blackjack/domain/cardgame/CardGameJudgeTest.java b/src/test/java/blackjack/domain/cardgame/CardGameJudgeTest.java index 56280f5e874..d60048fc4f6 100644 --- a/src/test/java/blackjack/domain/cardgame/CardGameJudgeTest.java +++ b/src/test/java/blackjack/domain/cardgame/CardGameJudgeTest.java @@ -1,8 +1,6 @@ package blackjack.domain.cardgame; import blackjack.domain.card.Card; -import blackjack.domain.cardgame.CardGameJudge; -import blackjack.domain.cardgame.WinningStatus; import blackjack.domain.player.Dealer; import blackjack.domain.player.Player; import org.junit.jupiter.api.Test; @@ -99,7 +97,7 @@ public class CardGameJudgeTest { var result = cardGameJudge.judge(dealer, List.of(player)) .getTotalResult(); - assertThat(result.get(player)).isEqualTo(WinningStatus.LOSE); + assertThat(result.get(player)).isEqualTo(WinningStatus.WIN); } @Test From c62821abe869176a48ed869691e253c8e4e90721 Mon Sep 17 00:00:00 2001 From: 3juhwan <13selfesteem91@naver.com> Date: Mon, 11 Mar 2024 14:41:29 +0900 Subject: [PATCH 37/56] =?UTF-8?q?refactor:=20Deck=20=EB=A6=AC=ED=8C=A9?= =?UTF-8?q?=ED=84=B0=EB=A7=81?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit - 정적 팩토리 메서드 추가 - 접근 제어자를 적절하게 수정 --- .../blackjack/domain/cardgame/CardDeck.java | 17 +++++++++++------ .../blackjack/domain/cardgame/CardGame.java | 2 +- .../blackjack/domain/cardgame/CardDeckTest.java | 3 +-- 3 files changed, 13 insertions(+), 9 deletions(-) diff --git a/src/main/java/blackjack/domain/cardgame/CardDeck.java b/src/main/java/blackjack/domain/cardgame/CardDeck.java index abc0f2a8fa5..bbeeaa29d91 100644 --- a/src/main/java/blackjack/domain/cardgame/CardDeck.java +++ b/src/main/java/blackjack/domain/cardgame/CardDeck.java @@ -10,21 +10,26 @@ public class CardDeck { private final Stack deck; - public CardDeck() { - final Stack deck = new Stack<>(); + private CardDeck(Stack deck) { + this.deck = deck; + } + static CardDeck create() { + final Stack deck = new Stack<>(); for (final CardNumber cardNumber : CardNumber.values()) { for (final CardShape cardShape : CardShape.values()) { deck.push(new Card(cardNumber, cardShape)); } } - Collections.shuffle(deck); - - this.deck = deck; + return new CardDeck(deck); } - public Card draw() { + Card draw() { + if (deck.empty()) { + throw new IllegalArgumentException("카드가 존재하지 않습니다."); + } + return deck.pop(); } } diff --git a/src/main/java/blackjack/domain/cardgame/CardGame.java b/src/main/java/blackjack/domain/cardgame/CardGame.java index 7f884edf2fb..ac4bb76faab 100644 --- a/src/main/java/blackjack/domain/cardgame/CardGame.java +++ b/src/main/java/blackjack/domain/cardgame/CardGame.java @@ -9,7 +9,7 @@ public class CardGame { private final CardDeck cardDeck; public CardGame() { - this.cardDeck = new CardDeck(); + this.cardDeck = CardDeck.create(); } public void giveCard(final Player player) { diff --git a/src/test/java/blackjack/domain/cardgame/CardDeckTest.java b/src/test/java/blackjack/domain/cardgame/CardDeckTest.java index f6909eb27a9..c6113552ecf 100644 --- a/src/test/java/blackjack/domain/cardgame/CardDeckTest.java +++ b/src/test/java/blackjack/domain/cardgame/CardDeckTest.java @@ -1,7 +1,6 @@ package blackjack.domain.cardgame; import blackjack.domain.card.Card; -import blackjack.domain.cardgame.CardDeck; import org.junit.jupiter.api.Test; import static org.assertj.core.api.Assertions.assertThat; @@ -10,7 +9,7 @@ public class CardDeckTest { @Test void 덱에서_카드를_뽑을_수_있다() { - CardDeck deck = new CardDeck(); + CardDeck deck = CardDeck.create(); Card card = deck.draw(); From 78e94fd90e73099359ebeafd44dccc4c1ba834ad Mon Sep 17 00:00:00 2001 From: 3juhwan <13selfesteem91@naver.com> Date: Mon, 11 Mar 2024 14:42:45 +0900 Subject: [PATCH 38/56] =?UTF-8?q?test:=20Deck=EC=97=90=2052=EC=9E=A5?= =?UTF-8?q?=EC=9D=98=20=EC=B9=B4=EB=93=9C=EA=B0=80=20=EC=9E=88=EB=8A=94?= =?UTF-8?q?=EC=A7=80=20=EA=B2=80=EC=A6=9D=ED=95=98=EB=8A=94=20=ED=85=8C?= =?UTF-8?q?=EC=8A=A4=ED=8A=B8?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../blackjack/domain/cardgame/CardDeckTest.java | 14 ++++++++++++++ 1 file changed, 14 insertions(+) diff --git a/src/test/java/blackjack/domain/cardgame/CardDeckTest.java b/src/test/java/blackjack/domain/cardgame/CardDeckTest.java index c6113552ecf..9d0aa0787c5 100644 --- a/src/test/java/blackjack/domain/cardgame/CardDeckTest.java +++ b/src/test/java/blackjack/domain/cardgame/CardDeckTest.java @@ -4,6 +4,7 @@ import org.junit.jupiter.api.Test; import static org.assertj.core.api.Assertions.assertThat; +import static org.assertj.core.api.Assertions.assertThatThrownBy; public class CardDeckTest { @@ -15,4 +16,17 @@ public class CardDeckTest { assertThat(card).isNotNull(); } + + @Test + void 덱에_정확히_52장의_카드가_존재한다() { + CardDeck deck = CardDeck.create(); + + for (int ignored = 0; ignored < 52; ignored++) { + deck.draw(); + } + + assertThatThrownBy(deck::draw) + .isInstanceOf(IllegalArgumentException.class) + .hasMessage("카드가 존재하지 않습니다."); + } } From d1907c84cd1df8cdca9ec18c10e23e4b57ccc8f4 Mon Sep 17 00:00:00 2001 From: 3juhwan <13selfesteem91@naver.com> Date: Mon, 11 Mar 2024 16:12:49 +0900 Subject: [PATCH 39/56] =?UTF-8?q?refactor:=20Hand=20=ED=81=B4=EB=9E=98?= =?UTF-8?q?=EC=8A=A4=20=EC=88=98=EC=A0=95?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit - 합계를 구하는 로직 수정 - 접근 제어자 수정 --- .../java/blackjack/domain/player/Dealer.java | 2 +- .../java/blackjack/domain/player/Hand.java | 34 ++++++++++--------- .../java/blackjack/domain/player/Player.java | 4 +-- 3 files changed, 21 insertions(+), 19 deletions(-) diff --git a/src/main/java/blackjack/domain/player/Dealer.java b/src/main/java/blackjack/domain/player/Dealer.java index de370955dd4..0a7c6e11065 100644 --- a/src/main/java/blackjack/domain/player/Dealer.java +++ b/src/main/java/blackjack/domain/player/Dealer.java @@ -11,7 +11,7 @@ public Dealer() { } public boolean isMoreCardNeeded() { - return this.hand.getSum() <= HIT_THRESHOLD; + return this.hand.getScore() <= HIT_THRESHOLD; } public Card getFirstCard() { diff --git a/src/main/java/blackjack/domain/player/Hand.java b/src/main/java/blackjack/domain/player/Hand.java index 92e23feb2f8..b73da8e5434 100644 --- a/src/main/java/blackjack/domain/player/Hand.java +++ b/src/main/java/blackjack/domain/player/Hand.java @@ -7,35 +7,37 @@ import java.util.List; public class Hand { + private static final int BUST_CONDITION = 21; + private static final int BONUS_SCORE = 10; + private static final int NON_SCORE = 0; + private final List cards = new ArrayList<>(); - // TODO: 메서드 분리, 상수 분리 필요 - public int getSum() { - int minimumSum = cards.stream() + int getScore() { + final int minimumScore = cards.stream() .mapToInt(Card::getNumber) .sum(); - final int aceCount = getAceCount(); - for (int i = 0; i < aceCount; i++) { - if (minimumSum + 10 <= 21) { - minimumSum += 10; - } - } + final int bonusScore = this.getBonusScore(); - return minimumSum; + if (minimumScore + bonusScore <= BUST_CONDITION) { + return minimumScore + bonusScore; + } + return minimumScore; } - private int getAceCount() { - return (int) cards.stream() - .filter(Card::isAceCard) - .count(); + private int getBonusScore() { + if (this.cards.stream().anyMatch(Card::isAceCard)) { + return BONUS_SCORE; + } + return NON_SCORE; } - public void add(final Card card) { + void add(final Card card) { cards.add(card); } - public List getAllCards() { + List getAllCards() { return Collections.unmodifiableList(cards); } } diff --git a/src/main/java/blackjack/domain/player/Player.java b/src/main/java/blackjack/domain/player/Player.java index f3415070f45..e61451c2be4 100644 --- a/src/main/java/blackjack/domain/player/Player.java +++ b/src/main/java/blackjack/domain/player/Player.java @@ -20,11 +20,11 @@ public void addCard(final Card card) { } public boolean isAlive() { - return hand.getSum() <= BUST_THRESHOLD; + return hand.getScore() <= BUST_THRESHOLD; } public int getScore() { - return hand.getSum(); + return hand.getScore(); } public List getCards() { From e23c9f53939919f422eb84ba3b66e54bceebd9ba Mon Sep 17 00:00:00 2001 From: 3juhwan <13selfesteem91@naver.com> Date: Mon, 11 Mar 2024 16:14:36 +0900 Subject: [PATCH 40/56] =?UTF-8?q?test:=20Hand=20=ED=81=B4=EB=9E=98?= =?UTF-8?q?=EC=8A=A4=20=ED=85=8C=EC=8A=A4=ED=8A=B8?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../blackjack/domain/player/HandTest.java | 28 +++++++++++++++++-- 1 file changed, 26 insertions(+), 2 deletions(-) diff --git a/src/test/java/blackjack/domain/player/HandTest.java b/src/test/java/blackjack/domain/player/HandTest.java index 5bc92eb6d86..ee47036d679 100644 --- a/src/test/java/blackjack/domain/player/HandTest.java +++ b/src/test/java/blackjack/domain/player/HandTest.java @@ -1,9 +1,9 @@ package blackjack.domain.player; import blackjack.domain.card.Card; -import blackjack.domain.player.Hand; import org.junit.jupiter.api.Test; +import static blackjack.domain.card.CardNumber.ACE; import static blackjack.domain.card.CardNumber.JACK; import static blackjack.domain.card.CardNumber.KING; import static blackjack.domain.card.CardNumber.QUEEN; @@ -18,8 +18,32 @@ public class HandTest { hand.add(new Card(QUEEN, SPADE)); hand.add(new Card(KING, SPADE)); - int sum = hand.getSum(); + int sum = hand.getScore(); assertThat(sum).isEqualTo(30); } + + @Test + void 에이스_카드가_4개인_경우에_합계를_구할_수_있다() { + Hand hand = new Hand(); + hand.add(new Card(ACE, SPADE)); + hand.add(new Card(ACE, SPADE)); + hand.add(new Card(ACE, SPADE)); + hand.add(new Card(ACE, SPADE)); + + int sum = hand.getScore(); + + assertThat(sum).isEqualTo(14); + } + + @Test + void 에이스_카드를_포함해서_합계_21인_경우에_정확하게_계산할_수_있다() { + Hand hand = new Hand(); + hand.add(new Card(ACE, SPADE)); + hand.add(new Card(KING, SPADE)); + + int sum = hand.getScore(); + + assertThat(sum).isEqualTo(21); + } } From 944578d37c7d1574f2c4df4977b2230e2e280bc7 Mon Sep 17 00:00:00 2001 From: 3juhwan <13selfesteem91@naver.com> Date: Mon, 11 Mar 2024 16:15:47 +0900 Subject: [PATCH 41/56] =?UTF-8?q?refactor:=20=EC=A0=91=EA=B7=BC=20?= =?UTF-8?q?=EC=A0=9C=EC=96=B4=EC=9E=90=20=EC=88=98=EC=A0=95?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- src/main/java/blackjack/domain/card/CardNumber.java | 2 +- src/main/java/blackjack/domain/card/CardShape.java | 2 +- 2 files changed, 2 insertions(+), 2 deletions(-) diff --git a/src/main/java/blackjack/domain/card/CardNumber.java b/src/main/java/blackjack/domain/card/CardNumber.java index 471e3384c94..c99818bc6f8 100644 --- a/src/main/java/blackjack/domain/card/CardNumber.java +++ b/src/main/java/blackjack/domain/card/CardNumber.java @@ -21,7 +21,7 @@ public enum CardNumber { this.value = value; } - public int getValue() { + int getValue() { return value; } } diff --git a/src/main/java/blackjack/domain/card/CardShape.java b/src/main/java/blackjack/domain/card/CardShape.java index af675f9d6ff..dac60a39436 100644 --- a/src/main/java/blackjack/domain/card/CardShape.java +++ b/src/main/java/blackjack/domain/card/CardShape.java @@ -12,7 +12,7 @@ public enum CardShape { this.name = name; } - public String getName() { + String getName() { return name; } } From c30e9e4ea0134de4ca762a9b1fb0da36a907cbe1 Mon Sep 17 00:00:00 2001 From: 3juhwan <13selfesteem91@naver.com> Date: Mon, 11 Mar 2024 16:28:28 +0900 Subject: [PATCH 42/56] =?UTF-8?q?test:=20DealerTest=20=EC=B6=94=EA=B0=80?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../blackjack/domain/player/DealerTest.java | 49 +++++++++++++++++++ 1 file changed, 49 insertions(+) create mode 100644 src/test/java/blackjack/domain/player/DealerTest.java diff --git a/src/test/java/blackjack/domain/player/DealerTest.java b/src/test/java/blackjack/domain/player/DealerTest.java new file mode 100644 index 00000000000..1b5865971f7 --- /dev/null +++ b/src/test/java/blackjack/domain/player/DealerTest.java @@ -0,0 +1,49 @@ +package blackjack.domain.player; + +import blackjack.domain.card.Card; +import org.junit.jupiter.api.Test; + +import static blackjack.domain.card.CardNumber.ACE; +import static blackjack.domain.card.CardNumber.KING; +import static blackjack.domain.card.CardNumber.SEVEN; +import static blackjack.domain.card.CardNumber.SIX; +import static blackjack.domain.card.CardShape.SPADE; +import static blackjack.fixture.PlayerFixture.dealer; +import static org.assertj.core.api.Assertions.assertThat; +import static org.assertj.core.api.Assertions.assertThatThrownBy; + +class DealerTest { + @Test + void 합계가_16이하라면_카드가_더_필요하다() { + Dealer dealer = dealer( + new Card(KING, SPADE), + new Card(SIX, SPADE)); + + assertThat(dealer.isMoreCardNeeded()).isTrue(); + } + + @Test + void 합계가_16보다_크다면_카드가_더_필요하다() { + Dealer dealer = dealer( + new Card(KING, SPADE), + new Card(SEVEN, SPADE)); + + assertThat(dealer.isMoreCardNeeded()).isFalse(); + } + + @Test + void 딜러에게_카드가_있는_경우에_첫_카드를_요청하면_정상적으로_돌려준다() { + Dealer dealer = dealer(new Card(ACE, SPADE)); + + assertThat(dealer.getFirstCard()).isNotNull(); + } + + @Test + void 딜러에게_카드가_없는_경우에_첫_카드를_요청하면_예외가_발생한다() { + Dealer dealer = dealer(); + + assertThatThrownBy(dealer::getFirstCard) + .isInstanceOf(RuntimeException.class) + .hasMessage("[ERROR] 딜러가 카드를 갖고 있지 않습니다."); + } +} From 6de928765e1fc3b8dc301b0606eae7d868795943 Mon Sep 17 00:00:00 2001 From: 3juhwan <13selfesteem91@naver.com> Date: Mon, 11 Mar 2024 16:29:51 +0900 Subject: [PATCH 43/56] =?UTF-8?q?refactor:=20=EB=A9=94=EC=84=9C=EB=93=9C?= =?UTF-8?q?=20=EB=B6=84=EB=A6=AC?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../blackjack/domain/cardgame/CardGame.java | 26 +++++++++++++------ 1 file changed, 18 insertions(+), 8 deletions(-) diff --git a/src/main/java/blackjack/domain/cardgame/CardGame.java b/src/main/java/blackjack/domain/cardgame/CardGame.java index ac4bb76faab..de7e3092232 100644 --- a/src/main/java/blackjack/domain/cardgame/CardGame.java +++ b/src/main/java/blackjack/domain/cardgame/CardGame.java @@ -6,26 +6,36 @@ import java.util.List; public class CardGame { + private static final int INITIAL_CARD_NUMBER = 2; + private final CardDeck cardDeck; public CardGame() { this.cardDeck = CardDeck.create(); } - public void giveCard(final Player player) { - player.addCard(cardDeck.draw()); + public void initializeHand(final Dealer dealer, final List players) { + giveDealerInitialCards(dealer); + giveEachPlayerInitialCards(players); } - public void initializeHand(final Dealer dealer, final List players) { - giveCard(dealer); - giveCard(dealer); - giveTwoCardsEachPlayer(players); + private void giveDealerInitialCards(final Dealer dealer) { + giveInitialCards(dealer); } - private void giveTwoCardsEachPlayer(final List players) { + private void giveEachPlayerInitialCards(final List players) { for (final Player player : players) { - giveCard(player); + giveInitialCards(player); + } + } + + private void giveInitialCards(Player player) { + for (int i = 0; i < INITIAL_CARD_NUMBER; i++) { giveCard(player); } } + + public void giveCard(final Player player) { + player.addCard(cardDeck.draw()); + } } From a4df5f4f62fc68346fe25591625bafd35272d055 Mon Sep 17 00:00:00 2001 From: 3juhwan <13selfesteem91@naver.com> Date: Mon, 11 Mar 2024 17:21:46 +0900 Subject: [PATCH 44/56] =?UTF-8?q?refactor:=20Judge=EC=9D=98=20=EC=97=AD?= =?UTF-8?q?=ED=95=A0=EC=9D=84=20=20Dealer=EB=A1=9C=20=EC=98=AE=EA=B9=80?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../java/blackjack/BlackjackController.java | 8 +- .../domain/cardgame/CardGameJudge.java | 45 ------- .../java/blackjack/domain/player/Dealer.java | 37 +++++- .../domain/cardgame/CardGameJudgeTest.java | 115 ------------------ .../blackjack/domain/player/DealerTest.java | 88 ++++++++++++++ 5 files changed, 125 insertions(+), 168 deletions(-) delete mode 100644 src/main/java/blackjack/domain/cardgame/CardGameJudge.java delete mode 100644 src/test/java/blackjack/domain/cardgame/CardGameJudgeTest.java diff --git a/src/main/java/blackjack/BlackjackController.java b/src/main/java/blackjack/BlackjackController.java index d4bed2ae664..e1d6d8e8bb5 100644 --- a/src/main/java/blackjack/BlackjackController.java +++ b/src/main/java/blackjack/BlackjackController.java @@ -1,7 +1,6 @@ package blackjack; import blackjack.domain.cardgame.CardGame; -import blackjack.domain.cardgame.CardGameJudge; import blackjack.domain.cardgame.CardGameResult; import blackjack.domain.player.Dealer; import blackjack.domain.player.Player; @@ -15,9 +14,7 @@ public static void main(String[] args) { final CardGame cardGame = new CardGame(); final List names = InputView.askPlayerNames(); final Dealer dealer = new Dealer(); - final List players = names.stream() - .map(Player::new) - .toList(); + final List players = names.stream().map(Player::new).toList(); cardGame.initializeHand(dealer, players); OutputView.printInitialHandOfEachPlayer(dealer, players); @@ -54,8 +51,7 @@ private static void printHandStatusOfEachPlayer(final Dealer dealer, final List< } private static void printCardGameResult(final Dealer dealer, final List players) { - final CardGameJudge cardGameJudge = new CardGameJudge(); - final CardGameResult cardGameResult = cardGameJudge.judge(dealer, players); + final CardGameResult cardGameResult = dealer.judgeWithPlayers(players); OutputView.printResult(cardGameResult); } } diff --git a/src/main/java/blackjack/domain/cardgame/CardGameJudge.java b/src/main/java/blackjack/domain/cardgame/CardGameJudge.java deleted file mode 100644 index 118424f288e..00000000000 --- a/src/main/java/blackjack/domain/cardgame/CardGameJudge.java +++ /dev/null @@ -1,45 +0,0 @@ -package blackjack.domain.cardgame; - -import blackjack.domain.player.Player; - -import java.util.LinkedHashMap; -import java.util.List; -import java.util.Map; - -public class CardGameJudge { - public static final int BUST_THRESHOLD = 21; - - public CardGameResult judge(final Player dealer, final List players) { - Map result = new LinkedHashMap<>(); - - for (final Player player : players) { - WinningStatus winningStatus = judge(dealer, player); - result.put(player, winningStatus); - } - - return new CardGameResult(result); - } - - private WinningStatus judge(final Player dealer, final Player player) { - int dealerScore = dealer.getScore(); - int playerScore = player.getScore(); - - return doesPlayerWin(dealerScore, playerScore); - } - - private WinningStatus doesPlayerWin(final int dealerScore, final int playerScore) { - if (playerScore > BUST_THRESHOLD) { - return WinningStatus.LOSE; - } - if (dealerScore > BUST_THRESHOLD) { - return WinningStatus.WIN; - } - if (dealerScore == playerScore) { - return WinningStatus.PUSH; - } - if (dealerScore < playerScore) { - return WinningStatus.WIN; - } - return WinningStatus.LOSE; - } -} diff --git a/src/main/java/blackjack/domain/player/Dealer.java b/src/main/java/blackjack/domain/player/Dealer.java index 0a7c6e11065..de11969026e 100644 --- a/src/main/java/blackjack/domain/player/Dealer.java +++ b/src/main/java/blackjack/domain/player/Dealer.java @@ -1,13 +1,19 @@ package blackjack.domain.player; import blackjack.domain.card.Card; +import blackjack.domain.cardgame.CardGameResult; +import blackjack.domain.cardgame.WinningStatus; + +import java.util.LinkedHashMap; +import java.util.List; +import java.util.Map; public class Dealer extends Player { - private static final String NAME = "딜러"; + public static final int BUST_THRESHOLD = 21; private static final int HIT_THRESHOLD = 16; public Dealer() { - super(NAME); + super("딜러"); } public boolean isMoreCardNeeded() { @@ -21,4 +27,31 @@ public Card getFirstCard() { throw new RuntimeException("[ERROR] 딜러가 카드를 갖고 있지 않습니다."); } } + + public CardGameResult judgeWithPlayers(final List players) { + Map result = new LinkedHashMap<>(); + + for (final Player player : players) { + WinningStatus winningStatus = doesPlayerWin(this.getScore(), player.getScore()); + result.put(player, winningStatus); + } + + return new CardGameResult(result); + } + + private WinningStatus doesPlayerWin(final int dealerScore, final int playerScore) { + if (playerScore > BUST_THRESHOLD) { + return WinningStatus.LOSE; + } + if (dealerScore > BUST_THRESHOLD) { + return WinningStatus.WIN; + } + if (dealerScore == playerScore) { + return WinningStatus.PUSH; + } + if (dealerScore < playerScore) { + return WinningStatus.WIN; + } + return WinningStatus.LOSE; + } } diff --git a/src/test/java/blackjack/domain/cardgame/CardGameJudgeTest.java b/src/test/java/blackjack/domain/cardgame/CardGameJudgeTest.java deleted file mode 100644 index d60048fc4f6..00000000000 --- a/src/test/java/blackjack/domain/cardgame/CardGameJudgeTest.java +++ /dev/null @@ -1,115 +0,0 @@ -package blackjack.domain.cardgame; - -import blackjack.domain.card.Card; -import blackjack.domain.player.Dealer; -import blackjack.domain.player.Player; -import org.junit.jupiter.api.Test; - -import java.util.List; - -import static blackjack.domain.card.CardNumber.ACE; -import static blackjack.domain.card.CardNumber.KING; -import static blackjack.domain.card.CardNumber.QUEEN; -import static blackjack.domain.card.CardNumber.TWO; -import static blackjack.domain.card.CardShape.CLOVER; -import static blackjack.domain.card.CardShape.DIAMOND; -import static blackjack.domain.card.CardShape.HEART; -import static blackjack.domain.card.CardShape.SPADE; -import static blackjack.fixture.PlayerFixture.dealer; -import static blackjack.fixture.PlayerFixture.player; -import static org.assertj.core.api.Assertions.assertThat; - -public class CardGameJudgeTest { - @Test - void 딜러와_플레이어_둘다_21을_초과할_경우에_플레이어가_패배한다() { - CardGameJudge cardGameJudge = new CardGameJudge(); - - Player mangcho = player( - new Card(KING, CLOVER), - new Card(KING, HEART), - new Card(KING, SPADE)); - - Dealer dealer = dealer( - new Card(QUEEN, CLOVER), - new Card(QUEEN, HEART), - new Card(QUEEN, SPADE)); - - var totalResult = cardGameJudge.judge(dealer, List.of(mangcho)) - .getTotalResult(); - - assertThat(totalResult.get(mangcho)).isEqualTo(WinningStatus.LOSE); - } - - @Test - void 딜러와_여러_플레이어의_숫자가_21_이하인_경우_숫자가_큰_사람이_이긴다() { - CardGameJudge cardGameJudge = new CardGameJudge(); - - Player mangcho = player(new Card(KING, SPADE)); - Dealer dealer = dealer(new Card(TWO, SPADE)); - - var result = cardGameJudge.judge(dealer, List.of(mangcho)) - .getTotalResult(); - - assertThat(result.get(mangcho)).isEqualTo(WinningStatus.WIN); - } - - @Test - void 카드_합계가_딜러는_21_이하_플레이어는_21_초과인_경우_플레이어가_패배한다() { - CardGameJudge cardGameJudge = new CardGameJudge(); - - Player player = player( - new Card(KING, CLOVER), - new Card(KING, HEART), - new Card(KING, DIAMOND)); - - Dealer dealer = dealer(new Card(TWO, HEART)); - - var result = cardGameJudge.judge(dealer, List.of(player)) - .getTotalResult(); - - assertThat(result.get(player)).isEqualTo(WinningStatus.LOSE); - } - - @Test - void 카드_합계가_딜러는_21_초과_플레이어는_21_이하인_경우_플레이어가_승리한다() { - CardGameJudge cardGameJudge = new CardGameJudge(); - - Player player = player(new Card(TWO, HEART)); - - Dealer dealer = dealer( - new Card(KING, CLOVER), - new Card(KING, HEART), - new Card(KING, SPADE)); - - var result = cardGameJudge.judge(dealer, List.of(player)) - .getTotalResult(); - - assertThat(result.get(player)).isEqualTo(WinningStatus.WIN); - } - - @Test - void 카드_합계가_딜러와_플레이어_모두_21_이하인_경우_숫자가_큰_사람이_승리한다() { - CardGameJudge cardGameJudge = new CardGameJudge(); - - Player player = player(new Card(ACE, HEART)); - Dealer dealer = dealer(new Card(KING, SPADE)); - - var result = cardGameJudge.judge(dealer, List.of(player)) - .getTotalResult(); - - assertThat(result.get(player)).isEqualTo(WinningStatus.WIN); - } - - @Test - void 카드_합계가_딜러와_플레이어_모두_21_이하이고_동일한_경우_무승부다() { - CardGameJudge cardGameJudge = new CardGameJudge(); - - Player player = player(new Card(ACE, HEART)); - Dealer dealer = dealer(new Card(ACE, HEART)); - - var result = cardGameJudge.judge(dealer, List.of(player)) - .getTotalResult(); - - assertThat(result.get(player)).isEqualTo(WinningStatus.PUSH); - } -} diff --git a/src/test/java/blackjack/domain/player/DealerTest.java b/src/test/java/blackjack/domain/player/DealerTest.java index 1b5865971f7..c15bd5470d2 100644 --- a/src/test/java/blackjack/domain/player/DealerTest.java +++ b/src/test/java/blackjack/domain/player/DealerTest.java @@ -1,14 +1,23 @@ package blackjack.domain.player; import blackjack.domain.card.Card; +import blackjack.domain.cardgame.WinningStatus; import org.junit.jupiter.api.Test; +import java.util.List; + import static blackjack.domain.card.CardNumber.ACE; import static blackjack.domain.card.CardNumber.KING; +import static blackjack.domain.card.CardNumber.QUEEN; import static blackjack.domain.card.CardNumber.SEVEN; import static blackjack.domain.card.CardNumber.SIX; +import static blackjack.domain.card.CardNumber.TWO; +import static blackjack.domain.card.CardShape.CLOVER; +import static blackjack.domain.card.CardShape.DIAMOND; +import static blackjack.domain.card.CardShape.HEART; import static blackjack.domain.card.CardShape.SPADE; import static blackjack.fixture.PlayerFixture.dealer; +import static blackjack.fixture.PlayerFixture.player; import static org.assertj.core.api.Assertions.assertThat; import static org.assertj.core.api.Assertions.assertThatThrownBy; @@ -46,4 +55,83 @@ class DealerTest { .isInstanceOf(RuntimeException.class) .hasMessage("[ERROR] 딜러가 카드를 갖고 있지 않습니다."); } + + @Test + void 딜러와_플레이어_둘다_21을_초과할_경우에_플레이어가_패배한다() { + Player player = player( + new Card(KING, CLOVER), + new Card(KING, HEART), + new Card(KING, SPADE)); + + Dealer dealer = dealer( + new Card(QUEEN, CLOVER), + new Card(QUEEN, HEART), + new Card(QUEEN, SPADE)); + + var totalResult = dealer.judgeWithPlayers(List.of(player)) + .getTotalResult(); + + assertThat(totalResult.get(player)).isEqualTo(WinningStatus.LOSE); + } + + @Test + void 딜러와_여러_플레이어의_숫자가_21_이하인_경우_숫자가_큰_사람이_이긴다() { + Player player = player(new Card(KING, SPADE)); + Dealer dealer = dealer(new Card(TWO, SPADE)); + + var result = dealer.judgeWithPlayers(List.of(player)) + .getTotalResult(); + + assertThat(result.get(player)).isEqualTo(WinningStatus.WIN); + } + + @Test + void 카드_합계가_딜러는_21_이하_플레이어는_21_초과인_경우_플레이어가_패배한다() { + Player player = player( + new Card(KING, CLOVER), + new Card(KING, HEART), + new Card(KING, DIAMOND)); + Dealer dealer = dealer(new Card(TWO, HEART)); + + var result = dealer.judgeWithPlayers(List.of(player)) + .getTotalResult(); + + assertThat(result.get(player)).isEqualTo(WinningStatus.LOSE); + } + + @Test + void 카드_합계가_딜러는_21_초과_플레이어는_21_이하인_경우_플레이어가_승리한다() { + Player player = player(new Card(TWO, HEART)); + Dealer dealer = dealer( + new Card(KING, CLOVER), + new Card(KING, HEART), + new Card(KING, SPADE)); + + var result = dealer.judgeWithPlayers(List.of(player)) + .getTotalResult(); + + assertThat(result.get(player)).isEqualTo(WinningStatus.WIN); + } + + @Test + void 카드_합계가_딜러와_플레이어_모두_21_이하인_경우_숫자가_큰_사람이_승리한다() { + Player player = player(new Card(ACE, HEART)); + Dealer dealer = dealer(new Card(KING, SPADE)); + + var result = dealer.judgeWithPlayers(List.of(player)) + .getTotalResult(); + + assertThat(result.get(player)).isEqualTo(WinningStatus.WIN); + } + + @Test + void 카드_합계가_딜러와_플레이어_모두_21_이하이고_동일한_경우_무승부다() { + Player player = player(new Card(ACE, HEART)); + Dealer dealer = dealer(new Card(ACE, HEART)); + + var result = dealer.judgeWithPlayers(List.of(player)) + .getTotalResult(); + + assertThat(result.get(player)).isEqualTo(WinningStatus.PUSH); + } } From 1b1d5a00107510005568471c6c657db93089b2b1 Mon Sep 17 00:00:00 2001 From: 3juhwan <13selfesteem91@naver.com> Date: Mon, 11 Mar 2024 17:39:24 +0900 Subject: [PATCH 45/56] =?UTF-8?q?refactor:=20=EA=B2=8C=EC=9E=84=20?= =?UTF-8?q?=EB=A1=9C=EC=A7=81=20=EC=84=A4=EC=A0=95=20=EC=A0=95=EB=B3=B4=20?= =?UTF-8?q?=EC=9D=B4=EB=8F=99?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../java/blackjack/domain/player/Dealer.java | 9 ++++----- src/main/java/blackjack/domain/player/Hand.java | 5 ++--- .../java/blackjack/domain/player/Player.java | 16 ++++++++-------- .../java/blackjack/domain/player/HandTest.java | 8 +++++--- 4 files changed, 19 insertions(+), 19 deletions(-) diff --git a/src/main/java/blackjack/domain/player/Dealer.java b/src/main/java/blackjack/domain/player/Dealer.java index de11969026e..284242d95ae 100644 --- a/src/main/java/blackjack/domain/player/Dealer.java +++ b/src/main/java/blackjack/domain/player/Dealer.java @@ -9,15 +9,14 @@ import java.util.Map; public class Dealer extends Player { - public static final int BUST_THRESHOLD = 21; - private static final int HIT_THRESHOLD = 16; + private static final int HIT_CONDITION = 16; public Dealer() { super("딜러"); } public boolean isMoreCardNeeded() { - return this.hand.getScore() <= HIT_THRESHOLD; + return this.hand.getScore(BUST_CONDITION) <= HIT_CONDITION; } public Card getFirstCard() { @@ -40,10 +39,10 @@ public CardGameResult judgeWithPlayers(final List players) { } private WinningStatus doesPlayerWin(final int dealerScore, final int playerScore) { - if (playerScore > BUST_THRESHOLD) { + if (playerScore > BUST_CONDITION) { return WinningStatus.LOSE; } - if (dealerScore > BUST_THRESHOLD) { + if (dealerScore > BUST_CONDITION) { return WinningStatus.WIN; } if (dealerScore == playerScore) { diff --git a/src/main/java/blackjack/domain/player/Hand.java b/src/main/java/blackjack/domain/player/Hand.java index b73da8e5434..4ccc0a26165 100644 --- a/src/main/java/blackjack/domain/player/Hand.java +++ b/src/main/java/blackjack/domain/player/Hand.java @@ -7,20 +7,19 @@ import java.util.List; public class Hand { - private static final int BUST_CONDITION = 21; private static final int BONUS_SCORE = 10; private static final int NON_SCORE = 0; private final List cards = new ArrayList<>(); - int getScore() { + int getScore(final int bustCondition) { final int minimumScore = cards.stream() .mapToInt(Card::getNumber) .sum(); final int bonusScore = this.getBonusScore(); - if (minimumScore + bonusScore <= BUST_CONDITION) { + if (minimumScore + bonusScore <= bustCondition) { return minimumScore + bonusScore; } return minimumScore; diff --git a/src/main/java/blackjack/domain/player/Player.java b/src/main/java/blackjack/domain/player/Player.java index e61451c2be4..b058e2f586f 100644 --- a/src/main/java/blackjack/domain/player/Player.java +++ b/src/main/java/blackjack/domain/player/Player.java @@ -5,7 +5,7 @@ import java.util.List; public class Player { - private static final int BUST_THRESHOLD = 21; + protected static final int BUST_CONDITION = 21; protected final Hand hand; private final Name name; @@ -15,23 +15,23 @@ public Player(final String name) { this.name = new Name(name); } - public void addCard(final Card card) { + public final void addCard(final Card card) { hand.add(card); } - public boolean isAlive() { - return hand.getScore() <= BUST_THRESHOLD; + public final boolean isAlive() { + return hand.getScore(BUST_CONDITION) <= BUST_CONDITION; } - public int getScore() { - return hand.getScore(); + public final int getScore() { + return hand.getScore(BUST_CONDITION); } - public List getCards() { + public final List getCards() { return hand.getAllCards(); } - public String getName() { + public final String getName() { return name.getValue(); } } diff --git a/src/test/java/blackjack/domain/player/HandTest.java b/src/test/java/blackjack/domain/player/HandTest.java index ee47036d679..65540d8fabe 100644 --- a/src/test/java/blackjack/domain/player/HandTest.java +++ b/src/test/java/blackjack/domain/player/HandTest.java @@ -11,6 +11,8 @@ import static org.assertj.core.api.Assertions.assertThat; public class HandTest { + private static final int BUST_CONDITION = 21; + @Test void 가진_패의_숫자의_합계를_구할_수_있다() { Hand hand = new Hand(); @@ -18,7 +20,7 @@ public class HandTest { hand.add(new Card(QUEEN, SPADE)); hand.add(new Card(KING, SPADE)); - int sum = hand.getScore(); + int sum = hand.getScore(BUST_CONDITION); assertThat(sum).isEqualTo(30); } @@ -31,7 +33,7 @@ public class HandTest { hand.add(new Card(ACE, SPADE)); hand.add(new Card(ACE, SPADE)); - int sum = hand.getScore(); + int sum = hand.getScore(BUST_CONDITION); assertThat(sum).isEqualTo(14); } @@ -42,7 +44,7 @@ public class HandTest { hand.add(new Card(ACE, SPADE)); hand.add(new Card(KING, SPADE)); - int sum = hand.getScore(); + int sum = hand.getScore(BUST_CONDITION); assertThat(sum).isEqualTo(21); } From c20525258e8c5876eda5390514862131d3be7b2c Mon Sep 17 00:00:00 2001 From: 3juhwan <13selfesteem91@naver.com> Date: Mon, 11 Mar 2024 17:52:35 +0900 Subject: [PATCH 46/56] =?UTF-8?q?refactor:=20=EC=B6=9C=EB=A0=A5=20?= =?UTF-8?q?=EB=A9=94=EC=8B=9C=EC=A7=80=EB=A5=BC=20Outview=EB=A1=9C=20?= =?UTF-8?q?=EC=9C=84=EC=9E=84?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- src/main/java/blackjack/domain/card/Card.java | 10 +++++-- .../java/blackjack/domain/card/CardShape.java | 18 +++--------- .../java/blackjack/domain/player/Hand.java | 2 +- src/main/java/blackjack/view/OutputView.java | 28 ++++++++++++++++++- 4 files changed, 39 insertions(+), 19 deletions(-) diff --git a/src/main/java/blackjack/domain/card/Card.java b/src/main/java/blackjack/domain/card/Card.java index 98249697e83..ddcc69bfb2b 100644 --- a/src/main/java/blackjack/domain/card/Card.java +++ b/src/main/java/blackjack/domain/card/Card.java @@ -13,11 +13,15 @@ public boolean isAceCard() { return cardNumber == CardNumber.ACE; } - public int getNumber() { + public int getScore() { return cardNumber.getValue(); } - public String getShape() { - return cardShape.getName(); + public CardNumber getNumber() { + return cardNumber; + } + + public CardShape getShape() { + return cardShape; } } diff --git a/src/main/java/blackjack/domain/card/CardShape.java b/src/main/java/blackjack/domain/card/CardShape.java index dac60a39436..a3f9a873009 100644 --- a/src/main/java/blackjack/domain/card/CardShape.java +++ b/src/main/java/blackjack/domain/card/CardShape.java @@ -1,18 +1,8 @@ package blackjack.domain.card; public enum CardShape { - SPADE("스페이드"), - HEART("하트"), - DIAMOND("다이아몬드"), - CLOVER("클로버"); - - private final String name; - - CardShape(final String name) { - this.name = name; - } - - String getName() { - return name; - } + SPADE, + HEART, + DIAMOND, + CLOVER } diff --git a/src/main/java/blackjack/domain/player/Hand.java b/src/main/java/blackjack/domain/player/Hand.java index 4ccc0a26165..aa0e76604a3 100644 --- a/src/main/java/blackjack/domain/player/Hand.java +++ b/src/main/java/blackjack/domain/player/Hand.java @@ -14,7 +14,7 @@ public class Hand { int getScore(final int bustCondition) { final int minimumScore = cards.stream() - .mapToInt(Card::getNumber) + .mapToInt(Card::getScore) .sum(); final int bonusScore = this.getBonusScore(); diff --git a/src/main/java/blackjack/view/OutputView.java b/src/main/java/blackjack/view/OutputView.java index a3f664db025..0fa314c95fb 100644 --- a/src/main/java/blackjack/view/OutputView.java +++ b/src/main/java/blackjack/view/OutputView.java @@ -1,17 +1,42 @@ package blackjack.view; import blackjack.domain.card.Card; +import blackjack.domain.card.CardNumber; +import blackjack.domain.card.CardShape; import blackjack.domain.cardgame.CardGameResult; import blackjack.domain.player.Dealer; import blackjack.domain.player.Player; import java.util.List; +import java.util.Map; import java.util.stream.Collectors; +import static blackjack.domain.card.CardNumber.*; +import static blackjack.domain.card.CardShape.CLOVER; +import static blackjack.domain.card.CardShape.DIAMOND; +import static blackjack.domain.card.CardShape.HEART; +import static blackjack.domain.card.CardShape.SPADE; import static blackjack.domain.cardgame.WinningStatus.LOSE; import static blackjack.domain.cardgame.WinningStatus.WIN; public class OutputView { + private static final Map CARD_SHAPE_NAME_MAP = Map.of( + SPADE, "스페이드", + HEART, "하트", + DIAMOND, "다이아몬드", + CLOVER, "클로버" + ); + + private static final Map CARD_NUMBER_NAME_MAP = Map.ofEntries( + Map.entry(ACE, "A"), Map.entry(TWO, "2"), + Map.entry(THREE, "3"), Map.entry(FOUR, "4"), + Map.entry(FIVE, "5"), Map.entry(SIX, "6"), + Map.entry(SEVEN, "7"), Map.entry(EIGHT, "8"), + Map.entry(NINE, "9"), Map.entry(TEN, "10"), + Map.entry(JACK, "J"), Map.entry(QUEEN, "Q"), + Map.entry(KING, "K") + ); + public static void printInitialHandOfEachPlayer(final Dealer dealer, final List players) { printInitialDistributionMessage(dealer, players); printDealerCard(dealer); @@ -43,6 +68,7 @@ public static void printDealerHitMessage(final Dealer dealer) { System.out.println(dealerHitMessage); printLineSeparator(); } + public static void printPlayerCardWithScore(final Player player) { String playerCardInfo = getPlayerCardInfo(player); System.out.println(playerCardInfo + " - 결과: " + player.getScore()); @@ -78,7 +104,7 @@ private static String getPlayerCardInfo(final Player player) { } private static String getCardInfo(final Card card) { - return card.getNumber() + card.getShape(); + return CARD_NUMBER_NAME_MAP.get(card.getNumber()) + CARD_SHAPE_NAME_MAP.get(card.getShape()); } private static void printLineSeparator() { From 731dea0e0490b45ceb8a1dc802deec4e76445c91 Mon Sep 17 00:00:00 2001 From: 3juhwan <13selfesteem91@naver.com> Date: Mon, 11 Mar 2024 20:48:23 +0900 Subject: [PATCH 47/56] =?UTF-8?q?refactor:=20CardGameResult=EB=A5=BC=20rec?= =?UTF-8?q?ord=EB=A1=9C=20=EB=B3=80=EA=B2=BD?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../blackjack/domain/cardgame/CardGameResult.java | 11 +++-------- src/main/java/blackjack/view/OutputView.java | 2 +- .../java/blackjack/domain/player/DealerTest.java | 12 ++++++------ 3 files changed, 10 insertions(+), 15 deletions(-) diff --git a/src/main/java/blackjack/domain/cardgame/CardGameResult.java b/src/main/java/blackjack/domain/cardgame/CardGameResult.java index 558c8c6b21b..4a9effd86b6 100644 --- a/src/main/java/blackjack/domain/cardgame/CardGameResult.java +++ b/src/main/java/blackjack/domain/cardgame/CardGameResult.java @@ -8,14 +8,9 @@ import static blackjack.domain.cardgame.WinningStatus.LOSE; import static blackjack.domain.cardgame.WinningStatus.WIN; -public class CardGameResult { - private final Map totalResult; - - public CardGameResult(Map totalResult) { - this.totalResult = totalResult; - } - - public Map getTotalResult() { +public record CardGameResult(Map totalResult) { + @Override + public Map totalResult() { return Collections.unmodifiableMap(totalResult); } diff --git a/src/main/java/blackjack/view/OutputView.java b/src/main/java/blackjack/view/OutputView.java index 0fa314c95fb..74e470667e3 100644 --- a/src/main/java/blackjack/view/OutputView.java +++ b/src/main/java/blackjack/view/OutputView.java @@ -88,7 +88,7 @@ private static void printResultOfDealer(final CardGameResult cardGameResult) { } private static void printResultOfEachPlayer(final CardGameResult cardGameResult) { - cardGameResult.getTotalResult() + cardGameResult.totalResult() .entrySet() .stream() .map(result -> result.getKey().getName() + ": " + result.getValue().getValue()) diff --git a/src/test/java/blackjack/domain/player/DealerTest.java b/src/test/java/blackjack/domain/player/DealerTest.java index c15bd5470d2..a73bee60c51 100644 --- a/src/test/java/blackjack/domain/player/DealerTest.java +++ b/src/test/java/blackjack/domain/player/DealerTest.java @@ -69,7 +69,7 @@ class DealerTest { new Card(QUEEN, SPADE)); var totalResult = dealer.judgeWithPlayers(List.of(player)) - .getTotalResult(); + .totalResult(); assertThat(totalResult.get(player)).isEqualTo(WinningStatus.LOSE); } @@ -80,7 +80,7 @@ class DealerTest { Dealer dealer = dealer(new Card(TWO, SPADE)); var result = dealer.judgeWithPlayers(List.of(player)) - .getTotalResult(); + .totalResult(); assertThat(result.get(player)).isEqualTo(WinningStatus.WIN); } @@ -94,7 +94,7 @@ class DealerTest { Dealer dealer = dealer(new Card(TWO, HEART)); var result = dealer.judgeWithPlayers(List.of(player)) - .getTotalResult(); + .totalResult(); assertThat(result.get(player)).isEqualTo(WinningStatus.LOSE); } @@ -108,7 +108,7 @@ class DealerTest { new Card(KING, SPADE)); var result = dealer.judgeWithPlayers(List.of(player)) - .getTotalResult(); + .totalResult(); assertThat(result.get(player)).isEqualTo(WinningStatus.WIN); } @@ -119,7 +119,7 @@ class DealerTest { Dealer dealer = dealer(new Card(KING, SPADE)); var result = dealer.judgeWithPlayers(List.of(player)) - .getTotalResult(); + .totalResult(); assertThat(result.get(player)).isEqualTo(WinningStatus.WIN); } @@ -130,7 +130,7 @@ class DealerTest { Dealer dealer = dealer(new Card(ACE, HEART)); var result = dealer.judgeWithPlayers(List.of(player)) - .getTotalResult(); + .totalResult(); assertThat(result.get(player)).isEqualTo(WinningStatus.PUSH); } From adb40af7ba4b7e2d2b7fc4cef1bca3e9da4e01ea Mon Sep 17 00:00:00 2001 From: 3juhwan <13selfesteem91@naver.com> Date: Mon, 11 Mar 2024 22:47:58 +0900 Subject: [PATCH 48/56] =?UTF-8?q?refactor:=20OutputView=EC=97=90=EC=84=9C?= =?UTF-8?q?=20=EB=A9=94=EC=8B=9C=EC=A7=80=EB=A5=BC=20=EC=83=9D=EC=84=B1?= =?UTF-8?q?=ED=95=98=EB=8A=94=20=EB=A1=9C=EC=A7=81=EC=9D=84=20MessageResol?= =?UTF-8?q?ver=EB=A1=9C=20=EB=B6=84=EB=A6=AC?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../java/blackjack/BlackjackApplication.java | 15 +++ .../java/blackjack/BlackjackController.java | 34 +++--- src/main/java/blackjack/view/InputView.java | 10 +- .../java/blackjack/view/MessageResolver.java | 109 ++++++++++++++++++ src/main/java/blackjack/view/OutputView.java | 104 +++-------------- 5 files changed, 163 insertions(+), 109 deletions(-) create mode 100644 src/main/java/blackjack/BlackjackApplication.java create mode 100644 src/main/java/blackjack/view/MessageResolver.java diff --git a/src/main/java/blackjack/BlackjackApplication.java b/src/main/java/blackjack/BlackjackApplication.java new file mode 100644 index 00000000000..ff783cf3c42 --- /dev/null +++ b/src/main/java/blackjack/BlackjackApplication.java @@ -0,0 +1,15 @@ +package blackjack; + +import blackjack.view.InputView; +import blackjack.view.MessageResolver; +import blackjack.view.OutputView; + +public class BlackjackApplication { + public static void main(String[] args) { + final InputView inputView = new InputView(); + final OutputView outputView = new OutputView(new MessageResolver()); + + final BlackjackController blackjackController = new BlackjackController(inputView, outputView); + blackjackController.run(); + } +} diff --git a/src/main/java/blackjack/BlackjackController.java b/src/main/java/blackjack/BlackjackController.java index e1d6d8e8bb5..a0afe0465b2 100644 --- a/src/main/java/blackjack/BlackjackController.java +++ b/src/main/java/blackjack/BlackjackController.java @@ -10,14 +10,22 @@ import java.util.List; public class BlackjackController { - public static void main(String[] args) { + private final InputView inputView; + private final OutputView outputView; + + BlackjackController(final InputView inputView, final OutputView outputView) { + this.inputView = inputView; + this.outputView = outputView; + } + + public void run() { final CardGame cardGame = new CardGame(); - final List names = InputView.askPlayerNames(); + final List names = inputView.askPlayerNames(); final Dealer dealer = new Dealer(); final List players = names.stream().map(Player::new).toList(); cardGame.initializeHand(dealer, players); - OutputView.printInitialHandOfEachPlayer(dealer, players); + outputView.printInitialHandOfEachPlayer(dealer, players); for (final Player player : players) { givePlayerMoreCardsIfWanted(cardGame, player); @@ -28,30 +36,30 @@ public static void main(String[] args) { printCardGameResult(dealer, players); } - private static void givePlayerMoreCardsIfWanted(final CardGame cardGame, final Player player) { + private void givePlayerMoreCardsIfWanted(final CardGame cardGame, final Player player) { final String playerName = player.getName(); - while (player.isAlive() && InputView.askForMoreCard(playerName)) { + while (player.isAlive() && inputView.askForMoreCard(playerName)) { cardGame.giveCard(player); - OutputView.printPlayerCard(player); + outputView.printPlayerCard(player); } } - private static void giveDealerMoreCardsIfNeeded(final CardGame cardGame, final Dealer dealer) { + private void giveDealerMoreCardsIfNeeded(final CardGame cardGame, final Dealer dealer) { while (dealer.isMoreCardNeeded()) { cardGame.giveCard(dealer); - OutputView.printDealerHitMessage(dealer); + outputView.printDealerHitMessage(dealer); } } - private static void printHandStatusOfEachPlayer(final Dealer dealer, final List players) { - OutputView.printPlayerCardWithScore(dealer); + private void printHandStatusOfEachPlayer(final Dealer dealer, final List players) { + outputView.printPlayerCardWithScore(dealer); for (final Player player : players) { - OutputView.printPlayerCardWithScore(player); + outputView.printPlayerCardWithScore(player); } } - private static void printCardGameResult(final Dealer dealer, final List players) { + private void printCardGameResult(final Dealer dealer, final List players) { final CardGameResult cardGameResult = dealer.judgeWithPlayers(players); - OutputView.printResult(cardGameResult); + outputView.printResult(cardGameResult); } } diff --git a/src/main/java/blackjack/view/InputView.java b/src/main/java/blackjack/view/InputView.java index 694b723beac..f48003cf66b 100644 --- a/src/main/java/blackjack/view/InputView.java +++ b/src/main/java/blackjack/view/InputView.java @@ -8,29 +8,29 @@ public class InputView { private static final Scanner scanner = new Scanner(System.in); - public static List askPlayerNames() { + public List askPlayerNames() { printPlayerNamesInputMessage(); String rawInput = scanner.nextLine(); return List.of(rawInput.split(",", -1)); } - public static boolean askForMoreCard(final String name) { + public boolean askForMoreCard(final String name) { printAskingForAnotherCardMessage(name); final String rawInput = scanner.nextLine(); return PlayerChoice.isDrawable(rawInput); } - private static void printPlayerNamesInputMessage() { + private void printPlayerNamesInputMessage() { System.out.println("게임에 참여할 사람의 이름을 입력하세요.(쉼표 기준으로 분리)"); } - private static void printAskingForAnotherCardMessage(final String name) { + private void printAskingForAnotherCardMessage(final String name) { printLineSeparator(); System.out.println(name + "는 한장의 카드를 더 받겠습니까?(예는 " + HIT.getMessage() + ", 아니오는 " + STAND.getMessage() + ")"); } - private static void printLineSeparator() { + private void printLineSeparator() { System.out.println(); } } diff --git a/src/main/java/blackjack/view/MessageResolver.java b/src/main/java/blackjack/view/MessageResolver.java new file mode 100644 index 00000000000..9bd234a2967 --- /dev/null +++ b/src/main/java/blackjack/view/MessageResolver.java @@ -0,0 +1,109 @@ +package blackjack.view; + +import blackjack.domain.card.Card; +import blackjack.domain.card.CardNumber; +import blackjack.domain.card.CardShape; +import blackjack.domain.cardgame.CardGameResult; +import blackjack.domain.player.Dealer; +import blackjack.domain.player.Player; + +import java.util.List; +import java.util.Map; +import java.util.stream.Collectors; + +import static blackjack.domain.card.CardNumber.*; +import static blackjack.domain.card.CardShape.CLOVER; +import static blackjack.domain.card.CardShape.DIAMOND; +import static blackjack.domain.card.CardShape.HEART; +import static blackjack.domain.card.CardShape.SPADE; + +public class MessageResolver { + private static final Map CARD_SHAPE_NAME_MAP = Map.of( + SPADE, "스페이드", + HEART, "하트", + DIAMOND, "다이아몬드", + CLOVER, "클로버" + ); + + private static final Map CARD_NUMBER_NAME_MAP = Map.ofEntries( + Map.entry(ACE, "A"), Map.entry(TWO, "2"), + Map.entry(THREE, "3"), Map.entry(FOUR, "4"), + Map.entry(FIVE, "5"), Map.entry(SIX, "6"), + Map.entry(SEVEN, "7"), Map.entry(EIGHT, "8"), + Map.entry(NINE, "9"), Map.entry(TEN, "10"), + Map.entry(JACK, "J"), Map.entry(QUEEN, "Q"), + Map.entry(KING, "K") + ); + + private static final String LINE_SEPARATOR = System.lineSeparator(); + private static final String PLAYERS_NAME_DELIMITER = ", "; + + public String resolveInitialHandOfEachPlayer(final Dealer dealer, final List players) { + final String initialDistributionMessage = resolveInitialDistributionMessage(dealer, players); + final String dealerCardMessage = resolveDealerCard(dealer); + final String playersCardMessage = players.stream().map(this::resolvePlayerCard).collect(Collectors.joining(LINE_SEPARATOR)); + return String.join(LINE_SEPARATOR, initialDistributionMessage, dealerCardMessage, playersCardMessage); + } + + private String resolveInitialDistributionMessage(final Dealer dealer, final List players) { + final String playerNames = resolvePlayerNames(players); + final String message = String.format("%s와 %s에게 2장을 나누었습니다.", dealer.getName(), playerNames); + return String.join("", LINE_SEPARATOR, message); + } + + private String resolvePlayerNames(final List players) { + return players.stream() + .map(Player::getName) + .collect(Collectors.joining(PLAYERS_NAME_DELIMITER)); + } + + private String resolveDealerCard(final Dealer dealer) { + final Card card = dealer.getFirstCard(); + return String.join(": ", dealer.getName(), resolveCardInfo(card)); + } + + public String resolvePlayerCard(final Player player) { + return resolvePlayerCardInfo(player); + } + + public String resolveDealerHitMessage(final Dealer dealer) { + final String dealerHitMessage = String.format("%s는 16이하라 한장의 카드를 더 받았습니다.", dealer.getName()); + return String.join("", dealerHitMessage, LINE_SEPARATOR); + } + + public String resolvePlayerCardWithScore(final Player player) { + return String.format("%s - 결과: %d", resolvePlayerCardInfo(player), player.getScore()); + } + + public String resolveResult(final CardGameResult cardGameResult) { + final String resultOfDealer = resolveResultOfDealer(cardGameResult); + final String resultOfEachPlayer = resolveResultOfEachPlayer(cardGameResult); + return String.join("", resultOfDealer, LINE_SEPARATOR, resultOfEachPlayer); + } + + private String resolveResultOfDealer(final CardGameResult cardGameResult) { + final String prefix = String.join("", LINE_SEPARATOR, "## 최종 승패"); + final String message = String.format("딜러: %d승 %d패", cardGameResult.getDealerWinCount(), cardGameResult.getDealerLoseCount()); + return String.join("", prefix, LINE_SEPARATOR, message); + } + + private String resolveResultOfEachPlayer(final CardGameResult cardGameResult) { + return cardGameResult.totalResult() + .entrySet() + .stream() + .map(result -> result.getKey().getName() + ": " + result.getValue().getValue()) + .collect(Collectors.joining(LINE_SEPARATOR)); + } + + private String resolvePlayerCardInfo(final Player player) { + final String cardsInfo = player.getCards() + .stream() + .map(this::resolveCardInfo) + .collect(Collectors.joining(", ")); + return String.format("%s카드: %s", player.getName(), cardsInfo); + } + + private String resolveCardInfo(final Card card) { + return CARD_NUMBER_NAME_MAP.get(card.getNumber()) + CARD_SHAPE_NAME_MAP.get(card.getShape()); + } +} diff --git a/src/main/java/blackjack/view/OutputView.java b/src/main/java/blackjack/view/OutputView.java index 74e470667e3..edbd1e3dffc 100644 --- a/src/main/java/blackjack/view/OutputView.java +++ b/src/main/java/blackjack/view/OutputView.java @@ -1,113 +1,35 @@ package blackjack.view; -import blackjack.domain.card.Card; -import blackjack.domain.card.CardNumber; -import blackjack.domain.card.CardShape; import blackjack.domain.cardgame.CardGameResult; import blackjack.domain.player.Dealer; import blackjack.domain.player.Player; import java.util.List; -import java.util.Map; -import java.util.stream.Collectors; - -import static blackjack.domain.card.CardNumber.*; -import static blackjack.domain.card.CardShape.CLOVER; -import static blackjack.domain.card.CardShape.DIAMOND; -import static blackjack.domain.card.CardShape.HEART; -import static blackjack.domain.card.CardShape.SPADE; -import static blackjack.domain.cardgame.WinningStatus.LOSE; -import static blackjack.domain.cardgame.WinningStatus.WIN; public class OutputView { - private static final Map CARD_SHAPE_NAME_MAP = Map.of( - SPADE, "스페이드", - HEART, "하트", - DIAMOND, "다이아몬드", - CLOVER, "클로버" - ); - - private static final Map CARD_NUMBER_NAME_MAP = Map.ofEntries( - Map.entry(ACE, "A"), Map.entry(TWO, "2"), - Map.entry(THREE, "3"), Map.entry(FOUR, "4"), - Map.entry(FIVE, "5"), Map.entry(SIX, "6"), - Map.entry(SEVEN, "7"), Map.entry(EIGHT, "8"), - Map.entry(NINE, "9"), Map.entry(TEN, "10"), - Map.entry(JACK, "J"), Map.entry(QUEEN, "Q"), - Map.entry(KING, "K") - ); - - public static void printInitialHandOfEachPlayer(final Dealer dealer, final List players) { - printInitialDistributionMessage(dealer, players); - printDealerCard(dealer); - players.forEach(OutputView::printPlayerCard); - } - - private static void printInitialDistributionMessage(final Dealer dealer, final List players) { - final String names = players.stream() - .map(Player::getName) - .collect(Collectors.joining(", ")); - - printLineSeparator(); - final String initialDistributionMessage = String.format("%s와 %s에게 2장을 나누었습니다.", dealer.getName(), names); - System.out.println(initialDistributionMessage); - } - - private static void printDealerCard(final Dealer dealer) { - final Card card = dealer.getFirstCard(); - System.out.println(dealer.getName() + ": " + getCardInfo(card)); - } - - public static void printPlayerCard(final Player player) { - String playerCardInfo = getPlayerCardInfo(player); - System.out.println(playerCardInfo); - } - - public static void printDealerHitMessage(final Dealer dealer) { - final String dealerHitMessage = String.format("%s는 16이하라 한장의 카드를 더 받았습니다.", dealer.getName()); - System.out.println(dealerHitMessage); - printLineSeparator(); - } - - public static void printPlayerCardWithScore(final Player player) { - String playerCardInfo = getPlayerCardInfo(player); - System.out.println(playerCardInfo + " - 결과: " + player.getScore()); - } + private final MessageResolver messageResolver; - public static void printResult(final CardGameResult cardGameResult) { - printResultOfDealer(cardGameResult); - printResultOfEachPlayer(cardGameResult); + public OutputView(final MessageResolver messageResolver) { + this.messageResolver = messageResolver; } - private static void printResultOfDealer(final CardGameResult cardGameResult) { - printLineSeparator(); - System.out.println("## 최종 승패"); - System.out.println("딜러: " + - cardGameResult.getDealerWinCount() + WIN.getValue() + " " + - cardGameResult.getDealerLoseCount() + LOSE.getValue()); + public void printInitialHandOfEachPlayer(final Dealer dealer, final List players) { + System.out.println(messageResolver.resolveInitialHandOfEachPlayer(dealer, players)); } - private static void printResultOfEachPlayer(final CardGameResult cardGameResult) { - cardGameResult.totalResult() - .entrySet() - .stream() - .map(result -> result.getKey().getName() + ": " + result.getValue().getValue()) - .forEach(System.out::println); + public void printPlayerCard(final Player player) { + System.out.println(messageResolver.resolvePlayerCard(player)); } - private static String getPlayerCardInfo(final Player player) { - return player.getName() + "카드: " + - player.getCards() - .stream() - .map(OutputView::getCardInfo) - .collect(Collectors.joining(", ")); + public void printDealerHitMessage(final Dealer dealer) { + System.out.println(messageResolver.resolveDealerHitMessage(dealer)); } - private static String getCardInfo(final Card card) { - return CARD_NUMBER_NAME_MAP.get(card.getNumber()) + CARD_SHAPE_NAME_MAP.get(card.getShape()); + public void printPlayerCardWithScore(final Player player) { + System.out.println(messageResolver.resolvePlayerCardWithScore(player)); } - private static void printLineSeparator() { - System.out.println(); + public void printResult(final CardGameResult cardGameResult) { + System.out.println(messageResolver.resolveResult(cardGameResult)); } } From 1b673851759db017f6052b67420cf480b3a201ce Mon Sep 17 00:00:00 2001 From: 3juhwan <13selfesteem91@naver.com> Date: Mon, 11 Mar 2024 23:07:34 +0900 Subject: [PATCH 49/56] =?UTF-8?q?style:=20=EB=B6=88=ED=95=84=EC=9A=94?= =?UTF-8?q?=ED=95=9C=20=EA=B3=B5=EB=B0=B1=20=EC=A0=9C=EA=B1=B0?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- src/test/java/blackjack/domain/card/CardTest.java | 2 -- .../java/blackjack/domain/cardgame/CardDeckTest.java | 1 - .../blackjack/domain/cardgame/CardGameResultTest.java | 9 +++------ src/test/java/blackjack/domain/player/DealerTest.java | 1 - src/test/java/blackjack/domain/player/PlayerTest.java | 1 - 5 files changed, 3 insertions(+), 11 deletions(-) diff --git a/src/test/java/blackjack/domain/card/CardTest.java b/src/test/java/blackjack/domain/card/CardTest.java index a788e638056..4ee68e37d4b 100644 --- a/src/test/java/blackjack/domain/card/CardTest.java +++ b/src/test/java/blackjack/domain/card/CardTest.java @@ -8,7 +8,6 @@ import static org.assertj.core.api.Assertions.assertThat; public class CardTest { - @Test void 에이스_카드인지_확인한다() { Card aceCard = new Card(ACE, HEART); @@ -22,5 +21,4 @@ public class CardTest { assertThat(notAceCard.isAceCard()).isFalse(); } - } diff --git a/src/test/java/blackjack/domain/cardgame/CardDeckTest.java b/src/test/java/blackjack/domain/cardgame/CardDeckTest.java index 9d0aa0787c5..1206243f747 100644 --- a/src/test/java/blackjack/domain/cardgame/CardDeckTest.java +++ b/src/test/java/blackjack/domain/cardgame/CardDeckTest.java @@ -7,7 +7,6 @@ import static org.assertj.core.api.Assertions.assertThatThrownBy; public class CardDeckTest { - @Test void 덱에서_카드를_뽑을_수_있다() { CardDeck deck = CardDeck.create(); diff --git a/src/test/java/blackjack/domain/cardgame/CardGameResultTest.java b/src/test/java/blackjack/domain/cardgame/CardGameResultTest.java index 6d6918af764..4fce3ca1f28 100644 --- a/src/test/java/blackjack/domain/cardgame/CardGameResultTest.java +++ b/src/test/java/blackjack/domain/cardgame/CardGameResultTest.java @@ -1,9 +1,6 @@ package blackjack.domain.cardgame; -import blackjack.domain.cardgame.CardGameResult; -import blackjack.domain.cardgame.WinningStatus; import blackjack.domain.player.Player; -import org.assertj.core.api.Assertions; import org.junit.jupiter.api.Test; import java.util.LinkedHashMap; @@ -12,9 +9,9 @@ import static blackjack.domain.cardgame.WinningStatus.LOSE; import static blackjack.domain.cardgame.WinningStatus.WIN; import static blackjack.fixture.PlayerFixture.player; +import static org.assertj.core.api.Assertions.assertThat; class CardGameResultTest { - @Test void 딜러가_승패_횟수를_계산할_수_있다() { Map result = new LinkedHashMap<>(); @@ -27,7 +24,7 @@ class CardGameResultTest { int dealerWinCount = cardGameResult.getDealerWinCount(); int dealerLoseCount = cardGameResult.getDealerLoseCount(); - Assertions.assertThat(dealerWinCount).isEqualTo(1); - Assertions.assertThat(dealerLoseCount).isEqualTo(2); + assertThat(dealerWinCount).isEqualTo(1); + assertThat(dealerLoseCount).isEqualTo(2); } } diff --git a/src/test/java/blackjack/domain/player/DealerTest.java b/src/test/java/blackjack/domain/player/DealerTest.java index a73bee60c51..dc61c37f64f 100644 --- a/src/test/java/blackjack/domain/player/DealerTest.java +++ b/src/test/java/blackjack/domain/player/DealerTest.java @@ -62,7 +62,6 @@ class DealerTest { new Card(KING, CLOVER), new Card(KING, HEART), new Card(KING, SPADE)); - Dealer dealer = dealer( new Card(QUEEN, CLOVER), new Card(QUEEN, HEART), diff --git a/src/test/java/blackjack/domain/player/PlayerTest.java b/src/test/java/blackjack/domain/player/PlayerTest.java index 166025abcbc..cfa54ae0953 100644 --- a/src/test/java/blackjack/domain/player/PlayerTest.java +++ b/src/test/java/blackjack/domain/player/PlayerTest.java @@ -11,7 +11,6 @@ import static org.assertj.core.api.Assertions.assertThat; public class PlayerTest { - @Test void 플레이어는_죽었는지_여부를_반환한다() { Player player = player( From 67708046e51928906a56d42c91db9376678430c7 Mon Sep 17 00:00:00 2001 From: 3juhwan <13selfesteem91@naver.com> Date: Tue, 12 Mar 2024 00:30:32 +0900 Subject: [PATCH 50/56] =?UTF-8?q?refactor:=20=EB=8D=B1=20=EC=83=9D?= =?UTF-8?q?=EC=84=B1=20=EB=A1=9C=EC=A7=81=EC=97=90=20=EC=8A=A4=ED=8A=B8?= =?UTF-8?q?=EB=A6=BC=20=EC=A0=81=EC=9A=A9?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../blackjack/domain/cardgame/CardDeck.java | 21 ++++++++++++++----- .../blackjack/domain/cardgame/CardGame.java | 2 +- .../domain/cardgame/CardDeckTest.java | 4 ++-- .../blackjack/domain/player/NameTest.java | 6 +++--- 4 files changed, 22 insertions(+), 11 deletions(-) diff --git a/src/main/java/blackjack/domain/cardgame/CardDeck.java b/src/main/java/blackjack/domain/cardgame/CardDeck.java index bbeeaa29d91..1b09ce6f189 100644 --- a/src/main/java/blackjack/domain/cardgame/CardDeck.java +++ b/src/main/java/blackjack/domain/cardgame/CardDeck.java @@ -4,8 +4,11 @@ import blackjack.domain.card.CardNumber; import blackjack.domain.card.CardShape; +import java.util.Arrays; import java.util.Collections; +import java.util.List; import java.util.Stack; +import java.util.stream.Stream; public class CardDeck { private final Stack deck; @@ -14,17 +17,25 @@ private CardDeck(Stack deck) { this.deck = deck; } - static CardDeck create() { + static CardDeck createShuffledDeck() { + final List allKindOfCards = Arrays.stream(CardShape.values()) + .flatMap(CardDeck::createEachNumber) + .toList(); + final Stack deck = new Stack<>(); - for (final CardNumber cardNumber : CardNumber.values()) { - for (final CardShape cardShape : CardShape.values()) { - deck.push(new Card(cardNumber, cardShape)); - } + for (final Card card : allKindOfCards) { + deck.push(card); } + Collections.shuffle(deck); return new CardDeck(deck); } + private static Stream createEachNumber(final CardShape cardShape) { + return Arrays.stream(CardNumber.values()) + .map(cardNumber -> new Card(cardNumber, cardShape)); + } + Card draw() { if (deck.empty()) { throw new IllegalArgumentException("카드가 존재하지 않습니다."); diff --git a/src/main/java/blackjack/domain/cardgame/CardGame.java b/src/main/java/blackjack/domain/cardgame/CardGame.java index de7e3092232..238d4a1a3f2 100644 --- a/src/main/java/blackjack/domain/cardgame/CardGame.java +++ b/src/main/java/blackjack/domain/cardgame/CardGame.java @@ -11,7 +11,7 @@ public class CardGame { private final CardDeck cardDeck; public CardGame() { - this.cardDeck = CardDeck.create(); + this.cardDeck = CardDeck.createShuffledDeck(); } public void initializeHand(final Dealer dealer, final List players) { diff --git a/src/test/java/blackjack/domain/cardgame/CardDeckTest.java b/src/test/java/blackjack/domain/cardgame/CardDeckTest.java index 1206243f747..0c74c2a957c 100644 --- a/src/test/java/blackjack/domain/cardgame/CardDeckTest.java +++ b/src/test/java/blackjack/domain/cardgame/CardDeckTest.java @@ -9,7 +9,7 @@ public class CardDeckTest { @Test void 덱에서_카드를_뽑을_수_있다() { - CardDeck deck = CardDeck.create(); + CardDeck deck = CardDeck.createShuffledDeck(); Card card = deck.draw(); @@ -18,7 +18,7 @@ public class CardDeckTest { @Test void 덱에_정확히_52장의_카드가_존재한다() { - CardDeck deck = CardDeck.create(); + CardDeck deck = CardDeck.createShuffledDeck(); for (int ignored = 0; ignored < 52; ignored++) { deck.draw(); diff --git a/src/test/java/blackjack/domain/player/NameTest.java b/src/test/java/blackjack/domain/player/NameTest.java index 04d57f3b476..f19063006a6 100644 --- a/src/test/java/blackjack/domain/player/NameTest.java +++ b/src/test/java/blackjack/domain/player/NameTest.java @@ -1,15 +1,15 @@ package blackjack.domain.player; -import blackjack.domain.player.Name; -import org.assertj.core.api.Assertions; import org.junit.jupiter.params.ParameterizedTest; import org.junit.jupiter.params.provider.ValueSource; +import static org.assertj.core.api.Assertions.assertThatThrownBy; + public class NameTest { @ParameterizedTest @ValueSource(strings = {"", "01234567890"}) void 이름의_길이는_1이상_10이하여야_한다(String value) { - Assertions.assertThatCode(() -> new Name(value)) + assertThatThrownBy(() -> new Name(value)) .isInstanceOf(IllegalArgumentException.class); } } From f6821498ca0fc3988be14b8a28ae9ebc52a39515 Mon Sep 17 00:00:00 2001 From: 3juhwan <13selfesteem91@naver.com> Date: Wed, 13 Mar 2024 09:57:54 +0900 Subject: [PATCH 51/56] =?UTF-8?q?refactor:=20=EB=B6=88=ED=95=84=EC=9A=94?= =?UTF-8?q?=ED=95=9C=20=EC=9C=84=EC=9E=84=20=EB=A9=94=EC=84=9C=EB=93=9C=20?= =?UTF-8?q?=EC=82=AD=EC=A0=9C?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- src/main/java/blackjack/domain/cardgame/CardGame.java | 8 -------- 1 file changed, 8 deletions(-) diff --git a/src/main/java/blackjack/domain/cardgame/CardGame.java b/src/main/java/blackjack/domain/cardgame/CardGame.java index 238d4a1a3f2..3367cbf86b1 100644 --- a/src/main/java/blackjack/domain/cardgame/CardGame.java +++ b/src/main/java/blackjack/domain/cardgame/CardGame.java @@ -15,15 +15,7 @@ public CardGame() { } public void initializeHand(final Dealer dealer, final List players) { - giveDealerInitialCards(dealer); - giveEachPlayerInitialCards(players); - } - - private void giveDealerInitialCards(final Dealer dealer) { giveInitialCards(dealer); - } - - private void giveEachPlayerInitialCards(final List players) { for (final Player player : players) { giveInitialCards(player); } From 0279a2e8f79aa560a2d337561903fc4addc54e6e Mon Sep 17 00:00:00 2001 From: 3juhwan <13selfesteem91@naver.com> Date: Wed, 13 Mar 2024 11:40:41 +0900 Subject: [PATCH 52/56] =?UTF-8?q?test:=20=EA=B2=8C=EC=9E=84=20=EA=B2=B0?= =?UTF-8?q?=EA=B3=BC=EC=97=90=EC=84=9C=20=ED=94=8C=EB=A0=88=EC=9D=B4?= =?UTF-8?q?=EC=96=B4=EA=B0=80=20=EC=88=9C=EC=84=9C=EB=8C=80=EB=A1=9C=20?= =?UTF-8?q?=EB=B0=98=ED=99=98=EB=90=98=EB=8A=94=EC=A7=80=20=ED=85=8C?= =?UTF-8?q?=EC=8A=A4=ED=8A=B8?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../java/blackjack/domain/player/DealerTest.java | 14 ++++++++++++++ 1 file changed, 14 insertions(+) diff --git a/src/test/java/blackjack/domain/player/DealerTest.java b/src/test/java/blackjack/domain/player/DealerTest.java index dc61c37f64f..fcfc56b94cd 100644 --- a/src/test/java/blackjack/domain/player/DealerTest.java +++ b/src/test/java/blackjack/domain/player/DealerTest.java @@ -133,4 +133,18 @@ class DealerTest { assertThat(result.get(player)).isEqualTo(WinningStatus.PUSH); } + + @Test + void 게임_결과에서_플레이어가_순서를_유지하고_있다() { + Player playerA = player(new Card(TWO, HEART)); + Player playerB = player(new Card(TWO, SPADE)); + Player playerC = player(new Card(TWO, CLOVER)); + Player playerD = player(new Card(TWO, DIAMOND)); + Dealer dealer = dealer(new Card(ACE, HEART)); + + var result = dealer.judgeWithPlayers(List.of(playerA, playerB, playerC, playerD)) + .totalResult(); + + assertThat(result.keySet()).containsExactly(playerA, playerB, playerC, playerD); + } } From e983f17f86a23111175671ebae2cb5f9cae94f1b Mon Sep 17 00:00:00 2001 From: 3juhwan <13selfesteem91@naver.com> Date: Wed, 13 Mar 2024 16:20:26 +0900 Subject: [PATCH 53/56] =?UTF-8?q?refactor:=20CardGame=EC=9D=98=20=EC=97=AD?= =?UTF-8?q?=ED=95=A0=EC=9D=84=20Deck=EC=9C=BC=EB=A1=9C=20=EC=9D=B4?= =?UTF-8?q?=EB=8F=99?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../java/blackjack/BlackjackController.java | 25 +++++++----- .../blackjack/domain/cardgame/CardDeck.java | 39 +++++++++++------- .../blackjack/domain/cardgame/CardGame.java | 33 --------------- .../domain/cardgame/CardDeckTest.java | 37 +++++++++++------ .../domain/cardgame/CardGameTest.java | 40 ------------------- 5 files changed, 66 insertions(+), 108 deletions(-) delete mode 100644 src/main/java/blackjack/domain/cardgame/CardGame.java delete mode 100644 src/test/java/blackjack/domain/cardgame/CardGameTest.java diff --git a/src/main/java/blackjack/BlackjackController.java b/src/main/java/blackjack/BlackjackController.java index a0afe0465b2..1c29909cf27 100644 --- a/src/main/java/blackjack/BlackjackController.java +++ b/src/main/java/blackjack/BlackjackController.java @@ -1,6 +1,6 @@ package blackjack; -import blackjack.domain.cardgame.CardGame; +import blackjack.domain.cardgame.CardDeck; import blackjack.domain.cardgame.CardGameResult; import blackjack.domain.player.Dealer; import blackjack.domain.player.Player; @@ -19,34 +19,41 @@ public class BlackjackController { } public void run() { - final CardGame cardGame = new CardGame(); final List names = inputView.askPlayerNames(); final Dealer dealer = new Dealer(); final List players = names.stream().map(Player::new).toList(); + final CardDeck deck = CardDeck.createShuffledDeck(); - cardGame.initializeHand(dealer, players); + initializeHand(deck, dealer, players); outputView.printInitialHandOfEachPlayer(dealer, players); for (final Player player : players) { - givePlayerMoreCardsIfWanted(cardGame, player); + givePlayerMoreCardsIfWanted(deck, player); } - giveDealerMoreCardsIfNeeded(cardGame, dealer); + giveDealerMoreCardsIfNeeded(deck, dealer); printHandStatusOfEachPlayer(dealer, players); printCardGameResult(dealer, players); } - private void givePlayerMoreCardsIfWanted(final CardGame cardGame, final Player player) { + private void initializeHand(final CardDeck deck, final Dealer dealer, final List players) { + deck.giveInitialCards(dealer); + for (final Player player : players) { + deck.giveInitialCards(player); + } + } + + private void givePlayerMoreCardsIfWanted(final CardDeck deck, final Player player) { final String playerName = player.getName(); while (player.isAlive() && inputView.askForMoreCard(playerName)) { - cardGame.giveCard(player); + deck.giveCard(player); outputView.printPlayerCard(player); } } - private void giveDealerMoreCardsIfNeeded(final CardGame cardGame, final Dealer dealer) { + private void giveDealerMoreCardsIfNeeded(final CardDeck deck, final Dealer dealer) { while (dealer.isMoreCardNeeded()) { - cardGame.giveCard(dealer); + deck.giveCard(dealer); outputView.printDealerHitMessage(dealer); } } diff --git a/src/main/java/blackjack/domain/cardgame/CardDeck.java b/src/main/java/blackjack/domain/cardgame/CardDeck.java index 1b09ce6f189..e1137d35606 100644 --- a/src/main/java/blackjack/domain/cardgame/CardDeck.java +++ b/src/main/java/blackjack/domain/cardgame/CardDeck.java @@ -3,32 +3,33 @@ import blackjack.domain.card.Card; import blackjack.domain.card.CardNumber; import blackjack.domain.card.CardShape; +import blackjack.domain.player.Player; import java.util.Arrays; import java.util.Collections; +import java.util.Deque; +import java.util.LinkedList; import java.util.List; -import java.util.Stack; +import java.util.stream.Collectors; import java.util.stream.Stream; public class CardDeck { - private final Stack deck; + private static final int INITIAL_CARD_NUMBER = 2; - private CardDeck(Stack deck) { + private final Deque deck; + + private CardDeck(Deque deck) { this.deck = deck; } - static CardDeck createShuffledDeck() { + public static CardDeck createShuffledDeck() { final List allKindOfCards = Arrays.stream(CardShape.values()) .flatMap(CardDeck::createEachNumber) - .toList(); + .collect(Collectors.toList()); - final Stack deck = new Stack<>(); - for (final Card card : allKindOfCards) { - deck.push(card); - } + Collections.shuffle(allKindOfCards); - Collections.shuffle(deck); - return new CardDeck(deck); + return new CardDeck(new LinkedList<>(allKindOfCards)); } private static Stream createEachNumber(final CardShape cardShape) { @@ -36,9 +37,19 @@ private static Stream createEachNumber(final CardShape cardShape) { .map(cardNumber -> new Card(cardNumber, cardShape)); } - Card draw() { - if (deck.empty()) { - throw new IllegalArgumentException("카드가 존재하지 않습니다."); + public void giveInitialCards(Player player) { + for (int i = 0; i < INITIAL_CARD_NUMBER; i++) { + giveCard(player); + } + } + + public void giveCard(final Player player) { + player.addCard(this.draw()); + } + + private Card draw() { + if (deck.size() == 0) { + throw new IllegalStateException("카드가 존재하지 않습니다."); } return deck.pop(); diff --git a/src/main/java/blackjack/domain/cardgame/CardGame.java b/src/main/java/blackjack/domain/cardgame/CardGame.java deleted file mode 100644 index 3367cbf86b1..00000000000 --- a/src/main/java/blackjack/domain/cardgame/CardGame.java +++ /dev/null @@ -1,33 +0,0 @@ -package blackjack.domain.cardgame; - -import blackjack.domain.player.Dealer; -import blackjack.domain.player.Player; - -import java.util.List; - -public class CardGame { - private static final int INITIAL_CARD_NUMBER = 2; - - private final CardDeck cardDeck; - - public CardGame() { - this.cardDeck = CardDeck.createShuffledDeck(); - } - - public void initializeHand(final Dealer dealer, final List players) { - giveInitialCards(dealer); - for (final Player player : players) { - giveInitialCards(player); - } - } - - private void giveInitialCards(Player player) { - for (int i = 0; i < INITIAL_CARD_NUMBER; i++) { - giveCard(player); - } - } - - public void giveCard(final Player player) { - player.addCard(cardDeck.draw()); - } -} diff --git a/src/test/java/blackjack/domain/cardgame/CardDeckTest.java b/src/test/java/blackjack/domain/cardgame/CardDeckTest.java index 0c74c2a957c..2b736166086 100644 --- a/src/test/java/blackjack/domain/cardgame/CardDeckTest.java +++ b/src/test/java/blackjack/domain/cardgame/CardDeckTest.java @@ -1,31 +1,44 @@ package blackjack.domain.cardgame; -import blackjack.domain.card.Card; +import blackjack.domain.player.Player; import org.junit.jupiter.api.Test; +import static blackjack.fixture.PlayerFixture.player; import static org.assertj.core.api.Assertions.assertThat; -import static org.assertj.core.api.Assertions.assertThatThrownBy; +import static org.assertj.core.api.AssertionsForClassTypes.assertThatThrownBy; public class CardDeckTest { @Test - void 덱에서_카드를_뽑을_수_있다() { + void 덱에_정확히_52장의_카드가_존재한다() { CardDeck deck = CardDeck.createShuffledDeck(); + Player player = player(); - Card card = deck.draw(); + for (int ignored = 0; ignored < 52; ignored++) { + deck.giveCard(player); + } - assertThat(card).isNotNull(); + assertThatThrownBy(() -> deck.giveCard(player)) + .isInstanceOf(IllegalStateException.class) + .hasMessage("카드가 존재하지 않습니다."); } @Test - void 덱에_정확히_52장의_카드가_존재한다() { + void 카드_한_장을_플레이어에게_지급한다() { CardDeck deck = CardDeck.createShuffledDeck(); + Player player = player(); - for (int ignored = 0; ignored < 52; ignored++) { - deck.draw(); - } + deck.giveCard(player); - assertThatThrownBy(deck::draw) - .isInstanceOf(IllegalArgumentException.class) - .hasMessage("카드가 존재하지 않습니다."); + assertThat(player.getCards().size()).isEqualTo(1); + } + + @Test + void 플레이어에게_최초_2개의_카드를_지급한다() { + CardDeck deck = CardDeck.createShuffledDeck(); + Player player = player(); + + deck.giveInitialCards(player); + + assertThat(player.getCards().size()).isEqualTo(2); } } diff --git a/src/test/java/blackjack/domain/cardgame/CardGameTest.java b/src/test/java/blackjack/domain/cardgame/CardGameTest.java deleted file mode 100644 index 800c0fe7e8f..00000000000 --- a/src/test/java/blackjack/domain/cardgame/CardGameTest.java +++ /dev/null @@ -1,40 +0,0 @@ -package blackjack.domain.cardgame; - -import blackjack.domain.player.Dealer; -import blackjack.domain.player.Player; -import org.junit.jupiter.api.Test; - -import java.util.List; - -import static blackjack.fixture.PlayerFixture.dealer; -import static blackjack.fixture.PlayerFixture.player; -import static org.assertj.core.api.Assertions.assertThat; -import static org.assertj.core.api.SoftAssertions.assertSoftly; - -public class CardGameTest { - @Test - void 카드_한_장을_플레이어에게_지급한다() { - Player mangcho = player(); - - CardGame cardGame = new CardGame(); - cardGame.giveCard(mangcho); - - assertThat(mangcho.getCards().size()).isEqualTo(1); - } - - @Test - void 딜러와_모든_플레이어에게_카드_2장을_지급한다() { - Dealer dealer = dealer(); - Player mangcho = player(); - Player ddang = player(); - - CardGame cardGame = new CardGame(); - cardGame.initializeHand(dealer, List.of(mangcho, ddang)); - - assertSoftly(softly -> { - softly.assertThat(dealer.getCards().size()).isEqualTo(2); - softly.assertThat(mangcho.getCards().size()).isEqualTo(2); - softly.assertThat(ddang.getCards().size()).isEqualTo(2); - }); - } -} From c2aafeff02aa3a9eb4b29dee2873004afb2d8274 Mon Sep 17 00:00:00 2001 From: 3juhwan <13selfesteem91@naver.com> Date: Wed, 13 Mar 2024 16:50:30 +0900 Subject: [PATCH 54/56] =?UTF-8?q?refactor:=20=EC=8A=B9=ED=8C=A8=20?= =?UTF-8?q?=EA=B2=B0=EA=B3=BC=EC=97=90=20=EB=8C=80=ED=95=9C=20=EA=B2=B0?= =?UTF-8?q?=EA=B3=BC=20=EB=AC=B8=EC=9E=90=EC=97=B4=EC=9D=84=20=EB=B7=B0?= =?UTF-8?q?=EB=A1=9C=20=EC=9D=B4=EB=8F=99?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../blackjack/domain/cardgame/WinningStatus.java | 16 +++------------- .../java/blackjack/view/MessageResolver.java | 12 +++++++++++- 2 files changed, 14 insertions(+), 14 deletions(-) diff --git a/src/main/java/blackjack/domain/cardgame/WinningStatus.java b/src/main/java/blackjack/domain/cardgame/WinningStatus.java index dce985c7e14..ceda943d855 100644 --- a/src/main/java/blackjack/domain/cardgame/WinningStatus.java +++ b/src/main/java/blackjack/domain/cardgame/WinningStatus.java @@ -1,17 +1,7 @@ package blackjack.domain.cardgame; public enum WinningStatus { - WIN("승"), - PUSH("무"), - LOSE("패"); - - private final String value; - - WinningStatus(final String value) { - this.value = value; - } - - public String getValue() { - return value; - } + WIN, + PUSH, + LOSE } diff --git a/src/main/java/blackjack/view/MessageResolver.java b/src/main/java/blackjack/view/MessageResolver.java index 9bd234a2967..6b718f98850 100644 --- a/src/main/java/blackjack/view/MessageResolver.java +++ b/src/main/java/blackjack/view/MessageResolver.java @@ -4,6 +4,7 @@ import blackjack.domain.card.CardNumber; import blackjack.domain.card.CardShape; import blackjack.domain.cardgame.CardGameResult; +import blackjack.domain.cardgame.WinningStatus; import blackjack.domain.player.Dealer; import blackjack.domain.player.Player; @@ -16,6 +17,9 @@ import static blackjack.domain.card.CardShape.DIAMOND; import static blackjack.domain.card.CardShape.HEART; import static blackjack.domain.card.CardShape.SPADE; +import static blackjack.domain.cardgame.WinningStatus.LOSE; +import static blackjack.domain.cardgame.WinningStatus.PUSH; +import static blackjack.domain.cardgame.WinningStatus.WIN; public class MessageResolver { private static final Map CARD_SHAPE_NAME_MAP = Map.of( @@ -35,6 +39,12 @@ public class MessageResolver { Map.entry(KING, "K") ); + private static final Map WINNING_STATUS_NAME_MAP = Map.of( + WIN, "승", + PUSH, "무", + LOSE, "패" + ); + private static final String LINE_SEPARATOR = System.lineSeparator(); private static final String PLAYERS_NAME_DELIMITER = ", "; @@ -91,7 +101,7 @@ private String resolveResultOfEachPlayer(final CardGameResult cardGameResult) { return cardGameResult.totalResult() .entrySet() .stream() - .map(result -> result.getKey().getName() + ": " + result.getValue().getValue()) + .map(result -> result.getKey().getName() + ": " + WINNING_STATUS_NAME_MAP.get(result.getValue())) .collect(Collectors.joining(LINE_SEPARATOR)); } From 07d47c68728e233c34f2446ae9a3d2a7aead1176 Mon Sep 17 00:00:00 2001 From: 3juhwan <13selfesteem91@naver.com> Date: Wed, 13 Mar 2024 17:40:10 +0900 Subject: [PATCH 55/56] =?UTF-8?q?refactor:=20BUST=20=EC=A1=B0=EA=B1=B4?= =?UTF-8?q?=EC=97=90=20=EB=8C=80=ED=95=9C=20=EB=8B=A4=EB=A5=B8=20=ED=81=B4?= =?UTF-8?q?=EB=9E=98=EC=8A=A4=EC=9D=98=20=EC=9D=98=EC=A1=B4=EC=84=B1=20?= =?UTF-8?q?=EC=A0=9C=EA=B1=B0?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../domain/cardgame/WinningStatus.java | 21 +++++++++++++++++- .../java/blackjack/domain/player/Dealer.java | 22 +++---------------- .../java/blackjack/domain/player/Hand.java | 7 +++--- .../java/blackjack/domain/player/Player.java | 6 ++--- .../blackjack/domain/player/HandTest.java | 8 +++---- 5 files changed, 33 insertions(+), 31 deletions(-) diff --git a/src/main/java/blackjack/domain/cardgame/WinningStatus.java b/src/main/java/blackjack/domain/cardgame/WinningStatus.java index ceda943d855..3bfe525c198 100644 --- a/src/main/java/blackjack/domain/cardgame/WinningStatus.java +++ b/src/main/java/blackjack/domain/cardgame/WinningStatus.java @@ -1,7 +1,26 @@ package blackjack.domain.cardgame; +import blackjack.domain.player.Dealer; +import blackjack.domain.player.Player; + public enum WinningStatus { WIN, PUSH, - LOSE + LOSE; + + public static WinningStatus doesPlayerWin(final Dealer dealer, final Player player) { + if (!player.isAlive()) { + return WinningStatus.LOSE; + } + if (!dealer.isAlive()) { + return WinningStatus.WIN; + } + if (dealer.getScore() == player.getScore()) { + return WinningStatus.PUSH; + } + if (dealer.getScore() < player.getScore()) { + return WinningStatus.WIN; + } + return WinningStatus.LOSE; + } } diff --git a/src/main/java/blackjack/domain/player/Dealer.java b/src/main/java/blackjack/domain/player/Dealer.java index 284242d95ae..c8abc4bf847 100644 --- a/src/main/java/blackjack/domain/player/Dealer.java +++ b/src/main/java/blackjack/domain/player/Dealer.java @@ -16,7 +16,7 @@ public Dealer() { } public boolean isMoreCardNeeded() { - return this.hand.getScore(BUST_CONDITION) <= HIT_CONDITION; + return this.getScore() <= HIT_CONDITION; } public Card getFirstCard() { @@ -28,29 +28,13 @@ public Card getFirstCard() { } public CardGameResult judgeWithPlayers(final List players) { - Map result = new LinkedHashMap<>(); + final Map result = new LinkedHashMap<>(); for (final Player player : players) { - WinningStatus winningStatus = doesPlayerWin(this.getScore(), player.getScore()); + WinningStatus winningStatus = WinningStatus.doesPlayerWin(this, player); result.put(player, winningStatus); } return new CardGameResult(result); } - - private WinningStatus doesPlayerWin(final int dealerScore, final int playerScore) { - if (playerScore > BUST_CONDITION) { - return WinningStatus.LOSE; - } - if (dealerScore > BUST_CONDITION) { - return WinningStatus.WIN; - } - if (dealerScore == playerScore) { - return WinningStatus.PUSH; - } - if (dealerScore < playerScore) { - return WinningStatus.WIN; - } - return WinningStatus.LOSE; - } } diff --git a/src/main/java/blackjack/domain/player/Hand.java b/src/main/java/blackjack/domain/player/Hand.java index aa0e76604a3..58049df2272 100644 --- a/src/main/java/blackjack/domain/player/Hand.java +++ b/src/main/java/blackjack/domain/player/Hand.java @@ -6,20 +6,21 @@ import java.util.Collections; import java.util.List; +import static blackjack.domain.player.Player.BUST_CONDITION; + public class Hand { private static final int BONUS_SCORE = 10; private static final int NON_SCORE = 0; private final List cards = new ArrayList<>(); - int getScore(final int bustCondition) { + int getScore() { final int minimumScore = cards.stream() .mapToInt(Card::getScore) .sum(); - final int bonusScore = this.getBonusScore(); - if (minimumScore + bonusScore <= bustCondition) { + if (minimumScore + bonusScore <= BUST_CONDITION) { return minimumScore + bonusScore; } return minimumScore; diff --git a/src/main/java/blackjack/domain/player/Player.java b/src/main/java/blackjack/domain/player/Player.java index b058e2f586f..154842bd580 100644 --- a/src/main/java/blackjack/domain/player/Player.java +++ b/src/main/java/blackjack/domain/player/Player.java @@ -5,7 +5,7 @@ import java.util.List; public class Player { - protected static final int BUST_CONDITION = 21; + static final int BUST_CONDITION = 21; protected final Hand hand; private final Name name; @@ -20,11 +20,11 @@ public final void addCard(final Card card) { } public final boolean isAlive() { - return hand.getScore(BUST_CONDITION) <= BUST_CONDITION; + return hand.getScore() <= BUST_CONDITION; } public final int getScore() { - return hand.getScore(BUST_CONDITION); + return hand.getScore(); } public final List getCards() { diff --git a/src/test/java/blackjack/domain/player/HandTest.java b/src/test/java/blackjack/domain/player/HandTest.java index 65540d8fabe..ee47036d679 100644 --- a/src/test/java/blackjack/domain/player/HandTest.java +++ b/src/test/java/blackjack/domain/player/HandTest.java @@ -11,8 +11,6 @@ import static org.assertj.core.api.Assertions.assertThat; public class HandTest { - private static final int BUST_CONDITION = 21; - @Test void 가진_패의_숫자의_합계를_구할_수_있다() { Hand hand = new Hand(); @@ -20,7 +18,7 @@ public class HandTest { hand.add(new Card(QUEEN, SPADE)); hand.add(new Card(KING, SPADE)); - int sum = hand.getScore(BUST_CONDITION); + int sum = hand.getScore(); assertThat(sum).isEqualTo(30); } @@ -33,7 +31,7 @@ public class HandTest { hand.add(new Card(ACE, SPADE)); hand.add(new Card(ACE, SPADE)); - int sum = hand.getScore(BUST_CONDITION); + int sum = hand.getScore(); assertThat(sum).isEqualTo(14); } @@ -44,7 +42,7 @@ public class HandTest { hand.add(new Card(ACE, SPADE)); hand.add(new Card(KING, SPADE)); - int sum = hand.getScore(BUST_CONDITION); + int sum = hand.getScore(); assertThat(sum).isEqualTo(21); } From 367038804f87eaf1a40b14eb2adaa897356f732d Mon Sep 17 00:00:00 2001 From: 3juhwan <13selfesteem91@naver.com> Date: Wed, 13 Mar 2024 18:08:57 +0900 Subject: [PATCH 56/56] =?UTF-8?q?refactor:=20=EA=B2=8C=EC=9E=84=20?= =?UTF-8?q?=EA=B2=B0=EA=B3=BC=EB=A5=BC=20=EC=83=9D=EC=84=B1=ED=95=98?= =?UTF-8?q?=EB=8A=94=20=EB=A1=9C=EC=A7=81=EC=9D=84=20CardGameResult?= =?UTF-8?q?=EB=A1=9C=20=EC=9D=B4=EB=8F=99?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../java/blackjack/BlackjackController.java | 3 +- .../domain/cardgame/CardGameResult.java | 16 ++- .../java/blackjack/domain/player/Dealer.java | 17 --- .../domain/cardgame/CardGameResultTest.java | 104 ++++++++++++++++++ .../blackjack/domain/player/DealerTest.java | 101 ----------------- 5 files changed, 120 insertions(+), 121 deletions(-) diff --git a/src/main/java/blackjack/BlackjackController.java b/src/main/java/blackjack/BlackjackController.java index 1c29909cf27..8c929b60c8e 100644 --- a/src/main/java/blackjack/BlackjackController.java +++ b/src/main/java/blackjack/BlackjackController.java @@ -66,7 +66,6 @@ private void printHandStatusOfEachPlayer(final Dealer dealer, final List } private void printCardGameResult(final Dealer dealer, final List players) { - final CardGameResult cardGameResult = dealer.judgeWithPlayers(players); - outputView.printResult(cardGameResult); + outputView.printResult(CardGameResult.of(dealer, players)); } } diff --git a/src/main/java/blackjack/domain/cardgame/CardGameResult.java b/src/main/java/blackjack/domain/cardgame/CardGameResult.java index 4a9effd86b6..db68cb3adfb 100644 --- a/src/main/java/blackjack/domain/cardgame/CardGameResult.java +++ b/src/main/java/blackjack/domain/cardgame/CardGameResult.java @@ -1,15 +1,29 @@ package blackjack.domain.cardgame; +import blackjack.domain.player.Dealer; import blackjack.domain.player.Player; import java.util.Collections; +import java.util.LinkedHashMap; +import java.util.List; import java.util.Map; +import java.util.stream.Collectors; import static blackjack.domain.cardgame.WinningStatus.LOSE; import static blackjack.domain.cardgame.WinningStatus.WIN; public record CardGameResult(Map totalResult) { - @Override + public static CardGameResult of(final Dealer dealer, final List players) { + return new CardGameResult( + players.stream() + .collect(Collectors.toMap( + player -> player, + player -> WinningStatus.doesPlayerWin(dealer, player), + (key, value) -> key, + LinkedHashMap::new + ))); + } + public Map totalResult() { return Collections.unmodifiableMap(totalResult); } diff --git a/src/main/java/blackjack/domain/player/Dealer.java b/src/main/java/blackjack/domain/player/Dealer.java index c8abc4bf847..4638b67ac61 100644 --- a/src/main/java/blackjack/domain/player/Dealer.java +++ b/src/main/java/blackjack/domain/player/Dealer.java @@ -1,12 +1,6 @@ package blackjack.domain.player; import blackjack.domain.card.Card; -import blackjack.domain.cardgame.CardGameResult; -import blackjack.domain.cardgame.WinningStatus; - -import java.util.LinkedHashMap; -import java.util.List; -import java.util.Map; public class Dealer extends Player { private static final int HIT_CONDITION = 16; @@ -26,15 +20,4 @@ public Card getFirstCard() { throw new RuntimeException("[ERROR] 딜러가 카드를 갖고 있지 않습니다."); } } - - public CardGameResult judgeWithPlayers(final List players) { - final Map result = new LinkedHashMap<>(); - - for (final Player player : players) { - WinningStatus winningStatus = WinningStatus.doesPlayerWin(this, player); - result.put(player, winningStatus); - } - - return new CardGameResult(result); - } } diff --git a/src/test/java/blackjack/domain/cardgame/CardGameResultTest.java b/src/test/java/blackjack/domain/cardgame/CardGameResultTest.java index 4fce3ca1f28..87b5a405172 100644 --- a/src/test/java/blackjack/domain/cardgame/CardGameResultTest.java +++ b/src/test/java/blackjack/domain/cardgame/CardGameResultTest.java @@ -1,13 +1,25 @@ package blackjack.domain.cardgame; +import blackjack.domain.card.Card; +import blackjack.domain.player.Dealer; import blackjack.domain.player.Player; import org.junit.jupiter.api.Test; import java.util.LinkedHashMap; +import java.util.List; import java.util.Map; +import static blackjack.domain.card.CardNumber.ACE; +import static blackjack.domain.card.CardNumber.KING; +import static blackjack.domain.card.CardNumber.QUEEN; +import static blackjack.domain.card.CardNumber.TWO; +import static blackjack.domain.card.CardShape.CLOVER; +import static blackjack.domain.card.CardShape.DIAMOND; +import static blackjack.domain.card.CardShape.HEART; +import static blackjack.domain.card.CardShape.SPADE; import static blackjack.domain.cardgame.WinningStatus.LOSE; import static blackjack.domain.cardgame.WinningStatus.WIN; +import static blackjack.fixture.PlayerFixture.dealer; import static blackjack.fixture.PlayerFixture.player; import static org.assertj.core.api.Assertions.assertThat; @@ -27,4 +39,96 @@ class CardGameResultTest { assertThat(dealerWinCount).isEqualTo(1); assertThat(dealerLoseCount).isEqualTo(2); } + + @Test + void 딜러와_플레이어_둘다_21을_초과할_경우에_플레이어가_패배한다() { + Player player = player( + new Card(KING, CLOVER), + new Card(KING, HEART), + new Card(KING, SPADE)); + Dealer dealer = dealer( + new Card(QUEEN, CLOVER), + new Card(QUEEN, HEART), + new Card(QUEEN, SPADE)); + + var result = CardGameResult.of(dealer, List.of(player)) + .totalResult(); + + assertThat(result.get(player)).isEqualTo(WinningStatus.LOSE); + } + + @Test + void 딜러와_여러_플레이어의_숫자가_21_이하인_경우_숫자가_큰_사람이_이긴다() { + Player player = player(new Card(KING, SPADE)); + Dealer dealer = dealer(new Card(TWO, SPADE)); + + var result = CardGameResult.of(dealer, List.of(player)) + .totalResult(); + + assertThat(result.get(player)).isEqualTo(WinningStatus.WIN); + } + + @Test + void 카드_합계가_딜러는_21_이하_플레이어는_21_초과인_경우_플레이어가_패배한다() { + Player player = player( + new Card(KING, CLOVER), + new Card(KING, HEART), + new Card(KING, DIAMOND)); + Dealer dealer = dealer(new Card(TWO, HEART)); + + var result = CardGameResult.of(dealer, List.of(player)) + .totalResult(); + + assertThat(result.get(player)).isEqualTo(WinningStatus.LOSE); + } + + @Test + void 카드_합계가_딜러는_21_초과_플레이어는_21_이하인_경우_플레이어가_승리한다() { + Player player = player(new Card(TWO, HEART)); + Dealer dealer = dealer( + new Card(KING, CLOVER), + new Card(KING, HEART), + new Card(KING, SPADE)); + + var result = CardGameResult.of(dealer, List.of(player)) + .totalResult(); + + assertThat(result.get(player)).isEqualTo(WinningStatus.WIN); + } + + @Test + void 카드_합계가_딜러와_플레이어_모두_21_이하인_경우_숫자가_큰_사람이_승리한다() { + Player player = player(new Card(ACE, HEART)); + Dealer dealer = dealer(new Card(KING, SPADE)); + + var result = CardGameResult.of(dealer, List.of(player)) + .totalResult(); + + assertThat(result.get(player)).isEqualTo(WinningStatus.WIN); + } + + @Test + void 카드_합계가_딜러와_플레이어_모두_21_이하이고_동일한_경우_무승부다() { + Player player = player(new Card(ACE, HEART)); + Dealer dealer = dealer(new Card(ACE, HEART)); + + var result = CardGameResult.of(dealer, List.of(player)) + .totalResult(); + + assertThat(result.get(player)).isEqualTo(WinningStatus.PUSH); + } + + @Test + void 게임_결과에서_플레이어가_순서를_유지하고_있다() { + Player playerA = player(new Card(TWO, HEART)); + Player playerB = player(new Card(TWO, SPADE)); + Player playerC = player(new Card(TWO, CLOVER)); + Player playerD = player(new Card(TWO, DIAMOND)); + Dealer dealer = dealer(new Card(ACE, HEART)); + + var result = CardGameResult.of(dealer, List.of(playerA, playerB, playerC, playerD)) + .totalResult(); + + assertThat(result.keySet()).containsExactly(playerA, playerB, playerC, playerD); + } } diff --git a/src/test/java/blackjack/domain/player/DealerTest.java b/src/test/java/blackjack/domain/player/DealerTest.java index fcfc56b94cd..1b5865971f7 100644 --- a/src/test/java/blackjack/domain/player/DealerTest.java +++ b/src/test/java/blackjack/domain/player/DealerTest.java @@ -1,23 +1,14 @@ package blackjack.domain.player; import blackjack.domain.card.Card; -import blackjack.domain.cardgame.WinningStatus; import org.junit.jupiter.api.Test; -import java.util.List; - import static blackjack.domain.card.CardNumber.ACE; import static blackjack.domain.card.CardNumber.KING; -import static blackjack.domain.card.CardNumber.QUEEN; import static blackjack.domain.card.CardNumber.SEVEN; import static blackjack.domain.card.CardNumber.SIX; -import static blackjack.domain.card.CardNumber.TWO; -import static blackjack.domain.card.CardShape.CLOVER; -import static blackjack.domain.card.CardShape.DIAMOND; -import static blackjack.domain.card.CardShape.HEART; import static blackjack.domain.card.CardShape.SPADE; import static blackjack.fixture.PlayerFixture.dealer; -import static blackjack.fixture.PlayerFixture.player; import static org.assertj.core.api.Assertions.assertThat; import static org.assertj.core.api.Assertions.assertThatThrownBy; @@ -55,96 +46,4 @@ class DealerTest { .isInstanceOf(RuntimeException.class) .hasMessage("[ERROR] 딜러가 카드를 갖고 있지 않습니다."); } - - @Test - void 딜러와_플레이어_둘다_21을_초과할_경우에_플레이어가_패배한다() { - Player player = player( - new Card(KING, CLOVER), - new Card(KING, HEART), - new Card(KING, SPADE)); - Dealer dealer = dealer( - new Card(QUEEN, CLOVER), - new Card(QUEEN, HEART), - new Card(QUEEN, SPADE)); - - var totalResult = dealer.judgeWithPlayers(List.of(player)) - .totalResult(); - - assertThat(totalResult.get(player)).isEqualTo(WinningStatus.LOSE); - } - - @Test - void 딜러와_여러_플레이어의_숫자가_21_이하인_경우_숫자가_큰_사람이_이긴다() { - Player player = player(new Card(KING, SPADE)); - Dealer dealer = dealer(new Card(TWO, SPADE)); - - var result = dealer.judgeWithPlayers(List.of(player)) - .totalResult(); - - assertThat(result.get(player)).isEqualTo(WinningStatus.WIN); - } - - @Test - void 카드_합계가_딜러는_21_이하_플레이어는_21_초과인_경우_플레이어가_패배한다() { - Player player = player( - new Card(KING, CLOVER), - new Card(KING, HEART), - new Card(KING, DIAMOND)); - Dealer dealer = dealer(new Card(TWO, HEART)); - - var result = dealer.judgeWithPlayers(List.of(player)) - .totalResult(); - - assertThat(result.get(player)).isEqualTo(WinningStatus.LOSE); - } - - @Test - void 카드_합계가_딜러는_21_초과_플레이어는_21_이하인_경우_플레이어가_승리한다() { - Player player = player(new Card(TWO, HEART)); - Dealer dealer = dealer( - new Card(KING, CLOVER), - new Card(KING, HEART), - new Card(KING, SPADE)); - - var result = dealer.judgeWithPlayers(List.of(player)) - .totalResult(); - - assertThat(result.get(player)).isEqualTo(WinningStatus.WIN); - } - - @Test - void 카드_합계가_딜러와_플레이어_모두_21_이하인_경우_숫자가_큰_사람이_승리한다() { - Player player = player(new Card(ACE, HEART)); - Dealer dealer = dealer(new Card(KING, SPADE)); - - var result = dealer.judgeWithPlayers(List.of(player)) - .totalResult(); - - assertThat(result.get(player)).isEqualTo(WinningStatus.WIN); - } - - @Test - void 카드_합계가_딜러와_플레이어_모두_21_이하이고_동일한_경우_무승부다() { - Player player = player(new Card(ACE, HEART)); - Dealer dealer = dealer(new Card(ACE, HEART)); - - var result = dealer.judgeWithPlayers(List.of(player)) - .totalResult(); - - assertThat(result.get(player)).isEqualTo(WinningStatus.PUSH); - } - - @Test - void 게임_결과에서_플레이어가_순서를_유지하고_있다() { - Player playerA = player(new Card(TWO, HEART)); - Player playerB = player(new Card(TWO, SPADE)); - Player playerC = player(new Card(TWO, CLOVER)); - Player playerD = player(new Card(TWO, DIAMOND)); - Dealer dealer = dealer(new Card(ACE, HEART)); - - var result = dealer.judgeWithPlayers(List.of(playerA, playerB, playerC, playerD)) - .totalResult(); - - assertThat(result.keySet()).containsExactly(playerA, playerB, playerC, playerD); - } }