From 9cc02c0815300f1559ad69ddf0ce6f4fb5dce318 Mon Sep 17 00:00:00 2001 From: ggam-nyang Date: Mon, 3 Jul 2023 16:58:49 +0900 Subject: [PATCH 01/22] =?UTF-8?q?docs:=20README=20=EA=B8=B0=EB=8A=A5=20?= =?UTF-8?q?=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 --- src/main/kotlin/blackjack/README.md | 25 +++++++++++++++++++++++++ 1 file changed, 25 insertions(+) create mode 100644 src/main/kotlin/blackjack/README.md diff --git a/src/main/kotlin/blackjack/README.md b/src/main/kotlin/blackjack/README.md new file mode 100644 index 0000000000..6270de975f --- /dev/null +++ b/src/main/kotlin/blackjack/README.md @@ -0,0 +1,25 @@ +## Step2 + +### 기능 목록 +- [ ] 카드는 숫자와 문양을 가진다. +- [ ] 카드의 숫자는 1(Ace)부터 King까지 있다. +- [ ] King, Queen, Jack은 각 10으로 계산된다. +- [ ] 문양은 하트, 다이아몬드, 클로버, 스페이드 4가지이다. +- [ ] 카드의 총 개수는 13 * 4인 52장이다. +- [ ] Ace는 숫자 합에 따라 1 또는 11로 계산할 수 있다. +- [ ] 딜러는 카드 뭉치를 가지고 있다. +- [ ] 딜러는 랜덤한 카드를 뽑을 수 있다. +- [ ] 플레이어는 여러 장의 카드를 가지고 있다. +- [ ] 딜러는 플레이어에게 카드를 줄 수 있다. +- [ ] 플레이어는 게임 시작 시 카드 두 장을 지급받는다. +- [ ] 플레이어는 카드를 뽑을 수 있다. +- [ ] 플레이어는 숫자 합이 21이 넘으면 카드를 뽑을 수 없다. +- [ ] 카드의 합이 21이하면서, 가까운 플레이어가 승리한다. + +### 기능 요구사항 +- 카드의 숫자 계산은 카드 숫자를 기본으로 하며, 예외로 Ace는 1 또는 11로 계산할 수 있으며 +- King, Queen, Jack은 각각 10으로 계산한다. +- 게임을 시작하면 플레이어는 두 장의 카드를 지급 받는다. +- 두 장의 카드 숫자를 합쳐 21을 초과하지 않으면서 21에 가깝게 만들면 이긴다. +- 21을 넘지 않을 경우 원한다면 얼마든지 카드를 계속 뽑을 수 있다. + From c776ef440ada2b597e25b2b8425d1ba50b656dc8 Mon Sep 17 00:00:00 2001 From: ggam-nyang Date: Mon, 3 Jul 2023 17:08:23 +0900 Subject: [PATCH 02/22] =?UTF-8?q?feature:=20=EC=B9=B4=EB=93=9C=EB=8A=94=20?= =?UTF-8?q?=EC=88=AB=EC=9E=90=EC=99=80=20=EB=AC=B8=EC=96=91=EC=9D=84=20?= =?UTF-8?q?=EA=B0=80=EC=A7=84=EB=8B=A4?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- src/main/kotlin/blackjack/README.md | 2 +- src/main/kotlin/blackjack/domain/Card.kt | 6 +++++ .../kotlin/blackjack/domain/CardNumber.kt | 17 ++++++++++++++ src/main/kotlin/blackjack/domain/CardSuit.kt | 8 +++++++ src/test/kotlin/blackjack/CardTest.kt | 22 +++++++++++++++++++ 5 files changed, 54 insertions(+), 1 deletion(-) create mode 100644 src/main/kotlin/blackjack/domain/Card.kt create mode 100644 src/main/kotlin/blackjack/domain/CardNumber.kt create mode 100644 src/main/kotlin/blackjack/domain/CardSuit.kt create mode 100644 src/test/kotlin/blackjack/CardTest.kt diff --git a/src/main/kotlin/blackjack/README.md b/src/main/kotlin/blackjack/README.md index 6270de975f..cd3302c466 100644 --- a/src/main/kotlin/blackjack/README.md +++ b/src/main/kotlin/blackjack/README.md @@ -1,7 +1,7 @@ ## Step2 ### 기능 목록 -- [ ] 카드는 숫자와 문양을 가진다. +- [x] 카드는 숫자와 문양을 가진다. - [ ] 카드의 숫자는 1(Ace)부터 King까지 있다. - [ ] King, Queen, Jack은 각 10으로 계산된다. - [ ] 문양은 하트, 다이아몬드, 클로버, 스페이드 4가지이다. diff --git a/src/main/kotlin/blackjack/domain/Card.kt b/src/main/kotlin/blackjack/domain/Card.kt new file mode 100644 index 0000000000..af1c0cc4a3 --- /dev/null +++ b/src/main/kotlin/blackjack/domain/Card.kt @@ -0,0 +1,6 @@ +package blackjack.domain + +data class Card( + val number: CardNumber, + val suit: CardSuit +) diff --git a/src/main/kotlin/blackjack/domain/CardNumber.kt b/src/main/kotlin/blackjack/domain/CardNumber.kt new file mode 100644 index 0000000000..dabd4c7784 --- /dev/null +++ b/src/main/kotlin/blackjack/domain/CardNumber.kt @@ -0,0 +1,17 @@ +package blackjack.domain + +enum class CardNumber { + ACE, + TWO, + THREE, + FOUR, + FIVE, + SIX, + SEVEN, + EIGHT, + NINE, + TEN, + JACK, + QUEEN, + KING +} diff --git a/src/main/kotlin/blackjack/domain/CardSuit.kt b/src/main/kotlin/blackjack/domain/CardSuit.kt new file mode 100644 index 0000000000..d18962cf1c --- /dev/null +++ b/src/main/kotlin/blackjack/domain/CardSuit.kt @@ -0,0 +1,8 @@ +package blackjack.domain + +enum class CardSuit { + SPADE, + HEART, + DIAMOND, + CLUB +} diff --git a/src/test/kotlin/blackjack/CardTest.kt b/src/test/kotlin/blackjack/CardTest.kt new file mode 100644 index 0000000000..34ceb78296 --- /dev/null +++ b/src/test/kotlin/blackjack/CardTest.kt @@ -0,0 +1,22 @@ +package blackjack + +import blackjack.domain.Card +import blackjack.domain.CardNumber +import blackjack.domain.CardSuit +import io.kotest.matchers.shouldBe +import org.junit.jupiter.api.DisplayName +import org.junit.jupiter.api.Test + +internal class CardTest { + + @DisplayName("카드는 숫자와 문양을 가진다.") + @Test + fun numberAndSuit() { + val number = CardNumber.ACE + val suit = CardSuit.DIAMOND + val actual = Card(number, suit) + + actual.number shouldBe number + actual.suit shouldBe suit + } +} From d4bf8d57ef8424aac309cc852c310099ecc249a6 Mon Sep 17 00:00:00 2001 From: ggam-nyang Date: Mon, 3 Jul 2023 17:19:17 +0900 Subject: [PATCH 03/22] =?UTF-8?q?feature:=20=EC=B9=B4=EB=93=9C=20=EC=88=AB?= =?UTF-8?q?=EC=9E=90=EB=8A=94=20Ace=20~=20King=EA=B9=8C=EC=A7=80=20?= =?UTF-8?q?=EC=9E=88=EB=8B=A4.?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- src/main/kotlin/blackjack/README.md | 2 +- src/test/kotlin/blackjack/CardNumberTest.kt | 24 +++++++++++++++++++++ 2 files changed, 25 insertions(+), 1 deletion(-) create mode 100644 src/test/kotlin/blackjack/CardNumberTest.kt diff --git a/src/main/kotlin/blackjack/README.md b/src/main/kotlin/blackjack/README.md index cd3302c466..965f1fc636 100644 --- a/src/main/kotlin/blackjack/README.md +++ b/src/main/kotlin/blackjack/README.md @@ -2,7 +2,7 @@ ### 기능 목록 - [x] 카드는 숫자와 문양을 가진다. -- [ ] 카드의 숫자는 1(Ace)부터 King까지 있다. +- [x] 카드의 숫자는 1(Ace)부터 King까지 있다. - [ ] King, Queen, Jack은 각 10으로 계산된다. - [ ] 문양은 하트, 다이아몬드, 클로버, 스페이드 4가지이다. - [ ] 카드의 총 개수는 13 * 4인 52장이다. diff --git a/src/test/kotlin/blackjack/CardNumberTest.kt b/src/test/kotlin/blackjack/CardNumberTest.kt new file mode 100644 index 0000000000..93ba7a060e --- /dev/null +++ b/src/test/kotlin/blackjack/CardNumberTest.kt @@ -0,0 +1,24 @@ +package blackjack + +import blackjack.domain.CardNumber +import io.kotest.matchers.collections.shouldContainAll +import io.kotest.matchers.shouldBe +import org.junit.jupiter.api.DisplayName +import org.junit.jupiter.api.Test + +internal class CardNumberTest { + + @DisplayName("카드의 숫자는 1(Ace)부터 King까지 있다") + @Test + fun cardNumber() { + val actual = CardNumber.values() + + actual.size shouldBe 13 + actual.shouldContainAll(listOf( + CardNumber.ACE, CardNumber.TWO, CardNumber.THREE, + CardNumber.FOUR, CardNumber.FIVE, CardNumber.SIX, + CardNumber.SEVEN, CardNumber.EIGHT, CardNumber.NINE, CardNumber.TEN, + CardNumber.JACK, CardNumber.QUEEN, CardNumber.KING + )) + } +} \ No newline at end of file From b298e63452491b0421e91025c65df0429688a592 Mon Sep 17 00:00:00 2001 From: ggam-nyang Date: Mon, 3 Jul 2023 17:22:37 +0900 Subject: [PATCH 04/22] =?UTF-8?q?feature:=20J=20Q=20K=EB=8A=94=20=EA=B0=92?= =?UTF-8?q?=EC=9D=B4=2010=EC=9D=B4=EB=8B=A4?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- src/main/kotlin/blackjack/README.md | 2 +- .../kotlin/blackjack/domain/CardNumber.kt | 28 +++++++++---------- src/test/kotlin/blackjack/CardNumberTest.kt | 16 ++++++----- src/test/kotlin/blackjack/CardTest.kt | 9 ++++++ 4 files changed, 33 insertions(+), 22 deletions(-) diff --git a/src/main/kotlin/blackjack/README.md b/src/main/kotlin/blackjack/README.md index 965f1fc636..2b77c0ffa3 100644 --- a/src/main/kotlin/blackjack/README.md +++ b/src/main/kotlin/blackjack/README.md @@ -3,7 +3,7 @@ ### 기능 목록 - [x] 카드는 숫자와 문양을 가진다. - [x] 카드의 숫자는 1(Ace)부터 King까지 있다. -- [ ] King, Queen, Jack은 각 10으로 계산된다. +- [x] King, Queen, Jack은 각 10으로 계산된다. - [ ] 문양은 하트, 다이아몬드, 클로버, 스페이드 4가지이다. - [ ] 카드의 총 개수는 13 * 4인 52장이다. - [ ] Ace는 숫자 합에 따라 1 또는 11로 계산할 수 있다. diff --git a/src/main/kotlin/blackjack/domain/CardNumber.kt b/src/main/kotlin/blackjack/domain/CardNumber.kt index dabd4c7784..93409642a7 100644 --- a/src/main/kotlin/blackjack/domain/CardNumber.kt +++ b/src/main/kotlin/blackjack/domain/CardNumber.kt @@ -1,17 +1,17 @@ package blackjack.domain -enum class CardNumber { - ACE, - TWO, - THREE, - FOUR, - FIVE, - SIX, - SEVEN, - EIGHT, - NINE, - TEN, - JACK, - QUEEN, - KING +enum class CardNumber(val value: Int) { + 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); } diff --git a/src/test/kotlin/blackjack/CardNumberTest.kt b/src/test/kotlin/blackjack/CardNumberTest.kt index 93ba7a060e..2b88ceab95 100644 --- a/src/test/kotlin/blackjack/CardNumberTest.kt +++ b/src/test/kotlin/blackjack/CardNumberTest.kt @@ -14,11 +14,13 @@ internal class CardNumberTest { val actual = CardNumber.values() actual.size shouldBe 13 - actual.shouldContainAll(listOf( - CardNumber.ACE, CardNumber.TWO, CardNumber.THREE, - CardNumber.FOUR, CardNumber.FIVE, CardNumber.SIX, - CardNumber.SEVEN, CardNumber.EIGHT, CardNumber.NINE, CardNumber.TEN, - CardNumber.JACK, CardNumber.QUEEN, CardNumber.KING - )) + actual.shouldContainAll( + listOf( + CardNumber.ACE, CardNumber.TWO, CardNumber.THREE, + CardNumber.FOUR, CardNumber.FIVE, CardNumber.SIX, + CardNumber.SEVEN, CardNumber.EIGHT, CardNumber.NINE, CardNumber.TEN, + CardNumber.JACK, CardNumber.QUEEN, CardNumber.KING + ) + ) } -} \ No newline at end of file +} diff --git a/src/test/kotlin/blackjack/CardTest.kt b/src/test/kotlin/blackjack/CardTest.kt index 34ceb78296..54e66778a4 100644 --- a/src/test/kotlin/blackjack/CardTest.kt +++ b/src/test/kotlin/blackjack/CardTest.kt @@ -3,6 +3,7 @@ package blackjack import blackjack.domain.Card import blackjack.domain.CardNumber import blackjack.domain.CardSuit +import io.kotest.inspectors.forAll import io.kotest.matchers.shouldBe import org.junit.jupiter.api.DisplayName import org.junit.jupiter.api.Test @@ -19,4 +20,12 @@ internal class CardTest { actual.number shouldBe number actual.suit shouldBe suit } + + @DisplayName("King, Queen, Jack은 각 10으로 계산된다.") + @Test + fun jqkValueEqual10() { + val actual = listOf(CardNumber.JACK, CardNumber.QUEEN, CardNumber.KING) + + actual.forAll { cardNumber -> cardNumber.value shouldBe 10 } + } } From 6b736c61e3ae0115e44951931c21e89bb9036c5a Mon Sep 17 00:00:00 2001 From: ggam-nyang Date: Wed, 5 Jul 2023 14:10:32 +0900 Subject: [PATCH 05/22] =?UTF-8?q?feature:=20=EC=B9=B4=EB=93=9C=20=EB=AC=B8?= =?UTF-8?q?=EC=96=91=EC=9D=80=20CardSuit=20enum=EC=9C=BC=EB=A1=9C=20?= =?UTF-8?q?=EB=82=98=ED=83=80=EB=82=B8=EB=8B=A4?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- src/test/kotlin/blackjack/CardSuitTest.kt | 18 ++++++++++++++++++ 1 file changed, 18 insertions(+) create mode 100644 src/test/kotlin/blackjack/CardSuitTest.kt diff --git a/src/test/kotlin/blackjack/CardSuitTest.kt b/src/test/kotlin/blackjack/CardSuitTest.kt new file mode 100644 index 0000000000..fa7c7825d9 --- /dev/null +++ b/src/test/kotlin/blackjack/CardSuitTest.kt @@ -0,0 +1,18 @@ +package blackjack + +import blackjack.domain.CardSuit +import io.kotest.matchers.shouldBe +import org.junit.jupiter.api.DisplayName +import org.junit.jupiter.api.Test + +internal class CardSuitTest { + + @DisplayName("CardSuit은 SPADE, HEART, DIAMOND, CLUB 네가지이다.") + @Test + fun cardSuitType() { + val actual = CardSuit.values() + val expect = arrayOf(CardSuit.SPADE, CardSuit.HEART, CardSuit.DIAMOND, CardSuit.CLUB) + + actual shouldBe expect + } +} \ No newline at end of file From a62a5fe688275002cdf303696c5e44957e39f75e Mon Sep 17 00:00:00 2001 From: ggam-nyang Date: Wed, 5 Jul 2023 16:16:33 +0900 Subject: [PATCH 06/22] =?UTF-8?q?feature:=20CardDeck=EC=9D=80=20=EC=B4=9D?= =?UTF-8?q?=20=EA=B0=9C=EC=88=98=EA=B0=80=2052=EC=9E=A5=EC=9D=B4=EB=8B=A4?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- src/main/kotlin/blackjack/README.md | 5 ++-- src/main/kotlin/blackjack/domain/Card.kt | 27 +++++++++++++++++--- src/main/kotlin/blackjack/domain/CardDeck.kt | 7 +++++ src/test/kotlin/blackjack/CardDeckTest.kt | 20 +++++++++++++++ src/test/kotlin/blackjack/CardSuitTest.kt | 2 +- src/test/kotlin/blackjack/CardTest.kt | 2 +- 6 files changed, 55 insertions(+), 8 deletions(-) create mode 100644 src/main/kotlin/blackjack/domain/CardDeck.kt create mode 100644 src/test/kotlin/blackjack/CardDeckTest.kt diff --git a/src/main/kotlin/blackjack/README.md b/src/main/kotlin/blackjack/README.md index 2b77c0ffa3..3b556de765 100644 --- a/src/main/kotlin/blackjack/README.md +++ b/src/main/kotlin/blackjack/README.md @@ -4,8 +4,9 @@ - [x] 카드는 숫자와 문양을 가진다. - [x] 카드의 숫자는 1(Ace)부터 King까지 있다. - [x] King, Queen, Jack은 각 10으로 계산된다. -- [ ] 문양은 하트, 다이아몬드, 클로버, 스페이드 4가지이다. -- [ ] 카드의 총 개수는 13 * 4인 52장이다. +- [x] 문양은 하트, 다이아몬드, 클로버, 스페이드 4가지이다. +- [x] 카드의 총 개수는 13 * 4인 52장이다. +- [ ] 카드는 문양, 숫자가 동일하다면 모두 같은 인스턴스를 반환한다. - [ ] Ace는 숫자 합에 따라 1 또는 11로 계산할 수 있다. - [ ] 딜러는 카드 뭉치를 가지고 있다. - [ ] 딜러는 랜덤한 카드를 뽑을 수 있다. diff --git a/src/main/kotlin/blackjack/domain/Card.kt b/src/main/kotlin/blackjack/domain/Card.kt index af1c0cc4a3..2129b76df3 100644 --- a/src/main/kotlin/blackjack/domain/Card.kt +++ b/src/main/kotlin/blackjack/domain/Card.kt @@ -1,6 +1,25 @@ package blackjack.domain -data class Card( - val number: CardNumber, - val suit: CardSuit -) +class Card private constructor ( + val suit: CardSuit, + val number: CardNumber +) { + companion object { + private const val INVALID_CARD_ERROR = "존재하지 않는 카드입니다." + val allCards = + CardSuit.values().flatMap { suit -> + CardNumber.values().map { number -> + Card(suit, number) + } + } + + // FIXME: list O(n) 탐색 vs map 생성 +// private val map = +// allCards +// .groupBy { it.suit } +// .mapValues { it.value.associateBy { card -> card.number } } + + fun of(suit: CardSuit, number: CardNumber): Card = + allCards.find { it.suit == suit && it.number == number } ?: throw IllegalArgumentException(INVALID_CARD_ERROR) + } +} diff --git a/src/main/kotlin/blackjack/domain/CardDeck.kt b/src/main/kotlin/blackjack/domain/CardDeck.kt new file mode 100644 index 0000000000..b4b353809c --- /dev/null +++ b/src/main/kotlin/blackjack/domain/CardDeck.kt @@ -0,0 +1,7 @@ +package blackjack.domain + +class CardDeck { + private val cards = Card.allCards.toMutableList() + + fun size(): Int = cards.size +} diff --git a/src/test/kotlin/blackjack/CardDeckTest.kt b/src/test/kotlin/blackjack/CardDeckTest.kt new file mode 100644 index 0000000000..95d5cdef83 --- /dev/null +++ b/src/test/kotlin/blackjack/CardDeckTest.kt @@ -0,0 +1,20 @@ +package blackjack + +import blackjack.domain.CardDeck +import blackjack.domain.CardNumber +import blackjack.domain.CardSuit +import io.kotest.matchers.shouldBe +import org.junit.jupiter.api.DisplayName +import org.junit.jupiter.api.Test + +internal class CardDeckTest { + + @DisplayName("카드 뭉치의 카드 개수는 13 * 4인 52장이다.") + @Test + fun cardDeckSize() { + val actual = CardDeck().size() + val expect = CardSuit.values().size * CardNumber.values().size + + actual shouldBe expect + } +} diff --git a/src/test/kotlin/blackjack/CardSuitTest.kt b/src/test/kotlin/blackjack/CardSuitTest.kt index fa7c7825d9..d975de65fe 100644 --- a/src/test/kotlin/blackjack/CardSuitTest.kt +++ b/src/test/kotlin/blackjack/CardSuitTest.kt @@ -15,4 +15,4 @@ internal class CardSuitTest { actual shouldBe expect } -} \ No newline at end of file +} diff --git a/src/test/kotlin/blackjack/CardTest.kt b/src/test/kotlin/blackjack/CardTest.kt index 54e66778a4..40a5257fb4 100644 --- a/src/test/kotlin/blackjack/CardTest.kt +++ b/src/test/kotlin/blackjack/CardTest.kt @@ -15,7 +15,7 @@ internal class CardTest { fun numberAndSuit() { val number = CardNumber.ACE val suit = CardSuit.DIAMOND - val actual = Card(number, suit) + val actual = Card.of(suit, number) actual.number shouldBe number actual.suit shouldBe suit From ca375eeb09ca86d587f126ea654a013752767fbc Mon Sep 17 00:00:00 2001 From: ggam-nyang Date: Wed, 5 Jul 2023 16:25:51 +0900 Subject: [PATCH 07/22] =?UTF-8?q?feature:=20Card=EB=8A=94=20=EB=8F=99?= =?UTF-8?q?=EC=9D=BC=ED=95=9C=20suit,=20rank=EC=97=90=20=EB=8C=80=ED=95=B4?= =?UTF-8?q?=20=EA=B0=99=EC=9D=80=20=EC=9D=B8=EC=8A=A4=ED=84=B4=EC=8A=A4?= =?UTF-8?q?=EB=A5=BC=20=EB=B0=98=ED=99=98=ED=95=9C=EB=8B=A4.?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- src/main/kotlin/blackjack/README.md | 2 +- src/main/kotlin/blackjack/domain/Card.kt | 12 ++++----- .../domain/{CardNumber.kt => CardRank.kt} | 2 +- src/test/kotlin/blackjack/CardDeckTest.kt | 4 +-- src/test/kotlin/blackjack/CardNumberTest.kt | 26 ------------------ src/test/kotlin/blackjack/CardRankTest.kt | 26 ++++++++++++++++++ src/test/kotlin/blackjack/CardTest.kt | 27 ++++++++++++++----- 7 files changed, 56 insertions(+), 43 deletions(-) rename src/main/kotlin/blackjack/domain/{CardNumber.kt => CardRank.kt} (83%) delete mode 100644 src/test/kotlin/blackjack/CardNumberTest.kt create mode 100644 src/test/kotlin/blackjack/CardRankTest.kt diff --git a/src/main/kotlin/blackjack/README.md b/src/main/kotlin/blackjack/README.md index 3b556de765..ce833cf89c 100644 --- a/src/main/kotlin/blackjack/README.md +++ b/src/main/kotlin/blackjack/README.md @@ -6,7 +6,7 @@ - [x] King, Queen, Jack은 각 10으로 계산된다. - [x] 문양은 하트, 다이아몬드, 클로버, 스페이드 4가지이다. - [x] 카드의 총 개수는 13 * 4인 52장이다. -- [ ] 카드는 문양, 숫자가 동일하다면 모두 같은 인스턴스를 반환한다. +- [x] 카드는 문양, 숫자가 동일하다면 모두 같은 인스턴스를 반환한다. - [ ] Ace는 숫자 합에 따라 1 또는 11로 계산할 수 있다. - [ ] 딜러는 카드 뭉치를 가지고 있다. - [ ] 딜러는 랜덤한 카드를 뽑을 수 있다. diff --git a/src/main/kotlin/blackjack/domain/Card.kt b/src/main/kotlin/blackjack/domain/Card.kt index 2129b76df3..1c61a9ceae 100644 --- a/src/main/kotlin/blackjack/domain/Card.kt +++ b/src/main/kotlin/blackjack/domain/Card.kt @@ -2,14 +2,14 @@ package blackjack.domain class Card private constructor ( val suit: CardSuit, - val number: CardNumber + val rank: CardRank ) { companion object { private const val INVALID_CARD_ERROR = "존재하지 않는 카드입니다." val allCards = CardSuit.values().flatMap { suit -> - CardNumber.values().map { number -> - Card(suit, number) + CardRank.values().map { rank -> + Card(suit, rank) } } @@ -17,9 +17,9 @@ class Card private constructor ( // private val map = // allCards // .groupBy { it.suit } -// .mapValues { it.value.associateBy { card -> card.number } } +// .mapValues { it.value.associateBy { card -> card.rank } } - fun of(suit: CardSuit, number: CardNumber): Card = - allCards.find { it.suit == suit && it.number == number } ?: throw IllegalArgumentException(INVALID_CARD_ERROR) + fun of(suit: CardSuit, rank: CardRank): Card = + allCards.find { it.suit == suit && it.rank == rank } ?: throw IllegalArgumentException(INVALID_CARD_ERROR) } } diff --git a/src/main/kotlin/blackjack/domain/CardNumber.kt b/src/main/kotlin/blackjack/domain/CardRank.kt similarity index 83% rename from src/main/kotlin/blackjack/domain/CardNumber.kt rename to src/main/kotlin/blackjack/domain/CardRank.kt index 93409642a7..609b3ef70a 100644 --- a/src/main/kotlin/blackjack/domain/CardNumber.kt +++ b/src/main/kotlin/blackjack/domain/CardRank.kt @@ -1,6 +1,6 @@ package blackjack.domain -enum class CardNumber(val value: Int) { +enum class CardRank(val value: Int) { ACE(1), TWO(2), THREE(3), diff --git a/src/test/kotlin/blackjack/CardDeckTest.kt b/src/test/kotlin/blackjack/CardDeckTest.kt index 95d5cdef83..f85b3fd3d8 100644 --- a/src/test/kotlin/blackjack/CardDeckTest.kt +++ b/src/test/kotlin/blackjack/CardDeckTest.kt @@ -1,7 +1,7 @@ package blackjack import blackjack.domain.CardDeck -import blackjack.domain.CardNumber +import blackjack.domain.CardRank import blackjack.domain.CardSuit import io.kotest.matchers.shouldBe import org.junit.jupiter.api.DisplayName @@ -13,7 +13,7 @@ internal class CardDeckTest { @Test fun cardDeckSize() { val actual = CardDeck().size() - val expect = CardSuit.values().size * CardNumber.values().size + val expect = CardSuit.values().size * CardRank.values().size actual shouldBe expect } diff --git a/src/test/kotlin/blackjack/CardNumberTest.kt b/src/test/kotlin/blackjack/CardNumberTest.kt deleted file mode 100644 index 2b88ceab95..0000000000 --- a/src/test/kotlin/blackjack/CardNumberTest.kt +++ /dev/null @@ -1,26 +0,0 @@ -package blackjack - -import blackjack.domain.CardNumber -import io.kotest.matchers.collections.shouldContainAll -import io.kotest.matchers.shouldBe -import org.junit.jupiter.api.DisplayName -import org.junit.jupiter.api.Test - -internal class CardNumberTest { - - @DisplayName("카드의 숫자는 1(Ace)부터 King까지 있다") - @Test - fun cardNumber() { - val actual = CardNumber.values() - - actual.size shouldBe 13 - actual.shouldContainAll( - listOf( - CardNumber.ACE, CardNumber.TWO, CardNumber.THREE, - CardNumber.FOUR, CardNumber.FIVE, CardNumber.SIX, - CardNumber.SEVEN, CardNumber.EIGHT, CardNumber.NINE, CardNumber.TEN, - CardNumber.JACK, CardNumber.QUEEN, CardNumber.KING - ) - ) - } -} diff --git a/src/test/kotlin/blackjack/CardRankTest.kt b/src/test/kotlin/blackjack/CardRankTest.kt new file mode 100644 index 0000000000..91e8b629e9 --- /dev/null +++ b/src/test/kotlin/blackjack/CardRankTest.kt @@ -0,0 +1,26 @@ +package blackjack + +import blackjack.domain.CardRank +import io.kotest.matchers.collections.shouldContainAll +import io.kotest.matchers.shouldBe +import org.junit.jupiter.api.DisplayName +import org.junit.jupiter.api.Test + +internal class CardRankTest { + + @DisplayName("카드의 숫자는 1(Ace)부터 King까지 있다") + @Test + fun cardRank() { + val actual = CardRank.values() + + actual.size shouldBe 13 + actual.shouldContainAll( + listOf( + CardRank.ACE, CardRank.TWO, CardRank.THREE, + CardRank.FOUR, CardRank.FIVE, CardRank.SIX, + CardRank.SEVEN, CardRank.EIGHT, CardRank.NINE, CardRank.TEN, + CardRank.JACK, CardRank.QUEEN, CardRank.KING + ) + ) + } +} diff --git a/src/test/kotlin/blackjack/CardTest.kt b/src/test/kotlin/blackjack/CardTest.kt index 40a5257fb4..60d2270446 100644 --- a/src/test/kotlin/blackjack/CardTest.kt +++ b/src/test/kotlin/blackjack/CardTest.kt @@ -1,7 +1,7 @@ package blackjack import blackjack.domain.Card -import blackjack.domain.CardNumber +import blackjack.domain.CardRank import blackjack.domain.CardSuit import io.kotest.inspectors.forAll import io.kotest.matchers.shouldBe @@ -12,20 +12,33 @@ internal class CardTest { @DisplayName("카드는 숫자와 문양을 가진다.") @Test - fun numberAndSuit() { - val number = CardNumber.ACE + fun suitAndRank() { + val rank = CardRank.ACE val suit = CardSuit.DIAMOND - val actual = Card.of(suit, number) + val actual = Card.of(suit, rank) - actual.number shouldBe number + actual.rank shouldBe rank actual.suit shouldBe suit } @DisplayName("King, Queen, Jack은 각 10으로 계산된다.") @Test fun jqkValueEqual10() { - val actual = listOf(CardNumber.JACK, CardNumber.QUEEN, CardNumber.KING) + val actual = listOf(CardRank.JACK, CardRank.QUEEN, CardRank.KING) - actual.forAll { cardNumber -> cardNumber.value shouldBe 10 } + actual.forAll { cardRank -> cardRank.value shouldBe 10 } + } + + @DisplayName("suit, rank가 같으면 동일한 Card 인스턴스가 반환된다.") + @Test + fun cardInstance() { + val suit = CardSuit.values().random() + val rank = CardRank.values().random() + + val card1 = Card.of(suit, rank) + val card2 = Card.of(suit, rank) + + val actual = card1 === card2 + actual shouldBe true } } From d3def5f51f2151b93c84731b27c58243d8488846 Mon Sep 17 00:00:00 2001 From: ggam-nyang Date: Wed, 5 Jul 2023 16:34:24 +0900 Subject: [PATCH 08/22] =?UTF-8?q?feature:=20=EB=94=9C=EB=9F=AC=EB=8A=94=20?= =?UTF-8?q?CardDeck=EC=9D=84=20=EA=B0=80=EC=A7=80=EA=B3=A0=20=EC=9E=88?= =?UTF-8?q?=EB=8B=A4?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- src/main/kotlin/blackjack/README.md | 4 ++-- src/main/kotlin/blackjack/domain/Dealer.kt | 5 +++++ src/test/kotlin/blackjack/DealerTest.kt | 17 +++++++++++++++++ 3 files changed, 24 insertions(+), 2 deletions(-) create mode 100644 src/main/kotlin/blackjack/domain/Dealer.kt create mode 100644 src/test/kotlin/blackjack/DealerTest.kt diff --git a/src/main/kotlin/blackjack/README.md b/src/main/kotlin/blackjack/README.md index ce833cf89c..21fd4d1e07 100644 --- a/src/main/kotlin/blackjack/README.md +++ b/src/main/kotlin/blackjack/README.md @@ -7,14 +7,14 @@ - [x] 문양은 하트, 다이아몬드, 클로버, 스페이드 4가지이다. - [x] 카드의 총 개수는 13 * 4인 52장이다. - [x] 카드는 문양, 숫자가 동일하다면 모두 같은 인스턴스를 반환한다. -- [ ] Ace는 숫자 합에 따라 1 또는 11로 계산할 수 있다. -- [ ] 딜러는 카드 뭉치를 가지고 있다. +- [x] 딜러는 카드 뭉치를 가지고 있다. - [ ] 딜러는 랜덤한 카드를 뽑을 수 있다. - [ ] 플레이어는 여러 장의 카드를 가지고 있다. - [ ] 딜러는 플레이어에게 카드를 줄 수 있다. - [ ] 플레이어는 게임 시작 시 카드 두 장을 지급받는다. - [ ] 플레이어는 카드를 뽑을 수 있다. - [ ] 플레이어는 숫자 합이 21이 넘으면 카드를 뽑을 수 없다. +- [ ] Ace는 숫자 합에 따라 1 또는 11로 계산할 수 있다. - [ ] 카드의 합이 21이하면서, 가까운 플레이어가 승리한다. ### 기능 요구사항 diff --git a/src/main/kotlin/blackjack/domain/Dealer.kt b/src/main/kotlin/blackjack/domain/Dealer.kt new file mode 100644 index 0000000000..8dddf2cc87 --- /dev/null +++ b/src/main/kotlin/blackjack/domain/Dealer.kt @@ -0,0 +1,5 @@ +package blackjack.domain + +class Dealer { + val cardDeck = CardDeck() +} diff --git a/src/test/kotlin/blackjack/DealerTest.kt b/src/test/kotlin/blackjack/DealerTest.kt new file mode 100644 index 0000000000..91d7930cf8 --- /dev/null +++ b/src/test/kotlin/blackjack/DealerTest.kt @@ -0,0 +1,17 @@ +package blackjack + +import blackjack.domain.Dealer +import io.kotest.matchers.nulls.shouldNotBeNull +import org.junit.jupiter.api.DisplayName +import org.junit.jupiter.api.Test + +internal class DealerTest { + + @DisplayName("딜러는 CardDeck을 가지고 있다.") + @Test + fun dealerHasCardDeck() { + val dealer = Dealer() + + dealer.cardDeck.shouldNotBeNull() + } +} \ No newline at end of file From d083387726270770181597ab96a1ce16bf499b6f Mon Sep 17 00:00:00 2001 From: ggam-nyang Date: Wed, 5 Jul 2023 19:16:41 +0900 Subject: [PATCH 09/22] =?UTF-8?q?feature:=20=EB=94=9C=EB=9F=AC=EB=8A=94=20?= =?UTF-8?q?=EC=B9=B4=EB=93=9C=EB=A5=BC=20=EB=BD=91=EC=9D=84=20=EC=88=98=20?= =?UTF-8?q?=EC=9E=88=EA=B3=A0,=20=EA=B7=B8=20=EC=B9=B4=EB=93=9C=EB=8A=94?= =?UTF-8?q?=20=EB=8D=B1=EC=97=90=EC=84=9C=20=EC=82=AC=EB=9D=BC=EC=A7=84?= =?UTF-8?q?=EB=8B=A4?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- src/main/kotlin/blackjack/README.md | 2 +- src/main/kotlin/blackjack/domain/CardDeck.kt | 6 +++- src/main/kotlin/blackjack/domain/Dealer.kt | 6 +++- src/test/kotlin/blackjack/DealerTest.kt | 32 ++++++++++++++++++-- 4 files changed, 40 insertions(+), 6 deletions(-) diff --git a/src/main/kotlin/blackjack/README.md b/src/main/kotlin/blackjack/README.md index 21fd4d1e07..59268a0eed 100644 --- a/src/main/kotlin/blackjack/README.md +++ b/src/main/kotlin/blackjack/README.md @@ -8,7 +8,7 @@ - [x] 카드의 총 개수는 13 * 4인 52장이다. - [x] 카드는 문양, 숫자가 동일하다면 모두 같은 인스턴스를 반환한다. - [x] 딜러는 카드 뭉치를 가지고 있다. -- [ ] 딜러는 랜덤한 카드를 뽑을 수 있다. +- [x] 딜러는 랜덤한 카드를 뽑을 수 있고, 뽑은 카드는 덱에서 사라진다. - [ ] 플레이어는 여러 장의 카드를 가지고 있다. - [ ] 딜러는 플레이어에게 카드를 줄 수 있다. - [ ] 플레이어는 게임 시작 시 카드 두 장을 지급받는다. diff --git a/src/main/kotlin/blackjack/domain/CardDeck.kt b/src/main/kotlin/blackjack/domain/CardDeck.kt index b4b353809c..1f942f64c9 100644 --- a/src/main/kotlin/blackjack/domain/CardDeck.kt +++ b/src/main/kotlin/blackjack/domain/CardDeck.kt @@ -1,7 +1,11 @@ package blackjack.domain class CardDeck { - private val cards = Card.allCards.toMutableList() + private val cards = + Card.allCards + .shuffled() + .toMutableList() fun size(): Int = cards.size + fun draw(): Card = cards.removeLast() } diff --git a/src/main/kotlin/blackjack/domain/Dealer.kt b/src/main/kotlin/blackjack/domain/Dealer.kt index 8dddf2cc87..6846117c9a 100644 --- a/src/main/kotlin/blackjack/domain/Dealer.kt +++ b/src/main/kotlin/blackjack/domain/Dealer.kt @@ -1,5 +1,9 @@ package blackjack.domain class Dealer { - val cardDeck = CardDeck() + val cardDeck: CardDeck = CardDeck() + + fun draw(): Card { + return cardDeck.draw() + } } diff --git a/src/test/kotlin/blackjack/DealerTest.kt b/src/test/kotlin/blackjack/DealerTest.kt index 91d7930cf8..adfe72054e 100644 --- a/src/test/kotlin/blackjack/DealerTest.kt +++ b/src/test/kotlin/blackjack/DealerTest.kt @@ -1,17 +1,43 @@ package blackjack +import blackjack.domain.Card import blackjack.domain.Dealer import io.kotest.matchers.nulls.shouldNotBeNull +import io.kotest.matchers.shouldBe +import io.kotest.matchers.types.shouldBeTypeOf +import org.junit.jupiter.api.BeforeEach import org.junit.jupiter.api.DisplayName import org.junit.jupiter.api.Test internal class DealerTest { + private lateinit var dealer: Dealer + + @BeforeEach + fun beforeEach() { + dealer = Dealer() + } @DisplayName("딜러는 CardDeck을 가지고 있다.") @Test fun dealerHasCardDeck() { - val dealer = Dealer() - dealer.cardDeck.shouldNotBeNull() } -} \ No newline at end of file + + @DisplayName("딜러는 랜덤한 카드를 뽑을 수 있다") + @Test + fun drawRandomCard() { + val actual = dealer.draw() + + actual.shouldBeTypeOf() + } + + @DisplayName("딜러가 뽑은 카드는 덱에서 사라진다.") + @Test + fun drawCardNotInDeck() { + val beforeDraw = dealer.cardDeck.size() + dealer.draw() + val afterDraw = dealer.cardDeck.size() + + afterDraw shouldBe beforeDraw - 1 + } +} From 725dc3ad056e74e7ecbf011516bbb98e978540d1 Mon Sep 17 00:00:00 2001 From: ggam-nyang Date: Wed, 5 Jul 2023 19:33:56 +0900 Subject: [PATCH 10/22] =?UTF-8?q?feature:=20Player=20=EC=83=9D=EC=84=B1=20?= =?UTF-8?q?=EB=B0=8F=20addAll=20=EB=A9=94=EC=84=9C=EB=93=9C=20=EC=83=9D?= =?UTF-8?q?=EC=84=B1?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- src/main/kotlin/blackjack/README.md | 2 +- src/main/kotlin/blackjack/domain/Player.kt | 9 ++++++++ src/test/kotlin/blackjack/PlayerTest.kt | 25 ++++++++++++++++++++++ 3 files changed, 35 insertions(+), 1 deletion(-) create mode 100644 src/main/kotlin/blackjack/domain/Player.kt create mode 100644 src/test/kotlin/blackjack/PlayerTest.kt diff --git a/src/main/kotlin/blackjack/README.md b/src/main/kotlin/blackjack/README.md index 59268a0eed..5042352f3e 100644 --- a/src/main/kotlin/blackjack/README.md +++ b/src/main/kotlin/blackjack/README.md @@ -9,7 +9,7 @@ - [x] 카드는 문양, 숫자가 동일하다면 모두 같은 인스턴스를 반환한다. - [x] 딜러는 카드 뭉치를 가지고 있다. - [x] 딜러는 랜덤한 카드를 뽑을 수 있고, 뽑은 카드는 덱에서 사라진다. -- [ ] 플레이어는 여러 장의 카드를 가지고 있다. +- [x] 플레이어는 여러 장의 카드를 가지고 있다. - [ ] 딜러는 플레이어에게 카드를 줄 수 있다. - [ ] 플레이어는 게임 시작 시 카드 두 장을 지급받는다. - [ ] 플레이어는 카드를 뽑을 수 있다. diff --git a/src/main/kotlin/blackjack/domain/Player.kt b/src/main/kotlin/blackjack/domain/Player.kt new file mode 100644 index 0000000000..b4993b1ce6 --- /dev/null +++ b/src/main/kotlin/blackjack/domain/Player.kt @@ -0,0 +1,9 @@ +package blackjack.domain + +class Player { + private val _cards = mutableListOf() + val cards: List + get() = _cards.toList() + + fun addCard(cards: List): Boolean = _cards.addAll(cards) +} diff --git a/src/test/kotlin/blackjack/PlayerTest.kt b/src/test/kotlin/blackjack/PlayerTest.kt new file mode 100644 index 0000000000..e613518b5b --- /dev/null +++ b/src/test/kotlin/blackjack/PlayerTest.kt @@ -0,0 +1,25 @@ +package blackjack + +import blackjack.domain.Card +import blackjack.domain.CardRank +import blackjack.domain.CardSuit +import blackjack.domain.Player +import io.kotest.matchers.shouldBe +import org.junit.jupiter.api.DisplayName +import org.junit.jupiter.api.Test + +internal class PlayerTest { + + @DisplayName("플레이어는 여러 장의 카드를 가지고 있다.") + @Test + fun playerHasCards() { + val cards = listOf( + Card.of(CardSuit.DIAMOND, CardRank.ACE), + Card.of(CardSuit.HEART, CardRank.ACE) + ) + val actual = Player() + actual.addCard(cards) + + actual.cards shouldBe cards + } +} From a182edaf2f27cf7e1c77da76bd1b9b9e243cbf78 Mon Sep 17 00:00:00 2001 From: ggam-nyang Date: Wed, 5 Jul 2023 20:05:24 +0900 Subject: [PATCH 11/22] =?UTF-8?q?feature:=20=EB=94=9C=EB=9F=AC=EC=9D=98=20?= =?UTF-8?q?deal=20=EB=A9=94=EC=84=9C=EB=93=9C=20=EC=B6=94=EA=B0=80?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- src/main/kotlin/blackjack/README.md | 2 +- src/main/kotlin/blackjack/domain/Dealer.kt | 4 ++++ src/main/kotlin/blackjack/domain/Player.kt | 3 ++- src/test/kotlin/blackjack/DealerTest.kt | 12 ++++++++++++ src/test/kotlin/blackjack/PlayerTest.kt | 14 +++++++++++++- 5 files changed, 32 insertions(+), 3 deletions(-) diff --git a/src/main/kotlin/blackjack/README.md b/src/main/kotlin/blackjack/README.md index 5042352f3e..6a423f1903 100644 --- a/src/main/kotlin/blackjack/README.md +++ b/src/main/kotlin/blackjack/README.md @@ -10,7 +10,7 @@ - [x] 딜러는 카드 뭉치를 가지고 있다. - [x] 딜러는 랜덤한 카드를 뽑을 수 있고, 뽑은 카드는 덱에서 사라진다. - [x] 플레이어는 여러 장의 카드를 가지고 있다. -- [ ] 딜러는 플레이어에게 카드를 줄 수 있다. +- [x] 딜러는 플레이어에게 카드를 줄 수 있다. - [ ] 플레이어는 게임 시작 시 카드 두 장을 지급받는다. - [ ] 플레이어는 카드를 뽑을 수 있다. - [ ] 플레이어는 숫자 합이 21이 넘으면 카드를 뽑을 수 없다. diff --git a/src/main/kotlin/blackjack/domain/Dealer.kt b/src/main/kotlin/blackjack/domain/Dealer.kt index 6846117c9a..da029e7ecc 100644 --- a/src/main/kotlin/blackjack/domain/Dealer.kt +++ b/src/main/kotlin/blackjack/domain/Dealer.kt @@ -6,4 +6,8 @@ class Dealer { fun draw(): Card { return cardDeck.draw() } + + fun deal(player: Player) { + player.addCard(draw()) + } } diff --git a/src/main/kotlin/blackjack/domain/Player.kt b/src/main/kotlin/blackjack/domain/Player.kt index b4993b1ce6..c580bf0e08 100644 --- a/src/main/kotlin/blackjack/domain/Player.kt +++ b/src/main/kotlin/blackjack/domain/Player.kt @@ -5,5 +5,6 @@ class Player { val cards: List get() = _cards.toList() - fun addCard(cards: List): Boolean = _cards.addAll(cards) + fun addCards(cards: List): Boolean = _cards.addAll(cards) + fun addCard(card: Card): Boolean = _cards.add(card) } diff --git a/src/test/kotlin/blackjack/DealerTest.kt b/src/test/kotlin/blackjack/DealerTest.kt index adfe72054e..02bd397741 100644 --- a/src/test/kotlin/blackjack/DealerTest.kt +++ b/src/test/kotlin/blackjack/DealerTest.kt @@ -2,6 +2,7 @@ package blackjack import blackjack.domain.Card import blackjack.domain.Dealer +import blackjack.domain.Player import io.kotest.matchers.nulls.shouldNotBeNull import io.kotest.matchers.shouldBe import io.kotest.matchers.types.shouldBeTypeOf @@ -40,4 +41,15 @@ internal class DealerTest { afterDraw shouldBe beforeDraw - 1 } + + @DisplayName("딜러는 플레이어에게 카드를 줄 수 있다.") + @Test + fun deal() { + val player = Player() + dealer.deal(player) + + val actual = player.cards + + actual.size shouldBe 1 + } } diff --git a/src/test/kotlin/blackjack/PlayerTest.kt b/src/test/kotlin/blackjack/PlayerTest.kt index e613518b5b..cf60806dcd 100644 --- a/src/test/kotlin/blackjack/PlayerTest.kt +++ b/src/test/kotlin/blackjack/PlayerTest.kt @@ -4,6 +4,7 @@ import blackjack.domain.Card import blackjack.domain.CardRank import blackjack.domain.CardSuit import blackjack.domain.Player +import io.kotest.matchers.collections.shouldContain import io.kotest.matchers.shouldBe import org.junit.jupiter.api.DisplayName import org.junit.jupiter.api.Test @@ -18,8 +19,19 @@ internal class PlayerTest { Card.of(CardSuit.HEART, CardRank.ACE) ) val actual = Player() - actual.addCard(cards) + actual.addCards(cards) actual.cards shouldBe cards } + + @DisplayName("플레이어는 한장의 카드를 추가할 수 있다.") + @Test + fun addCard() { + val card = Card.of(CardSuit.DIAMOND, CardRank.ACE) + val actual = Player() + actual.addCard(card) + + actual.cards.size shouldBe 1 + actual.cards.shouldContain(card) + } } From 4c92683aeff60bcb79000b8a1f0dd2c5fe2e5deb Mon Sep 17 00:00:00 2001 From: ggam-nyang Date: Wed, 5 Jul 2023 20:19:50 +0900 Subject: [PATCH 12/22] =?UTF-8?q?feature:=20=ED=94=8C=EB=A0=88=EC=9D=B4?= =?UTF-8?q?=EC=96=B4=EB=8A=94=20=EA=B2=8C=EC=9E=84=20=EC=8B=9C=EC=9E=91=20?= =?UTF-8?q?=EC=8B=9C=20=EC=B9=B4=EB=93=9C=20=EB=91=90=20=EC=9E=A5=EC=9D=84?= =?UTF-8?q?=20=EC=A7=80=EA=B8=89=EB=B0=9B=EB=8A=94=EB=8B=A4.?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- src/main/kotlin/blackjack/README.md | 2 +- .../kotlin/blackjack/domain/BlackJackGame.kt | 22 +++++++++++++++ .../kotlin/blackjack/BlackJackGameTest.kt | 27 +++++++++++++++++++ 3 files changed, 50 insertions(+), 1 deletion(-) create mode 100644 src/main/kotlin/blackjack/domain/BlackJackGame.kt create mode 100644 src/test/kotlin/blackjack/BlackJackGameTest.kt diff --git a/src/main/kotlin/blackjack/README.md b/src/main/kotlin/blackjack/README.md index 6a423f1903..9fcdec938c 100644 --- a/src/main/kotlin/blackjack/README.md +++ b/src/main/kotlin/blackjack/README.md @@ -11,7 +11,7 @@ - [x] 딜러는 랜덤한 카드를 뽑을 수 있고, 뽑은 카드는 덱에서 사라진다. - [x] 플레이어는 여러 장의 카드를 가지고 있다. - [x] 딜러는 플레이어에게 카드를 줄 수 있다. -- [ ] 플레이어는 게임 시작 시 카드 두 장을 지급받는다. +- [x] 플레이어는 게임 시작 시 카드 두 장을 지급받는다. - [ ] 플레이어는 카드를 뽑을 수 있다. - [ ] 플레이어는 숫자 합이 21이 넘으면 카드를 뽑을 수 없다. - [ ] Ace는 숫자 합에 따라 1 또는 11로 계산할 수 있다. diff --git a/src/main/kotlin/blackjack/domain/BlackJackGame.kt b/src/main/kotlin/blackjack/domain/BlackJackGame.kt new file mode 100644 index 0000000000..4048ba45b8 --- /dev/null +++ b/src/main/kotlin/blackjack/domain/BlackJackGame.kt @@ -0,0 +1,22 @@ +package blackjack.domain + +class BlackJackGame( + private val dealer: Dealer, + val players: List +) { + init { + initGame() + } + + private fun initGame() { + repeat(INIT_DEAL_COUNT) { deal() } + } + + private fun deal() { + players.forEach { player -> dealer.deal(player) } + } + + companion object { + private const val INIT_DEAL_COUNT = 2 + } +} \ No newline at end of file diff --git a/src/test/kotlin/blackjack/BlackJackGameTest.kt b/src/test/kotlin/blackjack/BlackJackGameTest.kt new file mode 100644 index 0000000000..ab0be32cbe --- /dev/null +++ b/src/test/kotlin/blackjack/BlackJackGameTest.kt @@ -0,0 +1,27 @@ +package blackjack + +import blackjack.domain.BlackJackGame +import blackjack.domain.Dealer +import blackjack.domain.Player +import io.kotest.inspectors.forAll +import io.kotest.matchers.shouldBe +import org.junit.jupiter.api.DisplayName +import org.junit.jupiter.api.Test + +internal class BlackJackGameTest { + + @DisplayName("플레이어는 게임 시작 시 카드 두 장을 지급받는다.") + @Test + fun initPlayerGetCards() { + val dealer = Dealer() + val players = listOf(Player(), Player()) + players.forAll { player -> + player.cards.isEmpty() shouldBe true + } + + val blackJackGame = BlackJackGame(dealer, players) + blackJackGame.players.forAll { player -> + player.cards.size shouldBe 2 + } + } +} \ No newline at end of file From 30dfebd1e0c1608d7651b1afa6e91a557602bb56 Mon Sep 17 00:00:00 2001 From: ggam-nyang Date: Wed, 5 Jul 2023 21:14:25 +0900 Subject: [PATCH 13/22] =?UTF-8?q?feature:=20=ED=94=8C=EB=A0=88=EC=9D=B4?= =?UTF-8?q?=EC=96=B4=EB=8A=94=20=EC=9D=B4=EB=A6=84=EC=9D=84=20=EA=B0=80?= =?UTF-8?q?=EC=A7=80=EA=B3=A0=20=EA=B2=8C=EC=9E=84=20=EC=8B=9C=EC=9E=91=20?= =?UTF-8?q?=EC=8B=9C=20=ED=94=8C=EB=A0=88=EC=9D=B4=EC=96=B4=EC=9D=98=20?= =?UTF-8?q?=EC=9D=B4=EB=A6=84=EC=9D=84=20=EC=9E=85=EB=A0=A5=20=ED=95=A0=20?= =?UTF-8?q?=EC=88=98=20=EC=9E=88=EB=8B=A4.?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- src/main/kotlin/blackjack/Client.kt | 9 ++++++++ src/main/kotlin/blackjack/README.md | 5 ++++- .../kotlin/blackjack/domain/BlackJackGame.kt | 2 +- src/main/kotlin/blackjack/domain/Player.kt | 4 +++- src/main/kotlin/blackjack/view/InputNames.kt | 10 +++++++++ src/main/kotlin/blackjack/view/InputView.kt | 20 +++++++++++++++++ .../kotlin/blackjack/BlackJackGameTest.kt | 2 +- .../kotlin/blackjack/view/InputNamesTest.kt | 22 +++++++++++++++++++ 8 files changed, 70 insertions(+), 4 deletions(-) create mode 100644 src/main/kotlin/blackjack/Client.kt create mode 100644 src/main/kotlin/blackjack/view/InputNames.kt create mode 100644 src/main/kotlin/blackjack/view/InputView.kt create mode 100644 src/test/kotlin/blackjack/view/InputNamesTest.kt diff --git a/src/main/kotlin/blackjack/Client.kt b/src/main/kotlin/blackjack/Client.kt new file mode 100644 index 0000000000..1853b68dcb --- /dev/null +++ b/src/main/kotlin/blackjack/Client.kt @@ -0,0 +1,9 @@ +package blackjack + +import blackjack.domain.Dealer +import blackjack.view.InputView + +fun main() { + val dealer = Dealer() + val players = InputView.inputPlayers() +} diff --git a/src/main/kotlin/blackjack/README.md b/src/main/kotlin/blackjack/README.md index 9fcdec938c..01da93b474 100644 --- a/src/main/kotlin/blackjack/README.md +++ b/src/main/kotlin/blackjack/README.md @@ -12,7 +12,10 @@ - [x] 플레이어는 여러 장의 카드를 가지고 있다. - [x] 딜러는 플레이어에게 카드를 줄 수 있다. - [x] 플레이어는 게임 시작 시 카드 두 장을 지급받는다. -- [ ] 플레이어는 카드를 뽑을 수 있다. +- [x] 플레이어는 카드를 뽑을 수 있다. +- [x] 게임 시작 시 플레이어의 이름을 입력할 수 있다. +- [ ] 게임 시작 시 플레이어의 카드를 출력한다. +- [ ] 플레이어는 카드를 뽑지 않을 수 있다. - [ ] 플레이어는 숫자 합이 21이 넘으면 카드를 뽑을 수 없다. - [ ] Ace는 숫자 합에 따라 1 또는 11로 계산할 수 있다. - [ ] 카드의 합이 21이하면서, 가까운 플레이어가 승리한다. diff --git a/src/main/kotlin/blackjack/domain/BlackJackGame.kt b/src/main/kotlin/blackjack/domain/BlackJackGame.kt index 4048ba45b8..14f53653e9 100644 --- a/src/main/kotlin/blackjack/domain/BlackJackGame.kt +++ b/src/main/kotlin/blackjack/domain/BlackJackGame.kt @@ -19,4 +19,4 @@ class BlackJackGame( companion object { private const val INIT_DEAL_COUNT = 2 } -} \ No newline at end of file +} diff --git a/src/main/kotlin/blackjack/domain/Player.kt b/src/main/kotlin/blackjack/domain/Player.kt index c580bf0e08..df1db01f99 100644 --- a/src/main/kotlin/blackjack/domain/Player.kt +++ b/src/main/kotlin/blackjack/domain/Player.kt @@ -1,6 +1,8 @@ package blackjack.domain -class Player { +class Player( + val name: String = "player" +) { private val _cards = mutableListOf() val cards: List get() = _cards.toList() diff --git a/src/main/kotlin/blackjack/view/InputNames.kt b/src/main/kotlin/blackjack/view/InputNames.kt new file mode 100644 index 0000000000..e15e6fb8df --- /dev/null +++ b/src/main/kotlin/blackjack/view/InputNames.kt @@ -0,0 +1,10 @@ +package blackjack.view + +data class InputNames( + val inputString: String +) { + + fun parseNames(): List { + return inputString.split(",") + } +} diff --git a/src/main/kotlin/blackjack/view/InputView.kt b/src/main/kotlin/blackjack/view/InputView.kt new file mode 100644 index 0000000000..7d22566b03 --- /dev/null +++ b/src/main/kotlin/blackjack/view/InputView.kt @@ -0,0 +1,20 @@ +package blackjack.view + +import blackjack.domain.Player + +object InputView { + private const val INPUT_PLAYERS_NAME = "게임에 참여할 사람의 이름을 입력하세요.(쉼표 기준으로 분리)" + + fun inputPlayers(): List { + val playerNames = inputPlayerNames() + + return playerNames.map { Player(it) } + } + + private fun inputPlayerNames(): List { + println(INPUT_PLAYERS_NAME) + val inputNames = InputNames(readln()) + + return inputNames.parseNames() + } +} diff --git a/src/test/kotlin/blackjack/BlackJackGameTest.kt b/src/test/kotlin/blackjack/BlackJackGameTest.kt index ab0be32cbe..9362e5602c 100644 --- a/src/test/kotlin/blackjack/BlackJackGameTest.kt +++ b/src/test/kotlin/blackjack/BlackJackGameTest.kt @@ -24,4 +24,4 @@ internal class BlackJackGameTest { player.cards.size shouldBe 2 } } -} \ No newline at end of file +} diff --git a/src/test/kotlin/blackjack/view/InputNamesTest.kt b/src/test/kotlin/blackjack/view/InputNamesTest.kt new file mode 100644 index 0000000000..8ab93b0470 --- /dev/null +++ b/src/test/kotlin/blackjack/view/InputNamesTest.kt @@ -0,0 +1,22 @@ +package blackjack.view + +import io.kotest.inspectors.forAll +import io.kotest.matchers.shouldBe +import org.junit.jupiter.api.DisplayName +import org.junit.jupiter.api.Test + +internal class InputNamesTest { + + @DisplayName("쉼표를 구분자로 이름이 입력되면 이름 리스트를 반환한다") + @Test + fun nameList() { + val inputs = listOf( + "name1,name2" to listOf("name1", "name2"), + "name1,name2,name3" to listOf("name1", "name2", "name3") + ) + + inputs.forAll { input -> + InputNames(input.first).parseNames() shouldBe input.second + } + } +} From dc83d17628bc7dd903b0e84ecdd092ba0f40ee8a Mon Sep 17 00:00:00 2001 From: ggam-nyang Date: Thu, 6 Jul 2023 13:42:13 +0900 Subject: [PATCH 14/22] =?UTF-8?q?feature:=20=EA=B2=8C=EC=9E=84=20=EC=8B=9C?= =?UTF-8?q?=EC=9E=91=20=EC=8B=9C=20=ED=94=8C=EB=A0=88=EC=9D=B4=EC=96=B4?= =?UTF-8?q?=EC=9D=98=20=EC=B9=B4=EB=93=9C=EB=A5=BC=20=EC=B6=9C=EB=A0=A5?= =?UTF-8?q?=ED=95=9C=EB=8B=A4.?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- src/main/kotlin/blackjack/Client.kt | 5 ++++ src/main/kotlin/blackjack/README.md | 2 +- src/main/kotlin/blackjack/domain/Card.kt | 2 ++ src/main/kotlin/blackjack/domain/CardRank.kt | 28 ++++++++++---------- src/main/kotlin/blackjack/domain/CardSuit.kt | 10 +++---- src/main/kotlin/blackjack/view/OutputView.kt | 22 +++++++++++++++ src/test/kotlin/blackjack/CardTest.kt | 11 ++++++++ 7 files changed, 60 insertions(+), 20 deletions(-) create mode 100644 src/main/kotlin/blackjack/view/OutputView.kt diff --git a/src/main/kotlin/blackjack/Client.kt b/src/main/kotlin/blackjack/Client.kt index 1853b68dcb..163d70a477 100644 --- a/src/main/kotlin/blackjack/Client.kt +++ b/src/main/kotlin/blackjack/Client.kt @@ -1,9 +1,14 @@ package blackjack +import blackjack.domain.BlackJackGame import blackjack.domain.Dealer import blackjack.view.InputView +import blackjack.view.OutputView fun main() { val dealer = Dealer() val players = InputView.inputPlayers() + val blackJackGame = BlackJackGame(dealer, players) + + OutputView.printInitGame(blackJackGame) } diff --git a/src/main/kotlin/blackjack/README.md b/src/main/kotlin/blackjack/README.md index 01da93b474..635aa7e786 100644 --- a/src/main/kotlin/blackjack/README.md +++ b/src/main/kotlin/blackjack/README.md @@ -14,7 +14,7 @@ - [x] 플레이어는 게임 시작 시 카드 두 장을 지급받는다. - [x] 플레이어는 카드를 뽑을 수 있다. - [x] 게임 시작 시 플레이어의 이름을 입력할 수 있다. -- [ ] 게임 시작 시 플레이어의 카드를 출력한다. +- [x] 게임 시작 시 플레이어의 카드를 출력한다. - [ ] 플레이어는 카드를 뽑지 않을 수 있다. - [ ] 플레이어는 숫자 합이 21이 넘으면 카드를 뽑을 수 없다. - [ ] Ace는 숫자 합에 따라 1 또는 11로 계산할 수 있다. diff --git a/src/main/kotlin/blackjack/domain/Card.kt b/src/main/kotlin/blackjack/domain/Card.kt index 1c61a9ceae..cde4a47bfc 100644 --- a/src/main/kotlin/blackjack/domain/Card.kt +++ b/src/main/kotlin/blackjack/domain/Card.kt @@ -4,6 +4,8 @@ class Card private constructor ( val suit: CardSuit, val rank: CardRank ) { + fun print(): String = rank.forOutput + suit.forOutput + companion object { private const val INVALID_CARD_ERROR = "존재하지 않는 카드입니다." val allCards = diff --git a/src/main/kotlin/blackjack/domain/CardRank.kt b/src/main/kotlin/blackjack/domain/CardRank.kt index 609b3ef70a..022090dc22 100644 --- a/src/main/kotlin/blackjack/domain/CardRank.kt +++ b/src/main/kotlin/blackjack/domain/CardRank.kt @@ -1,17 +1,17 @@ package blackjack.domain -enum class CardRank(val value: Int) { - 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); +enum class CardRank(val value: Int, val forOutput: String) { + ACE(1, "A"), + TWO(2, "2"), + THREE(3, "3"), + FOUR(4, "4"), + FIVE(5, "5"), + SIX(6, "6"), + SEVEN(7, "7"), + EIGHT(8, "8"), + NINE(9, "9"), + TEN(10, "10"), + JACK(10, "J"), + QUEEN(10, "Q"), + KING(10, "K"); } diff --git a/src/main/kotlin/blackjack/domain/CardSuit.kt b/src/main/kotlin/blackjack/domain/CardSuit.kt index d18962cf1c..619e74419f 100644 --- a/src/main/kotlin/blackjack/domain/CardSuit.kt +++ b/src/main/kotlin/blackjack/domain/CardSuit.kt @@ -1,8 +1,8 @@ package blackjack.domain -enum class CardSuit { - SPADE, - HEART, - DIAMOND, - CLUB +enum class CardSuit(val forOutput: String) { + SPADE("스페이드"), + HEART("하트"), + DIAMOND("다이아몬드"), + CLUB("클로버"); } diff --git a/src/main/kotlin/blackjack/view/OutputView.kt b/src/main/kotlin/blackjack/view/OutputView.kt new file mode 100644 index 0000000000..7625c7c60f --- /dev/null +++ b/src/main/kotlin/blackjack/view/OutputView.kt @@ -0,0 +1,22 @@ +package blackjack.view + +import blackjack.domain.BlackJackGame +import blackjack.domain.Card +import blackjack.domain.Player + +object OutputView { + + fun printInitGame(blackJackGame: BlackJackGame) { + printPlayersName(blackJackGame) + blackJackGame.players.forEach { player -> printCardsInHand(player) } + } + + private fun printPlayersName(blackJackGame: BlackJackGame) { + println(blackJackGame.players.joinToString(transform = Player::name) + "에게 2장의 카드를 나누었습니다.") + } + + private fun printCardsInHand(player: Player) { + print("${player.name}카드: ") + println(player.cards.joinToString(transform = Card::print)) + } +} diff --git a/src/test/kotlin/blackjack/CardTest.kt b/src/test/kotlin/blackjack/CardTest.kt index 60d2270446..6220f436f4 100644 --- a/src/test/kotlin/blackjack/CardTest.kt +++ b/src/test/kotlin/blackjack/CardTest.kt @@ -41,4 +41,15 @@ internal class CardTest { val actual = card1 === card2 actual shouldBe true } + + @DisplayName("print메서드는 CardRank.forOutput + CardSuit.forOutput을 반환한다.") + @Test + fun print() { + val suit = CardSuit.values().random() + val rank = CardRank.values().random() + val card = Card.of(suit, rank) + + val actual = card.print() + actual shouldBe "${rank.forOutput}${suit.forOutput}" + } } From 6b64a2008a0f23fd1983158d3f16bec2d15ce664 Mon Sep 17 00:00:00 2001 From: ggam-nyang Date: Mon, 10 Jul 2023 17:07:30 +0900 Subject: [PATCH 15/22] =?UTF-8?q?feature:=20=ED=94=8C=EB=A0=88=EC=9D=B4?= =?UTF-8?q?=EC=96=B4=EB=8A=94=20=EC=86=90=ED=8C=A8=EC=9D=98=20=ED=95=A9?= =?UTF-8?q?=EC=9D=84=20=EC=95=8C=EA=B3=A0,=20draw=20=EA=B0=80=EB=8A=A5?= =?UTF-8?q?=ED=95=9C=EC=A7=80=20=EC=97=AC=EB=B6=80=EB=A5=BC=20=EC=95=88?= =?UTF-8?q?=EB=8B=A4?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- src/main/kotlin/blackjack/Client.kt | 12 +++- src/main/kotlin/blackjack/README.md | 1 + .../{BlackJackGame.kt => BlackjackGame.kt} | 8 ++- src/main/kotlin/blackjack/domain/Player.kt | 5 ++ src/main/kotlin/blackjack/view/InputView.kt | 10 +++ src/main/kotlin/blackjack/view/OutputView.kt | 6 +- .../kotlin/blackjack/BlackJackGameTest.kt | 27 ------- .../kotlin/blackjack/BlackjackGameTest.kt | 70 +++++++++++++++++++ src/test/kotlin/blackjack/PlayerTest.kt | 52 ++++++++++++++ 9 files changed, 156 insertions(+), 35 deletions(-) rename src/main/kotlin/blackjack/domain/{BlackJackGame.kt => BlackjackGame.kt} (65%) delete mode 100644 src/test/kotlin/blackjack/BlackJackGameTest.kt create mode 100644 src/test/kotlin/blackjack/BlackjackGameTest.kt diff --git a/src/main/kotlin/blackjack/Client.kt b/src/main/kotlin/blackjack/Client.kt index 163d70a477..1a2ca18ec6 100644 --- a/src/main/kotlin/blackjack/Client.kt +++ b/src/main/kotlin/blackjack/Client.kt @@ -1,6 +1,6 @@ package blackjack -import blackjack.domain.BlackJackGame +import blackjack.domain.BlackjackGame import blackjack.domain.Dealer import blackjack.view.InputView import blackjack.view.OutputView @@ -8,7 +8,15 @@ import blackjack.view.OutputView fun main() { val dealer = Dealer() val players = InputView.inputPlayers() - val blackJackGame = BlackJackGame(dealer, players) + val blackJackGame = BlackjackGame(dealer, players) OutputView.printInitGame(blackJackGame) + while (blackJackGame.isNotFinished()) { + blackJackGame.players.forEach { player -> + if (player.canDraw) { + val inputDrawResponse = InputView.inputDrawResponse(player) + dealer.deal(player) + } + } + } } diff --git a/src/main/kotlin/blackjack/README.md b/src/main/kotlin/blackjack/README.md index 635aa7e786..f682569141 100644 --- a/src/main/kotlin/blackjack/README.md +++ b/src/main/kotlin/blackjack/README.md @@ -15,6 +15,7 @@ - [x] 플레이어는 카드를 뽑을 수 있다. - [x] 게임 시작 시 플레이어의 이름을 입력할 수 있다. - [x] 게임 시작 시 플레이어의 카드를 출력한다. +- [x] 게임 시작 후, 각 플레이어는 카드를 뽑을 지 선택할 수 있다. - [ ] 플레이어는 카드를 뽑지 않을 수 있다. - [ ] 플레이어는 숫자 합이 21이 넘으면 카드를 뽑을 수 없다. - [ ] Ace는 숫자 합에 따라 1 또는 11로 계산할 수 있다. diff --git a/src/main/kotlin/blackjack/domain/BlackJackGame.kt b/src/main/kotlin/blackjack/domain/BlackjackGame.kt similarity index 65% rename from src/main/kotlin/blackjack/domain/BlackJackGame.kt rename to src/main/kotlin/blackjack/domain/BlackjackGame.kt index 14f53653e9..4f8c855390 100644 --- a/src/main/kotlin/blackjack/domain/BlackJackGame.kt +++ b/src/main/kotlin/blackjack/domain/BlackjackGame.kt @@ -1,6 +1,6 @@ package blackjack.domain -class BlackJackGame( +class BlackjackGame( private val dealer: Dealer, val players: List ) { @@ -9,13 +9,15 @@ class BlackJackGame( } private fun initGame() { - repeat(INIT_DEAL_COUNT) { deal() } + repeat(INIT_DEAL_COUNT) { initDeal() } } - private fun deal() { + private fun initDeal() { players.forEach { player -> dealer.deal(player) } } + fun isNotFinished(): Boolean = players.any { it.canDraw } + companion object { private const val INIT_DEAL_COUNT = 2 } diff --git a/src/main/kotlin/blackjack/domain/Player.kt b/src/main/kotlin/blackjack/domain/Player.kt index df1db01f99..7c9ca31f2d 100644 --- a/src/main/kotlin/blackjack/domain/Player.kt +++ b/src/main/kotlin/blackjack/domain/Player.kt @@ -3,10 +3,15 @@ package blackjack.domain class Player( val name: String = "player" ) { + var canDraw: Boolean = true + get() = sum() <= 21 + private set + private val _cards = mutableListOf() val cards: List get() = _cards.toList() fun addCards(cards: List): Boolean = _cards.addAll(cards) fun addCard(card: Card): Boolean = _cards.add(card) + fun sum(): Int = cards.sumOf { it.rank.value } } diff --git a/src/main/kotlin/blackjack/view/InputView.kt b/src/main/kotlin/blackjack/view/InputView.kt index 7d22566b03..fa425d6e14 100644 --- a/src/main/kotlin/blackjack/view/InputView.kt +++ b/src/main/kotlin/blackjack/view/InputView.kt @@ -4,6 +4,8 @@ import blackjack.domain.Player object InputView { private const val INPUT_PLAYERS_NAME = "게임에 참여할 사람의 이름을 입력하세요.(쉼표 기준으로 분리)" + private val INPUT_DRAW_RESPONSE = + { playerName: String -> "${playerName}는 한장의 카드를 더 받겠습니까? (예는 y, 아니오는 n)" } fun inputPlayers(): List { val playerNames = inputPlayerNames() @@ -17,4 +19,12 @@ object InputView { return inputNames.parseNames() } + + fun inputDrawResponse(player: Player): Boolean { + println(INPUT_DRAW_RESPONSE(player.name)) + val response = readln() + require(response == "y" || response == "n") { "응답은 y, n만 가능합니다" } + + return response == "y" + } } diff --git a/src/main/kotlin/blackjack/view/OutputView.kt b/src/main/kotlin/blackjack/view/OutputView.kt index 7625c7c60f..714d631938 100644 --- a/src/main/kotlin/blackjack/view/OutputView.kt +++ b/src/main/kotlin/blackjack/view/OutputView.kt @@ -1,17 +1,17 @@ package blackjack.view -import blackjack.domain.BlackJackGame +import blackjack.domain.BlackjackGame import blackjack.domain.Card import blackjack.domain.Player object OutputView { - fun printInitGame(blackJackGame: BlackJackGame) { + fun printInitGame(blackJackGame: BlackjackGame) { printPlayersName(blackJackGame) blackJackGame.players.forEach { player -> printCardsInHand(player) } } - private fun printPlayersName(blackJackGame: BlackJackGame) { + private fun printPlayersName(blackJackGame: BlackjackGame) { println(blackJackGame.players.joinToString(transform = Player::name) + "에게 2장의 카드를 나누었습니다.") } diff --git a/src/test/kotlin/blackjack/BlackJackGameTest.kt b/src/test/kotlin/blackjack/BlackJackGameTest.kt deleted file mode 100644 index 9362e5602c..0000000000 --- a/src/test/kotlin/blackjack/BlackJackGameTest.kt +++ /dev/null @@ -1,27 +0,0 @@ -package blackjack - -import blackjack.domain.BlackJackGame -import blackjack.domain.Dealer -import blackjack.domain.Player -import io.kotest.inspectors.forAll -import io.kotest.matchers.shouldBe -import org.junit.jupiter.api.DisplayName -import org.junit.jupiter.api.Test - -internal class BlackJackGameTest { - - @DisplayName("플레이어는 게임 시작 시 카드 두 장을 지급받는다.") - @Test - fun initPlayerGetCards() { - val dealer = Dealer() - val players = listOf(Player(), Player()) - players.forAll { player -> - player.cards.isEmpty() shouldBe true - } - - val blackJackGame = BlackJackGame(dealer, players) - blackJackGame.players.forAll { player -> - player.cards.size shouldBe 2 - } - } -} diff --git a/src/test/kotlin/blackjack/BlackjackGameTest.kt b/src/test/kotlin/blackjack/BlackjackGameTest.kt new file mode 100644 index 0000000000..699341b0e4 --- /dev/null +++ b/src/test/kotlin/blackjack/BlackjackGameTest.kt @@ -0,0 +1,70 @@ +package blackjack + +import blackjack.domain.BlackjackGame +import blackjack.domain.Card +import blackjack.domain.CardRank +import blackjack.domain.CardSuit +import blackjack.domain.Dealer +import blackjack.domain.Player +import io.kotest.inspectors.forAll +import io.kotest.matchers.shouldBe +import org.junit.jupiter.api.BeforeEach +import org.junit.jupiter.api.DisplayName +import org.junit.jupiter.api.Test + +internal class BlackjackGameTest { + private lateinit var dealer: Dealer + private lateinit var players: List + private lateinit var blackjackGame: BlackjackGame + + @BeforeEach + fun beforeEach(){ + dealer = Dealer() + players = listOf(Player(), Player()) + blackjackGame = BlackjackGame(dealer, players) + + } + + @DisplayName("플레이어는 게임 시작 시 카드 두 장을 지급받는다.") + @Test + fun initPlayerGetCards() { + val dealer = Dealer() + val players = listOf(Player(), Player()) + players.forAll { player -> + player.cards.isEmpty() shouldBe true + } + + val blackjackGame = BlackjackGame(dealer, players) + blackjackGame.players.forAll { player -> + player.cards.size shouldBe 2 + } + } + + @DisplayName("플레이어가 한명이라도 카드를 뽑을 수 있는 상태라면 isNotFinish 메서드는 true를 반환한다.") + @Test + fun isNotFinishReturnTrue() { + val dealer = Dealer() + val players = listOf(Player(), Player()) + + val blackjackGame = BlackjackGame(dealer, players) + val actual = blackjackGame.isNotFinished() + val expect = true + + actual shouldBe expect + } + + @DisplayName("플레이어가 모두 카드를 뽑을 수 없는 상태라면 isNotFinish 메서드는 false를 반환한다.") + @Test + fun isNotFinishReturnFalse() { + val dealer = Dealer() + val players = listOf(Player(), Player()) + val card = Card.of(CardSuit.DIAMOND, CardRank.KING) + players.forEach { it.addCards(listOf(card, card, card)) } + + val blackjackGame = BlackjackGame(dealer, players) + val actual = blackjackGame.isNotFinished() + val expect = false + + actual shouldBe expect + } +} diff --git a/src/test/kotlin/blackjack/PlayerTest.kt b/src/test/kotlin/blackjack/PlayerTest.kt index cf60806dcd..093d8af951 100644 --- a/src/test/kotlin/blackjack/PlayerTest.kt +++ b/src/test/kotlin/blackjack/PlayerTest.kt @@ -4,10 +4,12 @@ import blackjack.domain.Card import blackjack.domain.CardRank import blackjack.domain.CardSuit import blackjack.domain.Player +import io.kotest.inspectors.forAll import io.kotest.matchers.collections.shouldContain import io.kotest.matchers.shouldBe import org.junit.jupiter.api.DisplayName import org.junit.jupiter.api.Test +import kotlin.math.exp internal class PlayerTest { @@ -34,4 +36,54 @@ internal class PlayerTest { actual.cards.size shouldBe 1 actual.cards.shouldContain(card) } + + @DisplayName("플레이어는 손패의 합을 알 수 있다.(Ace 제외)") + @Test + fun sum() { + val testCases = listOf( + listOf( + Card.of(CardSuit.DIAMOND, CardRank.TWO), + Card.of(CardSuit.DIAMOND, CardRank.THREE), + ) to 5, + listOf( + Card.of(CardSuit.HEART, CardRank.FOUR), + Card.of(CardSuit.HEART, CardRank.FIVE), + Card.of(CardSuit.HEART, CardRank.KING), + ) to 19 + ) + + testCases.forAll { testCase -> + val player = Player() + player.addCards(testCase.first) + val actual = player.sum() + val expect = testCase.second + + actual shouldBe expect + } + } + + @DisplayName("플레이어의 canDraw 값은 카드 합이 21 이하면 true 초과면 false이다.") + @Test + fun canDraw() { + val testCases = listOf( + listOf( + Card.of(CardSuit.DIAMOND, CardRank.TWO), + Card.of(CardSuit.DIAMOND, CardRank.THREE), + ) to true, + listOf( + Card.of(CardSuit.HEART, CardRank.JACK), + Card.of(CardSuit.HEART, CardRank.QUEEN), + Card.of(CardSuit.HEART, CardRank.KING), + ) to false + ) + + testCases.forAll { testCase -> + val player = Player() + player.addCards(testCase.first) + val actual = player.canDraw + val expect = testCase.second + + actual shouldBe expect + } + } } From 99c6ddb3187734c3579ef5ccfd9bd66ca9d669fd Mon Sep 17 00:00:00 2001 From: ggam-nyang Date: Tue, 11 Jul 2023 00:51:55 +0900 Subject: [PATCH 16/22] =?UTF-8?q?feature:=20=ED=94=8C=EB=A0=88=EC=9D=B4?= =?UTF-8?q?=EC=96=B4=EB=8A=94=20=EC=B9=B4=EB=93=9C=20=EB=BD=91=EA=B8=B0?= =?UTF-8?q?=EB=A5=BC=20=EB=A9=88=EC=B6=9C=20=EC=88=98=20=EC=9E=88=EA=B3=A0?= =?UTF-8?q?,=20State=EB=A5=BC=20=EA=B0=80=EC=A7=84=EB=8B=A4?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- src/main/kotlin/blackjack/Client.kt | 8 +++--- src/main/kotlin/blackjack/README.md | 2 +- .../kotlin/blackjack/domain/BlackjackGame.kt | 2 +- src/main/kotlin/blackjack/domain/Player.kt | 9 +++++-- .../kotlin/blackjack/domain/PlayerState.kt | 7 ++++++ src/main/kotlin/blackjack/view/InputView.kt | 2 +- .../kotlin/blackjack/BlackjackGameTest.kt | 9 ++----- src/test/kotlin/blackjack/PlayerTest.kt | 25 ++++++++++++++----- 8 files changed, 43 insertions(+), 21 deletions(-) create mode 100644 src/main/kotlin/blackjack/domain/PlayerState.kt diff --git a/src/main/kotlin/blackjack/Client.kt b/src/main/kotlin/blackjack/Client.kt index 1a2ca18ec6..51d21a0076 100644 --- a/src/main/kotlin/blackjack/Client.kt +++ b/src/main/kotlin/blackjack/Client.kt @@ -2,6 +2,7 @@ package blackjack import blackjack.domain.BlackjackGame import blackjack.domain.Dealer +import blackjack.domain.PlayerState import blackjack.view.InputView import blackjack.view.OutputView @@ -13,9 +14,10 @@ fun main() { OutputView.printInitGame(blackJackGame) while (blackJackGame.isNotFinished()) { blackJackGame.players.forEach { player -> - if (player.canDraw) { - val inputDrawResponse = InputView.inputDrawResponse(player) - dealer.deal(player) + if (player.state == PlayerState.PLAYING) { + val inputDrawResponse = InputView.inputDrawResponse(player) + if (inputDrawResponse) dealer.deal(player) + else player.stopDraw() } } } diff --git a/src/main/kotlin/blackjack/README.md b/src/main/kotlin/blackjack/README.md index f682569141..dcb90f94bb 100644 --- a/src/main/kotlin/blackjack/README.md +++ b/src/main/kotlin/blackjack/README.md @@ -16,7 +16,7 @@ - [x] 게임 시작 시 플레이어의 이름을 입력할 수 있다. - [x] 게임 시작 시 플레이어의 카드를 출력한다. - [x] 게임 시작 후, 각 플레이어는 카드를 뽑을 지 선택할 수 있다. -- [ ] 플레이어는 카드를 뽑지 않을 수 있다. +- [ ] 플레이어는 카드를 뽑기를 멈출 수 있다. - [ ] 플레이어는 숫자 합이 21이 넘으면 카드를 뽑을 수 없다. - [ ] Ace는 숫자 합에 따라 1 또는 11로 계산할 수 있다. - [ ] 카드의 합이 21이하면서, 가까운 플레이어가 승리한다. diff --git a/src/main/kotlin/blackjack/domain/BlackjackGame.kt b/src/main/kotlin/blackjack/domain/BlackjackGame.kt index 4f8c855390..963fb1e255 100644 --- a/src/main/kotlin/blackjack/domain/BlackjackGame.kt +++ b/src/main/kotlin/blackjack/domain/BlackjackGame.kt @@ -16,7 +16,7 @@ class BlackjackGame( players.forEach { player -> dealer.deal(player) } } - fun isNotFinished(): Boolean = players.any { it.canDraw } + fun isNotFinished(): Boolean = players.any { it.state == PlayerState.PLAYING } companion object { private const val INIT_DEAL_COUNT = 2 diff --git a/src/main/kotlin/blackjack/domain/Player.kt b/src/main/kotlin/blackjack/domain/Player.kt index 7c9ca31f2d..4f2303964e 100644 --- a/src/main/kotlin/blackjack/domain/Player.kt +++ b/src/main/kotlin/blackjack/domain/Player.kt @@ -3,8 +3,11 @@ package blackjack.domain class Player( val name: String = "player" ) { - var canDraw: Boolean = true - get() = sum() <= 21 + var state: PlayerState = PlayerState.PLAYING + get() { + if (field == PlayerState.PLAYING && sum() > 21) field = PlayerState.BURST + return field + } private set private val _cards = mutableListOf() @@ -14,4 +17,6 @@ class Player( fun addCards(cards: List): Boolean = _cards.addAll(cards) fun addCard(card: Card): Boolean = _cards.add(card) fun sum(): Int = cards.sumOf { it.rank.value } + + fun stopDraw() { state = PlayerState.STOP } } diff --git a/src/main/kotlin/blackjack/domain/PlayerState.kt b/src/main/kotlin/blackjack/domain/PlayerState.kt new file mode 100644 index 0000000000..3fcde81075 --- /dev/null +++ b/src/main/kotlin/blackjack/domain/PlayerState.kt @@ -0,0 +1,7 @@ +package blackjack.domain + +enum class PlayerState { + PLAYING, + STOP, + BURST +} diff --git a/src/main/kotlin/blackjack/view/InputView.kt b/src/main/kotlin/blackjack/view/InputView.kt index fa425d6e14..ccc76076bb 100644 --- a/src/main/kotlin/blackjack/view/InputView.kt +++ b/src/main/kotlin/blackjack/view/InputView.kt @@ -5,7 +5,7 @@ import blackjack.domain.Player object InputView { private const val INPUT_PLAYERS_NAME = "게임에 참여할 사람의 이름을 입력하세요.(쉼표 기준으로 분리)" private val INPUT_DRAW_RESPONSE = - { playerName: String -> "${playerName}는 한장의 카드를 더 받겠습니까? (예는 y, 아니오는 n)" } + { playerName: String -> "${playerName}는 한장의 카드를 더 받겠습니까? (예는 y, 아니오는 n)" } fun inputPlayers(): List { val playerNames = inputPlayerNames() diff --git a/src/test/kotlin/blackjack/BlackjackGameTest.kt b/src/test/kotlin/blackjack/BlackjackGameTest.kt index 699341b0e4..004ab2fce7 100644 --- a/src/test/kotlin/blackjack/BlackjackGameTest.kt +++ b/src/test/kotlin/blackjack/BlackjackGameTest.kt @@ -1,9 +1,6 @@ package blackjack import blackjack.domain.BlackjackGame -import blackjack.domain.Card -import blackjack.domain.CardRank -import blackjack.domain.CardSuit import blackjack.domain.Dealer import blackjack.domain.Player import io.kotest.inspectors.forAll @@ -18,11 +15,10 @@ internal class BlackjackGameTest { private lateinit var blackjackGame: BlackjackGame @BeforeEach - fun beforeEach(){ + fun beforeEach() { dealer = Dealer() players = listOf(Player(), Player()) blackjackGame = BlackjackGame(dealer, players) - } @DisplayName("플레이어는 게임 시작 시 카드 두 장을 지급받는다.") @@ -58,8 +54,7 @@ internal class BlackjackGameTest { fun isNotFinishReturnFalse() { val dealer = Dealer() val players = listOf(Player(), Player()) - val card = Card.of(CardSuit.DIAMOND, CardRank.KING) - players.forEach { it.addCards(listOf(card, card, card)) } + players.forEach(Player::stopDraw) val blackjackGame = BlackjackGame(dealer, players) val actual = blackjackGame.isNotFinished() diff --git a/src/test/kotlin/blackjack/PlayerTest.kt b/src/test/kotlin/blackjack/PlayerTest.kt index 093d8af951..5ae77303ea 100644 --- a/src/test/kotlin/blackjack/PlayerTest.kt +++ b/src/test/kotlin/blackjack/PlayerTest.kt @@ -4,12 +4,12 @@ import blackjack.domain.Card import blackjack.domain.CardRank import blackjack.domain.CardSuit import blackjack.domain.Player +import blackjack.domain.PlayerState import io.kotest.inspectors.forAll import io.kotest.matchers.collections.shouldContain import io.kotest.matchers.shouldBe import org.junit.jupiter.api.DisplayName import org.junit.jupiter.api.Test -import kotlin.math.exp internal class PlayerTest { @@ -62,28 +62,41 @@ internal class PlayerTest { } } - @DisplayName("플레이어의 canDraw 값은 카드 합이 21 이하면 true 초과면 false이다.") + @DisplayName("플레이어의 playerState 값은 카드 합이 21 이하면 Playing 초과면 Burst이다.") @Test - fun canDraw() { + fun playerState() { val testCases = listOf( listOf( Card.of(CardSuit.DIAMOND, CardRank.TWO), Card.of(CardSuit.DIAMOND, CardRank.THREE), - ) to true, + ) to PlayerState.PLAYING, listOf( Card.of(CardSuit.HEART, CardRank.JACK), Card.of(CardSuit.HEART, CardRank.QUEEN), Card.of(CardSuit.HEART, CardRank.KING), - ) to false + ) to PlayerState.BURST ) testCases.forAll { testCase -> val player = Player() player.addCards(testCase.first) - val actual = player.canDraw + val actual = player.state val expect = testCase.second actual shouldBe expect } } + + @DisplayName("플레이어는 카드 뽑기를 멈추고 상태를 변경할 수 있다.") + @Test + fun stopDraw() { + val player = Player() + player.state shouldBe PlayerState.PLAYING + + player.stopDraw() + val actual = player.state + val expect = PlayerState.STOP + + actual shouldBe expect + } } From 53893026874a97ce16201e0b50523960fa7e491c Mon Sep 17 00:00:00 2001 From: ggam-nyang Date: Tue, 11 Jul 2023 01:16:10 +0900 Subject: [PATCH 17/22] =?UTF-8?q?refactor:=20=EB=8F=84=EB=A9=94=EC=9D=B8?= =?UTF-8?q?=20=ED=95=98=EC=9C=84=20=ED=8C=A8=ED=82=A4=EC=A7=80=20=EC=83=9D?= =?UTF-8?q?=EC=84=B1?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- src/main/kotlin/blackjack/README.md | 4 ++-- src/main/kotlin/blackjack/domain/Dealer.kt | 3 +++ src/main/kotlin/blackjack/domain/Player.kt | 2 ++ src/main/kotlin/blackjack/domain/{ => card}/Card.kt | 2 +- src/main/kotlin/blackjack/domain/{ => card}/CardDeck.kt | 2 +- src/main/kotlin/blackjack/domain/{ => card}/CardRank.kt | 2 +- src/main/kotlin/blackjack/domain/{ => card}/CardSuit.kt | 2 +- src/main/kotlin/blackjack/view/OutputView.kt | 2 +- src/test/kotlin/blackjack/DealerTest.kt | 2 +- src/test/kotlin/blackjack/PlayerTest.kt | 6 +++--- .../kotlin/blackjack/{ => domain/card}/CardDeckTest.kt | 8 ++++---- .../kotlin/blackjack/{ => domain/card}/CardRankTest.kt | 4 ++-- .../kotlin/blackjack/{ => domain/card}/CardSuitTest.kt | 4 ++-- src/test/kotlin/blackjack/{ => domain/card}/CardTest.kt | 5 +---- 14 files changed, 25 insertions(+), 23 deletions(-) rename src/main/kotlin/blackjack/domain/{ => card}/Card.kt (96%) rename src/main/kotlin/blackjack/domain/{ => card}/CardDeck.kt (86%) rename src/main/kotlin/blackjack/domain/{ => card}/CardRank.kt (90%) rename src/main/kotlin/blackjack/domain/{ => card}/CardSuit.kt (83%) rename src/test/kotlin/blackjack/{ => domain/card}/CardDeckTest.kt (73%) rename src/test/kotlin/blackjack/{ => domain/card}/CardRankTest.kt (91%) rename src/test/kotlin/blackjack/{ => domain/card}/CardSuitTest.kt (86%) rename src/test/kotlin/blackjack/{ => domain/card}/CardTest.kt (92%) diff --git a/src/main/kotlin/blackjack/README.md b/src/main/kotlin/blackjack/README.md index dcb90f94bb..ef9c5ddac7 100644 --- a/src/main/kotlin/blackjack/README.md +++ b/src/main/kotlin/blackjack/README.md @@ -16,8 +16,8 @@ - [x] 게임 시작 시 플레이어의 이름을 입력할 수 있다. - [x] 게임 시작 시 플레이어의 카드를 출력한다. - [x] 게임 시작 후, 각 플레이어는 카드를 뽑을 지 선택할 수 있다. -- [ ] 플레이어는 카드를 뽑기를 멈출 수 있다. -- [ ] 플레이어는 숫자 합이 21이 넘으면 카드를 뽑을 수 없다. +- [x] 플레이어는 카드를 뽑기를 멈출 수 있다. +- [x] 플레이어는 숫자 합이 21이 넘으면 카드를 뽑을 수 없다. - [ ] Ace는 숫자 합에 따라 1 또는 11로 계산할 수 있다. - [ ] 카드의 합이 21이하면서, 가까운 플레이어가 승리한다. diff --git a/src/main/kotlin/blackjack/domain/Dealer.kt b/src/main/kotlin/blackjack/domain/Dealer.kt index da029e7ecc..685c004180 100644 --- a/src/main/kotlin/blackjack/domain/Dealer.kt +++ b/src/main/kotlin/blackjack/domain/Dealer.kt @@ -1,5 +1,8 @@ package blackjack.domain +import blackjack.domain.card.Card +import blackjack.domain.card.CardDeck + class Dealer { val cardDeck: CardDeck = CardDeck() diff --git a/src/main/kotlin/blackjack/domain/Player.kt b/src/main/kotlin/blackjack/domain/Player.kt index 4f2303964e..305fb2c12b 100644 --- a/src/main/kotlin/blackjack/domain/Player.kt +++ b/src/main/kotlin/blackjack/domain/Player.kt @@ -1,5 +1,7 @@ package blackjack.domain +import blackjack.domain.card.Card + class Player( val name: String = "player" ) { diff --git a/src/main/kotlin/blackjack/domain/Card.kt b/src/main/kotlin/blackjack/domain/card/Card.kt similarity index 96% rename from src/main/kotlin/blackjack/domain/Card.kt rename to src/main/kotlin/blackjack/domain/card/Card.kt index cde4a47bfc..bef6c34451 100644 --- a/src/main/kotlin/blackjack/domain/Card.kt +++ b/src/main/kotlin/blackjack/domain/card/Card.kt @@ -1,4 +1,4 @@ -package blackjack.domain +package blackjack.domain.card class Card private constructor ( val suit: CardSuit, diff --git a/src/main/kotlin/blackjack/domain/CardDeck.kt b/src/main/kotlin/blackjack/domain/card/CardDeck.kt similarity index 86% rename from src/main/kotlin/blackjack/domain/CardDeck.kt rename to src/main/kotlin/blackjack/domain/card/CardDeck.kt index 1f942f64c9..df61bbbff8 100644 --- a/src/main/kotlin/blackjack/domain/CardDeck.kt +++ b/src/main/kotlin/blackjack/domain/card/CardDeck.kt @@ -1,4 +1,4 @@ -package blackjack.domain +package blackjack.domain.card class CardDeck { private val cards = diff --git a/src/main/kotlin/blackjack/domain/CardRank.kt b/src/main/kotlin/blackjack/domain/card/CardRank.kt similarity index 90% rename from src/main/kotlin/blackjack/domain/CardRank.kt rename to src/main/kotlin/blackjack/domain/card/CardRank.kt index 022090dc22..9af689b09e 100644 --- a/src/main/kotlin/blackjack/domain/CardRank.kt +++ b/src/main/kotlin/blackjack/domain/card/CardRank.kt @@ -1,4 +1,4 @@ -package blackjack.domain +package blackjack.domain.card enum class CardRank(val value: Int, val forOutput: String) { ACE(1, "A"), diff --git a/src/main/kotlin/blackjack/domain/CardSuit.kt b/src/main/kotlin/blackjack/domain/card/CardSuit.kt similarity index 83% rename from src/main/kotlin/blackjack/domain/CardSuit.kt rename to src/main/kotlin/blackjack/domain/card/CardSuit.kt index 619e74419f..c561205834 100644 --- a/src/main/kotlin/blackjack/domain/CardSuit.kt +++ b/src/main/kotlin/blackjack/domain/card/CardSuit.kt @@ -1,4 +1,4 @@ -package blackjack.domain +package blackjack.domain.card enum class CardSuit(val forOutput: String) { SPADE("스페이드"), diff --git a/src/main/kotlin/blackjack/view/OutputView.kt b/src/main/kotlin/blackjack/view/OutputView.kt index 714d631938..71f92688d6 100644 --- a/src/main/kotlin/blackjack/view/OutputView.kt +++ b/src/main/kotlin/blackjack/view/OutputView.kt @@ -1,7 +1,7 @@ package blackjack.view import blackjack.domain.BlackjackGame -import blackjack.domain.Card +import blackjack.domain.card.Card import blackjack.domain.Player object OutputView { diff --git a/src/test/kotlin/blackjack/DealerTest.kt b/src/test/kotlin/blackjack/DealerTest.kt index 02bd397741..f76a8b011a 100644 --- a/src/test/kotlin/blackjack/DealerTest.kt +++ b/src/test/kotlin/blackjack/DealerTest.kt @@ -1,6 +1,6 @@ package blackjack -import blackjack.domain.Card +import blackjack.domain.card.Card import blackjack.domain.Dealer import blackjack.domain.Player import io.kotest.matchers.nulls.shouldNotBeNull diff --git a/src/test/kotlin/blackjack/PlayerTest.kt b/src/test/kotlin/blackjack/PlayerTest.kt index 5ae77303ea..57bd98bc66 100644 --- a/src/test/kotlin/blackjack/PlayerTest.kt +++ b/src/test/kotlin/blackjack/PlayerTest.kt @@ -1,8 +1,8 @@ package blackjack -import blackjack.domain.Card -import blackjack.domain.CardRank -import blackjack.domain.CardSuit +import blackjack.domain.card.Card +import blackjack.domain.card.CardRank +import blackjack.domain.card.CardSuit import blackjack.domain.Player import blackjack.domain.PlayerState import io.kotest.inspectors.forAll diff --git a/src/test/kotlin/blackjack/CardDeckTest.kt b/src/test/kotlin/blackjack/domain/card/CardDeckTest.kt similarity index 73% rename from src/test/kotlin/blackjack/CardDeckTest.kt rename to src/test/kotlin/blackjack/domain/card/CardDeckTest.kt index f85b3fd3d8..fa49a1ebf3 100644 --- a/src/test/kotlin/blackjack/CardDeckTest.kt +++ b/src/test/kotlin/blackjack/domain/card/CardDeckTest.kt @@ -1,8 +1,8 @@ -package blackjack +package blackjack.domain.card -import blackjack.domain.CardDeck -import blackjack.domain.CardRank -import blackjack.domain.CardSuit +import blackjack.domain.card.CardDeck +import blackjack.domain.card.CardRank +import blackjack.domain.card.CardSuit import io.kotest.matchers.shouldBe import org.junit.jupiter.api.DisplayName import org.junit.jupiter.api.Test diff --git a/src/test/kotlin/blackjack/CardRankTest.kt b/src/test/kotlin/blackjack/domain/card/CardRankTest.kt similarity index 91% rename from src/test/kotlin/blackjack/CardRankTest.kt rename to src/test/kotlin/blackjack/domain/card/CardRankTest.kt index 91e8b629e9..49adfeb162 100644 --- a/src/test/kotlin/blackjack/CardRankTest.kt +++ b/src/test/kotlin/blackjack/domain/card/CardRankTest.kt @@ -1,6 +1,6 @@ -package blackjack +package blackjack.domain.card -import blackjack.domain.CardRank +import blackjack.domain.card.CardRank import io.kotest.matchers.collections.shouldContainAll import io.kotest.matchers.shouldBe import org.junit.jupiter.api.DisplayName diff --git a/src/test/kotlin/blackjack/CardSuitTest.kt b/src/test/kotlin/blackjack/domain/card/CardSuitTest.kt similarity index 86% rename from src/test/kotlin/blackjack/CardSuitTest.kt rename to src/test/kotlin/blackjack/domain/card/CardSuitTest.kt index d975de65fe..29aef5a6a2 100644 --- a/src/test/kotlin/blackjack/CardSuitTest.kt +++ b/src/test/kotlin/blackjack/domain/card/CardSuitTest.kt @@ -1,6 +1,6 @@ -package blackjack +package blackjack.domain.card -import blackjack.domain.CardSuit +import blackjack.domain.card.CardSuit import io.kotest.matchers.shouldBe import org.junit.jupiter.api.DisplayName import org.junit.jupiter.api.Test diff --git a/src/test/kotlin/blackjack/CardTest.kt b/src/test/kotlin/blackjack/domain/card/CardTest.kt similarity index 92% rename from src/test/kotlin/blackjack/CardTest.kt rename to src/test/kotlin/blackjack/domain/card/CardTest.kt index 6220f436f4..a970fbcd4f 100644 --- a/src/test/kotlin/blackjack/CardTest.kt +++ b/src/test/kotlin/blackjack/domain/card/CardTest.kt @@ -1,8 +1,5 @@ -package blackjack +package blackjack.domain.card -import blackjack.domain.Card -import blackjack.domain.CardRank -import blackjack.domain.CardSuit import io.kotest.inspectors.forAll import io.kotest.matchers.shouldBe import org.junit.jupiter.api.DisplayName From 5339816c0ef832ede0fb828b8f6420abf5002488 Mon Sep 17 00:00:00 2001 From: ggam-nyang Date: Tue, 11 Jul 2023 01:38:59 +0900 Subject: [PATCH 18/22] =?UTF-8?q?refactor:=20=EC=B9=B4=EB=93=9C=EB=A5=BC?= =?UTF-8?q?=20=EB=BD=91=EC=9D=84=20=EB=95=8C=EB=A7=88=EB=8B=A4=20=ED=98=84?= =?UTF-8?q?=EC=9E=AC=20=EC=86=90=ED=8C=A8=EB=A5=BC=20=EC=B6=9C=EB=A0=A5?= =?UTF-8?q?=ED=95=9C=EB=8B=A4.?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- src/main/kotlin/blackjack/Client.kt | 5 ++++- src/main/kotlin/blackjack/view/OutputView.kt | 2 +- 2 files changed, 5 insertions(+), 2 deletions(-) diff --git a/src/main/kotlin/blackjack/Client.kt b/src/main/kotlin/blackjack/Client.kt index 51d21a0076..bc8fdcf61e 100644 --- a/src/main/kotlin/blackjack/Client.kt +++ b/src/main/kotlin/blackjack/Client.kt @@ -16,7 +16,10 @@ fun main() { blackJackGame.players.forEach { player -> if (player.state == PlayerState.PLAYING) { val inputDrawResponse = InputView.inputDrawResponse(player) - if (inputDrawResponse) dealer.deal(player) + if (inputDrawResponse) { + dealer.deal(player) + OutputView.printCardsInHand(player) + } else player.stopDraw() } } diff --git a/src/main/kotlin/blackjack/view/OutputView.kt b/src/main/kotlin/blackjack/view/OutputView.kt index 71f92688d6..61b0bf766c 100644 --- a/src/main/kotlin/blackjack/view/OutputView.kt +++ b/src/main/kotlin/blackjack/view/OutputView.kt @@ -15,7 +15,7 @@ object OutputView { println(blackJackGame.players.joinToString(transform = Player::name) + "에게 2장의 카드를 나누었습니다.") } - private fun printCardsInHand(player: Player) { + fun printCardsInHand(player: Player) { print("${player.name}카드: ") println(player.cards.joinToString(transform = Card::print)) } From 7056b8d96a2a64f956a785bc3b9c95beae356da2 Mon Sep 17 00:00:00 2001 From: ggam-nyang Date: Fri, 14 Jul 2023 15:28:27 +0900 Subject: [PATCH 19/22] =?UTF-8?q?refactor:=20blackjackGame=20=EA=B2=8C?= =?UTF-8?q?=EC=9E=84=20=EC=8B=9C=EC=9E=91=20=EB=A1=9C=EC=A7=81=EC=9D=84=20?= =?UTF-8?q?start=20=EB=A9=94=EC=84=9C=EB=93=9C=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 --- src/main/kotlin/blackjack/Client.kt | 13 +------------ .../kotlin/blackjack/domain/BlackjackGame.kt | 18 ++++++++++++++++++ 2 files changed, 19 insertions(+), 12 deletions(-) diff --git a/src/main/kotlin/blackjack/Client.kt b/src/main/kotlin/blackjack/Client.kt index bc8fdcf61e..ff4838aac0 100644 --- a/src/main/kotlin/blackjack/Client.kt +++ b/src/main/kotlin/blackjack/Client.kt @@ -12,16 +12,5 @@ fun main() { val blackJackGame = BlackjackGame(dealer, players) OutputView.printInitGame(blackJackGame) - while (blackJackGame.isNotFinished()) { - blackJackGame.players.forEach { player -> - if (player.state == PlayerState.PLAYING) { - val inputDrawResponse = InputView.inputDrawResponse(player) - if (inputDrawResponse) { - dealer.deal(player) - OutputView.printCardsInHand(player) - } - else player.stopDraw() - } - } - } + blackJackGame.start() } diff --git a/src/main/kotlin/blackjack/domain/BlackjackGame.kt b/src/main/kotlin/blackjack/domain/BlackjackGame.kt index 963fb1e255..34c9d62f27 100644 --- a/src/main/kotlin/blackjack/domain/BlackjackGame.kt +++ b/src/main/kotlin/blackjack/domain/BlackjackGame.kt @@ -1,5 +1,8 @@ package blackjack.domain +import blackjack.view.InputView +import blackjack.view.OutputView + class BlackjackGame( private val dealer: Dealer, val players: List @@ -18,6 +21,21 @@ class BlackjackGame( fun isNotFinished(): Boolean = players.any { it.state == PlayerState.PLAYING } + fun start() { + while (isNotFinished()) { + players.forEach { player -> + if (player.state == PlayerState.PLAYING) { + val inputDrawResponse = InputView.inputDrawResponse(player) + if (inputDrawResponse) { + dealer.deal(player) + OutputView.printCardsInHand(player) + } + else player.stopDraw() + } + } + } + } + companion object { private const val INIT_DEAL_COUNT = 2 } From 715b3d4ba6ae7872fca3a59d834871149826b57a Mon Sep 17 00:00:00 2001 From: ggam-nyang Date: Fri, 14 Jul 2023 15:35:34 +0900 Subject: [PATCH 20/22] =?UTF-8?q?feature:=20Ace=EB=8A=94=201=20=EB=98=90?= =?UTF-8?q?=EB=8A=94=2010=EC=9C=BC=EB=A1=9C=20=EA=B3=84=EC=82=B0=EB=90=9C?= =?UTF-8?q?=EB=8B=A4?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- src/main/kotlin/blackjack/Client.kt | 1 - src/main/kotlin/blackjack/README.md | 2 +- .../kotlin/blackjack/domain/BlackjackGame.kt | 3 +- src/main/kotlin/blackjack/domain/Player.kt | 8 ++++- src/main/kotlin/blackjack/view/OutputView.kt | 2 +- src/test/kotlin/blackjack/DealerTest.kt | 2 +- src/test/kotlin/blackjack/PlayerTest.kt | 33 +++++++++++++++++-- .../blackjack/domain/card/CardDeckTest.kt | 3 -- .../blackjack/domain/card/CardRankTest.kt | 1 - .../blackjack/domain/card/CardSuitTest.kt | 1 - 10 files changed, 42 insertions(+), 14 deletions(-) diff --git a/src/main/kotlin/blackjack/Client.kt b/src/main/kotlin/blackjack/Client.kt index ff4838aac0..d809ab316a 100644 --- a/src/main/kotlin/blackjack/Client.kt +++ b/src/main/kotlin/blackjack/Client.kt @@ -2,7 +2,6 @@ package blackjack import blackjack.domain.BlackjackGame import blackjack.domain.Dealer -import blackjack.domain.PlayerState import blackjack.view.InputView import blackjack.view.OutputView diff --git a/src/main/kotlin/blackjack/README.md b/src/main/kotlin/blackjack/README.md index ef9c5ddac7..fc6b070ceb 100644 --- a/src/main/kotlin/blackjack/README.md +++ b/src/main/kotlin/blackjack/README.md @@ -18,7 +18,7 @@ - [x] 게임 시작 후, 각 플레이어는 카드를 뽑을 지 선택할 수 있다. - [x] 플레이어는 카드를 뽑기를 멈출 수 있다. - [x] 플레이어는 숫자 합이 21이 넘으면 카드를 뽑을 수 없다. -- [ ] Ace는 숫자 합에 따라 1 또는 11로 계산할 수 있다. +- [x] Ace는 숫자 합에 따라 1 또는 11로 계산할 수 있다. - [ ] 카드의 합이 21이하면서, 가까운 플레이어가 승리한다. ### 기능 요구사항 diff --git a/src/main/kotlin/blackjack/domain/BlackjackGame.kt b/src/main/kotlin/blackjack/domain/BlackjackGame.kt index 34c9d62f27..3459ef7351 100644 --- a/src/main/kotlin/blackjack/domain/BlackjackGame.kt +++ b/src/main/kotlin/blackjack/domain/BlackjackGame.kt @@ -29,8 +29,7 @@ class BlackjackGame( if (inputDrawResponse) { dealer.deal(player) OutputView.printCardsInHand(player) - } - else player.stopDraw() + } else player.stopDraw() } } } diff --git a/src/main/kotlin/blackjack/domain/Player.kt b/src/main/kotlin/blackjack/domain/Player.kt index 305fb2c12b..e63fd651ef 100644 --- a/src/main/kotlin/blackjack/domain/Player.kt +++ b/src/main/kotlin/blackjack/domain/Player.kt @@ -1,6 +1,7 @@ package blackjack.domain import blackjack.domain.card.Card +import blackjack.domain.card.CardRank class Player( val name: String = "player" @@ -18,7 +19,12 @@ class Player( fun addCards(cards: List): Boolean = _cards.addAll(cards) fun addCard(card: Card): Boolean = _cards.add(card) - fun sum(): Int = cards.sumOf { it.rank.value } + fun sum(): Int { + val hasAce = cards.any { it.rank == CardRank.ACE } + val sum = cards.sumOf { it.rank.value } + + return if (hasAce && sum + 10 <= 21) sum + 10 else sum + } fun stopDraw() { state = PlayerState.STOP } } diff --git a/src/main/kotlin/blackjack/view/OutputView.kt b/src/main/kotlin/blackjack/view/OutputView.kt index 61b0bf766c..fa3f1080e5 100644 --- a/src/main/kotlin/blackjack/view/OutputView.kt +++ b/src/main/kotlin/blackjack/view/OutputView.kt @@ -1,8 +1,8 @@ package blackjack.view import blackjack.domain.BlackjackGame -import blackjack.domain.card.Card import blackjack.domain.Player +import blackjack.domain.card.Card object OutputView { diff --git a/src/test/kotlin/blackjack/DealerTest.kt b/src/test/kotlin/blackjack/DealerTest.kt index f76a8b011a..9ccfd265bc 100644 --- a/src/test/kotlin/blackjack/DealerTest.kt +++ b/src/test/kotlin/blackjack/DealerTest.kt @@ -1,8 +1,8 @@ package blackjack -import blackjack.domain.card.Card import blackjack.domain.Dealer import blackjack.domain.Player +import blackjack.domain.card.Card import io.kotest.matchers.nulls.shouldNotBeNull import io.kotest.matchers.shouldBe import io.kotest.matchers.types.shouldBeTypeOf diff --git a/src/test/kotlin/blackjack/PlayerTest.kt b/src/test/kotlin/blackjack/PlayerTest.kt index 57bd98bc66..bf25d48804 100644 --- a/src/test/kotlin/blackjack/PlayerTest.kt +++ b/src/test/kotlin/blackjack/PlayerTest.kt @@ -1,10 +1,10 @@ package blackjack +import blackjack.domain.Player +import blackjack.domain.PlayerState import blackjack.domain.card.Card import blackjack.domain.card.CardRank import blackjack.domain.card.CardSuit -import blackjack.domain.Player -import blackjack.domain.PlayerState import io.kotest.inspectors.forAll import io.kotest.matchers.collections.shouldContain import io.kotest.matchers.shouldBe @@ -62,6 +62,35 @@ internal class PlayerTest { } } + @DisplayName("sum 메서드는 Ace를 1 또는 11로 계산한다.") + @Test + fun sumAce() { + val testCases = listOf( + listOf( + Card.of(CardSuit.DIAMOND, CardRank.ACE), + Card.of(CardSuit.DIAMOND, CardRank.THREE), + ) to 14, + listOf( + Card.of(CardSuit.HEART, CardRank.ACE), + Card.of(CardSuit.HEART, CardRank.KING), + ) to 21, + listOf( + Card.of(CardSuit.HEART, CardRank.ACE), + Card.of(CardSuit.HEART, CardRank.FIVE), + Card.of(CardSuit.HEART, CardRank.KING), + ) to 16, + ) + + testCases.forAll { testCase -> + val player = Player() + player.addCards(testCase.first) + val actual = player.sum() + val expect = testCase.second + + actual shouldBe expect + } + } + @DisplayName("플레이어의 playerState 값은 카드 합이 21 이하면 Playing 초과면 Burst이다.") @Test fun playerState() { diff --git a/src/test/kotlin/blackjack/domain/card/CardDeckTest.kt b/src/test/kotlin/blackjack/domain/card/CardDeckTest.kt index fa49a1ebf3..d27de9fadf 100644 --- a/src/test/kotlin/blackjack/domain/card/CardDeckTest.kt +++ b/src/test/kotlin/blackjack/domain/card/CardDeckTest.kt @@ -1,8 +1,5 @@ package blackjack.domain.card -import blackjack.domain.card.CardDeck -import blackjack.domain.card.CardRank -import blackjack.domain.card.CardSuit import io.kotest.matchers.shouldBe import org.junit.jupiter.api.DisplayName import org.junit.jupiter.api.Test diff --git a/src/test/kotlin/blackjack/domain/card/CardRankTest.kt b/src/test/kotlin/blackjack/domain/card/CardRankTest.kt index 49adfeb162..bb428010bb 100644 --- a/src/test/kotlin/blackjack/domain/card/CardRankTest.kt +++ b/src/test/kotlin/blackjack/domain/card/CardRankTest.kt @@ -1,6 +1,5 @@ package blackjack.domain.card -import blackjack.domain.card.CardRank import io.kotest.matchers.collections.shouldContainAll import io.kotest.matchers.shouldBe import org.junit.jupiter.api.DisplayName diff --git a/src/test/kotlin/blackjack/domain/card/CardSuitTest.kt b/src/test/kotlin/blackjack/domain/card/CardSuitTest.kt index 29aef5a6a2..ad4b54a556 100644 --- a/src/test/kotlin/blackjack/domain/card/CardSuitTest.kt +++ b/src/test/kotlin/blackjack/domain/card/CardSuitTest.kt @@ -1,6 +1,5 @@ package blackjack.domain.card -import blackjack.domain.card.CardSuit import io.kotest.matchers.shouldBe import org.junit.jupiter.api.DisplayName import org.junit.jupiter.api.Test From fd9a249c770e6746ba06c51c51fcfcf68af6e0ba Mon Sep 17 00:00:00 2001 From: ggam-nyang Date: Fri, 14 Jul 2023 15:44:33 +0900 Subject: [PATCH 21/22] =?UTF-8?q?feature:=20=EA=B2=B0=EA=B3=BC=20=EC=B6=9C?= =?UTF-8?q?=EB=A0=A5=20=EC=B6=94=EA=B0=80?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- src/main/kotlin/blackjack/Client.kt | 1 + src/main/kotlin/blackjack/README.md | 2 +- .../kotlin/blackjack/domain/BlackjackGame.kt | 2 +- src/main/kotlin/blackjack/view/OutputView.kt | 18 +++++++++++++++--- 4 files changed, 18 insertions(+), 5 deletions(-) diff --git a/src/main/kotlin/blackjack/Client.kt b/src/main/kotlin/blackjack/Client.kt index d809ab316a..8414d9d84c 100644 --- a/src/main/kotlin/blackjack/Client.kt +++ b/src/main/kotlin/blackjack/Client.kt @@ -12,4 +12,5 @@ fun main() { OutputView.printInitGame(blackJackGame) blackJackGame.start() + OutputView.printResult(blackJackGame.players) } diff --git a/src/main/kotlin/blackjack/README.md b/src/main/kotlin/blackjack/README.md index fc6b070ceb..8c0c19b629 100644 --- a/src/main/kotlin/blackjack/README.md +++ b/src/main/kotlin/blackjack/README.md @@ -19,7 +19,7 @@ - [x] 플레이어는 카드를 뽑기를 멈출 수 있다. - [x] 플레이어는 숫자 합이 21이 넘으면 카드를 뽑을 수 없다. - [x] Ace는 숫자 합에 따라 1 또는 11로 계산할 수 있다. -- [ ] 카드의 합이 21이하면서, 가까운 플레이어가 승리한다. +- [x] 각 플레이어의 결과를 출력할 수 있다. ### 기능 요구사항 - 카드의 숫자 계산은 카드 숫자를 기본으로 하며, 예외로 Ace는 1 또는 11로 계산할 수 있으며 diff --git a/src/main/kotlin/blackjack/domain/BlackjackGame.kt b/src/main/kotlin/blackjack/domain/BlackjackGame.kt index 3459ef7351..8e7e7f2e1e 100644 --- a/src/main/kotlin/blackjack/domain/BlackjackGame.kt +++ b/src/main/kotlin/blackjack/domain/BlackjackGame.kt @@ -28,7 +28,7 @@ class BlackjackGame( val inputDrawResponse = InputView.inputDrawResponse(player) if (inputDrawResponse) { dealer.deal(player) - OutputView.printCardsInHand(player) + OutputView.printCardsInHandWithEmptyLine(player) } else player.stopDraw() } } diff --git a/src/main/kotlin/blackjack/view/OutputView.kt b/src/main/kotlin/blackjack/view/OutputView.kt index fa3f1080e5..30eb8c23f5 100644 --- a/src/main/kotlin/blackjack/view/OutputView.kt +++ b/src/main/kotlin/blackjack/view/OutputView.kt @@ -8,15 +8,27 @@ object OutputView { fun printInitGame(blackJackGame: BlackjackGame) { printPlayersName(blackJackGame) - blackJackGame.players.forEach { player -> printCardsInHand(player) } + blackJackGame.players.forEach { player -> printCardsInHandWithEmptyLine(player) } } private fun printPlayersName(blackJackGame: BlackjackGame) { println(blackJackGame.players.joinToString(transform = Player::name) + "에게 2장의 카드를 나누었습니다.") } - fun printCardsInHand(player: Player) { + fun printCardsInHandWithEmptyLine(player: Player) { + printPlayerCards(player) + println() + } + + private fun printPlayerCards(player: Player) { print("${player.name}카드: ") - println(player.cards.joinToString(transform = Card::print)) + print(player.cards.joinToString(transform = Card::print)) + } + + fun printResult(players: List) { + players.forEach { player -> + printPlayerCards(player) + println(" - 결과: ${player.sum()}") + } } } From 09664a441b2860e53cf7d6db3ee25b2a479e6ea1 Mon Sep 17 00:00:00 2001 From: ggam-nyang Date: Wed, 2 Aug 2023 01:58:38 +0900 Subject: [PATCH 22/22] =?UTF-8?q?refactor:=20=ED=8C=A8=ED=82=A4=EC=A7=80?= =?UTF-8?q?=20=EA=B5=AC=EC=A1=B0=20=EB=B3=80=EA=B2=BD?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- src/main/kotlin/blackjack/Client.kt | 2 +- src/main/kotlin/blackjack/domain/BlackjackGame.kt | 3 +++ src/main/kotlin/blackjack/domain/{ => player}/Dealer.kt | 2 +- src/main/kotlin/blackjack/domain/{ => player}/Player.kt | 3 ++- .../kotlin/blackjack/domain/{ => state}/PlayerState.kt | 2 +- src/main/kotlin/blackjack/view/InputView.kt | 2 +- src/main/kotlin/blackjack/view/OutputView.kt | 2 +- .../kotlin/blackjack/{ => domain}/BlackjackGameTest.kt | 7 +++---- .../kotlin/blackjack/{ => domain/player}/DealerTest.kt | 6 +++--- .../kotlin/blackjack/{ => domain/player}/PlayerTest.kt | 5 ++--- 10 files changed, 18 insertions(+), 16 deletions(-) rename src/main/kotlin/blackjack/domain/{ => player}/Dealer.kt (89%) rename src/main/kotlin/blackjack/domain/{ => player}/Player.kt (91%) rename src/main/kotlin/blackjack/domain/{ => state}/PlayerState.kt (66%) rename src/test/kotlin/blackjack/{ => domain}/BlackjackGameTest.kt (94%) rename src/test/kotlin/blackjack/{ => domain/player}/DealerTest.kt (92%) rename src/test/kotlin/blackjack/{ => domain/player}/PlayerTest.kt (97%) diff --git a/src/main/kotlin/blackjack/Client.kt b/src/main/kotlin/blackjack/Client.kt index 8414d9d84c..376a4dd880 100644 --- a/src/main/kotlin/blackjack/Client.kt +++ b/src/main/kotlin/blackjack/Client.kt @@ -1,7 +1,7 @@ package blackjack import blackjack.domain.BlackjackGame -import blackjack.domain.Dealer +import blackjack.domain.player.Dealer import blackjack.view.InputView import blackjack.view.OutputView diff --git a/src/main/kotlin/blackjack/domain/BlackjackGame.kt b/src/main/kotlin/blackjack/domain/BlackjackGame.kt index 8e7e7f2e1e..8c358d15b0 100644 --- a/src/main/kotlin/blackjack/domain/BlackjackGame.kt +++ b/src/main/kotlin/blackjack/domain/BlackjackGame.kt @@ -1,5 +1,8 @@ package blackjack.domain +import blackjack.domain.player.Dealer +import blackjack.domain.player.Player +import blackjack.domain.state.PlayerState import blackjack.view.InputView import blackjack.view.OutputView diff --git a/src/main/kotlin/blackjack/domain/Dealer.kt b/src/main/kotlin/blackjack/domain/player/Dealer.kt similarity index 89% rename from src/main/kotlin/blackjack/domain/Dealer.kt rename to src/main/kotlin/blackjack/domain/player/Dealer.kt index 685c004180..95a5da1154 100644 --- a/src/main/kotlin/blackjack/domain/Dealer.kt +++ b/src/main/kotlin/blackjack/domain/player/Dealer.kt @@ -1,4 +1,4 @@ -package blackjack.domain +package blackjack.domain.player import blackjack.domain.card.Card import blackjack.domain.card.CardDeck diff --git a/src/main/kotlin/blackjack/domain/Player.kt b/src/main/kotlin/blackjack/domain/player/Player.kt similarity index 91% rename from src/main/kotlin/blackjack/domain/Player.kt rename to src/main/kotlin/blackjack/domain/player/Player.kt index e63fd651ef..f038289ee4 100644 --- a/src/main/kotlin/blackjack/domain/Player.kt +++ b/src/main/kotlin/blackjack/domain/player/Player.kt @@ -1,7 +1,8 @@ -package blackjack.domain +package blackjack.domain.player import blackjack.domain.card.Card import blackjack.domain.card.CardRank +import blackjack.domain.state.PlayerState class Player( val name: String = "player" diff --git a/src/main/kotlin/blackjack/domain/PlayerState.kt b/src/main/kotlin/blackjack/domain/state/PlayerState.kt similarity index 66% rename from src/main/kotlin/blackjack/domain/PlayerState.kt rename to src/main/kotlin/blackjack/domain/state/PlayerState.kt index 3fcde81075..e44a0cce9c 100644 --- a/src/main/kotlin/blackjack/domain/PlayerState.kt +++ b/src/main/kotlin/blackjack/domain/state/PlayerState.kt @@ -1,4 +1,4 @@ -package blackjack.domain +package blackjack.domain.state enum class PlayerState { PLAYING, diff --git a/src/main/kotlin/blackjack/view/InputView.kt b/src/main/kotlin/blackjack/view/InputView.kt index ccc76076bb..07820543f4 100644 --- a/src/main/kotlin/blackjack/view/InputView.kt +++ b/src/main/kotlin/blackjack/view/InputView.kt @@ -1,6 +1,6 @@ package blackjack.view -import blackjack.domain.Player +import blackjack.domain.player.Player object InputView { private const val INPUT_PLAYERS_NAME = "게임에 참여할 사람의 이름을 입력하세요.(쉼표 기준으로 분리)" diff --git a/src/main/kotlin/blackjack/view/OutputView.kt b/src/main/kotlin/blackjack/view/OutputView.kt index 30eb8c23f5..987b5b6ce8 100644 --- a/src/main/kotlin/blackjack/view/OutputView.kt +++ b/src/main/kotlin/blackjack/view/OutputView.kt @@ -1,7 +1,7 @@ package blackjack.view import blackjack.domain.BlackjackGame -import blackjack.domain.Player +import blackjack.domain.player.Player import blackjack.domain.card.Card object OutputView { diff --git a/src/test/kotlin/blackjack/BlackjackGameTest.kt b/src/test/kotlin/blackjack/domain/BlackjackGameTest.kt similarity index 94% rename from src/test/kotlin/blackjack/BlackjackGameTest.kt rename to src/test/kotlin/blackjack/domain/BlackjackGameTest.kt index 004ab2fce7..ec9b1cedb9 100644 --- a/src/test/kotlin/blackjack/BlackjackGameTest.kt +++ b/src/test/kotlin/blackjack/domain/BlackjackGameTest.kt @@ -1,8 +1,7 @@ -package blackjack +package blackjack.domain -import blackjack.domain.BlackjackGame -import blackjack.domain.Dealer -import blackjack.domain.Player +import blackjack.domain.player.Dealer +import blackjack.domain.player.Player import io.kotest.inspectors.forAll import io.kotest.matchers.shouldBe import org.junit.jupiter.api.BeforeEach diff --git a/src/test/kotlin/blackjack/DealerTest.kt b/src/test/kotlin/blackjack/domain/player/DealerTest.kt similarity index 92% rename from src/test/kotlin/blackjack/DealerTest.kt rename to src/test/kotlin/blackjack/domain/player/DealerTest.kt index 9ccfd265bc..b52d2c6860 100644 --- a/src/test/kotlin/blackjack/DealerTest.kt +++ b/src/test/kotlin/blackjack/domain/player/DealerTest.kt @@ -1,7 +1,7 @@ -package blackjack +package blackjack.domain.player -import blackjack.domain.Dealer -import blackjack.domain.Player +import blackjack.domain.player.Dealer +import blackjack.domain.player.Player import blackjack.domain.card.Card import io.kotest.matchers.nulls.shouldNotBeNull import io.kotest.matchers.shouldBe diff --git a/src/test/kotlin/blackjack/PlayerTest.kt b/src/test/kotlin/blackjack/domain/player/PlayerTest.kt similarity index 97% rename from src/test/kotlin/blackjack/PlayerTest.kt rename to src/test/kotlin/blackjack/domain/player/PlayerTest.kt index bf25d48804..bf9e60cc60 100644 --- a/src/test/kotlin/blackjack/PlayerTest.kt +++ b/src/test/kotlin/blackjack/domain/player/PlayerTest.kt @@ -1,7 +1,6 @@ -package blackjack +package blackjack.domain.player -import blackjack.domain.Player -import blackjack.domain.PlayerState +import blackjack.domain.state.PlayerState import blackjack.domain.card.Card import blackjack.domain.card.CardRank import blackjack.domain.card.CardSuit