From cd61a5b0a5bd22c8a6716741f30c51c6290e6af0 Mon Sep 17 00:00:00 2001 From: chunghyeon-kim Date: Sun, 25 Jul 2021 12:55:41 +0900 Subject: [PATCH 01/55] =?UTF-8?q?docs:=20=EA=B5=AC=ED=98=84=20=EA=B8=B0?= =?UTF-8?q?=EB=8A=A5=20=EB=AA=A9=EB=A1=9D=20=EC=9E=91=EC=84=B1?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- README.md | 34 ++++++++++++++++++++++++++++++++++ src/main/java/empty.txt | 0 src/test/java/empty.txt | 0 3 files changed, 34 insertions(+) delete mode 100644 src/main/java/empty.txt delete mode 100644 src/test/java/empty.txt diff --git a/README.md b/README.md index 2d9bc12..dd9f598 100644 --- a/README.md +++ b/README.md @@ -1 +1,35 @@ # java-blackjack + +# 구현 기능 목록 + +-[ ] 플레이어별 배팅 금액 입력 + +-[ ] 게임 + - [ ] 플레이어들의 이름을 입력받는다. + - [ ] 최소 플레이어는 1명으로, 딜러와 게임을 진행한다. + - [ ] ,를 기준으로 분리 + + - [ ] 시작시 각 플레이어가 두 장의 카드를 지급받는다. + - [ ] 딜러는 처음에 받은 2장의 합계가 16이하이면 반드시 1장의 카드를 뽑는다. + - [ ] 딜러는 처음에 받은 2장의 합계가 17이상이면 추가로 받을 수 없다. + - [ ] 플레이어는 카드 숫자의 합이 21이 초과하지 않는 동안 원하는 만큼 카드를 뽑을 수 있다. + - [ ] 카드를 추가로 뽑아 21을 초과할 경우 배팅 금액을 모두 잃게 된다. + - [ ] Ace를 가진 플레이어는 에이스의 숫자값으로 1 혹은 11을 선택할 수 있다. + - [ ] King, Queen, Jack의 숫자값은 각각 10으로 취급한다. + +-[ ] 출력 + - [ ] 게임 시작 시 각 플레이어가 받은 2장의 카드를 출력한다. + - [ ] 각 플레이어에게 추가로 카드를 받을 것인지 묻는다. + - [ ] 카드를 추가로 받으면 해당 플레이어가 가진 카드 목록을 출력한다. + - [ ] 딜러는 카드값의 합이 16이하면 카드를 추가로 받았다는 메시지를 출력한다. + + - [ ] 모든 플레이어가 더이상 카드를 뽑지 않으면 게임이 종료된다. + - [ ] 플레이어별 카드의 목록을 출력한다. + - [ ] 플레이어별 카드 숫자의 합을 계산하여 결과로 출력한다. + + - [ ] 게임을 완료한 후 각 플레이어별로 승패를 출력한다. + - [ ] 딜러는 각 플레이어와의 승패를 누적해서 출력한다. + - [ ] 플레이어는 딜러와의 승패를 출력한다. + + + \ No newline at end of file diff --git a/src/main/java/empty.txt b/src/main/java/empty.txt deleted file mode 100644 index e69de29..0000000 diff --git a/src/test/java/empty.txt b/src/test/java/empty.txt deleted file mode 100644 index e69de29..0000000 From 9a8ad41063634055ddab7d6793cc902cd702063b Mon Sep 17 00:00:00 2001 From: chunghyeon-kim Date: Sun, 25 Jul 2021 13:00:19 +0900 Subject: [PATCH 02/55] =?UTF-8?q?feat:=20Type,=20Denomination=20Enum?= =?UTF-8?q?=EC=9C=BC=EB=A1=9C=20=EC=B9=B4=EB=93=9C=20=EA=B0=9D=EC=B2=B4=20?= =?UTF-8?q?=EC=83=9D=EC=84=B1?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../java/blackjack/constant/Denomination.java | 27 +++++++++++++ src/main/java/blackjack/constant/Type.java | 18 +++++++++ src/main/java/blackjack/domain/Card.java | 40 +++++++++++++++++++ src/test/java/blackjack/domain/CardTest.java | 32 +++++++++++++++ 4 files changed, 117 insertions(+) create mode 100644 src/main/java/blackjack/constant/Denomination.java create mode 100644 src/main/java/blackjack/constant/Type.java create mode 100644 src/main/java/blackjack/domain/Card.java create mode 100644 src/test/java/blackjack/domain/CardTest.java diff --git a/src/main/java/blackjack/constant/Denomination.java b/src/main/java/blackjack/constant/Denomination.java new file mode 100644 index 0000000..e8f5f67 --- /dev/null +++ b/src/main/java/blackjack/constant/Denomination.java @@ -0,0 +1,27 @@ +package blackjack.constant; + +public enum Denomination { + + ACE(1), + TWO(2), + THREE(3), + FOUR(4), + FIVE(5), + SIX(6), + SEVEN(7), + EIGHT(8), + NINE(9), + JACK(10), + QUEEN(10), + KING(10); + + private final int value; + + Denomination(int value) { + this.value = value; + } + + public int getValue() { + return value; + } +} diff --git a/src/main/java/blackjack/constant/Type.java b/src/main/java/blackjack/constant/Type.java new file mode 100644 index 0000000..c8e8b70 --- /dev/null +++ b/src/main/java/blackjack/constant/Type.java @@ -0,0 +1,18 @@ +package blackjack.constant; + +public enum Type { + SPADE("스페이드"), + HEART("하트"), + DIAMOND("다이아몬드"), + CLUB("클럽"); + + private final String type; + + Type(String type) { + this.type = type; + } + + public String getType() { + return type; + } +} diff --git a/src/main/java/blackjack/domain/Card.java b/src/main/java/blackjack/domain/Card.java new file mode 100644 index 0000000..3ac4983 --- /dev/null +++ b/src/main/java/blackjack/domain/Card.java @@ -0,0 +1,40 @@ +package blackjack.domain; + +import blackjack.constant.Denomination; +import blackjack.constant.Type; + +import java.util.Objects; + +public class Card { + + private final Denomination denomination; + private final Type type; + + public Card(Denomination denomination, Type type) { + this.denomination = denomination; + this.type = type; + } + + @Override + public boolean equals(Object o) { + if (this == o) { + return true; + } + if (!(o instanceof Card)) { + return false; + } + Card card = (Card) o; + return denomination == card.denomination && + type == card.type; + } + + @Override + public int hashCode() { + return Objects.hash(denomination, type); + } + + @Override + public String toString() { + return denomination.getValue() + type.getType(); + } +} diff --git a/src/test/java/blackjack/domain/CardTest.java b/src/test/java/blackjack/domain/CardTest.java new file mode 100644 index 0000000..4d5ab5c --- /dev/null +++ b/src/test/java/blackjack/domain/CardTest.java @@ -0,0 +1,32 @@ +package blackjack.domain; + +import blackjack.constant.Denomination; +import blackjack.constant.Type; +import org.junit.jupiter.api.DisplayName; +import org.junit.jupiter.api.Test; + +import static org.assertj.core.api.Assertions.assertThat; + +public class CardTest { + + @DisplayName("카드 객체의 숫자와 종류값이 같으면 같은 객체로 판단한다") + @Test + void equalsTest() { + //given, when, then + assertThat(new Card(Denomination.TWO, Type.DIAMOND)) + .isEqualTo(new Card(Denomination.TWO, Type.DIAMOND)); + + } + + @DisplayName("카드 객체의 숫자와 종류를 출력한다") + @Test + void printCard() { + //given + Card card = new Card(Denomination.TWO, Type.DIAMOND); + + //when + + //then + assertThat(card.toString()).isEqualTo("2다이아몬드"); + } +} From 49385ff842f7cb015c488fabdcaebe638ffbd349 Mon Sep 17 00:00:00 2001 From: chunghyeon-kim Date: Sun, 25 Jul 2021 14:53:35 +0900 Subject: [PATCH 03/55] =?UTF-8?q?feat:=20Deck=20=EA=B0=9D=EC=B2=B4,=20?= =?UTF-8?q?=ED=85=8C=EC=8A=A4=ED=8A=B8=20=EC=9E=91=EC=84=B1?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- src/main/java/blackjack/domain/Deck.java | 23 ++++++++++++++ src/test/java/blackjack/domain/DeckTest.java | 33 ++++++++++++++++++++ 2 files changed, 56 insertions(+) create mode 100644 src/main/java/blackjack/domain/Deck.java create mode 100644 src/test/java/blackjack/domain/DeckTest.java diff --git a/src/main/java/blackjack/domain/Deck.java b/src/main/java/blackjack/domain/Deck.java new file mode 100644 index 0000000..462c674 --- /dev/null +++ b/src/main/java/blackjack/domain/Deck.java @@ -0,0 +1,23 @@ +package blackjack.domain; + +import blackjack.constant.Denomination; +import blackjack.constant.Type; +import lombok.Getter; + +import java.util.LinkedList; +import java.util.List; + +public class Deck { + + @Getter + private final List deck = new LinkedList<>(); + + public Deck() { + for (Denomination denomination : Denomination.values()) { + for (Type type : Type.values()) { + deck.add(new Card(denomination, type)); + } + } + } + +} diff --git a/src/test/java/blackjack/domain/DeckTest.java b/src/test/java/blackjack/domain/DeckTest.java new file mode 100644 index 0000000..a652f50 --- /dev/null +++ b/src/test/java/blackjack/domain/DeckTest.java @@ -0,0 +1,33 @@ +package blackjack.domain; + +import blackjack.constant.Denomination; +import blackjack.constant.Type; +import org.junit.jupiter.api.DisplayName; +import org.junit.jupiter.api.Test; + +import static org.assertj.core.api.Assertions.assertThat; +import static org.junit.jupiter.api.Assertions.*; + +class DeckTest { + + @DisplayName("생성된 덱에 포함된 카드 숫자가 52장인지 확인한다") + @Test + void createTest() { + + // given + Deck deck = new Deck(); + + // when //then + assertThat(deck.getDeck()).hasSize(52); + } + + @DisplayName("생성된 덱에 스페이드 에이스가 포함되어 있다.") + @Test + void testDeckHasSpadeAce() { + //given + Deck deck = new Deck(); + + //when //then + assertTrue(deck.getDeck().contains(new Card(Denomination.ACE, Type.SPADE))); + } +} \ No newline at end of file From 5850dd0e19a25a0ad3a3984238eda8a1f42bd7bc Mon Sep 17 00:00:00 2001 From: chunghyeon-kim Date: Sun, 25 Jul 2021 15:26:19 +0900 Subject: [PATCH 04/55] =?UTF-8?q?feat:=20Player=20=ED=81=B4=EB=9E=98?= =?UTF-8?q?=EC=8A=A4=20=EC=9E=91=EC=84=B1?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- src/main/java/blackjack/domain/Player.java | 18 ++++++++++++++ .../java/blackjack/domain/PlayerTest.java | 24 +++++++++++++++++++ 2 files changed, 42 insertions(+) create mode 100644 src/main/java/blackjack/domain/Player.java create mode 100644 src/test/java/blackjack/domain/PlayerTest.java diff --git a/src/main/java/blackjack/domain/Player.java b/src/main/java/blackjack/domain/Player.java new file mode 100644 index 0000000..91912e2 --- /dev/null +++ b/src/main/java/blackjack/domain/Player.java @@ -0,0 +1,18 @@ +package blackjack.domain; + +import lombok.Getter; + +import java.util.ArrayList; +import java.util.List; + +@Getter +public class Player { + + private final String name; + private final List cards; + + public Player(String name) { + this.name = name; + this.cards = new ArrayList<>(); + } +} diff --git a/src/test/java/blackjack/domain/PlayerTest.java b/src/test/java/blackjack/domain/PlayerTest.java new file mode 100644 index 0000000..10a0d73 --- /dev/null +++ b/src/test/java/blackjack/domain/PlayerTest.java @@ -0,0 +1,24 @@ +package blackjack.domain; + +import blackjack.constant.Denomination; +import blackjack.constant.Type; +import org.junit.jupiter.api.DisplayName; +import org.junit.jupiter.api.Test; + +import static org.assertj.core.api.Assertions.assertThat; +import static org.assertj.core.api.Assertions.assertThatThrownBy; +import static org.junit.jupiter.api.Assertions.*; + +public class PlayerTest { + + @DisplayName("이름을 입력받아 플레이어 객체를 생성한다.") + @Test + void createPlayer() { + //given + String name = "John Doe"; + Player player = new Player(name); + + //when //then + assertThat(player.getName()).isEqualTo("John Doe"); + } +} From f5e6914696148ec2269e783463d7086e5262a2de Mon Sep 17 00:00:00 2001 From: chunghyeon-kim Date: Sun, 25 Jul 2021 15:27:08 +0900 Subject: [PATCH 05/55] =?UTF-8?q?feat:=20Player=EA=B0=80=20=EC=B9=B4?= =?UTF-8?q?=EB=93=9C=20=ED=95=98=EB=82=98=EB=A5=BC=20=EB=B0=9B=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 --- src/main/java/blackjack/domain/Player.java | 4 ++++ src/test/java/blackjack/domain/PlayerTest.java | 17 +++++++++++++++++ 2 files changed, 21 insertions(+) diff --git a/src/main/java/blackjack/domain/Player.java b/src/main/java/blackjack/domain/Player.java index 91912e2..8d6893b 100644 --- a/src/main/java/blackjack/domain/Player.java +++ b/src/main/java/blackjack/domain/Player.java @@ -15,4 +15,8 @@ public Player(String name) { this.name = name; this.cards = new ArrayList<>(); } + + public void receiveCard(Card card) { + cards.add(card); + } } diff --git a/src/test/java/blackjack/domain/PlayerTest.java b/src/test/java/blackjack/domain/PlayerTest.java index 10a0d73..4fee5f4 100644 --- a/src/test/java/blackjack/domain/PlayerTest.java +++ b/src/test/java/blackjack/domain/PlayerTest.java @@ -21,4 +21,21 @@ void createPlayer() { //when //then assertThat(player.getName()).isEqualTo("John Doe"); } + + @DisplayName("플레이어가 카드를 지급받아 갖고 있는지 확인") + @Test + void receiveCard() { + //given + Player player = new Player("John Doe"); + Card card1 = new Card(Denomination.EIGHT, Type.DIAMOND); + Card card2 = new Card(Denomination.FOUR, Type.SPADE); + + //when + player.receiveCard(card1); + player.receiveCard(card2); + + //then + assertThat(player.getCards()).contains(card1); + assertThat(player.getCards()).contains(card2); + } } From c43c52168344c7fc89316811312c6556100ef887 Mon Sep 17 00:00:00 2001 From: chunghyeon-kim Date: Sun, 25 Jul 2021 15:30:19 +0900 Subject: [PATCH 06/55] =?UTF-8?q?refactor:=20=EB=A1=AC=EB=B3=B5=20?= =?UTF-8?q?=EC=B6=94=EA=B0=80,=20=EC=98=A4=ED=83=80=20=EC=88=98=EC=A0=95?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- build.gradle | 6 ++++++ src/main/java/blackjack/constant/Denomination.java | 1 + 2 files changed, 7 insertions(+) diff --git a/build.gradle b/build.gradle index 092a1c0..6623624 100644 --- a/build.gradle +++ b/build.gradle @@ -10,6 +10,12 @@ repositories { dependencies { testImplementation('org.junit.jupiter:junit-jupiter:5.6.0') testImplementation('org.assertj:assertj-core:3.15.0') + + compileOnly 'org.projectlombok:lombok:1.18.20' + annotationProcessor 'org.projectlombok:lombok:1.18.20' + + testCompileOnly 'org.projectlombok:lombok:1.18.20' + testAnnotationProcessor 'org.projectlombok:lombok:1.18.20' } test { diff --git a/src/main/java/blackjack/constant/Denomination.java b/src/main/java/blackjack/constant/Denomination.java index e8f5f67..cfd10bc 100644 --- a/src/main/java/blackjack/constant/Denomination.java +++ b/src/main/java/blackjack/constant/Denomination.java @@ -11,6 +11,7 @@ public enum Denomination { SEVEN(7), EIGHT(8), NINE(9), + TEN(10), JACK(10), QUEEN(10), KING(10); From 55f99ee6ff8d777cce4f85ad60d2f0e1fd292e16 Mon Sep 17 00:00:00 2001 From: chunghyeon-kim Date: Sun, 25 Jul 2021 15:57:19 +0900 Subject: [PATCH 07/55] =?UTF-8?q?feat:=20=EB=8D=B1=EC=97=90=EC=84=9C=20?= =?UTF-8?q?=EC=B9=B4=EB=93=9C=EB=A5=BC=20=ED=95=98=EB=82=98=20=EB=BD=91?= =?UTF-8?q?=EB=8A=94=20=EB=A9=94=EC=84=9C=EB=93=9C=20=EC=9E=91=EC=84=B1?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- src/main/java/blackjack/domain/Deck.java | 4 ++++ src/test/java/blackjack/domain/DeckTest.java | 15 +++++++++++++++ 2 files changed, 19 insertions(+) diff --git a/src/main/java/blackjack/domain/Deck.java b/src/main/java/blackjack/domain/Deck.java index 462c674..f056848 100644 --- a/src/main/java/blackjack/domain/Deck.java +++ b/src/main/java/blackjack/domain/Deck.java @@ -20,4 +20,8 @@ public Deck() { } } + public Card drawCard(int index) { + return deck.remove(index); + } + } diff --git a/src/test/java/blackjack/domain/DeckTest.java b/src/test/java/blackjack/domain/DeckTest.java index a652f50..b1eb186 100644 --- a/src/test/java/blackjack/domain/DeckTest.java +++ b/src/test/java/blackjack/domain/DeckTest.java @@ -30,4 +30,19 @@ void testDeckHasSpadeAce() { //when //then assertTrue(deck.getDeck().contains(new Card(Denomination.ACE, Type.SPADE))); } + + @DisplayName("덱에서 플레이어에게 카드를 한 장 넘겨준다") + @Test + void giveCard() { + //given + Deck deck = new Deck(); + Player player = new Player("John Doe"); + + //when + player.receiveCard(deck.drawCard(0)); + + //then + assertTrue(player.getCards().contains(new Card(Denomination.ACE, Type.SPADE))); + assertFalse(deck.getDeck().contains(new Card(Denomination.ACE, Type.SPADE))); + } } \ No newline at end of file From 0d0b13c31895c92ce04c7fb1275db0a8cd935157 Mon Sep 17 00:00:00 2001 From: Ariel429 Date: Mon, 26 Jul 2021 16:39:37 +0900 Subject: [PATCH 08/55] =?UTF-8?q?feat:=20=EC=B9=B4=EB=93=9C=EC=9D=98=20?= =?UTF-8?q?=EC=88=AB=EC=9E=90=EA=B0=92=EC=9D=84=20Score=20=EA=B0=9D?= =?UTF-8?q?=EC=B2=B4=EB=A1=9C=20=EC=83=9D=EC=84=B1=ED=95=98=EA=B3=A0=20Enu?= =?UTF-8?q?m=20=ED=81=B4=EB=9E=98=EC=8A=A4=EB=93=A4=EC=97=90=20=EB=A1=AC?= =?UTF-8?q?=EB=B3=B5=20=EC=A0=81=EC=9A=A9?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- build.gradle | 2 + src/main/java/blackjack/domain/Card.java | 8 ++-- src/main/java/blackjack/domain/Player.java | 1 + src/main/java/blackjack/domain/Score.java | 46 +++++++++++++++++++ .../{constant => enums}/Denomination.java | 15 +++--- .../blackjack/{constant => enums}/Type.java | 2 +- src/test/java/blackjack/domain/CardTest.java | 4 +- .../java/blackjack/domain/PlayerTest.java | 5 +- src/test/java/blackjack/domain/ScoreTest.java | 19 ++++++++ 9 files changed, 85 insertions(+), 17 deletions(-) create mode 100644 src/main/java/blackjack/domain/Score.java rename src/main/java/blackjack/{constant => enums}/Denomination.java (55%) rename src/main/java/blackjack/{constant => enums}/Type.java (90%) create mode 100644 src/test/java/blackjack/domain/ScoreTest.java diff --git a/build.gradle b/build.gradle index 6623624..8775d68 100644 --- a/build.gradle +++ b/build.gradle @@ -16,6 +16,8 @@ dependencies { testCompileOnly 'org.projectlombok:lombok:1.18.20' testAnnotationProcessor 'org.projectlombok:lombok:1.18.20' + + implementation group: 'org.apache.commons', name: 'commons-lang3', version: '3.0' } test { diff --git a/src/main/java/blackjack/domain/Card.java b/src/main/java/blackjack/domain/Card.java index 3ac4983..402db26 100644 --- a/src/main/java/blackjack/domain/Card.java +++ b/src/main/java/blackjack/domain/Card.java @@ -1,7 +1,8 @@ package blackjack.domain; -import blackjack.constant.Denomination; -import blackjack.constant.Type; +import blackjack.enums.Denomination; +import blackjack.enums.Type; +import lombok.Getter; import java.util.Objects; @@ -35,6 +36,7 @@ public int hashCode() { @Override public String toString() { - return denomination.getValue() + type.getType(); + return denomination.getScore() + type.getType(); + } } diff --git a/src/main/java/blackjack/domain/Player.java b/src/main/java/blackjack/domain/Player.java index 8d6893b..275cc2d 100644 --- a/src/main/java/blackjack/domain/Player.java +++ b/src/main/java/blackjack/domain/Player.java @@ -1,6 +1,7 @@ package blackjack.domain; import lombok.Getter; +import org.apache.commons.lang3.StringUtils; import java.util.ArrayList; import java.util.List; diff --git a/src/main/java/blackjack/domain/Score.java b/src/main/java/blackjack/domain/Score.java new file mode 100644 index 0000000..df14f2b --- /dev/null +++ b/src/main/java/blackjack/domain/Score.java @@ -0,0 +1,46 @@ +package blackjack.domain; + +import blackjack.enums.Denomination; + +import java.util.List; +import java.util.Objects; + +public class Score { + + private final int score; + + private Score(int score) { + this.score = score; + } + + public static Score of(int score) { + return new Score(score); + } + + public int getScore() { + return score; + } + + public static Score getCardsSum(List cards) { + int cardsSum = cards.stream() + .map(Card::getDenomination) + .mapToInt(Denomination::getScore) + .sum(); + + return new Score(cardsSum); + } + + + @Override + public boolean equals(Object o) { + if (this == o) return true; + if (o == null || getClass() != o.getClass()) return false; + Score score1 = (Score) o; + return score == score1.score; + } + + @Override + public int hashCode() { + return Objects.hash(score); + } +} diff --git a/src/main/java/blackjack/constant/Denomination.java b/src/main/java/blackjack/enums/Denomination.java similarity index 55% rename from src/main/java/blackjack/constant/Denomination.java rename to src/main/java/blackjack/enums/Denomination.java index cfd10bc..d79f3aa 100644 --- a/src/main/java/blackjack/constant/Denomination.java +++ b/src/main/java/blackjack/enums/Denomination.java @@ -1,5 +1,8 @@ -package blackjack.constant; +package blackjack.enums; +import lombok.Getter; + +@Getter public enum Denomination { ACE(1), @@ -16,13 +19,9 @@ public enum Denomination { QUEEN(10), KING(10); - private final int value; - - Denomination(int value) { - this.value = value; - } + private final int score; - public int getValue() { - return value; + Denomination(int score) { + this.score = score; } } diff --git a/src/main/java/blackjack/constant/Type.java b/src/main/java/blackjack/enums/Type.java similarity index 90% rename from src/main/java/blackjack/constant/Type.java rename to src/main/java/blackjack/enums/Type.java index c8e8b70..d689128 100644 --- a/src/main/java/blackjack/constant/Type.java +++ b/src/main/java/blackjack/enums/Type.java @@ -1,4 +1,4 @@ -package blackjack.constant; +package blackjack.enums; public enum Type { SPADE("스페이드"), diff --git a/src/test/java/blackjack/domain/CardTest.java b/src/test/java/blackjack/domain/CardTest.java index 4d5ab5c..cd38743 100644 --- a/src/test/java/blackjack/domain/CardTest.java +++ b/src/test/java/blackjack/domain/CardTest.java @@ -1,7 +1,7 @@ package blackjack.domain; -import blackjack.constant.Denomination; -import blackjack.constant.Type; +import blackjack.enums.Denomination; +import blackjack.enums.Type; import org.junit.jupiter.api.DisplayName; import org.junit.jupiter.api.Test; diff --git a/src/test/java/blackjack/domain/PlayerTest.java b/src/test/java/blackjack/domain/PlayerTest.java index 4fee5f4..095b1c1 100644 --- a/src/test/java/blackjack/domain/PlayerTest.java +++ b/src/test/java/blackjack/domain/PlayerTest.java @@ -1,13 +1,12 @@ package blackjack.domain; -import blackjack.constant.Denomination; -import blackjack.constant.Type; +import blackjack.enums.Denomination; +import blackjack.enums.Type; import org.junit.jupiter.api.DisplayName; import org.junit.jupiter.api.Test; import static org.assertj.core.api.Assertions.assertThat; import static org.assertj.core.api.Assertions.assertThatThrownBy; -import static org.junit.jupiter.api.Assertions.*; public class PlayerTest { diff --git a/src/test/java/blackjack/domain/ScoreTest.java b/src/test/java/blackjack/domain/ScoreTest.java new file mode 100644 index 0000000..21c76c5 --- /dev/null +++ b/src/test/java/blackjack/domain/ScoreTest.java @@ -0,0 +1,19 @@ +package blackjack.domain; + +import org.junit.jupiter.api.DisplayName; +import org.junit.jupiter.api.Test; + +import static org.assertj.core.api.Assertions.assertThat; + +class ScoreTest { + + @Test + @DisplayName("스코어 객체가 가진 값이 같으면 동등 객체로 판단한다") + void equalsTest() { + //given // when // then + assertThat(Score.of(3)) + .isEqualTo(Score.of(3)); + } + + +} \ No newline at end of file From e9ed25c76c0b389fd35b14175c5e9888a8c512c2 Mon Sep 17 00:00:00 2001 From: Ariel429 Date: Mon, 26 Jul 2021 16:44:05 +0900 Subject: [PATCH 09/55] =?UTF-8?q?refactor:=20=ED=95=9C=EC=9E=A5=EC=9D=98?= =?UTF-8?q?=20=EC=B9=B4=EB=93=9C=EB=A5=BC=20Deck=EC=97=90=EC=84=9C=20?= =?UTF-8?q?=EB=BD=91=EC=95=84=EC=A3=BC=EB=8A=94=20=EA=B8=B0=EB=8A=A5=20?= =?UTF-8?q?=EB=A6=AC=ED=8C=A9=ED=86=A0=EB=A7=81?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- src/main/java/blackjack/domain/Deck.java | 8 ++++++-- src/test/java/blackjack/domain/DeckTest.java | 11 +++++------ 2 files changed, 11 insertions(+), 8 deletions(-) diff --git a/src/main/java/blackjack/domain/Deck.java b/src/main/java/blackjack/domain/Deck.java index f056848..0f9e200 100644 --- a/src/main/java/blackjack/domain/Deck.java +++ b/src/main/java/blackjack/domain/Deck.java @@ -1,14 +1,18 @@ package blackjack.domain; -import blackjack.constant.Denomination; -import blackjack.constant.Type; +import blackjack.enums.Denomination; +import blackjack.enums.Type; import lombok.Getter; import java.util.LinkedList; import java.util.List; +import java.util.Random; public class Deck { + private static final Random RANDOM = new Random(); + private static final String ALERT_NO_CARD_LEFT = "사용 가능한 카드를 모두 소진하였습니다."; + @Getter private final List deck = new LinkedList<>(); diff --git a/src/test/java/blackjack/domain/DeckTest.java b/src/test/java/blackjack/domain/DeckTest.java index b1eb186..4302194 100644 --- a/src/test/java/blackjack/domain/DeckTest.java +++ b/src/test/java/blackjack/domain/DeckTest.java @@ -1,7 +1,7 @@ package blackjack.domain; -import blackjack.constant.Denomination; -import blackjack.constant.Type; +import blackjack.enums.Denomination; +import blackjack.enums.Type; import org.junit.jupiter.api.DisplayName; import org.junit.jupiter.api.Test; @@ -13,7 +13,6 @@ class DeckTest { @DisplayName("생성된 덱에 포함된 카드 숫자가 52장인지 확인한다") @Test void createTest() { - // given Deck deck = new Deck(); @@ -39,10 +38,10 @@ void giveCard() { Player player = new Player("John Doe"); //when - player.receiveCard(deck.drawCard(0)); + player.receiveCard(deck.drawCard()); //then - assertTrue(player.getCards().contains(new Card(Denomination.ACE, Type.SPADE))); - assertFalse(deck.getDeck().contains(new Card(Denomination.ACE, Type.SPADE))); + assertThat(deck.getDeck()).hasSize(51); + assertThat(player.getCards()).hasSize(1); } } \ No newline at end of file From 2b3f5c57745d8096bc046717a45ade17e87b2178 Mon Sep 17 00:00:00 2001 From: Ariel429 Date: Mon, 26 Jul 2021 16:45:28 +0900 Subject: [PATCH 10/55] =?UTF-8?q?feat:=20=EB=94=9C=EB=9F=AC=20=EA=B0=9D?= =?UTF-8?q?=EC=B2=B4=20=EC=83=9D=EC=84=B1=20=EB=B0=8F=20=EC=B9=B4=EB=93=9C?= =?UTF-8?q?=ED=95=A9=EC=9D=B4=2016=EC=9D=B4=ED=95=98=EC=9D=BC=20=EB=95=8C?= =?UTF-8?q?=EA=B9=8C=EC=A7=80=20=EC=B9=B4=EB=93=9C=EB=A5=BC=20=ED=95=9C=20?= =?UTF-8?q?=EC=9E=A5=EC=94=A9=20=EB=BD=91=EC=9D=84=20=EC=88=98=20=EC=9E=88?= =?UTF-8?q?=EB=8A=94=20=EB=A1=9C=EC=A7=81=20=EA=B5=AC=ED=98=84?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- README.md | 4 +- src/main/java/blackjack/domain/Dealer.java | 29 +++++++++++++ .../java/blackjack/domain/DealerTest.java | 43 +++++++++++++++++++ 3 files changed, 74 insertions(+), 2 deletions(-) create mode 100644 src/main/java/blackjack/domain/Dealer.java create mode 100644 src/test/java/blackjack/domain/DealerTest.java diff --git a/README.md b/README.md index dd9f598..d192256 100644 --- a/README.md +++ b/README.md @@ -10,8 +10,8 @@ - [ ] ,를 기준으로 분리 - [ ] 시작시 각 플레이어가 두 장의 카드를 지급받는다. - - [ ] 딜러는 처음에 받은 2장의 합계가 16이하이면 반드시 1장의 카드를 뽑는다. - - [ ] 딜러는 처음에 받은 2장의 합계가 17이상이면 추가로 받을 수 없다. + - [x] 딜러는 처음에 받은 2장의 합계가 16이하이면 반드시 1장의 카드를 뽑는다. + - [x] 딜러는 처음에 받은 2장의 합계가 17이상이면 추가로 받을 수 없다. - [ ] 플레이어는 카드 숫자의 합이 21이 초과하지 않는 동안 원하는 만큼 카드를 뽑을 수 있다. - [ ] 카드를 추가로 뽑아 21을 초과할 경우 배팅 금액을 모두 잃게 된다. - [ ] Ace를 가진 플레이어는 에이스의 숫자값으로 1 혹은 11을 선택할 수 있다. diff --git a/src/main/java/blackjack/domain/Dealer.java b/src/main/java/blackjack/domain/Dealer.java new file mode 100644 index 0000000..0cca5d7 --- /dev/null +++ b/src/main/java/blackjack/domain/Dealer.java @@ -0,0 +1,29 @@ +package blackjack.domain; + +import lombok.Getter; + +import java.util.ArrayList; +import java.util.List; + +@Getter +public class Dealer { + + private static final String DEALER_NAME = "딜러"; + private static final int DEALER_DRAW_THRESHOLD = 16; + + String name; + List cards; + + public Dealer() { + this.name = DEALER_NAME; + this.cards = new ArrayList<>(); + } + + public void drawOrNot(Deck deck) { + if (Score.getCardsSum(cards).getScore() <= Score.of(DEALER_DRAW_THRESHOLD).getScore()) { + this.cards.add(deck.drawCard()); + } + } + + +} diff --git a/src/test/java/blackjack/domain/DealerTest.java b/src/test/java/blackjack/domain/DealerTest.java new file mode 100644 index 0000000..7418d56 --- /dev/null +++ b/src/test/java/blackjack/domain/DealerTest.java @@ -0,0 +1,43 @@ +package blackjack.domain; + +import blackjack.enums.Denomination; +import blackjack.enums.Type; +import org.junit.jupiter.api.DisplayName; +import org.junit.jupiter.api.Test; + +import static org.assertj.core.api.Assertions.*; + +class DealerTest { + + @DisplayName("처음에 받은 두 장의 카드 합이 16 이하이면 카드를 한 장 받는다.") + @Test + void drawCardTest() { + //given + Dealer dealer = new Dealer(); + Deck deck = new Deck(); + dealer.getCards().add(new Card(Denomination.EIGHT, Type.CLUB)); + dealer.getCards().add(new Card(Denomination.EIGHT, Type.HEART)); + + //when + dealer.drawOrNot(deck); + + //then + assertThat(dealer.getCards().size()).isEqualTo(3); + } + + @DisplayName("처음에 받은 두 장의 카드 합이 16 초과이면 카드를 더 받지 않는다.") + @Test + void NotDrawCardTest() { + //given + Dealer dealer = new Dealer(); + Deck deck = new Deck(); + dealer.getCards().add(new Card(Denomination.NINE, Type.CLUB)); + dealer.getCards().add(new Card(Denomination.EIGHT, Type.HEART)); + + //when + dealer.drawOrNot(deck); + + //then + assertThat(dealer.getCards().size()).isEqualTo(2); + } +} \ No newline at end of file From a6c12c55efc784e938603cef8f80967d0edf70eb Mon Sep 17 00:00:00 2001 From: Ariel429 Date: Mon, 26 Jul 2021 16:46:43 +0900 Subject: [PATCH 11/55] =?UTF-8?q?docs:=20=EA=B0=9D=EC=B2=B4=20=EC=84=A4?= =?UTF-8?q?=EA=B3=84=EC=99=80=20=EB=A1=9C=EC=A7=81=20=EA=B5=AC=ED=98=84?= =?UTF-8?q?=EC=97=90=20=EB=8C=80=ED=95=9C=20=EA=B5=AC=EC=83=81?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- memo.md | 71 +++++++++++++++++++++++++++++++++++++++++++++++++++++++++ 1 file changed, 71 insertions(+) create mode 100644 memo.md diff --git a/memo.md b/memo.md new file mode 100644 index 0000000..81969ed --- /dev/null +++ b/memo.md @@ -0,0 +1,71 @@ +domain + +- Card, Deck, Player, Dealer, Game, Statistics + - Game : 카드 분배 역할 (카드 분배 조건도 이 객체에서 판단) + - Statistics : 카드분배가 완료된 후 점수계산 및 승패 결과 도출 + +View + +- 플레이어 이름을 입력 받고 결과를 출력 + +Controller + +- 게임 전체 흐름 제어 (입력, 게임실행, 출력) + +### Enum + +1. 게임컨트롤러 (카드분배- 질문) + - 답(YES, NO) + +2. 게임결과 (결과 승패를 판단) + - 승(플레이어 점수, 딜러점수, 승(플), 패(딜러)) + - 패(플레이어 점수, 딜러점수, 패(플), 승(딜러)) + - 무승부(플레이어 점수, 딜러점수, 무(플,딜러)) + +domain + +- Card, Deck, Player, Dealer, Score(계산), GameResult(승패도출) +- Answer(질문답), Results(승패무) + +View + +- inputview: 입력받는 것(질문에 대한 답을 받는 부분) +- outputview: 출력하는 것 + +Controller + +- 카드를 분배(drawCard), 더 받을지 질문, 하나카드를 분배... +- 흐름제어 + +# Ace 카드 처리 로직 + +Player -> 21 한계치 Dealer -> 17 한계치 + +모든 게임스코어합은 -> 21이 게임의 종료 지점 + +Score 계산 && 카드를 더 뽑게할지말지 + +- 카드의 Score가 계산로직으로 21(Player) 17(Dealer) 되기전까지 카드를 더 뽑을지 질문 + +## 계산로직 + +1. 카드 목록에 포함된 에이스 카드의 숫자를 추출한다. -> n +2. n+1의 길이를 가지는 배열을 생성하고, 에이스 카드를 1로 계산한 카드합과 거기에 차례대로 10을 더한 값을 배열에 입력한다. +3. 배열의 숫자들 중 21을 초과하지 않으면서 가장 큰 값을 취한다. + +ex) Ace, Ace, 8일 경우 int[3] = {10, 20, 30} -> 20을 숫자합으로 계산 + +### 게임종료 + +카드를 한 장 뽑을 때마다 모든 경우의 수를 계산. Ace를 1로, 혹은 11로 계산하는 경우의 수를 다 생각해서 모든 경우의 수 중 카드합의 최소값이 한계치를 넘는 경우에 카드를 그만 뽑도록. + +Ace 7, 9 + +27을 취한다. 카드를 더 못뽑음. + +17 + +Ace, 7, 9, 4 + +-> 21 + From b2198e8d1c654ad9ef9c6cc55c4d80baea77fb0d Mon Sep 17 00:00:00 2001 From: Ariel429 Date: Mon, 26 Jul 2021 18:32:56 +0900 Subject: [PATCH 12/55] Implements missing components to a commit --- src/main/java/blackjack/domain/Card.java | 1 + src/main/java/blackjack/domain/Deck.java | 8 ++++++-- src/main/java/blackjack/domain/Player.java | 6 ++++++ src/main/java/blackjack/utils/StringUtils.java | 13 +++++++++++++ 4 files changed, 26 insertions(+), 2 deletions(-) create mode 100644 src/main/java/blackjack/utils/StringUtils.java diff --git a/src/main/java/blackjack/domain/Card.java b/src/main/java/blackjack/domain/Card.java index 402db26..9983332 100644 --- a/src/main/java/blackjack/domain/Card.java +++ b/src/main/java/blackjack/domain/Card.java @@ -6,6 +6,7 @@ import java.util.Objects; +@Getter public class Card { private final Denomination denomination; diff --git a/src/main/java/blackjack/domain/Deck.java b/src/main/java/blackjack/domain/Deck.java index 0f9e200..0c9ea4e 100644 --- a/src/main/java/blackjack/domain/Deck.java +++ b/src/main/java/blackjack/domain/Deck.java @@ -24,8 +24,12 @@ public Deck() { } } - public Card drawCard(int index) { - return deck.remove(index); + public Card drawCard() { + return deck.remove(generateRandomNumber()); + } + + private int generateRandomNumber() { + return RANDOM.nextInt(deck.size()); } } diff --git a/src/main/java/blackjack/domain/Player.java b/src/main/java/blackjack/domain/Player.java index 275cc2d..adc203b 100644 --- a/src/main/java/blackjack/domain/Player.java +++ b/src/main/java/blackjack/domain/Player.java @@ -20,4 +20,10 @@ public Player(String name) { public void receiveCard(Card card) { cards.add(card); } + +// public void validateName(String name){ +// if (StringUtils.isBlank(name)) { +// throw new IllegalArgumentException("이름이 빈 칸 혹은 null 값이 아닌지 확인해주세요."); +// } +// } } diff --git a/src/main/java/blackjack/utils/StringUtils.java b/src/main/java/blackjack/utils/StringUtils.java new file mode 100644 index 0000000..3c502cc --- /dev/null +++ b/src/main/java/blackjack/utils/StringUtils.java @@ -0,0 +1,13 @@ +package blackjack.utils; + +import java.util.Arrays; +import java.util.List; + +public class StringUtils { + private static final String COMMA = ","; + + public static List splitByComma(String input) { + return Arrays.asList(input.split(COMMA)); + } + +} From 5ec01187d0ed8eec499c889c86a11745b0611b85 Mon Sep 17 00:00:00 2001 From: Ariel429 Date: Tue, 27 Jul 2021 11:28:14 +0900 Subject: [PATCH 13/55] =?UTF-8?q?feat:=20=EA=B2=8C=EC=9E=84=EC=A2=85?= =?UTF-8?q?=EB=A3=8C=20=ED=9B=84=20=EC=B9=B4=EB=93=9C=EA=B0=92=EC=9D=98=20?= =?UTF-8?q?=ED=95=A9=EC=9D=84=20=EA=B5=AC=ED=95=98=EB=8A=94=20=EB=A1=9C?= =?UTF-8?q?=EC=A7=81=EC=9D=84=20util=EC=84=B1=20=ED=81=B4=EB=9E=98?= =?UTF-8?q?=EC=8A=A4=EB=A1=9C=20=EA=B5=AC=ED=98=84?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- src/main/java/blackjack/domain/Card.java | 5 ++ .../java/blackjack/utils/CardSumUtils.java | 40 +++++++++ .../blackjack/utils/CardSumUtilsTest.java | 90 +++++++++++++++++++ 3 files changed, 135 insertions(+) create mode 100644 src/main/java/blackjack/utils/CardSumUtils.java create mode 100644 src/test/java/blackjack/utils/CardSumUtilsTest.java diff --git a/src/main/java/blackjack/domain/Card.java b/src/main/java/blackjack/domain/Card.java index 9983332..53c552b 100644 --- a/src/main/java/blackjack/domain/Card.java +++ b/src/main/java/blackjack/domain/Card.java @@ -17,6 +17,11 @@ public Card(Denomination denomination, Type type) { this.type = type; } + public boolean isAce() { + return denomination.equals(Denomination.ACE); + } + + @Override public boolean equals(Object o) { if (this == o) { diff --git a/src/main/java/blackjack/utils/CardSumUtils.java b/src/main/java/blackjack/utils/CardSumUtils.java new file mode 100644 index 0000000..d724025 --- /dev/null +++ b/src/main/java/blackjack/utils/CardSumUtils.java @@ -0,0 +1,40 @@ +package blackjack.utils; + +import blackjack.domain.Card; +import blackjack.enums.Denomination; + +import java.util.Arrays; +import java.util.List; +import java.util.NoSuchElementException; + +public class CardSumUtils { + private static final int NUMBER_OF_DEFAULT_SUM = 1; + private static final int ACE_CHOICE_PRIVILEGE = 10; + private static final int BLACK_JACK = 21; + + public static int getCardsSum(List cards) { + + int numberOfAce = (int) cards.stream() + .filter(Card::isAce) + .count(); + + int defaultCardSum = cards.stream() + .map(Card::getDenomination) + .mapToInt(Denomination::getScore) + .sum(); + + int[] allPossibleSums = new int[numberOfAce + NUMBER_OF_DEFAULT_SUM]; + + allPossibleSums[0] = defaultCardSum; + + for (int i = 1; i < allPossibleSums.length; i++) { + allPossibleSums[i] = allPossibleSums[i - 1] + ACE_CHOICE_PRIVILEGE; + } + + return Arrays.stream(allPossibleSums) + .filter(sum -> sum <= BLACK_JACK) + .max() + .orElseThrow(NoSuchElementException::new) + ; + } +} diff --git a/src/test/java/blackjack/utils/CardSumUtilsTest.java b/src/test/java/blackjack/utils/CardSumUtilsTest.java new file mode 100644 index 0000000..5820ec0 --- /dev/null +++ b/src/test/java/blackjack/utils/CardSumUtilsTest.java @@ -0,0 +1,90 @@ +package blackjack.utils; + +import blackjack.domain.Card; +import blackjack.enums.Denomination; +import blackjack.enums.Type; +import org.junit.jupiter.api.DisplayName; +import org.junit.jupiter.api.Test; + +import java.util.ArrayList; +import java.util.List; + +import static org.assertj.core.api.Assertions.*; + +class CardSumUtilsTest { + @DisplayName("카드목록이 2 3 4일 경우 9로 계산된다") + @Test + void cardSumTestTwoThreeFour() { + //given + List cards = new ArrayList<>(); + cards.add(new Card(Denomination.TWO, Type.SPADE)); + cards.add(new Card(Denomination.THREE, Type.CLUB)); + cards.add(new Card(Denomination.FOUR, Type.HEART)); + + //when + + //then + assertThat(CardSumUtils.getCardsSum(cards)).isEqualTo(9); + } + + @DisplayName("카드목록이 Ace 8일 경우 19로 계산된다") + @Test + void cardSumTestAceEight() { + //given + List cards = new ArrayList<>(); + cards.add(new Card(Denomination.ACE, Type.SPADE)); + cards.add(new Card(Denomination.EIGHT, Type.CLUB)); + + //when + + //then + assertThat(CardSumUtils.getCardsSum(cards)).isEqualTo(19); + } + + @DisplayName("카드목록이 Ace Ace 8일 경우 20으로 계산된다") + @Test + void cardSumTestAceAceEight() { + //given + List cards = new ArrayList<>(); + cards.add(new Card(Denomination.ACE, Type.SPADE)); + cards.add(new Card(Denomination.ACE, Type.CLUB)); + cards.add(new Card(Denomination.EIGHT, Type.HEART)); + + //when + + //then + assertThat(CardSumUtils.getCardsSum(cards)).isEqualTo(20); + } + + @DisplayName("카드목록이 Ace Ace Ace 7일 경우 20으로 계산된다") + @Test + void cardSumTestAceAceAceSeven() { + //given + List cards = new ArrayList<>(); + cards.add(new Card(Denomination.ACE, Type.SPADE)); + cards.add(new Card(Denomination.ACE, Type.CLUB)); + cards.add(new Card(Denomination.ACE, Type.HEART)); + cards.add(new Card(Denomination.SEVEN, Type.HEART)); + + //when + + //then + assertThat(CardSumUtils.getCardsSum(cards)).isEqualTo(20); + } + + @DisplayName("카드목록이 Ace Ace Ace Ace일 경우 14로 계산된다") + @Test + void cardSumTestAceAceAceAce() { + //given + List cards = new ArrayList<>(); + cards.add(new Card(Denomination.ACE, Type.SPADE)); + cards.add(new Card(Denomination.ACE, Type.CLUB)); + cards.add(new Card(Denomination.ACE, Type.HEART)); + cards.add(new Card(Denomination.ACE, Type.DIAMOND)); + + //when + + //then + assertThat(CardSumUtils.getCardsSum(cards)).isEqualTo(14); + } +} \ No newline at end of file From f0cbf79fe5bc3cb2fa4cdb4cf802112117de6727 Mon Sep 17 00:00:00 2001 From: Ariel429 Date: Tue, 27 Jul 2021 14:39:11 +0900 Subject: [PATCH 14/55] =?UTF-8?q?feat:=20Participant=20=EC=9D=B8=ED=84=B0?= =?UTF-8?q?=ED=8E=98=EC=9D=B4=EC=8A=A4=20=EC=B6=94=EA=B0=80=20=EB=B0=8F=20?= =?UTF-8?q?=EA=B2=8C=EC=9E=84=20=EC=B0=B8=EC=97=AC=EC=9E=90=EA=B0=80=20?= =?UTF-8?q?=EA=B0=80=EC=A7=84=20=EC=B9=B4=EB=93=9C=20=EB=8D=B1=20=EA=B0=92?= =?UTF-8?q?=EC=9D=98=20=ED=95=A9=EC=9D=84=20=EA=B5=AC=ED=95=98=EB=8A=94=20?= =?UTF-8?q?=EB=A1=9C=EC=A7=81=20=EA=B5=AC=ED=98=84?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- src/main/java/blackjack/domain/Dealer.java | 10 +-- .../java/blackjack/domain/Participant.java | 6 ++ src/main/java/blackjack/domain/Player.java | 2 +- src/main/java/blackjack/domain/Score.java | 13 --- .../java/blackjack/enums/Denomination.java | 2 +- .../java/blackjack/utils/CardSumUtils.java | 40 --------- .../java/blackjack/domain/PlayerTest.java | 54 ++++++++++- .../blackjack/utils/CardSumUtilsTest.java | 90 ------------------- 8 files changed, 66 insertions(+), 151 deletions(-) create mode 100644 src/main/java/blackjack/domain/Participant.java delete mode 100644 src/main/java/blackjack/utils/CardSumUtils.java delete mode 100644 src/test/java/blackjack/utils/CardSumUtilsTest.java diff --git a/src/main/java/blackjack/domain/Dealer.java b/src/main/java/blackjack/domain/Dealer.java index 0cca5d7..def5a21 100644 --- a/src/main/java/blackjack/domain/Dealer.java +++ b/src/main/java/blackjack/domain/Dealer.java @@ -19,11 +19,11 @@ public Dealer() { this.cards = new ArrayList<>(); } - public void drawOrNot(Deck deck) { - if (Score.getCardsSum(cards).getScore() <= Score.of(DEALER_DRAW_THRESHOLD).getScore()) { - this.cards.add(deck.drawCard()); - } - } +// public void drawOrNot(Deck deck) { +// if (Score.getCardsSum(cards).getScore() <= Score.of(DEALER_DRAW_THRESHOLD).getScore()) { +// this.cards.add(deck.drawCard()); +// } +// } } diff --git a/src/main/java/blackjack/domain/Participant.java b/src/main/java/blackjack/domain/Participant.java new file mode 100644 index 0000000..0e39bf0 --- /dev/null +++ b/src/main/java/blackjack/domain/Participant.java @@ -0,0 +1,6 @@ +package blackjack.domain; + +public interface Participant { + + int getCardsSum(); +} diff --git a/src/main/java/blackjack/domain/Player.java b/src/main/java/blackjack/domain/Player.java index adc203b..f569d6f 100644 --- a/src/main/java/blackjack/domain/Player.java +++ b/src/main/java/blackjack/domain/Player.java @@ -1,7 +1,7 @@ package blackjack.domain; +import blackjack.enums.Denomination; import lombok.Getter; -import org.apache.commons.lang3.StringUtils; import java.util.ArrayList; import java.util.List; diff --git a/src/main/java/blackjack/domain/Score.java b/src/main/java/blackjack/domain/Score.java index df14f2b..6d0b6da 100644 --- a/src/main/java/blackjack/domain/Score.java +++ b/src/main/java/blackjack/domain/Score.java @@ -1,8 +1,5 @@ package blackjack.domain; -import blackjack.enums.Denomination; - -import java.util.List; import java.util.Objects; public class Score { @@ -21,16 +18,6 @@ public int getScore() { return score; } - public static Score getCardsSum(List cards) { - int cardsSum = cards.stream() - .map(Card::getDenomination) - .mapToInt(Denomination::getScore) - .sum(); - - return new Score(cardsSum); - } - - @Override public boolean equals(Object o) { if (this == o) return true; diff --git a/src/main/java/blackjack/enums/Denomination.java b/src/main/java/blackjack/enums/Denomination.java index d79f3aa..1a7ecd7 100644 --- a/src/main/java/blackjack/enums/Denomination.java +++ b/src/main/java/blackjack/enums/Denomination.java @@ -5,7 +5,7 @@ @Getter public enum Denomination { - ACE(1), + ACE(11), TWO(2), THREE(3), FOUR(4), diff --git a/src/main/java/blackjack/utils/CardSumUtils.java b/src/main/java/blackjack/utils/CardSumUtils.java deleted file mode 100644 index d724025..0000000 --- a/src/main/java/blackjack/utils/CardSumUtils.java +++ /dev/null @@ -1,40 +0,0 @@ -package blackjack.utils; - -import blackjack.domain.Card; -import blackjack.enums.Denomination; - -import java.util.Arrays; -import java.util.List; -import java.util.NoSuchElementException; - -public class CardSumUtils { - private static final int NUMBER_OF_DEFAULT_SUM = 1; - private static final int ACE_CHOICE_PRIVILEGE = 10; - private static final int BLACK_JACK = 21; - - public static int getCardsSum(List cards) { - - int numberOfAce = (int) cards.stream() - .filter(Card::isAce) - .count(); - - int defaultCardSum = cards.stream() - .map(Card::getDenomination) - .mapToInt(Denomination::getScore) - .sum(); - - int[] allPossibleSums = new int[numberOfAce + NUMBER_OF_DEFAULT_SUM]; - - allPossibleSums[0] = defaultCardSum; - - for (int i = 1; i < allPossibleSums.length; i++) { - allPossibleSums[i] = allPossibleSums[i - 1] + ACE_CHOICE_PRIVILEGE; - } - - return Arrays.stream(allPossibleSums) - .filter(sum -> sum <= BLACK_JACK) - .max() - .orElseThrow(NoSuchElementException::new) - ; - } -} diff --git a/src/test/java/blackjack/domain/PlayerTest.java b/src/test/java/blackjack/domain/PlayerTest.java index 095b1c1..fb7d76a 100644 --- a/src/test/java/blackjack/domain/PlayerTest.java +++ b/src/test/java/blackjack/domain/PlayerTest.java @@ -6,7 +6,6 @@ import org.junit.jupiter.api.Test; import static org.assertj.core.api.Assertions.assertThat; -import static org.assertj.core.api.Assertions.assertThatThrownBy; public class PlayerTest { @@ -37,4 +36,57 @@ void receiveCard() { assertThat(player.getCards()).contains(card1); assertThat(player.getCards()).contains(card2); } + + @Test + @DisplayName("Ace, Ace, 8이 포함된 카드 덱의 합이 20이다.") + void getCardsSumTest1() { + //given + Player player = new Player("name"); + + player.getCards().add(new Card(Denomination.ACE, Type.CLUB)); + player.getCards().add(new Card(Denomination.ACE, Type.HEART)); + player.getCards().add(new Card(Denomination.EIGHT, Type.CLUB)); + + //when + int result = player.getCardsSum(); + + //then + assertThat(result).isEqualTo(20); + } + + @Test + @DisplayName("Ace가 4장 포함된 카드 덱의 합은 14이다.") + void getCardsSumTest2() { + //given + Player player = new Player("name"); + + player.getCards().add(new Card(Denomination.ACE, Type.SPADE)); + player.getCards().add(new Card(Denomination.ACE, Type.CLUB)); + player.getCards().add(new Card(Denomination.ACE, Type.HEART)); + player.getCards().add(new Card(Denomination.ACE, Type.DIAMOND)); + + //when + int result = player.getCardsSum(); + + //then + assertThat(result).isEqualTo(14); + } + + @Test + @DisplayName("Ace 3장과 7이 포함된 카드 덱의 합은 20이다.") + void getCardsSumTest3() { + //given + Player player = new Player("name"); + + player.getCards().add(new Card(Denomination.ACE, Type.SPADE)); + player.getCards().add(new Card(Denomination.ACE, Type.CLUB)); + player.getCards().add(new Card(Denomination.ACE, Type.HEART)); + player.getCards().add(new Card(Denomination.SEVEN, Type.HEART)); + + //when + int result = player.getCardsSum(); + + //then + assertThat(result).isEqualTo(20); + } } diff --git a/src/test/java/blackjack/utils/CardSumUtilsTest.java b/src/test/java/blackjack/utils/CardSumUtilsTest.java deleted file mode 100644 index 5820ec0..0000000 --- a/src/test/java/blackjack/utils/CardSumUtilsTest.java +++ /dev/null @@ -1,90 +0,0 @@ -package blackjack.utils; - -import blackjack.domain.Card; -import blackjack.enums.Denomination; -import blackjack.enums.Type; -import org.junit.jupiter.api.DisplayName; -import org.junit.jupiter.api.Test; - -import java.util.ArrayList; -import java.util.List; - -import static org.assertj.core.api.Assertions.*; - -class CardSumUtilsTest { - @DisplayName("카드목록이 2 3 4일 경우 9로 계산된다") - @Test - void cardSumTestTwoThreeFour() { - //given - List cards = new ArrayList<>(); - cards.add(new Card(Denomination.TWO, Type.SPADE)); - cards.add(new Card(Denomination.THREE, Type.CLUB)); - cards.add(new Card(Denomination.FOUR, Type.HEART)); - - //when - - //then - assertThat(CardSumUtils.getCardsSum(cards)).isEqualTo(9); - } - - @DisplayName("카드목록이 Ace 8일 경우 19로 계산된다") - @Test - void cardSumTestAceEight() { - //given - List cards = new ArrayList<>(); - cards.add(new Card(Denomination.ACE, Type.SPADE)); - cards.add(new Card(Denomination.EIGHT, Type.CLUB)); - - //when - - //then - assertThat(CardSumUtils.getCardsSum(cards)).isEqualTo(19); - } - - @DisplayName("카드목록이 Ace Ace 8일 경우 20으로 계산된다") - @Test - void cardSumTestAceAceEight() { - //given - List cards = new ArrayList<>(); - cards.add(new Card(Denomination.ACE, Type.SPADE)); - cards.add(new Card(Denomination.ACE, Type.CLUB)); - cards.add(new Card(Denomination.EIGHT, Type.HEART)); - - //when - - //then - assertThat(CardSumUtils.getCardsSum(cards)).isEqualTo(20); - } - - @DisplayName("카드목록이 Ace Ace Ace 7일 경우 20으로 계산된다") - @Test - void cardSumTestAceAceAceSeven() { - //given - List cards = new ArrayList<>(); - cards.add(new Card(Denomination.ACE, Type.SPADE)); - cards.add(new Card(Denomination.ACE, Type.CLUB)); - cards.add(new Card(Denomination.ACE, Type.HEART)); - cards.add(new Card(Denomination.SEVEN, Type.HEART)); - - //when - - //then - assertThat(CardSumUtils.getCardsSum(cards)).isEqualTo(20); - } - - @DisplayName("카드목록이 Ace Ace Ace Ace일 경우 14로 계산된다") - @Test - void cardSumTestAceAceAceAce() { - //given - List cards = new ArrayList<>(); - cards.add(new Card(Denomination.ACE, Type.SPADE)); - cards.add(new Card(Denomination.ACE, Type.CLUB)); - cards.add(new Card(Denomination.ACE, Type.HEART)); - cards.add(new Card(Denomination.ACE, Type.DIAMOND)); - - //when - - //then - assertThat(CardSumUtils.getCardsSum(cards)).isEqualTo(14); - } -} \ No newline at end of file From 28c5a8d7ad71e9c422088f1a26279ccef7d42458 Mon Sep 17 00:00:00 2001 From: Ariel429 Date: Tue, 27 Jul 2021 16:42:27 +0900 Subject: [PATCH 15/55] =?UTF-8?q?refactor:=20Participant=20=EC=B6=94?= =?UTF-8?q?=EC=83=81=ED=81=B4=EB=9E=98=EC=8A=A4=EB=A5=BC=20=EC=83=9D?= =?UTF-8?q?=EC=84=B1=ED=95=98=EC=97=AC=20Player=EC=99=80=20Dealer=EA=B0=80?= =?UTF-8?q?=20=EA=B0=81=EA=B0=81=20=EC=83=81=EC=86=8D=EB=B0=9B=EB=8F=84?= =?UTF-8?q?=EB=A1=9D=20=EB=A6=AC=ED=8C=A9=ED=86=A0=EB=A7=81?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- src/main/java/blackjack/domain/Dealer.java | 26 +++---- .../java/blackjack/domain/Participant.java | 67 ++++++++++++++++++- src/main/java/blackjack/domain/Player.java | 23 ++----- .../java/blackjack/domain/DealerTest.java | 4 +- src/test/java/blackjack/domain/DeckTest.java | 2 +- src/test/java/blackjack/domain/ScoreTest.java | 2 - 6 files changed, 85 insertions(+), 39 deletions(-) diff --git a/src/main/java/blackjack/domain/Dealer.java b/src/main/java/blackjack/domain/Dealer.java index def5a21..d0700bd 100644 --- a/src/main/java/blackjack/domain/Dealer.java +++ b/src/main/java/blackjack/domain/Dealer.java @@ -2,28 +2,24 @@ import lombok.Getter; -import java.util.ArrayList; -import java.util.List; - @Getter public class Dealer { private static final String DEALER_NAME = "딜러"; - private static final int DEALER_DRAW_THRESHOLD = 16; - - String name; - List cards; + private static final int DEALER_DRAW_THRESHOLD = 17; public Dealer() { - this.name = DEALER_NAME; - this.cards = new ArrayList<>(); + super(DEALER_NAME); } -// public void drawOrNot(Deck deck) { -// if (Score.getCardsSum(cards).getScore() <= Score.of(DEALER_DRAW_THRESHOLD).getScore()) { -// this.cards.add(deck.drawCard()); -// } -// } - + public void drawOrNot(Deck deck) { + if (drawable()) { + receiveCard(deck.drawCard()); + } + } + @Override + protected boolean drawable() { + return getCardsSum() < DEALER_DRAW_THRESHOLD; + } } diff --git a/src/main/java/blackjack/domain/Participant.java b/src/main/java/blackjack/domain/Participant.java index 0e39bf0..46c879c 100644 --- a/src/main/java/blackjack/domain/Participant.java +++ b/src/main/java/blackjack/domain/Participant.java @@ -1,6 +1,69 @@ package blackjack.domain; -public interface Participant { +import blackjack.enums.Denomination; +import lombok.Getter; - int getCardsSum(); +import java.util.ArrayList; +import java.util.List; + +@Getter +public abstract class Participant { + private static final int DIFFERENCE_OF_ACE_SCORE = 10; + private static final int BLACKJACK = 21; + private static final int ZERO = 0; + + private final String name; + private final List cards; + + public Participant(String name) { + // validate(name) + + this.name = name; + this.cards = new ArrayList<>(); + } + +// private void validate(String name){ +// if (StringUtils.isBlank(name)) { +// throw new IllegalArgumentException("이름이 빈 칸 혹은 null 값이 아닌지 확인해주세요."); +// } +// } + + protected abstract boolean drawable(); + + public void receiveCard(Card card) { + cards.add(card); + } + + public int getCardsSum() { + int scoreOfAceAsEleven = sumOfCardsScore(); + int aceCount = getAceCount(); + + while (canCountAceAsOne(scoreOfAceAsEleven, aceCount)) { + scoreOfAceAsEleven = scoreOfAceAsOne(scoreOfAceAsEleven); + aceCount--; + } + + return scoreOfAceAsEleven; + } + + private int scoreOfAceAsOne(int scoreOfAceAsEleven) { + return scoreOfAceAsEleven - DIFFERENCE_OF_ACE_SCORE; + } + + private boolean canCountAceAsOne(int scoreOfAceAsEleven, int aceCount) { + return scoreOfAceAsEleven > BLACKJACK && aceCount > ZERO; + } + + private int getAceCount() { + return (int) cards.stream() + .filter(Card::isAce) + .count(); + } + + private int sumOfCardsScore() { + return cards.stream() + .map(Card::getDenomination) + .mapToInt(Denomination::getScore) + .sum(); + } } diff --git a/src/main/java/blackjack/domain/Player.java b/src/main/java/blackjack/domain/Player.java index f569d6f..70c88fd 100644 --- a/src/main/java/blackjack/domain/Player.java +++ b/src/main/java/blackjack/domain/Player.java @@ -1,29 +1,18 @@ package blackjack.domain; -import blackjack.enums.Denomination; import lombok.Getter; -import java.util.ArrayList; -import java.util.List; - @Getter -public class Player { +public class Player extends Participant { - private final String name; - private final List cards; + private static final int PLAYER_DRAW_THRESHOLD = 21; public Player(String name) { - this.name = name; - this.cards = new ArrayList<>(); + super(name); } - public void receiveCard(Card card) { - cards.add(card); + @Override + protected boolean drawable() { + return getCardsSum() < PLAYER_DRAW_THRESHOLD; } - -// public void validateName(String name){ -// if (StringUtils.isBlank(name)) { -// throw new IllegalArgumentException("이름이 빈 칸 혹은 null 값이 아닌지 확인해주세요."); -// } -// } } diff --git a/src/test/java/blackjack/domain/DealerTest.java b/src/test/java/blackjack/domain/DealerTest.java index 7418d56..1b7d27e 100644 --- a/src/test/java/blackjack/domain/DealerTest.java +++ b/src/test/java/blackjack/domain/DealerTest.java @@ -31,8 +31,8 @@ void NotDrawCardTest() { //given Dealer dealer = new Dealer(); Deck deck = new Deck(); - dealer.getCards().add(new Card(Denomination.NINE, Type.CLUB)); - dealer.getCards().add(new Card(Denomination.EIGHT, Type.HEART)); + dealer.receiveCard(new Card(Denomination.NINE, Type.CLUB)); + dealer.receiveCard((new Card(Denomination.EIGHT, Type.HEART))); //when dealer.drawOrNot(deck); diff --git a/src/test/java/blackjack/domain/DeckTest.java b/src/test/java/blackjack/domain/DeckTest.java index 4302194..a312a9a 100644 --- a/src/test/java/blackjack/domain/DeckTest.java +++ b/src/test/java/blackjack/domain/DeckTest.java @@ -32,7 +32,7 @@ void testDeckHasSpadeAce() { @DisplayName("덱에서 플레이어에게 카드를 한 장 넘겨준다") @Test - void giveCard() { + void giveCardToPlayer() { //given Deck deck = new Deck(); Player player = new Player("John Doe"); diff --git a/src/test/java/blackjack/domain/ScoreTest.java b/src/test/java/blackjack/domain/ScoreTest.java index 21c76c5..aa3c869 100644 --- a/src/test/java/blackjack/domain/ScoreTest.java +++ b/src/test/java/blackjack/domain/ScoreTest.java @@ -14,6 +14,4 @@ void equalsTest() { assertThat(Score.of(3)) .isEqualTo(Score.of(3)); } - - } \ No newline at end of file From ac18db069374e9da6d88cf67866f52b8ba091a46 Mon Sep 17 00:00:00 2001 From: Ariel429 Date: Tue, 27 Jul 2021 17:21:00 +0900 Subject: [PATCH 16/55] =?UTF-8?q?feat:=20=EC=9E=85=EB=A0=A5=EB=B0=9B?= =?UTF-8?q?=EC=9D=80=20=EC=9D=B4=EB=A6=84=EC=9D=84=20,=EB=A5=BC=20?= =?UTF-8?q?=EA=B8=B0=EC=A4=80=EC=9C=BC=EB=A1=9C=20=EC=9E=98=EB=9D=BC=20Pla?= =?UTF-8?q?yer=20=EB=AA=A9=EB=A1=9D=EC=9D=84=20=EC=83=9D=EC=84=B1=ED=95=98?= =?UTF-8?q?=EB=8A=94=20=EB=A1=9C=EC=A7=81=20=EA=B5=AC=ED=98=84?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../java/blackjack/domain/Participant.java | 14 ++++++ .../java/blackjack/domain/PlayersFactory.java | 18 ++++++++ .../blackjack/domain/PlayersFactoryTest.java | 43 +++++++++++++++++++ 3 files changed, 75 insertions(+) create mode 100644 src/main/java/blackjack/domain/PlayersFactory.java create mode 100644 src/test/java/blackjack/domain/PlayersFactoryTest.java diff --git a/src/main/java/blackjack/domain/Participant.java b/src/main/java/blackjack/domain/Participant.java index 46c879c..5ba3590 100644 --- a/src/main/java/blackjack/domain/Participant.java +++ b/src/main/java/blackjack/domain/Participant.java @@ -5,6 +5,7 @@ import java.util.ArrayList; import java.util.List; +import java.util.Objects; @Getter public abstract class Participant { @@ -66,4 +67,17 @@ private int sumOfCardsScore() { .mapToInt(Denomination::getScore) .sum(); } + + @Override + public boolean equals(Object o) { + if (this == o) return true; + if (o == null || getClass() != o.getClass()) return false; + Participant that = (Participant) o; + return Objects.equals(name, that.name) && Objects.equals(cards, that.cards); + } + + @Override + public int hashCode() { + return Objects.hash(name, cards); + } } diff --git a/src/main/java/blackjack/domain/PlayersFactory.java b/src/main/java/blackjack/domain/PlayersFactory.java new file mode 100644 index 0000000..42300ca --- /dev/null +++ b/src/main/java/blackjack/domain/PlayersFactory.java @@ -0,0 +1,18 @@ +package blackjack.domain; + +import blackjack.utils.StringUtils; + +import java.util.Collections; +import java.util.List; +import java.util.stream.Collectors; + +public class PlayersFactory { + public static List createPlayers(String input) { + List playerNames = StringUtils.splitByComma(input); + + List players = playerNames.stream() + .map(Player::new) + .collect(Collectors.toList()); + return Collections.unmodifiableList(players); + } +} diff --git a/src/test/java/blackjack/domain/PlayersFactoryTest.java b/src/test/java/blackjack/domain/PlayersFactoryTest.java new file mode 100644 index 0000000..935270b --- /dev/null +++ b/src/test/java/blackjack/domain/PlayersFactoryTest.java @@ -0,0 +1,43 @@ +package blackjack.domain; + +import blackjack.utils.StringUtils; +import org.junit.jupiter.api.DisplayName; +import org.junit.jupiter.api.Test; +import org.junit.jupiter.params.ParameterizedTest; +import org.junit.jupiter.params.provider.ValueSource; + +import java.util.List; + +import static org.assertj.core.api.Assertions.assertThat; +import static org.assertj.core.api.Assertions.assertThatThrownBy; +import static org.junit.jupiter.api.Assertions.*; + +class PlayersFactoryTest { + + @ParameterizedTest + @ValueSource(strings = {"Jane Doe, John Doe, Jim Smith", "Alice, Brown, Chris, Dean"}) + @DisplayName("이름목록을 입력하면 플레이어 리스트가 생성되는지를 테스트한다.") + void playerGenerateTest(String input) { + //when + List players = PlayersFactory.createPlayers(input); + List names = StringUtils.splitByComma(input); + + //then + for (String name : names) { + assertThat(players).contains(new Player(name)); + } + } + + @Test + @DisplayName("이미 생성된 플레이어의 목록을 바꿀 수 없는지를 확인한다.") + void playersUnmodifiableTest() { + //given + // when + List players = PlayersFactory.createPlayers("Jane, John, Ariel"); + + //then + assertThatThrownBy(() -> { + players.add(new Player("ChungHyeon")); + }).isInstanceOf(RuntimeException.class); + } +} \ No newline at end of file From b1e1a2531b7b10f73fad3a4906c26eae064e61f7 Mon Sep 17 00:00:00 2001 From: Ariel429 Date: Tue, 27 Jul 2021 17:39:54 +0900 Subject: [PATCH 17/55] =?UTF-8?q?feat:=20InputView=EB=A5=BC=20=EC=83=9D?= =?UTF-8?q?=EC=84=B1=ED=95=98=EC=97=AC=20=EC=82=AC=EC=9A=A9=EC=9E=90=20?= =?UTF-8?q?=EC=9D=B4=EB=A6=84=EC=9D=84=20=EC=9E=85=EB=A0=A5=EB=B0=9B?= =?UTF-8?q?=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 --- .../java/blackjack/dto/PlayersNameInputDto.java | 11 +++++++++++ src/main/java/blackjack/view/InputView.java | 17 +++++++++++++++++ 2 files changed, 28 insertions(+) create mode 100644 src/main/java/blackjack/dto/PlayersNameInputDto.java create mode 100644 src/main/java/blackjack/view/InputView.java diff --git a/src/main/java/blackjack/dto/PlayersNameInputDto.java b/src/main/java/blackjack/dto/PlayersNameInputDto.java new file mode 100644 index 0000000..c0379fd --- /dev/null +++ b/src/main/java/blackjack/dto/PlayersNameInputDto.java @@ -0,0 +1,11 @@ +package blackjack.dto; + +import lombok.Getter; +import lombok.RequiredArgsConstructor; + +@Getter +@RequiredArgsConstructor +public class PlayersNameInputDto { + + private final String playersName; +} diff --git a/src/main/java/blackjack/view/InputView.java b/src/main/java/blackjack/view/InputView.java new file mode 100644 index 0000000..5202bac --- /dev/null +++ b/src/main/java/blackjack/view/InputView.java @@ -0,0 +1,17 @@ +package blackjack.view; + +import blackjack.dto.PlayersNameInputDto; + +import java.util.Scanner; + +public class InputView { + private static final Scanner scanner = new Scanner(System.in); + + private PlayersNameInputDto getPlayersName() { + System.out.println("게임에 참여할 사람의 이름을 입력하세요.(쉼표 기준으로 분리)"); + String input = scanner.nextLine(); + return new PlayersNameInputDto(input); + } + + +} From 7b7ed47de4df700105723c422b534ab2e75b075e Mon Sep 17 00:00:00 2001 From: Ariel429 Date: Tue, 27 Jul 2021 17:47:04 +0900 Subject: [PATCH 18/55] =?UTF-8?q?feat:=20Player=EC=97=90=EA=B2=8C=20?= =?UTF-8?q?=EC=B9=B4=EB=93=9C=20=ED=95=9C=EC=9E=A5=EC=9D=84=20=EB=8D=94=20?= =?UTF-8?q?=EB=B0=9B=EC=9D=84=EC=A7=80=20=EB=AC=BB=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 --- src/main/java/blackjack/domain/Dealer.java | 2 +- src/main/java/blackjack/domain/Score.java | 1 - src/main/java/blackjack/view/InputView.java | 11 ++++++++++- src/test/java/blackjack/domain/DealerTest.java | 4 ++-- src/test/java/blackjack/domain/DeckTest.java | 17 ++++++++++++++++- 5 files changed, 29 insertions(+), 6 deletions(-) diff --git a/src/main/java/blackjack/domain/Dealer.java b/src/main/java/blackjack/domain/Dealer.java index d0700bd..91518a6 100644 --- a/src/main/java/blackjack/domain/Dealer.java +++ b/src/main/java/blackjack/domain/Dealer.java @@ -3,7 +3,7 @@ import lombok.Getter; @Getter -public class Dealer { +public class Dealer extends Participant { private static final String DEALER_NAME = "딜러"; private static final int DEALER_DRAW_THRESHOLD = 17; diff --git a/src/main/java/blackjack/domain/Score.java b/src/main/java/blackjack/domain/Score.java index 6d0b6da..f63b51e 100644 --- a/src/main/java/blackjack/domain/Score.java +++ b/src/main/java/blackjack/domain/Score.java @@ -9,7 +9,6 @@ public class Score { private Score(int score) { this.score = score; } - public static Score of(int score) { return new Score(score); } diff --git a/src/main/java/blackjack/view/InputView.java b/src/main/java/blackjack/view/InputView.java index 5202bac..78e146a 100644 --- a/src/main/java/blackjack/view/InputView.java +++ b/src/main/java/blackjack/view/InputView.java @@ -1,5 +1,7 @@ package blackjack.view; +import blackjack.domain.Player; +import blackjack.dto.DrawCardResponseDTO; import blackjack.dto.PlayersNameInputDto; import java.util.Scanner; @@ -13,5 +15,12 @@ private PlayersNameInputDto getPlayersName() { return new PlayersNameInputDto(input); } - + private DrawCardResponseDTO getPlayersResponse(Player player) { + StringBuilder sb = new StringBuilder(); + sb.append(player.getName()) + .append("는 한장의 카드를 더 받겠습니까?(예는 y, 아니오는 n)"); + System.out.println(sb); + String response = scanner.nextLine(); + return new DrawCardResponseDTO(response); + } } diff --git a/src/test/java/blackjack/domain/DealerTest.java b/src/test/java/blackjack/domain/DealerTest.java index 1b7d27e..a2b523b 100644 --- a/src/test/java/blackjack/domain/DealerTest.java +++ b/src/test/java/blackjack/domain/DealerTest.java @@ -15,8 +15,8 @@ void drawCardTest() { //given Dealer dealer = new Dealer(); Deck deck = new Deck(); - dealer.getCards().add(new Card(Denomination.EIGHT, Type.CLUB)); - dealer.getCards().add(new Card(Denomination.EIGHT, Type.HEART)); + dealer.receiveCard((new Card(Denomination.EIGHT, Type.CLUB))); + dealer.receiveCard((new Card(Denomination.EIGHT, Type.HEART))); //when dealer.drawOrNot(deck); diff --git a/src/test/java/blackjack/domain/DeckTest.java b/src/test/java/blackjack/domain/DeckTest.java index a312a9a..8a43117 100644 --- a/src/test/java/blackjack/domain/DeckTest.java +++ b/src/test/java/blackjack/domain/DeckTest.java @@ -35,7 +35,7 @@ void testDeckHasSpadeAce() { void giveCardToPlayer() { //given Deck deck = new Deck(); - Player player = new Player("John Doe"); + Participant player = new Player("John Doe"); //when player.receiveCard(deck.drawCard()); @@ -44,4 +44,19 @@ void giveCardToPlayer() { assertThat(deck.getDeck()).hasSize(51); assertThat(player.getCards()).hasSize(1); } + + @DisplayName("덱에서 딜러에게 카드를 한 장 넘겨준다") + @Test + void giveCardToDealer() { + //given + Deck deck = new Deck(); + Participant dealer = new Dealer(); + + //when + dealer.receiveCard(deck.drawCard()); + + //then + assertThat(deck.getDeck()).hasSize(51); + assertThat(dealer.getCards()).hasSize(1); + } } \ No newline at end of file From 8dab5e02893aa03979a3f4d78119f44a74024ace Mon Sep 17 00:00:00 2001 From: Ariel429 Date: Tue, 27 Jul 2021 17:47:31 +0900 Subject: [PATCH 19/55] =?UTF-8?q?refactor:=20=EB=88=84=EB=9D=BD=EB=90=9C?= =?UTF-8?q?=20=EC=82=AC=ED=95=AD=20commit?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- src/main/java/blackjack/dto/DrawCardResponseDTO.java | 11 +++++++++++ 1 file changed, 11 insertions(+) create mode 100644 src/main/java/blackjack/dto/DrawCardResponseDTO.java diff --git a/src/main/java/blackjack/dto/DrawCardResponseDTO.java b/src/main/java/blackjack/dto/DrawCardResponseDTO.java new file mode 100644 index 0000000..98f6983 --- /dev/null +++ b/src/main/java/blackjack/dto/DrawCardResponseDTO.java @@ -0,0 +1,11 @@ +package blackjack.dto; + +import lombok.Getter; +import lombok.RequiredArgsConstructor; + +@Getter +@RequiredArgsConstructor +public class DrawCardResponseDTO { + + private final String response; +} From f5829e03bf2b23f1f64f400603dbfd2e2a366063 Mon Sep 17 00:00:00 2001 From: Ariel429 Date: Tue, 27 Jul 2021 18:23:07 +0900 Subject: [PATCH 20/55] =?UTF-8?q?feat:=20Controller=EC=99=80=20Application?= =?UTF-8?q?=EC=9D=84=20=EC=83=9D=EC=84=B1,=20=EC=B9=B4=EB=93=9C=EB=A5=BC?= =?UTF-8?q?=20=EB=91=90=20=EA=B0=9C=EC=94=A9=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 --- .../java/blackjack/BlackjackApplication.java | 14 +++++ .../controller/BlackJackController.java | 62 +++++++++++++++++++ src/main/java/blackjack/domain/Dealer.java | 2 +- src/main/java/blackjack/domain/Player.java | 2 +- ...InputDto.java => PlayersNameInputDTO.java} | 2 +- src/main/java/blackjack/view/InputView.java | 4 +- 6 files changed, 81 insertions(+), 5 deletions(-) create mode 100644 src/main/java/blackjack/BlackjackApplication.java create mode 100644 src/main/java/blackjack/controller/BlackJackController.java rename src/main/java/blackjack/dto/{PlayersNameInputDto.java => PlayersNameInputDTO.java} (82%) diff --git a/src/main/java/blackjack/BlackjackApplication.java b/src/main/java/blackjack/BlackjackApplication.java new file mode 100644 index 0000000..8afae58 --- /dev/null +++ b/src/main/java/blackjack/BlackjackApplication.java @@ -0,0 +1,14 @@ +package blackjack; + +import blackjack.controller.BlackJackController; + +public class BlackjackApplication { + + public static void main(String[] args) { + try { + new BlackJackController().run(); + } catch (Exception e) { + e.printStackTrace(); + } + } +} diff --git a/src/main/java/blackjack/controller/BlackJackController.java b/src/main/java/blackjack/controller/BlackJackController.java new file mode 100644 index 0000000..46b68fb --- /dev/null +++ b/src/main/java/blackjack/controller/BlackJackController.java @@ -0,0 +1,62 @@ +package blackjack.controller; + +import blackjack.domain.Dealer; +import blackjack.domain.Deck; +import blackjack.domain.Player; +import blackjack.domain.PlayersFactory; +import blackjack.dto.DrawCardResponseDTO; +import blackjack.dto.PlayersNameInputDTO; +import blackjack.view.InputView; + +import java.util.List; + +public class BlackJackController { + private final List players; + private final Dealer dealer; + private final Deck deck; + private final InputView inputview = new InputView(); + + public BlackJackController() { + PlayersNameInputDTO namesInput = inputview.getPlayersName(); + this.players = PlayersFactory.createPlayers(namesInput.getPlayersName()); + this.dealer = new Dealer(); + this.deck = new Deck(); + } + + public void run() { + // 시작해서 카드 두 장씩 분배 + drawTowCards(); + // + } + + private void drawTowCards() { + for (Player player : players) { + player.receiveCard(deck.drawCard()); + player.receiveCard(deck.drawCard()); + } + dealer.receiveCard(deck.drawCard()); + dealer.receiveCard(deck.drawCard()); + // 딜러랑 플레이어들에게 카드를 나누었다는 안내문 출력 + // 딜러의 카드 목록을 출력 + // 플레이어의 카드 목록을 출력 + } + + private void drawCardToPlayers() { + for (Player player : players) { + drawCardToPlayers(player); + } + } + + private void drawCardToPlayers(Player player) { + DrawCardResponseDTO drawCardResponse = inputview.getPlayersResponse(player); + while (player.drawable() && isYes(drawCardResponse)) { + player.receiveCard(deck.drawCard()); + // 해당 플레이어의 카드 목록을 출력 + } + } + + private boolean isYes(DrawCardResponseDTO drawCardResponse) { + return drawCardResponse.getResponse().equals("y"); + } + +} diff --git a/src/main/java/blackjack/domain/Dealer.java b/src/main/java/blackjack/domain/Dealer.java index 91518a6..5246ee4 100644 --- a/src/main/java/blackjack/domain/Dealer.java +++ b/src/main/java/blackjack/domain/Dealer.java @@ -19,7 +19,7 @@ public void drawOrNot(Deck deck) { } @Override - protected boolean drawable() { + public boolean drawable() { return getCardsSum() < DEALER_DRAW_THRESHOLD; } } diff --git a/src/main/java/blackjack/domain/Player.java b/src/main/java/blackjack/domain/Player.java index 70c88fd..9f3b96f 100644 --- a/src/main/java/blackjack/domain/Player.java +++ b/src/main/java/blackjack/domain/Player.java @@ -12,7 +12,7 @@ public Player(String name) { } @Override - protected boolean drawable() { + public boolean drawable() { return getCardsSum() < PLAYER_DRAW_THRESHOLD; } } diff --git a/src/main/java/blackjack/dto/PlayersNameInputDto.java b/src/main/java/blackjack/dto/PlayersNameInputDTO.java similarity index 82% rename from src/main/java/blackjack/dto/PlayersNameInputDto.java rename to src/main/java/blackjack/dto/PlayersNameInputDTO.java index c0379fd..b8b487e 100644 --- a/src/main/java/blackjack/dto/PlayersNameInputDto.java +++ b/src/main/java/blackjack/dto/PlayersNameInputDTO.java @@ -5,7 +5,7 @@ @Getter @RequiredArgsConstructor -public class PlayersNameInputDto { +public class PlayersNameInputDTO { private final String playersName; } diff --git a/src/main/java/blackjack/view/InputView.java b/src/main/java/blackjack/view/InputView.java index 78e146a..f36eb22 100644 --- a/src/main/java/blackjack/view/InputView.java +++ b/src/main/java/blackjack/view/InputView.java @@ -2,7 +2,7 @@ import blackjack.domain.Player; import blackjack.dto.DrawCardResponseDTO; -import blackjack.dto.PlayersNameInputDto; +import blackjack.dto.PlayersNameInputDTO; import java.util.Scanner; @@ -12,7 +12,7 @@ public class InputView { private PlayersNameInputDto getPlayersName() { System.out.println("게임에 참여할 사람의 이름을 입력하세요.(쉼표 기준으로 분리)"); String input = scanner.nextLine(); - return new PlayersNameInputDto(input); + return new PlayersNameInputDTO(input); } private DrawCardResponseDTO getPlayersResponse(Player player) { From f0ec5f4bf6fcabb5c24b07a736a4a86e603c4015 Mon Sep 17 00:00:00 2001 From: Ariel429 Date: Tue, 27 Jul 2021 18:24:10 +0900 Subject: [PATCH 21/55] =?UTF-8?q?docs:=20=EC=84=A4=EA=B3=84,=20=EB=A1=9C?= =?UTF-8?q?=EC=A7=81=20=EA=B5=AC=ED=98=84=EC=97=90=20=EB=8C=80=ED=95=9C=20?= =?UTF-8?q?=EB=A9=94=EB=AA=A8?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- memo.md | 42 ++++++++++++++++++++++++++++++++++++++++++ 1 file changed, 42 insertions(+) diff --git a/memo.md b/memo.md index 81969ed..95bde51 100644 --- a/memo.md +++ b/memo.md @@ -69,3 +69,45 @@ Ace, 7, 9, 4 -> 21 +## 카드 뽑기 + +<딜러> +처음에 2장의 카드를 받고 카드합이 16 이하이면 한 장을 더 뽑는다. 에이스 1장은 11로 계산하고 나머지 에이스는 1로 계산한다. -> 에이스가 포함되어 있을 경우 카드합에 10을 더해준다 + +<에이스가 포함되어 있지 않을 경우> + +카드합이 16 이하이면 카드를 뽑음. + +<에이스가 포함되어 있는 경우> + +카드합에 10을 더한 값이 16 이하이면 카드를 뽑음. + +## 카드 뽑기 및 에이스가 여러개 포함될 가능성이 있는 카드덱의 합 계산 + +// 카드값의 합(ace가 11) +int scoreOfAceAsEleven; // 에이스의 개수 int aceCount; // Ace카드값의 차이 int DiFFERENCE_OF_ACE_VALUE = 10; + + calcaluateResult(){ + while (canCountAceAsOne) { + 카드값의 합 scoreOfAceAsEleven = scoreOfAceAsOne(scoreOfAsAsEleven); + aceCount--; + } + + return scoreOfAceAsEleven; + } + + boolean canCountAceAsOne(int 카드값의 합, 에이스의 개수){ + 에이스가 하나라도 있음 > 0 && 카드 합이 21(상수선언)을 넘음(ace를 1로 취급가능)} + } + + int scoreOfAceAsOne(int 카드값의 합){ + (ace를 11로 취급한) scoreOfAceAsEleven 카드값의 합 - 10 + } + +- 17 dealer = threshould + +컨트롤러에서 딜러에게 boolean Drawble(){ return calculateResult() < 17 } drawCard() + +- 21 player 컨트롤러에서 플레이어에게 더 받을건지 묻는 질문 boolean 플레이어의 답 Yes && Drawable() { return calculateResult() < 21 } drawCard() + + From 2cc96f38a1f3f945b1babbed3ab13c807cfbf5a2 Mon Sep 17 00:00:00 2001 From: Ariel429 Date: Wed, 28 Jul 2021 09:43:16 +0900 Subject: [PATCH 22/55] =?UTF-8?q?feat:=20OutputView=20=EA=B0=9D=EC=B2=B4?= =?UTF-8?q?=20=EC=83=9D=EC=84=B1,=20=EA=B2=8C=EC=9E=84=EC=97=90=EC=84=9C?= =?UTF-8?q?=20=EC=B2=98=EC=9D=8C=20=EC=B9=B4=EB=93=9C=EB=A5=BC=20=EB=91=90?= =?UTF-8?q?=20=EA=B0=9C=EC=94=A9=20=EB=B6=84=EB=B0=B0=ED=95=98=EB=8A=94=20?= =?UTF-8?q?=EB=AC=B8=EA=B5=AC=20=EC=B6=9C=EB=A0=A5=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 --- .../controller/BlackJackController.java | 4 +++- .../java/blackjack/utils/StringUtils.java | 6 ++++- src/main/java/blackjack/view/OutputView.java | 23 +++++++++++++++++++ 3 files changed, 31 insertions(+), 2 deletions(-) create mode 100644 src/main/java/blackjack/view/OutputView.java diff --git a/src/main/java/blackjack/controller/BlackJackController.java b/src/main/java/blackjack/controller/BlackJackController.java index 46b68fb..0bc2a94 100644 --- a/src/main/java/blackjack/controller/BlackJackController.java +++ b/src/main/java/blackjack/controller/BlackJackController.java @@ -7,6 +7,7 @@ import blackjack.dto.DrawCardResponseDTO; import blackjack.dto.PlayersNameInputDTO; import blackjack.view.InputView; +import blackjack.view.OutputView; import java.util.List; @@ -15,6 +16,7 @@ public class BlackJackController { private final Dealer dealer; private final Deck deck; private final InputView inputview = new InputView(); + private final OutputView outputView = new OutputView(); public BlackJackController() { PlayersNameInputDTO namesInput = inputview.getPlayersName(); @@ -36,7 +38,7 @@ private void drawTowCards() { } dealer.receiveCard(deck.drawCard()); dealer.receiveCard(deck.drawCard()); - // 딜러랑 플레이어들에게 카드를 나누었다는 안내문 출력 + OutputView.printFirstCardsGiven(players, dealer); // 딜러의 카드 목록을 출력 // 플레이어의 카드 목록을 출력 } diff --git a/src/main/java/blackjack/utils/StringUtils.java b/src/main/java/blackjack/utils/StringUtils.java index 3c502cc..5ceea72 100644 --- a/src/main/java/blackjack/utils/StringUtils.java +++ b/src/main/java/blackjack/utils/StringUtils.java @@ -2,12 +2,16 @@ import java.util.Arrays; import java.util.List; +import java.util.stream.Collectors; public class StringUtils { private static final String COMMA = ","; public static List splitByComma(String input) { - return Arrays.asList(input.split(COMMA)); + List names = Arrays.asList(input.split(COMMA)); + return names.stream() + .map(String::trim) + .collect(Collectors.toList()); } } diff --git a/src/main/java/blackjack/view/OutputView.java b/src/main/java/blackjack/view/OutputView.java new file mode 100644 index 0000000..6e7045d --- /dev/null +++ b/src/main/java/blackjack/view/OutputView.java @@ -0,0 +1,23 @@ +package blackjack.view; + +import blackjack.domain.Dealer; +import blackjack.domain.Player; + +import java.util.List; +import java.util.stream.Collectors; + +public class OutputView { + private static final String NEW_LINE = System.lineSeparator(); + + public static void printFirstCardsGiven(List players, Dealer dealer) { + StringBuilder sb = new StringBuilder(); + sb.append(dealer.getName()) + .append("와 "); + sb.append(players.stream() + .map(Player::getName) + .collect(Collectors.joining(", "))); + sb.append("에게 2장의 카드를 나누었습니다."); + sb.append(NEW_LINE); + System.out.println(sb); + } +} From e99f18b1df644195c8d8111e11353df0e5bd14f8 Mon Sep 17 00:00:00 2001 From: Ariel429 Date: Wed, 28 Jul 2021 10:21:53 +0900 Subject: [PATCH 23/55] =?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=EA=B0=80=20=EC=B2=98?= =?UTF-8?q?=EC=9D=8C=20=EB=B6=84=EB=B0=B0=EB=B0=9B=EC=9D=80=20=EC=B9=B4?= =?UTF-8?q?=EB=93=9C=20=EB=AA=A9=EB=A1=9D=EC=9D=98=20=EC=B6=9C=EB=A0=A5=20?= =?UTF-8?q?=EA=B8=B0=EB=8A=A5=20=EA=B5=AC=ED=98=84?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../controller/BlackJackController.java | 14 ++++----- src/main/java/blackjack/domain/Card.java | 2 +- src/main/java/blackjack/domain/Dealer.java | 13 ++++++++ src/main/java/blackjack/domain/Player.java | 13 ++++++++ .../java/blackjack/enums/Denomination.java | 30 ++++++++++--------- src/main/java/blackjack/enums/Type.java | 2 +- src/main/java/blackjack/view/InputView.java | 4 +-- src/main/java/blackjack/view/OutputView.java | 14 +++++++-- src/test/java/blackjack/domain/CardTest.java | 14 ++++++++- .../java/blackjack/domain/DealerTest.java | 15 ++++++++++ 10 files changed, 93 insertions(+), 28 deletions(-) diff --git a/src/main/java/blackjack/controller/BlackJackController.java b/src/main/java/blackjack/controller/BlackJackController.java index 0bc2a94..2b87271 100644 --- a/src/main/java/blackjack/controller/BlackJackController.java +++ b/src/main/java/blackjack/controller/BlackJackController.java @@ -15,18 +15,18 @@ public class BlackJackController { private final List players; private final Dealer dealer; private final Deck deck; - private final InputView inputview = new InputView(); + private final InputView inputView = new InputView(); private final OutputView outputView = new OutputView(); public BlackJackController() { - PlayersNameInputDTO namesInput = inputview.getPlayersName(); + PlayersNameInputDTO namesInput = inputView.getPlayersName(); this.players = PlayersFactory.createPlayers(namesInput.getPlayersName()); this.dealer = new Dealer(); this.deck = new Deck(); } public void run() { - // 시작해서 카드 두 장씩 분배 + // 시작해서 카드 두 장씩 분배, 카드 목록의 출력 drawTowCards(); // } @@ -38,9 +38,9 @@ private void drawTowCards() { } dealer.receiveCard(deck.drawCard()); dealer.receiveCard(deck.drawCard()); - OutputView.printFirstCardsGiven(players, dealer); - // 딜러의 카드 목록을 출력 - // 플레이어의 카드 목록을 출력 + outputView.printFirstCardsGiven(players, dealer); + outputView.printDealerCard(dealer); + outputView.printPlayersCard(players); } private void drawCardToPlayers() { @@ -50,7 +50,7 @@ private void drawCardToPlayers() { } private void drawCardToPlayers(Player player) { - DrawCardResponseDTO drawCardResponse = inputview.getPlayersResponse(player); + DrawCardResponseDTO drawCardResponse = inputView.getPlayersResponse(player); while (player.drawable() && isYes(drawCardResponse)) { player.receiveCard(deck.drawCard()); // 해당 플레이어의 카드 목록을 출력 diff --git a/src/main/java/blackjack/domain/Card.java b/src/main/java/blackjack/domain/Card.java index 53c552b..a20b097 100644 --- a/src/main/java/blackjack/domain/Card.java +++ b/src/main/java/blackjack/domain/Card.java @@ -42,7 +42,7 @@ public int hashCode() { @Override public String toString() { - return denomination.getScore() + type.getType(); + return denomination.getDenominationName() + type.getType(); } } diff --git a/src/main/java/blackjack/domain/Dealer.java b/src/main/java/blackjack/domain/Dealer.java index 5246ee4..bb8b7cb 100644 --- a/src/main/java/blackjack/domain/Dealer.java +++ b/src/main/java/blackjack/domain/Dealer.java @@ -2,6 +2,8 @@ import lombok.Getter; +import java.util.stream.Collectors; + @Getter public class Dealer extends Participant { @@ -22,4 +24,15 @@ public void drawOrNot(Deck deck) { public boolean drawable() { return getCardsSum() < DEALER_DRAW_THRESHOLD; } + + @Override + public String toString() { + StringBuilder sb = new StringBuilder(); + sb.append(DEALER_NAME) + .append(": ") + .append(getCards().stream() + .map(Card::toString) + .collect(Collectors.joining(", "))); + return sb.toString(); + } } diff --git a/src/main/java/blackjack/domain/Player.java b/src/main/java/blackjack/domain/Player.java index 9f3b96f..7392629 100644 --- a/src/main/java/blackjack/domain/Player.java +++ b/src/main/java/blackjack/domain/Player.java @@ -2,6 +2,8 @@ import lombok.Getter; +import java.util.stream.Collectors; + @Getter public class Player extends Participant { @@ -15,4 +17,15 @@ public Player(String name) { public boolean drawable() { return getCardsSum() < PLAYER_DRAW_THRESHOLD; } + + @Override + public String toString() { + StringBuilder sb = new StringBuilder(); + sb.append(getName()) + .append("카드: ") + .append(getCards().stream() + .map(Card::toString) + .collect(Collectors.joining(", "))); + return sb.toString(); + } } diff --git a/src/main/java/blackjack/enums/Denomination.java b/src/main/java/blackjack/enums/Denomination.java index 1a7ecd7..fbf3669 100644 --- a/src/main/java/blackjack/enums/Denomination.java +++ b/src/main/java/blackjack/enums/Denomination.java @@ -5,23 +5,25 @@ @Getter public enum Denomination { - ACE(11), - TWO(2), - THREE(3), - FOUR(4), - FIVE(5), - SIX(6), - SEVEN(7), - EIGHT(8), - NINE(9), - TEN(10), - JACK(10), - QUEEN(10), - KING(10); + ACE(11, "A"), + TWO(2, "2"), + THREE(3, "3"), + FOUR(4, "4"), + FIVE(5, "5"), + SIX(6, "6"), + SEVEN(7, "7"), + EIGHT(8, "8"), + NINE(9, "9"), + TEN(10, "10"), + JACK(10, "J"), + QUEEN(10, "Q"), + KING(10, "K"); + private final String denominationName; private final int score; - Denomination(int score) { + Denomination(int score, String denominationName) { + this.denominationName = denominationName; this.score = score; } } diff --git a/src/main/java/blackjack/enums/Type.java b/src/main/java/blackjack/enums/Type.java index d689128..bbb40a1 100644 --- a/src/main/java/blackjack/enums/Type.java +++ b/src/main/java/blackjack/enums/Type.java @@ -4,7 +4,7 @@ public enum Type { SPADE("스페이드"), HEART("하트"), DIAMOND("다이아몬드"), - CLUB("클럽"); + CLUB("클로버"); private final String type; diff --git a/src/main/java/blackjack/view/InputView.java b/src/main/java/blackjack/view/InputView.java index f36eb22..2f759f3 100644 --- a/src/main/java/blackjack/view/InputView.java +++ b/src/main/java/blackjack/view/InputView.java @@ -9,13 +9,13 @@ public class InputView { private static final Scanner scanner = new Scanner(System.in); - private PlayersNameInputDto getPlayersName() { + public PlayersNameInputDTO getPlayersName() { System.out.println("게임에 참여할 사람의 이름을 입력하세요.(쉼표 기준으로 분리)"); String input = scanner.nextLine(); return new PlayersNameInputDTO(input); } - private DrawCardResponseDTO getPlayersResponse(Player player) { + public DrawCardResponseDTO getPlayersResponse(Player player) { StringBuilder sb = new StringBuilder(); sb.append(player.getName()) .append("는 한장의 카드를 더 받겠습니까?(예는 y, 아니오는 n)"); diff --git a/src/main/java/blackjack/view/OutputView.java b/src/main/java/blackjack/view/OutputView.java index 6e7045d..5a59885 100644 --- a/src/main/java/blackjack/view/OutputView.java +++ b/src/main/java/blackjack/view/OutputView.java @@ -7,9 +7,9 @@ import java.util.stream.Collectors; public class OutputView { - private static final String NEW_LINE = System.lineSeparator(); + private final String NEW_LINE = System.lineSeparator(); - public static void printFirstCardsGiven(List players, Dealer dealer) { + public void printFirstCardsGiven(List players, Dealer dealer) { StringBuilder sb = new StringBuilder(); sb.append(dealer.getName()) .append("와 "); @@ -20,4 +20,14 @@ public static void printFirstCardsGiven(List players, Dealer dealer) { sb.append(NEW_LINE); System.out.println(sb); } + + public void printDealerCard(Dealer dealer) { + System.out.println(dealer); + } + + public void printPlayersCard(List players) { + for (Player player : players) { + System.out.println(player); + } + } } diff --git a/src/test/java/blackjack/domain/CardTest.java b/src/test/java/blackjack/domain/CardTest.java index cd38743..562ee76 100644 --- a/src/test/java/blackjack/domain/CardTest.java +++ b/src/test/java/blackjack/domain/CardTest.java @@ -20,7 +20,7 @@ void equalsTest() { @DisplayName("카드 객체의 숫자와 종류를 출력한다") @Test - void printCard() { + void printCardTwoDiamond() { //given Card card = new Card(Denomination.TWO, Type.DIAMOND); @@ -29,4 +29,16 @@ void printCard() { //then assertThat(card.toString()).isEqualTo("2다이아몬드"); } + + @DisplayName("카드 객체의 숫자와 종류를 출력한다") + @Test + void printCardAceHeart() { + //given + Card card = new Card(Denomination.ACE, Type.HEART); + + //when + + //then + assertThat(card.toString()).isEqualTo("A하트"); + } } diff --git a/src/test/java/blackjack/domain/DealerTest.java b/src/test/java/blackjack/domain/DealerTest.java index a2b523b..fa132b8 100644 --- a/src/test/java/blackjack/domain/DealerTest.java +++ b/src/test/java/blackjack/domain/DealerTest.java @@ -40,4 +40,19 @@ void NotDrawCardTest() { //then assertThat(dealer.getCards().size()).isEqualTo(2); } + + @DisplayName("딜러가 갖고 있는 카드를 출력한다.") + @Test + void DealerPrintTest() { + //given + Dealer dealer = new Dealer(); + Deck deck = new Deck(); + dealer.receiveCard(new Card(Denomination.NINE, Type.CLUB)); + dealer.receiveCard((new Card(Denomination.EIGHT, Type.HEART))); + + //when + + //then + assertThat(dealer.toString()).isEqualTo("딜러: 9클로버, 8하트"); + } } \ No newline at end of file From 9bfe22818030b7de97fe35aa21d03bb5cfb02c07 Mon Sep 17 00:00:00 2001 From: Ariel429 Date: Wed, 28 Jul 2021 11:55:42 +0900 Subject: [PATCH 24/55] =?UTF-8?q?feat:=20=ED=94=8C=EB=A0=88=EC=9D=B4?= =?UTF-8?q?=EC=96=B4=EA=B0=80=2021=EC=9D=84=20=EB=84=98=EC=A7=80=20?= =?UTF-8?q?=EC=95=8A=EB=8A=94=20=EC=84=A0=EC=97=90=EC=84=9C=20=EC=B9=B4?= =?UTF-8?q?=EB=93=9C=EB=A5=BC=20=ED=95=9C=EC=9E=A5=EC=94=A9=20=EB=B0=9B?= =?UTF-8?q?=EB=8A=94=20=EB=A1=9C=EC=A7=81=20=EA=B5=AC=ED=98=84?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../controller/BlackJackController.java | 20 +++++++++++++------ src/main/java/blackjack/view/OutputView.java | 8 ++++++++ 2 files changed, 22 insertions(+), 6 deletions(-) diff --git a/src/main/java/blackjack/controller/BlackJackController.java b/src/main/java/blackjack/controller/BlackJackController.java index 2b87271..356eb08 100644 --- a/src/main/java/blackjack/controller/BlackJackController.java +++ b/src/main/java/blackjack/controller/BlackJackController.java @@ -28,7 +28,10 @@ public BlackJackController() { public void run() { // 시작해서 카드 두 장씩 분배, 카드 목록의 출력 drawTowCards(); - // + // 플레이어에게 한장씩 카드를 분배(대답이 Yes인 경우) + drawCardToPlayers(); + // 딜러에게 한장씩 카드 분배(카드 합이 17미만인 경우만) + } private void drawTowCards() { @@ -45,20 +48,25 @@ private void drawTowCards() { private void drawCardToPlayers() { for (Player player : players) { - drawCardToPlayers(player); + drawCardToPlayer(player); } } - private void drawCardToPlayers(Player player) { + private void drawCardToPlayer(Player player) { DrawCardResponseDTO drawCardResponse = inputView.getPlayersResponse(player); while (player.drawable() && isYes(drawCardResponse)) { player.receiveCard(deck.drawCard()); - // 해당 플레이어의 카드 목록을 출력 + + if (!player.drawable()) { + break; + } + outputView.printCards(player); + drawCardResponse = inputView.getPlayersResponse(player); } } - private boolean isYes(DrawCardResponseDTO drawCardResponse) { - return drawCardResponse.getResponse().equals("y"); + private boolean isYes(DrawCardResponseDTO response) { + return response.getResponse().equals("y"); } } diff --git a/src/main/java/blackjack/view/OutputView.java b/src/main/java/blackjack/view/OutputView.java index 5a59885..9bda44a 100644 --- a/src/main/java/blackjack/view/OutputView.java +++ b/src/main/java/blackjack/view/OutputView.java @@ -30,4 +30,12 @@ public void printPlayersCard(List players) { System.out.println(player); } } + + public void printCards(Player player) { + System.out.println(player); + } + + public void printDealerCardGiven() { + System.out.println("딜러는 16이하라 한장의 카드를 더 받았습니다."); + } } From 02ba4209dc7089a8d0122414d33ddecce8852110 Mon Sep 17 00:00:00 2001 From: Ariel429 Date: Wed, 28 Jul 2021 11:56:52 +0900 Subject: [PATCH 25/55] =?UTF-8?q?feat:=20=EB=94=9C=EB=9F=AC=20=EC=B9=B4?= =?UTF-8?q?=EB=93=9C=EB=AA=A9=EB=A1=9D=EC=9D=98=20=ED=95=A9=EC=9D=B4=2017?= =?UTF-8?q?=EB=AF=B8=EB=A7=8C=EC=9D=B4=EB=A9=B4=20=EC=B9=B4=EB=93=9C?= =?UTF-8?q?=EB=A5=BC=20=EC=B6=94=EA=B0=80=EB=A1=9C=20=ED=95=9C=20=EC=9E=A5?= =?UTF-8?q?=20=EB=B0=9B=EB=8A=94=20=EB=A1=9C=EC=A7=81=20=EA=B5=AC=ED=98=84?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../java/blackjack/controller/BlackJackController.java | 8 +++++++- 1 file changed, 7 insertions(+), 1 deletion(-) diff --git a/src/main/java/blackjack/controller/BlackJackController.java b/src/main/java/blackjack/controller/BlackJackController.java index 356eb08..4eaa095 100644 --- a/src/main/java/blackjack/controller/BlackJackController.java +++ b/src/main/java/blackjack/controller/BlackJackController.java @@ -31,7 +31,7 @@ public void run() { // 플레이어에게 한장씩 카드를 분배(대답이 Yes인 경우) drawCardToPlayers(); // 딜러에게 한장씩 카드 분배(카드 합이 17미만인 경우만) - + drawCardToDealer(); } private void drawTowCards() { @@ -69,4 +69,10 @@ private boolean isYes(DrawCardResponseDTO response) { return response.getResponse().equals("y"); } + private void drawCardToDealer() { + while (dealer.drawable()) { + dealer.receiveCard(deck.drawCard()); + outputView.printDealerCardGiven(); + } + } } From 02b8932a57fd5407208dd203beafbcd6e53cc52c Mon Sep 17 00:00:00 2001 From: Ariel429 Date: Wed, 28 Jul 2021 12:14:44 +0900 Subject: [PATCH 26/55] =?UTF-8?q?refactor:=20=EC=B9=B4=EB=93=9C,=20?= =?UTF-8?q?=EA=B2=8C=EC=9E=84=EC=B0=B8=EA=B0=80=EC=9E=90,=20=EA=B2=B0?= =?UTF-8?q?=EA=B3=BC=EB=A1=9C=20package=20=EB=B6=84=EB=A6=AC?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- src/main/java/blackjack/domain/{ => card}/Card.java | 4 +--- src/main/java/blackjack/domain/{ => card}/Deck.java | 4 +--- .../{enums => domain/card}/Denomination.java | 2 +- src/main/java/blackjack/domain/{ => card}/Score.java | 2 +- .../java/blackjack/{enums => domain/card}/Type.java | 2 +- .../blackjack/domain/{ => participant}/Dealer.java | 5 ++++- .../domain/{ => participant}/Participant.java | 5 +++-- .../blackjack/domain/{ => participant}/Player.java | 4 +++- .../domain/{ => participant}/PlayersFactory.java | 3 ++- src/main/java/blackjack/view/InputView.java | 2 +- .../java/blackjack/domain/{ => card}/CardTest.java | 7 ++++--- .../java/blackjack/domain/{ => card}/DeckTest.java | 11 ++++++++--- .../domain/{ => participant}/DealerTest.java | 9 ++++++--- .../domain/{ => participant}/PlayerTest.java | 8 +++++--- .../domain/{ => participant}/PlayersFactoryTest.java | 5 +++-- .../blackjack/domain/{ => participant}/ScoreTest.java | 3 ++- 16 files changed, 46 insertions(+), 30 deletions(-) rename src/main/java/blackjack/domain/{ => card}/Card.java (90%) rename src/main/java/blackjack/domain/{ => card}/Deck.java (89%) rename src/main/java/blackjack/{enums => domain/card}/Denomination.java (94%) rename src/main/java/blackjack/domain/{ => card}/Score.java (95%) rename src/main/java/blackjack/{enums => domain/card}/Type.java (89%) rename src/main/java/blackjack/domain/{ => participant}/Dealer.java (84%) rename src/main/java/blackjack/domain/{ => participant}/Participant.java (94%) rename src/main/java/blackjack/domain/{ => participant}/Player.java (84%) rename src/main/java/blackjack/domain/{ => participant}/PlayersFactory.java (85%) rename src/test/java/blackjack/domain/{ => card}/CardTest.java (87%) rename src/test/java/blackjack/domain/{ => card}/DeckTest.java (82%) rename src/test/java/blackjack/domain/{ => participant}/DealerTest.java (87%) rename src/test/java/blackjack/domain/{ => participant}/PlayerTest.java (93%) rename src/test/java/blackjack/domain/{ => participant}/PlayersFactoryTest.java (91%) rename src/test/java/blackjack/domain/{ => participant}/ScoreTest.java (84%) diff --git a/src/main/java/blackjack/domain/Card.java b/src/main/java/blackjack/domain/card/Card.java similarity index 90% rename from src/main/java/blackjack/domain/Card.java rename to src/main/java/blackjack/domain/card/Card.java index a20b097..1a55b03 100644 --- a/src/main/java/blackjack/domain/Card.java +++ b/src/main/java/blackjack/domain/card/Card.java @@ -1,7 +1,5 @@ -package blackjack.domain; +package blackjack.domain.card; -import blackjack.enums.Denomination; -import blackjack.enums.Type; import lombok.Getter; import java.util.Objects; diff --git a/src/main/java/blackjack/domain/Deck.java b/src/main/java/blackjack/domain/card/Deck.java similarity index 89% rename from src/main/java/blackjack/domain/Deck.java rename to src/main/java/blackjack/domain/card/Deck.java index 0c9ea4e..7a3835d 100644 --- a/src/main/java/blackjack/domain/Deck.java +++ b/src/main/java/blackjack/domain/card/Deck.java @@ -1,7 +1,5 @@ -package blackjack.domain; +package blackjack.domain.card; -import blackjack.enums.Denomination; -import blackjack.enums.Type; import lombok.Getter; import java.util.LinkedList; diff --git a/src/main/java/blackjack/enums/Denomination.java b/src/main/java/blackjack/domain/card/Denomination.java similarity index 94% rename from src/main/java/blackjack/enums/Denomination.java rename to src/main/java/blackjack/domain/card/Denomination.java index fbf3669..27458f7 100644 --- a/src/main/java/blackjack/enums/Denomination.java +++ b/src/main/java/blackjack/domain/card/Denomination.java @@ -1,4 +1,4 @@ -package blackjack.enums; +package blackjack.domain.card; import lombok.Getter; diff --git a/src/main/java/blackjack/domain/Score.java b/src/main/java/blackjack/domain/card/Score.java similarity index 95% rename from src/main/java/blackjack/domain/Score.java rename to src/main/java/blackjack/domain/card/Score.java index f63b51e..85192e1 100644 --- a/src/main/java/blackjack/domain/Score.java +++ b/src/main/java/blackjack/domain/card/Score.java @@ -1,4 +1,4 @@ -package blackjack.domain; +package blackjack.domain.card; import java.util.Objects; diff --git a/src/main/java/blackjack/enums/Type.java b/src/main/java/blackjack/domain/card/Type.java similarity index 89% rename from src/main/java/blackjack/enums/Type.java rename to src/main/java/blackjack/domain/card/Type.java index bbb40a1..7d3dbeb 100644 --- a/src/main/java/blackjack/enums/Type.java +++ b/src/main/java/blackjack/domain/card/Type.java @@ -1,4 +1,4 @@ -package blackjack.enums; +package blackjack.domain.card; public enum Type { SPADE("스페이드"), diff --git a/src/main/java/blackjack/domain/Dealer.java b/src/main/java/blackjack/domain/participant/Dealer.java similarity index 84% rename from src/main/java/blackjack/domain/Dealer.java rename to src/main/java/blackjack/domain/participant/Dealer.java index bb8b7cb..cf284c9 100644 --- a/src/main/java/blackjack/domain/Dealer.java +++ b/src/main/java/blackjack/domain/participant/Dealer.java @@ -1,5 +1,8 @@ -package blackjack.domain; +package blackjack.domain.participant; +import blackjack.domain.card.Card; +import blackjack.domain.card.Deck; +import blackjack.domain.participant.Participant; import lombok.Getter; import java.util.stream.Collectors; diff --git a/src/main/java/blackjack/domain/Participant.java b/src/main/java/blackjack/domain/participant/Participant.java similarity index 94% rename from src/main/java/blackjack/domain/Participant.java rename to src/main/java/blackjack/domain/participant/Participant.java index 5ba3590..30ed52f 100644 --- a/src/main/java/blackjack/domain/Participant.java +++ b/src/main/java/blackjack/domain/participant/Participant.java @@ -1,6 +1,7 @@ -package blackjack.domain; +package blackjack.domain.participant; -import blackjack.enums.Denomination; +import blackjack.domain.card.Card; +import blackjack.domain.card.Denomination; import lombok.Getter; import java.util.ArrayList; diff --git a/src/main/java/blackjack/domain/Player.java b/src/main/java/blackjack/domain/participant/Player.java similarity index 84% rename from src/main/java/blackjack/domain/Player.java rename to src/main/java/blackjack/domain/participant/Player.java index 7392629..942713e 100644 --- a/src/main/java/blackjack/domain/Player.java +++ b/src/main/java/blackjack/domain/participant/Player.java @@ -1,5 +1,7 @@ -package blackjack.domain; +package blackjack.domain.participant; +import blackjack.domain.card.Card; +import blackjack.domain.participant.Participant; import lombok.Getter; import java.util.stream.Collectors; diff --git a/src/main/java/blackjack/domain/PlayersFactory.java b/src/main/java/blackjack/domain/participant/PlayersFactory.java similarity index 85% rename from src/main/java/blackjack/domain/PlayersFactory.java rename to src/main/java/blackjack/domain/participant/PlayersFactory.java index 42300ca..deeacb8 100644 --- a/src/main/java/blackjack/domain/PlayersFactory.java +++ b/src/main/java/blackjack/domain/participant/PlayersFactory.java @@ -1,5 +1,6 @@ -package blackjack.domain; +package blackjack.domain.participant; +import blackjack.domain.participant.Player; import blackjack.utils.StringUtils; import java.util.Collections; diff --git a/src/main/java/blackjack/view/InputView.java b/src/main/java/blackjack/view/InputView.java index 2f759f3..ba97eb7 100644 --- a/src/main/java/blackjack/view/InputView.java +++ b/src/main/java/blackjack/view/InputView.java @@ -1,6 +1,6 @@ package blackjack.view; -import blackjack.domain.Player; +import blackjack.domain.participant.Player; import blackjack.dto.DrawCardResponseDTO; import blackjack.dto.PlayersNameInputDTO; diff --git a/src/test/java/blackjack/domain/CardTest.java b/src/test/java/blackjack/domain/card/CardTest.java similarity index 87% rename from src/test/java/blackjack/domain/CardTest.java rename to src/test/java/blackjack/domain/card/CardTest.java index 562ee76..96799e5 100644 --- a/src/test/java/blackjack/domain/CardTest.java +++ b/src/test/java/blackjack/domain/card/CardTest.java @@ -1,7 +1,8 @@ -package blackjack.domain; +package blackjack.domain.card; -import blackjack.enums.Denomination; -import blackjack.enums.Type; +import blackjack.domain.card.Card; +import blackjack.domain.card.Denomination; +import blackjack.domain.card.Type; import org.junit.jupiter.api.DisplayName; import org.junit.jupiter.api.Test; diff --git a/src/test/java/blackjack/domain/DeckTest.java b/src/test/java/blackjack/domain/card/DeckTest.java similarity index 82% rename from src/test/java/blackjack/domain/DeckTest.java rename to src/test/java/blackjack/domain/card/DeckTest.java index 8a43117..008b77d 100644 --- a/src/test/java/blackjack/domain/DeckTest.java +++ b/src/test/java/blackjack/domain/card/DeckTest.java @@ -1,7 +1,12 @@ -package blackjack.domain; +package blackjack.domain.card; -import blackjack.enums.Denomination; -import blackjack.enums.Type; +import blackjack.domain.card.Card; +import blackjack.domain.card.Deck; +import blackjack.domain.participant.Dealer; +import blackjack.domain.participant.Participant; +import blackjack.domain.participant.Player; +import blackjack.domain.card.Denomination; +import blackjack.domain.card.Type; import org.junit.jupiter.api.DisplayName; import org.junit.jupiter.api.Test; diff --git a/src/test/java/blackjack/domain/DealerTest.java b/src/test/java/blackjack/domain/participant/DealerTest.java similarity index 87% rename from src/test/java/blackjack/domain/DealerTest.java rename to src/test/java/blackjack/domain/participant/DealerTest.java index fa132b8..fc73d46 100644 --- a/src/test/java/blackjack/domain/DealerTest.java +++ b/src/test/java/blackjack/domain/participant/DealerTest.java @@ -1,7 +1,10 @@ -package blackjack.domain; +package blackjack.domain.participant; -import blackjack.enums.Denomination; -import blackjack.enums.Type; +import blackjack.domain.card.Card; +import blackjack.domain.card.Deck; +import blackjack.domain.participant.Dealer; +import blackjack.domain.card.Denomination; +import blackjack.domain.card.Type; import org.junit.jupiter.api.DisplayName; import org.junit.jupiter.api.Test; diff --git a/src/test/java/blackjack/domain/PlayerTest.java b/src/test/java/blackjack/domain/participant/PlayerTest.java similarity index 93% rename from src/test/java/blackjack/domain/PlayerTest.java rename to src/test/java/blackjack/domain/participant/PlayerTest.java index fb7d76a..f3cced3 100644 --- a/src/test/java/blackjack/domain/PlayerTest.java +++ b/src/test/java/blackjack/domain/participant/PlayerTest.java @@ -1,7 +1,9 @@ -package blackjack.domain; +package blackjack.domain.participant; -import blackjack.enums.Denomination; -import blackjack.enums.Type; +import blackjack.domain.card.Card; +import blackjack.domain.participant.Player; +import blackjack.domain.card.Denomination; +import blackjack.domain.card.Type; import org.junit.jupiter.api.DisplayName; import org.junit.jupiter.api.Test; diff --git a/src/test/java/blackjack/domain/PlayersFactoryTest.java b/src/test/java/blackjack/domain/participant/PlayersFactoryTest.java similarity index 91% rename from src/test/java/blackjack/domain/PlayersFactoryTest.java rename to src/test/java/blackjack/domain/participant/PlayersFactoryTest.java index 935270b..dd79d05 100644 --- a/src/test/java/blackjack/domain/PlayersFactoryTest.java +++ b/src/test/java/blackjack/domain/participant/PlayersFactoryTest.java @@ -1,5 +1,7 @@ -package blackjack.domain; +package blackjack.domain.participant; +import blackjack.domain.participant.Player; +import blackjack.domain.participant.PlayersFactory; import blackjack.utils.StringUtils; import org.junit.jupiter.api.DisplayName; import org.junit.jupiter.api.Test; @@ -10,7 +12,6 @@ import static org.assertj.core.api.Assertions.assertThat; import static org.assertj.core.api.Assertions.assertThatThrownBy; -import static org.junit.jupiter.api.Assertions.*; class PlayersFactoryTest { diff --git a/src/test/java/blackjack/domain/ScoreTest.java b/src/test/java/blackjack/domain/participant/ScoreTest.java similarity index 84% rename from src/test/java/blackjack/domain/ScoreTest.java rename to src/test/java/blackjack/domain/participant/ScoreTest.java index aa3c869..6210308 100644 --- a/src/test/java/blackjack/domain/ScoreTest.java +++ b/src/test/java/blackjack/domain/participant/ScoreTest.java @@ -1,5 +1,6 @@ -package blackjack.domain; +package blackjack.domain.participant; +import blackjack.domain.card.Score; import org.junit.jupiter.api.DisplayName; import org.junit.jupiter.api.Test; From 676547884028cd5197f004e2b9c308214c537abb Mon Sep 17 00:00:00 2001 From: Ariel429 Date: Wed, 28 Jul 2021 14:32:14 +0900 Subject: [PATCH 27/55] =?UTF-8?q?=20feat:=20winningResult,=20Rule=EC=9D=84?= =?UTF-8?q?=20Enum=EC=9C=BC=EB=A1=9C=20=EC=84=A0=EC=96=B8=ED=95=98?= =?UTF-8?q?=EC=97=AC=20TotalResult=20=EA=B0=9D=EC=B2=B4=EB=A5=BC=20?= =?UTF-8?q?=EC=83=9D=EC=84=B1=ED=95=B4=20=EC=A0=80=EC=9E=A5=ED=95=98?= =?UTF-8?q?=EB=8F=84=EB=A1=9D=20=EA=B5=AC=ED=98=84?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../domain/participant/Participant.java | 8 +++++ .../blackjack/domain/participant/Player.java | 3 ++ .../java/blackjack/domain/result/Rule.java | 36 +++++++++++++++++++ .../blackjack/domain/result/TotalResult.java | 28 +++++++++++++++ .../domain/result/WinningResult.java | 27 ++++++++++++++ .../domain/result/TotalResultTest.java | 36 +++++++++++++++++++ 6 files changed, 138 insertions(+) create mode 100644 src/main/java/blackjack/domain/result/Rule.java create mode 100644 src/main/java/blackjack/domain/result/TotalResult.java create mode 100644 src/main/java/blackjack/domain/result/WinningResult.java create mode 100644 src/test/java/blackjack/domain/result/TotalResultTest.java diff --git a/src/main/java/blackjack/domain/participant/Participant.java b/src/main/java/blackjack/domain/participant/Participant.java index 30ed52f..e8ca0be 100644 --- a/src/main/java/blackjack/domain/participant/Participant.java +++ b/src/main/java/blackjack/domain/participant/Participant.java @@ -69,6 +69,14 @@ private int sumOfCardsScore() { .sum(); } + public boolean isBust() { + return getCardsSum() > BLACKJACK; + } + + public int calculateBlackJack() { + return 21 - getCardsSum(); + } + @Override public boolean equals(Object o) { if (this == o) return true; diff --git a/src/main/java/blackjack/domain/participant/Player.java b/src/main/java/blackjack/domain/participant/Player.java index 942713e..d4c3ce7 100644 --- a/src/main/java/blackjack/domain/participant/Player.java +++ b/src/main/java/blackjack/domain/participant/Player.java @@ -2,8 +2,11 @@ import blackjack.domain.card.Card; import blackjack.domain.participant.Participant; +import blackjack.domain.result.Rule; +import blackjack.domain.result.WinningResult; import lombok.Getter; +import java.util.Arrays; import java.util.stream.Collectors; @Getter diff --git a/src/main/java/blackjack/domain/result/Rule.java b/src/main/java/blackjack/domain/result/Rule.java new file mode 100644 index 0000000..71609e8 --- /dev/null +++ b/src/main/java/blackjack/domain/result/Rule.java @@ -0,0 +1,36 @@ +package blackjack.domain.result; + +import blackjack.domain.participant.Dealer; +import blackjack.domain.participant.Player; + +import java.util.function.BiFunction; + +public enum Rule { + // 카드 값의 합이 21을 넘으면 승패 결정 + PLAYER_BUST(((player, dealer) -> player.isBust()), WinningResult.LOSE), + DEALER_BUST(((player, dealer) -> dealer.isBust()), WinningResult.WIN), + + // 카드 값의 합이 21을 넘지 않으면서, 값이 더 큰쪽이 승패결정(이미 여기서 결정, BlackJack 체크 필요없음) + PLAYER_HIGHER(((player, dealer) -> player.getCardsSum() > dealer.getCardsSum()), WinningResult.WIN), + DEALER_HIGHER(((player, dealer) -> player.getCardsSum() < dealer.getCardsSum()), WinningResult.LOSE), + + // 무승부 결정 + TIES(((player, dealer) -> player.getCardsSum() == dealer.getCardsSum()), WinningResult.TIE); + + + private BiFunction compare; + private WinningResult winningResult; + + Rule(BiFunction compare, WinningResult winningResult) { + this.compare = compare; + this.winningResult = winningResult; + } + + public Boolean compare(Player player, Dealer dealer) { + return compare.apply(player, dealer); + } + + public WinningResult getWinningResult() { + return winningResult; + } +} diff --git a/src/main/java/blackjack/domain/result/TotalResult.java b/src/main/java/blackjack/domain/result/TotalResult.java new file mode 100644 index 0000000..71b2df0 --- /dev/null +++ b/src/main/java/blackjack/domain/result/TotalResult.java @@ -0,0 +1,28 @@ +package blackjack.domain.result; + +import blackjack.domain.participant.Dealer; +import blackjack.domain.participant.Player; + +import java.util.*; + +public class TotalResult { + + private final Map playersResult = new LinkedHashMap<>(); + private final Map dealerResult = new LinkedHashMap<>(); + + private TotalResult(Dealer dealer, List players) { + // 딜러 기준 승패를 가리기 + // winningResult를 넣은 Map에다가 키 값으로 숫자(승패 숫자) + Arrays.stream(WinningResult.values()) + .forEach(winningResult -> + dealerResult.put(winningResult, 0)); + } + + + public static TotalResult of(Dealer dealer, List players) { + return new TotalResult(dealer, players); + } + + +} + diff --git a/src/main/java/blackjack/domain/result/WinningResult.java b/src/main/java/blackjack/domain/result/WinningResult.java new file mode 100644 index 0000000..c03f83c --- /dev/null +++ b/src/main/java/blackjack/domain/result/WinningResult.java @@ -0,0 +1,27 @@ +package blackjack.domain.result; + +import lombok.Getter; + +@Getter +public enum WinningResult { + + WIN("승"), + LOSE("패"), + TIE("무승부"); + + private final String result; + + WinningResult(String result) { + this.result = result; + } + + public WinningResult reverse() { + if (this == WIN) { + return LOSE; + } + if (this == LOSE) { + return WIN; + } + return TIE; + } +} diff --git a/src/test/java/blackjack/domain/result/TotalResultTest.java b/src/test/java/blackjack/domain/result/TotalResultTest.java new file mode 100644 index 0000000..b5ced5b --- /dev/null +++ b/src/test/java/blackjack/domain/result/TotalResultTest.java @@ -0,0 +1,36 @@ +package blackjack.domain.result; + +import blackjack.domain.participant.Dealer; +import blackjack.domain.participant.Player; +import blackjack.domain.participant.PlayersFactory; +import org.junit.jupiter.api.DisplayName; +import org.junit.jupiter.api.Test; +import org.junit.jupiter.params.provider.Arguments; + +import java.util.List; +import java.util.stream.Stream; + +import static org.junit.jupiter.api.Assertions.*; + +class TotalResultTest { + + private static Stream createResult() { + return Stream.of( + Arguments.of(WinningResult.WIN, 2), + Arguments.of(WinningResult.LOSE, 1), + Arguments.of(WinningResult.TIE, 0) + ); + } +// @Test +// @DisplayName("") +// void () { +// //given +// Dealer dealer = new Dealer(); +// List players = PlayersFactory.createPlayers("Chris, Matilda, Jenny"); +// +// //when +// +// //then +// } + +} \ No newline at end of file From d7e50f400bfebab4e690831442e15d246c5cab63 Mon Sep 17 00:00:00 2001 From: Ariel429 Date: Wed, 28 Jul 2021 15:01:54 +0900 Subject: [PATCH 28/55] =?UTF-8?q?feat:=20=ED=94=8C=EB=A0=88=EC=9D=B4?= =?UTF-8?q?=EC=96=B4=EC=99=80=20=EB=94=9C=EB=9F=AC=EC=9D=98=20=EC=8A=B9?= =?UTF-8?q?=ED=8C=A8=EB=A5=BC=20=ED=8C=90=EA=B0=80=EB=A6=84=ED=95=98?= =?UTF-8?q?=EC=97=AC=20=ED=94=8C=EB=A0=88=EC=9D=B4=EC=96=B4=20=EA=B8=B0?= =?UTF-8?q?=EC=A4=80=EC=9C=BC=EB=A1=9C=20=EC=8A=B9=ED=8C=A8=EB=A5=BC=20?= =?UTF-8?q?=EB=B0=9C=ED=91=9C=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 --- .../blackjack/domain/participant/Player.java | 8 +++ .../java/blackjack/domain/result/Rule.java | 3 +- .../blackjack/domain/result/TotalResult.java | 8 ++- .../domain/result/TotalResultTest.java | 51 +++++++++++++------ 4 files changed, 52 insertions(+), 18 deletions(-) diff --git a/src/main/java/blackjack/domain/participant/Player.java b/src/main/java/blackjack/domain/participant/Player.java index d4c3ce7..508267a 100644 --- a/src/main/java/blackjack/domain/participant/Player.java +++ b/src/main/java/blackjack/domain/participant/Player.java @@ -33,4 +33,12 @@ public String toString() { .collect(Collectors.joining(", "))); return sb.toString(); } + + public WinningResult win(Dealer dealer) { + return Arrays.stream(Rule.values()) + .filter(rule -> rule.compare(this, dealer)) + .findFirst() + .get() + .getWinningResult(); + } } diff --git a/src/main/java/blackjack/domain/result/Rule.java b/src/main/java/blackjack/domain/result/Rule.java index 71609e8..7aff0f9 100644 --- a/src/main/java/blackjack/domain/result/Rule.java +++ b/src/main/java/blackjack/domain/result/Rule.java @@ -6,7 +6,7 @@ import java.util.function.BiFunction; public enum Rule { - // 카드 값의 합이 21을 넘으면 승패 결정 + // 카드 값의 합이 21을 넘으면 승패 결정 (플레이어 기준으로 선언) PLAYER_BUST(((player, dealer) -> player.isBust()), WinningResult.LOSE), DEALER_BUST(((player, dealer) -> dealer.isBust()), WinningResult.WIN), @@ -17,7 +17,6 @@ public enum Rule { // 무승부 결정 TIES(((player, dealer) -> player.getCardsSum() == dealer.getCardsSum()), WinningResult.TIE); - private BiFunction compare; private WinningResult winningResult; diff --git a/src/main/java/blackjack/domain/result/TotalResult.java b/src/main/java/blackjack/domain/result/TotalResult.java index 71b2df0..00eea98 100644 --- a/src/main/java/blackjack/domain/result/TotalResult.java +++ b/src/main/java/blackjack/domain/result/TotalResult.java @@ -16,6 +16,10 @@ private TotalResult(Dealer dealer, List players) { Arrays.stream(WinningResult.values()) .forEach(winningResult -> dealerResult.put(winningResult, 0)); + + // 플레이어 점수랑 딜러 점수 비교하는 로직 + // 플레이어 기준으로 승패가 Map에 입력이 된 상태 + players.forEach(player -> playersResult.put(player, player.win(dealer))); } @@ -23,6 +27,8 @@ public static TotalResult of(Dealer dealer, List players) { return new TotalResult(dealer, players); } - + public Map getPlayersResult() { + return Collections.unmodifiableMap(playersResult); + } } diff --git a/src/test/java/blackjack/domain/result/TotalResultTest.java b/src/test/java/blackjack/domain/result/TotalResultTest.java index b5ced5b..b08bd59 100644 --- a/src/test/java/blackjack/domain/result/TotalResultTest.java +++ b/src/test/java/blackjack/domain/result/TotalResultTest.java @@ -1,36 +1,57 @@ package blackjack.domain.result; +import blackjack.domain.card.Card; +import blackjack.domain.card.Denomination; +import blackjack.domain.card.Type; import blackjack.domain.participant.Dealer; import blackjack.domain.participant.Player; import blackjack.domain.participant.PlayersFactory; import org.junit.jupiter.api.DisplayName; -import org.junit.jupiter.api.Test; +import org.junit.jupiter.params.ParameterizedTest; import org.junit.jupiter.params.provider.Arguments; +import org.junit.jupiter.params.provider.EnumSource; import java.util.List; import java.util.stream.Stream; -import static org.junit.jupiter.api.Assertions.*; +import static org.assertj.core.api.Assertions.assertThat; class TotalResultTest { private static Stream createResult() { return Stream.of( Arguments.of(WinningResult.WIN, 2), - Arguments.of(WinningResult.LOSE, 1), - Arguments.of(WinningResult.TIE, 0) + Arguments.of(WinningResult.TIE, 1), + Arguments.of(WinningResult.LOSE, 0) ); } -// @Test -// @DisplayName("") -// void () { -// //given -// Dealer dealer = new Dealer(); -// List players = PlayersFactory.createPlayers("Chris, Matilda, Jenny"); -// -// //when -// -// //then -// } + + + @ParameterizedTest + @EnumSource(WinningResult.class) + @DisplayName("각 플레이어의 승패를 확인한다.") + void playerResultTest(WinningResult winningResult) { + //given + Dealer dealer = new Dealer(); + List players = PlayersFactory.createPlayers("Chris, Matilda, Jenny"); + + dealer.receiveCard(new Card(Denomination.NINE, Type.CLUB)); + + players.get(0) + .receiveCard((new Card(Denomination.FOUR, Type.DIAMOND))); // 패 + + players.get(1) + .receiveCard((new Card(Denomination.NINE, Type.HEART))); // 무승부 + + players.get(2) + .receiveCard((new Card(Denomination.QUEEN, Type.SPADE))); // 승 + + //when + TotalResult totalResult = TotalResult.of(dealer, players); + + //then + assertThat(totalResult.getPlayersResult()).containsValues(winningResult); + + } } \ No newline at end of file From 33dc3e5560c658dd4ef9885dc8abdc7fe8e9e5a3 Mon Sep 17 00:00:00 2001 From: Ariel429 Date: Wed, 28 Jul 2021 15:59:10 +0900 Subject: [PATCH 29/55] =?UTF-8?q?feat:=20=ED=94=8C=EB=A0=88=EC=9D=B4?= =?UTF-8?q?=EC=96=B4=EC=99=80=20=EB=94=9C=EB=9F=AC=EC=9D=98=20=EC=8A=B9?= =?UTF-8?q?=ED=8C=A8=EB=A5=BC=20=ED=8C=90=EA=B0=80=EB=A6=84=ED=95=98?= =?UTF-8?q?=EC=97=AC,=20=EB=94=9C=EB=9F=AC=EA=B8=B0=EC=A4=80=EC=9C=BC?= =?UTF-8?q?=EB=A1=9C=20=EC=8A=B9=ED=8C=A8=EB=A5=BC=20=EB=B0=9C=ED=91=9C?= =?UTF-8?q?=ED=95=98=EB=8A=94=20=EB=A1=9C=EC=A7=81=20=EA=B5=AC=ED=98=84=20?= =?UTF-8?q?=EB=B0=8F=20=EB=88=84=EB=9D=BDtest=20=EC=BB=A4=EB=B0=8B?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../blackjack/domain/result/TotalResult.java | 12 ++++- .../domain/result/TotalResultTest.java | 54 ++++++++++++++----- .../domain/result/WinningResultTest.java | 46 ++++++++++++++++ 3 files changed, 98 insertions(+), 14 deletions(-) create mode 100644 src/test/java/blackjack/domain/result/WinningResultTest.java diff --git a/src/main/java/blackjack/domain/result/TotalResult.java b/src/main/java/blackjack/domain/result/TotalResult.java index 00eea98..cf56212 100644 --- a/src/main/java/blackjack/domain/result/TotalResult.java +++ b/src/main/java/blackjack/domain/result/TotalResult.java @@ -11,7 +11,7 @@ public class TotalResult { private final Map dealerResult = new LinkedHashMap<>(); private TotalResult(Dealer dealer, List players) { - // 딜러 기준 승패를 가리기 + // 플레이어 기준 승패를 가리기 // winningResult를 넣은 Map에다가 키 값으로 숫자(승패 숫자) Arrays.stream(WinningResult.values()) .forEach(winningResult -> @@ -20,8 +20,12 @@ private TotalResult(Dealer dealer, List players) { // 플레이어 점수랑 딜러 점수 비교하는 로직 // 플레이어 기준으로 승패가 Map에 입력이 된 상태 players.forEach(player -> playersResult.put(player, player.win(dealer))); - } + // 넣어둔 value가 있으면 apply = computeIfPresent + // 딜러기준으로 승패를 바꿔주고, 승패 숫자를 하나씩 올려줌 + playersResult.values() + .forEach(winningResult -> dealerResult.computeIfPresent(winningResult.reverse(), (key, value) -> value + 1)); + } public static TotalResult of(Dealer dealer, List players) { return new TotalResult(dealer, players); @@ -30,5 +34,9 @@ public static TotalResult of(Dealer dealer, List players) { public Map getPlayersResult() { return Collections.unmodifiableMap(playersResult); } + + public Map getDealerResult() { + return Collections.unmodifiableMap(dealerResult); + } } diff --git a/src/test/java/blackjack/domain/result/TotalResultTest.java b/src/test/java/blackjack/domain/result/TotalResultTest.java index b08bd59..9b1480f 100644 --- a/src/test/java/blackjack/domain/result/TotalResultTest.java +++ b/src/test/java/blackjack/domain/result/TotalResultTest.java @@ -7,25 +7,21 @@ import blackjack.domain.participant.Player; import blackjack.domain.participant.PlayersFactory; import org.junit.jupiter.api.DisplayName; +import org.junit.jupiter.api.Test; import org.junit.jupiter.params.ParameterizedTest; import org.junit.jupiter.params.provider.Arguments; import org.junit.jupiter.params.provider.EnumSource; +import org.junit.jupiter.params.provider.MethodSource; import java.util.List; +import java.util.Map; import java.util.stream.Stream; import static org.assertj.core.api.Assertions.assertThat; +import static org.assertj.core.api.Assertions.entry; class TotalResultTest { - private static Stream createResult() { - return Stream.of( - Arguments.of(WinningResult.WIN, 2), - Arguments.of(WinningResult.TIE, 1), - Arguments.of(WinningResult.LOSE, 0) - ); - } - @ParameterizedTest @EnumSource(WinningResult.class) @@ -38,13 +34,13 @@ void playerResultTest(WinningResult winningResult) { dealer.receiveCard(new Card(Denomination.NINE, Type.CLUB)); players.get(0) - .receiveCard((new Card(Denomination.FOUR, Type.DIAMOND))); // 패 + .receiveCard((new Card(Denomination.FOUR, Type.DIAMOND))); // 플레이어 패 players.get(1) - .receiveCard((new Card(Denomination.NINE, Type.HEART))); // 무승부 + .receiveCard((new Card(Denomination.NINE, Type.HEART))); // 플레이어 무승부 players.get(2) - .receiveCard((new Card(Denomination.QUEEN, Type.SPADE))); // 승 + .receiveCard((new Card(Denomination.QUEEN, Type.SPADE))); // 플레이어 승 //when TotalResult totalResult = TotalResult.of(dealer, players); @@ -54,4 +50,38 @@ void playerResultTest(WinningResult winningResult) { } -} \ No newline at end of file + @ParameterizedTest + @MethodSource("dealerResultTest") + @DisplayName("딜러의 승패를 확인한다.") + void dealerResultTest(WinningResult winningResult, int result) { + //given + Dealer dealer = new Dealer(); + List players = PlayersFactory.createPlayers("Chris, Matilda, Jenny"); + + dealer.receiveCard(new Card(Denomination.NINE, Type.CLUB)); + + players.get(0) + .receiveCard((new Card(Denomination.FOUR, Type.DIAMOND))); // 플레이어 패 = 딜러 승1 + + players.get(1) + .receiveCard((new Card(Denomination.JACK, Type.HEART))); // 플레이어 승 = 딜러 패1 + + players.get(2) + .receiveCard((new Card(Denomination.QUEEN, Type.SPADE))); // 플레이어 승 = 딜러 패2 + + //when + TotalResult totalResult = TotalResult.of(dealer, players); + + //then + assertThat(totalResult.getDealerResult()).contains(entry(winningResult, result)); + } + + private static Stream dealerResultTest() { + return Stream.of( + Arguments.of(WinningResult.WIN, 1), + Arguments.of(WinningResult.LOSE, 2), + Arguments.of(WinningResult.TIE, 0) + ); + } + +} diff --git a/src/test/java/blackjack/domain/result/WinningResultTest.java b/src/test/java/blackjack/domain/result/WinningResultTest.java new file mode 100644 index 0000000..f73f162 --- /dev/null +++ b/src/test/java/blackjack/domain/result/WinningResultTest.java @@ -0,0 +1,46 @@ +package blackjack.domain.result; + +import org.junit.jupiter.api.DisplayName; +import org.junit.jupiter.api.Test; +import org.junit.jupiter.params.ParameterizedTest; +import org.junit.jupiter.params.provider.Arguments; +import org.junit.jupiter.params.provider.MethodSource; + +import java.util.stream.Stream; + +import static org.assertj.core.api.Assertions.*; + +class WinningResultTest { + + @ParameterizedTest + @MethodSource("createWinningResult") + @DisplayName("승패 결과를 가져온다.") + void getWinningResultTest(WinningResult winningResult, String expected) { + //when //then + assertThat(winningResult.getResult()).isEqualTo(expected); + } + + private static Stream createWinningResult() { + return Stream.of( + Arguments.of(WinningResult.WIN, "승"), + Arguments.of(WinningResult.LOSE, "패"), + Arguments.of(WinningResult.TIE, "무승부") + ); + } + + @ParameterizedTest + @MethodSource("createReverseWinningResult") + @DisplayName("승패 결과의 반전된 값을 가져온다.") + void getWinningResultReverseTest(WinningResult winningResult, WinningResult expected) { + //when //then + assertThat(winningResult.reverse()).isEqualTo(expected); + } + + private static Stream createReverseWinningResult() { + return Stream.of( + Arguments.of(WinningResult.WIN, WinningResult.LOSE), + Arguments.of(WinningResult.LOSE, WinningResult.WIN), + Arguments.of(WinningResult.TIE, WinningResult.TIE) + ); + } +} \ No newline at end of file From 56880bbdc5c22c567f33e00861c54e468f8e9028 Mon Sep 17 00:00:00 2001 From: Ariel429 Date: Wed, 28 Jul 2021 16:07:44 +0900 Subject: [PATCH 30/55] =?UTF-8?q?feat:=20=EA=B2=8C=EC=9E=84=20=EC=A2=85?= =?UTF-8?q?=EB=A3=8C=20=ED=9B=84=20=EB=AA=A8=EB=93=A0=20=ED=94=8C=EB=A0=88?= =?UTF-8?q?=EC=9D=B4=EC=96=B4=EC=9D=98=20=EC=B9=B4=EB=93=9C=20=EB=AA=A9?= =?UTF-8?q?=EB=A1=9D,=20=EC=B9=B4=EB=93=9C=EA=B0=92=EC=9D=98=20=ED=95=A9?= =?UTF-8?q?=20=EC=B6=9C=EB=A0=A5=ED=95=98=EB=8A=94=20=EB=A1=9C=EC=A7=81=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 --- .../java/blackjack/controller/BlackJackController.java | 8 ++++---- src/main/java/blackjack/view/OutputView.java | 4 ++-- 2 files changed, 6 insertions(+), 6 deletions(-) diff --git a/src/main/java/blackjack/controller/BlackJackController.java b/src/main/java/blackjack/controller/BlackJackController.java index 4eaa095..8181edf 100644 --- a/src/main/java/blackjack/controller/BlackJackController.java +++ b/src/main/java/blackjack/controller/BlackJackController.java @@ -1,9 +1,9 @@ package blackjack.controller; -import blackjack.domain.Dealer; -import blackjack.domain.Deck; -import blackjack.domain.Player; -import blackjack.domain.PlayersFactory; +import blackjack.domain.card.Deck; +import blackjack.domain.participant.Dealer; +import blackjack.domain.participant.Player; +import blackjack.domain.participant.PlayersFactory; import blackjack.dto.DrawCardResponseDTO; import blackjack.dto.PlayersNameInputDTO; import blackjack.view.InputView; diff --git a/src/main/java/blackjack/view/OutputView.java b/src/main/java/blackjack/view/OutputView.java index 9bda44a..ee414ca 100644 --- a/src/main/java/blackjack/view/OutputView.java +++ b/src/main/java/blackjack/view/OutputView.java @@ -1,7 +1,7 @@ package blackjack.view; -import blackjack.domain.Dealer; -import blackjack.domain.Player; +import blackjack.domain.participant.Dealer; +import blackjack.domain.participant.Player; import java.util.List; import java.util.stream.Collectors; From f3f0d12e2262b46b5cf581de2d68c4b727cf5621 Mon Sep 17 00:00:00 2001 From: Ariel429 Date: Wed, 28 Jul 2021 17:38:01 +0900 Subject: [PATCH 31/55] =?UTF-8?q?feat:=20=EA=B2=8C=EC=9E=84=20=EC=A2=85?= =?UTF-8?q?=EB=A3=8C=20=ED=9B=84=20=EC=B5=9C=EC=A2=85=20=EA=B2=B0=EA=B3=BC?= =?UTF-8?q?=EB=A5=BC=20=EC=B6=9C=EB=A0=A5=ED=95=98=EB=8A=94=20=EB=A1=9C?= =?UTF-8?q?=EC=A7=81=20=EA=B5=AC=ED=98=84?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../controller/BlackJackController.java | 5 ++ .../domain/participant/Participant.java | 4 -- .../{TotalResult.java => GameResult.java} | 8 +-- src/main/java/blackjack/view/OutputView.java | 63 ++++++++++++++++++- ...talResultTest.java => GameResultTest.java} | 12 ++-- 5 files changed, 76 insertions(+), 16 deletions(-) rename src/main/java/blackjack/domain/result/{TotalResult.java => GameResult.java} (86%) rename src/test/java/blackjack/domain/result/{TotalResultTest.java => GameResultTest.java} (87%) diff --git a/src/main/java/blackjack/controller/BlackJackController.java b/src/main/java/blackjack/controller/BlackJackController.java index 8181edf..7bbccbd 100644 --- a/src/main/java/blackjack/controller/BlackJackController.java +++ b/src/main/java/blackjack/controller/BlackJackController.java @@ -4,6 +4,7 @@ import blackjack.domain.participant.Dealer; import blackjack.domain.participant.Player; import blackjack.domain.participant.PlayersFactory; +import blackjack.domain.result.GameResult; import blackjack.dto.DrawCardResponseDTO; import blackjack.dto.PlayersNameInputDTO; import blackjack.view.InputView; @@ -32,6 +33,10 @@ public void run() { drawCardToPlayers(); // 딜러에게 한장씩 카드 분배(카드 합이 17미만인 경우만) drawCardToDealer(); + // 플레이어가 가진 카드목록과 카드값의 총합 출력 + outputView.printCardsResult(dealer, players); + // 게임 결과를 출력 + outputView.printGameResult(GameResult.of(dealer, players)); } private void drawTowCards() { diff --git a/src/main/java/blackjack/domain/participant/Participant.java b/src/main/java/blackjack/domain/participant/Participant.java index e8ca0be..33a059d 100644 --- a/src/main/java/blackjack/domain/participant/Participant.java +++ b/src/main/java/blackjack/domain/participant/Participant.java @@ -73,10 +73,6 @@ public boolean isBust() { return getCardsSum() > BLACKJACK; } - public int calculateBlackJack() { - return 21 - getCardsSum(); - } - @Override public boolean equals(Object o) { if (this == o) return true; diff --git a/src/main/java/blackjack/domain/result/TotalResult.java b/src/main/java/blackjack/domain/result/GameResult.java similarity index 86% rename from src/main/java/blackjack/domain/result/TotalResult.java rename to src/main/java/blackjack/domain/result/GameResult.java index cf56212..9bdf4fc 100644 --- a/src/main/java/blackjack/domain/result/TotalResult.java +++ b/src/main/java/blackjack/domain/result/GameResult.java @@ -5,12 +5,12 @@ import java.util.*; -public class TotalResult { +public class GameResult { private final Map playersResult = new LinkedHashMap<>(); private final Map dealerResult = new LinkedHashMap<>(); - private TotalResult(Dealer dealer, List players) { + private GameResult(Dealer dealer, List players) { // 플레이어 기준 승패를 가리기 // winningResult를 넣은 Map에다가 키 값으로 숫자(승패 숫자) Arrays.stream(WinningResult.values()) @@ -27,8 +27,8 @@ private TotalResult(Dealer dealer, List players) { .forEach(winningResult -> dealerResult.computeIfPresent(winningResult.reverse(), (key, value) -> value + 1)); } - public static TotalResult of(Dealer dealer, List players) { - return new TotalResult(dealer, players); + public static GameResult of(Dealer dealer, List players) { + return new GameResult(dealer, players); } public Map getPlayersResult() { diff --git a/src/main/java/blackjack/view/OutputView.java b/src/main/java/blackjack/view/OutputView.java index ee414ca..78fc7e9 100644 --- a/src/main/java/blackjack/view/OutputView.java +++ b/src/main/java/blackjack/view/OutputView.java @@ -2,8 +2,11 @@ import blackjack.domain.participant.Dealer; import blackjack.domain.participant.Player; +import blackjack.domain.result.GameResult; +import blackjack.domain.result.WinningResult; import java.util.List; +import java.util.Map; import java.util.stream.Collectors; public class OutputView { @@ -17,8 +20,8 @@ public void printFirstCardsGiven(List players, Dealer dealer) { .map(Player::getName) .collect(Collectors.joining(", "))); sb.append("에게 2장의 카드를 나누었습니다."); - sb.append(NEW_LINE); System.out.println(sb); + } public void printDealerCard(Dealer dealer) { @@ -29,6 +32,7 @@ public void printPlayersCard(List players) { for (Player player : players) { System.out.println(player); } + System.out.println(); } public void printCards(Player player) { @@ -38,4 +42,61 @@ public void printCards(Player player) { public void printDealerCardGiven() { System.out.println("딜러는 16이하라 한장의 카드를 더 받았습니다."); } + + public void printCardsResult(Dealer dealer, List players) { + printDealerCardsResult(dealer); + + for (Player player : players) { + printPlayerCardsResult(player); + } + } + + private void printDealerCardsResult(Dealer dealer) { + StringBuilder sb = new StringBuilder(); + sb.append(NEW_LINE) + .append(dealer.toString()) + .append(" - 결과: ") + .append(dealer.getCardsSum()); + + System.out.println(sb); + } + + private void printPlayerCardsResult(Player player) { + StringBuilder sb = new StringBuilder(player.toString()); + sb.append(" - 결과: "); + sb.append(player.getCardsSum()); + + System.out.println(sb); + } + + public void printGameResult(GameResult gameResult) { + System.out.println("\n## 최종승패"); + printDealerResult(gameResult.getDealerResult()); + printPlayerResult(gameResult.getPlayersResult()); + + } + + private void printDealerResult(Map dealerResult) { + StringBuilder sb = new StringBuilder("딜러: "); + sb.append(dealerResult.entrySet() + .stream() + .filter(winningResult -> winningResult.getValue() > 0) + .map(winningResult -> winningResult.getValue() + winningResult.getKey().getResult()) + .collect(Collectors.joining(" "))); + + System.out.println(sb); + + } + + private void printPlayerResult(Map playersResult) { + StringBuilder sb = new StringBuilder(); + sb.append(playersResult.entrySet() + .stream() + .map(playerResult -> playerResult.getKey().getName() + ": " + playerResult.getValue().getResult()) + .collect(Collectors.joining("\n"))); + + System.out.println(sb); + } + + } diff --git a/src/test/java/blackjack/domain/result/TotalResultTest.java b/src/test/java/blackjack/domain/result/GameResultTest.java similarity index 87% rename from src/test/java/blackjack/domain/result/TotalResultTest.java rename to src/test/java/blackjack/domain/result/GameResultTest.java index 9b1480f..dd3b572 100644 --- a/src/test/java/blackjack/domain/result/TotalResultTest.java +++ b/src/test/java/blackjack/domain/result/GameResultTest.java @@ -7,20 +7,18 @@ import blackjack.domain.participant.Player; import blackjack.domain.participant.PlayersFactory; import org.junit.jupiter.api.DisplayName; -import org.junit.jupiter.api.Test; import org.junit.jupiter.params.ParameterizedTest; import org.junit.jupiter.params.provider.Arguments; import org.junit.jupiter.params.provider.EnumSource; import org.junit.jupiter.params.provider.MethodSource; import java.util.List; -import java.util.Map; import java.util.stream.Stream; import static org.assertj.core.api.Assertions.assertThat; import static org.assertj.core.api.Assertions.entry; -class TotalResultTest { +class GameResultTest { @ParameterizedTest @@ -43,10 +41,10 @@ void playerResultTest(WinningResult winningResult) { .receiveCard((new Card(Denomination.QUEEN, Type.SPADE))); // 플레이어 승 //when - TotalResult totalResult = TotalResult.of(dealer, players); + GameResult gameResult = GameResult.of(dealer, players); //then - assertThat(totalResult.getPlayersResult()).containsValues(winningResult); + assertThat(gameResult.getPlayersResult()).containsValues(winningResult); } @@ -70,10 +68,10 @@ void dealerResultTest(WinningResult winningResult, int result) { .receiveCard((new Card(Denomination.QUEEN, Type.SPADE))); // 플레이어 승 = 딜러 패2 //when - TotalResult totalResult = TotalResult.of(dealer, players); + GameResult gameResult = GameResult.of(dealer, players); //then - assertThat(totalResult.getDealerResult()).contains(entry(winningResult, result)); + assertThat(gameResult.getDealerResult()).contains(entry(winningResult, result)); } private static Stream dealerResultTest() { From 3260c5d7bf2d12ffaa5872c8d5dc6e851b3bd5e1 Mon Sep 17 00:00:00 2001 From: Ariel429 Date: Wed, 28 Jul 2021 17:41:23 +0900 Subject: [PATCH 32/55] =?UTF-8?q?docs:=20=EB=88=84=EB=9D=BD=EB=90=9C=20?= =?UTF-8?q?=EC=BB=A4=EB=B0=8B=20=EC=B6=94=EA=B0=80?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- README.md | 48 +++++++++++++++++++++++------------------------- 1 file changed, 23 insertions(+), 25 deletions(-) diff --git a/README.md b/README.md index d192256..1012d0d 100644 --- a/README.md +++ b/README.md @@ -2,34 +2,32 @@ # 구현 기능 목록 --[ ] 플레이어별 배팅 금액 입력 +-[x] 게임 + - [x] 플레이어들의 이름을 입력받는다. + - [x] 최소 플레이어는 1명으로, 딜러와 게임을 진행한다. + - [x] ,를 기준으로 분리 --[ ] 게임 - - [ ] 플레이어들의 이름을 입력받는다. - - [ ] 최소 플레이어는 1명으로, 딜러와 게임을 진행한다. - - [ ] ,를 기준으로 분리 - - - [ ] 시작시 각 플레이어가 두 장의 카드를 지급받는다. + - [x] 시작시 각 플레이어가 두 장의 카드를 지급받는다. - [x] 딜러는 처음에 받은 2장의 합계가 16이하이면 반드시 1장의 카드를 뽑는다. - [x] 딜러는 처음에 받은 2장의 합계가 17이상이면 추가로 받을 수 없다. - - [ ] 플레이어는 카드 숫자의 합이 21이 초과하지 않는 동안 원하는 만큼 카드를 뽑을 수 있다. - - [ ] 카드를 추가로 뽑아 21을 초과할 경우 배팅 금액을 모두 잃게 된다. - - [ ] Ace를 가진 플레이어는 에이스의 숫자값으로 1 혹은 11을 선택할 수 있다. - - [ ] King, Queen, Jack의 숫자값은 각각 10으로 취급한다. - --[ ] 출력 - - [ ] 게임 시작 시 각 플레이어가 받은 2장의 카드를 출력한다. - - [ ] 각 플레이어에게 추가로 카드를 받을 것인지 묻는다. - - [ ] 카드를 추가로 받으면 해당 플레이어가 가진 카드 목록을 출력한다. - - [ ] 딜러는 카드값의 합이 16이하면 카드를 추가로 받았다는 메시지를 출력한다. - - - [ ] 모든 플레이어가 더이상 카드를 뽑지 않으면 게임이 종료된다. - - [ ] 플레이어별 카드의 목록을 출력한다. - - [ ] 플레이어별 카드 숫자의 합을 계산하여 결과로 출력한다. - - - [ ] 게임을 완료한 후 각 플레이어별로 승패를 출력한다. - - [ ] 딜러는 각 플레이어와의 승패를 누적해서 출력한다. - - [ ] 플레이어는 딜러와의 승패를 출력한다. + - [x] 플레이어는 카드 숫자의 합이 21이 초과하지 않는 동안 원하는 만큼 카드를 뽑을 수 있다. + - [x] 카드를 추가로 뽑아 21을 초과할 경우 배팅 금액을 모두 잃게 된다. + - [x] Ace를 가진 플레이어는 에이스의 숫자값으로 1 혹은 11을 선택할 수 있다. + - [x] King, Queen, Jack의 숫자값은 각각 10으로 취급한다. + +-[x] 출력 + - [x] 게임 시작 시 각 플레이어가 받은 2장의 카드를 출력한다. + - [x] 각 플레이어에게 추가로 카드를 받을 것인지 묻는다. + - [x] 카드를 추가로 받으면 해당 플레이어가 가진 카드 목록을 출력한다. + - [x] 딜러는 카드값의 합이 16이하면 카드를 추가로 받았다는 메시지를 출력한다. + + - [x] 모든 플레이어가 더이상 카드를 뽑지 않으면 게임이 종료된다. + - [x] 플레이어별 카드의 목록을 출력한다. + - [x] 플레이어별 카드 숫자의 합을 계산하여 결과로 출력한다. + + - [x] 게임을 완료한 후 각 플레이어별로 승패를 출력한다. + - [x] 딜러는 각 플레이어와의 승패를 누적해서 출력한다. + - [x] 플레이어는 딜러와의 승패를 출력한다. \ No newline at end of file From b71d34125a2c370618c5e2be2abae6c3ae7e9be2 Mon Sep 17 00:00:00 2001 From: Ariel429 Date: Thu, 29 Jul 2021 09:42:14 +0900 Subject: [PATCH 33/55] =?UTF-8?q?refactor:=20=EC=B9=B4=EB=93=9C=20?= =?UTF-8?q?=EB=8D=B1=EC=9D=84=20=EC=83=9D=EC=84=B1=ED=95=98=EB=8A=94=20?= =?UTF-8?q?=ED=81=B4=EB=9E=98=EC=8A=A4=EB=A5=BC=20DeckFactory=EB=A1=9C=20?= =?UTF-8?q?=EB=B6=84=EB=A6=AC,=20=EC=9D=B4=EC=A4=91=20depth=20=EC=A0=9C?= =?UTF-8?q?=EA=B1=B0?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- src/main/java/blackjack/domain/card/Deck.java | 8 ++--- .../blackjack/domain/card/DeckFactory.java | 35 +++++++++++++++++++ .../domain/card/DeckFactoryTest.java | 23 ++++++++++++ .../java/blackjack/domain/card/DeckTest.java | 12 ------- 4 files changed, 60 insertions(+), 18 deletions(-) create mode 100644 src/main/java/blackjack/domain/card/DeckFactory.java create mode 100644 src/test/java/blackjack/domain/card/DeckFactoryTest.java diff --git a/src/main/java/blackjack/domain/card/Deck.java b/src/main/java/blackjack/domain/card/Deck.java index 7a3835d..3c7b723 100644 --- a/src/main/java/blackjack/domain/card/Deck.java +++ b/src/main/java/blackjack/domain/card/Deck.java @@ -12,14 +12,10 @@ public class Deck { private static final String ALERT_NO_CARD_LEFT = "사용 가능한 카드를 모두 소진하였습니다."; @Getter - private final List deck = new LinkedList<>(); + private final List deck; public Deck() { - for (Denomination denomination : Denomination.values()) { - for (Type type : Type.values()) { - deck.add(new Card(denomination, type)); - } - } + this.deck = new LinkedList<>(DeckFactory.createDeck()); } public Card drawCard() { diff --git a/src/main/java/blackjack/domain/card/DeckFactory.java b/src/main/java/blackjack/domain/card/DeckFactory.java new file mode 100644 index 0000000..c68624b --- /dev/null +++ b/src/main/java/blackjack/domain/card/DeckFactory.java @@ -0,0 +1,35 @@ +package blackjack.domain.card; + +import java.util.ArrayList; +import java.util.Collections; +import java.util.List; + +public class DeckFactory { + + private static List cardsDeck = createCardsDeck(); + + private static List createCardsDeck() { + List cards = new ArrayList<>(); + + for (Denomination denomination : Denomination.values()) { + cards.addAll(createCards(denomination)); + } + return cards; + } + + private static List createCards(Denomination denomination) { + List cards = new ArrayList<>(); + + for (Type type : Type.values()) { + cards.add(new Card(denomination, type)); + } + + return cards; + } + + public static List createDeck() { + return Collections.unmodifiableList(cardsDeck); + } +} + + diff --git a/src/test/java/blackjack/domain/card/DeckFactoryTest.java b/src/test/java/blackjack/domain/card/DeckFactoryTest.java new file mode 100644 index 0000000..28652db --- /dev/null +++ b/src/test/java/blackjack/domain/card/DeckFactoryTest.java @@ -0,0 +1,23 @@ +package blackjack.domain.card; + +import org.junit.jupiter.api.DisplayName; +import org.junit.jupiter.api.Test; + +import static org.assertj.core.api.Assertions.*; + +class DeckFactoryTest { + + @DisplayName("생성된 덱에 포함된 카드 숫자가 52장인지 확인한다") + @Test + void createTest() { + //given //when //then + assertThat(DeckFactory.createDeck()).hasSize(52); + } + + @Test + @DisplayName("같은 Denomination, 같은 type을 가진 카드는 같다.") + void equalsTest() { + //given //when //then + assertThat(DeckFactory.createDeck()).isEqualTo(DeckFactory.createDeck()); + } +} \ No newline at end of file diff --git a/src/test/java/blackjack/domain/card/DeckTest.java b/src/test/java/blackjack/domain/card/DeckTest.java index 008b77d..521d95f 100644 --- a/src/test/java/blackjack/domain/card/DeckTest.java +++ b/src/test/java/blackjack/domain/card/DeckTest.java @@ -5,8 +5,6 @@ import blackjack.domain.participant.Dealer; import blackjack.domain.participant.Participant; import blackjack.domain.participant.Player; -import blackjack.domain.card.Denomination; -import blackjack.domain.card.Type; import org.junit.jupiter.api.DisplayName; import org.junit.jupiter.api.Test; @@ -15,16 +13,6 @@ class DeckTest { - @DisplayName("생성된 덱에 포함된 카드 숫자가 52장인지 확인한다") - @Test - void createTest() { - // given - Deck deck = new Deck(); - - // when //then - assertThat(deck.getDeck()).hasSize(52); - } - @DisplayName("생성된 덱에 스페이드 에이스가 포함되어 있다.") @Test void testDeckHasSpadeAce() { From 6f547a39d1df24b8bbf25a836dac16e246666508 Mon Sep 17 00:00:00 2001 From: Ariel429 Date: Thu, 29 Jul 2021 10:03:29 +0900 Subject: [PATCH 34/55] =?UTF-8?q?refactor:=20=EC=9D=B4=EC=A4=91=20depth=20?= =?UTF-8?q?=EC=A0=9C=EA=B1=B0=20(do-while=EB=AC=B8=20=EC=82=AC=EC=9A=A9)?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../java/blackjack/controller/BlackJackController.java | 9 +++------ 1 file changed, 3 insertions(+), 6 deletions(-) diff --git a/src/main/java/blackjack/controller/BlackJackController.java b/src/main/java/blackjack/controller/BlackJackController.java index 7bbccbd..a61a38c 100644 --- a/src/main/java/blackjack/controller/BlackJackController.java +++ b/src/main/java/blackjack/controller/BlackJackController.java @@ -58,16 +58,13 @@ private void drawCardToPlayers() { } private void drawCardToPlayer(Player player) { - DrawCardResponseDTO drawCardResponse = inputView.getPlayersResponse(player); - while (player.drawable() && isYes(drawCardResponse)) { + DrawCardResponseDTO drawCardResponse; + do { player.receiveCard(deck.drawCard()); - if (!player.drawable()) { - break; - } outputView.printCards(player); drawCardResponse = inputView.getPlayersResponse(player); - } + } while (player.drawable() && isYes(drawCardResponse)); } private boolean isYes(DrawCardResponseDTO response) { From 1177903163544d82485119eccbfda845ba193ff4 Mon Sep 17 00:00:00 2001 From: Ariel429 Date: Thu, 29 Jul 2021 10:33:35 +0900 Subject: [PATCH 35/55] =?UTF-8?q?refactor:=20=EC=82=AC=EC=9A=A9=EC=9E=90?= =?UTF-8?q?=EC=9D=98=20=EC=9D=B4=EB=A6=84=20=EC=9E=85=EB=A0=A5=EC=97=90=20?= =?UTF-8?q?=EB=8C=80=ED=95=9C=20=EC=98=88=EC=99=B8=EC=B2=98=EB=A6=AC?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- README.md | 13 ++++++- .../domain/participant/Participant.java | 34 +++++++++++++++---- .../domain/participant/PlayersFactory.java | 5 ++- .../{StringUtils.java => SplitUtil.java} | 2 +- .../participant/PlayersFactoryTest.java | 6 ++-- 5 files changed, 45 insertions(+), 15 deletions(-) rename src/main/java/blackjack/utils/{StringUtils.java => SplitUtil.java} (93%) diff --git a/README.md b/README.md index 1012d0d..2a0ea18 100644 --- a/README.md +++ b/README.md @@ -30,4 +30,15 @@ - [x] 플레이어는 딜러와의 승패를 출력한다. - \ No newline at end of file +- [x] 예외 + - 이름 + - [x] 플레이어의 이름은 공백, null 값이 될 수 없다. + - [x] 플레이어의 이름은 특수문자를 포함할 수 없다. + - [x] 플레이어의 이름은 "딜러"가 될 수 없다. + + - 카드 덱 + - [] 하나의 카드덱에서는 카드를 52장 초과하여 뽑을 수 없다. + - + - 플레이어에게 카드를 더 받을 것인지 질문 + - [] y, n가 아닌 형태로 대답할 수 없다. + - [] 대문자의 Y, N도 인식 \ No newline at end of file diff --git a/src/main/java/blackjack/domain/participant/Participant.java b/src/main/java/blackjack/domain/participant/Participant.java index 33a059d..6dfa1d8 100644 --- a/src/main/java/blackjack/domain/participant/Participant.java +++ b/src/main/java/blackjack/domain/participant/Participant.java @@ -3,6 +3,7 @@ import blackjack.domain.card.Card; import blackjack.domain.card.Denomination; import lombok.Getter; +import org.apache.commons.lang3.StringUtils; import java.util.ArrayList; import java.util.List; @@ -13,22 +14,43 @@ public abstract class Participant { private static final int DIFFERENCE_OF_ACE_SCORE = 10; private static final int BLACKJACK = 21; private static final int ZERO = 0; + private static final String CHECK_NULL_OR_EMPTY = "이름이 빈 칸 혹은 null 값이 아닌지 확인해주세요."; + private static final String CHECK_CONTAINING_ONLY_LETTERS_AND_DIGITS = "이름은 특수문자를 포함하지 않은 문자와 숫자로 지정해주세요."; + private static final String CHECK_SAME_NAME_AS_DEALER = "이름은 딜러와 같을 수 없으니 다른 이름을 지정해주세요."; private final String name; private final List cards; public Participant(String name) { - // validate(name) + validateName(name); this.name = name; this.cards = new ArrayList<>(); } -// private void validate(String name){ -// if (StringUtils.isBlank(name)) { -// throw new IllegalArgumentException("이름이 빈 칸 혹은 null 값이 아닌지 확인해주세요."); -// } -// } + private void validateName(String name) { + validateNullOrEmpty(name); + validateAlphaNumeric(name); + validateDealerNameDuplicated(name); + } + + private void validateNullOrEmpty(String name) { + if (StringUtils.isBlank(name)) { + throw new IllegalArgumentException(CHECK_NULL_OR_EMPTY); + } + } + + private void validateAlphaNumeric(String name) { + if (StringUtils.isAlphanumeric(name)) { + throw new IllegalArgumentException(CHECK_CONTAINING_ONLY_LETTERS_AND_DIGITS); + } + } + + private void validateDealerNameDuplicated(String name) { + if (name.equals("딜러")) { + throw new IllegalArgumentException(CHECK_SAME_NAME_AS_DEALER); + } + } protected abstract boolean drawable(); diff --git a/src/main/java/blackjack/domain/participant/PlayersFactory.java b/src/main/java/blackjack/domain/participant/PlayersFactory.java index deeacb8..36de0e6 100644 --- a/src/main/java/blackjack/domain/participant/PlayersFactory.java +++ b/src/main/java/blackjack/domain/participant/PlayersFactory.java @@ -1,7 +1,6 @@ package blackjack.domain.participant; -import blackjack.domain.participant.Player; -import blackjack.utils.StringUtils; +import blackjack.utils.SplitUtil; import java.util.Collections; import java.util.List; @@ -9,7 +8,7 @@ public class PlayersFactory { public static List createPlayers(String input) { - List playerNames = StringUtils.splitByComma(input); + List playerNames = SplitUtil.splitByComma(input); List players = playerNames.stream() .map(Player::new) diff --git a/src/main/java/blackjack/utils/StringUtils.java b/src/main/java/blackjack/utils/SplitUtil.java similarity index 93% rename from src/main/java/blackjack/utils/StringUtils.java rename to src/main/java/blackjack/utils/SplitUtil.java index 5ceea72..c401766 100644 --- a/src/main/java/blackjack/utils/StringUtils.java +++ b/src/main/java/blackjack/utils/SplitUtil.java @@ -4,7 +4,7 @@ import java.util.List; import java.util.stream.Collectors; -public class StringUtils { +public class SplitUtil { private static final String COMMA = ","; public static List splitByComma(String input) { diff --git a/src/test/java/blackjack/domain/participant/PlayersFactoryTest.java b/src/test/java/blackjack/domain/participant/PlayersFactoryTest.java index dd79d05..14d2eb8 100644 --- a/src/test/java/blackjack/domain/participant/PlayersFactoryTest.java +++ b/src/test/java/blackjack/domain/participant/PlayersFactoryTest.java @@ -1,8 +1,6 @@ package blackjack.domain.participant; -import blackjack.domain.participant.Player; -import blackjack.domain.participant.PlayersFactory; -import blackjack.utils.StringUtils; +import blackjack.utils.SplitUtil; import org.junit.jupiter.api.DisplayName; import org.junit.jupiter.api.Test; import org.junit.jupiter.params.ParameterizedTest; @@ -21,7 +19,7 @@ class PlayersFactoryTest { void playerGenerateTest(String input) { //when List players = PlayersFactory.createPlayers(input); - List names = StringUtils.splitByComma(input); + List names = SplitUtil.splitByComma(input); //then for (String name : names) { From 74e144381316424dc40d4f8bdcbc653aa1b8a602 Mon Sep 17 00:00:00 2001 From: Ariel429 Date: Thu, 29 Jul 2021 10:35:26 +0900 Subject: [PATCH 36/55] =?UTF-8?q?refactor:=20=EC=B9=B4=EB=93=9C=20?= =?UTF-8?q?=EB=8D=B1=EC=97=90=EC=84=9C=2052=EC=9E=A5=EC=9D=84=20=EC=B4=88?= =?UTF-8?q?=EA=B3=BC=ED=95=98=EB=8A=94=20=EC=B9=B4=EB=93=9C=EB=A5=BC=20?= =?UTF-8?q?=EB=BD=91=EB=8A=94=20=EA=B2=BD=EC=9A=B0=EC=97=90=20=EB=8C=80?= =?UTF-8?q?=ED=95=9C=20=EC=98=88=EC=99=B8=EC=B2=98=EB=A6=AC?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- README.md | 4 ++-- src/main/java/blackjack/domain/card/Deck.java | 3 +++ 2 files changed, 5 insertions(+), 2 deletions(-) diff --git a/README.md b/README.md index 2a0ea18..4176134 100644 --- a/README.md +++ b/README.md @@ -37,8 +37,8 @@ - [x] 플레이어의 이름은 "딜러"가 될 수 없다. - 카드 덱 - - [] 하나의 카드덱에서는 카드를 52장 초과하여 뽑을 수 없다. - - + - [x] 하나의 카드덱에서는 카드를 52장 초과하여 뽑을 수 없다. + - 플레이어에게 카드를 더 받을 것인지 질문 - [] y, n가 아닌 형태로 대답할 수 없다. - [] 대문자의 Y, N도 인식 \ No newline at end of file diff --git a/src/main/java/blackjack/domain/card/Deck.java b/src/main/java/blackjack/domain/card/Deck.java index 3c7b723..13a63fc 100644 --- a/src/main/java/blackjack/domain/card/Deck.java +++ b/src/main/java/blackjack/domain/card/Deck.java @@ -19,6 +19,9 @@ public Deck() { } public Card drawCard() { + if (deck.isEmpty()) { + throw new RuntimeException(ALERT_NO_CARD_LEFT); + } return deck.remove(generateRandomNumber()); } From 3aa80e64ffb340d7677d85b55f72640162e33bdb Mon Sep 17 00:00:00 2001 From: Ariel429 Date: Thu, 29 Jul 2021 11:11:10 +0900 Subject: [PATCH 37/55] =?UTF-8?q?feat:=20=EC=82=AC=EC=9A=A9=EC=9E=90=20?= =?UTF-8?q?=EC=9D=B4=EB=A6=84=EC=97=90=20=EB=8C=80=ED=95=9C=20=EC=98=88?= =?UTF-8?q?=EC=99=B8=20=EC=B2=98=EB=A6=AC?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- README.md | 1 + .../blackjack/controller/BlackJackController.java | 6 ++++-- .../blackjack/domain/participant/Participant.java | 12 ++---------- .../java/blackjack/domain/participant/Player.java | 9 +++++++++ .../domain/participant/PlayersFactory.java | 4 ++-- .../utils/{SplitUtil.java => StringtUtil.java} | 3 +-- .../blackjack/domain/participant/PlayerTest.java | 15 ++++++++++++++- .../domain/participant/PlayersFactoryTest.java | 4 ++-- 8 files changed, 35 insertions(+), 19 deletions(-) rename src/main/java/blackjack/utils/{SplitUtil.java => StringtUtil.java} (93%) diff --git a/README.md b/README.md index 4176134..981ca75 100644 --- a/README.md +++ b/README.md @@ -35,6 +35,7 @@ - [x] 플레이어의 이름은 공백, null 값이 될 수 없다. - [x] 플레이어의 이름은 특수문자를 포함할 수 없다. - [x] 플레이어의 이름은 "딜러"가 될 수 없다. + - [] 플레이어는 서로 중복된 이름을 가질 수 없다. - 카드 덱 - [x] 하나의 카드덱에서는 카드를 52장 초과하여 뽑을 수 없다. diff --git a/src/main/java/blackjack/controller/BlackJackController.java b/src/main/java/blackjack/controller/BlackJackController.java index a61a38c..a565020 100644 --- a/src/main/java/blackjack/controller/BlackJackController.java +++ b/src/main/java/blackjack/controller/BlackJackController.java @@ -7,6 +7,7 @@ import blackjack.domain.result.GameResult; import blackjack.dto.DrawCardResponseDTO; import blackjack.dto.PlayersNameInputDTO; +import blackjack.utils.StringtUtil; import blackjack.view.InputView; import blackjack.view.OutputView; @@ -67,8 +68,9 @@ private void drawCardToPlayer(Player player) { } while (player.drawable() && isYes(drawCardResponse)); } - private boolean isYes(DrawCardResponseDTO response) { - return response.getResponse().equals("y"); + private boolean isYes(DrawCardResponseDTO drawCardResponse) { + String response = drawCardResponse.getResponse().trim(); + return response.equalsIgnoreCase("y"); } private void drawCardToDealer() { diff --git a/src/main/java/blackjack/domain/participant/Participant.java b/src/main/java/blackjack/domain/participant/Participant.java index 6dfa1d8..06db613 100644 --- a/src/main/java/blackjack/domain/participant/Participant.java +++ b/src/main/java/blackjack/domain/participant/Participant.java @@ -16,12 +16,11 @@ public abstract class Participant { private static final int ZERO = 0; private static final String CHECK_NULL_OR_EMPTY = "이름이 빈 칸 혹은 null 값이 아닌지 확인해주세요."; private static final String CHECK_CONTAINING_ONLY_LETTERS_AND_DIGITS = "이름은 특수문자를 포함하지 않은 문자와 숫자로 지정해주세요."; - private static final String CHECK_SAME_NAME_AS_DEALER = "이름은 딜러와 같을 수 없으니 다른 이름을 지정해주세요."; private final String name; private final List cards; - public Participant(String name) { + protected Participant(String name) { validateName(name); this.name = name; @@ -31,7 +30,6 @@ public Participant(String name) { private void validateName(String name) { validateNullOrEmpty(name); validateAlphaNumeric(name); - validateDealerNameDuplicated(name); } private void validateNullOrEmpty(String name) { @@ -41,17 +39,11 @@ private void validateNullOrEmpty(String name) { } private void validateAlphaNumeric(String name) { - if (StringUtils.isAlphanumeric(name)) { + if (!StringUtils.isAlphanumericSpace(name)) { throw new IllegalArgumentException(CHECK_CONTAINING_ONLY_LETTERS_AND_DIGITS); } } - private void validateDealerNameDuplicated(String name) { - if (name.equals("딜러")) { - throw new IllegalArgumentException(CHECK_SAME_NAME_AS_DEALER); - } - } - protected abstract boolean drawable(); public void receiveCard(Card card) { diff --git a/src/main/java/blackjack/domain/participant/Player.java b/src/main/java/blackjack/domain/participant/Player.java index 508267a..1ea34ed 100644 --- a/src/main/java/blackjack/domain/participant/Player.java +++ b/src/main/java/blackjack/domain/participant/Player.java @@ -13,9 +13,18 @@ public class Player extends Participant { private static final int PLAYER_DRAW_THRESHOLD = 21; + private static final String DEALER_NAME = "딜러"; + private static final String CHECK_SAME_NAME_AS_DEALER = "이름은 딜러와 같을 수 없으니 다른 이름을 지정해주세요."; public Player(String name) { super(name); + validateDealerNameDuplicated(name); + } + + private void validateDealerNameDuplicated(String name) { + if (name.equals(DEALER_NAME)) { + throw new IllegalArgumentException(CHECK_SAME_NAME_AS_DEALER); + } } @Override diff --git a/src/main/java/blackjack/domain/participant/PlayersFactory.java b/src/main/java/blackjack/domain/participant/PlayersFactory.java index 36de0e6..a0b47c2 100644 --- a/src/main/java/blackjack/domain/participant/PlayersFactory.java +++ b/src/main/java/blackjack/domain/participant/PlayersFactory.java @@ -1,6 +1,6 @@ package blackjack.domain.participant; -import blackjack.utils.SplitUtil; +import blackjack.utils.StringtUtil; import java.util.Collections; import java.util.List; @@ -8,7 +8,7 @@ public class PlayersFactory { public static List createPlayers(String input) { - List playerNames = SplitUtil.splitByComma(input); + List playerNames = StringtUtil.splitByComma(input); List players = playerNames.stream() .map(Player::new) diff --git a/src/main/java/blackjack/utils/SplitUtil.java b/src/main/java/blackjack/utils/StringtUtil.java similarity index 93% rename from src/main/java/blackjack/utils/SplitUtil.java rename to src/main/java/blackjack/utils/StringtUtil.java index c401766..7c02fca 100644 --- a/src/main/java/blackjack/utils/SplitUtil.java +++ b/src/main/java/blackjack/utils/StringtUtil.java @@ -4,7 +4,7 @@ import java.util.List; import java.util.stream.Collectors; -public class SplitUtil { +public class StringtUtil { private static final String COMMA = ","; public static List splitByComma(String input) { @@ -13,5 +13,4 @@ public static List splitByComma(String input) { .map(String::trim) .collect(Collectors.toList()); } - } diff --git a/src/test/java/blackjack/domain/participant/PlayerTest.java b/src/test/java/blackjack/domain/participant/PlayerTest.java index f3cced3..be6d000 100644 --- a/src/test/java/blackjack/domain/participant/PlayerTest.java +++ b/src/test/java/blackjack/domain/participant/PlayerTest.java @@ -1,13 +1,13 @@ package blackjack.domain.participant; import blackjack.domain.card.Card; -import blackjack.domain.participant.Player; import blackjack.domain.card.Denomination; import blackjack.domain.card.Type; import org.junit.jupiter.api.DisplayName; import org.junit.jupiter.api.Test; import static org.assertj.core.api.Assertions.assertThat; +import static org.assertj.core.api.Assertions.assertThatThrownBy; public class PlayerTest { @@ -91,4 +91,17 @@ void getCardsSumTest3() { //then assertThat(result).isEqualTo(20); } + + @Test + @DisplayName("플레이어의 이름은 '딜러'가 될 수 없다.") + void dealerNameDuplicatedTest() { + //given + String playerName = "딜러"; + + //when //then + assertThatThrownBy(() -> new Player(playerName)) + .isInstanceOf(IllegalArgumentException.class) + .hasMessage("이름은 딜러와 같을 수 없으니 다른 이름을 지정해주세요."); + } + } diff --git a/src/test/java/blackjack/domain/participant/PlayersFactoryTest.java b/src/test/java/blackjack/domain/participant/PlayersFactoryTest.java index 14d2eb8..32d158b 100644 --- a/src/test/java/blackjack/domain/participant/PlayersFactoryTest.java +++ b/src/test/java/blackjack/domain/participant/PlayersFactoryTest.java @@ -1,6 +1,6 @@ package blackjack.domain.participant; -import blackjack.utils.SplitUtil; +import blackjack.utils.StringtUtil; import org.junit.jupiter.api.DisplayName; import org.junit.jupiter.api.Test; import org.junit.jupiter.params.ParameterizedTest; @@ -19,7 +19,7 @@ class PlayersFactoryTest { void playerGenerateTest(String input) { //when List players = PlayersFactory.createPlayers(input); - List names = SplitUtil.splitByComma(input); + List names = StringtUtil.splitByComma(input); //then for (String name : names) { From 22f26dd3470756c9f042b2d253c74339bbe8e45b Mon Sep 17 00:00:00 2001 From: Ariel429 Date: Thu, 29 Jul 2021 12:06:08 +0900 Subject: [PATCH 38/55] =?UTF-8?q?feat:=20=EC=82=AC=EC=9A=A9=EC=9E=90?= =?UTF-8?q?=EC=9D=98=20=EC=9D=B4=EB=A6=84=20=EC=9E=85=EB=A0=A5(=EC=A4=91?= =?UTF-8?q?=EB=B3=B5=20=EC=9D=B4=EB=A6=84=EC=9D=B4=20=EC=9E=85=EB=A0=A5?= =?UTF-8?q?=EB=90=9C=20=EA=B2=BD=EC=9A=B0)=EC=97=90=20=EB=8C=80=ED=95=9C?= =?UTF-8?q?=20=EC=98=88=EC=99=B8=EC=B2=98=EB=A6=AC?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- README.md | 2 +- .../domain/participant/PlayersFactory.java | 15 +++++++++++++++ .../domain/participant/PlayersFactoryTest.java | 11 +++++++++++ 3 files changed, 27 insertions(+), 1 deletion(-) diff --git a/README.md b/README.md index 981ca75..dbbf720 100644 --- a/README.md +++ b/README.md @@ -35,7 +35,7 @@ - [x] 플레이어의 이름은 공백, null 값이 될 수 없다. - [x] 플레이어의 이름은 특수문자를 포함할 수 없다. - [x] 플레이어의 이름은 "딜러"가 될 수 없다. - - [] 플레이어는 서로 중복된 이름을 가질 수 없다. + - [x] 플레이어는 서로 중복된 이름을 가질 수 없다. - 카드 덱 - [x] 하나의 카드덱에서는 카드를 52장 초과하여 뽑을 수 없다. diff --git a/src/main/java/blackjack/domain/participant/PlayersFactory.java b/src/main/java/blackjack/domain/participant/PlayersFactory.java index a0b47c2..05b0510 100644 --- a/src/main/java/blackjack/domain/participant/PlayersFactory.java +++ b/src/main/java/blackjack/domain/participant/PlayersFactory.java @@ -7,12 +7,27 @@ import java.util.stream.Collectors; public class PlayersFactory { + + private static final String CHECK_DUPLICATED_PLAYER_NAME = "플레이어가 중복된 이름을 가지고 있는지 확인해주세요."; + public static List createPlayers(String input) { List playerNames = StringtUtil.splitByComma(input); + checkDuplication(playerNames); List players = playerNames.stream() .map(Player::new) .collect(Collectors.toList()); return Collections.unmodifiableList(players); } + + private static void checkDuplication(List playerNames) { + int distinctCount = (int) playerNames.stream() + .distinct() + .count(); + + if (playerNames.size() != distinctCount) { + throw new IllegalArgumentException(CHECK_DUPLICATED_PLAYER_NAME); + } + + } } diff --git a/src/test/java/blackjack/domain/participant/PlayersFactoryTest.java b/src/test/java/blackjack/domain/participant/PlayersFactoryTest.java index 32d158b..6eb9e17 100644 --- a/src/test/java/blackjack/domain/participant/PlayersFactoryTest.java +++ b/src/test/java/blackjack/domain/participant/PlayersFactoryTest.java @@ -39,4 +39,15 @@ void playersUnmodifiableTest() { players.add(new Player("ChungHyeon")); }).isInstanceOf(RuntimeException.class); } + + @Test + @DisplayName("중복이 있는 이름목록을 입력하면 플레이어 리스트가 생성되는지 않는지 테스트한다.") + void playerDeDuplicateTest() { + //given //when //then + assertThatThrownBy(() -> { + List players = PlayersFactory.createPlayers("John, John, Ariel"); + }).isInstanceOf(IllegalArgumentException.class) + .hasMessage("플레이어가 중복된 이름을 가지고 있는지 확인해주세요."); + + } } \ No newline at end of file From 68db2ce94f8e15a7badef7f1540d64b0fec7fb79 Mon Sep 17 00:00:00 2001 From: Ariel429 Date: Thu, 29 Jul 2021 12:25:09 +0900 Subject: [PATCH 39/55] =?UTF-8?q?refactor:=20=ED=94=8C=EB=A0=88=EC=9D=B4?= =?UTF-8?q?=EC=96=B4=EA=B0=80=20=EC=B9=B4=EB=93=9C=EB=A5=BC=20=ED=95=9C?= =?UTF-8?q?=EC=9E=A5=20=EB=8D=94=20=EB=BD=91=EA=B2=A0=EB=8B=A4=EB=8A=94=20?= =?UTF-8?q?=EB=8C=80=EB=8B=B5=EC=9D=98=20=EC=9C=A0=ED=9A=A8=EC=84=B1=20?= =?UTF-8?q?=EA=B2=80=EC=82=AC=20=EB=A1=9C=EC=A7=81=20=EC=B6=94=EA=B0=80?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- README.md | 4 +- .../controller/BlackJackController.java | 3 +- .../domain/participant/PlayersFactory.java | 4 +- .../{StringtUtil.java => StringUtil.java} | 10 ++- .../participant/PlayersFactoryTest.java | 4 +- .../java/blackjack/utils/StringUtilTest.java | 83 +++++++++++++++++++ 6 files changed, 100 insertions(+), 8 deletions(-) rename src/main/java/blackjack/utils/{StringtUtil.java => StringUtil.java} (54%) create mode 100644 src/test/java/blackjack/utils/StringUtilTest.java diff --git a/README.md b/README.md index dbbf720..bbd4924 100644 --- a/README.md +++ b/README.md @@ -41,5 +41,5 @@ - [x] 하나의 카드덱에서는 카드를 52장 초과하여 뽑을 수 없다. - 플레이어에게 카드를 더 받을 것인지 질문 - - [] y, n가 아닌 형태로 대답할 수 없다. - - [] 대문자의 Y, N도 인식 \ No newline at end of file + - [x] y, n가 아닌 형태로 대답할 수 없다. + - [x] 대문자 Y, N도 올바른 답으로 인식한다. \ No newline at end of file diff --git a/src/main/java/blackjack/controller/BlackJackController.java b/src/main/java/blackjack/controller/BlackJackController.java index a565020..a2f8d72 100644 --- a/src/main/java/blackjack/controller/BlackJackController.java +++ b/src/main/java/blackjack/controller/BlackJackController.java @@ -7,7 +7,7 @@ import blackjack.domain.result.GameResult; import blackjack.dto.DrawCardResponseDTO; import blackjack.dto.PlayersNameInputDTO; -import blackjack.utils.StringtUtil; +import blackjack.utils.StringUtil; import blackjack.view.InputView; import blackjack.view.OutputView; @@ -70,6 +70,7 @@ private void drawCardToPlayer(Player player) { private boolean isYes(DrawCardResponseDTO drawCardResponse) { String response = drawCardResponse.getResponse().trim(); + StringUtil.validateYesOrNo(response); return response.equalsIgnoreCase("y"); } diff --git a/src/main/java/blackjack/domain/participant/PlayersFactory.java b/src/main/java/blackjack/domain/participant/PlayersFactory.java index 05b0510..f468682 100644 --- a/src/main/java/blackjack/domain/participant/PlayersFactory.java +++ b/src/main/java/blackjack/domain/participant/PlayersFactory.java @@ -1,6 +1,6 @@ package blackjack.domain.participant; -import blackjack.utils.StringtUtil; +import blackjack.utils.StringUtil; import java.util.Collections; import java.util.List; @@ -11,7 +11,7 @@ public class PlayersFactory { private static final String CHECK_DUPLICATED_PLAYER_NAME = "플레이어가 중복된 이름을 가지고 있는지 확인해주세요."; public static List createPlayers(String input) { - List playerNames = StringtUtil.splitByComma(input); + List playerNames = StringUtil.splitByComma(input); checkDuplication(playerNames); List players = playerNames.stream() diff --git a/src/main/java/blackjack/utils/StringtUtil.java b/src/main/java/blackjack/utils/StringUtil.java similarity index 54% rename from src/main/java/blackjack/utils/StringtUtil.java rename to src/main/java/blackjack/utils/StringUtil.java index 7c02fca..d485bc2 100644 --- a/src/main/java/blackjack/utils/StringtUtil.java +++ b/src/main/java/blackjack/utils/StringUtil.java @@ -4,7 +4,7 @@ import java.util.List; import java.util.stream.Collectors; -public class StringtUtil { +public class StringUtil { private static final String COMMA = ","; public static List splitByComma(String input) { @@ -13,4 +13,12 @@ public static List splitByComma(String input) { .map(String::trim) .collect(Collectors.toList()); } + + public static String validateYesOrNo(String response) { + if (!(response.equals("Y") || response.equals("y") || response.equals("N") || response.equals("n"))) { + throw new IllegalArgumentException("y 혹은 n 만 입력할 수 있습니다."); + } + + return response; + } } diff --git a/src/test/java/blackjack/domain/participant/PlayersFactoryTest.java b/src/test/java/blackjack/domain/participant/PlayersFactoryTest.java index 6eb9e17..f48bada 100644 --- a/src/test/java/blackjack/domain/participant/PlayersFactoryTest.java +++ b/src/test/java/blackjack/domain/participant/PlayersFactoryTest.java @@ -1,6 +1,6 @@ package blackjack.domain.participant; -import blackjack.utils.StringtUtil; +import blackjack.utils.StringUtil; import org.junit.jupiter.api.DisplayName; import org.junit.jupiter.api.Test; import org.junit.jupiter.params.ParameterizedTest; @@ -19,7 +19,7 @@ class PlayersFactoryTest { void playerGenerateTest(String input) { //when List players = PlayersFactory.createPlayers(input); - List names = StringtUtil.splitByComma(input); + List names = StringUtil.splitByComma(input); //then for (String name : names) { diff --git a/src/test/java/blackjack/utils/StringUtilTest.java b/src/test/java/blackjack/utils/StringUtilTest.java new file mode 100644 index 0000000..29ab7ca --- /dev/null +++ b/src/test/java/blackjack/utils/StringUtilTest.java @@ -0,0 +1,83 @@ +package blackjack.utils; + +import org.junit.jupiter.api.DisplayName; +import org.junit.jupiter.api.Test; + +import java.util.Arrays; +import java.util.List; + +import static org.assertj.core.api.Assertions.assertThat; +import static org.assertj.core.api.Assertions.assertThatThrownBy; + +class StringUtilTest { + + @Test + @DisplayName("문자열을 , 구분자를 기준으로 분리한다.") + void splitByCommaTest() { + //given + String input = "Jane Doe, John Doe, Jack Smith "; + List expectedResult = Arrays.asList("Jane Doe", "John Doe", "Jack Smith"); + + //when + List result = StringUtil.splitByComma(input); + + //then + for (int i = 0; i < result.size(); i++) { + assertThat(result.get(i)).isEqualTo(expectedResult.get(i)); + } + } + + @Test + @DisplayName("카드를 더 받을지에 대한 응답으로 Y를 입력받으면 정상 처리된다.") + void receiveCardResponseCorrectTest1() { + //given + String response = "Y"; + + //when //then + assertThat(StringUtil.validateYesOrNo(response)).isEqualTo("Y"); + } + + @Test + @DisplayName("카드를 더 받을지에 대한 응답으로 y를 입력받으면 정상 처리된다.") + void receiveCardResponseCorrectTest2() { + //given + String response = "y"; + + //when //then + assertThat(StringUtil.validateYesOrNo(response)).isEqualTo("y"); + } + + @Test + @DisplayName("카드를 더 받을지에 대한 응답으로 N을 입력받으면 정상 처리된다.") + void receiveCardResponseCorrectTest3() { + //given + String response = "N"; + + //when //then + assertThat(StringUtil.validateYesOrNo(response)).isEqualTo("N"); + } + + @Test + @DisplayName("카드를 더 받을지에 대한 응답으로 n을 입력받으면 정상 처리된다.") + void receiveCardResponseCorrectTest4() { + //given + String response = "n"; + + //when //then + assertThat(StringUtil.validateYesOrNo(response)).isEqualTo("n"); + } + + @Test + @DisplayName("카드를 더 받을지에 대한 응답으로 Y y N n 이 아닌 문자열을 입력 시 예외를 던진다.") + void receiveCardResponseErrorTest() { + //given + String response = "U"; + + //when //then + assertThatThrownBy(() -> StringUtil.validateYesOrNo(response)) + .isInstanceOf(IllegalArgumentException.class) + .hasMessage("y 혹은 n 만 입력할 수 있습니다."); + } + + +} \ No newline at end of file From aa1ab864b3da7775d43637cda3f143f9371eb021 Mon Sep 17 00:00:00 2001 From: Ariel429 Date: Thu, 29 Jul 2021 12:34:55 +0900 Subject: [PATCH 40/55] =?UTF-8?q?refactor:=20=EB=B6=88=ED=95=84=EC=9A=94?= =?UTF-8?q?=ED=95=9C=20=EC=A3=BC=EC=84=9D=20=EB=B0=8F=20=EC=93=B0=EC=9D=B4?= =?UTF-8?q?=EC=A7=80=20=EC=95=8A=EC=9D=80=20import=EC=A0=95=EB=A6=AC?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../controller/BlackJackController.java | 5 --- .../java/blackjack/domain/card/Score.java | 32 ------------------- .../blackjack/domain/participant/Dealer.java | 1 - .../blackjack/domain/participant/Player.java | 1 - .../java/blackjack/domain/card/CardTest.java | 3 -- .../java/blackjack/domain/card/DeckTest.java | 2 -- .../domain/participant/DealerTest.java | 1 - .../domain/participant/ScoreTest.java | 18 ----------- .../domain/result/GameResultTest.java | 1 - .../domain/result/WinningResultTest.java | 1 - 10 files changed, 65 deletions(-) delete mode 100644 src/main/java/blackjack/domain/card/Score.java delete mode 100644 src/test/java/blackjack/domain/participant/ScoreTest.java diff --git a/src/main/java/blackjack/controller/BlackJackController.java b/src/main/java/blackjack/controller/BlackJackController.java index a2f8d72..6bffbf4 100644 --- a/src/main/java/blackjack/controller/BlackJackController.java +++ b/src/main/java/blackjack/controller/BlackJackController.java @@ -28,15 +28,10 @@ public BlackJackController() { } public void run() { - // 시작해서 카드 두 장씩 분배, 카드 목록의 출력 drawTowCards(); - // 플레이어에게 한장씩 카드를 분배(대답이 Yes인 경우) drawCardToPlayers(); - // 딜러에게 한장씩 카드 분배(카드 합이 17미만인 경우만) drawCardToDealer(); - // 플레이어가 가진 카드목록과 카드값의 총합 출력 outputView.printCardsResult(dealer, players); - // 게임 결과를 출력 outputView.printGameResult(GameResult.of(dealer, players)); } diff --git a/src/main/java/blackjack/domain/card/Score.java b/src/main/java/blackjack/domain/card/Score.java deleted file mode 100644 index 85192e1..0000000 --- a/src/main/java/blackjack/domain/card/Score.java +++ /dev/null @@ -1,32 +0,0 @@ -package blackjack.domain.card; - -import java.util.Objects; - -public class Score { - - private final int score; - - private Score(int score) { - this.score = score; - } - public static Score of(int score) { - return new Score(score); - } - - public int getScore() { - return score; - } - - @Override - public boolean equals(Object o) { - if (this == o) return true; - if (o == null || getClass() != o.getClass()) return false; - Score score1 = (Score) o; - return score == score1.score; - } - - @Override - public int hashCode() { - return Objects.hash(score); - } -} diff --git a/src/main/java/blackjack/domain/participant/Dealer.java b/src/main/java/blackjack/domain/participant/Dealer.java index cf284c9..c7983f0 100644 --- a/src/main/java/blackjack/domain/participant/Dealer.java +++ b/src/main/java/blackjack/domain/participant/Dealer.java @@ -2,7 +2,6 @@ import blackjack.domain.card.Card; import blackjack.domain.card.Deck; -import blackjack.domain.participant.Participant; import lombok.Getter; import java.util.stream.Collectors; diff --git a/src/main/java/blackjack/domain/participant/Player.java b/src/main/java/blackjack/domain/participant/Player.java index 1ea34ed..dce35b5 100644 --- a/src/main/java/blackjack/domain/participant/Player.java +++ b/src/main/java/blackjack/domain/participant/Player.java @@ -1,7 +1,6 @@ package blackjack.domain.participant; import blackjack.domain.card.Card; -import blackjack.domain.participant.Participant; import blackjack.domain.result.Rule; import blackjack.domain.result.WinningResult; import lombok.Getter; diff --git a/src/test/java/blackjack/domain/card/CardTest.java b/src/test/java/blackjack/domain/card/CardTest.java index 96799e5..6d914a1 100644 --- a/src/test/java/blackjack/domain/card/CardTest.java +++ b/src/test/java/blackjack/domain/card/CardTest.java @@ -1,8 +1,5 @@ package blackjack.domain.card; -import blackjack.domain.card.Card; -import blackjack.domain.card.Denomination; -import blackjack.domain.card.Type; import org.junit.jupiter.api.DisplayName; import org.junit.jupiter.api.Test; diff --git a/src/test/java/blackjack/domain/card/DeckTest.java b/src/test/java/blackjack/domain/card/DeckTest.java index 521d95f..3928279 100644 --- a/src/test/java/blackjack/domain/card/DeckTest.java +++ b/src/test/java/blackjack/domain/card/DeckTest.java @@ -1,7 +1,5 @@ package blackjack.domain.card; -import blackjack.domain.card.Card; -import blackjack.domain.card.Deck; import blackjack.domain.participant.Dealer; import blackjack.domain.participant.Participant; import blackjack.domain.participant.Player; diff --git a/src/test/java/blackjack/domain/participant/DealerTest.java b/src/test/java/blackjack/domain/participant/DealerTest.java index fc73d46..6ce75c6 100644 --- a/src/test/java/blackjack/domain/participant/DealerTest.java +++ b/src/test/java/blackjack/domain/participant/DealerTest.java @@ -2,7 +2,6 @@ import blackjack.domain.card.Card; import blackjack.domain.card.Deck; -import blackjack.domain.participant.Dealer; import blackjack.domain.card.Denomination; import blackjack.domain.card.Type; import org.junit.jupiter.api.DisplayName; diff --git a/src/test/java/blackjack/domain/participant/ScoreTest.java b/src/test/java/blackjack/domain/participant/ScoreTest.java deleted file mode 100644 index 6210308..0000000 --- a/src/test/java/blackjack/domain/participant/ScoreTest.java +++ /dev/null @@ -1,18 +0,0 @@ -package blackjack.domain.participant; - -import blackjack.domain.card.Score; -import org.junit.jupiter.api.DisplayName; -import org.junit.jupiter.api.Test; - -import static org.assertj.core.api.Assertions.assertThat; - -class ScoreTest { - - @Test - @DisplayName("스코어 객체가 가진 값이 같으면 동등 객체로 판단한다") - void equalsTest() { - //given // when // then - assertThat(Score.of(3)) - .isEqualTo(Score.of(3)); - } -} \ No newline at end of file diff --git a/src/test/java/blackjack/domain/result/GameResultTest.java b/src/test/java/blackjack/domain/result/GameResultTest.java index dd3b572..e99991a 100644 --- a/src/test/java/blackjack/domain/result/GameResultTest.java +++ b/src/test/java/blackjack/domain/result/GameResultTest.java @@ -20,7 +20,6 @@ class GameResultTest { - @ParameterizedTest @EnumSource(WinningResult.class) @DisplayName("각 플레이어의 승패를 확인한다.") diff --git a/src/test/java/blackjack/domain/result/WinningResultTest.java b/src/test/java/blackjack/domain/result/WinningResultTest.java index f73f162..7d8a66d 100644 --- a/src/test/java/blackjack/domain/result/WinningResultTest.java +++ b/src/test/java/blackjack/domain/result/WinningResultTest.java @@ -1,7 +1,6 @@ package blackjack.domain.result; import org.junit.jupiter.api.DisplayName; -import org.junit.jupiter.api.Test; import org.junit.jupiter.params.ParameterizedTest; import org.junit.jupiter.params.provider.Arguments; import org.junit.jupiter.params.provider.MethodSource; From e5a29918a3c30a4ead81ee62cfb0a2eea80a9fc1 Mon Sep 17 00:00:00 2001 From: chunghyeon-kim Date: Thu, 29 Jul 2021 18:20:05 +0900 Subject: [PATCH 41/55] =?UTF-8?q?refactor:=20Controller=EC=9D=98=20drawCar?= =?UTF-8?q?dToPlayer=20=EB=A9=94=EC=84=9C=EB=93=9C=20=EC=88=98=EC=A0=95?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- src/main/java/blackjack/controller/BlackJackController.java | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/src/main/java/blackjack/controller/BlackJackController.java b/src/main/java/blackjack/controller/BlackJackController.java index 6bffbf4..34133dc 100644 --- a/src/main/java/blackjack/controller/BlackJackController.java +++ b/src/main/java/blackjack/controller/BlackJackController.java @@ -54,13 +54,13 @@ private void drawCardToPlayers() { } private void drawCardToPlayer(Player player) { - DrawCardResponseDTO drawCardResponse; - do { + DrawCardResponseDTO drawCardResponse = inputView.getPlayersResponse(player); + while (player.drawable() && isYes(drawCardResponse)) { player.receiveCard(deck.drawCard()); outputView.printCards(player); drawCardResponse = inputView.getPlayersResponse(player); - } while (player.drawable() && isYes(drawCardResponse)); + } } private boolean isYes(DrawCardResponseDTO drawCardResponse) { From 4eed0a81890de85f15a7c9fac10ca44a6e9a6004 Mon Sep 17 00:00:00 2001 From: chunghyeon-kim Date: Thu, 29 Jul 2021 18:49:29 +0900 Subject: [PATCH 42/55] =?UTF-8?q?refactor:=20=EB=AC=B8=EC=9E=90=EC=97=B4?= =?UTF-8?q?=20=EC=83=81=EC=88=98=EC=B2=98=EB=A6=AC?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- src/main/java/blackjack/utils/StringUtil.java | 3 +- src/main/java/blackjack/view/InputView.java | 6 ++-- src/main/java/blackjack/view/OutputView.java | 34 ++++++++++++------- 3 files changed, 27 insertions(+), 16 deletions(-) diff --git a/src/main/java/blackjack/utils/StringUtil.java b/src/main/java/blackjack/utils/StringUtil.java index d485bc2..2498130 100644 --- a/src/main/java/blackjack/utils/StringUtil.java +++ b/src/main/java/blackjack/utils/StringUtil.java @@ -6,6 +6,7 @@ public class StringUtil { private static final String COMMA = ","; + private static final String RESPONSE_RESTRICT_MESSAGE = "y 혹은 n 만 입력할 수 있습니다."; public static List splitByComma(String input) { List names = Arrays.asList(input.split(COMMA)); @@ -16,7 +17,7 @@ public static List splitByComma(String input) { public static String validateYesOrNo(String response) { if (!(response.equals("Y") || response.equals("y") || response.equals("N") || response.equals("n"))) { - throw new IllegalArgumentException("y 혹은 n 만 입력할 수 있습니다."); + throw new IllegalArgumentException(RESPONSE_RESTRICT_MESSAGE); } return response; diff --git a/src/main/java/blackjack/view/InputView.java b/src/main/java/blackjack/view/InputView.java index ba97eb7..15663e5 100644 --- a/src/main/java/blackjack/view/InputView.java +++ b/src/main/java/blackjack/view/InputView.java @@ -8,9 +8,11 @@ public class InputView { private static final Scanner scanner = new Scanner(System.in); + private static final String PLAYER_NAMES_INPUT_MESSAGE = "게임에 참여할 사람의 이름을 입력하세요.(쉼표 기준으로 분리)"; + private static final String DRAW_CARD_RESPONSE_INPUT_MESSAGE = "는 한장의 카드를 더 받겠습니까?(예는 y, 아니오는 n)"; public PlayersNameInputDTO getPlayersName() { - System.out.println("게임에 참여할 사람의 이름을 입력하세요.(쉼표 기준으로 분리)"); + System.out.println(PLAYER_NAMES_INPUT_MESSAGE); String input = scanner.nextLine(); return new PlayersNameInputDTO(input); } @@ -18,7 +20,7 @@ public PlayersNameInputDTO getPlayersName() { public DrawCardResponseDTO getPlayersResponse(Player player) { StringBuilder sb = new StringBuilder(); sb.append(player.getName()) - .append("는 한장의 카드를 더 받겠습니까?(예는 y, 아니오는 n)"); + .append(DRAW_CARD_RESPONSE_INPUT_MESSAGE); System.out.println(sb); String response = scanner.nextLine(); return new DrawCardResponseDTO(response); diff --git a/src/main/java/blackjack/view/OutputView.java b/src/main/java/blackjack/view/OutputView.java index 78fc7e9..dd6006d 100644 --- a/src/main/java/blackjack/view/OutputView.java +++ b/src/main/java/blackjack/view/OutputView.java @@ -10,16 +10,24 @@ import java.util.stream.Collectors; public class OutputView { - private final String NEW_LINE = System.lineSeparator(); + private static final String AND = "와 "; + private static final String TWO_CARDS_GIVEN = "에게 2장의 카드를 나누었습니다."; + private static final String NEW_LINE = System.lineSeparator(); + private static final String DEALER_DRAW_CARD = "딜러는 16이하라 한장의 카드를 더 받았습니다."; + private static final String RESULT = " - 결과: "; + private static final String GAME_RESULT = "\n## 최종승패"; + private static final String DEALER = "딜러: "; + private static final String BLANK = " "; + private static final String COLON = ": "; public void printFirstCardsGiven(List players, Dealer dealer) { StringBuilder sb = new StringBuilder(); sb.append(dealer.getName()) - .append("와 "); + .append(AND); sb.append(players.stream() .map(Player::getName) .collect(Collectors.joining(", "))); - sb.append("에게 2장의 카드를 나누었습니다."); + sb.append(TWO_CARDS_GIVEN); System.out.println(sb); } @@ -40,7 +48,7 @@ public void printCards(Player player) { } public void printDealerCardGiven() { - System.out.println("딜러는 16이하라 한장의 카드를 더 받았습니다."); + System.out.println(DEALER_DRAW_CARD); } public void printCardsResult(Dealer dealer, List players) { @@ -55,7 +63,7 @@ private void printDealerCardsResult(Dealer dealer) { StringBuilder sb = new StringBuilder(); sb.append(NEW_LINE) .append(dealer.toString()) - .append(" - 결과: ") + .append(RESULT) .append(dealer.getCardsSum()); System.out.println(sb); @@ -63,37 +71,37 @@ private void printDealerCardsResult(Dealer dealer) { private void printPlayerCardsResult(Player player) { StringBuilder sb = new StringBuilder(player.toString()); - sb.append(" - 결과: "); + sb.append(RESULT); sb.append(player.getCardsSum()); System.out.println(sb); } public void printGameResult(GameResult gameResult) { - System.out.println("\n## 최종승패"); + System.out.println(GAME_RESULT); printDealerResult(gameResult.getDealerResult()); - printPlayerResult(gameResult.getPlayersResult()); + printPlayersResult(gameResult.getPlayersResult()); } private void printDealerResult(Map dealerResult) { - StringBuilder sb = new StringBuilder("딜러: "); + StringBuilder sb = new StringBuilder(DEALER); sb.append(dealerResult.entrySet() .stream() .filter(winningResult -> winningResult.getValue() > 0) .map(winningResult -> winningResult.getValue() + winningResult.getKey().getResult()) - .collect(Collectors.joining(" "))); + .collect(Collectors.joining(BLANK))); System.out.println(sb); } - private void printPlayerResult(Map playersResult) { + private void printPlayersResult(Map playersResult) { StringBuilder sb = new StringBuilder(); sb.append(playersResult.entrySet() .stream() - .map(playerResult -> playerResult.getKey().getName() + ": " + playerResult.getValue().getResult()) - .collect(Collectors.joining("\n"))); + .map(playerResult -> playerResult.getKey().getName() + COLON + playerResult.getValue().getResult()) + .collect(Collectors.joining(NEW_LINE))); System.out.println(sb); } From b21caf07fd38257704eb19148bece78a8ba1277d Mon Sep 17 00:00:00 2001 From: chunghyeon-kim Date: Thu, 29 Jul 2021 19:06:57 +0900 Subject: [PATCH 43/55] =?UTF-8?q?refactor:=20=ED=85=8C=EC=8A=A4=ED=8A=B8?= =?UTF-8?q?=20=EC=A0=95=EB=A6=AC?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- src/test/java/blackjack/domain/card/CardTest.java | 8 ++------ .../java/blackjack/domain/card/DeckFactoryTest.java | 4 ++-- src/test/java/blackjack/domain/card/DeckTest.java | 2 +- .../java/blackjack/domain/participant/DealerTest.java | 4 +--- .../domain/participant/PlayersFactoryTest.java | 5 ++--- src/test/java/blackjack/utils/StringUtilTest.java | 10 +++++----- 6 files changed, 13 insertions(+), 20 deletions(-) diff --git a/src/test/java/blackjack/domain/card/CardTest.java b/src/test/java/blackjack/domain/card/CardTest.java index 6d914a1..616c762 100644 --- a/src/test/java/blackjack/domain/card/CardTest.java +++ b/src/test/java/blackjack/domain/card/CardTest.java @@ -22,9 +22,7 @@ void printCardTwoDiamond() { //given Card card = new Card(Denomination.TWO, Type.DIAMOND); - //when - - //then + //when, then assertThat(card.toString()).isEqualTo("2다이아몬드"); } @@ -34,9 +32,7 @@ void printCardAceHeart() { //given Card card = new Card(Denomination.ACE, Type.HEART); - //when - - //then + //when, then assertThat(card.toString()).isEqualTo("A하트"); } } diff --git a/src/test/java/blackjack/domain/card/DeckFactoryTest.java b/src/test/java/blackjack/domain/card/DeckFactoryTest.java index 28652db..1c9e995 100644 --- a/src/test/java/blackjack/domain/card/DeckFactoryTest.java +++ b/src/test/java/blackjack/domain/card/DeckFactoryTest.java @@ -10,14 +10,14 @@ class DeckFactoryTest { @DisplayName("생성된 덱에 포함된 카드 숫자가 52장인지 확인한다") @Test void createTest() { - //given //when //then + //given, when, then assertThat(DeckFactory.createDeck()).hasSize(52); } @Test @DisplayName("같은 Denomination, 같은 type을 가진 카드는 같다.") void equalsTest() { - //given //when //then + //given, when, then assertThat(DeckFactory.createDeck()).isEqualTo(DeckFactory.createDeck()); } } \ No newline at end of file diff --git a/src/test/java/blackjack/domain/card/DeckTest.java b/src/test/java/blackjack/domain/card/DeckTest.java index 3928279..eb750d6 100644 --- a/src/test/java/blackjack/domain/card/DeckTest.java +++ b/src/test/java/blackjack/domain/card/DeckTest.java @@ -17,7 +17,7 @@ void testDeckHasSpadeAce() { //given Deck deck = new Deck(); - //when //then + //when, then assertTrue(deck.getDeck().contains(new Card(Denomination.ACE, Type.SPADE))); } diff --git a/src/test/java/blackjack/domain/participant/DealerTest.java b/src/test/java/blackjack/domain/participant/DealerTest.java index 6ce75c6..5dfadb2 100644 --- a/src/test/java/blackjack/domain/participant/DealerTest.java +++ b/src/test/java/blackjack/domain/participant/DealerTest.java @@ -52,9 +52,7 @@ void DealerPrintTest() { dealer.receiveCard(new Card(Denomination.NINE, Type.CLUB)); dealer.receiveCard((new Card(Denomination.EIGHT, Type.HEART))); - //when - - //then + //when, then assertThat(dealer.toString()).isEqualTo("딜러: 9클로버, 8하트"); } } \ No newline at end of file diff --git a/src/test/java/blackjack/domain/participant/PlayersFactoryTest.java b/src/test/java/blackjack/domain/participant/PlayersFactoryTest.java index f48bada..6a7408a 100644 --- a/src/test/java/blackjack/domain/participant/PlayersFactoryTest.java +++ b/src/test/java/blackjack/domain/participant/PlayersFactoryTest.java @@ -31,10 +31,9 @@ void playerGenerateTest(String input) { @DisplayName("이미 생성된 플레이어의 목록을 바꿀 수 없는지를 확인한다.") void playersUnmodifiableTest() { //given - // when List players = PlayersFactory.createPlayers("Jane, John, Ariel"); - //then + //when, then assertThatThrownBy(() -> { players.add(new Player("ChungHyeon")); }).isInstanceOf(RuntimeException.class); @@ -43,7 +42,7 @@ void playersUnmodifiableTest() { @Test @DisplayName("중복이 있는 이름목록을 입력하면 플레이어 리스트가 생성되는지 않는지 테스트한다.") void playerDeDuplicateTest() { - //given //when //then + //given, when, then assertThatThrownBy(() -> { List players = PlayersFactory.createPlayers("John, John, Ariel"); }).isInstanceOf(IllegalArgumentException.class) diff --git a/src/test/java/blackjack/utils/StringUtilTest.java b/src/test/java/blackjack/utils/StringUtilTest.java index 29ab7ca..9aa0b32 100644 --- a/src/test/java/blackjack/utils/StringUtilTest.java +++ b/src/test/java/blackjack/utils/StringUtilTest.java @@ -33,7 +33,7 @@ void receiveCardResponseCorrectTest1() { //given String response = "Y"; - //when //then + //when, then assertThat(StringUtil.validateYesOrNo(response)).isEqualTo("Y"); } @@ -43,7 +43,7 @@ void receiveCardResponseCorrectTest2() { //given String response = "y"; - //when //then + //when, then assertThat(StringUtil.validateYesOrNo(response)).isEqualTo("y"); } @@ -53,7 +53,7 @@ void receiveCardResponseCorrectTest3() { //given String response = "N"; - //when //then + //when, then assertThat(StringUtil.validateYesOrNo(response)).isEqualTo("N"); } @@ -63,7 +63,7 @@ void receiveCardResponseCorrectTest4() { //given String response = "n"; - //when //then + //when, then assertThat(StringUtil.validateYesOrNo(response)).isEqualTo("n"); } @@ -73,7 +73,7 @@ void receiveCardResponseErrorTest() { //given String response = "U"; - //when //then + //when, then assertThatThrownBy(() -> StringUtil.validateYesOrNo(response)) .isInstanceOf(IllegalArgumentException.class) .hasMessage("y 혹은 n 만 입력할 수 있습니다."); From 61696cbbe65f87fc76946c601c1f04c18a22cb71 Mon Sep 17 00:00:00 2001 From: chunghyeon-kim Date: Mon, 9 Aug 2021 21:32:02 +0900 Subject: [PATCH 44/55] =?UTF-8?q?refactor:=20Dto=20=ED=81=B4=EB=9E=98?= =?UTF-8?q?=EC=8A=A4=20=EC=9D=B4=EB=A6=84=20=EB=B3=80=EA=B2=BD,=20DrawCard?= =?UTF-8?q?=20=EC=9E=85=EB=A0=A5=EC=9D=B4=20yes=EC=9D=B8=EC=A7=80=20?= =?UTF-8?q?=ED=99=95=EC=9D=B8=ED=95=98=EB=8A=94=20=EB=A9=94=EC=84=9C?= =?UTF-8?q?=EB=93=9C=EB=A5=BC=20DrawCardRequestDto=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 --- .../controller/BlackJackController.java | 18 ++++++------------ .../java/blackjack/dto/DrawCardRequestDto.java | 18 ++++++++++++++++++ .../blackjack/dto/DrawCardResponseDTO.java | 11 ----------- ...eInputDTO.java => PlayersNameInputDto.java} | 2 +- src/main/java/blackjack/view/InputView.java | 12 ++++++------ 5 files changed, 31 insertions(+), 30 deletions(-) create mode 100644 src/main/java/blackjack/dto/DrawCardRequestDto.java delete mode 100644 src/main/java/blackjack/dto/DrawCardResponseDTO.java rename src/main/java/blackjack/dto/{PlayersNameInputDTO.java => PlayersNameInputDto.java} (82%) diff --git a/src/main/java/blackjack/controller/BlackJackController.java b/src/main/java/blackjack/controller/BlackJackController.java index 34133dc..82af381 100644 --- a/src/main/java/blackjack/controller/BlackJackController.java +++ b/src/main/java/blackjack/controller/BlackJackController.java @@ -5,8 +5,8 @@ import blackjack.domain.participant.Player; import blackjack.domain.participant.PlayersFactory; import blackjack.domain.result.GameResult; -import blackjack.dto.DrawCardResponseDTO; -import blackjack.dto.PlayersNameInputDTO; +import blackjack.dto.DrawCardRequestDto; +import blackjack.dto.PlayersNameInputDto; import blackjack.utils.StringUtil; import blackjack.view.InputView; import blackjack.view.OutputView; @@ -21,7 +21,7 @@ public class BlackJackController { private final OutputView outputView = new OutputView(); public BlackJackController() { - PlayersNameInputDTO namesInput = inputView.getPlayersName(); + PlayersNameInputDto namesInput = inputView.getPlayersName(); this.players = PlayersFactory.createPlayers(namesInput.getPlayersName()); this.dealer = new Dealer(); this.deck = new Deck(); @@ -54,21 +54,15 @@ private void drawCardToPlayers() { } private void drawCardToPlayer(Player player) { - DrawCardResponseDTO drawCardResponse = inputView.getPlayersResponse(player); - while (player.drawable() && isYes(drawCardResponse)) { + DrawCardRequestDto drawCardRequest = inputView.getPlayersResponse(player); + while (player.drawable() && drawCardRequest.isYes()) { player.receiveCard(deck.drawCard()); outputView.printCards(player); - drawCardResponse = inputView.getPlayersResponse(player); + drawCardRequest = inputView.getPlayersResponse(player); } } - private boolean isYes(DrawCardResponseDTO drawCardResponse) { - String response = drawCardResponse.getResponse().trim(); - StringUtil.validateYesOrNo(response); - return response.equalsIgnoreCase("y"); - } - private void drawCardToDealer() { while (dealer.drawable()) { dealer.receiveCard(deck.drawCard()); diff --git a/src/main/java/blackjack/dto/DrawCardRequestDto.java b/src/main/java/blackjack/dto/DrawCardRequestDto.java new file mode 100644 index 0000000..1381f28 --- /dev/null +++ b/src/main/java/blackjack/dto/DrawCardRequestDto.java @@ -0,0 +1,18 @@ +package blackjack.dto; + +import blackjack.utils.StringUtil; +import lombok.Getter; +import lombok.RequiredArgsConstructor; + +@Getter +@RequiredArgsConstructor +public class DrawCardRequestDto { + + private final String response; + + public boolean isYes() { + String trimmedResponse = response.trim(); + StringUtil.validateYesOrNo(trimmedResponse); + return trimmedResponse.equalsIgnoreCase("y"); + } +} diff --git a/src/main/java/blackjack/dto/DrawCardResponseDTO.java b/src/main/java/blackjack/dto/DrawCardResponseDTO.java deleted file mode 100644 index 98f6983..0000000 --- a/src/main/java/blackjack/dto/DrawCardResponseDTO.java +++ /dev/null @@ -1,11 +0,0 @@ -package blackjack.dto; - -import lombok.Getter; -import lombok.RequiredArgsConstructor; - -@Getter -@RequiredArgsConstructor -public class DrawCardResponseDTO { - - private final String response; -} diff --git a/src/main/java/blackjack/dto/PlayersNameInputDTO.java b/src/main/java/blackjack/dto/PlayersNameInputDto.java similarity index 82% rename from src/main/java/blackjack/dto/PlayersNameInputDTO.java rename to src/main/java/blackjack/dto/PlayersNameInputDto.java index b8b487e..c0379fd 100644 --- a/src/main/java/blackjack/dto/PlayersNameInputDTO.java +++ b/src/main/java/blackjack/dto/PlayersNameInputDto.java @@ -5,7 +5,7 @@ @Getter @RequiredArgsConstructor -public class PlayersNameInputDTO { +public class PlayersNameInputDto { private final String playersName; } diff --git a/src/main/java/blackjack/view/InputView.java b/src/main/java/blackjack/view/InputView.java index 15663e5..77b5998 100644 --- a/src/main/java/blackjack/view/InputView.java +++ b/src/main/java/blackjack/view/InputView.java @@ -1,8 +1,8 @@ package blackjack.view; import blackjack.domain.participant.Player; -import blackjack.dto.DrawCardResponseDTO; -import blackjack.dto.PlayersNameInputDTO; +import blackjack.dto.DrawCardRequestDto; +import blackjack.dto.PlayersNameInputDto; import java.util.Scanner; @@ -11,18 +11,18 @@ public class InputView { private static final String PLAYER_NAMES_INPUT_MESSAGE = "게임에 참여할 사람의 이름을 입력하세요.(쉼표 기준으로 분리)"; private static final String DRAW_CARD_RESPONSE_INPUT_MESSAGE = "는 한장의 카드를 더 받겠습니까?(예는 y, 아니오는 n)"; - public PlayersNameInputDTO getPlayersName() { + public PlayersNameInputDto getPlayersName() { System.out.println(PLAYER_NAMES_INPUT_MESSAGE); String input = scanner.nextLine(); - return new PlayersNameInputDTO(input); + return new PlayersNameInputDto(input); } - public DrawCardResponseDTO getPlayersResponse(Player player) { + public DrawCardRequestDto getPlayersResponse(Player player) { StringBuilder sb = new StringBuilder(); sb.append(player.getName()) .append(DRAW_CARD_RESPONSE_INPUT_MESSAGE); System.out.println(sb); String response = scanner.nextLine(); - return new DrawCardResponseDTO(response); + return new DrawCardRequestDto(response); } } From b00b293e79100446ffcec2ac2fcc696d20f98e49 Mon Sep 17 00:00:00 2001 From: chunghyeon-kim Date: Mon, 9 Aug 2021 22:09:06 +0900 Subject: [PATCH 45/55] =?UTF-8?q?refactor:=20DrawCard=20=EC=9D=91=EB=8B=B5?= =?UTF-8?q?=EC=9D=98=20=EC=9C=A0=ED=9A=A8=EC=84=B1=20=EA=B2=80=EC=82=AC=20?= =?UTF-8?q?=EB=A9=94=EC=84=9C=EB=93=9C=EB=A5=BC=20DrawCardRequestDto?= =?UTF-8?q?=EB=A1=9C=20=EC=9D=B4=EB=8F=99=20=EB=B0=8F=20=ED=85=8C=EC=8A=A4?= =?UTF-8?q?=ED=8A=B8=EB=A9=94=EC=84=9C=EB=93=9C=20=EC=9D=B4=EB=8F=99?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../blackjack/dto/DrawCardRequestDto.java | 12 +++- src/main/java/blackjack/utils/StringUtil.java | 8 --- .../blackjack/dto/DrawCardRequestDtoTest.java | 64 +++++++++++++++++++ .../java/blackjack/utils/StringUtilTest.java | 55 ---------------- 4 files changed, 73 insertions(+), 66 deletions(-) create mode 100644 src/test/java/blackjack/dto/DrawCardRequestDtoTest.java diff --git a/src/main/java/blackjack/dto/DrawCardRequestDto.java b/src/main/java/blackjack/dto/DrawCardRequestDto.java index 1381f28..aa36fb5 100644 --- a/src/main/java/blackjack/dto/DrawCardRequestDto.java +++ b/src/main/java/blackjack/dto/DrawCardRequestDto.java @@ -1,18 +1,24 @@ package blackjack.dto; -import blackjack.utils.StringUtil; import lombok.Getter; import lombok.RequiredArgsConstructor; @Getter @RequiredArgsConstructor public class DrawCardRequestDto { + private static final String RESPONSE_RESTRICT_MESSAGE = "y 혹은 n 만 입력할 수 있습니다."; private final String response; public boolean isYes() { + validateYesOrNo(); + return response.trim().equalsIgnoreCase("y"); + } + + public void validateYesOrNo() { String trimmedResponse = response.trim(); - StringUtil.validateYesOrNo(trimmedResponse); - return trimmedResponse.equalsIgnoreCase("y"); + if (!(trimmedResponse.equals("Y") || trimmedResponse.equals("y") || trimmedResponse.equals("N") || trimmedResponse.equals("n"))) { + throw new IllegalArgumentException(RESPONSE_RESTRICT_MESSAGE); + } } } diff --git a/src/main/java/blackjack/utils/StringUtil.java b/src/main/java/blackjack/utils/StringUtil.java index 2498130..268fd3e 100644 --- a/src/main/java/blackjack/utils/StringUtil.java +++ b/src/main/java/blackjack/utils/StringUtil.java @@ -14,12 +14,4 @@ public static List splitByComma(String input) { .map(String::trim) .collect(Collectors.toList()); } - - public static String validateYesOrNo(String response) { - if (!(response.equals("Y") || response.equals("y") || response.equals("N") || response.equals("n"))) { - throw new IllegalArgumentException(RESPONSE_RESTRICT_MESSAGE); - } - - return response; - } } diff --git a/src/test/java/blackjack/dto/DrawCardRequestDtoTest.java b/src/test/java/blackjack/dto/DrawCardRequestDtoTest.java new file mode 100644 index 0000000..8b5308e --- /dev/null +++ b/src/test/java/blackjack/dto/DrawCardRequestDtoTest.java @@ -0,0 +1,64 @@ +package blackjack.dto; + +import org.junit.jupiter.api.DisplayName; +import org.junit.jupiter.api.Test; + +import static org.assertj.core.api.Assertions.assertThatThrownBy; + +public class DrawCardRequestDtoTest { + @Test + @DisplayName("카드를 더 받을지에 대한 응답으로 Y를 입력받으면 정상 처리된다.") + void receiveCardRequestValidTest1() { + //given + DrawCardRequestDto drawCardRequestDto = new DrawCardRequestDto("Y"); + + //when, then + //예외가 터지지 않으면 통과하는 테스트 + drawCardRequestDto.validateYesOrNo(); + } + + @Test + @DisplayName("카드를 더 받을지에 대한 응답으로 y를 입력받으면 정상 처리된다.") + void receiveCardRequestValidTest2() { + //given + DrawCardRequestDto drawCardRequestDto = new DrawCardRequestDto("y"); + + //when, then + //예외가 터지지 않으면 통과하는 테스트 + drawCardRequestDto.validateYesOrNo(); + } + + @Test + @DisplayName("카드를 더 받을지에 대한 응답으로 N을 입력받으면 정상 처리된다.") + void receiveCardRequestValidTest3() { + //given + DrawCardRequestDto drawCardRequestDto = new DrawCardRequestDto("N"); + + //when, then + //예외가 터지지 않으면 통과하는 테스트 + drawCardRequestDto.validateYesOrNo(); + } + + @Test + @DisplayName("카드를 더 받을지에 대한 응답으로 n을 입력받으면 정상 처리된다.") + void receiveCardRequestValidTest4() { + //given + DrawCardRequestDto drawCardRequestDto = new DrawCardRequestDto("n"); + + //when, then + //예외가 터지지 않으면 통과하는 테스트 + drawCardRequestDto.validateYesOrNo(); + } + + @Test + @DisplayName("카드를 더 받을지에 대한 응답으로 Y y N n 이 아닌 문자열을 입력 시 예외를 던진다.") + void receiveCardRequestInvalidTest() { + //given + DrawCardRequestDto drawCardRequestDto = new DrawCardRequestDto("U"); + + //when, then + assertThatThrownBy(() -> drawCardRequestDto.validateYesOrNo()) + .isInstanceOf(IllegalArgumentException.class) + .hasMessage("y 혹은 n 만 입력할 수 있습니다."); + } +} diff --git a/src/test/java/blackjack/utils/StringUtilTest.java b/src/test/java/blackjack/utils/StringUtilTest.java index 9aa0b32..c7f837b 100644 --- a/src/test/java/blackjack/utils/StringUtilTest.java +++ b/src/test/java/blackjack/utils/StringUtilTest.java @@ -7,7 +7,6 @@ import java.util.List; import static org.assertj.core.api.Assertions.assertThat; -import static org.assertj.core.api.Assertions.assertThatThrownBy; class StringUtilTest { @@ -26,58 +25,4 @@ void splitByCommaTest() { assertThat(result.get(i)).isEqualTo(expectedResult.get(i)); } } - - @Test - @DisplayName("카드를 더 받을지에 대한 응답으로 Y를 입력받으면 정상 처리된다.") - void receiveCardResponseCorrectTest1() { - //given - String response = "Y"; - - //when, then - assertThat(StringUtil.validateYesOrNo(response)).isEqualTo("Y"); - } - - @Test - @DisplayName("카드를 더 받을지에 대한 응답으로 y를 입력받으면 정상 처리된다.") - void receiveCardResponseCorrectTest2() { - //given - String response = "y"; - - //when, then - assertThat(StringUtil.validateYesOrNo(response)).isEqualTo("y"); - } - - @Test - @DisplayName("카드를 더 받을지에 대한 응답으로 N을 입력받으면 정상 처리된다.") - void receiveCardResponseCorrectTest3() { - //given - String response = "N"; - - //when, then - assertThat(StringUtil.validateYesOrNo(response)).isEqualTo("N"); - } - - @Test - @DisplayName("카드를 더 받을지에 대한 응답으로 n을 입력받으면 정상 처리된다.") - void receiveCardResponseCorrectTest4() { - //given - String response = "n"; - - //when, then - assertThat(StringUtil.validateYesOrNo(response)).isEqualTo("n"); - } - - @Test - @DisplayName("카드를 더 받을지에 대한 응답으로 Y y N n 이 아닌 문자열을 입력 시 예외를 던진다.") - void receiveCardResponseErrorTest() { - //given - String response = "U"; - - //when, then - assertThatThrownBy(() -> StringUtil.validateYesOrNo(response)) - .isInstanceOf(IllegalArgumentException.class) - .hasMessage("y 혹은 n 만 입력할 수 있습니다."); - } - - } \ No newline at end of file From dc99787ff8cb5685a25774f4dd4be2546b809195 Mon Sep 17 00:00:00 2001 From: chunghyeon-kim Date: Mon, 9 Aug 2021 22:52:44 +0900 Subject: [PATCH 46/55] =?UTF-8?q?refactor:=20CardTest=20printCardTwoDiamon?= =?UTF-8?q?d=20=EB=A9=94=EC=84=9C=EB=93=9C=20=EC=88=98=EC=A0=95?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- src/test/java/blackjack/domain/card/CardTest.java | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/test/java/blackjack/domain/card/CardTest.java b/src/test/java/blackjack/domain/card/CardTest.java index 616c762..3647cf2 100644 --- a/src/test/java/blackjack/domain/card/CardTest.java +++ b/src/test/java/blackjack/domain/card/CardTest.java @@ -23,7 +23,7 @@ void printCardTwoDiamond() { Card card = new Card(Denomination.TWO, Type.DIAMOND); //when, then - assertThat(card.toString()).isEqualTo("2다이아몬드"); + assertThat(card).hasToString("2다이아몬드"); } @DisplayName("카드 객체의 숫자와 종류를 출력한다") From 8cd41f35c29aa9ed3356335fda307dd3140485db Mon Sep 17 00:00:00 2001 From: chunghyeon-kim Date: Mon, 9 Aug 2021 23:10:42 +0900 Subject: [PATCH 47/55] =?UTF-8?q?refactor:=20Player=ED=81=B4=EB=9E=98?= =?UTF-8?q?=EC=8A=A4=20toString=20=EC=98=A4=EB=B2=84=EB=9D=BC=EC=9D=B4?= =?UTF-8?q?=EB=94=A9=20=EC=82=AD=EC=A0=9C,=20outputView=EC=97=90=20?= =?UTF-8?q?=ED=94=8C=EB=A0=88=EC=9D=B4=EC=96=B4=20=EA=B2=8C=EC=9E=84?= =?UTF-8?q?=EA=B2=B0=EA=B3=BC=20=EC=B6=9C=EB=A0=A5=EB=A9=94=EC=84=9C?= =?UTF-8?q?=EB=93=9C=20=EC=B6=94=EA=B0=80?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../blackjack/domain/participant/Player.java | 11 ----------- src/main/java/blackjack/view/OutputView.java | 17 ++++++++++++++--- 2 files changed, 14 insertions(+), 14 deletions(-) diff --git a/src/main/java/blackjack/domain/participant/Player.java b/src/main/java/blackjack/domain/participant/Player.java index dce35b5..4b660f1 100644 --- a/src/main/java/blackjack/domain/participant/Player.java +++ b/src/main/java/blackjack/domain/participant/Player.java @@ -31,17 +31,6 @@ public boolean drawable() { return getCardsSum() < PLAYER_DRAW_THRESHOLD; } - @Override - public String toString() { - StringBuilder sb = new StringBuilder(); - sb.append(getName()) - .append("카드: ") - .append(getCards().stream() - .map(Card::toString) - .collect(Collectors.joining(", "))); - return sb.toString(); - } - public WinningResult win(Dealer dealer) { return Arrays.stream(Rule.values()) .filter(rule -> rule.compare(this, dealer)) diff --git a/src/main/java/blackjack/view/OutputView.java b/src/main/java/blackjack/view/OutputView.java index dd6006d..513084f 100644 --- a/src/main/java/blackjack/view/OutputView.java +++ b/src/main/java/blackjack/view/OutputView.java @@ -1,5 +1,6 @@ package blackjack.view; +import blackjack.domain.card.Card; import blackjack.domain.participant.Dealer; import blackjack.domain.participant.Player; import blackjack.domain.result.GameResult; @@ -38,13 +39,13 @@ public void printDealerCard(Dealer dealer) { public void printPlayersCard(List players) { for (Player player : players) { - System.out.println(player); + System.out.println(playerResultToString(player)); } System.out.println(); } public void printCards(Player player) { - System.out.println(player); + System.out.println(playerResultToString(player)); } public void printDealerCardGiven() { @@ -70,7 +71,7 @@ private void printDealerCardsResult(Dealer dealer) { } private void printPlayerCardsResult(Player player) { - StringBuilder sb = new StringBuilder(player.toString()); + StringBuilder sb = new StringBuilder(playerResultToString(player)); sb.append(RESULT); sb.append(player.getCardsSum()); @@ -106,5 +107,15 @@ private void printPlayersResult(Map playersResult) { System.out.println(sb); } + private String playerResultToString(Player player) { + StringBuilder sb = new StringBuilder(); + sb.append(player.getName()) + .append("카드: ") + .append(player.getCards().stream() + .map(Card::toString) + .collect(Collectors.joining(", "))); + return sb.toString(); + } + } From 634acaba6ed4881d58acd4c6f598b8ade77a5a1e Mon Sep 17 00:00:00 2001 From: chunghyeon-kim Date: Mon, 9 Aug 2021 23:26:28 +0900 Subject: [PATCH 48/55] =?UTF-8?q?refactor:=20=EB=A9=94=EC=84=9C=EB=93=9C?= =?UTF-8?q?=20=EC=9D=B4=EB=A6=84=20=EC=88=98=EC=A0=95=20(win=20->=20result?= =?UTF-8?q?VersusDealer)?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- src/main/java/blackjack/domain/participant/Player.java | 4 +--- src/main/java/blackjack/domain/result/GameResult.java | 2 +- 2 files changed, 2 insertions(+), 4 deletions(-) diff --git a/src/main/java/blackjack/domain/participant/Player.java b/src/main/java/blackjack/domain/participant/Player.java index 4b660f1..a72be5d 100644 --- a/src/main/java/blackjack/domain/participant/Player.java +++ b/src/main/java/blackjack/domain/participant/Player.java @@ -1,12 +1,10 @@ package blackjack.domain.participant; -import blackjack.domain.card.Card; import blackjack.domain.result.Rule; import blackjack.domain.result.WinningResult; import lombok.Getter; import java.util.Arrays; -import java.util.stream.Collectors; @Getter public class Player extends Participant { @@ -31,7 +29,7 @@ public boolean drawable() { return getCardsSum() < PLAYER_DRAW_THRESHOLD; } - public WinningResult win(Dealer dealer) { + public WinningResult resultVersusDealer(Dealer dealer) { return Arrays.stream(Rule.values()) .filter(rule -> rule.compare(this, dealer)) .findFirst() diff --git a/src/main/java/blackjack/domain/result/GameResult.java b/src/main/java/blackjack/domain/result/GameResult.java index 9bdf4fc..ba5bb92 100644 --- a/src/main/java/blackjack/domain/result/GameResult.java +++ b/src/main/java/blackjack/domain/result/GameResult.java @@ -19,7 +19,7 @@ private GameResult(Dealer dealer, List players) { // 플레이어 점수랑 딜러 점수 비교하는 로직 // 플레이어 기준으로 승패가 Map에 입력이 된 상태 - players.forEach(player -> playersResult.put(player, player.win(dealer))); + players.forEach(player -> playersResult.put(player, player.resultVersusDealer(dealer))); // 넣어둔 value가 있으면 apply = computeIfPresent // 딜러기준으로 승패를 바꿔주고, 승패 숫자를 하나씩 올려줌 From 3818a06a6c0057c5730badf2d18bc9d7584442a5 Mon Sep 17 00:00:00 2001 From: chunghyeon-kim Date: Mon, 9 Aug 2021 23:39:37 +0900 Subject: [PATCH 49/55] =?UTF-8?q?refactor:=20Rule=20=EB=A9=94=EC=84=9C?= =?UTF-8?q?=EB=93=9C=20=EC=9D=B4=EB=A6=84=20=EB=B3=80=EA=B2=BD=20(compare?= =?UTF-8?q?=20->=20findMatchingRule)?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- src/main/java/blackjack/domain/participant/Player.java | 2 +- src/main/java/blackjack/domain/result/Rule.java | 2 +- 2 files changed, 2 insertions(+), 2 deletions(-) diff --git a/src/main/java/blackjack/domain/participant/Player.java b/src/main/java/blackjack/domain/participant/Player.java index a72be5d..fdb64cc 100644 --- a/src/main/java/blackjack/domain/participant/Player.java +++ b/src/main/java/blackjack/domain/participant/Player.java @@ -31,7 +31,7 @@ public boolean drawable() { public WinningResult resultVersusDealer(Dealer dealer) { return Arrays.stream(Rule.values()) - .filter(rule -> rule.compare(this, dealer)) + .filter(rule -> rule.findMatchingRule(this, dealer)) .findFirst() .get() .getWinningResult(); diff --git a/src/main/java/blackjack/domain/result/Rule.java b/src/main/java/blackjack/domain/result/Rule.java index 7aff0f9..2704e33 100644 --- a/src/main/java/blackjack/domain/result/Rule.java +++ b/src/main/java/blackjack/domain/result/Rule.java @@ -25,7 +25,7 @@ public enum Rule { this.winningResult = winningResult; } - public Boolean compare(Player player, Dealer dealer) { + public Boolean findMatchingRule(Player player, Dealer dealer) { return compare.apply(player, dealer); } From 49d48e704a3cab809275d34ef9d6d7d7962426f7 Mon Sep 17 00:00:00 2001 From: chunghyeon-kim Date: Thu, 12 Aug 2021 21:53:05 +0900 Subject: [PATCH 50/55] =?UTF-8?q?refactor:=20static=20block=20=EC=B6=94?= =?UTF-8?q?=EA=B0=80?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- src/main/java/blackjack/domain/card/DeckFactory.java | 6 +++++- 1 file changed, 5 insertions(+), 1 deletion(-) diff --git a/src/main/java/blackjack/domain/card/DeckFactory.java b/src/main/java/blackjack/domain/card/DeckFactory.java index c68624b..5ef322c 100644 --- a/src/main/java/blackjack/domain/card/DeckFactory.java +++ b/src/main/java/blackjack/domain/card/DeckFactory.java @@ -6,7 +6,11 @@ public class DeckFactory { - private static List cardsDeck = createCardsDeck(); + private static final List cardsDeck; + + static { + cardsDeck = createCardsDeck(); + } private static List createCardsDeck() { List cards = new ArrayList<>(); From 080bc70761589e54b92925cb635cd1c49de1902d Mon Sep 17 00:00:00 2001 From: chunghyeon-kim Date: Sun, 15 Aug 2021 07:17:12 +0900 Subject: [PATCH 51/55] =?UTF-8?q?feat:=20Rule=20=EB=B9=84=EA=B5=90=20?= =?UTF-8?q?=EB=A1=9C=EC=A7=81=20=EC=B6=94=EA=B0=80?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../blackjack/domain/participant/Player.java | 4 ++++ .../java/blackjack/domain/result/Rule.java | 19 ++++++++++++------- .../domain/result/RuleComparator.java | 13 +++++++++++++ 3 files changed, 29 insertions(+), 7 deletions(-) create mode 100644 src/main/java/blackjack/domain/result/RuleComparator.java diff --git a/src/main/java/blackjack/domain/participant/Player.java b/src/main/java/blackjack/domain/participant/Player.java index fdb64cc..5cb38c7 100644 --- a/src/main/java/blackjack/domain/participant/Player.java +++ b/src/main/java/blackjack/domain/participant/Player.java @@ -1,6 +1,7 @@ package blackjack.domain.participant; import blackjack.domain.result.Rule; +import blackjack.domain.result.RuleComparator; import blackjack.domain.result.WinningResult; import lombok.Getter; @@ -30,7 +31,10 @@ public boolean drawable() { } public WinningResult resultVersusDealer(Dealer dealer) { + RuleComparator ruleComparator = new RuleComparator(); + return Arrays.stream(Rule.values()) + .sorted((rule1, rule2) -> ruleComparator.compare(rule1, rule2)) .filter(rule -> rule.findMatchingRule(this, dealer)) .findFirst() .get() diff --git a/src/main/java/blackjack/domain/result/Rule.java b/src/main/java/blackjack/domain/result/Rule.java index 2704e33..66879a4 100644 --- a/src/main/java/blackjack/domain/result/Rule.java +++ b/src/main/java/blackjack/domain/result/Rule.java @@ -2,27 +2,32 @@ import blackjack.domain.participant.Dealer; import blackjack.domain.participant.Player; +import lombok.Getter; +import java.util.Comparator; import java.util.function.BiFunction; -public enum Rule { +public enum Rule{ // 카드 값의 합이 21을 넘으면 승패 결정 (플레이어 기준으로 선언) - PLAYER_BUST(((player, dealer) -> player.isBust()), WinningResult.LOSE), - DEALER_BUST(((player, dealer) -> dealer.isBust()), WinningResult.WIN), + PLAYER_BUST(((player, dealer) -> player.isBust()), WinningResult.LOSE, 1), + DEALER_BUST(((player, dealer) -> dealer.isBust()), WinningResult.WIN, 2), // 카드 값의 합이 21을 넘지 않으면서, 값이 더 큰쪽이 승패결정(이미 여기서 결정, BlackJack 체크 필요없음) - PLAYER_HIGHER(((player, dealer) -> player.getCardsSum() > dealer.getCardsSum()), WinningResult.WIN), - DEALER_HIGHER(((player, dealer) -> player.getCardsSum() < dealer.getCardsSum()), WinningResult.LOSE), + PLAYER_HIGHER(((player, dealer) -> player.getCardsSum() > dealer.getCardsSum()), WinningResult.WIN, 3), + DEALER_HIGHER(((player, dealer) -> player.getCardsSum() < dealer.getCardsSum()), WinningResult.LOSE, 4), // 무승부 결정 - TIES(((player, dealer) -> player.getCardsSum() == dealer.getCardsSum()), WinningResult.TIE); + TIES(((player, dealer) -> player.getCardsSum() == dealer.getCardsSum()), WinningResult.TIE, 5); private BiFunction compare; private WinningResult winningResult; + @Getter + private int verificationOrder; - Rule(BiFunction compare, WinningResult winningResult) { + Rule(BiFunction compare, WinningResult winningResult, int verificationOrder) { this.compare = compare; this.winningResult = winningResult; + this.verificationOrder = verificationOrder; } public Boolean findMatchingRule(Player player, Dealer dealer) { diff --git a/src/main/java/blackjack/domain/result/RuleComparator.java b/src/main/java/blackjack/domain/result/RuleComparator.java new file mode 100644 index 0000000..e9d321b --- /dev/null +++ b/src/main/java/blackjack/domain/result/RuleComparator.java @@ -0,0 +1,13 @@ +package blackjack.domain.result; + +import java.util.Comparator; + +public class RuleComparator implements Comparator { + @Override + public int compare(Rule rule1, Rule rule2) { + int order1 = rule1.getVerificationOrder(); + int order2 = rule2.getVerificationOrder(); + + return Integer.compare(order1, order2); + } +} From 4b3f64b37f8d0540317a0eaece2d1cf6a07a2ecc Mon Sep 17 00:00:00 2001 From: chunghyeon-kim Date: Sun, 15 Aug 2021 07:29:36 +0900 Subject: [PATCH 52/55] =?UTF-8?q?refactor:=20=EC=B9=B4=EB=93=9C=20?= =?UTF-8?q?=EB=BD=91=EC=9D=84=20=EB=95=8C=20RandomNumber=20=EC=83=9D?= =?UTF-8?q?=EC=84=B1=ED=95=98=EB=8A=94=20=EB=B6=80=EB=B6=84=EC=9D=84=20?= =?UTF-8?q?=EB=B6=84=EB=A6=AC?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- src/main/java/blackjack/domain/card/Deck.java | 10 +++++----- .../domain/card/strategy/DrawStrategy.java | 9 +++++++++ .../domain/card/strategy/RandomDrawStrategy.java | 15 +++++++++++++++ 3 files changed, 29 insertions(+), 5 deletions(-) create mode 100644 src/main/java/blackjack/domain/card/strategy/DrawStrategy.java create mode 100644 src/main/java/blackjack/domain/card/strategy/RandomDrawStrategy.java diff --git a/src/main/java/blackjack/domain/card/Deck.java b/src/main/java/blackjack/domain/card/Deck.java index 13a63fc..f593afb 100644 --- a/src/main/java/blackjack/domain/card/Deck.java +++ b/src/main/java/blackjack/domain/card/Deck.java @@ -1,14 +1,14 @@ package blackjack.domain.card; +import blackjack.domain.card.strategy.DrawStrategy; +import blackjack.domain.card.strategy.RandomDrawStrategy; import lombok.Getter; import java.util.LinkedList; import java.util.List; -import java.util.Random; public class Deck { - private static final Random RANDOM = new Random(); private static final String ALERT_NO_CARD_LEFT = "사용 가능한 카드를 모두 소진하였습니다."; @Getter @@ -22,11 +22,11 @@ public Card drawCard() { if (deck.isEmpty()) { throw new RuntimeException(ALERT_NO_CARD_LEFT); } - return deck.remove(generateRandomNumber()); + return deck.remove(generateNextDrawCardIndex(new RandomDrawStrategy())); } - private int generateRandomNumber() { - return RANDOM.nextInt(deck.size()); + private int generateNextDrawCardIndex(DrawStrategy drawStrategy) { + return drawStrategy.getNextIndex(deck); } } diff --git a/src/main/java/blackjack/domain/card/strategy/DrawStrategy.java b/src/main/java/blackjack/domain/card/strategy/DrawStrategy.java new file mode 100644 index 0000000..a64c530 --- /dev/null +++ b/src/main/java/blackjack/domain/card/strategy/DrawStrategy.java @@ -0,0 +1,9 @@ +package blackjack.domain.card.strategy; + +import blackjack.domain.card.Card; + +import java.util.List; + +public interface DrawStrategy { + int getNextIndex(List deck); +} diff --git a/src/main/java/blackjack/domain/card/strategy/RandomDrawStrategy.java b/src/main/java/blackjack/domain/card/strategy/RandomDrawStrategy.java new file mode 100644 index 0000000..0826c36 --- /dev/null +++ b/src/main/java/blackjack/domain/card/strategy/RandomDrawStrategy.java @@ -0,0 +1,15 @@ +package blackjack.domain.card.strategy; + +import blackjack.domain.card.Card; + +import java.util.List; +import java.util.Random; + +public class RandomDrawStrategy implements DrawStrategy { + private static final Random RANDOM = new Random(); + + @Override + public int getNextIndex(List deck) { + return RANDOM.nextInt(deck.size()); + } +} From 0aebc8cb1a95e0b40b8767a9880d4e823f52fd25 Mon Sep 17 00:00:00 2001 From: chunghyeon-kim Date: Sun, 15 Aug 2021 07:41:29 +0900 Subject: [PATCH 53/55] =?UTF-8?q?refactor:=20Controller=20=ED=81=B4?= =?UTF-8?q?=EB=9E=98=EC=8A=A4=EB=B3=80=EC=88=98=EB=A5=BC=20=EC=A7=80?= =?UTF-8?q?=EC=97=AD=EB=B3=80=EC=88=98=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 --- .../controller/BlackJackController.java | 30 ++++++++----------- 1 file changed, 12 insertions(+), 18 deletions(-) diff --git a/src/main/java/blackjack/controller/BlackJackController.java b/src/main/java/blackjack/controller/BlackJackController.java index 82af381..e0e080a 100644 --- a/src/main/java/blackjack/controller/BlackJackController.java +++ b/src/main/java/blackjack/controller/BlackJackController.java @@ -7,35 +7,29 @@ import blackjack.domain.result.GameResult; import blackjack.dto.DrawCardRequestDto; import blackjack.dto.PlayersNameInputDto; -import blackjack.utils.StringUtil; import blackjack.view.InputView; import blackjack.view.OutputView; import java.util.List; public class BlackJackController { - private final List players; - private final Dealer dealer; - private final Deck deck; private final InputView inputView = new InputView(); private final OutputView outputView = new OutputView(); - public BlackJackController() { + public void run() { PlayersNameInputDto namesInput = inputView.getPlayersName(); - this.players = PlayersFactory.createPlayers(namesInput.getPlayersName()); - this.dealer = new Dealer(); - this.deck = new Deck(); - } + Dealer dealer = new Dealer(); + Deck deck = new Deck(); + List players = PlayersFactory.createPlayers(namesInput.getPlayersName()); - public void run() { - drawTowCards(); - drawCardToPlayers(); - drawCardToDealer(); + drawTowCards(dealer, players, deck); + drawCardToPlayers(players, deck); + drawCardToDealer(dealer, deck); outputView.printCardsResult(dealer, players); outputView.printGameResult(GameResult.of(dealer, players)); } - private void drawTowCards() { + private void drawTowCards(Dealer dealer, List players, Deck deck) { for (Player player : players) { player.receiveCard(deck.drawCard()); player.receiveCard(deck.drawCard()); @@ -47,13 +41,13 @@ private void drawTowCards() { outputView.printPlayersCard(players); } - private void drawCardToPlayers() { + private void drawCardToPlayers(List players, Deck deck) { for (Player player : players) { - drawCardToPlayer(player); + drawCardToPlayer(player, deck); } } - private void drawCardToPlayer(Player player) { + private void drawCardToPlayer(Player player, Deck deck) { DrawCardRequestDto drawCardRequest = inputView.getPlayersResponse(player); while (player.drawable() && drawCardRequest.isYes()) { player.receiveCard(deck.drawCard()); @@ -63,7 +57,7 @@ private void drawCardToPlayer(Player player) { } } - private void drawCardToDealer() { + private void drawCardToDealer(Dealer dealer, Deck deck) { while (dealer.drawable()) { dealer.receiveCard(deck.drawCard()); outputView.printDealerCardGiven(); From bfe22bb82c996a7c99ac453e8bcbd9d04d7902a3 Mon Sep 17 00:00:00 2001 From: chunghyeon-kim Date: Sun, 15 Aug 2021 09:11:02 +0900 Subject: [PATCH 54/55] refactor: get -> orElseThrow --- src/main/java/blackjack/domain/participant/Player.java | 5 ++--- src/main/java/blackjack/domain/result/Rule.java | 1 - 2 files changed, 2 insertions(+), 4 deletions(-) diff --git a/src/main/java/blackjack/domain/participant/Player.java b/src/main/java/blackjack/domain/participant/Player.java index 5cb38c7..c875129 100644 --- a/src/main/java/blackjack/domain/participant/Player.java +++ b/src/main/java/blackjack/domain/participant/Player.java @@ -31,13 +31,12 @@ public boolean drawable() { } public WinningResult resultVersusDealer(Dealer dealer) { - RuleComparator ruleComparator = new RuleComparator(); return Arrays.stream(Rule.values()) - .sorted((rule1, rule2) -> ruleComparator.compare(rule1, rule2)) + .sorted(new RuleComparator()) .filter(rule -> rule.findMatchingRule(this, dealer)) .findFirst() - .get() + .orElseThrow(() -> new RuntimeException("일치하는 결과를 찾을 수 없습니다.")) .getWinningResult(); } } diff --git a/src/main/java/blackjack/domain/result/Rule.java b/src/main/java/blackjack/domain/result/Rule.java index 66879a4..37cc8cb 100644 --- a/src/main/java/blackjack/domain/result/Rule.java +++ b/src/main/java/blackjack/domain/result/Rule.java @@ -4,7 +4,6 @@ import blackjack.domain.participant.Player; import lombok.Getter; -import java.util.Comparator; import java.util.function.BiFunction; public enum Rule{ From 13b9421f07346062b7f1e798f78c68b04e24ba4e Mon Sep 17 00:00:00 2001 From: chunghyeon-kim Date: Sun, 15 Aug 2021 10:54:30 +0900 Subject: [PATCH 55/55] =?UTF-8?q?refactor:=20player=EC=99=80=20dealer?= =?UTF-8?q?=EB=A5=BC=20=EB=B9=84=EA=B5=90=ED=95=B4=EC=84=9C=20=EA=B2=8C?= =?UTF-8?q?=EC=9E=84=20=EA=B2=B0=EA=B3=BC=EB=A5=BC=20=EB=B0=98=ED=99=98?= =?UTF-8?q?=ED=95=98=EB=8A=94=20=EB=A1=9C=EC=A7=81=EC=9D=84=20Player?= =?UTF-8?q?=EC=97=90=EC=84=9C=20Rule=EB=A1=9C=20=EC=98=AE=EA=B8=B0?= =?UTF-8?q?=EA=B3=A0=20=EB=A9=94=EC=84=9C=EB=93=9C=20=EC=9D=B4=EB=A6=84=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/participant/Player.java | 15 --------------- .../java/blackjack/domain/result/GameResult.java | 2 +- src/main/java/blackjack/domain/result/Rule.java | 11 +++++++++++ 3 files changed, 12 insertions(+), 16 deletions(-) diff --git a/src/main/java/blackjack/domain/participant/Player.java b/src/main/java/blackjack/domain/participant/Player.java index c875129..117c5ba 100644 --- a/src/main/java/blackjack/domain/participant/Player.java +++ b/src/main/java/blackjack/domain/participant/Player.java @@ -1,12 +1,7 @@ package blackjack.domain.participant; -import blackjack.domain.result.Rule; -import blackjack.domain.result.RuleComparator; -import blackjack.domain.result.WinningResult; import lombok.Getter; -import java.util.Arrays; - @Getter public class Player extends Participant { @@ -29,14 +24,4 @@ private void validateDealerNameDuplicated(String name) { public boolean drawable() { return getCardsSum() < PLAYER_DRAW_THRESHOLD; } - - public WinningResult resultVersusDealer(Dealer dealer) { - - return Arrays.stream(Rule.values()) - .sorted(new RuleComparator()) - .filter(rule -> rule.findMatchingRule(this, dealer)) - .findFirst() - .orElseThrow(() -> new RuntimeException("일치하는 결과를 찾을 수 없습니다.")) - .getWinningResult(); - } } diff --git a/src/main/java/blackjack/domain/result/GameResult.java b/src/main/java/blackjack/domain/result/GameResult.java index ba5bb92..83c642b 100644 --- a/src/main/java/blackjack/domain/result/GameResult.java +++ b/src/main/java/blackjack/domain/result/GameResult.java @@ -19,7 +19,7 @@ private GameResult(Dealer dealer, List players) { // 플레이어 점수랑 딜러 점수 비교하는 로직 // 플레이어 기준으로 승패가 Map에 입력이 된 상태 - players.forEach(player -> playersResult.put(player, player.resultVersusDealer(dealer))); + players.forEach(player -> playersResult.put(player, Rule.resultPlayerVersusDealer(player, dealer))); // 넣어둔 value가 있으면 apply = computeIfPresent // 딜러기준으로 승패를 바꿔주고, 승패 숫자를 하나씩 올려줌 diff --git a/src/main/java/blackjack/domain/result/Rule.java b/src/main/java/blackjack/domain/result/Rule.java index 37cc8cb..f67d0da 100644 --- a/src/main/java/blackjack/domain/result/Rule.java +++ b/src/main/java/blackjack/domain/result/Rule.java @@ -4,6 +4,7 @@ import blackjack.domain.participant.Player; import lombok.Getter; +import java.util.Arrays; import java.util.function.BiFunction; public enum Rule{ @@ -36,4 +37,14 @@ public Boolean findMatchingRule(Player player, Dealer dealer) { public WinningResult getWinningResult() { return winningResult; } + + public static WinningResult resultPlayerVersusDealer(Player player, Dealer dealer) { + + return Arrays.stream(Rule.values()) + .sorted(new RuleComparator()) + .filter(rule -> rule.findMatchingRule(player, dealer)) + .findFirst() + .orElseThrow(() -> new RuntimeException("일치하는 결과를 찾을 수 없습니다.")) + .getWinningResult(); + } }