From 4117d5cb1917c9c9779fe1ebd8c062be267f8a1f Mon Sep 17 00:00:00 2001 From: Seong Jin Date: Sat, 16 May 2026 20:04:18 +0900 Subject: [PATCH 01/16] =?UTF-8?q?docs=20:=20=EA=B8=B0=EB=8A=A5=20=EB=AA=A9?= =?UTF-8?q?=EB=A1=9D=20README.md=20=EC=9E=91=EC=84=B1?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- README.md | 24 ++++++++++++++++++++++++ 1 file changed, 24 insertions(+) diff --git a/README.md b/README.md index 1ff5f7b679..7610205748 100644 --- a/README.md +++ b/README.md @@ -1,3 +1,27 @@ # java-blackjack 블랙잭 미션 저장소 + +## 참가자 입력 +- [ ] 쉼표 기준으로 분리 + +## 카드 배분 +- [ ] 카드는 52장을 사용 + - 숫자 계산은 카드 숫자를 기본 + - Ace는 1 or 11로 계산 가능 + - King, Queen, Jack은 각각 10으로 계산 +- [ ] 카드는 게임이 시작되기 전에 순서를 섞는다. +- [ ] 참가자에게 카드를 2장씩 분배 +- [ ] 각 참가자에게 분배된 카드 출력 + +## 게임 진행 +- [ ] 딜러를 제외한 참가자에게 Hit/Stand 여부 확인 + - 참가자의 카드 합이 21을 넘지 않는지 Bust 검증 + - draw 할 카드가 존재하는지 확인 +- [ ] 딜러 Hit/Stand 여부 확인 + - 16 이하라면 카드를 draw, 아니라면 멈춘다. + +## 게임 종료 +- [ ] 참가자의 카드 패와 결과 출력 +- [ ] 결과를 바탕으로 각 참가자들의 승패 출력 + - 점수가 같을 때를 고려 \ No newline at end of file From e1a6bdf921d9bc431a22eab221a992e2357dce8e Mon Sep 17 00:00:00 2001 From: Seong Jin Date: Sun, 17 May 2026 00:35:01 +0900 Subject: [PATCH 02/16] =?UTF-8?q?test=20:=20ACE=20=EA=B2=80=EC=A6=9D=20?= =?UTF-8?q?=ED=85=8C=EC=8A=A4=ED=8A=B8=20=EC=B6=94=EA=B0=80?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- src/test/java/card/CardTest.java | 16 ++++++++++++++++ 1 file changed, 16 insertions(+) create mode 100644 src/test/java/card/CardTest.java diff --git a/src/test/java/card/CardTest.java b/src/test/java/card/CardTest.java new file mode 100644 index 0000000000..3b62696c4c --- /dev/null +++ b/src/test/java/card/CardTest.java @@ -0,0 +1,16 @@ +package card; + +import org.junit.jupiter.api.Test; +import static org.assertj.core.api.Assertions.assertThat; + + +public class CardTest { + @Test + void ACE_카드는_isAce가_true이다(){ + Card card = new Card(ACE, CLOVER); + + boolean ace = card.isAce(); + + assertThat(ace).isTrue(); + } +} From 19d60938c6d7e0db1e3926d81367d02b553e48b2 Mon Sep 17 00:00:00 2001 From: Seong Jin Date: Sun, 17 May 2026 00:59:20 +0900 Subject: [PATCH 03/16] =?UTF-8?q?feat=20:=20ACE=20=EA=B2=80=EC=A6=9D=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 --- src/main/java/card/Card.java | 18 ++++++++++++++++++ src/main/java/card/enums/Rank.java | 17 +++++++++++++++++ src/main/java/card/enums/Suit.java | 8 ++++++++ src/test/java/card/CardTest.java | 4 +++- 4 files changed, 46 insertions(+), 1 deletion(-) create mode 100644 src/main/java/card/Card.java create mode 100644 src/main/java/card/enums/Rank.java create mode 100644 src/main/java/card/enums/Suit.java diff --git a/src/main/java/card/Card.java b/src/main/java/card/Card.java new file mode 100644 index 0000000000..d3f7507062 --- /dev/null +++ b/src/main/java/card/Card.java @@ -0,0 +1,18 @@ +package card; + +import card.enums.Rank; +import card.enums.Suit; + +public class Card { + private Rank rank; + private Suit suit; + + public Card(Rank rank, Suit suit){ + this.rank = rank; + this.suit = suit; + } + + public boolean isAce() { + return this.rank == Rank.ACE; + } +} diff --git a/src/main/java/card/enums/Rank.java b/src/main/java/card/enums/Rank.java new file mode 100644 index 0000000000..9c9c65bb0a --- /dev/null +++ b/src/main/java/card/enums/Rank.java @@ -0,0 +1,17 @@ +package card.enums; + +public enum Rank { + ACE, + TWO, + THREE, + FOUR, + FIVE, + SIX, + SEVEN, + EIGHT, + NINE, + TEN, + JACK, + QUEEN, + KING, +} diff --git a/src/main/java/card/enums/Suit.java b/src/main/java/card/enums/Suit.java new file mode 100644 index 0000000000..14b36e71a4 --- /dev/null +++ b/src/main/java/card/enums/Suit.java @@ -0,0 +1,8 @@ +package card.enums; + +public enum Suit { + CLUB, + HEART, + SPADE, + DIAMOND +} diff --git a/src/test/java/card/CardTest.java b/src/test/java/card/CardTest.java index 3b62696c4c..6195afdd6d 100644 --- a/src/test/java/card/CardTest.java +++ b/src/test/java/card/CardTest.java @@ -1,5 +1,7 @@ package card; +import card.enums.Rank; +import card.enums.Suit; import org.junit.jupiter.api.Test; import static org.assertj.core.api.Assertions.assertThat; @@ -7,7 +9,7 @@ public class CardTest { @Test void ACE_카드는_isAce가_true이다(){ - Card card = new Card(ACE, CLOVER); + Card card = new Card(Rank.ACE, Suit.SPADE); boolean ace = card.isAce(); From 85239560a3a23d06e6ff5a94e02c0234401ecfa9 Mon Sep 17 00:00:00 2001 From: Seong Jin Date: Sun, 17 May 2026 01:14:59 +0900 Subject: [PATCH 04/16] =?UTF-8?q?test=20:=20=EC=B9=B4=EB=93=9C=20=EA=B4=80?= =?UTF-8?q?=EB=A0=A8=20=ED=85=8C=EC=8A=A4=ED=8A=B8=20=EC=B6=94=EA=B0=80?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- src/test/java/card/CardTest.java | 22 ++++++++++++++++++++++ 1 file changed, 22 insertions(+) diff --git a/src/test/java/card/CardTest.java b/src/test/java/card/CardTest.java index 6195afdd6d..e4af2e7b15 100644 --- a/src/test/java/card/CardTest.java +++ b/src/test/java/card/CardTest.java @@ -3,6 +3,9 @@ import card.enums.Rank; import card.enums.Suit; import org.junit.jupiter.api.Test; +import org.junit.jupiter.params.ParameterizedTest; +import org.junit.jupiter.params.provider.EnumSource; + import static org.assertj.core.api.Assertions.assertThat; @@ -15,4 +18,23 @@ public class CardTest { assertThat(ace).isTrue(); } + + @ParameterizedTest + @EnumSource(value = Rank.class, names = {"JACK", "QUEEN", "KING"}) + void JQK_카드는_10점으로_처리된다(Rank rank){ + Card card = new Card(rank, Suit.SPADE); + + int score = card.score(); + + assertThat(score).isEqualTo(10); + } + + @Test + void 숫자_카드는_숫자_그대로_점수가_처리된다() { + Card card = new Card(Rank.EIGHT, Suit.SPADE); + + int score = card.score(); + + assertThat(score).isEqualTo(8); + } } From c5a433bee2a219790b6c8644de50e9b6a170ecc6 Mon Sep 17 00:00:00 2001 From: Seong Jin Date: Sun, 17 May 2026 01:30:39 +0900 Subject: [PATCH 05/16] =?UTF-8?q?feat=20:=20=EB=8B=A8=EC=9D=BC=20=EC=B9=B4?= =?UTF-8?q?=EB=93=9C=20=EC=A0=90=EC=88=98=20=EB=B0=98=ED=99=98=20=EA=B5=AC?= =?UTF-8?q?=ED=98=84?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- src/main/java/card/Card.java | 4 ++++ src/main/java/card/enums/Rank.java | 37 +++++++++++++++++++----------- src/test/java/card/CardTest.java | 15 +++++++----- 3 files changed, 37 insertions(+), 19 deletions(-) diff --git a/src/main/java/card/Card.java b/src/main/java/card/Card.java index d3f7507062..8c728babba 100644 --- a/src/main/java/card/Card.java +++ b/src/main/java/card/Card.java @@ -15,4 +15,8 @@ public Card(Rank rank, Suit suit){ public boolean isAce() { return this.rank == Rank.ACE; } + + public int score(){ + return this.rank.getScore(); + } } diff --git a/src/main/java/card/enums/Rank.java b/src/main/java/card/enums/Rank.java index 9c9c65bb0a..bdc62455f4 100644 --- a/src/main/java/card/enums/Rank.java +++ b/src/main/java/card/enums/Rank.java @@ -1,17 +1,28 @@ package card.enums; public enum Rank { - ACE, - TWO, - THREE, - FOUR, - FIVE, - SIX, - SEVEN, - EIGHT, - NINE, - TEN, - JACK, - QUEEN, - KING, + ACE(1), + TWO(2), + THREE(3), + FOUR(4), + FIVE(5), + SIX(6), + SEVEN(7), + EIGHT(8), + NINE(9), + TEN(10), + JACK(10), + QUEEN(10), + KING(10); + + private final int score; + + Rank(int score){ + this.score = score; + } + + public int getScore(){ + return score; + } + } diff --git a/src/test/java/card/CardTest.java b/src/test/java/card/CardTest.java index e4af2e7b15..5e84f63286 100644 --- a/src/test/java/card/CardTest.java +++ b/src/test/java/card/CardTest.java @@ -4,6 +4,7 @@ import card.enums.Suit; import org.junit.jupiter.api.Test; import org.junit.jupiter.params.ParameterizedTest; +import org.junit.jupiter.params.provider.CsvSource; import org.junit.jupiter.params.provider.EnumSource; import static org.assertj.core.api.Assertions.assertThat; @@ -29,12 +30,14 @@ public class CardTest { assertThat(score).isEqualTo(10); } - @Test - void 숫자_카드는_숫자_그대로_점수가_처리된다() { - Card card = new Card(Rank.EIGHT, Suit.SPADE); - - int score = card.score(); + @ParameterizedTest + @CsvSource({ + "TWO, 2", "THREE, 3", "FOUR, 4", "FIVE, 5", "SIX, 6", + "SEVEN, 7", "EIGHT, 8", "NINE, 9", "TEN, 10" + }) + void 숫자_카드는_숫자_그대로_점수가_처리된다(Rank rank, int expectedScore) { + Card card = new Card(rank, Suit.SPADE); - assertThat(score).isEqualTo(8); + assertThat(card.score()).isEqualTo(expectedScore); } } From 80e5408fa89798c09a434ebba01c953b02a51856 Mon Sep 17 00:00:00 2001 From: Seong Jin Date: Sun, 17 May 2026 02:22:51 +0900 Subject: [PATCH 06/16] =?UTF-8?q?test=20:=20=EC=86=90=ED=8C=A8=20=EA=B4=80?= =?UTF-8?q?=EB=A0=A8=20=ED=85=8C=EC=8A=A4=ED=8A=B8=20=EC=B6=94=EA=B0=80?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- src/test/java/hand/HandTest.java | 85 ++++++++++++++++++++++++++++++++ 1 file changed, 85 insertions(+) create mode 100644 src/test/java/hand/HandTest.java diff --git a/src/test/java/hand/HandTest.java b/src/test/java/hand/HandTest.java new file mode 100644 index 0000000000..80aa980dfe --- /dev/null +++ b/src/test/java/hand/HandTest.java @@ -0,0 +1,85 @@ +package hand; + +import card.Card; +import card.enums.Rank; +import card.enums.Suit; +import org.junit.jupiter.api.Test; + +import static org.assertj.core.api.Assertions.assertThat; + +public class HandTest { + + @Test + void 카드점수의_합계가_21이하면_버스트가_아니다(){ + Hand hand = new Hand(); + Card card1 = new Card(Rank.QUEEN, Suit.SPADE); + Card card2 = new Card(Rank.QUEEN, Suit.HEART); + hand.add(card1); + hand.add(card2); + + boolean bust = hand.isBust(); + + assertThat(bust).isFalse(); + } + + @Test + void 카드점수의_합계가_22이상이면_버스트다(){ + Hand hand = new Hand(); + Card card1 = new Card(Rank.QUEEN, Suit.SPADE); + Card card2 = new Card(Rank.QUEEN, Suit.HEART); + Card card3 = new Card(Rank.SIX, Suit.HEART); + hand.add(card1); + hand.add(card2); + hand.add(card3); + + boolean bust = hand.isBust(); + + assertThat(bust).isTrue(); + } + + @Test + void ACE를_11점으로_계산해도_21을_넘지않으면_ACE는_11점으로_계산된다(){ + Hand hand = new Hand(); + Card card1 = new Card(Rank.FIVE, Suit.SPADE); + Card card2 = new Card(Rank.FIVE, Suit.HEART); + Card card3 = new Card(Rank.ACE, Suit.HEART); + hand.add(card1); + hand.add(card2); + hand.add(card3); + + int score = hand.score(); + + assertThat(score).isEqualTo(21); + } + + @Test + void ACE를_제외한_합계가_11이상이면_ACE는_1점으로_계산된다(){ + Hand hand = new Hand(); + Card card1 = new Card(Rank.THREE, Suit.SPADE); + Card card2 = new Card(Rank.EIGHT, Suit.HEART); + Card card3 = new Card(Rank.ACE, Suit.HEART); + hand.add(card1); + hand.add(card2); + hand.add(card3); + + int score = hand.score(); + + assertThat(score).isEqualTo(12); + } + + @Test + void ACE가_여러_장이면_21을_넘지_않는_가장_큰_점수로_계산된다(){ + Hand hand = new Hand(); + Card card1 = new Card(Rank.ACE, Suit.SPADE); + Card card2 = new Card(Rank.ACE, Suit.HEART); + Card card3 = new Card(Rank.NINE, Suit.HEART); + hand.add(card1); + hand.add(card2); + hand.add(card3); + + int score = hand.score(); + + assertThat(score).isEqualTo(21); + } + +} From ca39c4b8de35aabd24f1d23761e59c5a38ab60b0 Mon Sep 17 00:00:00 2001 From: Seong Jin Date: Sun, 17 May 2026 03:00:49 +0900 Subject: [PATCH 07/16] =?UTF-8?q?feat=20:=20=EC=86=90=ED=8C=A8=20=EA=B4=80?= =?UTF-8?q?=EB=A0=A8=20=EA=B8=B0=EB=8A=A5=20=EA=B5=AC=ED=98=84?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- src/main/java/hand/Hand.java | 45 ++++++++++++++++++++++++++++++++++++ 1 file changed, 45 insertions(+) create mode 100644 src/main/java/hand/Hand.java diff --git a/src/main/java/hand/Hand.java b/src/main/java/hand/Hand.java new file mode 100644 index 0000000000..546bce9c45 --- /dev/null +++ b/src/main/java/hand/Hand.java @@ -0,0 +1,45 @@ +package hand; + +import card.Card; + +import java.util.ArrayList; +import java.util.List; + +public class Hand { + private final List cards = new ArrayList<>(); + + public void add(Card card) { + cards.add(card); + } + + public int score() { + int score = basicScore(); + int aceCount = aceCount(); + + return bestScore(score, aceCount); + } + + public boolean isBust() { + return score() > 21; + } + + private int basicScore() { + int score = 0; + for (Card card : cards) { + score += card.score(); + } + return score; + } + + private int aceCount() { + return (int) cards.stream().filter(Card::isAce).count(); + } + + private int bestScore(int score, int aceCount) { + while (aceCount > 0 && score + 10 <= 21) { + score += 10; + aceCount--; + } + return score; + } +} From 700ddc09990fb59504ae5bb625361091bd842aaa Mon Sep 17 00:00:00 2001 From: Seong Jin Date: Thu, 21 May 2026 21:50:15 +0900 Subject: [PATCH 08/16] =?UTF-8?q?test=20:=20=EC=B9=B4=EB=93=9C=EB=8D=B1=20?= =?UTF-8?q?=EA=B4=80=EB=A0=A8=20=ED=85=8C=EC=8A=A4=ED=8A=B8=20=EC=B6=94?= =?UTF-8?q?=EA=B0=80?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- src/test/java/deck/DeckTest.java | 41 ++++++++++++++++++++++++++++++++ 1 file changed, 41 insertions(+) create mode 100644 src/test/java/deck/DeckTest.java diff --git a/src/test/java/deck/DeckTest.java b/src/test/java/deck/DeckTest.java new file mode 100644 index 0000000000..79b77e346a --- /dev/null +++ b/src/test/java/deck/DeckTest.java @@ -0,0 +1,41 @@ +package deck; + +import card.Card; +import org.junit.jupiter.api.Test; + +import static org.assertj.core.api.Assertions.assertThat; + +public class DeckTest { + + @Test + void 카드를_뽑으면_첫_번째_카드를_반환한다(){ + Deck deck = new Deck(); + Card firstCard = deck.fristCard(); + Card card = deck.draw(); + + assertThat(card).isNotEqualTo(firstCard); + } + + @Test + void 카드를_섞으면_카드의_구성은_같고_순서는_달라진다(){ + Deck deck = new Deck(); + Deck beforeShuffle = deck; + + deck.shuffle(); + + assertThat(deck).containsExactlyInAnyOrderElementsOf(beforeShuffle); + assertThat(deck).isNotEqualTo(beforeShuffle); + } + + @Test + void 더이상_뽑을_수_있는_카드가_없다면_새로운_덱을_준비한다(){ + Deck deck = new Deck(); + for(int i = 0; i < 52; i++){ + deck.draw(); + } + + Card card = deck.draw(); + + assertThat(card).isNotNull(); + } +} From f36578bf6b915cdf43e3cc493d60bc7bcafc35de Mon Sep 17 00:00:00 2001 From: Seong Jin Date: Thu, 21 May 2026 23:33:38 +0900 Subject: [PATCH 09/16] =?UTF-8?q?feat=20:=20=EC=B9=B4=EB=93=9C=EB=8D=B1=20?= =?UTF-8?q?=EA=B4=80=EB=A0=A8=20=EA=B8=B0=EB=8A=A5=20=EA=B5=AC=ED=98=84?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- src/main/java/deck/Deck.java | 49 ++++++++++++++++++++++++++++++++ src/test/java/deck/DeckTest.java | 14 +++++---- 2 files changed, 58 insertions(+), 5 deletions(-) create mode 100644 src/main/java/deck/Deck.java diff --git a/src/main/java/deck/Deck.java b/src/main/java/deck/Deck.java new file mode 100644 index 0000000000..9e458311e2 --- /dev/null +++ b/src/main/java/deck/Deck.java @@ -0,0 +1,49 @@ +package deck; + +import card.Card; +import card.enums.Rank; +import card.enums.Suit; + +import java.util.ArrayList; +import java.util.Collections; +import java.util.List; + +public class Deck { + private final List cards = new ArrayList<>(); + + public Deck() { + createdDeck(); + } + + private void createdDeck(){ + for (Suit suit : Suit.values()){ + addCardsBySuit(suit); + } + } + + private void addCardsBySuit(Suit suit) { + for(Rank rank : Rank.values()){ + this.cards.add(new Card(rank, suit)); + } + } + + public Card firstCard(){ + return cards.get(0); + } + + public Card draw(){ + if(cards.isEmpty()){ + createdDeck(); + } + this.shuffle(); + return cards.removeFirst(); + } + + public void shuffle(){ + Collections.shuffle(cards); + } + + public List cards(){ + return List.copyOf(cards); + } +} diff --git a/src/test/java/deck/DeckTest.java b/src/test/java/deck/DeckTest.java index 79b77e346a..ee92772e9f 100644 --- a/src/test/java/deck/DeckTest.java +++ b/src/test/java/deck/DeckTest.java @@ -3,6 +3,8 @@ import card.Card; import org.junit.jupiter.api.Test; +import java.util.List; + import static org.assertj.core.api.Assertions.assertThat; public class DeckTest { @@ -10,21 +12,23 @@ public class DeckTest { @Test void 카드를_뽑으면_첫_번째_카드를_반환한다(){ Deck deck = new Deck(); - Card firstCard = deck.fristCard(); + Card firstCard = deck.firstCard(); + Card card = deck.draw(); - assertThat(card).isNotEqualTo(firstCard); + assertThat(card).isEqualTo(firstCard); } @Test void 카드를_섞으면_카드의_구성은_같고_순서는_달라진다(){ Deck deck = new Deck(); - Deck beforeShuffle = deck; + List beforeShuffle = deck.cards(); deck.shuffle(); + List afterShuffle = deck.cards(); - assertThat(deck).containsExactlyInAnyOrderElementsOf(beforeShuffle); - assertThat(deck).isNotEqualTo(beforeShuffle); + assertThat(afterShuffle).containsExactlyInAnyOrderElementsOf(beforeShuffle); + assertThat(afterShuffle).isNotEqualTo(beforeShuffle); } @Test From 4939d97520b313d7e6056885821a3624620f1b3d Mon Sep 17 00:00:00 2001 From: Seong Jin Date: Fri, 22 May 2026 15:15:06 +0900 Subject: [PATCH 10/16] =?UTF-8?q?test=20:=20=EC=B0=B8=EA=B0=80=EC=9E=90=20?= =?UTF-8?q?=EA=B4=80=EB=A0=A8=20=ED=85=8C=EC=8A=A4=ED=8A=B8=20=EC=9E=91?= =?UTF-8?q?=EC=84=B1?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../java/participant/ParticipantTest.java | 45 +++++++++++++++++++ 1 file changed, 45 insertions(+) create mode 100644 src/test/java/participant/ParticipantTest.java diff --git a/src/test/java/participant/ParticipantTest.java b/src/test/java/participant/ParticipantTest.java new file mode 100644 index 0000000000..4efa667f05 --- /dev/null +++ b/src/test/java/participant/ParticipantTest.java @@ -0,0 +1,45 @@ +package participant; + +import card.Card; +import card.enums.Rank; +import card.enums.Suit; +import org.junit.jupiter.api.Test; +import static org.assertj.core.api.Assertions.assertThat; + +public class ParticipantTest { + + @Test + void 딜러는_현재_들고있는_카드의_합계가_16이하이면_카드를_지급받는다(){ + Participant dealer = new Dealer(); + Card card = new Card(Rank.ACE, Suit.CLUB); + Card card2 = new Card(Rank.QUEEN, Suit.CLUB); + dealer.receive(card); + dealer.receive(card2); + int beforeCardCount = dealer.getHandCount(); + + dealer.check(); + + assertThat(dealer.getHand()).isEqualTo(beforeCardCount+1); + } + + @Test + void 플레이어는_Hit시_카드를_한_장_지급받는다(){ + Participant player = new Player(); + int beforeCardCount = player.getHandCount(); + + player.hit(); + + assertThat(player.getHand()).isEqualTo(beforeCardCount+1); + } + + @Test + void 플레이어는_Stand시_카드를_더이상_지급받지_않는다(){ + Participant player = new Player(); + int beforeCardCount = player.getHandCount(); + + player.stand(); + + assertThat(player.getHandCount()).isEqualTo(beforeCardCount); + } + +} From 1a19a26d5cfe60a614ed68cdb140ffbd2b391458 Mon Sep 17 00:00:00 2001 From: Seong Jin Date: Fri, 22 May 2026 23:22:17 +0900 Subject: [PATCH 11/16] =?UTF-8?q?fix=20:=20=EC=B0=B8=EA=B0=80=EC=9E=90=20?= =?UTF-8?q?=EA=B4=80=EB=A0=A8=20=ED=85=8C=EC=8A=A4=ED=8A=B8=20=EC=88=98?= =?UTF-8?q?=EC=A0=95?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../java/participant/ParticipantTest.java | 28 ++++++++----------- 1 file changed, 11 insertions(+), 17 deletions(-) diff --git a/src/test/java/participant/ParticipantTest.java b/src/test/java/participant/ParticipantTest.java index 4efa667f05..f557df2549 100644 --- a/src/test/java/participant/ParticipantTest.java +++ b/src/test/java/participant/ParticipantTest.java @@ -9,37 +9,31 @@ public class ParticipantTest { @Test - void 딜러는_현재_들고있는_카드의_합계가_16이하이면_카드를_지급받는다(){ + void 딜러는_현재_들고있는_카드의_합계가_16이하이면_shouldHit가_true이다(){ Participant dealer = new Dealer(); - Card card = new Card(Rank.ACE, Suit.CLUB); + Card card = new Card(Rank.TWO, Suit.CLUB); Card card2 = new Card(Rank.QUEEN, Suit.CLUB); dealer.receive(card); dealer.receive(card2); - int beforeCardCount = dealer.getHandCount(); - dealer.check(); + boolean hit = dealer.shouldHit(); - assertThat(dealer.getHand()).isEqualTo(beforeCardCount+1); + assertThat(hit).isTrue(); } @Test - void 플레이어는_Hit시_카드를_한_장_지급받는다(){ + void 플레이어는_현재_들고있는_카드의_합계가_21미만이면_shouldHit가_true이다(){ Participant player = new Player(); - int beforeCardCount = player.getHandCount(); + Card card = new Card(Rank.TWO, Suit.CLUB); + Card card2 = new Card(Rank.QUEEN, Suit.CLUB); + player.receive(card); + player.receive(card2); - player.hit(); + boolean hit = player.shouldHit(); - assertThat(player.getHand()).isEqualTo(beforeCardCount+1); + assertThat(hit).isTrue(); } - @Test - void 플레이어는_Stand시_카드를_더이상_지급받지_않는다(){ - Participant player = new Player(); - int beforeCardCount = player.getHandCount(); - player.stand(); - - assertThat(player.getHandCount()).isEqualTo(beforeCardCount); - } } From e5be6aec212fb36aea6c82a4af690520e62fce54 Mon Sep 17 00:00:00 2001 From: Seong Jin Date: Fri, 22 May 2026 23:28:10 +0900 Subject: [PATCH 12/16] =?UTF-8?q?fix=20:=20deck.draw()=EC=8B=9C=20?= =?UTF-8?q?=EB=A7=A4=EB=B2=88=20shuffle()=20=EC=88=98=ED=96=89=20=EC=98=A4?= =?UTF-8?q?=EB=A5=98=20=EC=88=98=EC=A0=95?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- src/main/java/deck/Deck.java | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/main/java/deck/Deck.java b/src/main/java/deck/Deck.java index 9e458311e2..629d2e6cd0 100644 --- a/src/main/java/deck/Deck.java +++ b/src/main/java/deck/Deck.java @@ -34,8 +34,8 @@ public Card firstCard(){ public Card draw(){ if(cards.isEmpty()){ createdDeck(); + this.shuffle(); } - this.shuffle(); return cards.removeFirst(); } From 5e03b1aeddd0124f22d1603b48c3da69fbe9834d Mon Sep 17 00:00:00 2001 From: Seong Jin Date: Sat, 23 May 2026 00:32:12 +0900 Subject: [PATCH 13/16] =?UTF-8?q?feat=20:=20=EC=B0=B8=EA=B0=80=EC=9E=90=20?= =?UTF-8?q?=EA=B4=80=EB=A0=A8=20=EA=B8=B0=EB=8A=A5=20=EA=B5=AC=ED=98=84?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- src/main/java/participant/Dealer.java | 9 +++++++++ src/main/java/participant/Participant.java | 19 +++++++++++++++++++ src/main/java/participant/Player.java | 9 +++++++++ .../java/participant/ParticipantTest.java | 8 ++++---- 4 files changed, 41 insertions(+), 4 deletions(-) create mode 100644 src/main/java/participant/Dealer.java create mode 100644 src/main/java/participant/Participant.java create mode 100644 src/main/java/participant/Player.java diff --git a/src/main/java/participant/Dealer.java b/src/main/java/participant/Dealer.java new file mode 100644 index 0000000000..9c61955ce5 --- /dev/null +++ b/src/main/java/participant/Dealer.java @@ -0,0 +1,9 @@ +package participant; + +public class Dealer extends Participant{ + + @Override + public boolean canReceiveCard(){ + return checkScore() <= 16; + } +} diff --git a/src/main/java/participant/Participant.java b/src/main/java/participant/Participant.java new file mode 100644 index 0000000000..6feb98a4f9 --- /dev/null +++ b/src/main/java/participant/Participant.java @@ -0,0 +1,19 @@ +package participant; + +import card.Card; +import hand.Hand; + +public abstract class Participant { + private final Hand hand = new Hand(); + + public abstract boolean canReceiveCard(); + + public void receive(Card card){ + this.hand.add(card); + } + + protected int checkScore(){ + return hand.score(); + } + +} diff --git a/src/main/java/participant/Player.java b/src/main/java/participant/Player.java new file mode 100644 index 0000000000..d3f99cf440 --- /dev/null +++ b/src/main/java/participant/Player.java @@ -0,0 +1,9 @@ +package participant; + +public class Player extends Participant { + + @Override + public boolean canReceiveCard() { + return checkScore() < 21; + } +} diff --git a/src/test/java/participant/ParticipantTest.java b/src/test/java/participant/ParticipantTest.java index f557df2549..9bdf429c04 100644 --- a/src/test/java/participant/ParticipantTest.java +++ b/src/test/java/participant/ParticipantTest.java @@ -9,27 +9,27 @@ public class ParticipantTest { @Test - void 딜러는_현재_들고있는_카드의_합계가_16이하이면_shouldHit가_true이다(){ + void 딜러는_현재_들고있는_카드의_합계가_16이하이면_canReceiveCard가_true이다(){ Participant dealer = new Dealer(); Card card = new Card(Rank.TWO, Suit.CLUB); Card card2 = new Card(Rank.QUEEN, Suit.CLUB); dealer.receive(card); dealer.receive(card2); - boolean hit = dealer.shouldHit(); + boolean hit = dealer.canReceiveCard(); assertThat(hit).isTrue(); } @Test - void 플레이어는_현재_들고있는_카드의_합계가_21미만이면_shouldHit가_true이다(){ + void 플레이어는_현재_들고있는_카드의_합계가_21미만이면_canReceiveCard가_true이다(){ Participant player = new Player(); Card card = new Card(Rank.TWO, Suit.CLUB); Card card2 = new Card(Rank.QUEEN, Suit.CLUB); player.receive(card); player.receive(card2); - boolean hit = player.shouldHit(); + boolean hit = player.canReceiveCard(); assertThat(hit).isTrue(); } From 80ab9f07153a17a7379cd5d7bcc2a0b56ea3a2ef Mon Sep 17 00:00:00 2001 From: Seong Jin Date: Sat, 23 May 2026 23:58:26 +0900 Subject: [PATCH 14/16] =?UTF-8?q?feat=20:=20InputView=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/Application.java | 5 +++ src/main/java/{ => domain}/card/Card.java | 6 ++-- .../java/{ => domain}/card/enums/Rank.java | 2 +- .../java/{ => domain}/card/enums/Suit.java | 2 +- src/main/java/{ => domain}/deck/Deck.java | 8 ++--- src/main/java/{ => domain}/hand/Hand.java | 4 +-- .../java/{ => domain}/participant/Dealer.java | 2 +- .../{ => domain}/participant/Participant.java | 6 ++-- .../java/{ => domain}/participant/Player.java | 2 +- src/main/java/ui/InputView.java | 31 +++++++++++++++++++ src/main/java/ui/ResultView.java | 5 +++ src/test/java/card/CardTest.java | 5 +-- src/test/java/deck/DeckTest.java | 3 +- src/test/java/hand/HandTest.java | 7 +++-- .../java/participant/ParticipantTest.java | 9 ++++-- 15 files changed, 72 insertions(+), 25 deletions(-) create mode 100644 src/main/java/Application.java rename src/main/java/{ => domain}/card/Card.java (78%) rename src/main/java/{ => domain}/card/enums/Rank.java (92%) rename src/main/java/{ => domain}/card/enums/Suit.java (70%) rename src/main/java/{ => domain}/deck/Deck.java (88%) rename src/main/java/{ => domain}/hand/Hand.java (94%) rename src/main/java/{ => domain}/participant/Dealer.java (83%) rename src/main/java/{ => domain}/participant/Participant.java (77%) rename src/main/java/{ => domain}/participant/Player.java (83%) create mode 100644 src/main/java/ui/InputView.java create mode 100644 src/main/java/ui/ResultView.java diff --git a/src/main/java/Application.java b/src/main/java/Application.java new file mode 100644 index 0000000000..0fe884ed96 --- /dev/null +++ b/src/main/java/Application.java @@ -0,0 +1,5 @@ +public class Application { + public static void main(String[] args){ + + } +} diff --git a/src/main/java/card/Card.java b/src/main/java/domain/card/Card.java similarity index 78% rename from src/main/java/card/Card.java rename to src/main/java/domain/card/Card.java index 8c728babba..77f25a3bb0 100644 --- a/src/main/java/card/Card.java +++ b/src/main/java/domain/card/Card.java @@ -1,7 +1,7 @@ -package card; +package domain.card; -import card.enums.Rank; -import card.enums.Suit; +import domain.card.enums.Rank; +import domain.card.enums.Suit; public class Card { private Rank rank; diff --git a/src/main/java/card/enums/Rank.java b/src/main/java/domain/card/enums/Rank.java similarity index 92% rename from src/main/java/card/enums/Rank.java rename to src/main/java/domain/card/enums/Rank.java index bdc62455f4..95e9a8180f 100644 --- a/src/main/java/card/enums/Rank.java +++ b/src/main/java/domain/card/enums/Rank.java @@ -1,4 +1,4 @@ -package card.enums; +package domain.card.enums; public enum Rank { ACE(1), diff --git a/src/main/java/card/enums/Suit.java b/src/main/java/domain/card/enums/Suit.java similarity index 70% rename from src/main/java/card/enums/Suit.java rename to src/main/java/domain/card/enums/Suit.java index 14b36e71a4..74aaacc349 100644 --- a/src/main/java/card/enums/Suit.java +++ b/src/main/java/domain/card/enums/Suit.java @@ -1,4 +1,4 @@ -package card.enums; +package domain.card.enums; public enum Suit { CLUB, diff --git a/src/main/java/deck/Deck.java b/src/main/java/domain/deck/Deck.java similarity index 88% rename from src/main/java/deck/Deck.java rename to src/main/java/domain/deck/Deck.java index 629d2e6cd0..f27ef43606 100644 --- a/src/main/java/deck/Deck.java +++ b/src/main/java/domain/deck/Deck.java @@ -1,8 +1,8 @@ -package deck; +package domain.deck; -import card.Card; -import card.enums.Rank; -import card.enums.Suit; +import domain.card.Card; +import domain.card.enums.Rank; +import domain.card.enums.Suit; import java.util.ArrayList; import java.util.Collections; diff --git a/src/main/java/hand/Hand.java b/src/main/java/domain/hand/Hand.java similarity index 94% rename from src/main/java/hand/Hand.java rename to src/main/java/domain/hand/Hand.java index 546bce9c45..27305755fc 100644 --- a/src/main/java/hand/Hand.java +++ b/src/main/java/domain/hand/Hand.java @@ -1,6 +1,6 @@ -package hand; +package domain.hand; -import card.Card; +import domain.card.Card; import java.util.ArrayList; import java.util.List; diff --git a/src/main/java/participant/Dealer.java b/src/main/java/domain/participant/Dealer.java similarity index 83% rename from src/main/java/participant/Dealer.java rename to src/main/java/domain/participant/Dealer.java index 9c61955ce5..9914311469 100644 --- a/src/main/java/participant/Dealer.java +++ b/src/main/java/domain/participant/Dealer.java @@ -1,4 +1,4 @@ -package participant; +package domain.participant; public class Dealer extends Participant{ diff --git a/src/main/java/participant/Participant.java b/src/main/java/domain/participant/Participant.java similarity index 77% rename from src/main/java/participant/Participant.java rename to src/main/java/domain/participant/Participant.java index 6feb98a4f9..517d6979c4 100644 --- a/src/main/java/participant/Participant.java +++ b/src/main/java/domain/participant/Participant.java @@ -1,7 +1,7 @@ -package participant; +package domain.participant; -import card.Card; -import hand.Hand; +import domain.card.Card; +import domain.hand.Hand; public abstract class Participant { private final Hand hand = new Hand(); diff --git a/src/main/java/participant/Player.java b/src/main/java/domain/participant/Player.java similarity index 83% rename from src/main/java/participant/Player.java rename to src/main/java/domain/participant/Player.java index d3f99cf440..fa54b5c271 100644 --- a/src/main/java/participant/Player.java +++ b/src/main/java/domain/participant/Player.java @@ -1,4 +1,4 @@ -package participant; +package domain.participant; public class Player extends Participant { diff --git a/src/main/java/ui/InputView.java b/src/main/java/ui/InputView.java new file mode 100644 index 0000000000..ed7905c44e --- /dev/null +++ b/src/main/java/ui/InputView.java @@ -0,0 +1,31 @@ +package ui; + +import java.util.Arrays; +import java.util.List; +import java.util.Scanner; + +public class InputView { + Scanner scanner = new Scanner(System.in); + + public List inputPlayers(){ + System.out.print("게임에 참여할 사람의 이름을 입력하세요.(쉼표 기준으로 분리)"); + String input = scanner.nextLine(); + return Arrays.stream(input.split(",")).map(String::trim).toList(); + } + + public boolean askHit(String playerName){ + String input; + do { + System.out.print(playerName + "는 한장의 카드를 더 받겠습니까?(예는 y, 아니오는 n)"); + input = scanner.nextLine(); + }while(!isValidHitResponse(input)); + return input.trim().equals("y"); + } + + private boolean isValidHitResponse(String response){ + if(response.trim().equals("y")|| response.trim().equals("n")){ + return true; + } + return false; + } +} diff --git a/src/main/java/ui/ResultView.java b/src/main/java/ui/ResultView.java new file mode 100644 index 0000000000..f4450bc12e --- /dev/null +++ b/src/main/java/ui/ResultView.java @@ -0,0 +1,5 @@ +package ui; + +public class ResultView { + //TODO: 소유 카드 출력 +} diff --git a/src/test/java/card/CardTest.java b/src/test/java/card/CardTest.java index 5e84f63286..7834a5a949 100644 --- a/src/test/java/card/CardTest.java +++ b/src/test/java/card/CardTest.java @@ -1,7 +1,8 @@ package card; -import card.enums.Rank; -import card.enums.Suit; +import domain.card.Card; +import domain.card.enums.Rank; +import domain.card.enums.Suit; import org.junit.jupiter.api.Test; import org.junit.jupiter.params.ParameterizedTest; import org.junit.jupiter.params.provider.CsvSource; diff --git a/src/test/java/deck/DeckTest.java b/src/test/java/deck/DeckTest.java index ee92772e9f..d2fe116c84 100644 --- a/src/test/java/deck/DeckTest.java +++ b/src/test/java/deck/DeckTest.java @@ -1,6 +1,7 @@ package deck; -import card.Card; +import domain.card.Card; +import domain.deck.Deck; import org.junit.jupiter.api.Test; import java.util.List; diff --git a/src/test/java/hand/HandTest.java b/src/test/java/hand/HandTest.java index 80aa980dfe..94dd5700df 100644 --- a/src/test/java/hand/HandTest.java +++ b/src/test/java/hand/HandTest.java @@ -1,8 +1,9 @@ package hand; -import card.Card; -import card.enums.Rank; -import card.enums.Suit; +import domain.card.Card; +import domain.card.enums.Rank; +import domain.card.enums.Suit; +import domain.hand.Hand; import org.junit.jupiter.api.Test; import static org.assertj.core.api.Assertions.assertThat; diff --git a/src/test/java/participant/ParticipantTest.java b/src/test/java/participant/ParticipantTest.java index 9bdf429c04..901acfcef2 100644 --- a/src/test/java/participant/ParticipantTest.java +++ b/src/test/java/participant/ParticipantTest.java @@ -1,8 +1,11 @@ package participant; -import card.Card; -import card.enums.Rank; -import card.enums.Suit; +import domain.card.Card; +import domain.card.enums.Rank; +import domain.card.enums.Suit; +import domain.participant.Dealer; +import domain.participant.Participant; +import domain.participant.Player; import org.junit.jupiter.api.Test; import static org.assertj.core.api.Assertions.assertThat; From 903935361b64c5c6c5dad14682ad38f260dd5868 Mon Sep 17 00:00:00 2001 From: Seong Jin Date: Sun, 24 May 2026 14:20:37 +0900 Subject: [PATCH 15/16] =?UTF-8?q?feat=20:=20ResultView=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/domain/card/Card.java | 4 + src/main/java/domain/card/enums/Rank.java | 36 +++++---- src/main/java/domain/card/enums/Suit.java | 18 ++++- src/main/java/domain/hand/Hand.java | 11 +++ src/main/java/domain/participant/Dealer.java | 3 + .../java/domain/participant/Participant.java | 25 +++++++ src/main/java/domain/participant/Player.java | 3 + src/main/java/domain/result/GameResult.java | 29 ++++++++ src/main/java/domain/result/ResultJudge.java | 23 ++++++ src/main/java/ui/ResultView.java | 74 ++++++++++++++++++- .../java/participant/ParticipantTest.java | 4 +- 11 files changed, 208 insertions(+), 22 deletions(-) create mode 100644 src/main/java/domain/result/GameResult.java create mode 100644 src/main/java/domain/result/ResultJudge.java diff --git a/src/main/java/domain/card/Card.java b/src/main/java/domain/card/Card.java index 77f25a3bb0..77f85b242a 100644 --- a/src/main/java/domain/card/Card.java +++ b/src/main/java/domain/card/Card.java @@ -19,4 +19,8 @@ public boolean isAce() { public int score(){ return this.rank.getScore(); } + + public String displayName(){ + return rank.getName() + suit.getName(); + } } diff --git a/src/main/java/domain/card/enums/Rank.java b/src/main/java/domain/card/enums/Rank.java index 95e9a8180f..3abbe4b6c0 100644 --- a/src/main/java/domain/card/enums/Rank.java +++ b/src/main/java/domain/card/enums/Rank.java @@ -1,28 +1,34 @@ package domain.card.enums; public enum Rank { - ACE(1), - TWO(2), - THREE(3), - FOUR(4), - FIVE(5), - SIX(6), - SEVEN(7), - EIGHT(8), - NINE(9), - TEN(10), - JACK(10), - QUEEN(10), - KING(10); + ACE("A", 1), + TWO("2", 2), + THREE("3", 3), + FOUR("4", 4), + FIVE("5", 5), + SIX("6", 6), + SEVEN("7", 7), + EIGHT("8", 8), + NINE("9", 9), + TEN("10", 10), + JACK("J", 10), + QUEEN("Q", 10), + KING("K", 10); + private final String name; private final int score; - Rank(int score){ + Rank(String name, int score) { + this.name = name; this.score = score; } - public int getScore(){ + public int getScore() { return score; } + public String getName() { + return name; + } + } diff --git a/src/main/java/domain/card/enums/Suit.java b/src/main/java/domain/card/enums/Suit.java index 74aaacc349..1f25b7e094 100644 --- a/src/main/java/domain/card/enums/Suit.java +++ b/src/main/java/domain/card/enums/Suit.java @@ -1,8 +1,18 @@ package domain.card.enums; public enum Suit { - CLUB, - HEART, - SPADE, - DIAMOND + CLUB("클로버"), + HEART("하트"), + SPADE("스페이드"), + DIAMOND("다이아몬드"); + + private final String name; + + Suit(String name){ + this.name = name; + } + + public String getName(){ + return name; + } } diff --git a/src/main/java/domain/hand/Hand.java b/src/main/java/domain/hand/Hand.java index 27305755fc..0715a8e419 100644 --- a/src/main/java/domain/hand/Hand.java +++ b/src/main/java/domain/hand/Hand.java @@ -4,6 +4,7 @@ import java.util.ArrayList; import java.util.List; +import java.util.stream.Collectors; public class Hand { private final List cards = new ArrayList<>(); @@ -23,6 +24,16 @@ public boolean isBust() { return score() > 21; } + public String displayCards(){ + return cards.stream() + .map(Card::displayName) + .collect(Collectors.joining(", ")); + } + + public String displayFirstCard(){ + return cards.getFirst().displayName(); + } + private int basicScore() { int score = 0; for (Card card : cards) { diff --git a/src/main/java/domain/participant/Dealer.java b/src/main/java/domain/participant/Dealer.java index 9914311469..28efef60d6 100644 --- a/src/main/java/domain/participant/Dealer.java +++ b/src/main/java/domain/participant/Dealer.java @@ -1,6 +1,9 @@ package domain.participant; public class Dealer extends Participant{ + public Dealer(String name){ + super(name); + } @Override public boolean canReceiveCard(){ diff --git a/src/main/java/domain/participant/Participant.java b/src/main/java/domain/participant/Participant.java index 517d6979c4..19b65f1e6a 100644 --- a/src/main/java/domain/participant/Participant.java +++ b/src/main/java/domain/participant/Participant.java @@ -4,14 +4,39 @@ import domain.hand.Hand; public abstract class Participant { + private final String name; private final Hand hand = new Hand(); + public Participant(String name){ + this.name = name; + } + public abstract boolean canReceiveCard(); public void receive(Card card){ this.hand.add(card); } + public String getName(){ + return this.name; + } + + public String handDisplay(){ + return hand.displayCards(); + } + + public String dealerHandDisplay(){ + return hand.displayFirstCard(); + } + + public int getScore(){ + return hand.score(); + } + + public boolean isBust(){ + return hand.isBust(); + } + protected int checkScore(){ return hand.score(); } diff --git a/src/main/java/domain/participant/Player.java b/src/main/java/domain/participant/Player.java index fa54b5c271..ac8b3ea4bf 100644 --- a/src/main/java/domain/participant/Player.java +++ b/src/main/java/domain/participant/Player.java @@ -1,6 +1,9 @@ package domain.participant; public class Player extends Participant { + public Player (String name){ + super(name); + } @Override public boolean canReceiveCard() { diff --git a/src/main/java/domain/result/GameResult.java b/src/main/java/domain/result/GameResult.java new file mode 100644 index 0000000000..1bf45eddb2 --- /dev/null +++ b/src/main/java/domain/result/GameResult.java @@ -0,0 +1,29 @@ +package domain.result; + +public enum GameResult { + WIN("승"), + LOSE("패"), + PUSH("무승부"); + + private String label; + + GameResult(String label){ + this.label = label; + } + + public String getLabel(){ + return this.label; + } + + public int dealerWinCount(){ + if(this == LOSE) + return 1; + return 0; + } + + public int dealerLoseCount(){ + if(this == WIN) + return 1; + return 0; + } +} diff --git a/src/main/java/domain/result/ResultJudge.java b/src/main/java/domain/result/ResultJudge.java new file mode 100644 index 0000000000..9b1807c152 --- /dev/null +++ b/src/main/java/domain/result/ResultJudge.java @@ -0,0 +1,23 @@ +package domain.result; + +import domain.participant.Participant; + +public class ResultJudge { + public GameResult checkPlayerGameResult(Participant dealer, Participant player){ + if(dealer.isBust()) + return GameResult.WIN; + + if(player.isBust()) + return GameResult.LOSE; + + if(dealer.getScore() > player.getScore()) + return GameResult.LOSE; + + if(dealer.getScore() < player.getScore()) + return GameResult.WIN; + + return GameResult.PUSH; + } + + +} diff --git a/src/main/java/ui/ResultView.java b/src/main/java/ui/ResultView.java index f4450bc12e..553d67c35b 100644 --- a/src/main/java/ui/ResultView.java +++ b/src/main/java/ui/ResultView.java @@ -1,5 +1,77 @@ package ui; +import java.util.List; +import java.util.stream.Collectors; + +import domain.result.GameResult; +import domain.participant.Participant; +import domain.result.ResultJudge; + public class ResultView { - //TODO: 소유 카드 출력 + public void printInitialDeal(List participants){ + String playerNames = name(participants); + System.out.println("딜러와" + playerNames + "에게 2장을 나누었습니다."); + } + + public void printAllHands(List participants){ + Participant dealer = participants.getFirst(); + printDealerInitialHand(dealer); + List players = participants.subList(1, participants.size()); + for(Participant participant : players){ + printHand(participant); + } + + } + + public void printHand(Participant participant){ + System.out.println(participant.getName() + "카드: " + participant.handDisplay()); + } + + public void printDealerInitialHand(Participant dealer){ + System.out.println(dealer.getName() + "카드: " + dealer.dealerHandDisplay()); + } + + public void printDealerDraw(){ + System.out.println("딜러는 16이하라 한장의 카드를 더 받았습니다."); + } + + public void printScores(List participants){ + for(Participant participant : participants){ + System.out.println(participant.getName() + "카드: " + participant.handDisplay() + + " - 결과: " + participant.getScore()); + } + } + + public void printGameResult(List participants, ResultJudge judge){ + System.out.println("## 최종 승패"); + Participant dealer = participants.getFirst(); + List players = participants.subList(1, participants.size()); + + printDealerResult(dealer, players, judge); + printPlayerResult(dealer, players, judge); + } + + private String name(List participants){ + return participants.subList(1, participants.size()).stream() + .map(Participant::getName) + .collect(Collectors.joining(", ")); + } + + private void printPlayerResult(Participant dealer, List players, ResultJudge judge){ + for(Participant player : players){ + System.out.println(player.getName() + " : " + judge.checkPlayerGameResult(dealer, player).getLabel()); + } + } + + private void printDealerResult(Participant dealer, List players, ResultJudge judge){ + int win = 0; + int lose = 0; + GameResult result; + for(Participant player : players){ + result = judge.checkPlayerGameResult(dealer, player); + win += result.dealerWinCount(); + lose += result.dealerLoseCount(); + } + System.out.println(dealer.getName() + " : " + win + "승 " + lose + "패"); + } } diff --git a/src/test/java/participant/ParticipantTest.java b/src/test/java/participant/ParticipantTest.java index 901acfcef2..0885ed0d38 100644 --- a/src/test/java/participant/ParticipantTest.java +++ b/src/test/java/participant/ParticipantTest.java @@ -13,7 +13,7 @@ public class ParticipantTest { @Test void 딜러는_현재_들고있는_카드의_합계가_16이하이면_canReceiveCard가_true이다(){ - Participant dealer = new Dealer(); + Participant dealer = new Dealer("딜러"); Card card = new Card(Rank.TWO, Suit.CLUB); Card card2 = new Card(Rank.QUEEN, Suit.CLUB); dealer.receive(card); @@ -26,7 +26,7 @@ public class ParticipantTest { @Test void 플레이어는_현재_들고있는_카드의_합계가_21미만이면_canReceiveCard가_true이다(){ - Participant player = new Player(); + Participant player = new Player("player1"); Card card = new Card(Rank.TWO, Suit.CLUB); Card card2 = new Card(Rank.QUEEN, Suit.CLUB); player.receive(card); From 33584bdf69eaec2085c3cbb9b045fa1dfebcc661 Mon Sep 17 00:00:00 2001 From: Seong Jin Date: Sun, 24 May 2026 21:05:57 +0900 Subject: [PATCH 16/16] =?UTF-8?q?feat=20:=20GameController=20=EA=B5=AC?= =?UTF-8?q?=ED=98=84?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- src/main/java/Application.java | 7 +- src/main/java/controller/GameController.java | 119 ++++++++++++++++++ src/main/java/domain/deck/Deck.java | 1 + .../java/domain/participant/Participant.java | 3 + src/main/java/domain/result/ResultJudge.java | 6 +- src/main/java/ui/InputView.java | 4 +- src/main/java/ui/ResultView.java | 10 +- 7 files changed, 141 insertions(+), 9 deletions(-) create mode 100644 src/main/java/controller/GameController.java diff --git a/src/main/java/Application.java b/src/main/java/Application.java index 0fe884ed96..2f87fde1ff 100644 --- a/src/main/java/Application.java +++ b/src/main/java/Application.java @@ -1,5 +1,10 @@ +import controller.GameController; +import ui.InputView; +import ui.ResultView; + public class Application { public static void main(String[] args){ - + GameController gameController = new GameController(new ResultView(), new InputView()); + gameController.run(); } } diff --git a/src/main/java/controller/GameController.java b/src/main/java/controller/GameController.java new file mode 100644 index 0000000000..4bb682a315 --- /dev/null +++ b/src/main/java/controller/GameController.java @@ -0,0 +1,119 @@ +package controller; + +import domain.deck.Deck; +import domain.participant.Dealer; +import domain.participant.Participant; +import domain.participant.Player; +import domain.result.ResultJudge; +import ui.InputView; +import ui.ResultView; + +import java.util.ArrayList; +import java.util.List; + +public class GameController { + private final ResultView resultView; + private final InputView inputView; + + public GameController(ResultView resultView, InputView inputView){ + this.resultView = resultView; + this.inputView = inputView; + } + + public void run(){ + Deck deck = new Deck(); + ResultJudge judge = new ResultJudge(); + // 참가자 입력 + List participants = joinParticipant(); + + // 초기 패 설정 + initialAllPlayersHand(participants, deck); + + // 플레이어마다 Hit/Stand 여부 확인 + askHitOrStand(participants, deck); + + // 참가자 패와 점수 공개 + resultView.printScores(participants); + + // 참가자 승/패 공개 + resultView.printGameResult(participants, judge); + + } + + /*** + * 1. 모든 플레이어들에게 Hit/Stand 여부를 묻기 위한 함수 실행 + * 2. 딜러 draw 여부 확인 (16점 이하인지) + */ + private void askHitOrStand(List participants, Deck deck){ + Participant dealer = participants.getFirst(); + for(Participant player : participants.subList(1, participants.size())){ + askPlayerHit(player, deck); + } + + while(dealer.canReceiveCard()){ + dealer.receive(deck.draw()); + resultView.printDealerDraw(); + } + } + + /*** + * 플레이어에게 Hit/Stand 여부 확인 + */ + private void askPlayerHit(Participant player, Deck deck){ + while(inputView.askHit(player.getName())){ + canHit(player, deck); + } + } + + /*** + * Hit 선택시 실제로 플레이어가 Bust가 아닌지 확인 후 카드 지급 + */ + private void canHit(Participant player, Deck deck){ + if(player.canReceiveCard()){ + player.receive(deck.draw()); + resultView.printHand(player); + return; + } + resultView.printIsBust(); + } + + /*** + * 딜러와 입력 받은 플레이어 추가 + */ + private List joinParticipant(){ + Participant dealer = new Dealer("딜러"); + List playerNames; + List participants = new ArrayList<>(); + + participants.add(dealer); + + playerNames = inputView.inputPlayers(); + + for(String playerName : playerNames){ + Participant player = new Player(playerName); + participants.add(player); + } + + return participants; + } + + /*** + * 모든 참가자에게 2장의 카드를 분배하기 위한 함수 호출 및 패 공개 + */ + private void initialAllPlayersHand(List participants, Deck deck){ + for(Participant participant : participants){ + initialHand(participant, deck); + } + resultView.printInitialDeal(participants); + resultView.printAllHands(participants); + } + + /** + * 카드를 2장씩 분배 + */ + private void initialHand(Participant participant, Deck deck){ + for(int i = 0; i < 2; i++){ + participant.receive(deck.draw()); + } + } +} diff --git a/src/main/java/domain/deck/Deck.java b/src/main/java/domain/deck/Deck.java index f27ef43606..5370b86769 100644 --- a/src/main/java/domain/deck/Deck.java +++ b/src/main/java/domain/deck/Deck.java @@ -13,6 +13,7 @@ public class Deck { public Deck() { createdDeck(); + shuffle(); } private void createdDeck(){ diff --git a/src/main/java/domain/participant/Participant.java b/src/main/java/domain/participant/Participant.java index 19b65f1e6a..de235149a1 100644 --- a/src/main/java/domain/participant/Participant.java +++ b/src/main/java/domain/participant/Participant.java @@ -11,6 +11,9 @@ public Participant(String name){ this.name = name; } + /*** + * 참가자 역할(딜러, 플레이어)에 맞추어 Bust가 아닌 즉, 카드를 더 받을 수 있는지 확인. + */ public abstract boolean canReceiveCard(); public void receive(Card card){ diff --git a/src/main/java/domain/result/ResultJudge.java b/src/main/java/domain/result/ResultJudge.java index 9b1807c152..c5b78446d8 100644 --- a/src/main/java/domain/result/ResultJudge.java +++ b/src/main/java/domain/result/ResultJudge.java @@ -4,12 +4,12 @@ public class ResultJudge { public GameResult checkPlayerGameResult(Participant dealer, Participant player){ - if(dealer.isBust()) - return GameResult.WIN; - if(player.isBust()) return GameResult.LOSE; + if(dealer.isBust()) + return GameResult.WIN; + if(dealer.getScore() > player.getScore()) return GameResult.LOSE; diff --git a/src/main/java/ui/InputView.java b/src/main/java/ui/InputView.java index ed7905c44e..d78438dc23 100644 --- a/src/main/java/ui/InputView.java +++ b/src/main/java/ui/InputView.java @@ -8,7 +8,7 @@ public class InputView { Scanner scanner = new Scanner(System.in); public List inputPlayers(){ - System.out.print("게임에 참여할 사람의 이름을 입력하세요.(쉼표 기준으로 분리)"); + System.out.println("게임에 참여할 사람의 이름을 입력하세요.(쉼표 기준으로 분리)"); String input = scanner.nextLine(); return Arrays.stream(input.split(",")).map(String::trim).toList(); } @@ -16,7 +16,7 @@ public List inputPlayers(){ public boolean askHit(String playerName){ String input; do { - System.out.print(playerName + "는 한장의 카드를 더 받겠습니까?(예는 y, 아니오는 n)"); + System.out.println(playerName + "는 한장의 카드를 더 받겠습니까?(예는 y, 아니오는 n)"); input = scanner.nextLine(); }while(!isValidHitResponse(input)); return input.trim().equals("y"); diff --git a/src/main/java/ui/ResultView.java b/src/main/java/ui/ResultView.java index 553d67c35b..50c9a63924 100644 --- a/src/main/java/ui/ResultView.java +++ b/src/main/java/ui/ResultView.java @@ -10,7 +10,7 @@ public class ResultView { public void printInitialDeal(List participants){ String playerNames = name(participants); - System.out.println("딜러와" + playerNames + "에게 2장을 나누었습니다."); + System.out.println("딜러와 " + playerNames + "에게 2장을 나누었습니다."); } public void printAllHands(List participants){ @@ -31,8 +31,12 @@ public void printDealerInitialHand(Participant dealer){ System.out.println(dealer.getName() + "카드: " + dealer.dealerHandDisplay()); } + public void printIsBust(){ + System.out.println("해당 플레이어는 Bust로 더이상 카드를 뽑을 수 없습니다."); + } + public void printDealerDraw(){ - System.out.println("딜러는 16이하라 한장의 카드를 더 받았습니다."); + System.out.println("딜러는 16이하라 한장의 카드를 더 받았습니다. \n"); } public void printScores(List participants){ @@ -43,7 +47,7 @@ public void printScores(List participants){ } public void printGameResult(List participants, ResultJudge judge){ - System.out.println("## 최종 승패"); + System.out.println("\n## 최종 승패"); Participant dealer = participants.getFirst(); List players = participants.subList(1, participants.size());