From aabf9e42c2393e7820d724de1d91368041564ddc Mon Sep 17 00:00:00 2001 From: OYJ Date: Wed, 22 Nov 2023 02:30:25 +0900 Subject: [PATCH 01/54] =?UTF-8?q?Refactor:=20Skills,=20Language=EC=9D=98?= =?UTF-8?q?=20builder=EB=A5=BC=20=EC=82=AC=EC=9A=A9=ED=95=98=EC=97=AC=20?= =?UTF-8?q?=EA=B0=80=EB=8F=85=EC=84=B1=20=ED=96=A5=EC=83=81?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- src/test/kotlin/DslTest.kt | 70 ++++++++--------------- src/test/kotlin/study/LanguagesBuilder.kt | 2 +- 2 files changed, 25 insertions(+), 47 deletions(-) diff --git a/src/test/kotlin/DslTest.kt b/src/test/kotlin/DslTest.kt index 17b51ca1b1..1d92675cd3 100644 --- a/src/test/kotlin/DslTest.kt +++ b/src/test/kotlin/DslTest.kt @@ -1,5 +1,3 @@ -import io.kotest.matchers.shouldBe -import org.intellij.lang.annotations.Language import org.junit.jupiter.api.Test import org.junit.jupiter.params.ParameterizedTest import org.junit.jupiter.params.provider.ValueSource @@ -31,44 +29,20 @@ class DslTest { val person = introduce { name(name) company("블루버드") - softSkill("A passion for problem solving") - softSkill("Good communication skills") - hardSkill("Kotlin") - language("Korean" to 5) - language("English" to 3) + skills(introduceSkill { + softSkills("A passion for problem solving") + softSkills("Good communication skills") + hardSkills("Kotlin") + }) + language(introduceLanguage { + language("Korean" to 5) + language("English" to 3) + }) } - person.name shouldBe name - person.company shouldBe "블루버드" - person.skills shouldBe Skills( - listOf("A passion for problem solving", "Good communication skills"), - listOf("Kotlin") - ) println(person) } - @Test - fun company() { - val person = introduce { - name("홍길동") - company("활빈당") - } - person.name shouldBe "홍길동" - person.company shouldBe "활빈당" - } - - @Test - fun skills() { - val skills = Skills( - softSkill = listOf("A passion for problem solving", "Good communication skills"), - hardSkill = listOf("Kotlin") - ) - val softExpect = listOf("A passion for problem solving", "Good communication skills") - val hardExpect = listOf("Kotlin") - skills.softSkill shouldBe softExpect - skills.hardSkill shouldBe hardExpect - } - @Test fun pair() { val pair1 = Pair(1, "one") @@ -79,6 +53,14 @@ class DslTest { private infix fun Int.of(s: String): Pair = Pair(this, s) } +fun introduceLanguage(block: LanguagesBuilder.() -> Unit): Languages { + return LanguagesBuilder().apply(block).build() +} + +fun introduceSkill(block: SkillsBuilder.() -> Unit): Skills { + return SkillsBuilder().apply(block).build() +} + fun introduce(block: PersonBuilder.() -> Unit): Person { return PersonBuilder().apply(block).build() } @@ -86,8 +68,8 @@ fun introduce(block: PersonBuilder.() -> Unit): Person { class PersonBuilder { private lateinit var name: String private var company: String? = null - private val skills = SkillsBuilder() - private val languages = LanguagesBuilder() + private lateinit var skills: Skills + private lateinit var languages: Languages fun name(value: String) { name = value } @@ -96,20 +78,16 @@ class PersonBuilder { company = value } - fun softSkill(value: String) { - skills.softSkills(value) - } - - fun hardSkill(value: String) { - skills.hardSkills(value) + fun skills(skill: Skills) { + skills = skill } - fun language(language: Pair) { - languages.addLanguages(language) + fun language(language: Languages) { + languages = language } fun build(): Person { - return Person(name, company, skills.build(), languages.build()) + return Person(name, company, skills, languages) } } diff --git a/src/test/kotlin/study/LanguagesBuilder.kt b/src/test/kotlin/study/LanguagesBuilder.kt index 294acc16fc..e22ee9a186 100644 --- a/src/test/kotlin/study/LanguagesBuilder.kt +++ b/src/test/kotlin/study/LanguagesBuilder.kt @@ -5,7 +5,7 @@ class LanguagesBuilder { val languages: List> get() = _languages - fun addLanguages(language: Pair) { + fun language(language: Pair) { _languages.add(language) } From 67bf9ca67db0074a102c400b92b43c0c77774bc8 Mon Sep 17 00:00:00 2001 From: OYJ Date: Thu, 23 Nov 2023 22:29:10 +0900 Subject: [PATCH 02/54] =?UTF-8?q?Docs:=20=EA=B8=B0=EB=8A=A5=20=EB=AA=A9?= =?UTF-8?q?=EB=A1=9D=20=EC=B4=88=EA=B8=B0=20=EA=B5=AC=EC=84=B1?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- README.md | 36 +++++++++++++++++++++++++++++++++++- 1 file changed, 35 insertions(+), 1 deletion(-) diff --git a/README.md b/README.md index e1c7c927d8..4a6cf330a0 100644 --- a/README.md +++ b/README.md @@ -1 +1,35 @@ -# kotlin-blackjack \ No newline at end of file +# kotlin-blackjack + +## 기능 요구 사항 + + 블랙잭 게임을 변형한 프로그램을 구현한다. 블랙잭 게임은 딜러와 플레이어 중 카드의 합이 21 또는 21에 가장 가까운 숫자를 가지는 쪽이 이기는 게임이다. + - 카드의 숫자 계산은 카드 숫자를 기본으로 하며, 예외로 Ace는 1 또는 11로 계산할 수 있으며, King, Queen, Jack은 각각 10으로 계산한다. + - 게임을 시작하면 플레이어는 두 장의 카드를 지급 받으며, 두 장의 카드 숫자를 합쳐 21을 초과하지 않으면서 21에 가깝게 만들면 이긴다. 21을 넘지 않을 경우 원한다면 얼마든지 카드를 계속 뽑을 수 있다. + + +## 기능 목록 + +### 플레이어 +- [] 카드를 뽑는다. +- [] 카드를 그만 받는다. + +### 블랙젝 게임 +- [] 딜러와 플레이어가 있어야 시작된다. +- [] 플레이어는 최소 2명 이상이어야 한다. + +### 트럼프 카드 +- [] 모양과 문자 조합이 아니라면 예외를 던진다. +- [] 48장을 가진다.(모양 별 12개씩) + +### 딜러 +- [] 카드를 셔플한다. +- [] 카드를 배포한다. +- [] 결과를 계산한다. + +### inputView +- [] 플레이어를 입력받는다. +- [] 카드 수집 여부를 받는다.. + +### output +- [] 플레이어가 가지고 있는 카드를 보여준다. +- [] 플레이어 카드 계산값을 보여준다. From 58a82f8b9ec3099aad55119001a34c8da9233ae9 Mon Sep 17 00:00:00 2001 From: OYJ Date: Thu, 23 Nov 2023 22:46:19 +0900 Subject: [PATCH 03/54] =?UTF-8?q?Refactor:=20Skills,=20language=20?= =?UTF-8?q?=EA=B5=AC=ED=98=84=20=EB=B3=80=EA=B2=BD?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- src/test/kotlin/DslTest.kt | 22 +++++++++++++--------- src/test/kotlin/study/Skills.kt | 2 +- 2 files changed, 14 insertions(+), 10 deletions(-) diff --git a/src/test/kotlin/DslTest.kt b/src/test/kotlin/DslTest.kt index 1d92675cd3..5b0c198fa5 100644 --- a/src/test/kotlin/DslTest.kt +++ b/src/test/kotlin/DslTest.kt @@ -29,15 +29,19 @@ class DslTest { val person = introduce { name(name) company("블루버드") - skills(introduceSkill { - softSkills("A passion for problem solving") - softSkills("Good communication skills") - hardSkills("Kotlin") - }) - language(introduceLanguage { - language("Korean" to 5) - language("English" to 3) - }) + skills( + introduceSkill { + softSkills("A passion for problem solving") + softSkills("Good communication skills") + hardSkills("Kotlin") + } + ) + language( + introduceLanguage { + language("Korean" to 5) + language("English" to 3) + } + ) } println(person) diff --git a/src/test/kotlin/study/Skills.kt b/src/test/kotlin/study/Skills.kt index 22186485aa..f862da29ae 100644 --- a/src/test/kotlin/study/Skills.kt +++ b/src/test/kotlin/study/Skills.kt @@ -1,3 +1,3 @@ package study -data class Skills (val softSkill: List, val hardSkill: List) +data class Skills(val softSkill: List, val hardSkill: List) From 15c50debfaeb9bd10ad81a4fd387c8fe06a9794f Mon Sep 17 00:00:00 2001 From: OYJ Date: Thu, 23 Nov 2023 23:52:13 +0900 Subject: [PATCH 04/54] =?UTF-8?q?Feat:=20=EC=B9=B4=EB=93=9C=20=EB=B2=88?= =?UTF-8?q?=ED=98=B8,=20=EC=B9=B4=EB=93=9C=20=EB=AC=B4=EB=8A=AC=20?= =?UTF-8?q?=EC=9C=A0=ED=9A=A8=EC=84=B1=20=EA=B2=80=EC=A6=9D=20=EA=B5=AC?= =?UTF-8?q?=ED=98=84?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Docs: 딜러 역할 삭제, 딜러 역할 분배 --- README.md | 19 +++++++++++++------ src/main/kotlin/CardNumber.kt | 15 +++++++++++++++ src/main/kotlin/Suit.kt | 13 +++++++++++++ src/test/kotlin/blackJack/CardNumberTest.kt | 20 ++++++++++++++++++++ src/test/kotlin/blackJack/SuitTest.kt | 19 +++++++++++++++++++ 5 files changed, 80 insertions(+), 6 deletions(-) create mode 100644 src/main/kotlin/CardNumber.kt create mode 100644 src/main/kotlin/Suit.kt create mode 100644 src/test/kotlin/blackJack/CardNumberTest.kt create mode 100644 src/test/kotlin/blackJack/SuitTest.kt diff --git a/README.md b/README.md index 4a6cf330a0..2e05c02a0c 100644 --- a/README.md +++ b/README.md @@ -16,15 +16,22 @@ ### 블랙젝 게임 - [] 딜러와 플레이어가 있어야 시작된다. - [] 플레이어는 최소 2명 이상이어야 한다. +- [] 결과를 계산한다. + +### 카드 무늬 +- [O] 트럼프 카드에 존재하지 않는 카드 무늬를 생성하려면 예외를 던진다. -### 트럼프 카드 -- [] 모양과 문자 조합이 아니라면 예외를 던진다. -- [] 48장을 가진다.(모양 별 12개씩) +### 카드 번호 +- [O] 트럼프 카드의 범위를 넘어서는 카드 번호를 생성하려면 예외를 던진다. -### 딜러 -- [] 카드를 셔플한다. +### 트럼프 카드(플레잉 카드) +- [] 카드의 포인트를 반환한다. + +### 카드팩 +- [] 중복되는 카드가 있으면 예외를 던진다. +- [] 카드의 수가 48장이 아니라면 예외를 던진다. +- [] 카드를 셔플한다. - [] 카드를 배포한다. -- [] 결과를 계산한다. ### inputView - [] 플레이어를 입력받는다. diff --git a/src/main/kotlin/CardNumber.kt b/src/main/kotlin/CardNumber.kt new file mode 100644 index 0000000000..9651a7b7e1 --- /dev/null +++ b/src/main/kotlin/CardNumber.kt @@ -0,0 +1,15 @@ +class CardNumber private constructor(private val number: String) { + + companion object { + private const val ERR_MSG_UNKNOWN_NUMBER = "알 수 없는 숫자입니다." + private val CARD_NUMBER_LIST = listOf( + "A", "1", "2", "3", "4", "5", "6", "7", "8", "9", "J", "K", "Q" + ) + + private val NUMBERS: Map = CARD_NUMBER_LIST.associateWith(::CardNumber) + + fun from(value: String): CardNumber { + return NUMBERS[value] ?: throw IllegalArgumentException(ERR_MSG_UNKNOWN_NUMBER) + } + } +} diff --git a/src/main/kotlin/Suit.kt b/src/main/kotlin/Suit.kt new file mode 100644 index 0000000000..feb2e42bf3 --- /dev/null +++ b/src/main/kotlin/Suit.kt @@ -0,0 +1,13 @@ +class Suit private constructor(private val suit: String) { + + companion object { + private const val ERR_MSG_UNKNOWN_SUIT = "알 수 없는 무늬 입니다." + private val CARD_SUIT_LIST = listOf("Spade", "Heart", "Diamond", "Club") + + private val SUIT: Map = CARD_SUIT_LIST.associateWith(::Suit) + + fun from(value: String): Suit { + return SUIT[value] ?: throw IllegalArgumentException(ERR_MSG_UNKNOWN_SUIT) + } + } +} diff --git a/src/test/kotlin/blackJack/CardNumberTest.kt b/src/test/kotlin/blackJack/CardNumberTest.kt new file mode 100644 index 0000000000..73e5dc410b --- /dev/null +++ b/src/test/kotlin/blackJack/CardNumberTest.kt @@ -0,0 +1,20 @@ +package blackJack + +import CardNumber +import org.assertj.core.api.Assertions +import org.junit.jupiter.api.Test + +class CardNumberTest { + + @Test + fun `트럼프 카드에 범위를 넘어서는 번호가 있다면, 트럼프 카드 번호를 생성할 때, 예외를 던진다`() { + // given : 트럼프 카드의 범위를 넘어서는 번호가 있다. + val cardNumber = "10" + + // when : 트럼프 카드의 번호를 생성한다. + val cardSuit = runCatching { CardNumber.from(cardNumber) }.exceptionOrNull() + + // then : 예외를 던진다. + Assertions.assertThat(cardSuit).isInstanceOf(IllegalArgumentException::class.java) + } +} diff --git a/src/test/kotlin/blackJack/SuitTest.kt b/src/test/kotlin/blackJack/SuitTest.kt new file mode 100644 index 0000000000..52f023393d --- /dev/null +++ b/src/test/kotlin/blackJack/SuitTest.kt @@ -0,0 +1,19 @@ +package blackJack + +import org.assertj.core.api.Assertions +import org.junit.jupiter.api.Test + +class SuitTest { + + @Test + fun `트럼프 카드에 존재하지 않는 무늬가 있다면, 트럼프 카드 무늬를 생성할 때, 예외를 던진다`() { + // given : 트럼프 카드에 존재하지 않는 무늬를 받는다. + val suit = "circle" + + // when : 트럼프 카드의 무늬를 만든다. + val cardSuit = runCatching { Suit.from(suit) }.exceptionOrNull() + + // then : 예외를 던진다. + Assertions.assertThat(cardSuit).isInstanceOf(IllegalArgumentException::class.java) + } +} From 6b33e03562fdef2935c30d6fb6ada304149ddbe1 Mon Sep 17 00:00:00 2001 From: OYJ Date: Fri, 24 Nov 2023 01:29:39 +0900 Subject: [PATCH 05/54] =?UTF-8?q?Feat:=20=EC=B9=B4=EB=93=9C=20=ED=8F=AC?= =?UTF-8?q?=EC=9D=B8=ED=8A=B8=20=EB=B0=98=ED=99=98=20=EA=B8=B0=EB=8A=A5=20?= =?UTF-8?q?=EA=B5=AC=ED=98=84,=20=EC=B9=B4=EB=93=9C=20=EB=AC=B4=EB=8A=AC?= =?UTF-8?q?=20=EB=AA=85=20=EB=B0=98=ED=99=98=20=EA=B8=B0=EB=8A=A5=20?= =?UTF-8?q?=EA=B5=AC=ED=98=84?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Refactor: Suit, CardNumber / class -> Enum으로 변경, 카드 무늬, 카드 번호 검증 로직 제거 --- README.md | 9 +--- src/main/kotlin/CardNumber.kt | 25 ++++++----- src/main/kotlin/PlayingCard.kt | 21 +++++++++ src/main/kotlin/Suit.kt | 16 +++---- src/test/kotlin/blackJack/CardNumberTest.kt | 20 --------- src/test/kotlin/blackJack/PlayingCardTest.kt | 45 ++++++++++++++++++++ src/test/kotlin/blackJack/SuitTest.kt | 19 --------- 7 files changed, 91 insertions(+), 64 deletions(-) create mode 100644 src/main/kotlin/PlayingCard.kt delete mode 100644 src/test/kotlin/blackJack/CardNumberTest.kt create mode 100644 src/test/kotlin/blackJack/PlayingCardTest.kt delete mode 100644 src/test/kotlin/blackJack/SuitTest.kt diff --git a/README.md b/README.md index 2e05c02a0c..cd4f65c08d 100644 --- a/README.md +++ b/README.md @@ -18,14 +18,9 @@ - [] 플레이어는 최소 2명 이상이어야 한다. - [] 결과를 계산한다. -### 카드 무늬 -- [O] 트럼프 카드에 존재하지 않는 카드 무늬를 생성하려면 예외를 던진다. - -### 카드 번호 -- [O] 트럼프 카드의 범위를 넘어서는 카드 번호를 생성하려면 예외를 던진다. - ### 트럼프 카드(플레잉 카드) -- [] 카드의 포인트를 반환한다. +- [O] 카드의 포인트를 반환한다. +- [O] 카드의 무늬 명을 반환한다. ### 카드팩 - [] 중복되는 카드가 있으면 예외를 던진다. diff --git a/src/main/kotlin/CardNumber.kt b/src/main/kotlin/CardNumber.kt index 9651a7b7e1..f51298c70b 100644 --- a/src/main/kotlin/CardNumber.kt +++ b/src/main/kotlin/CardNumber.kt @@ -1,15 +1,20 @@ -class CardNumber private constructor(private val number: String) { +enum class CardNumber private constructor(private val point: Int) { + ACE(1), + TWO(2), + TREE(3), + FOUR(4), + FIVE(5), + SIX(6), + SEVEN(7), + EIGHT(8), + NINE(9), + JACK(10), + QUEEN(10), + KING(10); companion object { - private const val ERR_MSG_UNKNOWN_NUMBER = "알 수 없는 숫자입니다." - private val CARD_NUMBER_LIST = listOf( - "A", "1", "2", "3", "4", "5", "6", "7", "8", "9", "J", "K", "Q" - ) - - private val NUMBERS: Map = CARD_NUMBER_LIST.associateWith(::CardNumber) - - fun from(value: String): CardNumber { - return NUMBERS[value] ?: throw IllegalArgumentException(ERR_MSG_UNKNOWN_NUMBER) + fun CardNumber.getPoint(): Int { + return this.point } } } diff --git a/src/main/kotlin/PlayingCard.kt b/src/main/kotlin/PlayingCard.kt new file mode 100644 index 0000000000..5cc1af6359 --- /dev/null +++ b/src/main/kotlin/PlayingCard.kt @@ -0,0 +1,21 @@ +import CardNumber.Companion.getPoint +import Suit.Companion.getName + +class PlayingCard(val suit: Suit, val cardNumber: CardNumber) { + fun getPoint(isMaxAce: Boolean = false): Int { + val point = cardNumber.getPoint() + if (isMaxAce && point == ACE_POINT) { + return point + ADD_ACE_NUMBER + } + return cardNumber.getPoint() + } + + fun getSuitName(): String { + return suit.getName() + } + + companion object { + private const val ADD_ACE_NUMBER = 10 + private const val ACE_POINT = 1 + } +} diff --git a/src/main/kotlin/Suit.kt b/src/main/kotlin/Suit.kt index feb2e42bf3..0c5a6c21e1 100644 --- a/src/main/kotlin/Suit.kt +++ b/src/main/kotlin/Suit.kt @@ -1,13 +1,13 @@ -class Suit private constructor(private val suit: String) { - companion object { - private const val ERR_MSG_UNKNOWN_SUIT = "알 수 없는 무늬 입니다." - private val CARD_SUIT_LIST = listOf("Spade", "Heart", "Diamond", "Club") - - private val SUIT: Map = CARD_SUIT_LIST.associateWith(::Suit) +enum class Suit(val koName: String) { + SPADE("스페이드"), + HEART("하트"), + DIAMOND("다이아몬드"), + CLUB("클러버"); - fun from(value: String): Suit { - return SUIT[value] ?: throw IllegalArgumentException(ERR_MSG_UNKNOWN_SUIT) + companion object { + fun Suit.getName(): String { + return this.koName } } } diff --git a/src/test/kotlin/blackJack/CardNumberTest.kt b/src/test/kotlin/blackJack/CardNumberTest.kt deleted file mode 100644 index 73e5dc410b..0000000000 --- a/src/test/kotlin/blackJack/CardNumberTest.kt +++ /dev/null @@ -1,20 +0,0 @@ -package blackJack - -import CardNumber -import org.assertj.core.api.Assertions -import org.junit.jupiter.api.Test - -class CardNumberTest { - - @Test - fun `트럼프 카드에 범위를 넘어서는 번호가 있다면, 트럼프 카드 번호를 생성할 때, 예외를 던진다`() { - // given : 트럼프 카드의 범위를 넘어서는 번호가 있다. - val cardNumber = "10" - - // when : 트럼프 카드의 번호를 생성한다. - val cardSuit = runCatching { CardNumber.from(cardNumber) }.exceptionOrNull() - - // then : 예외를 던진다. - Assertions.assertThat(cardSuit).isInstanceOf(IllegalArgumentException::class.java) - } -} diff --git a/src/test/kotlin/blackJack/PlayingCardTest.kt b/src/test/kotlin/blackJack/PlayingCardTest.kt new file mode 100644 index 0000000000..af4a0056bd --- /dev/null +++ b/src/test/kotlin/blackJack/PlayingCardTest.kt @@ -0,0 +1,45 @@ +package blackJack + +import CardNumber +import PlayingCard +import Suit +import org.assertj.core.api.Assertions.assertThat +import org.junit.jupiter.api.Test + +class PlayingCardTest { + + @Test + fun `트럼프 카드를 생성하고, 해당 카드의 포인트를 요청할 때, 포인트를 반환한다`() { + // given : 트럼프 카드를 생성한다. + val playingCard = PlayingCard(Suit.SPADE, CardNumber.TREE) + val playingCard2 = PlayingCard(Suit.HEART, CardNumber.TWO) + val playingCard3 = PlayingCard(Suit.HEART, CardNumber.ACE) + val playingCard4 = PlayingCard(Suit.HEART, CardNumber.KING) + + // when : 해당 카드의 포인트를 요청한다. + val actual = playingCard.getPoint() + val actual2 = playingCard2.getPoint() + val actual3 = playingCard3.getPoint() + val actual4 = playingCard3.getPoint(true) + val actual5 = playingCard4.getPoint() + + // then : 카드별 포인트를 반환한다 + assertThat(actual).isEqualTo(3) + assertThat(actual2).isEqualTo(2) + assertThat(actual3).isEqualTo(1) + assertThat(actual4).isEqualTo(11) + assertThat(actual5).isEqualTo(10) + } + + @Test + fun `트럼프 카드를 만들고, 무늬 명칭을 요청할때, 무늬 명을 반환한다`() { + // given : 카드를 만들고 + val playingCard = PlayingCard(Suit.SPADE, CardNumber.TREE) + + // when : 무늬 명칭을 요청하면 + val actual = playingCard.getSuitName() + + // then : 무늬 명을 반환한다. + assertThat(actual).isEqualTo("스페이드") + } +} diff --git a/src/test/kotlin/blackJack/SuitTest.kt b/src/test/kotlin/blackJack/SuitTest.kt deleted file mode 100644 index 52f023393d..0000000000 --- a/src/test/kotlin/blackJack/SuitTest.kt +++ /dev/null @@ -1,19 +0,0 @@ -package blackJack - -import org.assertj.core.api.Assertions -import org.junit.jupiter.api.Test - -class SuitTest { - - @Test - fun `트럼프 카드에 존재하지 않는 무늬가 있다면, 트럼프 카드 무늬를 생성할 때, 예외를 던진다`() { - // given : 트럼프 카드에 존재하지 않는 무늬를 받는다. - val suit = "circle" - - // when : 트럼프 카드의 무늬를 만든다. - val cardSuit = runCatching { Suit.from(suit) }.exceptionOrNull() - - // then : 예외를 던진다. - Assertions.assertThat(cardSuit).isInstanceOf(IllegalArgumentException::class.java) - } -} From b88d964c19ea2e0eb366d17bc84b3bc766237b3f Mon Sep 17 00:00:00 2001 From: OYJ Date: Sat, 25 Nov 2023 14:19:04 +0900 Subject: [PATCH 06/54] =?UTF-8?q?Feat:=20=EC=B9=B4=EB=93=9C=20=ED=81=B4?= =?UTF-8?q?=EB=9E=98=EC=8A=A4=20=EC=83=9D=EC=84=B1=20=EB=B0=8F=20=EC=B9=B4?= =?UTF-8?q?=EB=93=9C=20=EA=B5=AC=EC=84=B1=20=EB=8D=B0=EC=9D=B4=ED=84=B0=20?= =?UTF-8?q?=EC=BA=90=EC=8B=B1?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit chore: 카드 관련 클래스 패키지 생성 및 이동 --- src/main/kotlin/{ => card}/CardNumber.kt | 10 ++++++++++ src/main/kotlin/{ => card}/PlayingCard.kt | 8 +++++--- src/main/kotlin/{ => card}/Suit.kt | 6 +++++- src/test/kotlin/blackJack/PlayingCardTest.kt | 6 +++--- 4 files changed, 23 insertions(+), 7 deletions(-) rename src/main/kotlin/{ => card}/CardNumber.kt (61%) rename src/main/kotlin/{ => card}/PlayingCard.kt (71%) rename src/main/kotlin/{ => card}/Suit.kt (68%) diff --git a/src/main/kotlin/CardNumber.kt b/src/main/kotlin/card/CardNumber.kt similarity index 61% rename from src/main/kotlin/CardNumber.kt rename to src/main/kotlin/card/CardNumber.kt index f51298c70b..79a14c3de0 100644 --- a/src/main/kotlin/CardNumber.kt +++ b/src/main/kotlin/card/CardNumber.kt @@ -1,3 +1,5 @@ +package card + enum class CardNumber private constructor(private val point: Int) { ACE(1), TWO(2), @@ -13,8 +15,16 @@ enum class CardNumber private constructor(private val point: Int) { KING(10); companion object { + + private val cardNumberList = listOf( + ACE, TWO, TREE, FOUR, FIVE, SIX, SEVEN, + EIGHT, NINE, JACK, QUEEN, KING, + ) + fun CardNumber.getPoint(): Int { return this.point } + + fun getCardNumberList() = cardNumberList } } diff --git a/src/main/kotlin/PlayingCard.kt b/src/main/kotlin/card/PlayingCard.kt similarity index 71% rename from src/main/kotlin/PlayingCard.kt rename to src/main/kotlin/card/PlayingCard.kt index 5cc1af6359..d8472007f7 100644 --- a/src/main/kotlin/PlayingCard.kt +++ b/src/main/kotlin/card/PlayingCard.kt @@ -1,7 +1,9 @@ -import CardNumber.Companion.getPoint -import Suit.Companion.getName +package card -class PlayingCard(val suit: Suit, val cardNumber: CardNumber) { +import card.CardNumber.Companion.getPoint +import card.Suit.Companion.getName + +class PlayingCard(private val suit: Suit, private val cardNumber: CardNumber) { fun getPoint(isMaxAce: Boolean = false): Int { val point = cardNumber.getPoint() if (isMaxAce && point == ACE_POINT) { diff --git a/src/main/kotlin/Suit.kt b/src/main/kotlin/card/Suit.kt similarity index 68% rename from src/main/kotlin/Suit.kt rename to src/main/kotlin/card/Suit.kt index 0c5a6c21e1..5df29af860 100644 --- a/src/main/kotlin/Suit.kt +++ b/src/main/kotlin/card/Suit.kt @@ -1,4 +1,4 @@ - +package card enum class Suit(val koName: String) { SPADE("스페이드"), HEART("하트"), @@ -6,8 +6,12 @@ enum class Suit(val koName: String) { CLUB("클러버"); companion object { + + private val suitList = listOf(SPADE, HEART, DIAMOND, CLUB) fun Suit.getName(): String { return this.koName } + + fun getSuitList() = suitList } } diff --git a/src/test/kotlin/blackJack/PlayingCardTest.kt b/src/test/kotlin/blackJack/PlayingCardTest.kt index af4a0056bd..0d51169ba6 100644 --- a/src/test/kotlin/blackJack/PlayingCardTest.kt +++ b/src/test/kotlin/blackJack/PlayingCardTest.kt @@ -1,8 +1,8 @@ package blackJack -import CardNumber -import PlayingCard -import Suit +import card.CardNumber +import card.PlayingCard +import card.Suit import org.assertj.core.api.Assertions.assertThat import org.junit.jupiter.api.Test From 0d06426eb04abf191701fffd10103c2ddd892ffc Mon Sep 17 00:00:00 2001 From: OYJ Date: Sat, 25 Nov 2023 14:25:40 +0900 Subject: [PATCH 07/54] =?UTF-8?q?Feat:=20=EC=B9=B4=EB=93=9C=ED=8C=A9=20?= =?UTF-8?q?=ED=81=B4=EB=9E=98=EC=8A=A4=20=EC=83=9D=EC=84=B1=20=EB=B0=8F=20?= =?UTF-8?q?=EC=BA=90=EC=8B=B1=20=EA=B5=AC=ED=98=84?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- README.md | 5 ++-- src/main/kotlin/card/CardPack.kt | 32 +++++++++++++++++++++++ src/test/kotlin/blackJack/CardPackTest.kt | 27 +++++++++++++++++++ 3 files changed, 61 insertions(+), 3 deletions(-) create mode 100644 src/main/kotlin/card/CardPack.kt create mode 100644 src/test/kotlin/blackJack/CardPackTest.kt diff --git a/README.md b/README.md index cd4f65c08d..6cbe345e97 100644 --- a/README.md +++ b/README.md @@ -23,10 +23,9 @@ - [O] 카드의 무늬 명을 반환한다. ### 카드팩 -- [] 중복되는 카드가 있으면 예외를 던진다. -- [] 카드의 수가 48장이 아니라면 예외를 던진다. +- [O] 중복되지 않은 48개의 카드로 구성된다. - [] 카드를 셔플한다. -- [] 카드를 배포한다. +- [] 카드를 배포한다.(한 게임에 중복되는 카드를 배포하지 않는다.) ### inputView - [] 플레이어를 입력받는다. diff --git a/src/main/kotlin/card/CardPack.kt b/src/main/kotlin/card/CardPack.kt new file mode 100644 index 0000000000..65f685eb94 --- /dev/null +++ b/src/main/kotlin/card/CardPack.kt @@ -0,0 +1,32 @@ +package card + +class CardPack private constructor(private val playingCard: List) { + + companion object { + + private val cardPack = createCard() + + private fun createCard(): List { + val suitList = Suit.getSuitList() + val playingCardList = mutableListOf() + + for (suit in suitList) { + playingCardList.addAll(createCardWithSuit(suit)) + } + + return playingCardList + } + + private fun createCardWithSuit(suit: Suit): List { + val playingCardList = mutableListOf() + val cardNumberList = CardNumber.getCardNumberList() + + for (cardNumber in cardNumberList) { + playingCardList.add(PlayingCard(suit, cardNumber)) + } + return playingCardList + } + + fun getCradPack() = cardPack + } +} diff --git a/src/test/kotlin/blackJack/CardPackTest.kt b/src/test/kotlin/blackJack/CardPackTest.kt new file mode 100644 index 0000000000..c6ba3a3992 --- /dev/null +++ b/src/test/kotlin/blackJack/CardPackTest.kt @@ -0,0 +1,27 @@ +package blackJack + +import card.CardPack +import org.assertj.core.api.Assertions.assertThat +import org.junit.jupiter.api.Test + +class CardPackTest { + @Test + fun `카드팩은 48개의 카드로 구성되어있다`() { + val cardPack = CardPack.getCradPack() + + val cardNumberSize = cardPack.size + + assertThat(cardNumberSize).isEqualTo(48) + } + + @Test + fun `카트팩은 중복된 카드가 없다`() { + val cardPack = CardPack.getCradPack() + val cardPackSize = cardPack.size + + val distinctCardPack = cardPack.distinct() + val distinctCardPackSize = distinctCardPack.size + + assertThat(cardPackSize).isEqualTo(distinctCardPackSize) + } +} From c1a55045913a23847466d7eb1c26e6d68b3323b8 Mon Sep 17 00:00:00 2001 From: OYJ Date: Sat, 25 Nov 2023 14:36:32 +0900 Subject: [PATCH 08/54] =?UTF-8?q?Docs:=20=EB=B8=94=EB=9E=99=EC=A0=9D=20?= =?UTF-8?q?=EA=B2=8C=EC=9E=84=20=EA=B8=B0=EB=8A=A5=20=EC=B6=94=EA=B0=80=20?= =?UTF-8?q?(=EC=B9=B4=EB=93=9C=ED=8C=A9=20=EA=B8=B0=EB=8A=A5=20=EC=9D=B4?= =?UTF-8?q?=EB=8F=99),=20=ED=94=8C=EB=A0=88=EC=9D=B4=EC=96=B4=20=EA=B8=B0?= =?UTF-8?q?=EB=8A=A5=20=EB=AA=A9=EB=A1=9D=20=EB=B3=80=EA=B2=BD?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Refactor: 카드 번호 '10' 추가, 관련 테스트 수정 --- README.md | 12 ++++++------ src/main/kotlin/card/CardNumber.kt | 3 ++- src/test/kotlin/blackJack/CardPackTest.kt | 4 ++-- 3 files changed, 10 insertions(+), 9 deletions(-) diff --git a/README.md b/README.md index 6cbe345e97..e6b356b424 100644 --- a/README.md +++ b/README.md @@ -10,11 +10,13 @@ ## 기능 목록 ### 플레이어 -- [] 카드를 뽑는다. -- [] 카드를 그만 받는다. +- [] 카드를 받는다. +- [] 플레이 상태를 반환한다.(스탠드, 스테이) ### 블랙젝 게임 -- [] 딜러와 플레이어가 있어야 시작된다. +- [] 카드를 셔플한다. +- [] 카드를 배포한다.(한 게임에 중복되는 카드를 배포하지 않는다.) +- [] 플레이어가 있어야 시작된다. - [] 플레이어는 최소 2명 이상이어야 한다. - [] 결과를 계산한다. @@ -23,9 +25,7 @@ - [O] 카드의 무늬 명을 반환한다. ### 카드팩 -- [O] 중복되지 않은 48개의 카드로 구성된다. -- [] 카드를 셔플한다. -- [] 카드를 배포한다.(한 게임에 중복되는 카드를 배포하지 않는다.) +- [O] 중복되지 않은 52개의 카드로 구성된다. ### inputView - [] 플레이어를 입력받는다. diff --git a/src/main/kotlin/card/CardNumber.kt b/src/main/kotlin/card/CardNumber.kt index 79a14c3de0..ab096f4c34 100644 --- a/src/main/kotlin/card/CardNumber.kt +++ b/src/main/kotlin/card/CardNumber.kt @@ -10,6 +10,7 @@ enum class CardNumber private constructor(private val point: Int) { SEVEN(7), EIGHT(8), NINE(9), + TEN(10), JACK(10), QUEEN(10), KING(10); @@ -18,7 +19,7 @@ enum class CardNumber private constructor(private val point: Int) { private val cardNumberList = listOf( ACE, TWO, TREE, FOUR, FIVE, SIX, SEVEN, - EIGHT, NINE, JACK, QUEEN, KING, + EIGHT, NINE, TEN, JACK, QUEEN, KING, ) fun CardNumber.getPoint(): Int { diff --git a/src/test/kotlin/blackJack/CardPackTest.kt b/src/test/kotlin/blackJack/CardPackTest.kt index c6ba3a3992..d477e6bfec 100644 --- a/src/test/kotlin/blackJack/CardPackTest.kt +++ b/src/test/kotlin/blackJack/CardPackTest.kt @@ -6,12 +6,12 @@ import org.junit.jupiter.api.Test class CardPackTest { @Test - fun `카드팩은 48개의 카드로 구성되어있다`() { + fun `카드팩은 52개의 카드로 구성되어있다`() { val cardPack = CardPack.getCradPack() val cardNumberSize = cardPack.size - assertThat(cardNumberSize).isEqualTo(48) + assertThat(cardNumberSize).isEqualTo(52) } @Test From 257482ffe32ad165ee30383bf5956d29d0632830 Mon Sep 17 00:00:00 2001 From: OYJ Date: Sat, 25 Nov 2023 16:40:52 +0900 Subject: [PATCH 09/54] =?UTF-8?q?Docs:=20=EB=B8=94=EB=9E=99=EC=A0=9D=20?= =?UTF-8?q?=EA=B2=8C=EC=9E=84=20=EA=B8=B0=EB=8A=A5=20=EB=AA=A9=EB=A1=9D=20?= =?UTF-8?q?=EC=B6=94=EA=B0=80.?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Refactor: 카드팩 object -> class 변경, 사이드 이팩트 수정 --- README.md | 4 ++++ src/main/kotlin/card/CardPack.kt | 11 ++++++----- src/test/kotlin/blackJack/CardPackTest.kt | 12 ++++++------ 3 files changed, 16 insertions(+), 11 deletions(-) diff --git a/README.md b/README.md index e6b356b424..4639411d9a 100644 --- a/README.md +++ b/README.md @@ -14,8 +14,12 @@ - [] 플레이 상태를 반환한다.(스탠드, 스테이) ### 블랙젝 게임 +- [] 플레잉 카드 팩을 검증한다. + - [] 중복이 없다. + - [] 52장의 카드로 구성된다. - [] 카드를 셔플한다. - [] 카드를 배포한다.(한 게임에 중복되는 카드를 배포하지 않는다.) +- [] 배포된 카드의 갯수를 기억한다. - [] 플레이어가 있어야 시작된다. - [] 플레이어는 최소 2명 이상이어야 한다. - [] 결과를 계산한다. diff --git a/src/main/kotlin/card/CardPack.kt b/src/main/kotlin/card/CardPack.kt index 65f685eb94..a3db062323 100644 --- a/src/main/kotlin/card/CardPack.kt +++ b/src/main/kotlin/card/CardPack.kt @@ -1,12 +1,11 @@ package card -class CardPack private constructor(private val playingCard: List) { +class CardPack(val cardList: List) { companion object { - private val cardPack = createCard() - private fun createCard(): List { + private fun createCard(): CardPack { val suitList = Suit.getSuitList() val playingCardList = mutableListOf() @@ -14,7 +13,7 @@ class CardPack private constructor(private val playingCard: List) { playingCardList.addAll(createCardWithSuit(suit)) } - return playingCardList + return CardPack(playingCardList) } private fun createCardWithSuit(suit: Suit): List { @@ -27,6 +26,8 @@ class CardPack private constructor(private val playingCard: List) { return playingCardList } - fun getCradPack() = cardPack + fun getCardPack(): CardPack { + return cardPack + } } } diff --git a/src/test/kotlin/blackJack/CardPackTest.kt b/src/test/kotlin/blackJack/CardPackTest.kt index d477e6bfec..6da6943917 100644 --- a/src/test/kotlin/blackJack/CardPackTest.kt +++ b/src/test/kotlin/blackJack/CardPackTest.kt @@ -7,19 +7,19 @@ import org.junit.jupiter.api.Test class CardPackTest { @Test fun `카드팩은 52개의 카드로 구성되어있다`() { - val cardPack = CardPack.getCradPack() + val cardPack = CardPack.getCardPack() - val cardNumberSize = cardPack.size + val cardPackSize = cardPack.cardList.size - assertThat(cardNumberSize).isEqualTo(52) + assertThat(cardPackSize).isEqualTo(52) } @Test fun `카트팩은 중복된 카드가 없다`() { - val cardPack = CardPack.getCradPack() - val cardPackSize = cardPack.size + val cardPack = CardPack.getCardPack() + val cardPackSize = cardPack.cardList.size - val distinctCardPack = cardPack.distinct() + val distinctCardPack = cardPack.cardList.distinct() val distinctCardPackSize = distinctCardPack.size assertThat(cardPackSize).isEqualTo(distinctCardPackSize) From e384c31536c0abbda2db0afdbe797cb933067658 Mon Sep 17 00:00:00 2001 From: OYJ Date: Sat, 25 Nov 2023 16:55:13 +0900 Subject: [PATCH 10/54] =?UTF-8?q?Feat:=20=EB=B8=94=EB=9E=99=EC=A0=9D=20?= =?UTF-8?q?=EA=B2=8C=EC=9E=84=20=ED=81=B4=EB=9E=98=EC=8A=A4=20=EC=83=9D?= =?UTF-8?q?=EC=84=B1,=20=EC=B9=B4=EB=93=9C=ED=8C=A9=20=EA=B2=80=EC=A6=9D?= =?UTF-8?q?=20=EB=A1=9C=EC=A7=81=20=EA=B5=AC=ED=98=84(52=EC=9E=A5,=20?= =?UTF-8?q?=EC=A4=91=EB=B3=B5X)?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- README.md | 6 ++--- src/main/kotlin/BlackjackGame.kt | 27 +++++++++++++++++++ .../kotlin/blackJack/BlackjackGameTest.kt | 21 +++++++++++++++ 3 files changed, 51 insertions(+), 3 deletions(-) create mode 100644 src/main/kotlin/BlackjackGame.kt create mode 100644 src/test/kotlin/blackJack/BlackjackGameTest.kt diff --git a/README.md b/README.md index 4639411d9a..8fe1914ec4 100644 --- a/README.md +++ b/README.md @@ -14,9 +14,9 @@ - [] 플레이 상태를 반환한다.(스탠드, 스테이) ### 블랙젝 게임 -- [] 플레잉 카드 팩을 검증한다. - - [] 중복이 없다. - - [] 52장의 카드로 구성된다. +- [O] 플레잉 카드 팩을 검증한다. + - [O] 중복이 없다. + - [O] 52장의 카드로 구성된다. - [] 카드를 셔플한다. - [] 카드를 배포한다.(한 게임에 중복되는 카드를 배포하지 않는다.) - [] 배포된 카드의 갯수를 기억한다. diff --git a/src/main/kotlin/BlackjackGame.kt b/src/main/kotlin/BlackjackGame.kt new file mode 100644 index 0000000000..e3c406f486 --- /dev/null +++ b/src/main/kotlin/BlackjackGame.kt @@ -0,0 +1,27 @@ +import card.CardPack + +class BlackjackGame(private val cardPack: CardPack) { + + init { + validateCardPack() + } + + private fun validateCardPack() { + validateCardPackSize() + validateDuplicateCardPack() + } + + private fun validateCardPackSize() { + require(cardPack.cardList.size == CARD_PACK_SIZE) { ERR_MSG_CARD_PACK_SIZE } + } + + private fun validateDuplicateCardPack() { + require(cardPack.cardList.size == cardPack.cardList.distinct().size) { ERR_MSG_DUPLICATE_CARD_PACK } + } + + companion object { + private const val CARD_PACK_SIZE = 52 + private const val ERR_MSG_CARD_PACK_SIZE = "카드는 52개로 구성되어야 합나다." + private const val ERR_MSG_DUPLICATE_CARD_PACK = "중복되는 카드는 없어야 합니다." + } +} diff --git a/src/test/kotlin/blackJack/BlackjackGameTest.kt b/src/test/kotlin/blackJack/BlackjackGameTest.kt new file mode 100644 index 0000000000..cb33e1a161 --- /dev/null +++ b/src/test/kotlin/blackJack/BlackjackGameTest.kt @@ -0,0 +1,21 @@ +package blackJack + +import BlackjackGame +import card.CardPack +import org.assertj.core.api.Assertions.assertThat +import org.junit.jupiter.api.Test + +class BlackjackGameTest { + + @Test + fun `정상적인 카드팩을 받고, 게임에 주입되었을 때, 예외 검증을 통과한다`() { + // given : 정상적인 카드팩을 받는다. + val cardPack = CardPack.getCardPack() + + // when : 게임에 카드를 주입한다. + val actual = runCatching { BlackjackGame(cardPack) }.exceptionOrNull() + + // then : 예외를 던지지 않는다. + assertThat(actual).isNull() + } +} From 683ccfd6d9ca70af6c6711c2ab29ee63becb49e4 Mon Sep 17 00:00:00 2001 From: OYJ Date: Sat, 25 Nov 2023 17:43:32 +0900 Subject: [PATCH 11/54] =?UTF-8?q?Docs:=20=EC=B9=B4=EB=93=9C=EC=9D=B8?= =?UTF-8?q?=ED=85=8D=EC=8A=A4=20=EA=B8=B0=EB=8A=A5=20=EB=AA=A9=EB=A1=9D=20?= =?UTF-8?q?=EC=B6=94=EA=B0=80.?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Feat: 카드 인덱스 증가, 현재 인덱스 반환 기능 구현 --- README.md | 4 +++ src/main/kotlin/CardIndex.kt | 10 +++++++ src/test/kotlin/blackJack/CardIndexTest.kt | 34 ++++++++++++++++++++++ 3 files changed, 48 insertions(+) create mode 100644 src/main/kotlin/CardIndex.kt create mode 100644 src/test/kotlin/blackJack/CardIndexTest.kt diff --git a/README.md b/README.md index 8fe1914ec4..3befc2c3d7 100644 --- a/README.md +++ b/README.md @@ -31,6 +31,10 @@ ### 카드팩 - [O] 중복되지 않은 52개의 카드로 구성된다. +### 카드 인덱스 +- [O] 현재 인덱스를 반환한다. +- [O] 인덱스를 1 증가시킨다. + ### inputView - [] 플레이어를 입력받는다. - [] 카드 수집 여부를 받는다.. diff --git a/src/main/kotlin/CardIndex.kt b/src/main/kotlin/CardIndex.kt new file mode 100644 index 0000000000..9ef2ff31fa --- /dev/null +++ b/src/main/kotlin/CardIndex.kt @@ -0,0 +1,10 @@ +class CardIndex(private var index: Int = 0) { + + fun getIndex(): Int { + return index + } + + fun increaseIndex() { + index++ + } +} diff --git a/src/test/kotlin/blackJack/CardIndexTest.kt b/src/test/kotlin/blackJack/CardIndexTest.kt new file mode 100644 index 0000000000..cb6511419e --- /dev/null +++ b/src/test/kotlin/blackJack/CardIndexTest.kt @@ -0,0 +1,34 @@ +package blackJack + +import CardIndex +import org.assertj.core.api.Assertions.assertThat +import org.junit.jupiter.api.Test + +class CardIndexTest { + + @Test + fun `인덱스가 생성되고, 인덱스를 요청할 때, 현재 인덱스를 반환한다`() { + // given : 인덱스가 생성된다. 인덱스는 초기값은 0이다. + val caredIndex = CardIndex() + + // when : 인덱스를 요청한다. + val actual = caredIndex.getIndex() + + // then : 현재 인덱스를 반환한다. + assertThat(actual).isEqualTo(0) + } + + @Test + fun `인덱스가 생성되고, 인덱스 증가 요청할 때, 인덱스가 1 증가된다`() { + // given : 인덱스가 생성된다. + val caredIndex = CardIndex() + val prevIndex = caredIndex.getIndex() + + // when : 인덱스 증가 요청을 한다. + caredIndex.increaseIndex() + val actual = caredIndex.getIndex() + + // then : 인덱스가 1 증가된다. + assertThat(actual).isEqualTo(prevIndex + 1) + } +} From d261000d834396f8bd4c2e21aeb8349aedb9eb46 Mon Sep 17 00:00:00 2001 From: OYJ Date: Sat, 25 Nov 2023 18:06:18 +0900 Subject: [PATCH 12/54] =?UTF-8?q?Docs:=20=EC=B9=B4=EB=93=9C=20=EC=9D=B8?= =?UTF-8?q?=ED=85=8D=EC=8A=A4=20=EA=B2=80=EC=A6=9D=20=EA=B8=B0=EB=8A=A5=20?= =?UTF-8?q?=EB=AA=A9=EB=A1=9D=20=EC=B6=94=EA=B0=80?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Feat: 카드 인덱스 검증 로직 구현 --- README.md | 1 + src/main/kotlin/CardIndex.kt | 11 ++++++++++- src/test/kotlin/blackJack/CardIndexTest.kt | 19 +++++++++++++++++-- 3 files changed, 28 insertions(+), 3 deletions(-) diff --git a/README.md b/README.md index 3befc2c3d7..b259873bbb 100644 --- a/README.md +++ b/README.md @@ -34,6 +34,7 @@ ### 카드 인덱스 - [O] 현재 인덱스를 반환한다. - [O] 인덱스를 1 증가시킨다. +- [O] 인덱스가 카드 수량을 넘지 않는다. ### inputView - [] 플레이어를 입력받는다. diff --git a/src/main/kotlin/CardIndex.kt b/src/main/kotlin/CardIndex.kt index 9ef2ff31fa..4b1e8216a7 100644 --- a/src/main/kotlin/CardIndex.kt +++ b/src/main/kotlin/CardIndex.kt @@ -1,4 +1,4 @@ -class CardIndex(private var index: Int = 0) { +class CardIndex(private var index: Int = 0, private val maxIndex: Int) { fun getIndex(): Int { return index @@ -6,5 +6,14 @@ class CardIndex(private var index: Int = 0) { fun increaseIndex() { index++ + validateIndex() + } + + private fun validateIndex() { + require(index < maxIndex) { ERR_MSG_EMPTY_CARD } + } + + companion object { + private const val ERR_MSG_EMPTY_CARD = "카드가 모두 소진되었습니다." } } diff --git a/src/test/kotlin/blackJack/CardIndexTest.kt b/src/test/kotlin/blackJack/CardIndexTest.kt index cb6511419e..089baf0696 100644 --- a/src/test/kotlin/blackJack/CardIndexTest.kt +++ b/src/test/kotlin/blackJack/CardIndexTest.kt @@ -6,10 +6,12 @@ import org.junit.jupiter.api.Test class CardIndexTest { + private var maxIndex = 52 + @Test fun `인덱스가 생성되고, 인덱스를 요청할 때, 현재 인덱스를 반환한다`() { // given : 인덱스가 생성된다. 인덱스는 초기값은 0이다. - val caredIndex = CardIndex() + val caredIndex = CardIndex(maxIndex = maxIndex) // when : 인덱스를 요청한다. val actual = caredIndex.getIndex() @@ -21,7 +23,7 @@ class CardIndexTest { @Test fun `인덱스가 생성되고, 인덱스 증가 요청할 때, 인덱스가 1 증가된다`() { // given : 인덱스가 생성된다. - val caredIndex = CardIndex() + val caredIndex = CardIndex(maxIndex = maxIndex) val prevIndex = caredIndex.getIndex() // when : 인덱스 증가 요청을 한다. @@ -31,4 +33,17 @@ class CardIndexTest { // then : 인덱스가 1 증가된다. assertThat(actual).isEqualTo(prevIndex + 1) } + + @Test + fun `인덱스가 max값 이고, 인덱스 증가 요청을 할때, 예외를 던진다`() { + // given : 인덱스 값이 max 값 직전인 인덱스를 생성한다 + val startIndex = 51 + val cardIndex = CardIndex(index = startIndex, maxIndex = maxIndex) + + // when : 인덱스 증가 요청을 한다 + val actual = runCatching { cardIndex.increaseIndex() }.exceptionOrNull() + + // then : 예외를 발생시킨다. + assertThat(actual).isInstanceOf(IllegalArgumentException::class.java) + } } From 8aca69f7a54b599fcb882345f60eefd30ddaad63 Mon Sep 17 00:00:00 2001 From: OYJ Date: Sat, 25 Nov 2023 23:08:55 +0900 Subject: [PATCH 13/54] =?UTF-8?q?Feat:=20=EC=B9=B4=EB=93=9C=20=EB=B0=B0?= =?UTF-8?q?=ED=8F=AC=20=EA=B5=AC=ED=98=84?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- README.md | 5 ++-- src/main/kotlin/BlackjackGame.kt | 13 +++++++++ .../kotlin/blackJack/BlackjackGameTest.kt | 28 +++++++++++++++++++ src/test/kotlin/blackJack/CardPackTest.kt | 2 +- 4 files changed, 44 insertions(+), 4 deletions(-) diff --git a/README.md b/README.md index b259873bbb..cd5437b767 100644 --- a/README.md +++ b/README.md @@ -18,8 +18,7 @@ - [O] 중복이 없다. - [O] 52장의 카드로 구성된다. - [] 카드를 셔플한다. -- [] 카드를 배포한다.(한 게임에 중복되는 카드를 배포하지 않는다.) -- [] 배포된 카드의 갯수를 기억한다. +- [O] 카드를 배포한다.(한 게임에 중복되는 카드를 배포하지 않는다.) - [] 플레이어가 있어야 시작된다. - [] 플레이어는 최소 2명 이상이어야 한다. - [] 결과를 계산한다. @@ -38,7 +37,7 @@ ### inputView - [] 플레이어를 입력받는다. -- [] 카드 수집 여부를 받는다.. +- [] 카드 수집 여부를 받는다. ### output - [] 플레이어가 가지고 있는 카드를 보여준다. diff --git a/src/main/kotlin/BlackjackGame.kt b/src/main/kotlin/BlackjackGame.kt index e3c406f486..27bb120d8e 100644 --- a/src/main/kotlin/BlackjackGame.kt +++ b/src/main/kotlin/BlackjackGame.kt @@ -1,11 +1,20 @@ import card.CardPack +import card.PlayingCard class BlackjackGame(private val cardPack: CardPack) { + private val index = CardIndex(maxIndex = cardPack.cardList.size) + init { validateCardPack() } + fun hit(): PlayingCard { + val card = cardPack.cardList[index.getIndex()] + increaseCardIndex() + return card + } + private fun validateCardPack() { validateCardPackSize() validateDuplicateCardPack() @@ -19,6 +28,10 @@ class BlackjackGame(private val cardPack: CardPack) { require(cardPack.cardList.size == cardPack.cardList.distinct().size) { ERR_MSG_DUPLICATE_CARD_PACK } } + private fun increaseCardIndex() { + index.increaseIndex() + } + companion object { private const val CARD_PACK_SIZE = 52 private const val ERR_MSG_CARD_PACK_SIZE = "카드는 52개로 구성되어야 합나다." diff --git a/src/test/kotlin/blackJack/BlackjackGameTest.kt b/src/test/kotlin/blackJack/BlackjackGameTest.kt index cb33e1a161..f96fad5f1f 100644 --- a/src/test/kotlin/blackJack/BlackjackGameTest.kt +++ b/src/test/kotlin/blackJack/BlackjackGameTest.kt @@ -18,4 +18,32 @@ class BlackjackGameTest { // then : 예외를 던지지 않는다. assertThat(actual).isNull() } + + @Test + fun `게임이 시작되고, 카드 배포를 요청할 때, 카드팩의 카드가 반환된다`() { + // given : 카드팩 생성, 게임이 시작된다. + val cardPack = CardPack.getCardPack() + val game = BlackjackGame(cardPack) + + // when : 카드 배포를 한다. + val actual = game.hit() + val expect = cardPack.cardList[0] + + // then : 첫번째 카드팩이 반환된다. + assertThat(actual).isEqualTo(expect) + } + + @Test + fun `게임이 시작되고, 카드 배포를 반복할 때, 동일하지 않은 카드를 배포한다`() { + // given : 카드팩 생성, 게임 시작 + val cardPack = CardPack.getCardPack() + val game = BlackjackGame(cardPack) + + // when : 카드 배포 2회한다. + val card1 = game.hit() + val card2 = game.hit() + + // then : 동일하지 않은 카드가 배포된다. + assertThat(card1).isNotEqualTo(card2) + } } diff --git a/src/test/kotlin/blackJack/CardPackTest.kt b/src/test/kotlin/blackJack/CardPackTest.kt index 6da6943917..ca54ad35de 100644 --- a/src/test/kotlin/blackJack/CardPackTest.kt +++ b/src/test/kotlin/blackJack/CardPackTest.kt @@ -19,7 +19,7 @@ class CardPackTest { val cardPack = CardPack.getCardPack() val cardPackSize = cardPack.cardList.size - val distinctCardPack = cardPack.cardList.distinct() + val distinctCardPack = cardPack.cardList.distinct() val distinctCardPackSize = distinctCardPack.size assertThat(cardPackSize).isEqualTo(distinctCardPackSize) From e897c27c4ebfd42d39ed4fe8ca352cbad4670d05 Mon Sep 17 00:00:00 2001 From: OYJ Date: Sun, 26 Nov 2023 00:37:35 +0900 Subject: [PATCH 14/54] =?UTF-8?q?Feat:=20=ED=94=8C=EB=A0=88=EC=9D=B4?= =?UTF-8?q?=EC=96=B4=20=EC=83=81=ED=83=9C=20=EC=B6=94=EA=B0=80,=20?= =?UTF-8?q?=ED=94=8C=EB=A0=88=EC=9D=B4=EC=96=B4=20=EC=83=81=ED=83=9C=20?= =?UTF-8?q?=EC=B6=94=EA=B0=80=20=EB=B0=8F=20=EB=B3=80=EA=B2=BD=20=EA=B5=AC?= =?UTF-8?q?=ED=98=84?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- README.md | 21 ++++++++++----- src/main/kotlin/player/Player.kt | 12 +++++++++ src/main/kotlin/player/Status.kt | 5 ++++ src/test/kotlin/blackJack/PlayerTest.kt | 36 +++++++++++++++++++++++++ 4 files changed, 68 insertions(+), 6 deletions(-) create mode 100644 src/main/kotlin/player/Player.kt create mode 100644 src/main/kotlin/player/Status.kt create mode 100644 src/test/kotlin/blackJack/PlayerTest.kt diff --git a/README.md b/README.md index cd5437b767..9d9e025a68 100644 --- a/README.md +++ b/README.md @@ -2,21 +2,25 @@ ## 기능 요구 사항 - 블랙잭 게임을 변형한 프로그램을 구현한다. 블랙잭 게임은 딜러와 플레이어 중 카드의 합이 21 또는 21에 가장 가까운 숫자를 가지는 쪽이 이기는 게임이다. - - 카드의 숫자 계산은 카드 숫자를 기본으로 하며, 예외로 Ace는 1 또는 11로 계산할 수 있으며, King, Queen, Jack은 각각 10으로 계산한다. - - 게임을 시작하면 플레이어는 두 장의 카드를 지급 받으며, 두 장의 카드 숫자를 합쳐 21을 초과하지 않으면서 21에 가깝게 만들면 이긴다. 21을 넘지 않을 경우 원한다면 얼마든지 카드를 계속 뽑을 수 있다. +블랙잭 게임을 변형한 프로그램을 구현한다. 블랙잭 게임은 딜러와 플레이어 중 카드의 합이 21 또는 21에 가장 가까운 숫자를 가지는 쪽이 이기는 게임이다. +- 카드의 숫자 계산은 카드 숫자를 기본으로 하며, 예외로 Ace는 1 또는 11로 계산할 수 있으며, King, Queen, Jack은 각각 10으로 계산한다. +- 게임을 시작하면 플레이어는 두 장의 카드를 지급 받으며, 두 장의 카드 숫자를 합쳐 21을 초과하지 않으면서 21에 가깝게 만들면 이긴다. 21을 넘지 않을 경우 원한다면 얼마든지 카드를 계속 뽑을 수 있다. ## 기능 목록 ### 플레이어 + +- [O] 플레이어의 초기 상태는 PLAYING이다. +- [O] 플레이어가 카드 받는 것을 끝내면 상태는 STAND가 된다. - [] 카드를 받는다. - [] 플레이 상태를 반환한다.(스탠드, 스테이) ### 블랙젝 게임 + - [O] 플레잉 카드 팩을 검증한다. - - [O] 중복이 없다. - - [O] 52장의 카드로 구성된다. + - [O] 중복이 없다. + - [O] 52장의 카드로 구성된다. - [] 카드를 셔플한다. - [O] 카드를 배포한다.(한 게임에 중복되는 카드를 배포하지 않는다.) - [] 플레이어가 있어야 시작된다. @@ -24,21 +28,26 @@ - [] 결과를 계산한다. ### 트럼프 카드(플레잉 카드) + - [O] 카드의 포인트를 반환한다. - [O] 카드의 무늬 명을 반환한다. ### 카드팩 + - [O] 중복되지 않은 52개의 카드로 구성된다. ### 카드 인덱스 + - [O] 현재 인덱스를 반환한다. - [O] 인덱스를 1 증가시킨다. -- [O] 인덱스가 카드 수량을 넘지 않는다. +- [O] 인덱스가 카드 수량을 넘지 않는다. ### inputView + - [] 플레이어를 입력받는다. - [] 카드 수집 여부를 받는다. ### output + - [] 플레이어가 가지고 있는 카드를 보여준다. - [] 플레이어 카드 계산값을 보여준다. diff --git a/src/main/kotlin/player/Player.kt b/src/main/kotlin/player/Player.kt new file mode 100644 index 0000000000..4eeee67800 --- /dev/null +++ b/src/main/kotlin/player/Player.kt @@ -0,0 +1,12 @@ +package player + +class Player() { + + private var _status = Status.PLAYING + val status: Status + get() = _status + + fun hitDone() { + _status = Status.STAND + } +} diff --git a/src/main/kotlin/player/Status.kt b/src/main/kotlin/player/Status.kt new file mode 100644 index 0000000000..a719668deb --- /dev/null +++ b/src/main/kotlin/player/Status.kt @@ -0,0 +1,5 @@ +package player + +enum class Status { + PLAYING, STAND +} diff --git a/src/test/kotlin/blackJack/PlayerTest.kt b/src/test/kotlin/blackJack/PlayerTest.kt new file mode 100644 index 0000000000..8b0d853642 --- /dev/null +++ b/src/test/kotlin/blackJack/PlayerTest.kt @@ -0,0 +1,36 @@ +package blackJack + +import org.assertj.core.api.Assertions.assertThat +import org.junit.jupiter.api.Test +import player.Player +import player.Status + +class PlayerTest { + + @Test + fun `,플에이어가 생성될 때 ,초기 상태는 플레이중 이다 `() { + // given : + + // when : 플레이어가 생성될 때 + val player = Player() + val actual = player.status + + // then : 초기 상태는 PLAYING이다. + val expect = Status.PLAYING + assertThat(actual).isEqualTo(expect) + } + + @Test + fun `플에이어가 생성되고, 카드 받기가 종료될 때, 플에이어 상태는 STAND가 된다`() { + // given : 플레이어가 생성된다. + val player = Player() + + // when : 플레이어가 카드 받기를 멈춘다. + player.hitDone() + val actual = player.status + + // then : 플레이어의 상태는 STAND이다. + val expect = Status.STAND + assertThat(actual).isEqualTo(expect) + } +} From 18317d6d6c25c2712ba968b9cf9af66c372ffd5a Mon Sep 17 00:00:00 2001 From: OYJ Date: Sun, 26 Nov 2023 01:12:20 +0900 Subject: [PATCH 15/54] =?UTF-8?q?Feat:=20=ED=94=8C=EB=A0=88=EC=9D=B4?= =?UTF-8?q?=EC=96=B4=20=EC=B9=B4=EB=93=9C=20=EC=A0=80=EC=9E=A5=20=EA=B8=B0?= =?UTF-8?q?=EB=8A=A5=20=EA=B5=AC=ED=98=84?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- README.md | 4 +--- src/main/kotlin/player/Player.kt | 12 +++++++++++- src/test/kotlin/blackJack/PlayerTest.kt | 16 ++++++++++++++++ 3 files changed, 28 insertions(+), 4 deletions(-) diff --git a/README.md b/README.md index 9d9e025a68..b09a6a1f24 100644 --- a/README.md +++ b/README.md @@ -13,8 +13,7 @@ - [O] 플레이어의 초기 상태는 PLAYING이다. - [O] 플레이어가 카드 받는 것을 끝내면 상태는 STAND가 된다. -- [] 카드를 받는다. -- [] 플레이 상태를 반환한다.(스탠드, 스테이) +- [O] 플레이어는 받은 카드를 저장한다. ### 블랙젝 게임 @@ -23,7 +22,6 @@ - [O] 52장의 카드로 구성된다. - [] 카드를 셔플한다. - [O] 카드를 배포한다.(한 게임에 중복되는 카드를 배포하지 않는다.) -- [] 플레이어가 있어야 시작된다. - [] 플레이어는 최소 2명 이상이어야 한다. - [] 결과를 계산한다. diff --git a/src/main/kotlin/player/Player.kt b/src/main/kotlin/player/Player.kt index 4eeee67800..279b0d9b66 100644 --- a/src/main/kotlin/player/Player.kt +++ b/src/main/kotlin/player/Player.kt @@ -1,12 +1,22 @@ package player -class Player() { +import card.PlayingCard + +class Player { private var _status = Status.PLAYING val status: Status get() = _status + private var _cardList = mutableListOf() + val cardList: List + get() = _cardList + fun hitDone() { _status = Status.STAND } + + fun saveCard(card: PlayingCard) { + _cardList.add(card) + } } diff --git a/src/test/kotlin/blackJack/PlayerTest.kt b/src/test/kotlin/blackJack/PlayerTest.kt index 8b0d853642..fd58618568 100644 --- a/src/test/kotlin/blackJack/PlayerTest.kt +++ b/src/test/kotlin/blackJack/PlayerTest.kt @@ -1,5 +1,6 @@ package blackJack +import card.CardPack import org.assertj.core.api.Assertions.assertThat import org.junit.jupiter.api.Test import player.Player @@ -33,4 +34,19 @@ class PlayerTest { val expect = Status.STAND assertThat(actual).isEqualTo(expect) } + + @Test + fun `플레이어와 카드팩이 생성되고, 플레이어가 카드를 받을 때, 받은 카드는 저장한다`() { + // given : 플레이어와 카드팩을 생성한다. + val player = Player() + val cardPack = CardPack.getCardPack() + val card = cardPack.cardList[0] + + // when : 플레이어가 카드를 받는다. + player.saveCard(card) + val actual = player.cardList[0] + + // then : + assertThat(actual).isEqualTo(card) + } } From 88e3b66249919efa9bd8da73b07e23ef632cf3a5 Mon Sep 17 00:00:00 2001 From: OYJ Date: Sun, 26 Nov 2023 01:40:58 +0900 Subject: [PATCH 16/54] =?UTF-8?q?Refactor:=20CardNumber=20=EB=AA=85?= =?UTF-8?q?=EC=B9=AD=20=EC=B6=94=EA=B0=80,=20class=20PlayingCard=20@overri?= =?UTF-8?q?de=20toString(),=20=EC=B9=B4=EB=93=9C=20=EC=85=94=ED=94=8C=20?= =?UTF-8?q?=EA=B8=B0=EB=8A=A5=20=EC=97=AD=ED=95=A0=20=EB=B3=80=EA=B2=BD=20?= =?UTF-8?q?(=EB=B8=94=EB=A0=89=EC=A0=9D=20=EA=B2=8C=EC=9E=84=20->=20?= =?UTF-8?q?=EC=B9=B4=EB=93=9C=ED=8C=A9=20)?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- README.md | 2 +- src/main/kotlin/card/CardNumber.kt | 32 +++++++++++++---------- src/main/kotlin/card/CardPack.kt | 6 +++++ src/main/kotlin/card/PlayingCard.kt | 5 ++++ src/test/kotlin/blackJack/CardPackTest.kt | 6 +++++ 5 files changed, 36 insertions(+), 15 deletions(-) diff --git a/README.md b/README.md index b09a6a1f24..0e4b7efb75 100644 --- a/README.md +++ b/README.md @@ -20,7 +20,6 @@ - [O] 플레잉 카드 팩을 검증한다. - [O] 중복이 없다. - [O] 52장의 카드로 구성된다. -- [] 카드를 셔플한다. - [O] 카드를 배포한다.(한 게임에 중복되는 카드를 배포하지 않는다.) - [] 플레이어는 최소 2명 이상이어야 한다. - [] 결과를 계산한다. @@ -32,6 +31,7 @@ ### 카드팩 +- [O] 카드를 셔플한다.(TestCode X) - [O] 중복되지 않은 52개의 카드로 구성된다. ### 카드 인덱스 diff --git a/src/main/kotlin/card/CardNumber.kt b/src/main/kotlin/card/CardNumber.kt index ab096f4c34..7c5437865b 100644 --- a/src/main/kotlin/card/CardNumber.kt +++ b/src/main/kotlin/card/CardNumber.kt @@ -1,19 +1,19 @@ package card -enum class CardNumber private constructor(private val point: Int) { - ACE(1), - TWO(2), - TREE(3), - FOUR(4), - FIVE(5), - SIX(6), - SEVEN(7), - EIGHT(8), - NINE(9), - TEN(10), - JACK(10), - QUEEN(10), - KING(10); +enum class CardNumber private constructor(private val point: Int, private val cardName: String) { + ACE(1,"A"), + TWO(2,"2"), + TREE(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"); companion object { @@ -26,6 +26,10 @@ enum class CardNumber private constructor(private val point: Int) { return this.point } + fun CardNumber.getCardName(): String { + return this.cardName + } + fun getCardNumberList() = cardNumberList } } diff --git a/src/main/kotlin/card/CardPack.kt b/src/main/kotlin/card/CardPack.kt index a3db062323..665038b44d 100644 --- a/src/main/kotlin/card/CardPack.kt +++ b/src/main/kotlin/card/CardPack.kt @@ -13,9 +13,15 @@ class CardPack(val cardList: List) { playingCardList.addAll(createCardWithSuit(suit)) } + cardShuffle(playingCardList) + return CardPack(playingCardList) } + private fun cardShuffle(playingCardList: MutableList) { + playingCardList.shuffle() + } + private fun createCardWithSuit(suit: Suit): List { val playingCardList = mutableListOf() val cardNumberList = CardNumber.getCardNumberList() diff --git a/src/main/kotlin/card/PlayingCard.kt b/src/main/kotlin/card/PlayingCard.kt index d8472007f7..fa95370758 100644 --- a/src/main/kotlin/card/PlayingCard.kt +++ b/src/main/kotlin/card/PlayingCard.kt @@ -1,5 +1,6 @@ package card +import card.CardNumber.Companion.getCardName import card.CardNumber.Companion.getPoint import card.Suit.Companion.getName @@ -16,6 +17,10 @@ class PlayingCard(private val suit: Suit, private val cardNumber: CardNumber) { return suit.getName() } + override fun toString(): String { + return "${cardNumber.getCardName()}${suit.koName}" + } + companion object { private const val ADD_ACE_NUMBER = 10 private const val ACE_POINT = 1 diff --git a/src/test/kotlin/blackJack/CardPackTest.kt b/src/test/kotlin/blackJack/CardPackTest.kt index ca54ad35de..48585732b8 100644 --- a/src/test/kotlin/blackJack/CardPackTest.kt +++ b/src/test/kotlin/blackJack/CardPackTest.kt @@ -24,4 +24,10 @@ class CardPackTest { assertThat(cardPackSize).isEqualTo(distinctCardPackSize) } + + @Test + fun `aff`() { + val cardPack = CardPack.getCardPack() + println(cardPack.cardList[0]) + } } From c5b5adfd3396bd08cd7fc6ebd15cdc90fb1ebc7d Mon Sep 17 00:00:00 2001 From: OYJ Date: Sun, 26 Nov 2023 02:23:36 +0900 Subject: [PATCH 17/54] =?UTF-8?q?Refactor:=20=EB=B8=94=EB=9E=99=EC=A0=9D?= =?UTF-8?q?=20=EA=B2=8C=EC=9E=84=20=EB=94=94=ED=8F=B4=ED=8A=B8=20=ED=8C=8C?= =?UTF-8?q?=EB=9D=BC=EB=AF=B8=ED=84=B0=20=EC=B6=94=EA=B0=80=20-=20playerLi?= =?UTF-8?q?st:=20List?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Feat: 추가된 사용자 검증 로직 추가. --- README.md | 2 +- src/main/kotlin/BlackjackGame.kt | 10 ++++++- .../kotlin/blackJack/BlackjackGameTest.kt | 28 ++++++++++++++++--- 3 files changed, 34 insertions(+), 6 deletions(-) diff --git a/README.md b/README.md index 0e4b7efb75..3d1c430599 100644 --- a/README.md +++ b/README.md @@ -21,7 +21,7 @@ - [O] 중복이 없다. - [O] 52장의 카드로 구성된다. - [O] 카드를 배포한다.(한 게임에 중복되는 카드를 배포하지 않는다.) -- [] 플레이어는 최소 2명 이상이어야 한다. +- [O] 플레이어는 최소 2명 이상 26명 이하 이어야 한다. - [] 결과를 계산한다. ### 트럼프 카드(플레잉 카드) diff --git a/src/main/kotlin/BlackjackGame.kt b/src/main/kotlin/BlackjackGame.kt index 27bb120d8e..b46da116dc 100644 --- a/src/main/kotlin/BlackjackGame.kt +++ b/src/main/kotlin/BlackjackGame.kt @@ -1,12 +1,14 @@ import card.CardPack import card.PlayingCard +import player.Player -class BlackjackGame(private val cardPack: CardPack) { +class BlackjackGame(private val cardPack: CardPack, private val playerList: List) { private val index = CardIndex(maxIndex = cardPack.cardList.size) init { validateCardPack() + validatePlayer() } fun hit(): PlayingCard { @@ -28,6 +30,10 @@ class BlackjackGame(private val cardPack: CardPack) { require(cardPack.cardList.size == cardPack.cardList.distinct().size) { ERR_MSG_DUPLICATE_CARD_PACK } } + private fun validatePlayer() { + require(playerList.size in MIN_PLAYER_CNT..MAX_PLAYER_CNT) { "참여 가능한 플레이어의 범위를 넘어섰습니다." } + } + private fun increaseCardIndex() { index.increaseIndex() } @@ -36,5 +42,7 @@ class BlackjackGame(private val cardPack: CardPack) { private const val CARD_PACK_SIZE = 52 private const val ERR_MSG_CARD_PACK_SIZE = "카드는 52개로 구성되어야 합나다." private const val ERR_MSG_DUPLICATE_CARD_PACK = "중복되는 카드는 없어야 합니다." + private const val MIN_PLAYER_CNT = 2 + private const val MAX_PLAYER_CNT = CARD_PACK_SIZE / 2 } } diff --git a/src/test/kotlin/blackJack/BlackjackGameTest.kt b/src/test/kotlin/blackJack/BlackjackGameTest.kt index f96fad5f1f..2c9a65e1bc 100644 --- a/src/test/kotlin/blackJack/BlackjackGameTest.kt +++ b/src/test/kotlin/blackJack/BlackjackGameTest.kt @@ -3,17 +3,21 @@ package blackJack import BlackjackGame import card.CardPack import org.assertj.core.api.Assertions.assertThat +import org.assertj.core.internal.Classes import org.junit.jupiter.api.Test +import org.junit.jupiter.params.ParameterizedTest +import org.junit.jupiter.params.provider.ValueSource +import player.Player class BlackjackGameTest { - + private val defaultPlayers = listOf(Player(), Player()) @Test fun `정상적인 카드팩을 받고, 게임에 주입되었을 때, 예외 검증을 통과한다`() { // given : 정상적인 카드팩을 받는다. val cardPack = CardPack.getCardPack() // when : 게임에 카드를 주입한다. - val actual = runCatching { BlackjackGame(cardPack) }.exceptionOrNull() + val actual = runCatching { BlackjackGame(cardPack, defaultPlayers) }.exceptionOrNull() // then : 예외를 던지지 않는다. assertThat(actual).isNull() @@ -23,7 +27,7 @@ class BlackjackGameTest { fun `게임이 시작되고, 카드 배포를 요청할 때, 카드팩의 카드가 반환된다`() { // given : 카드팩 생성, 게임이 시작된다. val cardPack = CardPack.getCardPack() - val game = BlackjackGame(cardPack) + val game = BlackjackGame(cardPack, defaultPlayers) // when : 카드 배포를 한다. val actual = game.hit() @@ -37,7 +41,7 @@ class BlackjackGameTest { fun `게임이 시작되고, 카드 배포를 반복할 때, 동일하지 않은 카드를 배포한다`() { // given : 카드팩 생성, 게임 시작 val cardPack = CardPack.getCardPack() - val game = BlackjackGame(cardPack) + val game = BlackjackGame(cardPack, defaultPlayers) // when : 카드 배포 2회한다. val card1 = game.hit() @@ -46,4 +50,20 @@ class BlackjackGameTest { // then : 동일하지 않은 카드가 배포된다. assertThat(card1).isNotEqualTo(card2) } + + @ParameterizedTest + fun `게임을 생성한다면, 플레이어가 2명 이상 26명 이하의 범위를 넘어설때, 예외를 던진다`() { + // given : 카드팩과 범위를 넘어서는 플레이어 리스트가 생성된다. + val cardPack = CardPack.getCardPack() + val singlePlayerList = listOf(Player()) + val overPlayerList = List(27) { Player() } + + // when : 게임에 플레이어를 주입한다 + val actualSingle = runCatching { BlackjackGame(cardPack, singlePlayerList) }.exceptionOrNull() + val actualOver = runCatching { BlackjackGame(cardPack, overPlayerList) }.exceptionOrNull() + + // then : 예외를 던진다. + assertThat(actualSingle).isInstanceOf(IllegalArgumentException::class.java) + assertThat(actualOver).isInstanceOf(IllegalArgumentException::class.java) + } } From aae5ec23d54f8b48737d2579a8d224f179f75a87 Mon Sep 17 00:00:00 2001 From: OYJ Date: Mon, 27 Nov 2023 00:02:14 +0900 Subject: [PATCH 18/54] =?UTF-8?q?Docs:=20=EB=B8=94=EB=9E=99=EC=A0=9D=20?= =?UTF-8?q?=EA=B2=8C=EC=9E=84=20=EA=B8=B0=EB=8A=A5=20=EC=B6=94=EA=B0=80,?= =?UTF-8?q?=20=EB=B8=94=EB=9E=99=EC=A0=9D=20=EA=B3=84=EC=82=B0=EA=B8=B0=20?= =?UTF-8?q?=EC=B6=94=EA=B0=80.?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- README.md | 7 +++++++ 1 file changed, 7 insertions(+) diff --git a/README.md b/README.md index 3d1c430599..140c67284b 100644 --- a/README.md +++ b/README.md @@ -22,7 +22,14 @@ - [O] 52장의 카드로 구성된다. - [O] 카드를 배포한다.(한 게임에 중복되는 카드를 배포하지 않는다.) - [O] 플레이어는 최소 2명 이상 26명 이하 이어야 한다. +- [] 사용자는 게임 시작시 2장의 카드를 받는다. +- [] 카드의 합이 21을 초과하면 더이상 카드를 받을 수 없다.(STAND) + +### 블랙젝 계산기 - [] 결과를 계산한다. + - [] A를 제외한 합이 11이상이라면 A는 1로 계산한다. + - [] A를 제외한 합이 10이하이라면 A는 11로 계산한다. + - [] 카드의 합을 반환한다. ### 트럼프 카드(플레잉 카드) From 84b7ea92c745ec559ba390aab067ad4b1c75b79a Mon Sep 17 00:00:00 2001 From: OYJ Date: Mon, 27 Nov 2023 00:19:49 +0900 Subject: [PATCH 19/54] =?UTF-8?q?Feat:=20=EC=B9=B4=EB=93=9C=20=EC=B4=88?= =?UTF-8?q?=EA=B8=B0=20=EC=84=B8=ED=8C=85=20=EA=B8=B0=EB=8A=A5=20=EC=B6=94?= =?UTF-8?q?=EA=B0=80(=EA=B2=8C=EC=9E=84=20=EC=8B=9C=EC=9E=91=EC=8B=9C=20?= =?UTF-8?q?=EC=B9=B4=EB=93=9C=202=EC=9E=A5=20=EB=B0=9B=EC=9D=8C)?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Refactor: 사용자 이름 추가. style: CardNumber 컨벤션 수정 --- README.md | 2 +- src/main/kotlin/BlackjackGame.kt | 9 ++++++ src/main/kotlin/card/CardNumber.kt | 26 ++++++++-------- src/main/kotlin/player/Player.kt | 4 ++- .../kotlin/blackJack/BlackjackGameTest.kt | 30 ++++++++++++++----- src/test/kotlin/blackJack/PlayerTest.kt | 6 ++-- 6 files changed, 52 insertions(+), 25 deletions(-) diff --git a/README.md b/README.md index 140c67284b..9e30adb040 100644 --- a/README.md +++ b/README.md @@ -22,7 +22,7 @@ - [O] 52장의 카드로 구성된다. - [O] 카드를 배포한다.(한 게임에 중복되는 카드를 배포하지 않는다.) - [O] 플레이어는 최소 2명 이상 26명 이하 이어야 한다. -- [] 사용자는 게임 시작시 2장의 카드를 받는다. +- [O] 사용자는 게임 시작시 2장의 카드를 받는다. - [] 카드의 합이 21을 초과하면 더이상 카드를 받을 수 없다.(STAND) ### 블랙젝 계산기 diff --git a/src/main/kotlin/BlackjackGame.kt b/src/main/kotlin/BlackjackGame.kt index b46da116dc..4accd719bd 100644 --- a/src/main/kotlin/BlackjackGame.kt +++ b/src/main/kotlin/BlackjackGame.kt @@ -9,6 +9,15 @@ class BlackjackGame(private val cardPack: CardPack, private val playerList: List init { validateCardPack() validatePlayer() + playerList.forEach { + initCardSetting(it) + } + } + + private fun initCardSetting(player: Player) { + repeat(2) { + player.saveCard(hit()) + } } fun hit(): PlayingCard { diff --git a/src/main/kotlin/card/CardNumber.kt b/src/main/kotlin/card/CardNumber.kt index 7c5437865b..0d7b53d71f 100644 --- a/src/main/kotlin/card/CardNumber.kt +++ b/src/main/kotlin/card/CardNumber.kt @@ -1,19 +1,19 @@ package card enum class CardNumber private constructor(private val point: Int, private val cardName: String) { - ACE(1,"A"), - TWO(2,"2"), - TREE(3,"3"), - FOUR(4,"4"), - FIVE(5,"5"), - SIX(6,"6"), - SEVEN(7,"7"), - EIGHT(8,"8"), - NINE(9,"9"), - TEN(10,"10"), - JACK(10,"J"), - QUEEN(10,"Q"), - KING(10,"K"); + ACE(1, "A"), + TWO(2, "2"), + TREE(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"); companion object { diff --git a/src/main/kotlin/player/Player.kt b/src/main/kotlin/player/Player.kt index 279b0d9b66..a3a4ca98da 100644 --- a/src/main/kotlin/player/Player.kt +++ b/src/main/kotlin/player/Player.kt @@ -2,7 +2,7 @@ package player import card.PlayingCard -class Player { +class Player(private val name: String) { private var _status = Status.PLAYING val status: Status @@ -19,4 +19,6 @@ class Player { fun saveCard(card: PlayingCard) { _cardList.add(card) } + + fun getName() = name } diff --git a/src/test/kotlin/blackJack/BlackjackGameTest.kt b/src/test/kotlin/blackJack/BlackjackGameTest.kt index 2c9a65e1bc..fe2ff68e96 100644 --- a/src/test/kotlin/blackJack/BlackjackGameTest.kt +++ b/src/test/kotlin/blackJack/BlackjackGameTest.kt @@ -3,14 +3,13 @@ package blackJack import BlackjackGame import card.CardPack import org.assertj.core.api.Assertions.assertThat -import org.assertj.core.internal.Classes import org.junit.jupiter.api.Test -import org.junit.jupiter.params.ParameterizedTest -import org.junit.jupiter.params.provider.ValueSource import player.Player class BlackjackGameTest { - private val defaultPlayers = listOf(Player(), Player()) + + private val defaultPlayers = listOf(Player("OYJ"), Player("OYJ")) + @Test fun `정상적인 카드팩을 받고, 게임에 주입되었을 때, 예외 검증을 통과한다`() { // given : 정상적인 카드팩을 받는다. @@ -51,12 +50,12 @@ class BlackjackGameTest { assertThat(card1).isNotEqualTo(card2) } - @ParameterizedTest + @Test fun `게임을 생성한다면, 플레이어가 2명 이상 26명 이하의 범위를 넘어설때, 예외를 던진다`() { // given : 카드팩과 범위를 넘어서는 플레이어 리스트가 생성된다. val cardPack = CardPack.getCardPack() - val singlePlayerList = listOf(Player()) - val overPlayerList = List(27) { Player() } + val singlePlayerList = listOf(Player("OYJ")) + val overPlayerList = List(27) { Player("OYJ") } // when : 게임에 플레이어를 주입한다 val actualSingle = runCatching { BlackjackGame(cardPack, singlePlayerList) }.exceptionOrNull() @@ -66,4 +65,21 @@ class BlackjackGameTest { assertThat(actualSingle).isInstanceOf(IllegalArgumentException::class.java) assertThat(actualOver).isInstanceOf(IllegalArgumentException::class.java) } + + @Test + fun `플레이어 2명과 카드팩으로 구성되고, 게임이 시작될 때, 각 플레이어는 카드 2장을 받는다`() { + // given : 플레이어 2명과 카드팩이 있다. + val cardPack = CardPack.getCardPack() + val playerList = listOf(Player("PoPo"), Player("OYJ")) + + // when : 게임이 시작된다. + val game = BlackjackGame(cardPack, playerList) + + // then : 각 플레이어는 카드를 2장 받는다. + playerList.forEach { + val actual = it.cardList.size + val expect = 2 + assertThat(actual).isEqualTo(expect) + } + } } diff --git a/src/test/kotlin/blackJack/PlayerTest.kt b/src/test/kotlin/blackJack/PlayerTest.kt index fd58618568..9f2f375c88 100644 --- a/src/test/kotlin/blackJack/PlayerTest.kt +++ b/src/test/kotlin/blackJack/PlayerTest.kt @@ -13,7 +13,7 @@ class PlayerTest { // given : // when : 플레이어가 생성될 때 - val player = Player() + val player = Player("OYJ") val actual = player.status // then : 초기 상태는 PLAYING이다. @@ -24,7 +24,7 @@ class PlayerTest { @Test fun `플에이어가 생성되고, 카드 받기가 종료될 때, 플에이어 상태는 STAND가 된다`() { // given : 플레이어가 생성된다. - val player = Player() + val player = Player("OYJ") // when : 플레이어가 카드 받기를 멈춘다. player.hitDone() @@ -38,7 +38,7 @@ class PlayerTest { @Test fun `플레이어와 카드팩이 생성되고, 플레이어가 카드를 받을 때, 받은 카드는 저장한다`() { // given : 플레이어와 카드팩을 생성한다. - val player = Player() + val player = Player("OYJ") val cardPack = CardPack.getCardPack() val card = cardPack.cardList[0] From f4fef005896b283c77e1bebfb1497996d7e7db44 Mon Sep 17 00:00:00 2001 From: OYJ Date: Mon, 27 Nov 2023 20:45:45 +0900 Subject: [PATCH 20/54] =?UTF-8?q?Refactor:=20CardIndex=20->=20GameIndex?= =?UTF-8?q?=EB=A1=9C=20=EC=97=AD=ED=95=A0=20=EB=B2=94=EC=9C=84=20=ED=99=95?= =?UTF-8?q?=EC=9E=A5.=20Index=20=EA=B0=92=20=EC=83=9D=EC=84=B1=EC=9E=90=20?= =?UTF-8?q?=ED=8C=8C=EB=9D=BC=EB=AF=B8=ED=84=B0=20->=20Backing=20Property?= =?UTF-8?q?=20=EB=B3=80=EA=B2=BD?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- README.md | 2 +- src/main/kotlin/BlackjackGame.kt | 4 +-- .../kotlin/{CardIndex.kt => GameIndex.kt} | 12 ++++---- .../{CardIndexTest.kt => GameIndexTest.kt} | 29 ++++++++++--------- 4 files changed, 25 insertions(+), 22 deletions(-) rename src/main/kotlin/{CardIndex.kt => GameIndex.kt} (52%) rename src/test/kotlin/blackJack/{CardIndexTest.kt => GameIndexTest.kt} (58%) diff --git a/README.md b/README.md index 9e30adb040..f14055cbb8 100644 --- a/README.md +++ b/README.md @@ -41,7 +41,7 @@ - [O] 카드를 셔플한다.(TestCode X) - [O] 중복되지 않은 52개의 카드로 구성된다. -### 카드 인덱스 +### 게임 인덱스 - [O] 현재 인덱스를 반환한다. - [O] 인덱스를 1 증가시킨다. diff --git a/src/main/kotlin/BlackjackGame.kt b/src/main/kotlin/BlackjackGame.kt index 4accd719bd..b318511409 100644 --- a/src/main/kotlin/BlackjackGame.kt +++ b/src/main/kotlin/BlackjackGame.kt @@ -4,7 +4,7 @@ import player.Player class BlackjackGame(private val cardPack: CardPack, private val playerList: List) { - private val index = CardIndex(maxIndex = cardPack.cardList.size) + private val index = GameIndex(maxIndex = cardPack.cardList.size) init { validateCardPack() @@ -21,7 +21,7 @@ class BlackjackGame(private val cardPack: CardPack, private val playerList: List } fun hit(): PlayingCard { - val card = cardPack.cardList[index.getIndex()] + val card = cardPack.cardList[index.index] increaseCardIndex() return card } diff --git a/src/main/kotlin/CardIndex.kt b/src/main/kotlin/GameIndex.kt similarity index 52% rename from src/main/kotlin/CardIndex.kt rename to src/main/kotlin/GameIndex.kt index 4b1e8216a7..23eb4e9cbb 100644 --- a/src/main/kotlin/CardIndex.kt +++ b/src/main/kotlin/GameIndex.kt @@ -1,16 +1,16 @@ -class CardIndex(private var index: Int = 0, private val maxIndex: Int) { +class GameIndex(private val maxIndex: Int) { - fun getIndex(): Int { - return index - } + private var _index: Int = 0 + val index: Int + get() = _index fun increaseIndex() { - index++ + _index++ validateIndex() } private fun validateIndex() { - require(index < maxIndex) { ERR_MSG_EMPTY_CARD } + require(_index < maxIndex) { ERR_MSG_EMPTY_CARD } } companion object { diff --git a/src/test/kotlin/blackJack/CardIndexTest.kt b/src/test/kotlin/blackJack/GameIndexTest.kt similarity index 58% rename from src/test/kotlin/blackJack/CardIndexTest.kt rename to src/test/kotlin/blackJack/GameIndexTest.kt index 089baf0696..1eb058cb8b 100644 --- a/src/test/kotlin/blackJack/CardIndexTest.kt +++ b/src/test/kotlin/blackJack/GameIndexTest.kt @@ -1,20 +1,20 @@ package blackJack -import CardIndex +import GameIndex import org.assertj.core.api.Assertions.assertThat import org.junit.jupiter.api.Test -class CardIndexTest { +class GameIndexTest { private var maxIndex = 52 @Test fun `인덱스가 생성되고, 인덱스를 요청할 때, 현재 인덱스를 반환한다`() { // given : 인덱스가 생성된다. 인덱스는 초기값은 0이다. - val caredIndex = CardIndex(maxIndex = maxIndex) + val caredIndex = GameIndex(maxIndex = maxIndex) // when : 인덱스를 요청한다. - val actual = caredIndex.getIndex() + val actual = caredIndex.index // then : 현재 인덱스를 반환한다. assertThat(actual).isEqualTo(0) @@ -23,27 +23,30 @@ class CardIndexTest { @Test fun `인덱스가 생성되고, 인덱스 증가 요청할 때, 인덱스가 1 증가된다`() { // given : 인덱스가 생성된다. - val caredIndex = CardIndex(maxIndex = maxIndex) - val prevIndex = caredIndex.getIndex() + val caredIndex = GameIndex(maxIndex = maxIndex) + val prevIndex = caredIndex.index // when : 인덱스 증가 요청을 한다. caredIndex.increaseIndex() - val actual = caredIndex.getIndex() + val actual = caredIndex.index // then : 인덱스가 1 증가된다. assertThat(actual).isEqualTo(prevIndex + 1) } @Test - fun `인덱스가 max값 이고, 인덱스 증가 요청을 할때, 예외를 던진다`() { - // given : 인덱스 값이 max 값 직전인 인덱스를 생성한다 - val startIndex = 51 - val cardIndex = CardIndex(index = startIndex, maxIndex = maxIndex) + fun `maxIndex까지 도달하고, 인덱스 증가 요청을 할때, 예외를 던진다`() { + // given : max인덱스 값을 설정하여 생성 생성, + val gameIndex = GameIndex(maxIndex = maxIndex) + // maxIndex까지 도달한다 + repeat(maxIndex - 1) { + gameIndex.increaseIndex() + } // when : 인덱스 증가 요청을 한다 - val actual = runCatching { cardIndex.increaseIndex() }.exceptionOrNull() + val actual = runCatching { gameIndex.increaseIndex() }.exceptionOrNull() - // then : 예외를 발생시킨다. + // then : 예외를 던진다. assertThat(actual).isInstanceOf(IllegalArgumentException::class.java) } } From 231ba0497df0d5ca0047ae4da16af53d92f27aaa Mon Sep 17 00:00:00 2001 From: OYJ Date: Mon, 27 Nov 2023 20:59:09 +0900 Subject: [PATCH 21/54] =?UTF-8?q?Refactor:=20=EC=B0=B8=EC=97=AC=20?= =?UTF-8?q?=EA=B0=80=EB=8A=A5=20=ED=94=8C=EB=A0=88=EC=9D=B4=EC=96=B4=20?= =?UTF-8?q?=EC=A1=B0=EA=B1=B4=20=EB=B3=80=EA=B2=BD,=20=EC=B9=B4=EB=93=9C?= =?UTF-8?q?=ED=8C=A9=20=EA=B2=80=EC=A6=9D=20=EB=A1=9C=EC=A7=81=20=EC=97=AD?= =?UTF-8?q?=ED=95=A0=20=EB=B3=80=EA=B2=BD(BlackjackGame=20->=20CardPack),?= =?UTF-8?q?=20=EC=B2=AB=20=EC=B9=B4=EB=93=9C=20=EB=B0=B0=ED=8F=AC=20?= =?UTF-8?q?=EC=9D=B8=EB=8D=B1=EC=8A=A4=20=EB=B3=80=EA=B2=BD(=ED=94=8C?= =?UTF-8?q?=EB=A0=88=EC=9D=B4=EC=96=B4=20=EB=B3=84=202=EC=9E=A5=EC=9D=80?= =?UTF-8?q?=20=EA=B8=B0=EB=B3=B8)?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- README.md | 2 +- src/main/kotlin/BlackjackGame.kt | 20 +--------------- src/main/kotlin/card/CardPack.kt | 23 +++++++++++++++++-- .../kotlin/blackJack/BlackjackGameTest.kt | 4 ++-- src/test/kotlin/blackJack/CardPackTest.kt | 6 ----- 5 files changed, 25 insertions(+), 30 deletions(-) diff --git a/README.md b/README.md index f14055cbb8..f4c335c474 100644 --- a/README.md +++ b/README.md @@ -21,7 +21,7 @@ - [O] 중복이 없다. - [O] 52장의 카드로 구성된다. - [O] 카드를 배포한다.(한 게임에 중복되는 카드를 배포하지 않는다.) -- [O] 플레이어는 최소 2명 이상 26명 이하 이어야 한다. +- [O] 플레이어는 최소 2명 이상 카드팩의 카드 수 /2 명 이하여야한다. - [O] 사용자는 게임 시작시 2장의 카드를 받는다. - [] 카드의 합이 21을 초과하면 더이상 카드를 받을 수 없다.(STAND) diff --git a/src/main/kotlin/BlackjackGame.kt b/src/main/kotlin/BlackjackGame.kt index b318511409..defdd1cb13 100644 --- a/src/main/kotlin/BlackjackGame.kt +++ b/src/main/kotlin/BlackjackGame.kt @@ -7,7 +7,6 @@ class BlackjackGame(private val cardPack: CardPack, private val playerList: List private val index = GameIndex(maxIndex = cardPack.cardList.size) init { - validateCardPack() validatePlayer() playerList.forEach { initCardSetting(it) @@ -26,21 +25,8 @@ class BlackjackGame(private val cardPack: CardPack, private val playerList: List return card } - private fun validateCardPack() { - validateCardPackSize() - validateDuplicateCardPack() - } - - private fun validateCardPackSize() { - require(cardPack.cardList.size == CARD_PACK_SIZE) { ERR_MSG_CARD_PACK_SIZE } - } - - private fun validateDuplicateCardPack() { - require(cardPack.cardList.size == cardPack.cardList.distinct().size) { ERR_MSG_DUPLICATE_CARD_PACK } - } - private fun validatePlayer() { - require(playerList.size in MIN_PLAYER_CNT..MAX_PLAYER_CNT) { "참여 가능한 플레이어의 범위를 넘어섰습니다." } + require(playerList.size in MIN_PLAYER_CNT..cardPack.cardList.size / 2) { "참여 가능한 플레이어의 범위를 넘어섰습니다." } } private fun increaseCardIndex() { @@ -48,10 +34,6 @@ class BlackjackGame(private val cardPack: CardPack, private val playerList: List } companion object { - private const val CARD_PACK_SIZE = 52 - private const val ERR_MSG_CARD_PACK_SIZE = "카드는 52개로 구성되어야 합나다." - private const val ERR_MSG_DUPLICATE_CARD_PACK = "중복되는 카드는 없어야 합니다." private const val MIN_PLAYER_CNT = 2 - private const val MAX_PLAYER_CNT = CARD_PACK_SIZE / 2 } } diff --git a/src/main/kotlin/card/CardPack.kt b/src/main/kotlin/card/CardPack.kt index 665038b44d..bacf9eedbc 100644 --- a/src/main/kotlin/card/CardPack.kt +++ b/src/main/kotlin/card/CardPack.kt @@ -3,6 +3,10 @@ package card class CardPack(val cardList: List) { companion object { + private const val CARD_PACK_SIZE = 52 + private const val ERR_MSG_CARD_PACK_SIZE = "카드는 52개로 구성되어야 합나다." + private const val ERR_MSG_DUPLICATE_CARD_PACK = "중복되는 카드는 없어야 합니다." + private val cardPack = createCard() private fun createCard(): CardPack { @@ -12,10 +16,12 @@ class CardPack(val cardList: List) { for (suit in suitList) { playingCardList.addAll(createCardWithSuit(suit)) } - cardShuffle(playingCardList) - return CardPack(playingCardList) + val cardPack = CardPack(playingCardList) + validateCardPack(cardPack) + + return cardPack } private fun cardShuffle(playingCardList: MutableList) { @@ -32,6 +38,19 @@ class CardPack(val cardList: List) { return playingCardList } + private fun validateCardPack(cardPack: CardPack) { + validateCardPackSize(cardPack) + validateDuplicateCardPack(cardPack) + } + + private fun validateCardPackSize(cardPack: CardPack) { + require(cardPack.cardList.size == CARD_PACK_SIZE) { ERR_MSG_CARD_PACK_SIZE } + } + + private fun validateDuplicateCardPack(cardPack: CardPack) { + require(cardPack.cardList.size == cardPack.cardList.distinct().size) { ERR_MSG_DUPLICATE_CARD_PACK } + } + fun getCardPack(): CardPack { return cardPack } diff --git a/src/test/kotlin/blackJack/BlackjackGameTest.kt b/src/test/kotlin/blackJack/BlackjackGameTest.kt index fe2ff68e96..b5be3f3f45 100644 --- a/src/test/kotlin/blackJack/BlackjackGameTest.kt +++ b/src/test/kotlin/blackJack/BlackjackGameTest.kt @@ -23,14 +23,14 @@ class BlackjackGameTest { } @Test - fun `게임이 시작되고, 카드 배포를 요청할 때, 카드팩의 카드가 반환된다`() { + fun `게임이 시작되고, 카드 배포를 요청할 때, 카드팩의 5번째 카드가 반환된다`() { // given : 카드팩 생성, 게임이 시작된다. val cardPack = CardPack.getCardPack() val game = BlackjackGame(cardPack, defaultPlayers) // when : 카드 배포를 한다. val actual = game.hit() - val expect = cardPack.cardList[0] + val expect = cardPack.cardList[4] // then : 첫번째 카드팩이 반환된다. assertThat(actual).isEqualTo(expect) diff --git a/src/test/kotlin/blackJack/CardPackTest.kt b/src/test/kotlin/blackJack/CardPackTest.kt index 48585732b8..ca54ad35de 100644 --- a/src/test/kotlin/blackJack/CardPackTest.kt +++ b/src/test/kotlin/blackJack/CardPackTest.kt @@ -24,10 +24,4 @@ class CardPackTest { assertThat(cardPackSize).isEqualTo(distinctCardPackSize) } - - @Test - fun `aff`() { - val cardPack = CardPack.getCardPack() - println(cardPack.cardList[0]) - } } From 07f695a261d1a9a36d9b5ed4dcea7cf7a5272cc9 Mon Sep 17 00:00:00 2001 From: OYJ Date: Mon, 27 Nov 2023 21:03:53 +0900 Subject: [PATCH 22/54] =?UTF-8?q?Chore:=20=ED=94=84=EB=A1=9C=EB=8D=95?= =?UTF-8?q?=ED=8A=B8=20=ED=81=B4=EB=9E=98=EC=8A=A4,=20=ED=85=8C=EC=8A=A4?= =?UTF-8?q?=ED=8A=B8=20=ED=81=B4=EB=9E=98=EC=8A=A4=20=ED=8C=A8=ED=82=A4?= =?UTF-8?q?=EC=A7=80=20=EA=B5=AC=EC=A1=B0=20=EB=8F=99=EA=B8=B0=ED=99=94?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- src/test/kotlin/blackJack/{ => card}/CardPackTest.kt | 2 +- src/test/kotlin/blackJack/{ => card}/PlayingCardTest.kt | 2 +- src/test/kotlin/blackJack/{ => player}/PlayerTest.kt | 2 +- 3 files changed, 3 insertions(+), 3 deletions(-) rename src/test/kotlin/blackJack/{ => card}/CardPackTest.kt (96%) rename src/test/kotlin/blackJack/{ => card}/PlayingCardTest.kt (98%) rename src/test/kotlin/blackJack/{ => player}/PlayerTest.kt (98%) diff --git a/src/test/kotlin/blackJack/CardPackTest.kt b/src/test/kotlin/blackJack/card/CardPackTest.kt similarity index 96% rename from src/test/kotlin/blackJack/CardPackTest.kt rename to src/test/kotlin/blackJack/card/CardPackTest.kt index ca54ad35de..ad87780be1 100644 --- a/src/test/kotlin/blackJack/CardPackTest.kt +++ b/src/test/kotlin/blackJack/card/CardPackTest.kt @@ -1,4 +1,4 @@ -package blackJack +package blackJack.card import card.CardPack import org.assertj.core.api.Assertions.assertThat diff --git a/src/test/kotlin/blackJack/PlayingCardTest.kt b/src/test/kotlin/blackJack/card/PlayingCardTest.kt similarity index 98% rename from src/test/kotlin/blackJack/PlayingCardTest.kt rename to src/test/kotlin/blackJack/card/PlayingCardTest.kt index 0d51169ba6..d541f0692e 100644 --- a/src/test/kotlin/blackJack/PlayingCardTest.kt +++ b/src/test/kotlin/blackJack/card/PlayingCardTest.kt @@ -1,4 +1,4 @@ -package blackJack +package blackJack.card import card.CardNumber import card.PlayingCard diff --git a/src/test/kotlin/blackJack/PlayerTest.kt b/src/test/kotlin/blackJack/player/PlayerTest.kt similarity index 98% rename from src/test/kotlin/blackJack/PlayerTest.kt rename to src/test/kotlin/blackJack/player/PlayerTest.kt index 9f2f375c88..cfe36e0c85 100644 --- a/src/test/kotlin/blackJack/PlayerTest.kt +++ b/src/test/kotlin/blackJack/player/PlayerTest.kt @@ -1,4 +1,4 @@ -package blackJack +package blackJack.player import card.CardPack import org.assertj.core.api.Assertions.assertThat From 5b836547da7393d6d5467f5d5bfb09aa88ec2aef Mon Sep 17 00:00:00 2001 From: OYJ Date: Mon, 27 Nov 2023 22:11:32 +0900 Subject: [PATCH 23/54] =?UTF-8?q?Feat:=20=EB=B8=94=EB=9E=99=EC=A0=9D=20?= =?UTF-8?q?=EA=B3=84=EC=82=B0=EA=B8=B0=20=EC=B6=94=EA=B0=80(=EC=8A=B9?= =?UTF-8?q?=EB=A6=AC=EC=97=90=20=EC=9C=A0=EB=A6=AC=ED=95=9C=20=EA=B3=84?= =?UTF-8?q?=EC=82=B0=20=EA=B2=B0=EA=B3=BC=20=EB=B0=98=ED=99=98)?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Refactor: PlayingCard의 Ace계산 로직 제거 --- README.md | 6 ++--- src/main/kotlin/BlackJackCalculator.kt | 25 +++++++++++++++++++ src/main/kotlin/card/CardNumber.kt | 2 +- src/main/kotlin/card/PlayingCard.kt | 17 +++++-------- .../blackJack/BlackJackCalculatorTest.kt | 23 +++++++++++++++++ .../kotlin/blackJack/card/PlayingCardTest.kt | 6 ++--- 6 files changed, 59 insertions(+), 20 deletions(-) create mode 100644 src/main/kotlin/BlackJackCalculator.kt create mode 100644 src/test/kotlin/blackJack/BlackJackCalculatorTest.kt diff --git a/README.md b/README.md index f4c335c474..6578ee2370 100644 --- a/README.md +++ b/README.md @@ -26,15 +26,13 @@ - [] 카드의 합이 21을 초과하면 더이상 카드를 받을 수 없다.(STAND) ### 블랙젝 계산기 -- [] 결과를 계산한다. - - [] A를 제외한 합이 11이상이라면 A는 1로 계산한다. - - [] A를 제외한 합이 10이하이라면 A는 11로 계산한다. - - [] 카드의 합을 반환한다. +- [O] 결과를 계산한다. ### 트럼프 카드(플레잉 카드) - [O] 카드의 포인트를 반환한다. - [O] 카드의 무늬 명을 반환한다. +- [] 카드의 번호를 반환한다. ### 카드팩 diff --git a/src/main/kotlin/BlackJackCalculator.kt b/src/main/kotlin/BlackJackCalculator.kt new file mode 100644 index 0000000000..7f1045dce1 --- /dev/null +++ b/src/main/kotlin/BlackJackCalculator.kt @@ -0,0 +1,25 @@ +import card.CardNumber +import card.PlayingCard + +object BlackJackCalculator { + + private const val ADDITIONAL_SCORE = 10 + private const val NO_ADDITIONAL_SCORE = 0 + private const val ACE_ADDITIONAL_SCORE_THRESHOLD = 12 + + fun calculate(cardList: List): Int { + var result = cardList.sumOf { it.getPoint() } + cardList.filter { it.getCardNumber() == CardNumber.ACE } + .forEach { _ -> result += addCalculateAce(result) } + + return result + } + + private fun addCalculateAce(sumValue: Int): Int { + return if (sumValue < ACE_ADDITIONAL_SCORE_THRESHOLD) { + ADDITIONAL_SCORE + } else { + NO_ADDITIONAL_SCORE + } + } +} diff --git a/src/main/kotlin/card/CardNumber.kt b/src/main/kotlin/card/CardNumber.kt index 0d7b53d71f..129bd36224 100644 --- a/src/main/kotlin/card/CardNumber.kt +++ b/src/main/kotlin/card/CardNumber.kt @@ -26,7 +26,7 @@ enum class CardNumber private constructor(private val point: Int, private val ca return this.point } - fun CardNumber.getCardName(): String { + fun CardNumber.getCardNumber(): String { return this.cardName } diff --git a/src/main/kotlin/card/PlayingCard.kt b/src/main/kotlin/card/PlayingCard.kt index fa95370758..696ae4bca4 100644 --- a/src/main/kotlin/card/PlayingCard.kt +++ b/src/main/kotlin/card/PlayingCard.kt @@ -1,15 +1,11 @@ package card -import card.CardNumber.Companion.getCardName +import card.CardNumber.Companion.getCardNumber import card.CardNumber.Companion.getPoint import card.Suit.Companion.getName class PlayingCard(private val suit: Suit, private val cardNumber: CardNumber) { - fun getPoint(isMaxAce: Boolean = false): Int { - val point = cardNumber.getPoint() - if (isMaxAce && point == ACE_POINT) { - return point + ADD_ACE_NUMBER - } + fun getPoint(): Int { return cardNumber.getPoint() } @@ -17,12 +13,11 @@ class PlayingCard(private val suit: Suit, private val cardNumber: CardNumber) { return suit.getName() } - override fun toString(): String { - return "${cardNumber.getCardName()}${suit.koName}" + fun getCardNumber(): CardNumber { + return cardNumber } - companion object { - private const val ADD_ACE_NUMBER = 10 - private const val ACE_POINT = 1 + override fun toString(): String { + return "${cardNumber.getCardNumber()}${suit.koName}" } } diff --git a/src/test/kotlin/blackJack/BlackJackCalculatorTest.kt b/src/test/kotlin/blackJack/BlackJackCalculatorTest.kt new file mode 100644 index 0000000000..1d33777674 --- /dev/null +++ b/src/test/kotlin/blackJack/BlackJackCalculatorTest.kt @@ -0,0 +1,23 @@ +package blackJack + +import BlackJackCalculator +import card.CardNumber +import card.PlayingCard +import card.Suit +import org.assertj.core.api.Assertions.assertThat +import org.junit.jupiter.api.Test + +class BlackJackCalculatorTest { + + @Test + fun `카드 리스트를 받는다, 카드의 합을 요청할 때, 승리에 유리한 합을 반환한다`() { + // given : 카드 리스트를 받는다. + val cardList = listOf(PlayingCard(Suit.HEART, CardNumber.ACE), PlayingCard(Suit.HEART, CardNumber.ACE)) + + // when : 카드 합을 요청한다. + val actual: Int = BlackJackCalculator.calculate(cardList) + + // then : 승리에 유리한 합을 반환한다. + assertThat(actual).isEqualTo(12) + } +} diff --git a/src/test/kotlin/blackJack/card/PlayingCardTest.kt b/src/test/kotlin/blackJack/card/PlayingCardTest.kt index d541f0692e..820490ca05 100644 --- a/src/test/kotlin/blackJack/card/PlayingCardTest.kt +++ b/src/test/kotlin/blackJack/card/PlayingCardTest.kt @@ -20,15 +20,13 @@ class PlayingCardTest { val actual = playingCard.getPoint() val actual2 = playingCard2.getPoint() val actual3 = playingCard3.getPoint() - val actual4 = playingCard3.getPoint(true) - val actual5 = playingCard4.getPoint() + val actual4 = playingCard4.getPoint() // then : 카드별 포인트를 반환한다 assertThat(actual).isEqualTo(3) assertThat(actual2).isEqualTo(2) assertThat(actual3).isEqualTo(1) - assertThat(actual4).isEqualTo(11) - assertThat(actual5).isEqualTo(10) + assertThat(actual4).isEqualTo(10) } @Test From 00d42dd8c7179f7921c517cc49294b3f0ed12cb9 Mon Sep 17 00:00:00 2001 From: OYJ Date: Mon, 27 Nov 2023 22:12:28 +0900 Subject: [PATCH 24/54] =?UTF-8?q?Refactor:=20CardNumber=ED=8C=8C=EB=9D=BC?= =?UTF-8?q?=EB=AF=B8=ED=84=B0=20=EC=A0=91=EA=B7=BC=20=EC=A0=9C=ED=95=9C=20?= =?UTF-8?q?=EB=B3=80=EA=B2=BD=20private=20->=20publid?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- src/main/kotlin/card/CardNumber.kt | 10 +--------- src/main/kotlin/card/PlayingCard.kt | 6 ++---- 2 files changed, 3 insertions(+), 13 deletions(-) diff --git a/src/main/kotlin/card/CardNumber.kt b/src/main/kotlin/card/CardNumber.kt index 129bd36224..284ffe56c0 100644 --- a/src/main/kotlin/card/CardNumber.kt +++ b/src/main/kotlin/card/CardNumber.kt @@ -1,6 +1,6 @@ package card -enum class CardNumber private constructor(private val point: Int, private val cardName: String) { +enum class CardNumber(val point: Int, val cardName: String) { ACE(1, "A"), TWO(2, "2"), TREE(3, "3"), @@ -22,14 +22,6 @@ enum class CardNumber private constructor(private val point: Int, private val ca EIGHT, NINE, TEN, JACK, QUEEN, KING, ) - fun CardNumber.getPoint(): Int { - return this.point - } - - fun CardNumber.getCardNumber(): String { - return this.cardName - } - fun getCardNumberList() = cardNumberList } } diff --git a/src/main/kotlin/card/PlayingCard.kt b/src/main/kotlin/card/PlayingCard.kt index 696ae4bca4..1287d54260 100644 --- a/src/main/kotlin/card/PlayingCard.kt +++ b/src/main/kotlin/card/PlayingCard.kt @@ -1,12 +1,10 @@ package card -import card.CardNumber.Companion.getCardNumber -import card.CardNumber.Companion.getPoint import card.Suit.Companion.getName class PlayingCard(private val suit: Suit, private val cardNumber: CardNumber) { fun getPoint(): Int { - return cardNumber.getPoint() + return cardNumber.point } fun getSuitName(): String { @@ -18,6 +16,6 @@ class PlayingCard(private val suit: Suit, private val cardNumber: CardNumber) { } override fun toString(): String { - return "${cardNumber.getCardNumber()}${suit.koName}" + return "${cardNumber.cardName}${suit.koName}" } } From 18c0aea990d94153ee3b91d483227f423bf54586 Mon Sep 17 00:00:00 2001 From: OYJ Date: Mon, 27 Nov 2023 22:13:29 +0900 Subject: [PATCH 25/54] =?UTF-8?q?Docs:=20=EA=B8=B0=EB=8A=A5=20=EB=AA=A9?= =?UTF-8?q?=EB=A1=9D=20=EC=B2=B4=ED=81=AC?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- README.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/README.md b/README.md index 6578ee2370..06fa82c1c0 100644 --- a/README.md +++ b/README.md @@ -32,7 +32,7 @@ - [O] 카드의 포인트를 반환한다. - [O] 카드의 무늬 명을 반환한다. -- [] 카드의 번호를 반환한다. +- [O] 카드의 번호를 반환한다. ### 카드팩 From eccd3a8bcdd03dc58641e003e2d311e0271b9184 Mon Sep 17 00:00:00 2001 From: OYJ Date: Mon, 27 Nov 2023 22:15:21 +0900 Subject: [PATCH 26/54] =?UTF-8?q?Refactor:=20GameIndex=EC=9D=98=20index=20?= =?UTF-8?q?=EB=B3=80=EC=88=98=20=EB=AA=85=20=EB=B3=80=EA=B2=BD=20->=20card?= =?UTF-8?q?Index?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- src/main/kotlin/BlackjackGame.kt | 2 +- src/main/kotlin/GameIndex.kt | 10 +++++----- src/test/kotlin/blackJack/GameIndexTest.kt | 6 +++--- 3 files changed, 9 insertions(+), 9 deletions(-) diff --git a/src/main/kotlin/BlackjackGame.kt b/src/main/kotlin/BlackjackGame.kt index defdd1cb13..7354c1f7fc 100644 --- a/src/main/kotlin/BlackjackGame.kt +++ b/src/main/kotlin/BlackjackGame.kt @@ -20,7 +20,7 @@ class BlackjackGame(private val cardPack: CardPack, private val playerList: List } fun hit(): PlayingCard { - val card = cardPack.cardList[index.index] + val card = cardPack.cardList[index.cardIndex] increaseCardIndex() return card } diff --git a/src/main/kotlin/GameIndex.kt b/src/main/kotlin/GameIndex.kt index 23eb4e9cbb..30dd3aabf2 100644 --- a/src/main/kotlin/GameIndex.kt +++ b/src/main/kotlin/GameIndex.kt @@ -1,16 +1,16 @@ class GameIndex(private val maxIndex: Int) { - private var _index: Int = 0 - val index: Int - get() = _index + private var _cardIndex: Int = 0 + val cardIndex: Int + get() = _cardIndex fun increaseIndex() { - _index++ + _cardIndex++ validateIndex() } private fun validateIndex() { - require(_index < maxIndex) { ERR_MSG_EMPTY_CARD } + require(_cardIndex < maxIndex) { ERR_MSG_EMPTY_CARD } } companion object { diff --git a/src/test/kotlin/blackJack/GameIndexTest.kt b/src/test/kotlin/blackJack/GameIndexTest.kt index 1eb058cb8b..b8c986fc50 100644 --- a/src/test/kotlin/blackJack/GameIndexTest.kt +++ b/src/test/kotlin/blackJack/GameIndexTest.kt @@ -14,7 +14,7 @@ class GameIndexTest { val caredIndex = GameIndex(maxIndex = maxIndex) // when : 인덱스를 요청한다. - val actual = caredIndex.index + val actual = caredIndex.cardIndex // then : 현재 인덱스를 반환한다. assertThat(actual).isEqualTo(0) @@ -24,11 +24,11 @@ class GameIndexTest { fun `인덱스가 생성되고, 인덱스 증가 요청할 때, 인덱스가 1 증가된다`() { // given : 인덱스가 생성된다. val caredIndex = GameIndex(maxIndex = maxIndex) - val prevIndex = caredIndex.index + val prevIndex = caredIndex.cardIndex // when : 인덱스 증가 요청을 한다. caredIndex.increaseIndex() - val actual = caredIndex.index + val actual = caredIndex.cardIndex // then : 인덱스가 1 증가된다. assertThat(actual).isEqualTo(prevIndex + 1) From 05dbca5d0dbb0b6e947639547308a1e36c4f9c06 Mon Sep 17 00:00:00 2001 From: OYJ Date: Mon, 27 Nov 2023 22:46:09 +0900 Subject: [PATCH 27/54] =?UTF-8?q?Feat:=20=EA=B2=8C=EC=9E=84=20=EC=9D=B8?= =?UTF-8?q?=EB=8D=B1=EC=8A=A4,=20=ED=94=8C=EB=A0=88=EC=9D=B4=EC=96=B4=20?= =?UTF-8?q?=EC=9D=B8=EB=8D=B1=EC=8A=A4=20=EC=B6=94=EA=B0=80=20=EB=B0=8F=20?= =?UTF-8?q?=EC=A6=9D=EA=B0=80=20=EA=B8=B0=EB=8A=A5=20=EA=B5=AC=ED=98=84?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Refactor: 게임 인덱스의 파라미터 maxIndex ->. maxCardIndex로 변경 --- README.md | 7 +++--- src/main/kotlin/BlackjackGame.kt | 16 +++++++------- src/main/kotlin/GameIndex.kt | 14 +++++++++--- src/test/kotlin/blackJack/GameIndexTest.kt | 25 ++++++++++++++++------ 4 files changed, 42 insertions(+), 20 deletions(-) diff --git a/README.md b/README.md index 06fa82c1c0..065c35edb4 100644 --- a/README.md +++ b/README.md @@ -41,9 +41,10 @@ ### 게임 인덱스 -- [O] 현재 인덱스를 반환한다. -- [O] 인덱스를 1 증가시킨다. -- [O] 인덱스가 카드 수량을 넘지 않는다. +- [O] 현재 카드 인덱스를 반환한다. +- [O] 카드 인덱스를 1 증가시킨다. +- [O] 카드 인덱스가 카드 수량을 넘지 않는다. +- [O] 플레이어 인덱스를 1 증가시킨다. ### inputView diff --git a/src/main/kotlin/BlackjackGame.kt b/src/main/kotlin/BlackjackGame.kt index 7354c1f7fc..5adca6e688 100644 --- a/src/main/kotlin/BlackjackGame.kt +++ b/src/main/kotlin/BlackjackGame.kt @@ -4,7 +4,7 @@ import player.Player class BlackjackGame(private val cardPack: CardPack, private val playerList: List) { - private val index = GameIndex(maxIndex = cardPack.cardList.size) + private val index = GameIndex(maxCardIndex = cardPack.cardList.size) init { validatePlayer() @@ -13,24 +13,24 @@ class BlackjackGame(private val cardPack: CardPack, private val playerList: List } } - private fun initCardSetting(player: Player) { - repeat(2) { - player.saveCard(hit()) - } - } - fun hit(): PlayingCard { val card = cardPack.cardList[index.cardIndex] increaseCardIndex() return card } + private fun initCardSetting(player: Player) { + repeat(2) { + player.saveCard(hit()) + } + } + private fun validatePlayer() { require(playerList.size in MIN_PLAYER_CNT..cardPack.cardList.size / 2) { "참여 가능한 플레이어의 범위를 넘어섰습니다." } } private fun increaseCardIndex() { - index.increaseIndex() + index.increaseCardIndex() } companion object { diff --git a/src/main/kotlin/GameIndex.kt b/src/main/kotlin/GameIndex.kt index 30dd3aabf2..6587bc25aa 100644 --- a/src/main/kotlin/GameIndex.kt +++ b/src/main/kotlin/GameIndex.kt @@ -1,16 +1,24 @@ -class GameIndex(private val maxIndex: Int) { +class GameIndex(private val maxCardIndex: Int) { private var _cardIndex: Int = 0 val cardIndex: Int get() = _cardIndex - fun increaseIndex() { + private var _playerIndex: Int = 0 + val playerIndex: Int + get() = _playerIndex + + fun increaseCardIndex() { _cardIndex++ validateIndex() } + fun increasePlayerIndex() { + _playerIndex++ + } + private fun validateIndex() { - require(_cardIndex < maxIndex) { ERR_MSG_EMPTY_CARD } + require(_cardIndex < maxCardIndex) { ERR_MSG_EMPTY_CARD } } companion object { diff --git a/src/test/kotlin/blackJack/GameIndexTest.kt b/src/test/kotlin/blackJack/GameIndexTest.kt index b8c986fc50..c1b9fb3276 100644 --- a/src/test/kotlin/blackJack/GameIndexTest.kt +++ b/src/test/kotlin/blackJack/GameIndexTest.kt @@ -11,7 +11,7 @@ class GameIndexTest { @Test fun `인덱스가 생성되고, 인덱스를 요청할 때, 현재 인덱스를 반환한다`() { // given : 인덱스가 생성된다. 인덱스는 초기값은 0이다. - val caredIndex = GameIndex(maxIndex = maxIndex) + val caredIndex = GameIndex(maxCardIndex = maxIndex) // when : 인덱스를 요청한다. val actual = caredIndex.cardIndex @@ -23,11 +23,11 @@ class GameIndexTest { @Test fun `인덱스가 생성되고, 인덱스 증가 요청할 때, 인덱스가 1 증가된다`() { // given : 인덱스가 생성된다. - val caredIndex = GameIndex(maxIndex = maxIndex) + val caredIndex = GameIndex(maxCardIndex = maxIndex) val prevIndex = caredIndex.cardIndex // when : 인덱스 증가 요청을 한다. - caredIndex.increaseIndex() + caredIndex.increaseCardIndex() val actual = caredIndex.cardIndex // then : 인덱스가 1 증가된다. @@ -37,16 +37,29 @@ class GameIndexTest { @Test fun `maxIndex까지 도달하고, 인덱스 증가 요청을 할때, 예외를 던진다`() { // given : max인덱스 값을 설정하여 생성 생성, - val gameIndex = GameIndex(maxIndex = maxIndex) + val gameIndex = GameIndex(maxCardIndex = maxIndex) // maxIndex까지 도달한다 repeat(maxIndex - 1) { - gameIndex.increaseIndex() + gameIndex.increaseCardIndex() } // when : 인덱스 증가 요청을 한다 - val actual = runCatching { gameIndex.increaseIndex() }.exceptionOrNull() + val actual = runCatching { gameIndex.increaseCardIndex() }.exceptionOrNull() // then : 예외를 던진다. assertThat(actual).isInstanceOf(IllegalArgumentException::class.java) } + + @Test + fun `게임 인덱스가 생성된다, 플레이어 인덱스 증가 요청을 할 때, 플레이어 인덱스는 1 증가된다`() { + // given : 게임 인덱스를 생성한다. + val gameIndex = GameIndex(maxCardIndex = maxIndex) + + // when : 플레이어 인텍스 증가를 요청한다. + gameIndex.increasePlayerIndex() + val actual = gameIndex.playerIndex + + // then : 플레이어 인덱스는 1 증가한다. + assertThat(actual).isEqualTo(1) + } } From 9280506a600a2ab6567d5aaa33c7e101e22f59f0 Mon Sep 17 00:00:00 2001 From: OYJ Date: Mon, 27 Nov 2023 23:30:32 +0900 Subject: [PATCH 28/54] =?UTF-8?q?Feat:=20=ED=94=8C=EB=A0=88=EC=9D=B4?= =?UTF-8?q?=EC=96=B4=20=EC=B9=B4=EB=93=9C=20=EC=A0=80=EC=9E=A5=20=ED=95=A8?= =?UTF-8?q?=EC=88=98=20=EC=B6=94=EA=B0=80?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Docs: 블랙젝 게임 기능 목록 추가. --- README.md | 9 ++++++-- src/main/kotlin/BlackjackGame.kt | 8 +++++-- .../kotlin/blackJack/BlackjackGameTest.kt | 21 +++++++++++++++++-- 3 files changed, 32 insertions(+), 6 deletions(-) diff --git a/README.md b/README.md index 065c35edb4..f4d3ce38a1 100644 --- a/README.md +++ b/README.md @@ -22,8 +22,13 @@ - [O] 52장의 카드로 구성된다. - [O] 카드를 배포한다.(한 게임에 중복되는 카드를 배포하지 않는다.) - [O] 플레이어는 최소 2명 이상 카드팩의 카드 수 /2 명 이하여야한다. -- [O] 사용자는 게임 시작시 2장의 카드를 받는다. -- [] 카드의 합이 21을 초과하면 더이상 카드를 받을 수 없다.(STAND) +- [O] 플레이어는 게임 시작시 2장의 카드를 받는다. +- [O] 플레이어는 카드를 받을 수 있다. +- [] 플레이어가 카드 받는 것을 끝내면 다음 플레이어 차례가 된다.(Player Index 증가) +- [] 플레이어는 동작 후 상태를 반환한다. + - [] 카드의 합이 20 이하 라면 PLAYING을 반환한다. + - [] 카드의 합이 21을 이상 이라면 STAND를 반환한다. + - [] 카드를 받지 않는다 하면 STAND 반환한다. ### 블랙젝 계산기 - [O] 결과를 계산한다. diff --git a/src/main/kotlin/BlackjackGame.kt b/src/main/kotlin/BlackjackGame.kt index 5adca6e688..7a6e4f4f51 100644 --- a/src/main/kotlin/BlackjackGame.kt +++ b/src/main/kotlin/BlackjackGame.kt @@ -9,7 +9,7 @@ class BlackjackGame(private val cardPack: CardPack, private val playerList: List init { validatePlayer() playerList.forEach { - initCardSetting(it) + distributeTwoCards(it) } } @@ -19,7 +19,11 @@ class BlackjackGame(private val cardPack: CardPack, private val playerList: List return card } - private fun initCardSetting(player: Player) { + fun savePlayerCard(playingCard: PlayingCard) { + playerList[index.playerIndex].saveCard(playingCard) + } + + private fun distributeTwoCards(player: Player) { repeat(2) { player.saveCard(hit()) } diff --git a/src/test/kotlin/blackJack/BlackjackGameTest.kt b/src/test/kotlin/blackJack/BlackjackGameTest.kt index b5be3f3f45..0dfc1ebad4 100644 --- a/src/test/kotlin/blackJack/BlackjackGameTest.kt +++ b/src/test/kotlin/blackJack/BlackjackGameTest.kt @@ -55,7 +55,7 @@ class BlackjackGameTest { // given : 카드팩과 범위를 넘어서는 플레이어 리스트가 생성된다. val cardPack = CardPack.getCardPack() val singlePlayerList = listOf(Player("OYJ")) - val overPlayerList = List(27) { Player("OYJ") } + val overPlayerList = List(27) { i -> Player("OYJ_$i") } // when : 게임에 플레이어를 주입한다 val actualSingle = runCatching { BlackjackGame(cardPack, singlePlayerList) }.exceptionOrNull() @@ -73,7 +73,7 @@ class BlackjackGameTest { val playerList = listOf(Player("PoPo"), Player("OYJ")) // when : 게임이 시작된다. - val game = BlackjackGame(cardPack, playerList) + BlackjackGame(cardPack, playerList) // then : 각 플레이어는 카드를 2장 받는다. playerList.forEach { @@ -82,4 +82,21 @@ class BlackjackGameTest { assertThat(actual).isEqualTo(expect) } } + + @Test + fun `게임이 시작되고, 플레이어가 카드 받기를 요청할 때, 플레이어는 카드를 받아 저장한다`() { + // given : 게임이 시작된다. + val cardPack = CardPack.getCardPack() + val playerList = listOf(Player("PoPo"), Player("OYJ")) + val game = BlackjackGame(cardPack, playerList) + + // when : 카드 받기 요청을 한다. + val playingCard = game.hit() + game.savePlayerCard(playingCard) + + val actual = playerList[0].cardList.contains(playingCard) + + // then : 플레이어는 카드를 저장한다. + assertThat(actual).isTrue() + } } From 3cf15518019a3d114fe54da68b4b656469201cef Mon Sep 17 00:00:00 2001 From: OYJ Date: Tue, 28 Nov 2023 00:13:39 +0900 Subject: [PATCH 29/54] =?UTF-8?q?=C2=A0Feat:=20=ED=94=8C=EB=A0=88=EC=9D=B4?= =?UTF-8?q?=EC=96=B4=20=EC=83=81=ED=83=9C=20=EC=97=85=EB=8D=B0=EC=9D=B4?= =?UTF-8?q?=ED=8A=B8=20=EA=B8=B0=EB=8A=A5=20=EA=B5=AC=ED=98=84?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- README.md | 8 +-- src/main/kotlin/player/Player.kt | 21 +++++++- .../kotlin/blackJack/player/PlayerTest.kt | 49 ++++++++++++++++++- 3 files changed, 71 insertions(+), 7 deletions(-) diff --git a/README.md b/README.md index f4d3ce38a1..3e813384c5 100644 --- a/README.md +++ b/README.md @@ -14,6 +14,10 @@ - [O] 플레이어의 초기 상태는 PLAYING이다. - [O] 플레이어가 카드 받는 것을 끝내면 상태는 STAND가 된다. - [O] 플레이어는 받은 카드를 저장한다. +- [O] 플레이어는 상태를 업데이트 한다. + - [O] 카드의 합이 20 이하 라면 PLAYING + - [O] 카드의 합이 21을 이상 이라면 STAND + - [O] 카드를 받지 않는다 하면 STAND ### 블랙젝 게임 @@ -25,10 +29,6 @@ - [O] 플레이어는 게임 시작시 2장의 카드를 받는다. - [O] 플레이어는 카드를 받을 수 있다. - [] 플레이어가 카드 받는 것을 끝내면 다음 플레이어 차례가 된다.(Player Index 증가) -- [] 플레이어는 동작 후 상태를 반환한다. - - [] 카드의 합이 20 이하 라면 PLAYING을 반환한다. - - [] 카드의 합이 21을 이상 이라면 STAND를 반환한다. - - [] 카드를 받지 않는다 하면 STAND 반환한다. ### 블랙젝 계산기 - [O] 결과를 계산한다. diff --git a/src/main/kotlin/player/Player.kt b/src/main/kotlin/player/Player.kt index a3a4ca98da..fbbfc01d75 100644 --- a/src/main/kotlin/player/Player.kt +++ b/src/main/kotlin/player/Player.kt @@ -1,5 +1,6 @@ package player +import BlackJackCalculator import card.PlayingCard class Player(private val name: String) { @@ -12,8 +13,8 @@ class Player(private val name: String) { val cardList: List get() = _cardList - fun hitDone() { - _status = Status.STAND + fun playDone() { + updatePlayerStatus(Status.STAND) } fun saveCard(card: PlayingCard) { @@ -21,4 +22,20 @@ class Player(private val name: String) { } fun getName() = name + fun updateStatus() { + val newStatus = determineStatus() + updatePlayerStatus(newStatus) + } + + private fun determineStatus(): Status { + val totalPoint = BlackJackCalculator.calculate(_cardList) + return when { + (totalPoint <= 20) -> Status.PLAYING + else -> Status.STAND + } + } + + private fun updatePlayerStatus(status: Status) { + _status = status + } } diff --git a/src/test/kotlin/blackJack/player/PlayerTest.kt b/src/test/kotlin/blackJack/player/PlayerTest.kt index cfe36e0c85..2400047e2e 100644 --- a/src/test/kotlin/blackJack/player/PlayerTest.kt +++ b/src/test/kotlin/blackJack/player/PlayerTest.kt @@ -1,6 +1,9 @@ package blackJack.player +import card.CardNumber import card.CardPack +import card.PlayingCard +import card.Suit import org.assertj.core.api.Assertions.assertThat import org.junit.jupiter.api.Test import player.Player @@ -27,7 +30,7 @@ class PlayerTest { val player = Player("OYJ") // when : 플레이어가 카드 받기를 멈춘다. - player.hitDone() + player.playDone() val actual = player.status // then : 플레이어의 상태는 STAND이다. @@ -49,4 +52,48 @@ class PlayerTest { // then : assertThat(actual).isEqualTo(card) } + + @Test + fun `플레이어의 보유 가드 합이 20이하 이고, 플레이어 상태 업데이트를 요청할 때, 플에이어 상테는 PLAYING로 업데이트 된다`() { + // given : 플레이어 보유 카드 합 20 이하(8) + val player = Player("OYJ") + player.saveCard(PlayingCard(Suit.DIAMOND, CardNumber.TREE)) + player.saveCard(PlayingCard(Suit.DIAMOND, CardNumber.FIVE)) + + // when : 플레이어 상태 업데이트 + player.updateStatus() + val actual = player.status + + // then : 플레이어 상태는 PLAYING이다. + assertThat(actual).isEqualTo(Status.PLAYING) + } + + @Test + fun `플레이어의 보유 가드 합이 21이상 이고, 플레이어 상태 업데이트를 요청할 때, 플에이어 상테는 STAND로 업데이트 된다`() { + // given : 플레이어 보유 카드 합 21 이상(28) + val player = Player("OYJ") + player.saveCard(PlayingCard(Suit.DIAMOND, CardNumber.EIGHT)) + player.saveCard(PlayingCard(Suit.DIAMOND, CardNumber.KING)) + player.saveCard(PlayingCard(Suit.DIAMOND, CardNumber.JACK)) + + // when : 플레이어 상태 업데이트 + player.updateStatus() + val actual = player.status + + // then : 플레이어 상태는 PLAYING이다. + assertThat(actual).isEqualTo(Status.STAND) + } + + @Test + fun `, 플레이어가 플레이를 멈춘다고 할때, 플에이어의 상태는 STAND로 업데이트 된다`() { + // given : 플레이어 보유 카드 합 21 이상(28) + val player = Player("OYJ") + + // when : 플레이어 상태 업데이트 + player.playDone() + val actual = player.status + + // then : 플레이어 상태는 PLAYING이다. + assertThat(actual).isEqualTo(Status.STAND) + } } From d056703ec6ae524a8d00e40d8ae28fa2263929bd Mon Sep 17 00:00:00 2001 From: OYJ Date: Tue, 28 Nov 2023 01:22:44 +0900 Subject: [PATCH 30/54] =?UTF-8?q?Feat:=20PlayerGroup=20=EC=9D=BC=EA=B8=89?= =?UTF-8?q?=20=EC=BB=AC=EB=A0=89=EC=85=98=20=EC=B6=94=EA=B0=80,=20?= =?UTF-8?q?=EB=B8=94=EB=9E=99=EC=A0=9D=20=EA=B2=8C=EC=9E=84=20=EC=97=AD?= =?UTF-8?q?=ED=95=A0=20=EC=9D=B4=EB=8F=99(->=20PlayerGroup)=20-=20?= =?UTF-8?q?=EC=B0=B8=EC=97=AC=20=EC=9D=B8=EC=9B=90=20=EA=B2=80=EC=A6=9D=20?= =?UTF-8?q?-=20=ED=94=8C=EB=A0=88=EC=9D=B4=EC=96=B4=20=ED=84=B4=20?= =?UTF-8?q?=EB=84=98=EA=B9=80?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- README.md | 8 +-- src/main/kotlin/BlackjackGame.kt | 12 ++--- src/main/kotlin/player/PlayerGroup.kt | 26 ++++++++++ .../kotlin/blackJack/BlackjackGameTest.kt | 33 ++++--------- .../blackJack/player/PlayerGroupTest.kt | 49 +++++++++++++++++++ 5 files changed, 93 insertions(+), 35 deletions(-) create mode 100644 src/main/kotlin/player/PlayerGroup.kt create mode 100644 src/test/kotlin/blackJack/player/PlayerGroupTest.kt diff --git a/README.md b/README.md index 3e813384c5..835c773466 100644 --- a/README.md +++ b/README.md @@ -19,16 +19,18 @@ - [O] 카드의 합이 21을 이상 이라면 STAND - [O] 카드를 받지 않는다 하면 STAND +### 플레이어 그룹 +- [O] 플레이어는 최소 2명 이상 26명 이하여야 한다. +- [O] 현재 플레이 중인 플레이어를 반환한다. +- [O] 플레이어 턴을 넘긴다. + ### 블랙젝 게임 - [O] 플레잉 카드 팩을 검증한다. - [O] 중복이 없다. - [O] 52장의 카드로 구성된다. - [O] 카드를 배포한다.(한 게임에 중복되는 카드를 배포하지 않는다.) -- [O] 플레이어는 최소 2명 이상 카드팩의 카드 수 /2 명 이하여야한다. - [O] 플레이어는 게임 시작시 2장의 카드를 받는다. -- [O] 플레이어는 카드를 받을 수 있다. -- [] 플레이어가 카드 받는 것을 끝내면 다음 플레이어 차례가 된다.(Player Index 증가) ### 블랙젝 계산기 - [O] 결과를 계산한다. diff --git a/src/main/kotlin/BlackjackGame.kt b/src/main/kotlin/BlackjackGame.kt index 7a6e4f4f51..bbb433ae65 100644 --- a/src/main/kotlin/BlackjackGame.kt +++ b/src/main/kotlin/BlackjackGame.kt @@ -1,14 +1,14 @@ import card.CardPack import card.PlayingCard import player.Player +import player.PlayerGroup -class BlackjackGame(private val cardPack: CardPack, private val playerList: List) { +class BlackjackGame(private val cardPack: CardPack, private val playerGroup: PlayerGroup) { private val index = GameIndex(maxCardIndex = cardPack.cardList.size) init { - validatePlayer() - playerList.forEach { + playerGroup.playerList.forEach { distributeTwoCards(it) } } @@ -20,7 +20,7 @@ class BlackjackGame(private val cardPack: CardPack, private val playerList: List } fun savePlayerCard(playingCard: PlayingCard) { - playerList[index.playerIndex].saveCard(playingCard) + playerGroup.getCurrentPlayer().saveCard(playingCard) } private fun distributeTwoCards(player: Player) { @@ -29,10 +29,6 @@ class BlackjackGame(private val cardPack: CardPack, private val playerList: List } } - private fun validatePlayer() { - require(playerList.size in MIN_PLAYER_CNT..cardPack.cardList.size / 2) { "참여 가능한 플레이어의 범위를 넘어섰습니다." } - } - private fun increaseCardIndex() { index.increaseCardIndex() } diff --git a/src/main/kotlin/player/PlayerGroup.kt b/src/main/kotlin/player/PlayerGroup.kt new file mode 100644 index 0000000000..3f9f1aae05 --- /dev/null +++ b/src/main/kotlin/player/PlayerGroup.kt @@ -0,0 +1,26 @@ +package player + +class PlayerGroup(val playerList: List) { + private var playerIndex = 0 + + init { + validatePlayer() + } + + private fun validatePlayer() { + require(playerList.size in MIN_PLAYER_CNT..MAM_PLAYER_CNT) { "참여 가능한 플레이어의 범위를 넘어섰습니다." } + } + + fun getCurrentPlayer(): Player { + return playerList[playerIndex] + } + + fun turnOverPlayer() { + playerIndex++ + } + + companion object { + private const val MIN_PLAYER_CNT = 2 + private const val MAM_PLAYER_CNT = 26 + } +} diff --git a/src/test/kotlin/blackJack/BlackjackGameTest.kt b/src/test/kotlin/blackJack/BlackjackGameTest.kt index 0dfc1ebad4..e6f152649f 100644 --- a/src/test/kotlin/blackJack/BlackjackGameTest.kt +++ b/src/test/kotlin/blackJack/BlackjackGameTest.kt @@ -5,10 +5,11 @@ import card.CardPack import org.assertj.core.api.Assertions.assertThat import org.junit.jupiter.api.Test import player.Player +import player.PlayerGroup class BlackjackGameTest { - private val defaultPlayers = listOf(Player("OYJ"), Player("OYJ")) + private val defaultPlayers = PlayerGroup(listOf(Player("OYJ"), Player("OYJ"))) @Test fun `정상적인 카드팩을 받고, 게임에 주입되었을 때, 예외 검증을 통과한다`() { @@ -50,33 +51,17 @@ class BlackjackGameTest { assertThat(card1).isNotEqualTo(card2) } - @Test - fun `게임을 생성한다면, 플레이어가 2명 이상 26명 이하의 범위를 넘어설때, 예외를 던진다`() { - // given : 카드팩과 범위를 넘어서는 플레이어 리스트가 생성된다. - val cardPack = CardPack.getCardPack() - val singlePlayerList = listOf(Player("OYJ")) - val overPlayerList = List(27) { i -> Player("OYJ_$i") } - - // when : 게임에 플레이어를 주입한다 - val actualSingle = runCatching { BlackjackGame(cardPack, singlePlayerList) }.exceptionOrNull() - val actualOver = runCatching { BlackjackGame(cardPack, overPlayerList) }.exceptionOrNull() - - // then : 예외를 던진다. - assertThat(actualSingle).isInstanceOf(IllegalArgumentException::class.java) - assertThat(actualOver).isInstanceOf(IllegalArgumentException::class.java) - } - @Test fun `플레이어 2명과 카드팩으로 구성되고, 게임이 시작될 때, 각 플레이어는 카드 2장을 받는다`() { // given : 플레이어 2명과 카드팩이 있다. val cardPack = CardPack.getCardPack() - val playerList = listOf(Player("PoPo"), Player("OYJ")) + val playerGroup = PlayerGroup(listOf(Player("PoPo"), Player("OYJ"))) // when : 게임이 시작된다. - BlackjackGame(cardPack, playerList) + BlackjackGame(cardPack, playerGroup) // then : 각 플레이어는 카드를 2장 받는다. - playerList.forEach { + playerGroup.playerList.forEach { val actual = it.cardList.size val expect = 2 assertThat(actual).isEqualTo(expect) @@ -87,14 +72,14 @@ class BlackjackGameTest { fun `게임이 시작되고, 플레이어가 카드 받기를 요청할 때, 플레이어는 카드를 받아 저장한다`() { // given : 게임이 시작된다. val cardPack = CardPack.getCardPack() - val playerList = listOf(Player("PoPo"), Player("OYJ")) - val game = BlackjackGame(cardPack, playerList) + val playerGroup = PlayerGroup(listOf(Player("PoPo"), Player("OYJ"))) + val game = BlackjackGame(cardPack, playerGroup) // when : 카드 받기 요청을 한다. val playingCard = game.hit() game.savePlayerCard(playingCard) - - val actual = playerList[0].cardList.contains(playingCard) + val currentPlayer = playerGroup.getCurrentPlayer() + val actual = currentPlayer.cardList.contains(playingCard) // then : 플레이어는 카드를 저장한다. assertThat(actual).isTrue() diff --git a/src/test/kotlin/blackJack/player/PlayerGroupTest.kt b/src/test/kotlin/blackJack/player/PlayerGroupTest.kt new file mode 100644 index 0000000000..65703630ab --- /dev/null +++ b/src/test/kotlin/blackJack/player/PlayerGroupTest.kt @@ -0,0 +1,49 @@ +package blackJack.player + +import org.assertj.core.api.Assertions.assertThat +import org.junit.jupiter.api.Test +import player.Player +import player.PlayerGroup + +class PlayerGroupTest { + @Test + fun `플레이어 그룹을 만든다, 플레이어가 2명 이상 26명 이하의 범위를 넘어설 때, 예외를 던진다`() { + // given : 카드팩과 범위를 넘어서는 플레이어 리스트가 생성된다. + + val singlePlayerList = listOf(Player("OYJ")) + val overPlayerList = List(27) { i -> Player("OYJ_$i") } + + // when : 게임에 플레이어를 주입한다 + val actualSingle = runCatching { PlayerGroup(singlePlayerList) }.exceptionOrNull() + val actualOver = runCatching { PlayerGroup(overPlayerList) }.exceptionOrNull() + + // then : 예외를 던진다. + assertThat(actualSingle).isInstanceOf(IllegalArgumentException::class.java) + assertThat(actualOver).isInstanceOf(IllegalArgumentException::class.java) + } + + @Test + fun `플레이어 그룹을 만든다, 플레이어 반환 요청할 떄, 현재 플레이 중인 플레이어를 반환한다`() { + // given : 플레이어 그룹을 만든다. + val playerGroup = PlayerGroup(listOf(Player("OYJ"), Player("PoPo"))) + + // when : 현재 플레이어 반환을 요청한다. + val actual = playerGroup.getCurrentPlayer() + + // then : 첫번째 플레이어가 반환된다. + assertThat(actual).isEqualTo(playerGroup.playerList[0]) + } + + @Test + fun `플레이어 그룹을 만든다, 플레이어 턴오버를 요청할 때, 다음 플레이어로 차례가 넘어간다`() { + // given : 플레이어 그룹을 만든다. + val playerGroup = PlayerGroup(listOf(Player("OYJ"), Player("PoPo"))) + + // when : 플레이어 턴오버를 요청한다. + playerGroup.turnOverPlayer() + val actual = playerGroup.getCurrentPlayer() + + // then : 두번째 플레이어가 반환된다. + assertThat(actual).isEqualTo(playerGroup.playerList[1]) + } +} From 70a6c849e38f3814ddb5f57c3b867704d3ec2a28 Mon Sep 17 00:00:00 2001 From: OYJ Date: Tue, 28 Nov 2023 01:33:47 +0900 Subject: [PATCH 31/54] =?UTF-8?q?Refactor:=20=EC=B9=B4=EB=93=9C=20?= =?UTF-8?q?=EB=B0=98=ED=99=98=20=EA=B8=B0=EB=8A=A5=20CardPack=EC=9C=BC?= =?UTF-8?q?=EB=A1=9C=20=EC=9D=B4=EB=8F=99?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- README.md | 1 + src/main/kotlin/card/CardPack.kt | 6 +++++- src/test/kotlin/blackJack/card/CardPackTest.kt | 14 ++++++++++++++ 3 files changed, 20 insertions(+), 1 deletion(-) diff --git a/README.md b/README.md index 835c773466..16a28957f1 100644 --- a/README.md +++ b/README.md @@ -45,6 +45,7 @@ - [O] 카드를 셔플한다.(TestCode X) - [O] 중복되지 않은 52개의 카드로 구성된다. +- [O] 순차적으로 카드를 반환한다. ### 게임 인덱스 diff --git a/src/main/kotlin/card/CardPack.kt b/src/main/kotlin/card/CardPack.kt index bacf9eedbc..95b140e246 100644 --- a/src/main/kotlin/card/CardPack.kt +++ b/src/main/kotlin/card/CardPack.kt @@ -2,13 +2,17 @@ package card class CardPack(val cardList: List) { + fun hit(): PlayingCard { + return cardPack.cardList[cardIndex++] + } + companion object { private const val CARD_PACK_SIZE = 52 private const val ERR_MSG_CARD_PACK_SIZE = "카드는 52개로 구성되어야 합나다." private const val ERR_MSG_DUPLICATE_CARD_PACK = "중복되는 카드는 없어야 합니다." private val cardPack = createCard() - + private var cardIndex = 0 private fun createCard(): CardPack { val suitList = Suit.getSuitList() val playingCardList = mutableListOf() diff --git a/src/test/kotlin/blackJack/card/CardPackTest.kt b/src/test/kotlin/blackJack/card/CardPackTest.kt index ad87780be1..5130ec9b22 100644 --- a/src/test/kotlin/blackJack/card/CardPackTest.kt +++ b/src/test/kotlin/blackJack/card/CardPackTest.kt @@ -24,4 +24,18 @@ class CardPackTest { assertThat(cardPackSize).isEqualTo(distinctCardPackSize) } + + @Test + fun `카드팩을 생성한다, 카드 반환 요청이 들어올 때, 순차적으로 카드를 반환한다`() { + // given : 카드팩을 생성한다. + val cardPack = CardPack.getCardPack() + + // when : 카드 반환 요청이 들어온다. + val actual_1 = cardPack.hit() + val actual_2 = cardPack.hit() + + // 순차적으로 반환된다. + assertThat(actual_1).isEqualTo(cardPack.cardList[0]) + assertThat(actual_2).isEqualTo(cardPack.cardList[1]) + } } From a8acb078281fc55a000725b7b899850442e04f47 Mon Sep 17 00:00:00 2001 From: OYJ Date: Tue, 28 Nov 2023 02:26:43 +0900 Subject: [PATCH 32/54] =?UTF-8?q?Refactor:=20=EC=B9=B4=EB=93=9C=20?= =?UTF-8?q?=EB=B0=B0=ED=8F=AC=20=EC=97=AD=ED=95=A0=20=EB=B3=80=EA=B2=BD(Bl?= =?UTF-8?q?ackjackGame=20->=20CardPack),=20=EA=B2=8C=EC=9E=84=20=EC=A7=84?= =?UTF-8?q?=ED=96=89=20=EB=A1=9C=EC=A7=81=20=EB=B3=80=EA=B2=BD?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- README.md | 17 +++++---- src/main/kotlin/BlackjackGame.kt | 35 ++++++++++-------- src/main/kotlin/card/CardPack.kt | 4 +- .../kotlin/blackJack/BlackjackGameTest.kt | 37 ++----------------- .../kotlin/blackJack/card/CardPackTest.kt | 13 +++++++ 5 files changed, 49 insertions(+), 57 deletions(-) diff --git a/README.md b/README.md index 16a28957f1..0d084c0ce4 100644 --- a/README.md +++ b/README.md @@ -26,11 +26,11 @@ ### 블랙젝 게임 -- [O] 플레잉 카드 팩을 검증한다. - - [O] 중복이 없다. - - [O] 52장의 카드로 구성된다. -- [O] 카드를 배포한다.(한 게임에 중복되는 카드를 배포하지 않는다.) - [O] 플레이어는 게임 시작시 2장의 카드를 받는다. +- [O] 배포한 카드를 플레이어에게 전달한다. +- [O] 유저를 반환한다. (TestCode X) +- [O] 유저 턴을 넘긴다. (TestCode X) +- [O] 유저 턴을 종료한다. (TestCode X) ### 블랙젝 계산기 - [O] 결과를 계산한다. @@ -43,9 +43,11 @@ ### 카드팩 -- [O] 카드를 셔플한다.(TestCode X) -- [O] 중복되지 않은 52개의 카드로 구성된다. -- [O] 순차적으로 카드를 반환한다. +- [O] 카드를 셔플한다. (TestCode X) +- [O] 중복되지 않고 순차적으로 카드를 반환한다. +- [O] 카드 팩을 검증한다. + - [O] 중복이 없다. + - [O] 52장의 카드로 구성된다. ### 게임 인덱스 @@ -57,6 +59,7 @@ ### inputView - [] 플레이어를 입력받는다. + - [] 플레이어가 입력되지 않으면 예외를 던진다. - [] 카드 수집 여부를 받는다. ### output diff --git a/src/main/kotlin/BlackjackGame.kt b/src/main/kotlin/BlackjackGame.kt index bbb433ae65..99a02f7c91 100644 --- a/src/main/kotlin/BlackjackGame.kt +++ b/src/main/kotlin/BlackjackGame.kt @@ -1,39 +1,42 @@ import card.CardPack -import card.PlayingCard import player.Player import player.PlayerGroup +import player.Status class BlackjackGame(private val cardPack: CardPack, private val playerGroup: PlayerGroup) { - private val index = GameIndex(maxCardIndex = cardPack.cardList.size) - init { playerGroup.playerList.forEach { distributeTwoCards(it) } } - fun hit(): PlayingCard { - val card = cardPack.cardList[index.cardIndex] - increaseCardIndex() - return card + fun hitCard() { + val player = playerGroup.getCurrentPlayer() + player.saveCard(cardPack.hit()) + player.updateStatus() } - fun savePlayerCard(playingCard: PlayingCard) { - playerGroup.getCurrentPlayer().saveCard(playingCard) + fun getCurrentPlayer(): Player { + return playerGroup.getCurrentPlayer() } - private fun distributeTwoCards(player: Player) { - repeat(2) { - player.saveCard(hit()) + // 턴오버. + fun playerTurnOver() { + val player = playerGroup.getCurrentPlayer() + if (player.status == Status.STAND) { + playerGroup.turnOverPlayer() } } - private fun increaseCardIndex() { - index.increaseCardIndex() + fun hitDone() { + val player = playerGroup.getCurrentPlayer() + player.playDone() } - companion object { - private const val MIN_PLAYER_CNT = 2 + private fun distributeTwoCards(player: Player) { + repeat(2) { + player.saveCard(cardPack.hit()) + } } } diff --git a/src/main/kotlin/card/CardPack.kt b/src/main/kotlin/card/CardPack.kt index 95b140e246..07f5449a12 100644 --- a/src/main/kotlin/card/CardPack.kt +++ b/src/main/kotlin/card/CardPack.kt @@ -2,6 +2,8 @@ package card class CardPack(val cardList: List) { + private var cardIndex = 0 + fun hit(): PlayingCard { return cardPack.cardList[cardIndex++] } @@ -12,7 +14,7 @@ class CardPack(val cardList: List) { private const val ERR_MSG_DUPLICATE_CARD_PACK = "중복되는 카드는 없어야 합니다." private val cardPack = createCard() - private var cardIndex = 0 + private fun createCard(): CardPack { val suitList = Suit.getSuitList() val playingCardList = mutableListOf() diff --git a/src/test/kotlin/blackJack/BlackjackGameTest.kt b/src/test/kotlin/blackJack/BlackjackGameTest.kt index e6f152649f..fa8f491c0c 100644 --- a/src/test/kotlin/blackJack/BlackjackGameTest.kt +++ b/src/test/kotlin/blackJack/BlackjackGameTest.kt @@ -23,34 +23,6 @@ class BlackjackGameTest { assertThat(actual).isNull() } - @Test - fun `게임이 시작되고, 카드 배포를 요청할 때, 카드팩의 5번째 카드가 반환된다`() { - // given : 카드팩 생성, 게임이 시작된다. - val cardPack = CardPack.getCardPack() - val game = BlackjackGame(cardPack, defaultPlayers) - - // when : 카드 배포를 한다. - val actual = game.hit() - val expect = cardPack.cardList[4] - - // then : 첫번째 카드팩이 반환된다. - assertThat(actual).isEqualTo(expect) - } - - @Test - fun `게임이 시작되고, 카드 배포를 반복할 때, 동일하지 않은 카드를 배포한다`() { - // given : 카드팩 생성, 게임 시작 - val cardPack = CardPack.getCardPack() - val game = BlackjackGame(cardPack, defaultPlayers) - - // when : 카드 배포 2회한다. - val card1 = game.hit() - val card2 = game.hit() - - // then : 동일하지 않은 카드가 배포된다. - assertThat(card1).isNotEqualTo(card2) - } - @Test fun `플레이어 2명과 카드팩으로 구성되고, 게임이 시작될 때, 각 플레이어는 카드 2장을 받는다`() { // given : 플레이어 2명과 카드팩이 있다. @@ -70,16 +42,15 @@ class BlackjackGameTest { @Test fun `게임이 시작되고, 플레이어가 카드 받기를 요청할 때, 플레이어는 카드를 받아 저장한다`() { - // given : 게임이 시작된다. + // given : 게임이 시작된다. 초기화: 플레이어당 2장씩 배포 val cardPack = CardPack.getCardPack() val playerGroup = PlayerGroup(listOf(Player("PoPo"), Player("OYJ"))) val game = BlackjackGame(cardPack, playerGroup) - // when : 카드 받기 요청을 한다. - val playingCard = game.hit() - game.savePlayerCard(playingCard) + // when : 저장 여부 확인 val currentPlayer = playerGroup.getCurrentPlayer() - val actual = currentPlayer.cardList.contains(playingCard) + val card = cardPack.cardList[0] + val actual = currentPlayer.cardList.contains(card) // then : 플레이어는 카드를 저장한다. assertThat(actual).isTrue() diff --git a/src/test/kotlin/blackJack/card/CardPackTest.kt b/src/test/kotlin/blackJack/card/CardPackTest.kt index 5130ec9b22..193787429c 100644 --- a/src/test/kotlin/blackJack/card/CardPackTest.kt +++ b/src/test/kotlin/blackJack/card/CardPackTest.kt @@ -38,4 +38,17 @@ class CardPackTest { assertThat(actual_1).isEqualTo(cardPack.cardList[0]) assertThat(actual_2).isEqualTo(cardPack.cardList[1]) } + + @Test + fun `카드팩을 생성한 후, 카드 배포를 반복할 때, 동일하지 않은 카드를 배포한다`() { + // given : 카드팩 생성, 게임 시작 + val cardPack = CardPack.getCardPack() + + // when : 카드 배포 2회한다. + val card1 = cardPack.hit() + val card2 = cardPack.hit() + + // then : 동일하지 않은 카드가 배포된다. + assertThat(card1).isNotEqualTo(card2) + } } From 9c0d5e9b3f02b71ab2f9eb7c9e56aa29ecf0dc5a Mon Sep 17 00:00:00 2001 From: OYJ Date: Wed, 29 Nov 2023 22:29:35 +0900 Subject: [PATCH 33/54] =?UTF-8?q?Refactor:=20=EB=B6=88=ED=95=84=EC=9A=94?= =?UTF-8?q?=ED=95=9C=20=EC=BD=94=EB=93=9C=20=EC=A0=9C=EA=B1=B0=20=EB=B0=8F?= =?UTF-8?q?=20=EC=88=98=EC=A0=95?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- src/main/kotlin/card/CardPack.kt | 2 +- src/main/kotlin/card/PlayingCard.kt | 4 +--- src/main/kotlin/card/Suit.kt | 10 ---------- src/main/kotlin/player/Player.kt | 10 ++++------ 4 files changed, 6 insertions(+), 20 deletions(-) diff --git a/src/main/kotlin/card/CardPack.kt b/src/main/kotlin/card/CardPack.kt index 07f5449a12..4fff4f7a75 100644 --- a/src/main/kotlin/card/CardPack.kt +++ b/src/main/kotlin/card/CardPack.kt @@ -16,7 +16,7 @@ class CardPack(val cardList: List) { private val cardPack = createCard() private fun createCard(): CardPack { - val suitList = Suit.getSuitList() + val suitList = Suit.values() val playingCardList = mutableListOf() for (suit in suitList) { diff --git a/src/main/kotlin/card/PlayingCard.kt b/src/main/kotlin/card/PlayingCard.kt index 1287d54260..2476d129eb 100644 --- a/src/main/kotlin/card/PlayingCard.kt +++ b/src/main/kotlin/card/PlayingCard.kt @@ -1,14 +1,12 @@ package card -import card.Suit.Companion.getName - class PlayingCard(private val suit: Suit, private val cardNumber: CardNumber) { fun getPoint(): Int { return cardNumber.point } fun getSuitName(): String { - return suit.getName() + return suit.koName } fun getCardNumber(): CardNumber { diff --git a/src/main/kotlin/card/Suit.kt b/src/main/kotlin/card/Suit.kt index 5df29af860..06dbde7394 100644 --- a/src/main/kotlin/card/Suit.kt +++ b/src/main/kotlin/card/Suit.kt @@ -4,14 +4,4 @@ enum class Suit(val koName: String) { HEART("하트"), DIAMOND("다이아몬드"), CLUB("클러버"); - - companion object { - - private val suitList = listOf(SPADE, HEART, DIAMOND, CLUB) - fun Suit.getName(): String { - return this.koName - } - - fun getSuitList() = suitList - } } diff --git a/src/main/kotlin/player/Player.kt b/src/main/kotlin/player/Player.kt index fbbfc01d75..9bf74f56ff 100644 --- a/src/main/kotlin/player/Player.kt +++ b/src/main/kotlin/player/Player.kt @@ -3,11 +3,10 @@ package player import BlackJackCalculator import card.PlayingCard -class Player(private val name: String) { +class Player(val name: String) { - private var _status = Status.PLAYING - val status: Status - get() = _status + var status = Status.PLAYING + private set private var _cardList = mutableListOf() val cardList: List @@ -21,7 +20,6 @@ class Player(private val name: String) { _cardList.add(card) } - fun getName() = name fun updateStatus() { val newStatus = determineStatus() updatePlayerStatus(newStatus) @@ -36,6 +34,6 @@ class Player(private val name: String) { } private fun updatePlayerStatus(status: Status) { - _status = status + this.status = status } } From cfe4fde270f7e756ab93e42412d57021b69191b1 Mon Sep 17 00:00:00 2001 From: OYJ Date: Wed, 29 Nov 2023 22:36:09 +0900 Subject: [PATCH 34/54] =?UTF-8?q?Refactor=20-=20=ED=81=B4=EB=9E=98?= =?UTF-8?q?=EC=8A=A4=EB=AA=85=20=EB=B3=80=EA=B2=BD=20CardNumber=20->=20Car?= =?UTF-8?q?dRank=20-=20CardRank=ED=94=84=EB=A1=9C=ED=8D=BC=ED=8B=B0?= =?UTF-8?q?=EB=AA=85=20=EC=9D=BC=EB=B6=80=20=EB=B3=80=EA=B2=BD=20cardName?= =?UTF-8?q?=20->=20symbol?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- src/main/kotlin/BlackJackCalculator.kt | 4 ++-- src/main/kotlin/card/CardPack.kt | 4 ++-- src/main/kotlin/card/{CardNumber.kt => CardRank.kt} | 2 +- src/main/kotlin/card/PlayingCard.kt | 10 +++++----- src/test/kotlin/blackJack/BlackJackCalculatorTest.kt | 4 ++-- src/test/kotlin/blackJack/card/PlayingCardTest.kt | 12 ++++++------ src/test/kotlin/blackJack/player/PlayerTest.kt | 12 ++++++------ 7 files changed, 24 insertions(+), 24 deletions(-) rename src/main/kotlin/card/{CardNumber.kt => CardRank.kt} (88%) diff --git a/src/main/kotlin/BlackJackCalculator.kt b/src/main/kotlin/BlackJackCalculator.kt index 7f1045dce1..0f69d55aba 100644 --- a/src/main/kotlin/BlackJackCalculator.kt +++ b/src/main/kotlin/BlackJackCalculator.kt @@ -1,4 +1,4 @@ -import card.CardNumber +import card.CardRank import card.PlayingCard object BlackJackCalculator { @@ -9,7 +9,7 @@ object BlackJackCalculator { fun calculate(cardList: List): Int { var result = cardList.sumOf { it.getPoint() } - cardList.filter { it.getCardNumber() == CardNumber.ACE } + cardList.filter { it.getCardNumber() == CardRank.ACE } .forEach { _ -> result += addCalculateAce(result) } return result diff --git a/src/main/kotlin/card/CardPack.kt b/src/main/kotlin/card/CardPack.kt index 4fff4f7a75..631afb2cc4 100644 --- a/src/main/kotlin/card/CardPack.kt +++ b/src/main/kotlin/card/CardPack.kt @@ -36,9 +36,9 @@ class CardPack(val cardList: List) { private fun createCardWithSuit(suit: Suit): List { val playingCardList = mutableListOf() - val cardNumberList = CardNumber.getCardNumberList() + val cardRankList = CardRank.getCardNumberList() - for (cardNumber in cardNumberList) { + for (cardNumber in cardRankList) { playingCardList.add(PlayingCard(suit, cardNumber)) } return playingCardList diff --git a/src/main/kotlin/card/CardNumber.kt b/src/main/kotlin/card/CardRank.kt similarity index 88% rename from src/main/kotlin/card/CardNumber.kt rename to src/main/kotlin/card/CardRank.kt index 284ffe56c0..528ab21292 100644 --- a/src/main/kotlin/card/CardNumber.kt +++ b/src/main/kotlin/card/CardRank.kt @@ -1,6 +1,6 @@ package card -enum class CardNumber(val point: Int, val cardName: String) { +enum class CardRank(val point: Int, val symbol: String) { ACE(1, "A"), TWO(2, "2"), TREE(3, "3"), diff --git a/src/main/kotlin/card/PlayingCard.kt b/src/main/kotlin/card/PlayingCard.kt index 2476d129eb..c4aa7dd79a 100644 --- a/src/main/kotlin/card/PlayingCard.kt +++ b/src/main/kotlin/card/PlayingCard.kt @@ -1,19 +1,19 @@ package card -class PlayingCard(private val suit: Suit, private val cardNumber: CardNumber) { +class PlayingCard(private val suit: Suit, private val cardRank: CardRank) { fun getPoint(): Int { - return cardNumber.point + return cardRank.point } fun getSuitName(): String { return suit.koName } - fun getCardNumber(): CardNumber { - return cardNumber + fun getCardNumber(): CardRank { + return cardRank } override fun toString(): String { - return "${cardNumber.cardName}${suit.koName}" + return "${cardRank.symbol}${suit.koName}" } } diff --git a/src/test/kotlin/blackJack/BlackJackCalculatorTest.kt b/src/test/kotlin/blackJack/BlackJackCalculatorTest.kt index 1d33777674..8bcc17f6ea 100644 --- a/src/test/kotlin/blackJack/BlackJackCalculatorTest.kt +++ b/src/test/kotlin/blackJack/BlackJackCalculatorTest.kt @@ -1,7 +1,7 @@ package blackJack import BlackJackCalculator -import card.CardNumber +import card.CardRank import card.PlayingCard import card.Suit import org.assertj.core.api.Assertions.assertThat @@ -12,7 +12,7 @@ class BlackJackCalculatorTest { @Test fun `카드 리스트를 받는다, 카드의 합을 요청할 때, 승리에 유리한 합을 반환한다`() { // given : 카드 리스트를 받는다. - val cardList = listOf(PlayingCard(Suit.HEART, CardNumber.ACE), PlayingCard(Suit.HEART, CardNumber.ACE)) + val cardList = listOf(PlayingCard(Suit.HEART, CardRank.ACE), PlayingCard(Suit.HEART, CardRank.ACE)) // when : 카드 합을 요청한다. val actual: Int = BlackJackCalculator.calculate(cardList) diff --git a/src/test/kotlin/blackJack/card/PlayingCardTest.kt b/src/test/kotlin/blackJack/card/PlayingCardTest.kt index 820490ca05..215126d555 100644 --- a/src/test/kotlin/blackJack/card/PlayingCardTest.kt +++ b/src/test/kotlin/blackJack/card/PlayingCardTest.kt @@ -1,6 +1,6 @@ package blackJack.card -import card.CardNumber +import card.CardRank import card.PlayingCard import card.Suit import org.assertj.core.api.Assertions.assertThat @@ -11,10 +11,10 @@ class PlayingCardTest { @Test fun `트럼프 카드를 생성하고, 해당 카드의 포인트를 요청할 때, 포인트를 반환한다`() { // given : 트럼프 카드를 생성한다. - val playingCard = PlayingCard(Suit.SPADE, CardNumber.TREE) - val playingCard2 = PlayingCard(Suit.HEART, CardNumber.TWO) - val playingCard3 = PlayingCard(Suit.HEART, CardNumber.ACE) - val playingCard4 = PlayingCard(Suit.HEART, CardNumber.KING) + val playingCard = PlayingCard(Suit.SPADE, CardRank.TREE) + val playingCard2 = PlayingCard(Suit.HEART, CardRank.TWO) + val playingCard3 = PlayingCard(Suit.HEART, CardRank.ACE) + val playingCard4 = PlayingCard(Suit.HEART, CardRank.KING) // when : 해당 카드의 포인트를 요청한다. val actual = playingCard.getPoint() @@ -32,7 +32,7 @@ class PlayingCardTest { @Test fun `트럼프 카드를 만들고, 무늬 명칭을 요청할때, 무늬 명을 반환한다`() { // given : 카드를 만들고 - val playingCard = PlayingCard(Suit.SPADE, CardNumber.TREE) + val playingCard = PlayingCard(Suit.SPADE, CardRank.TREE) // when : 무늬 명칭을 요청하면 val actual = playingCard.getSuitName() diff --git a/src/test/kotlin/blackJack/player/PlayerTest.kt b/src/test/kotlin/blackJack/player/PlayerTest.kt index 2400047e2e..3155756966 100644 --- a/src/test/kotlin/blackJack/player/PlayerTest.kt +++ b/src/test/kotlin/blackJack/player/PlayerTest.kt @@ -1,6 +1,6 @@ package blackJack.player -import card.CardNumber +import card.CardRank import card.CardPack import card.PlayingCard import card.Suit @@ -57,8 +57,8 @@ class PlayerTest { fun `플레이어의 보유 가드 합이 20이하 이고, 플레이어 상태 업데이트를 요청할 때, 플에이어 상테는 PLAYING로 업데이트 된다`() { // given : 플레이어 보유 카드 합 20 이하(8) val player = Player("OYJ") - player.saveCard(PlayingCard(Suit.DIAMOND, CardNumber.TREE)) - player.saveCard(PlayingCard(Suit.DIAMOND, CardNumber.FIVE)) + player.saveCard(PlayingCard(Suit.DIAMOND, CardRank.TREE)) + player.saveCard(PlayingCard(Suit.DIAMOND, CardRank.FIVE)) // when : 플레이어 상태 업데이트 player.updateStatus() @@ -72,9 +72,9 @@ class PlayerTest { fun `플레이어의 보유 가드 합이 21이상 이고, 플레이어 상태 업데이트를 요청할 때, 플에이어 상테는 STAND로 업데이트 된다`() { // given : 플레이어 보유 카드 합 21 이상(28) val player = Player("OYJ") - player.saveCard(PlayingCard(Suit.DIAMOND, CardNumber.EIGHT)) - player.saveCard(PlayingCard(Suit.DIAMOND, CardNumber.KING)) - player.saveCard(PlayingCard(Suit.DIAMOND, CardNumber.JACK)) + player.saveCard(PlayingCard(Suit.DIAMOND, CardRank.EIGHT)) + player.saveCard(PlayingCard(Suit.DIAMOND, CardRank.KING)) + player.saveCard(PlayingCard(Suit.DIAMOND, CardRank.JACK)) // when : 플레이어 상태 업데이트 player.updateStatus() From 63171c389bc6c4f809994bd06ed09c886bf9e00b Mon Sep 17 00:00:00 2001 From: OYJ Date: Wed, 29 Nov 2023 23:50:36 +0900 Subject: [PATCH 35/54] =?UTF-8?q?Feat:=20CardDeck=EC=83=9D=EC=84=B1(?= =?UTF-8?q?=EC=B9=B4=EB=93=9C=20=EC=BA=90=EC=8B=B1)?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- src/main/kotlin/card/CardDeck.kt | 9 +++++++++ 1 file changed, 9 insertions(+) create mode 100644 src/main/kotlin/card/CardDeck.kt diff --git a/src/main/kotlin/card/CardDeck.kt b/src/main/kotlin/card/CardDeck.kt new file mode 100644 index 0000000000..2f6915c20e --- /dev/null +++ b/src/main/kotlin/card/CardDeck.kt @@ -0,0 +1,9 @@ +package card + +object CardDeck { + val cards: List = CardRank.values().flatMap { rank -> + Suit.values().map { suit -> + PlayingCard(suit = suit, cardRank = rank) + } + } +} From 23fd4695231cd47996041d20aa9c1c482a969eba Mon Sep 17 00:00:00 2001 From: OYJ Date: Thu, 30 Nov 2023 01:17:08 +0900 Subject: [PATCH 36/54] =?UTF-8?q?Refactor:=20-=20GameIndex,=20CardPack=20?= =?UTF-8?q?=EC=A0=9C=EA=B1=B0,=20-=20=EC=82=AC=EC=9D=B4=EB=93=9C=20?= =?UTF-8?q?=EC=9D=B4=ED=8C=A9=ED=8A=B8=20=EC=88=98=EC=A0=95?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Feat: - Class Cards 추가 (PlayingCard기반 일급 컬랙션) - CardPack의 카드 저장 역할 마이그래이션 CardPack -> Cards --- README.md | 15 ----- src/main/kotlin/BlackjackGame.kt | 10 +-- src/main/kotlin/GameIndex.kt | 27 -------- src/main/kotlin/card/CardPack.kt | 64 ------------------ src/main/kotlin/card/Cards.kt | 9 +++ .../kotlin/blackJack/BlackjackGameTest.kt | 20 +++--- src/test/kotlin/blackJack/GameIndexTest.kt | 65 ------------------- .../kotlin/blackJack/card/CardPackTest.kt | 54 --------------- src/test/kotlin/blackJack/card/CardsTest.kt | 27 ++++++++ .../kotlin/blackJack/player/PlayerTest.kt | 5 +- 10 files changed, 54 insertions(+), 242 deletions(-) delete mode 100644 src/main/kotlin/GameIndex.kt delete mode 100644 src/main/kotlin/card/CardPack.kt create mode 100644 src/main/kotlin/card/Cards.kt delete mode 100644 src/test/kotlin/blackJack/GameIndexTest.kt delete mode 100644 src/test/kotlin/blackJack/card/CardPackTest.kt create mode 100644 src/test/kotlin/blackJack/card/CardsTest.kt diff --git a/README.md b/README.md index 0d084c0ce4..0356a3ed2a 100644 --- a/README.md +++ b/README.md @@ -41,21 +41,6 @@ - [O] 카드의 무늬 명을 반환한다. - [O] 카드의 번호를 반환한다. -### 카드팩 - -- [O] 카드를 셔플한다. (TestCode X) -- [O] 중복되지 않고 순차적으로 카드를 반환한다. -- [O] 카드 팩을 검증한다. - - [O] 중복이 없다. - - [O] 52장의 카드로 구성된다. - -### 게임 인덱스 - -- [O] 현재 카드 인덱스를 반환한다. -- [O] 카드 인덱스를 1 증가시킨다. -- [O] 카드 인덱스가 카드 수량을 넘지 않는다. -- [O] 플레이어 인덱스를 1 증가시킨다. - ### inputView - [] 플레이어를 입력받는다. diff --git a/src/main/kotlin/BlackjackGame.kt b/src/main/kotlin/BlackjackGame.kt index 99a02f7c91..a91beaefef 100644 --- a/src/main/kotlin/BlackjackGame.kt +++ b/src/main/kotlin/BlackjackGame.kt @@ -1,9 +1,9 @@ -import card.CardPack +import card.Cards import player.Player import player.PlayerGroup import player.Status -class BlackjackGame(private val cardPack: CardPack, private val playerGroup: PlayerGroup) { +class BlackjackGame(private val cards: Cards, private val playerGroup: PlayerGroup) { init { playerGroup.playerList.forEach { @@ -11,9 +11,9 @@ class BlackjackGame(private val cardPack: CardPack, private val playerGroup: Pla } } - fun hitCard() { + fun hit() { val player = playerGroup.getCurrentPlayer() - player.saveCard(cardPack.hit()) + player.saveCard(cards.getCard()) player.updateStatus() } @@ -36,7 +36,7 @@ class BlackjackGame(private val cardPack: CardPack, private val playerGroup: Pla private fun distributeTwoCards(player: Player) { repeat(2) { - player.saveCard(cardPack.hit()) + player.saveCard(cards.getCard()) } } } diff --git a/src/main/kotlin/GameIndex.kt b/src/main/kotlin/GameIndex.kt deleted file mode 100644 index 6587bc25aa..0000000000 --- a/src/main/kotlin/GameIndex.kt +++ /dev/null @@ -1,27 +0,0 @@ -class GameIndex(private val maxCardIndex: Int) { - - private var _cardIndex: Int = 0 - val cardIndex: Int - get() = _cardIndex - - private var _playerIndex: Int = 0 - val playerIndex: Int - get() = _playerIndex - - fun increaseCardIndex() { - _cardIndex++ - validateIndex() - } - - fun increasePlayerIndex() { - _playerIndex++ - } - - private fun validateIndex() { - require(_cardIndex < maxCardIndex) { ERR_MSG_EMPTY_CARD } - } - - companion object { - private const val ERR_MSG_EMPTY_CARD = "카드가 모두 소진되었습니다." - } -} diff --git a/src/main/kotlin/card/CardPack.kt b/src/main/kotlin/card/CardPack.kt deleted file mode 100644 index 631afb2cc4..0000000000 --- a/src/main/kotlin/card/CardPack.kt +++ /dev/null @@ -1,64 +0,0 @@ -package card - -class CardPack(val cardList: List) { - - private var cardIndex = 0 - - fun hit(): PlayingCard { - return cardPack.cardList[cardIndex++] - } - - companion object { - private const val CARD_PACK_SIZE = 52 - private const val ERR_MSG_CARD_PACK_SIZE = "카드는 52개로 구성되어야 합나다." - private const val ERR_MSG_DUPLICATE_CARD_PACK = "중복되는 카드는 없어야 합니다." - - private val cardPack = createCard() - - private fun createCard(): CardPack { - val suitList = Suit.values() - val playingCardList = mutableListOf() - - for (suit in suitList) { - playingCardList.addAll(createCardWithSuit(suit)) - } - cardShuffle(playingCardList) - - val cardPack = CardPack(playingCardList) - validateCardPack(cardPack) - - return cardPack - } - - private fun cardShuffle(playingCardList: MutableList) { - playingCardList.shuffle() - } - - private fun createCardWithSuit(suit: Suit): List { - val playingCardList = mutableListOf() - val cardRankList = CardRank.getCardNumberList() - - for (cardNumber in cardRankList) { - playingCardList.add(PlayingCard(suit, cardNumber)) - } - return playingCardList - } - - private fun validateCardPack(cardPack: CardPack) { - validateCardPackSize(cardPack) - validateDuplicateCardPack(cardPack) - } - - private fun validateCardPackSize(cardPack: CardPack) { - require(cardPack.cardList.size == CARD_PACK_SIZE) { ERR_MSG_CARD_PACK_SIZE } - } - - private fun validateDuplicateCardPack(cardPack: CardPack) { - require(cardPack.cardList.size == cardPack.cardList.distinct().size) { ERR_MSG_DUPLICATE_CARD_PACK } - } - - fun getCardPack(): CardPack { - return cardPack - } - } -} diff --git a/src/main/kotlin/card/Cards.kt b/src/main/kotlin/card/Cards.kt new file mode 100644 index 0000000000..44ff25695e --- /dev/null +++ b/src/main/kotlin/card/Cards.kt @@ -0,0 +1,9 @@ +package card + +class Cards(private val cards: List) { + private var index = 0 + + fun getCard(): PlayingCard { + return cards[index++] + } +} diff --git a/src/test/kotlin/blackJack/BlackjackGameTest.kt b/src/test/kotlin/blackJack/BlackjackGameTest.kt index fa8f491c0c..736dcfbbe2 100644 --- a/src/test/kotlin/blackJack/BlackjackGameTest.kt +++ b/src/test/kotlin/blackJack/BlackjackGameTest.kt @@ -1,7 +1,8 @@ package blackJack import BlackjackGame -import card.CardPack +import card.CardDeck +import card.Cards import org.assertj.core.api.Assertions.assertThat import org.junit.jupiter.api.Test import player.Player @@ -14,10 +15,10 @@ class BlackjackGameTest { @Test fun `정상적인 카드팩을 받고, 게임에 주입되었을 때, 예외 검증을 통과한다`() { // given : 정상적인 카드팩을 받는다. - val cardPack = CardPack.getCardPack() + val cards = Cards(CardDeck.cards) // when : 게임에 카드를 주입한다. - val actual = runCatching { BlackjackGame(cardPack, defaultPlayers) }.exceptionOrNull() + val actual = runCatching { BlackjackGame(cards, defaultPlayers) }.exceptionOrNull() // then : 예외를 던지지 않는다. assertThat(actual).isNull() @@ -26,11 +27,11 @@ class BlackjackGameTest { @Test fun `플레이어 2명과 카드팩으로 구성되고, 게임이 시작될 때, 각 플레이어는 카드 2장을 받는다`() { // given : 플레이어 2명과 카드팩이 있다. - val cardPack = CardPack.getCardPack() + val cards = Cards(CardDeck.cards) val playerGroup = PlayerGroup(listOf(Player("PoPo"), Player("OYJ"))) // when : 게임이 시작된다. - BlackjackGame(cardPack, playerGroup) + BlackjackGame(cards, playerGroup) // then : 각 플레이어는 카드를 2장 받는다. playerGroup.playerList.forEach { @@ -43,14 +44,15 @@ class BlackjackGameTest { @Test fun `게임이 시작되고, 플레이어가 카드 받기를 요청할 때, 플레이어는 카드를 받아 저장한다`() { // given : 게임이 시작된다. 초기화: 플레이어당 2장씩 배포 - val cardPack = CardPack.getCardPack() + val cards = Cards(CardDeck.cards) val playerGroup = PlayerGroup(listOf(Player("PoPo"), Player("OYJ"))) - val game = BlackjackGame(cardPack, playerGroup) + val game = BlackjackGame(cards, playerGroup) // when : 저장 여부 확인 + game.hit() val currentPlayer = playerGroup.getCurrentPlayer() - val card = cardPack.cardList[0] - val actual = currentPlayer.cardList.contains(card) + val expectCard = CardDeck.cards[0] + val actual = currentPlayer.cardList.contains(expectCard) // then : 플레이어는 카드를 저장한다. assertThat(actual).isTrue() diff --git a/src/test/kotlin/blackJack/GameIndexTest.kt b/src/test/kotlin/blackJack/GameIndexTest.kt deleted file mode 100644 index c1b9fb3276..0000000000 --- a/src/test/kotlin/blackJack/GameIndexTest.kt +++ /dev/null @@ -1,65 +0,0 @@ -package blackJack - -import GameIndex -import org.assertj.core.api.Assertions.assertThat -import org.junit.jupiter.api.Test - -class GameIndexTest { - - private var maxIndex = 52 - - @Test - fun `인덱스가 생성되고, 인덱스를 요청할 때, 현재 인덱스를 반환한다`() { - // given : 인덱스가 생성된다. 인덱스는 초기값은 0이다. - val caredIndex = GameIndex(maxCardIndex = maxIndex) - - // when : 인덱스를 요청한다. - val actual = caredIndex.cardIndex - - // then : 현재 인덱스를 반환한다. - assertThat(actual).isEqualTo(0) - } - - @Test - fun `인덱스가 생성되고, 인덱스 증가 요청할 때, 인덱스가 1 증가된다`() { - // given : 인덱스가 생성된다. - val caredIndex = GameIndex(maxCardIndex = maxIndex) - val prevIndex = caredIndex.cardIndex - - // when : 인덱스 증가 요청을 한다. - caredIndex.increaseCardIndex() - val actual = caredIndex.cardIndex - - // then : 인덱스가 1 증가된다. - assertThat(actual).isEqualTo(prevIndex + 1) - } - - @Test - fun `maxIndex까지 도달하고, 인덱스 증가 요청을 할때, 예외를 던진다`() { - // given : max인덱스 값을 설정하여 생성 생성, - val gameIndex = GameIndex(maxCardIndex = maxIndex) - // maxIndex까지 도달한다 - repeat(maxIndex - 1) { - gameIndex.increaseCardIndex() - } - - // when : 인덱스 증가 요청을 한다 - val actual = runCatching { gameIndex.increaseCardIndex() }.exceptionOrNull() - - // then : 예외를 던진다. - assertThat(actual).isInstanceOf(IllegalArgumentException::class.java) - } - - @Test - fun `게임 인덱스가 생성된다, 플레이어 인덱스 증가 요청을 할 때, 플레이어 인덱스는 1 증가된다`() { - // given : 게임 인덱스를 생성한다. - val gameIndex = GameIndex(maxCardIndex = maxIndex) - - // when : 플레이어 인텍스 증가를 요청한다. - gameIndex.increasePlayerIndex() - val actual = gameIndex.playerIndex - - // then : 플레이어 인덱스는 1 증가한다. - assertThat(actual).isEqualTo(1) - } -} diff --git a/src/test/kotlin/blackJack/card/CardPackTest.kt b/src/test/kotlin/blackJack/card/CardPackTest.kt deleted file mode 100644 index 193787429c..0000000000 --- a/src/test/kotlin/blackJack/card/CardPackTest.kt +++ /dev/null @@ -1,54 +0,0 @@ -package blackJack.card - -import card.CardPack -import org.assertj.core.api.Assertions.assertThat -import org.junit.jupiter.api.Test - -class CardPackTest { - @Test - fun `카드팩은 52개의 카드로 구성되어있다`() { - val cardPack = CardPack.getCardPack() - - val cardPackSize = cardPack.cardList.size - - assertThat(cardPackSize).isEqualTo(52) - } - - @Test - fun `카트팩은 중복된 카드가 없다`() { - val cardPack = CardPack.getCardPack() - val cardPackSize = cardPack.cardList.size - - val distinctCardPack = cardPack.cardList.distinct() - val distinctCardPackSize = distinctCardPack.size - - assertThat(cardPackSize).isEqualTo(distinctCardPackSize) - } - - @Test - fun `카드팩을 생성한다, 카드 반환 요청이 들어올 때, 순차적으로 카드를 반환한다`() { - // given : 카드팩을 생성한다. - val cardPack = CardPack.getCardPack() - - // when : 카드 반환 요청이 들어온다. - val actual_1 = cardPack.hit() - val actual_2 = cardPack.hit() - - // 순차적으로 반환된다. - assertThat(actual_1).isEqualTo(cardPack.cardList[0]) - assertThat(actual_2).isEqualTo(cardPack.cardList[1]) - } - - @Test - fun `카드팩을 생성한 후, 카드 배포를 반복할 때, 동일하지 않은 카드를 배포한다`() { - // given : 카드팩 생성, 게임 시작 - val cardPack = CardPack.getCardPack() - - // when : 카드 배포 2회한다. - val card1 = cardPack.hit() - val card2 = cardPack.hit() - - // then : 동일하지 않은 카드가 배포된다. - assertThat(card1).isNotEqualTo(card2) - } -} diff --git a/src/test/kotlin/blackJack/card/CardsTest.kt b/src/test/kotlin/blackJack/card/CardsTest.kt new file mode 100644 index 0000000000..a067d36253 --- /dev/null +++ b/src/test/kotlin/blackJack/card/CardsTest.kt @@ -0,0 +1,27 @@ +package blackJack.card + +import card.CardDeck +import card.Cards +import org.assertj.core.api.Assertions.assertThat +import org.junit.jupiter.api.Test + +class CardsTest { + + @Test + fun `Cards를 생성하고, 카드 반환 요청을 했을 떄, 카드 반환과 카드 인덱스가 증가한다`() { + // given : Cards를 생성한다. + val cards = Cards(CardDeck.cards) + + // when : 카드 한장 반환을 요청한다. + val actual = cards.getCard() + + // then : 첫번째 카드를 반환하고 카드 인덱스가 1 증가한다. + assertThat(actual).isEqualTo(CardDeck.cards[0]) + + // when : 카드 한장 반환을 요청한다. + val actual2 = cards.getCard() + + // then : 두번째 카드를 반환하고 카드 인덱스가 1 증가한다. + assertThat(actual2).isEqualTo(CardDeck.cards[1]) + } +} diff --git a/src/test/kotlin/blackJack/player/PlayerTest.kt b/src/test/kotlin/blackJack/player/PlayerTest.kt index 3155756966..fa134fdff8 100644 --- a/src/test/kotlin/blackJack/player/PlayerTest.kt +++ b/src/test/kotlin/blackJack/player/PlayerTest.kt @@ -1,7 +1,7 @@ package blackJack.player +import card.CardDeck import card.CardRank -import card.CardPack import card.PlayingCard import card.Suit import org.assertj.core.api.Assertions.assertThat @@ -42,8 +42,7 @@ class PlayerTest { fun `플레이어와 카드팩이 생성되고, 플레이어가 카드를 받을 때, 받은 카드는 저장한다`() { // given : 플레이어와 카드팩을 생성한다. val player = Player("OYJ") - val cardPack = CardPack.getCardPack() - val card = cardPack.cardList[0] + val card = CardDeck.cards[0] // when : 플레이어가 카드를 받는다. player.saveCard(card) From 5854bb59853208b65c5725565ea028c7d7522fd7 Mon Sep 17 00:00:00 2001 From: OYJ Date: Thu, 30 Nov 2023 02:47:38 +0900 Subject: [PATCH 37/54] =?UTF-8?q?Refactor:=20-=20=EC=B9=B4=EB=93=9C?= =?UTF-8?q?=EB=8D=B1=20=EC=9D=B8=ED=84=B0=ED=8E=98=EC=9D=B4=EC=8A=A4?= =?UTF-8?q?=ED=99=94(=EA=B2=8C=EC=9E=84=20=EB=8D=B1,=20=ED=94=8C=EB=A0=88?= =?UTF-8?q?=EC=9D=B4=EC=96=B4=20=EB=8D=B1)=20-=20=ED=85=8C=EC=8A=A4?= =?UTF-8?q?=ED=8A=B8=20=EC=BD=94=EB=93=9C=20=EC=82=AC=EC=9D=B4=EB=93=9C=20?= =?UTF-8?q?=EC=9D=B4=ED=8C=A9=ED=8A=B8=20=EC=88=98=EC=A0=95?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- README.md | 8 ++++ src/main/kotlin/BlackjackGame.kt | 8 ++-- .../kotlin/card/{CardDeck.kt => CardPack.kt} | 2 +- src/main/kotlin/card/Cards.kt | 9 ---- src/main/kotlin/card/deck/CardDeck.kt | 7 ++++ src/main/kotlin/card/deck/GameDeck.kt | 20 +++++++++ src/main/kotlin/card/deck/PlayerDeck.kt | 14 +++++++ .../kotlin/blackJack/BlackjackGameTest.kt | 18 ++++---- src/test/kotlin/blackJack/card/CardsTest.kt | 27 ------------ .../blackJack/card/deck/GameDeckTest.kt | 42 +++++++++++++++++++ .../blackJack/card/deck/PlayerDeckTest.kt | 20 +++++++++ .../kotlin/blackJack/player/PlayerTest.kt | 4 +- 12 files changed, 127 insertions(+), 52 deletions(-) rename src/main/kotlin/card/{CardDeck.kt => CardPack.kt} (91%) delete mode 100644 src/main/kotlin/card/Cards.kt create mode 100644 src/main/kotlin/card/deck/CardDeck.kt create mode 100644 src/main/kotlin/card/deck/GameDeck.kt create mode 100644 src/main/kotlin/card/deck/PlayerDeck.kt delete mode 100644 src/test/kotlin/blackJack/card/CardsTest.kt create mode 100644 src/test/kotlin/blackJack/card/deck/GameDeckTest.kt create mode 100644 src/test/kotlin/blackJack/card/deck/PlayerDeckTest.kt diff --git a/README.md b/README.md index 0356a3ed2a..32af1e5a7a 100644 --- a/README.md +++ b/README.md @@ -20,6 +20,7 @@ - [O] 카드를 받지 않는다 하면 STAND ### 플레이어 그룹 + - [O] 플레이어는 최소 2명 이상 26명 이하여야 한다. - [O] 현재 플레이 중인 플레이어를 반환한다. - [O] 플레이어 턴을 넘긴다. @@ -41,6 +42,13 @@ - [O] 카드의 무늬 명을 반환한다. - [O] 카드의 번호를 반환한다. +### 게임 덱 +- [O] 카드를 순차적으로 반환한다. +- [O] 카드덱을 추가할 수 있다. + +### 플레이어 덱 +- [O] 카드를 추가할 수 있다. + ### inputView - [] 플레이어를 입력받는다. diff --git a/src/main/kotlin/BlackjackGame.kt b/src/main/kotlin/BlackjackGame.kt index a91beaefef..6fb4136388 100644 --- a/src/main/kotlin/BlackjackGame.kt +++ b/src/main/kotlin/BlackjackGame.kt @@ -1,9 +1,9 @@ -import card.Cards +import card.deck.GameDeck import player.Player import player.PlayerGroup import player.Status -class BlackjackGame(private val cards: Cards, private val playerGroup: PlayerGroup) { +class BlackjackGame(private val cardDeck: GameDeck, private val playerGroup: PlayerGroup) { init { playerGroup.playerList.forEach { @@ -13,7 +13,7 @@ class BlackjackGame(private val cards: Cards, private val playerGroup: PlayerGro fun hit() { val player = playerGroup.getCurrentPlayer() - player.saveCard(cards.getCard()) + player.saveCard(cardDeck.getCardWithIncrease()) player.updateStatus() } @@ -36,7 +36,7 @@ class BlackjackGame(private val cards: Cards, private val playerGroup: PlayerGro private fun distributeTwoCards(player: Player) { repeat(2) { - player.saveCard(cards.getCard()) + player.saveCard(cardDeck.getCardWithIncrease()) } } } diff --git a/src/main/kotlin/card/CardDeck.kt b/src/main/kotlin/card/CardPack.kt similarity index 91% rename from src/main/kotlin/card/CardDeck.kt rename to src/main/kotlin/card/CardPack.kt index 2f6915c20e..7ce525b581 100644 --- a/src/main/kotlin/card/CardDeck.kt +++ b/src/main/kotlin/card/CardPack.kt @@ -1,6 +1,6 @@ package card -object CardDeck { +object CardPack { val cards: List = CardRank.values().flatMap { rank -> Suit.values().map { suit -> PlayingCard(suit = suit, cardRank = rank) diff --git a/src/main/kotlin/card/Cards.kt b/src/main/kotlin/card/Cards.kt deleted file mode 100644 index 44ff25695e..0000000000 --- a/src/main/kotlin/card/Cards.kt +++ /dev/null @@ -1,9 +0,0 @@ -package card - -class Cards(private val cards: List) { - private var index = 0 - - fun getCard(): PlayingCard { - return cards[index++] - } -} diff --git a/src/main/kotlin/card/deck/CardDeck.kt b/src/main/kotlin/card/deck/CardDeck.kt new file mode 100644 index 0000000000..74f4c9f7b8 --- /dev/null +++ b/src/main/kotlin/card/deck/CardDeck.kt @@ -0,0 +1,7 @@ +package card.deck + +import card.PlayingCard + +interface CardDeck { + val cardDeck: MutableList +} diff --git a/src/main/kotlin/card/deck/GameDeck.kt b/src/main/kotlin/card/deck/GameDeck.kt new file mode 100644 index 0000000000..a0a224dd7d --- /dev/null +++ b/src/main/kotlin/card/deck/GameDeck.kt @@ -0,0 +1,20 @@ +package card.deck + +import card.PlayingCard + +class GameDeck private constructor(override val cardDeck: MutableList) : CardDeck { + + private var index = 0 + + fun getCardWithIncrease(): PlayingCard { + return cardDeck[index++] + } + + fun addCards(cards: List) { + this.cardDeck.addAll(cards) + } + + companion object { + fun create(cards: List) = GameDeck(cards.toMutableList()) + } +} diff --git a/src/main/kotlin/card/deck/PlayerDeck.kt b/src/main/kotlin/card/deck/PlayerDeck.kt new file mode 100644 index 0000000000..278ab11bec --- /dev/null +++ b/src/main/kotlin/card/deck/PlayerDeck.kt @@ -0,0 +1,14 @@ +package card.deck + +import card.PlayingCard + +class PlayerDeck(override val cardDeck: MutableList) : CardDeck { + + fun addCard(playingCard: PlayingCard) { + cardDeck.add(playingCard) + } + + companion object { + fun create() = PlayerDeck(mutableListOf()) + } +} diff --git a/src/test/kotlin/blackJack/BlackjackGameTest.kt b/src/test/kotlin/blackJack/BlackjackGameTest.kt index 736dcfbbe2..c4182f7e98 100644 --- a/src/test/kotlin/blackJack/BlackjackGameTest.kt +++ b/src/test/kotlin/blackJack/BlackjackGameTest.kt @@ -1,8 +1,8 @@ package blackJack import BlackjackGame -import card.CardDeck -import card.Cards +import card.CardPack +import card.deck.GameDeck import org.assertj.core.api.Assertions.assertThat import org.junit.jupiter.api.Test import player.Player @@ -15,10 +15,10 @@ class BlackjackGameTest { @Test fun `정상적인 카드팩을 받고, 게임에 주입되었을 때, 예외 검증을 통과한다`() { // given : 정상적인 카드팩을 받는다. - val cards = Cards(CardDeck.cards) + val cardDeck = GameDeck.create(CardPack.cards) // when : 게임에 카드를 주입한다. - val actual = runCatching { BlackjackGame(cards, defaultPlayers) }.exceptionOrNull() + val actual = runCatching { BlackjackGame(cardDeck, defaultPlayers) }.exceptionOrNull() // then : 예외를 던지지 않는다. assertThat(actual).isNull() @@ -27,11 +27,11 @@ class BlackjackGameTest { @Test fun `플레이어 2명과 카드팩으로 구성되고, 게임이 시작될 때, 각 플레이어는 카드 2장을 받는다`() { // given : 플레이어 2명과 카드팩이 있다. - val cards = Cards(CardDeck.cards) + val cardDeck = GameDeck.create(CardPack.cards) val playerGroup = PlayerGroup(listOf(Player("PoPo"), Player("OYJ"))) // when : 게임이 시작된다. - BlackjackGame(cards, playerGroup) + BlackjackGame(cardDeck, playerGroup) // then : 각 플레이어는 카드를 2장 받는다. playerGroup.playerList.forEach { @@ -44,14 +44,14 @@ class BlackjackGameTest { @Test fun `게임이 시작되고, 플레이어가 카드 받기를 요청할 때, 플레이어는 카드를 받아 저장한다`() { // given : 게임이 시작된다. 초기화: 플레이어당 2장씩 배포 - val cards = Cards(CardDeck.cards) + val cardDeck = GameDeck.create(CardPack.cards) val playerGroup = PlayerGroup(listOf(Player("PoPo"), Player("OYJ"))) - val game = BlackjackGame(cards, playerGroup) + val game = BlackjackGame(cardDeck, playerGroup) // when : 저장 여부 확인 game.hit() val currentPlayer = playerGroup.getCurrentPlayer() - val expectCard = CardDeck.cards[0] + val expectCard = CardPack.cards[0] val actual = currentPlayer.cardList.contains(expectCard) // then : 플레이어는 카드를 저장한다. diff --git a/src/test/kotlin/blackJack/card/CardsTest.kt b/src/test/kotlin/blackJack/card/CardsTest.kt deleted file mode 100644 index a067d36253..0000000000 --- a/src/test/kotlin/blackJack/card/CardsTest.kt +++ /dev/null @@ -1,27 +0,0 @@ -package blackJack.card - -import card.CardDeck -import card.Cards -import org.assertj.core.api.Assertions.assertThat -import org.junit.jupiter.api.Test - -class CardsTest { - - @Test - fun `Cards를 생성하고, 카드 반환 요청을 했을 떄, 카드 반환과 카드 인덱스가 증가한다`() { - // given : Cards를 생성한다. - val cards = Cards(CardDeck.cards) - - // when : 카드 한장 반환을 요청한다. - val actual = cards.getCard() - - // then : 첫번째 카드를 반환하고 카드 인덱스가 1 증가한다. - assertThat(actual).isEqualTo(CardDeck.cards[0]) - - // when : 카드 한장 반환을 요청한다. - val actual2 = cards.getCard() - - // then : 두번째 카드를 반환하고 카드 인덱스가 1 증가한다. - assertThat(actual2).isEqualTo(CardDeck.cards[1]) - } -} diff --git a/src/test/kotlin/blackJack/card/deck/GameDeckTest.kt b/src/test/kotlin/blackJack/card/deck/GameDeckTest.kt new file mode 100644 index 0000000000..f6fe1e82c0 --- /dev/null +++ b/src/test/kotlin/blackJack/card/deck/GameDeckTest.kt @@ -0,0 +1,42 @@ +package blackJack.card.deck + +import card.CardPack +import card.deck.GameDeck +import org.assertj.core.api.Assertions.assertThat +import org.junit.jupiter.api.Test + +class GameDeckTest { + + @Test + fun `GameDeck을 생성하고, 카드 반환 요청을 했을 떄, 카드 반환과 카드 인덱스가 증가한다`() { + // given : Cards를 생성한다. + val gameDeck = GameDeck.create(CardPack.cards) + + // when : 카드 한장 반환을 요청한다. + val actual = gameDeck.getCardWithIncrease() + + // then : 첫번째 카드를 반환하고 카드 인덱스가 1 증가한다. + assertThat(actual).isEqualTo(CardPack.cards[0]) + + // when : 카드 한장 반환을 요청한다. + val actual2 = gameDeck.getCardWithIncrease() + + // then : 두번째 카드를 반환하고 카드 인덱스가 1 증가한다. + assertThat(actual2).isEqualTo(CardPack.cards[1]) + } + + @Test + fun `gameDeck을 생성하고, 카드덱을 추가할 때, gameDeck에 카드가 추가된다`() { + // given : + val gameDeck = GameDeck.create(CardPack.cards) + + // when : + gameDeck.addCards(CardPack.cards) + val actual = gameDeck.cardDeck.size + + // then : + val expect = CardPack.cards.size * 2 + assertThat(actual).isEqualTo(expect) + + } +} diff --git a/src/test/kotlin/blackJack/card/deck/PlayerDeckTest.kt b/src/test/kotlin/blackJack/card/deck/PlayerDeckTest.kt new file mode 100644 index 0000000000..0d6a7a73ee --- /dev/null +++ b/src/test/kotlin/blackJack/card/deck/PlayerDeckTest.kt @@ -0,0 +1,20 @@ +package blackJack.card.deck + +import card.CardPack +import card.deck.PlayerDeck +import org.assertj.core.api.Assertions.assertThat +import org.junit.jupiter.api.Test + +class PlayerDeckTest { + + @Test + fun `플레이어 카드 추가`() { + val playerDeck = PlayerDeck.create() + + playerDeck.addCard(CardPack.cards[0]) + + val actual = playerDeck.cardDeck[0] + + assertThat(actual).isEqualTo(CardPack.cards[0]) + } +} diff --git a/src/test/kotlin/blackJack/player/PlayerTest.kt b/src/test/kotlin/blackJack/player/PlayerTest.kt index fa134fdff8..3b0b25d354 100644 --- a/src/test/kotlin/blackJack/player/PlayerTest.kt +++ b/src/test/kotlin/blackJack/player/PlayerTest.kt @@ -1,6 +1,6 @@ package blackJack.player -import card.CardDeck +import card.CardPack import card.CardRank import card.PlayingCard import card.Suit @@ -42,7 +42,7 @@ class PlayerTest { fun `플레이어와 카드팩이 생성되고, 플레이어가 카드를 받을 때, 받은 카드는 저장한다`() { // given : 플레이어와 카드팩을 생성한다. val player = Player("OYJ") - val card = CardDeck.cards[0] + val card = CardPack.cards[0] // when : 플레이어가 카드를 받는다. player.saveCard(card) From 335541a9000d1fb9eb22fa0e0886537646881148 Mon Sep 17 00:00:00 2001 From: OYJ Date: Fri, 1 Dec 2023 00:23:13 +0900 Subject: [PATCH 38/54] =?UTF-8?q?Feat:=20=ED=94=8C=EB=A0=88=EC=9D=B4?= =?UTF-8?q?=EC=96=B4=20=EC=B9=B4=EB=93=9C=20=EC=A0=90=EC=88=98=20=EA=B3=84?= =?UTF-8?q?=EC=82=B0=20=EA=B8=B0=EB=8A=A5=20=EC=B6=94=EA=B0=80.?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- README.md | 2 ++ src/main/kotlin/card/deck/PlayerDeck.kt | 27 ++++++++++++++++++- .../blackJack/card/deck/PlayerDeckTest.kt | 18 +++++++++++++ 3 files changed, 46 insertions(+), 1 deletion(-) diff --git a/README.md b/README.md index 32af1e5a7a..9f3fbedb64 100644 --- a/README.md +++ b/README.md @@ -48,6 +48,8 @@ ### 플레이어 덱 - [O] 카드를 추가할 수 있다. +- [O] 점수를 반환한다. + - [O] A는 블랙잭에 유리하게 점수를 반영한다. ### inputView diff --git a/src/main/kotlin/card/deck/PlayerDeck.kt b/src/main/kotlin/card/deck/PlayerDeck.kt index 278ab11bec..75bf874f49 100644 --- a/src/main/kotlin/card/deck/PlayerDeck.kt +++ b/src/main/kotlin/card/deck/PlayerDeck.kt @@ -1,14 +1,39 @@ package card.deck +import card.CardRank import card.PlayingCard -class PlayerDeck(override val cardDeck: MutableList) : CardDeck { +class PlayerDeck(override val cardDeck: MutableList = mutableListOf()) : CardDeck { fun addCard(playingCard: PlayingCard) { cardDeck.add(playingCard) } + fun getResultPoint(): Int { + var point = cardDeck.sumOf { it.getPoint() } + + if (isContainAce()) { + point += addAcePoint(point) + } + + return point + } + + private fun isContainAce(): Boolean { + return cardDeck.any { it.getCardRank() == CardRank.ACE } + } + + private fun addAcePoint(point: Int): Int { + return if (point < 11) { + ADD_ACE_POINT + } else { + ADD_ACE_POINT_NONE + } + } + companion object { fun create() = PlayerDeck(mutableListOf()) + private const val ADD_ACE_POINT = 10 + private const val ADD_ACE_POINT_NONE = 0 } } diff --git a/src/test/kotlin/blackJack/card/deck/PlayerDeckTest.kt b/src/test/kotlin/blackJack/card/deck/PlayerDeckTest.kt index 0d6a7a73ee..b03aff197d 100644 --- a/src/test/kotlin/blackJack/card/deck/PlayerDeckTest.kt +++ b/src/test/kotlin/blackJack/card/deck/PlayerDeckTest.kt @@ -1,6 +1,9 @@ package blackJack.card.deck import card.CardPack +import card.CardRank +import card.PlayingCard +import card.Suit import card.deck.PlayerDeck import org.assertj.core.api.Assertions.assertThat import org.junit.jupiter.api.Test @@ -17,4 +20,19 @@ class PlayerDeckTest { assertThat(actual).isEqualTo(CardPack.cards[0]) } + + @Test + fun `카드 점수 반환`() { + // given : 플레이어 덱을 생성하고 카드를 추가한다. + val playerDeck = PlayerDeck() + playerDeck.addCard(PlayingCard(Suit.DIAMOND, CardRank.ACE)) + playerDeck.addCard(PlayingCard(Suit.DIAMOND, CardRank.TEN)) + playerDeck.addCard(PlayingCard(Suit.DIAMOND, CardRank.TEN)) + + // when : 점수 계산 요청 + val actual: Int = playerDeck.getResultPoint() + + // then : + assertThat(actual).isEqualTo(21) + } } From a041fe258654de981f2b75fd24c707d3e8d9dc48 Mon Sep 17 00:00:00 2001 From: OYJ Date: Fri, 1 Dec 2023 01:19:29 +0900 Subject: [PATCH 39/54] =?UTF-8?q?Refactor:=20-=20=ED=94=8C=EB=A0=88?= =?UTF-8?q?=EC=9D=B4=EC=96=B4=20=EC=83=81=ED=83=9C=20=EC=B6=94=EA=B0=80=20?= =?UTF-8?q?-=20=ED=94=8C=EB=A0=88=EC=9D=B4=EC=96=B4=20=EC=83=81=ED=83=9C?= =?UTF-8?q?=20=EC=97=85=EB=8D=B0=EC=9D=B4=ED=8A=B8=20=EC=A1=B0=EA=B1=B4?= =?UTF-8?q?=EB=AC=B8=20=EC=B6=94=EA=B0=80.=20-=20BlackJackCalculator?= =?UTF-8?q?=EC=82=AD=EC=A0=9C?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- README.md | 5 +- src/main/kotlin/BlackJackCalculator.kt | 25 --------- src/main/kotlin/card/deck/PlayerDeck.kt | 4 +- src/main/kotlin/player/Player.kt | 32 ++++++++---- src/main/kotlin/player/Status.kt | 2 +- .../blackJack/BlackJackCalculatorTest.kt | 23 --------- .../kotlin/blackJack/player/PlayerTest.kt | 51 ++++++++++++------- 7 files changed, 62 insertions(+), 80 deletions(-) delete mode 100644 src/main/kotlin/BlackJackCalculator.kt delete mode 100644 src/test/kotlin/blackJack/BlackJackCalculatorTest.kt diff --git a/README.md b/README.md index 9f3fbedb64..13c9c1047b 100644 --- a/README.md +++ b/README.md @@ -11,13 +11,14 @@ ### 플레이어 -- [O] 플레이어의 초기 상태는 PLAYING이다. +- [O] 플레이어의 초기 상태는 START이다. - [O] 플레이어가 카드 받는 것을 끝내면 상태는 STAND가 된다. - [O] 플레이어는 받은 카드를 저장한다. - [O] 플레이어는 상태를 업데이트 한다. - [O] 카드의 합이 20 이하 라면 PLAYING - - [O] 카드의 합이 21을 이상 이라면 STAND + - [O] 카드의 합이 21을 이상 이라면 BUST - [O] 카드를 받지 않는다 하면 STAND + - [O] 첫 2장의 카드 합이 21이라면 BLACK_JACK ### 플레이어 그룹 diff --git a/src/main/kotlin/BlackJackCalculator.kt b/src/main/kotlin/BlackJackCalculator.kt deleted file mode 100644 index 0f69d55aba..0000000000 --- a/src/main/kotlin/BlackJackCalculator.kt +++ /dev/null @@ -1,25 +0,0 @@ -import card.CardRank -import card.PlayingCard - -object BlackJackCalculator { - - private const val ADDITIONAL_SCORE = 10 - private const val NO_ADDITIONAL_SCORE = 0 - private const val ACE_ADDITIONAL_SCORE_THRESHOLD = 12 - - fun calculate(cardList: List): Int { - var result = cardList.sumOf { it.getPoint() } - cardList.filter { it.getCardNumber() == CardRank.ACE } - .forEach { _ -> result += addCalculateAce(result) } - - return result - } - - private fun addCalculateAce(sumValue: Int): Int { - return if (sumValue < ACE_ADDITIONAL_SCORE_THRESHOLD) { - ADDITIONAL_SCORE - } else { - NO_ADDITIONAL_SCORE - } - } -} diff --git a/src/main/kotlin/card/deck/PlayerDeck.kt b/src/main/kotlin/card/deck/PlayerDeck.kt index 75bf874f49..f66c2446db 100644 --- a/src/main/kotlin/card/deck/PlayerDeck.kt +++ b/src/main/kotlin/card/deck/PlayerDeck.kt @@ -19,12 +19,14 @@ class PlayerDeck(override val cardDeck: MutableList = mutableListOf return point } + fun cardDeckSize() = cardDeck.size + private fun isContainAce(): Boolean { return cardDeck.any { it.getCardRank() == CardRank.ACE } } private fun addAcePoint(point: Int): Int { - return if (point < 11) { + return if (point <= 11) { ADD_ACE_POINT } else { ADD_ACE_POINT_NONE diff --git a/src/main/kotlin/player/Player.kt b/src/main/kotlin/player/Player.kt index 9bf74f56ff..e546ade563 100644 --- a/src/main/kotlin/player/Player.kt +++ b/src/main/kotlin/player/Player.kt @@ -1,36 +1,48 @@ package player -import BlackJackCalculator import card.PlayingCard +import card.deck.PlayerDeck class Player(val name: String) { - var status = Status.PLAYING + var status = Status.START private set - private var _cardList = mutableListOf() - val cardList: List - get() = _cardList + var playerDeck = PlayerDeck() + private set fun playDone() { updatePlayerStatus(Status.STAND) } fun saveCard(card: PlayingCard) { - _cardList.add(card) + playerDeck.addCard(card) } + fun cardDeckSize() = playerDeck.cardDeck.size + fun updateStatus() { val newStatus = determineStatus() updatePlayerStatus(newStatus) } private fun determineStatus(): Status { - val totalPoint = BlackJackCalculator.calculate(_cardList) - return when { - (totalPoint <= 20) -> Status.PLAYING - else -> Status.STAND + val totalPoint = playerDeck.getResultPoint() + + if (totalPoint > 21) { + return Status.BUST + } + + if (isBlackJack()) { + return Status.BLACK_JACK } + + return Status.PLAYING + } + + private fun isBlackJack(): Boolean { + val totalPoint = playerDeck.getResultPoint() + return playerDeck.cardDeckSize() == 2 && totalPoint == 21 } private fun updatePlayerStatus(status: Status) { diff --git a/src/main/kotlin/player/Status.kt b/src/main/kotlin/player/Status.kt index a719668deb..a5f8ae38fc 100644 --- a/src/main/kotlin/player/Status.kt +++ b/src/main/kotlin/player/Status.kt @@ -1,5 +1,5 @@ package player enum class Status { - PLAYING, STAND + START, PLAYING, STAND, BLACK_JACK, BUST } diff --git a/src/test/kotlin/blackJack/BlackJackCalculatorTest.kt b/src/test/kotlin/blackJack/BlackJackCalculatorTest.kt deleted file mode 100644 index 8bcc17f6ea..0000000000 --- a/src/test/kotlin/blackJack/BlackJackCalculatorTest.kt +++ /dev/null @@ -1,23 +0,0 @@ -package blackJack - -import BlackJackCalculator -import card.CardRank -import card.PlayingCard -import card.Suit -import org.assertj.core.api.Assertions.assertThat -import org.junit.jupiter.api.Test - -class BlackJackCalculatorTest { - - @Test - fun `카드 리스트를 받는다, 카드의 합을 요청할 때, 승리에 유리한 합을 반환한다`() { - // given : 카드 리스트를 받는다. - val cardList = listOf(PlayingCard(Suit.HEART, CardRank.ACE), PlayingCard(Suit.HEART, CardRank.ACE)) - - // when : 카드 합을 요청한다. - val actual: Int = BlackJackCalculator.calculate(cardList) - - // then : 승리에 유리한 합을 반환한다. - assertThat(actual).isEqualTo(12) - } -} diff --git a/src/test/kotlin/blackJack/player/PlayerTest.kt b/src/test/kotlin/blackJack/player/PlayerTest.kt index 3b0b25d354..0847c0ba1a 100644 --- a/src/test/kotlin/blackJack/player/PlayerTest.kt +++ b/src/test/kotlin/blackJack/player/PlayerTest.kt @@ -11,6 +11,20 @@ import player.Status class PlayerTest { + @Test + fun `플레이어와 카드팩이 생성되고, 플레이어가 카드를 받을 때, 받은 카드는 저장한다`() { + // given : 플레이어와 카드팩을 생성한다. + val player = Player("OYJ") + val card = CardPack.cards[0] + + // when : 플레이어가 카드를 받는다. + player.saveCard(card) + val actual = player.playerDeck.cardDeck[0] + + // then : + assertThat(actual).isEqualTo(card) + } + @Test fun `,플에이어가 생성될 때 ,초기 상태는 플레이중 이다 `() { // given : @@ -20,7 +34,7 @@ class PlayerTest { val actual = player.status // then : 초기 상태는 PLAYING이다. - val expect = Status.PLAYING + val expect = Status.START assertThat(actual).isEqualTo(expect) } @@ -39,21 +53,7 @@ class PlayerTest { } @Test - fun `플레이어와 카드팩이 생성되고, 플레이어가 카드를 받을 때, 받은 카드는 저장한다`() { - // given : 플레이어와 카드팩을 생성한다. - val player = Player("OYJ") - val card = CardPack.cards[0] - - // when : 플레이어가 카드를 받는다. - player.saveCard(card) - val actual = player.cardList[0] - - // then : - assertThat(actual).isEqualTo(card) - } - - @Test - fun `플레이어의 보유 가드 합이 20이하 이고, 플레이어 상태 업데이트를 요청할 때, 플에이어 상테는 PLAYING로 업데이트 된다`() { + fun `플레이어가 카드를 받고, 플레이어 보유 카드 합이 20이하 일 때, 플에이어 상테는 PLAYING로 업데이트 된다`() { // given : 플레이어 보유 카드 합 20 이하(8) val player = Player("OYJ") player.saveCard(PlayingCard(Suit.DIAMOND, CardRank.TREE)) @@ -68,7 +68,7 @@ class PlayerTest { } @Test - fun `플레이어의 보유 가드 합이 21이상 이고, 플레이어 상태 업데이트를 요청할 때, 플에이어 상테는 STAND로 업데이트 된다`() { + fun `플레이어가 카드를 받고, 플레이어 보유 카드 합이 21이상 일 때, 플에이어 상테는 BUST로 업데이트 된다`() { // given : 플레이어 보유 카드 합 21 이상(28) val player = Player("OYJ") player.saveCard(PlayingCard(Suit.DIAMOND, CardRank.EIGHT)) @@ -80,7 +80,22 @@ class PlayerTest { val actual = player.status // then : 플레이어 상태는 PLAYING이다. - assertThat(actual).isEqualTo(Status.STAND) + assertThat(actual).isEqualTo(Status.BUST) + } + + @Test + fun `플레이어가 초기 2장의 카드를 받고, 플레이어 보유 가드 합이 21 일 때, 플에이어 상테는 BLACK_JACK으로 업데이트 된다`() { + // given : 플레이어 보유 카드 2장 && 합 21 + val player = Player("OYJ") + player.saveCard(PlayingCard(Suit.DIAMOND, CardRank.ACE)) + player.saveCard(PlayingCard(Suit.DIAMOND, CardRank.KING)) + + // when : 플레이어 상태 업데이트 + player.updateStatus() + val actual = player.status + + // then : 플레이어 상태는 PLAYING이다. + assertThat(actual).isEqualTo(Status.BLACK_JACK) } @Test From 2b1857dff8fd882edb4c38bbbd67856882005711 Mon Sep 17 00:00:00 2001 From: OYJ Date: Fri, 1 Dec 2023 01:23:46 +0900 Subject: [PATCH 40/54] =?UTF-8?q?chore=20-=20PlayingCard=20class=20->=20da?= =?UTF-8?q?ta=20class=20-=20class=20Player=20=EB=B6=88=ED=95=84=EC=9A=94?= =?UTF-8?q?=ED=95=9C=20=ED=95=A8=EC=88=98=20=EC=A0=9C=EA=B1=B0=20-=20class?= =?UTF-8?q?=20Player=20=EB=B3=80=EC=88=98=20=EB=B3=80=EA=B2=BD=20cardList?= =?UTF-8?q?=20->=20playerDeck?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- src/main/kotlin/card/PlayingCard.kt | 4 ++-- src/main/kotlin/player/Player.kt | 2 -- src/test/kotlin/blackJack/BlackjackGameTest.kt | 5 +++-- 3 files changed, 5 insertions(+), 6 deletions(-) diff --git a/src/main/kotlin/card/PlayingCard.kt b/src/main/kotlin/card/PlayingCard.kt index c4aa7dd79a..8e283b1b67 100644 --- a/src/main/kotlin/card/PlayingCard.kt +++ b/src/main/kotlin/card/PlayingCard.kt @@ -1,6 +1,6 @@ package card -class PlayingCard(private val suit: Suit, private val cardRank: CardRank) { +data class PlayingCard(private val suit: Suit, private val cardRank: CardRank) { fun getPoint(): Int { return cardRank.point } @@ -9,7 +9,7 @@ class PlayingCard(private val suit: Suit, private val cardRank: CardRank) { return suit.koName } - fun getCardNumber(): CardRank { + fun getCardRank(): CardRank { return cardRank } diff --git a/src/main/kotlin/player/Player.kt b/src/main/kotlin/player/Player.kt index e546ade563..166442feb7 100644 --- a/src/main/kotlin/player/Player.kt +++ b/src/main/kotlin/player/Player.kt @@ -19,8 +19,6 @@ class Player(val name: String) { playerDeck.addCard(card) } - fun cardDeckSize() = playerDeck.cardDeck.size - fun updateStatus() { val newStatus = determineStatus() updatePlayerStatus(newStatus) diff --git a/src/test/kotlin/blackJack/BlackjackGameTest.kt b/src/test/kotlin/blackJack/BlackjackGameTest.kt index c4182f7e98..d1c0fb6d92 100644 --- a/src/test/kotlin/blackJack/BlackjackGameTest.kt +++ b/src/test/kotlin/blackJack/BlackjackGameTest.kt @@ -35,7 +35,7 @@ class BlackjackGameTest { // then : 각 플레이어는 카드를 2장 받는다. playerGroup.playerList.forEach { - val actual = it.cardList.size + val actual = it.playerDeck.cardDeckSize() val expect = 2 assertThat(actual).isEqualTo(expect) } @@ -51,8 +51,9 @@ class BlackjackGameTest { // when : 저장 여부 확인 game.hit() val currentPlayer = playerGroup.getCurrentPlayer() + val expectCard = CardPack.cards[0] - val actual = currentPlayer.cardList.contains(expectCard) + val actual = currentPlayer.playerDeck.cardDeck.contains(expectCard) // then : 플레이어는 카드를 저장한다. assertThat(actual).isTrue() From ac1c262e1f90a980fa05de6a9abb7f40fa4553c8 Mon Sep 17 00:00:00 2001 From: OYJ Date: Fri, 1 Dec 2023 01:30:41 +0900 Subject: [PATCH 41/54] =?UTF-8?q?Refactor:=20=ED=94=8C=EB=A0=88=EC=9D=B4?= =?UTF-8?q?=EC=96=B4=20=EC=83=81=ED=83=9C=20=EC=97=85=EB=8D=B0=EC=9D=B4?= =?UTF-8?q?=ED=8A=B8=20=EB=A1=9C=EC=A7=81=20=EB=B3=80=EA=B2=BD?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- README.md | 3 --- src/main/kotlin/player/Player.kt | 23 ++++++----------------- 2 files changed, 6 insertions(+), 20 deletions(-) diff --git a/README.md b/README.md index 13c9c1047b..fc575fa126 100644 --- a/README.md +++ b/README.md @@ -34,9 +34,6 @@ - [O] 유저 턴을 넘긴다. (TestCode X) - [O] 유저 턴을 종료한다. (TestCode X) -### 블랙젝 계산기 -- [O] 결과를 계산한다. - ### 트럼프 카드(플레잉 카드) - [O] 카드의 포인트를 반환한다. diff --git a/src/main/kotlin/player/Player.kt b/src/main/kotlin/player/Player.kt index 166442feb7..9d2768f86e 100644 --- a/src/main/kotlin/player/Player.kt +++ b/src/main/kotlin/player/Player.kt @@ -12,7 +12,7 @@ class Player(val name: String) { private set fun playDone() { - updatePlayerStatus(Status.STAND) + this.status = Status.STAND } fun saveCard(card: PlayingCard) { @@ -20,30 +20,19 @@ class Player(val name: String) { } fun updateStatus() { - val newStatus = determineStatus() - updatePlayerStatus(newStatus) - } - - private fun determineStatus(): Status { val totalPoint = playerDeck.getResultPoint() if (totalPoint > 21) { - return Status.BUST - } - - if (isBlackJack()) { - return Status.BLACK_JACK + this.status = Status.BUST + } else if (isBlackJack()) { + this.status = Status.BLACK_JACK + } else { + this.status = Status.PLAYING } - - return Status.PLAYING } private fun isBlackJack(): Boolean { val totalPoint = playerDeck.getResultPoint() return playerDeck.cardDeckSize() == 2 && totalPoint == 21 } - - private fun updatePlayerStatus(status: Status) { - this.status = status - } } From c70c5168c1ab9a76ae049ea5529efc2f385ee0f2 Mon Sep 17 00:00:00 2001 From: OYJ Date: Fri, 1 Dec 2023 01:50:03 +0900 Subject: [PATCH 42/54] =?UTF-8?q?chore:=20GameDeckTest=20=EC=A3=BC?= =?UTF-8?q?=EC=84=9D=20=EC=B6=94=EA=B0=80.?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- src/test/kotlin/blackJack/card/deck/GameDeckTest.kt | 7 +++---- 1 file changed, 3 insertions(+), 4 deletions(-) diff --git a/src/test/kotlin/blackJack/card/deck/GameDeckTest.kt b/src/test/kotlin/blackJack/card/deck/GameDeckTest.kt index f6fe1e82c0..c3e5cfe2e0 100644 --- a/src/test/kotlin/blackJack/card/deck/GameDeckTest.kt +++ b/src/test/kotlin/blackJack/card/deck/GameDeckTest.kt @@ -27,16 +27,15 @@ class GameDeckTest { @Test fun `gameDeck을 생성하고, 카드덱을 추가할 때, gameDeck에 카드가 추가된다`() { - // given : + // given : 게임 덱을 생성한다. val gameDeck = GameDeck.create(CardPack.cards) - // when : + // when : 게임 덱을 추가한다. gameDeck.addCards(CardPack.cards) val actual = gameDeck.cardDeck.size - // then : + // then : 카드 덱이 추가된다. val expect = CardPack.cards.size * 2 assertThat(actual).isEqualTo(expect) - } } From 30d783764adc0c96de9b67ba1491fd8fcd22a081 Mon Sep 17 00:00:00 2001 From: OYJ Date: Sat, 2 Dec 2023 14:29:33 +0900 Subject: [PATCH 43/54] =?UTF-8?q?Feat:=20Input,=20Output=20View=20?= =?UTF-8?q?=EA=B5=AC=ED=98=84?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- src/main/kotlin/view/InputView.kt | 27 ++++++++++++++++++++++++ src/main/kotlin/view/OutputView.kt | 33 ++++++++++++++++++++++++++++++ 2 files changed, 60 insertions(+) create mode 100644 src/main/kotlin/view/InputView.kt create mode 100644 src/main/kotlin/view/OutputView.kt diff --git a/src/main/kotlin/view/InputView.kt b/src/main/kotlin/view/InputView.kt new file mode 100644 index 0000000000..fcf010d640 --- /dev/null +++ b/src/main/kotlin/view/InputView.kt @@ -0,0 +1,27 @@ +package view + +object InputView { + fun inputPlayerName(): String { + println("게임에 참여할 사람의 이름을 입력하세요.(쉼표 기준으로 분리)") + val inputData = readln() + validatePlayerNameInputData(inputData) + return inputData + } + + fun isHit(playerName: String): String { + println("${playerName}는 한장의 카드를 더 받겠습니까?(예는 y, 아니오는 n)") + return readln() + } + + private fun validatePlayerNameInputData(inputData: String) { + validateZeroPlayerCnt(inputData) + } + + private fun validateZeroPlayerCnt(inputData: String) { + val nameList = inputData.split(',') + .map { it.trim() } + .filter { it.isNotBlank() } + + require(nameList.isNotEmpty()) { "출전할 플레이어는 0명 입니다." } + } +} diff --git a/src/main/kotlin/view/OutputView.kt b/src/main/kotlin/view/OutputView.kt new file mode 100644 index 0000000000..6e45fb064f --- /dev/null +++ b/src/main/kotlin/view/OutputView.kt @@ -0,0 +1,33 @@ +package view + +import player.Player +import player.PlayerGroup + +object OutputView { + + fun showGameStart(playerGroup: PlayerGroup) { + val sb = StringBuilder() + playerGroup.playerList.forEach { + sb.append("${it.name}, ") + } + sb.deleteCharAt(sb.lastIndex -1) + sb.append("에게 2장의 나누었습니다.") + println(sb.toString()) + playerGroup.playerList.forEach { showPlayingCard(it) } + println() + } + + fun showPlayingCard(player: Player) { + println("${player.name}카드: ${player.playerDeck}") + } + + fun showGameEnd(playerGroup: PlayerGroup) { + println() + playerGroup.playerList.forEach { showPlayerCardWithPoint(it) } + } + + private fun showPlayerCardWithPoint(player: Player) { + val totalPoint = player.getResultPoint() + println("${player.name}카드: ${player.playerDeck} - 결과: $totalPoint") + } +} From 01d425940a136c6618ad937e69b1d947b737056f Mon Sep 17 00:00:00 2001 From: OYJ Date: Sat, 2 Dec 2023 14:45:20 +0900 Subject: [PATCH 44/54] =?UTF-8?q?Feat:=20InputData=20to=20PlayerList=20?= =?UTF-8?q?=EB=A5=BC=20=EC=9C=84=ED=95=9C=20=ED=94=8C=EB=9E=98=EC=9D=B4?= =?UTF-8?q?=EC=96=B4=20=ED=8C=A9=ED=86=A0=EB=A6=AC=20=EA=B5=AC=ED=98=84?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit chore: 플레이어 수 검증 예외 메시지 수정, InputView 매직 스트링 제거 및 함수 네이밍 변경 --- README.md | 16 +++++---- src/main/kotlin/player/PlayerFactory.kt | 19 ++++++++++ src/main/kotlin/view/InputView.kt | 13 ++++--- .../blackJack/player/PlayerFactoryTest.kt | 35 +++++++++++++++++++ 4 files changed, 72 insertions(+), 11 deletions(-) create mode 100644 src/main/kotlin/player/PlayerFactory.kt create mode 100644 src/test/kotlin/blackJack/player/PlayerFactoryTest.kt diff --git a/README.md b/README.md index fc575fa126..bf2619ef28 100644 --- a/README.md +++ b/README.md @@ -26,13 +26,14 @@ - [O] 현재 플레이 중인 플레이어를 반환한다. - [O] 플레이어 턴을 넘긴다. +### 플레이어 펙토리 +- [O] 문자열을 받아서 플레이어 리스트 생성. +- [O] 공백은 플레어어로 생성하지 않는다. + ### 블랙젝 게임 - [O] 플레이어는 게임 시작시 2장의 카드를 받는다. -- [O] 배포한 카드를 플레이어에게 전달한다. -- [O] 유저를 반환한다. (TestCode X) -- [O] 유저 턴을 넘긴다. (TestCode X) -- [O] 유저 턴을 종료한다. (TestCode X) + ### 트럼프 카드(플레잉 카드) @@ -53,9 +54,10 @@ - [] 플레이어를 입력받는다. - [] 플레이어가 입력되지 않으면 예외를 던진다. -- [] 카드 수집 여부를 받는다. +- [] Hit or Stand ### output -- [] 플레이어가 가지고 있는 카드를 보여준다. -- [] 플레이어 카드 계산값을 보여준다. +- [] 게임 시작 시 초기 카드 출력 +- [] 플레이어가 가지고 있는 카드를 출력 +- [] 플레이어 카드 계산값을 출력 diff --git a/src/main/kotlin/player/PlayerFactory.kt b/src/main/kotlin/player/PlayerFactory.kt new file mode 100644 index 0000000000..2e348012ba --- /dev/null +++ b/src/main/kotlin/player/PlayerFactory.kt @@ -0,0 +1,19 @@ +package player + +object PlayerFactory { + + private const val DELIMITERS = ',' + + fun createPlayerList(playerNames: String): List { + val playerNameList = splitInputData(playerNames) + val playerList = mutableListOf() + playerNameList.forEach { name -> + playerList.add(Player(name)) + } + return playerList + } + + private fun splitInputData(inputData: String): List { + return inputData.split(DELIMITERS).map { it.trim() }.filter { it.isNotBlank() } + } +} diff --git a/src/main/kotlin/view/InputView.kt b/src/main/kotlin/view/InputView.kt index fcf010d640..2faeae2f08 100644 --- a/src/main/kotlin/view/InputView.kt +++ b/src/main/kotlin/view/InputView.kt @@ -1,15 +1,20 @@ package view object InputView { + + private const val TEXT_INPUT_PROMPT = "게임에 참여할 사람의 이름을 입력하세요.(쉼표 기준으로 분리)" + private const val TEXT_HIT_PROMPT_FORMAT = "%s는 한장의 카드를 더 받겠습니까?(예는 y, 아니오는 n)" + private const val ERR_MSG_MINIMUM_PLAYER_COUNT = "출전할 플레이어는 2명 이상이어야 합니다." + fun inputPlayerName(): String { - println("게임에 참여할 사람의 이름을 입력하세요.(쉼표 기준으로 분리)") + println(TEXT_INPUT_PROMPT) val inputData = readln() validatePlayerNameInputData(inputData) return inputData } - fun isHit(playerName: String): String { - println("${playerName}는 한장의 카드를 더 받겠습니까?(예는 y, 아니오는 n)") + fun askForHit(playerName: String): String { + println(TEXT_HIT_PROMPT_FORMAT.format(playerName)) return readln() } @@ -22,6 +27,6 @@ object InputView { .map { it.trim() } .filter { it.isNotBlank() } - require(nameList.isNotEmpty()) { "출전할 플레이어는 0명 입니다." } + require(nameList.isNotEmpty()) { ERR_MSG_MINIMUM_PLAYER_COUNT } } } diff --git a/src/test/kotlin/blackJack/player/PlayerFactoryTest.kt b/src/test/kotlin/blackJack/player/PlayerFactoryTest.kt new file mode 100644 index 0000000000..1cdf2cc7f0 --- /dev/null +++ b/src/test/kotlin/blackJack/player/PlayerFactoryTest.kt @@ -0,0 +1,35 @@ +package blackJack.player + +import org.assertj.core.api.Assertions.assertThat +import org.junit.jupiter.api.Test +import player.Player +import player.PlayerFactory + +class PlayerFactoryTest { + + @Test + fun `문자열을 받고, 플레이어 생성을 요청할 때, 플레이어 리스트를 반환한다`() { + // given : ,로 구분된 문자열을 받는다. + val playerNames = "oyj, kth, og" + + // when : 플레이어 생성을 요청한다. + val actual =PlayerFactory.createPlayerList(playerNames) + + // then : List를 생성한다. + val expect = listOf(Player("oyj"),Player("kth"),Player("og")) + assertThat(actual).isEqualTo(expect) + } + + @Test + fun `공백이 포한된 문자열을 받고, 플레이어 생성을 요청할 때, 공백은 제외된 플레이어만 생성된다`() { + // given : ,로 구분된 문자열을 받는다. + val playerNames = "oyj, kth, " + + // when : 플레이어 생성을 요청한다. + val actual =PlayerFactory.createPlayerList(playerNames) + + // then : List를 생성한다. + val expect = listOf(Player("oyj"),Player("kth")) + assertThat(actual).isEqualTo(expect) + } +} From e8c4212e10c3e69313beff9389a3dad89310f474 Mon Sep 17 00:00:00 2001 From: OYJ Date: Sat, 2 Dec 2023 14:53:24 +0900 Subject: [PATCH 45/54] =?UTF-8?q?Docs:=20README.md=20=EB=B3=80=EA=B2=BD?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Refactor: BlackjackGameTest 삭제 --- README.md | 15 ++--- .../kotlin/blackJack/BlackjackGameTest.kt | 61 ------------------- 2 files changed, 5 insertions(+), 71 deletions(-) delete mode 100644 src/test/kotlin/blackJack/BlackjackGameTest.kt diff --git a/README.md b/README.md index bf2619ef28..5fc6711b4c 100644 --- a/README.md +++ b/README.md @@ -30,10 +30,6 @@ - [O] 문자열을 받아서 플레이어 리스트 생성. - [O] 공백은 플레어어로 생성하지 않는다. -### 블랙젝 게임 - -- [O] 플레이어는 게임 시작시 2장의 카드를 받는다. - ### 트럼프 카드(플레잉 카드) @@ -52,12 +48,11 @@ ### inputView -- [] 플레이어를 입력받는다. - - [] 플레이어가 입력되지 않으면 예외를 던진다. -- [] Hit or Stand +- [O] 플레이어를 입력받는다. + - [O] 플레이어가 입력되지 않으면 예외를 던진다. ### output -- [] 게임 시작 시 초기 카드 출력 -- [] 플레이어가 가지고 있는 카드를 출력 -- [] 플레이어 카드 계산값을 출력 +- [O] 게임 시작 시 초기 카드 출력 +- [O] 플레이어가 가지고 있는 카드를 출력 +- [O] 플레이어 카드 계산값을 출력 diff --git a/src/test/kotlin/blackJack/BlackjackGameTest.kt b/src/test/kotlin/blackJack/BlackjackGameTest.kt deleted file mode 100644 index d1c0fb6d92..0000000000 --- a/src/test/kotlin/blackJack/BlackjackGameTest.kt +++ /dev/null @@ -1,61 +0,0 @@ -package blackJack - -import BlackjackGame -import card.CardPack -import card.deck.GameDeck -import org.assertj.core.api.Assertions.assertThat -import org.junit.jupiter.api.Test -import player.Player -import player.PlayerGroup - -class BlackjackGameTest { - - private val defaultPlayers = PlayerGroup(listOf(Player("OYJ"), Player("OYJ"))) - - @Test - fun `정상적인 카드팩을 받고, 게임에 주입되었을 때, 예외 검증을 통과한다`() { - // given : 정상적인 카드팩을 받는다. - val cardDeck = GameDeck.create(CardPack.cards) - - // when : 게임에 카드를 주입한다. - val actual = runCatching { BlackjackGame(cardDeck, defaultPlayers) }.exceptionOrNull() - - // then : 예외를 던지지 않는다. - assertThat(actual).isNull() - } - - @Test - fun `플레이어 2명과 카드팩으로 구성되고, 게임이 시작될 때, 각 플레이어는 카드 2장을 받는다`() { - // given : 플레이어 2명과 카드팩이 있다. - val cardDeck = GameDeck.create(CardPack.cards) - val playerGroup = PlayerGroup(listOf(Player("PoPo"), Player("OYJ"))) - - // when : 게임이 시작된다. - BlackjackGame(cardDeck, playerGroup) - - // then : 각 플레이어는 카드를 2장 받는다. - playerGroup.playerList.forEach { - val actual = it.playerDeck.cardDeckSize() - val expect = 2 - assertThat(actual).isEqualTo(expect) - } - } - - @Test - fun `게임이 시작되고, 플레이어가 카드 받기를 요청할 때, 플레이어는 카드를 받아 저장한다`() { - // given : 게임이 시작된다. 초기화: 플레이어당 2장씩 배포 - val cardDeck = GameDeck.create(CardPack.cards) - val playerGroup = PlayerGroup(listOf(Player("PoPo"), Player("OYJ"))) - val game = BlackjackGame(cardDeck, playerGroup) - - // when : 저장 여부 확인 - game.hit() - val currentPlayer = playerGroup.getCurrentPlayer() - - val expectCard = CardPack.cards[0] - val actual = currentPlayer.playerDeck.cardDeck.contains(expectCard) - - // then : 플레이어는 카드를 저장한다. - assertThat(actual).isTrue() - } -} From 9dd14992e6e2f46453c176a0edf705f1d6124eea Mon Sep 17 00:00:00 2001 From: OYJ Date: Sat, 2 Dec 2023 15:00:29 +0900 Subject: [PATCH 46/54] =?UTF-8?q?Refactor:=20=EA=B2=8C=EC=9E=84=20?= =?UTF-8?q?=EB=8D=B1=20=EC=85=94=ED=94=8C=20=EA=B8=B0=EB=8A=A5=20=EC=B6=94?= =?UTF-8?q?=EA=B0=80,=20=EC=83=9D=EC=84=B1=EC=9E=90=20public=EC=9C=BC?= =?UTF-8?q?=EB=A1=9C=20=EB=B3=80=EA=B2=BD,=20=ED=94=8C=EB=A0=88=EC=9D=B4?= =?UTF-8?q?=EC=96=B4=20=EB=8D=B1=20override=20toString()?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- src/main/kotlin/card/deck/GameDeck.kt | 9 ++++----- src/main/kotlin/card/deck/PlayerDeck.kt | 9 +++++++++ src/test/kotlin/blackJack/card/deck/GameDeckTest.kt | 9 +++++---- 3 files changed, 18 insertions(+), 9 deletions(-) diff --git a/src/main/kotlin/card/deck/GameDeck.kt b/src/main/kotlin/card/deck/GameDeck.kt index a0a224dd7d..b42b176641 100644 --- a/src/main/kotlin/card/deck/GameDeck.kt +++ b/src/main/kotlin/card/deck/GameDeck.kt @@ -2,8 +2,11 @@ package card.deck import card.PlayingCard -class GameDeck private constructor(override val cardDeck: MutableList) : CardDeck { +class GameDeck (override val cardDeck: MutableList) : CardDeck { + init { + cardDeck.shuffle() + } private var index = 0 fun getCardWithIncrease(): PlayingCard { @@ -13,8 +16,4 @@ class GameDeck private constructor(override val cardDeck: MutableList) { this.cardDeck.addAll(cards) } - - companion object { - fun create(cards: List) = GameDeck(cards.toMutableList()) - } } diff --git a/src/main/kotlin/card/deck/PlayerDeck.kt b/src/main/kotlin/card/deck/PlayerDeck.kt index f66c2446db..373eecfd94 100644 --- a/src/main/kotlin/card/deck/PlayerDeck.kt +++ b/src/main/kotlin/card/deck/PlayerDeck.kt @@ -38,4 +38,13 @@ class PlayerDeck(override val cardDeck: MutableList = mutableListOf private const val ADD_ACE_POINT = 10 private const val ADD_ACE_POINT_NONE = 0 } + + override fun toString(): String { + val sb = StringBuilder() + for(card in cardDeck) { + sb.append("$card, ") + } + sb.deleteCharAt(sb.lastIndex - 1) + return sb.toString() + } } diff --git a/src/test/kotlin/blackJack/card/deck/GameDeckTest.kt b/src/test/kotlin/blackJack/card/deck/GameDeckTest.kt index c3e5cfe2e0..7cf5425867 100644 --- a/src/test/kotlin/blackJack/card/deck/GameDeckTest.kt +++ b/src/test/kotlin/blackJack/card/deck/GameDeckTest.kt @@ -10,25 +10,26 @@ class GameDeckTest { @Test fun `GameDeck을 생성하고, 카드 반환 요청을 했을 떄, 카드 반환과 카드 인덱스가 증가한다`() { // given : Cards를 생성한다. - val gameDeck = GameDeck.create(CardPack.cards) + val gameDeck = GameDeck(CardPack.cards.toMutableList()) // when : 카드 한장 반환을 요청한다. val actual = gameDeck.getCardWithIncrease() // then : 첫번째 카드를 반환하고 카드 인덱스가 1 증가한다. - assertThat(actual).isEqualTo(CardPack.cards[0]) + + assertThat(actual).isEqualTo(gameDeck.cardDeck[0]) // when : 카드 한장 반환을 요청한다. val actual2 = gameDeck.getCardWithIncrease() // then : 두번째 카드를 반환하고 카드 인덱스가 1 증가한다. - assertThat(actual2).isEqualTo(CardPack.cards[1]) + assertThat(actual2).isEqualTo(gameDeck.cardDeck[1]) } @Test fun `gameDeck을 생성하고, 카드덱을 추가할 때, gameDeck에 카드가 추가된다`() { // given : 게임 덱을 생성한다. - val gameDeck = GameDeck.create(CardPack.cards) + val gameDeck = GameDeck(CardPack.cards.toMutableList()) // when : 게임 덱을 추가한다. gameDeck.addCards(CardPack.cards) From 07ed6eb87bedb79695208ef0f9f94111ad48ce87 Mon Sep 17 00:00:00 2001 From: OYJ Date: Sat, 2 Dec 2023 15:05:47 +0900 Subject: [PATCH 47/54] =?UTF-8?q?Refactor:=20=EB=B8=94=EB=9E=99=EC=9E=AD?= =?UTF-8?q?=20=EA=B2=8C=EC=9E=84=20=EB=A1=9C=EC=A7=81=20=EC=9E=AC=EA=B5=AC?= =?UTF-8?q?=ED=98=84?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- src/main/kotlin/BlackjackGame.kt | 53 ++++++++++++++++++++------------ 1 file changed, 33 insertions(+), 20 deletions(-) diff --git a/src/main/kotlin/BlackjackGame.kt b/src/main/kotlin/BlackjackGame.kt index 6fb4136388..1dd5df8f7a 100644 --- a/src/main/kotlin/BlackjackGame.kt +++ b/src/main/kotlin/BlackjackGame.kt @@ -2,41 +2,54 @@ import card.deck.GameDeck import player.Player import player.PlayerGroup import player.Status +import view.InputView +import view.OutputView -class BlackjackGame(private val cardDeck: GameDeck, private val playerGroup: PlayerGroup) { +class BlackjackGame(private val cardDeck: GameDeck, val playerGroup: PlayerGroup) { init { - playerGroup.playerList.forEach { - distributeTwoCards(it) + for (player in playerGroup.playerList) { + settingCard(player) } } - fun hit() { - val player = playerGroup.getCurrentPlayer() - player.saveCard(cardDeck.getCardWithIncrease()) - player.updateStatus() - } - - fun getCurrentPlayer(): Player { - return playerGroup.getCurrentPlayer() + fun start() { + for (player in playerGroup.playerList) { + gamePlay(player) + } } - // 턴오버. - fun playerTurnOver() { - val player = playerGroup.getCurrentPlayer() - if (player.status == Status.STAND) { - playerGroup.turnOverPlayer() + private fun gamePlay(player: Player) { + while (player.status == Status.PLAYING) { + val response = InputView.askForHit(player.name) + handleForResponse(response, player) + OutputView.showPlayingCard(player) } } - fun hitDone() { - val player = playerGroup.getCurrentPlayer() - player.playDone() + private fun handleForResponse(response: String, player: Player) { + when (response.uppercase()) { + TEXT_ANSWER_YES-> { + player.saveCard(cardDeck.getCardWithIncrease()) + } + TEXT_ANSWER_NO -> { + player.playDone() + } + else -> { + println(TEXT_RETRY_INPUT) + } + } } - private fun distributeTwoCards(player: Player) { + private fun settingCard(player: Player) { repeat(2) { player.saveCard(cardDeck.getCardWithIncrease()) } } + + companion object { + private const val TEXT_RETRY_INPUT = "Y 혹은 N만 입력 가능합니다." + private const val TEXT_ANSWER_YES = "Y" + private const val TEXT_ANSWER_NO = "N" + } } From 3bd337a17e95dffb70a46515564dd2cc98271877 Mon Sep 17 00:00:00 2001 From: OYJ Date: Sat, 2 Dec 2023 15:14:24 +0900 Subject: [PATCH 48/54] =?UTF-8?q?Refactor:=20=ED=94=8C=EB=A0=88=EC=9D=B4?= =?UTF-8?q?=EC=96=B4=20=EA=B4=80=EB=A0=A8=20=EB=B6=88=ED=95=84=EC=9A=94?= =?UTF-8?q?=ED=95=9C=20=ED=95=A8=EC=88=98=20=EC=A0=9C=EA=B1=B0=20=EB=B0=8F?= =?UTF-8?q?=20=EB=A7=A4=EC=A7=81=20=EB=84=98=EB=B2=84=20=EC=A0=9C=EA=B1=B0?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- README.md | 3 --- src/main/kotlin/player/Player.kt | 14 +++++++++-- src/main/kotlin/player/PlayerGroup.kt | 9 ------- .../blackJack/player/PlayerFactoryTest.kt | 8 +++--- .../blackJack/player/PlayerGroupTest.kt | 25 ------------------- 5 files changed, 16 insertions(+), 43 deletions(-) diff --git a/README.md b/README.md index 5fc6711b4c..f11a5075d8 100644 --- a/README.md +++ b/README.md @@ -23,14 +23,11 @@ ### 플레이어 그룹 - [O] 플레이어는 최소 2명 이상 26명 이하여야 한다. -- [O] 현재 플레이 중인 플레이어를 반환한다. -- [O] 플레이어 턴을 넘긴다. ### 플레이어 펙토리 - [O] 문자열을 받아서 플레이어 리스트 생성. - [O] 공백은 플레어어로 생성하지 않는다. - ### 트럼프 카드(플레잉 카드) - [O] 카드의 포인트를 반환한다. diff --git a/src/main/kotlin/player/Player.kt b/src/main/kotlin/player/Player.kt index 9d2768f86e..c35ecdeadb 100644 --- a/src/main/kotlin/player/Player.kt +++ b/src/main/kotlin/player/Player.kt @@ -17,12 +17,13 @@ class Player(val name: String) { fun saveCard(card: PlayingCard) { playerDeck.addCard(card) + updateStatus() } fun updateStatus() { val totalPoint = playerDeck.getResultPoint() - if (totalPoint > 21) { + if (totalPoint > BLACKJACK_NUMBER) { this.status = Status.BUST } else if (isBlackJack()) { this.status = Status.BLACK_JACK @@ -31,8 +32,17 @@ class Player(val name: String) { } } + fun getResultPoint(): Int { + return playerDeck.getResultPoint() + } + private fun isBlackJack(): Boolean { val totalPoint = playerDeck.getResultPoint() - return playerDeck.cardDeckSize() == 2 && totalPoint == 21 + return playerDeck.cardDeckSize() == BLACKJACK_CARD_COUNT && totalPoint == BLACKJACK_NUMBER + } + + companion object{ + private const val BLACKJACK_CARD_COUNT = 2 + private const val BLACKJACK_NUMBER = 21 } } diff --git a/src/main/kotlin/player/PlayerGroup.kt b/src/main/kotlin/player/PlayerGroup.kt index 3f9f1aae05..eb7e58f104 100644 --- a/src/main/kotlin/player/PlayerGroup.kt +++ b/src/main/kotlin/player/PlayerGroup.kt @@ -1,7 +1,6 @@ package player class PlayerGroup(val playerList: List) { - private var playerIndex = 0 init { validatePlayer() @@ -11,14 +10,6 @@ class PlayerGroup(val playerList: List) { require(playerList.size in MIN_PLAYER_CNT..MAM_PLAYER_CNT) { "참여 가능한 플레이어의 범위를 넘어섰습니다." } } - fun getCurrentPlayer(): Player { - return playerList[playerIndex] - } - - fun turnOverPlayer() { - playerIndex++ - } - companion object { private const val MIN_PLAYER_CNT = 2 private const val MAM_PLAYER_CNT = 26 diff --git a/src/test/kotlin/blackJack/player/PlayerFactoryTest.kt b/src/test/kotlin/blackJack/player/PlayerFactoryTest.kt index 1cdf2cc7f0..eee719e011 100644 --- a/src/test/kotlin/blackJack/player/PlayerFactoryTest.kt +++ b/src/test/kotlin/blackJack/player/PlayerFactoryTest.kt @@ -13,10 +13,10 @@ class PlayerFactoryTest { val playerNames = "oyj, kth, og" // when : 플레이어 생성을 요청한다. - val actual =PlayerFactory.createPlayerList(playerNames) + val actual = PlayerFactory.createPlayerList(playerNames).size // then : List를 생성한다. - val expect = listOf(Player("oyj"),Player("kth"),Player("og")) + val expect = 3 assertThat(actual).isEqualTo(expect) } @@ -26,10 +26,10 @@ class PlayerFactoryTest { val playerNames = "oyj, kth, " // when : 플레이어 생성을 요청한다. - val actual =PlayerFactory.createPlayerList(playerNames) + val actual = PlayerFactory.createPlayerList(playerNames).size // then : List를 생성한다. - val expect = listOf(Player("oyj"),Player("kth")) + val expect = 2 assertThat(actual).isEqualTo(expect) } } diff --git a/src/test/kotlin/blackJack/player/PlayerGroupTest.kt b/src/test/kotlin/blackJack/player/PlayerGroupTest.kt index 65703630ab..1891fb0337 100644 --- a/src/test/kotlin/blackJack/player/PlayerGroupTest.kt +++ b/src/test/kotlin/blackJack/player/PlayerGroupTest.kt @@ -21,29 +21,4 @@ class PlayerGroupTest { assertThat(actualSingle).isInstanceOf(IllegalArgumentException::class.java) assertThat(actualOver).isInstanceOf(IllegalArgumentException::class.java) } - - @Test - fun `플레이어 그룹을 만든다, 플레이어 반환 요청할 떄, 현재 플레이 중인 플레이어를 반환한다`() { - // given : 플레이어 그룹을 만든다. - val playerGroup = PlayerGroup(listOf(Player("OYJ"), Player("PoPo"))) - - // when : 현재 플레이어 반환을 요청한다. - val actual = playerGroup.getCurrentPlayer() - - // then : 첫번째 플레이어가 반환된다. - assertThat(actual).isEqualTo(playerGroup.playerList[0]) - } - - @Test - fun `플레이어 그룹을 만든다, 플레이어 턴오버를 요청할 때, 다음 플레이어로 차례가 넘어간다`() { - // given : 플레이어 그룹을 만든다. - val playerGroup = PlayerGroup(listOf(Player("OYJ"), Player("PoPo"))) - - // when : 플레이어 턴오버를 요청한다. - playerGroup.turnOverPlayer() - val actual = playerGroup.getCurrentPlayer() - - // then : 두번째 플레이어가 반환된다. - assertThat(actual).isEqualTo(playerGroup.playerList[1]) - } } From fa7ef73696ead6c91a53eed4686cddf9a0f7a9ed Mon Sep 17 00:00:00 2001 From: OYJ Date: Sat, 2 Dec 2023 15:14:56 +0900 Subject: [PATCH 49/54] =?UTF-8?q?Feat:=20=EB=A9=94=EC=9D=B8=20=ED=95=A8?= =?UTF-8?q?=EC=88=98=20=EA=B5=AC=ED=98=84?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- src/main/kotlin/BlackjackMain.kt | 21 +++++++++++++++++++++ 1 file changed, 21 insertions(+) create mode 100644 src/main/kotlin/BlackjackMain.kt diff --git a/src/main/kotlin/BlackjackMain.kt b/src/main/kotlin/BlackjackMain.kt new file mode 100644 index 0000000000..6e685fbdff --- /dev/null +++ b/src/main/kotlin/BlackjackMain.kt @@ -0,0 +1,21 @@ +import card.CardPack +import card.deck.GameDeck +import player.PlayerFactory +import player.PlayerGroup +import view.InputView +import view.OutputView + +fun main() { + + val playerNames = InputView.inputPlayerName() + val playerGroup = PlayerGroup(PlayerFactory.createPlayerList(playerNames)) + val gameDeck = GameDeck(CardPack.cards.toMutableList()) + + val game = BlackjackGame(cardDeck = gameDeck, playerGroup = playerGroup) + + OutputView.showGameStart(game.playerGroup) + + game.start() + + OutputView.showGameEnd(game.playerGroup) +} From 31afda16804a4d26fee216acffea16fa53550a59 Mon Sep 17 00:00:00 2001 From: OYJ Date: Sat, 2 Dec 2023 15:16:02 +0900 Subject: [PATCH 50/54] =?UTF-8?q?style:=20=EC=BD=94=EB=93=9C=20=EC=BB=A8?= =?UTF-8?q?=EB=B2=A4=EC=85=98=20=EC=A0=95=EB=A6=AC=20(feat:=20Gradle)?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- src/main/kotlin/BlackjackGame.kt | 2 +- src/main/kotlin/card/deck/GameDeck.kt | 2 +- src/main/kotlin/card/deck/PlayerDeck.kt | 2 +- src/main/kotlin/player/Player.kt | 2 +- src/main/kotlin/view/OutputView.kt | 2 +- src/test/kotlin/blackJack/card/deck/PlayerDeckTest.kt | 2 +- src/test/kotlin/blackJack/player/PlayerFactoryTest.kt | 1 - 7 files changed, 6 insertions(+), 7 deletions(-) diff --git a/src/main/kotlin/BlackjackGame.kt b/src/main/kotlin/BlackjackGame.kt index 1dd5df8f7a..3c65571860 100644 --- a/src/main/kotlin/BlackjackGame.kt +++ b/src/main/kotlin/BlackjackGame.kt @@ -29,7 +29,7 @@ class BlackjackGame(private val cardDeck: GameDeck, val playerGroup: PlayerGroup private fun handleForResponse(response: String, player: Player) { when (response.uppercase()) { - TEXT_ANSWER_YES-> { + TEXT_ANSWER_YES -> { player.saveCard(cardDeck.getCardWithIncrease()) } TEXT_ANSWER_NO -> { diff --git a/src/main/kotlin/card/deck/GameDeck.kt b/src/main/kotlin/card/deck/GameDeck.kt index b42b176641..4729074f2d 100644 --- a/src/main/kotlin/card/deck/GameDeck.kt +++ b/src/main/kotlin/card/deck/GameDeck.kt @@ -2,7 +2,7 @@ package card.deck import card.PlayingCard -class GameDeck (override val cardDeck: MutableList) : CardDeck { +class GameDeck(override val cardDeck: MutableList) : CardDeck { init { cardDeck.shuffle() diff --git a/src/main/kotlin/card/deck/PlayerDeck.kt b/src/main/kotlin/card/deck/PlayerDeck.kt index 373eecfd94..9dbd3436d0 100644 --- a/src/main/kotlin/card/deck/PlayerDeck.kt +++ b/src/main/kotlin/card/deck/PlayerDeck.kt @@ -41,7 +41,7 @@ class PlayerDeck(override val cardDeck: MutableList = mutableListOf override fun toString(): String { val sb = StringBuilder() - for(card in cardDeck) { + for (card in cardDeck) { sb.append("$card, ") } sb.deleteCharAt(sb.lastIndex - 1) diff --git a/src/main/kotlin/player/Player.kt b/src/main/kotlin/player/Player.kt index c35ecdeadb..802d249a02 100644 --- a/src/main/kotlin/player/Player.kt +++ b/src/main/kotlin/player/Player.kt @@ -41,7 +41,7 @@ class Player(val name: String) { return playerDeck.cardDeckSize() == BLACKJACK_CARD_COUNT && totalPoint == BLACKJACK_NUMBER } - companion object{ + companion object { private const val BLACKJACK_CARD_COUNT = 2 private const val BLACKJACK_NUMBER = 21 } diff --git a/src/main/kotlin/view/OutputView.kt b/src/main/kotlin/view/OutputView.kt index 6e45fb064f..7e52fa5084 100644 --- a/src/main/kotlin/view/OutputView.kt +++ b/src/main/kotlin/view/OutputView.kt @@ -10,7 +10,7 @@ object OutputView { playerGroup.playerList.forEach { sb.append("${it.name}, ") } - sb.deleteCharAt(sb.lastIndex -1) + sb.deleteCharAt(sb.lastIndex - 1) sb.append("에게 2장의 나누었습니다.") println(sb.toString()) playerGroup.playerList.forEach { showPlayingCard(it) } diff --git a/src/test/kotlin/blackJack/card/deck/PlayerDeckTest.kt b/src/test/kotlin/blackJack/card/deck/PlayerDeckTest.kt index b03aff197d..d0092f10f8 100644 --- a/src/test/kotlin/blackJack/card/deck/PlayerDeckTest.kt +++ b/src/test/kotlin/blackJack/card/deck/PlayerDeckTest.kt @@ -15,7 +15,7 @@ class PlayerDeckTest { val playerDeck = PlayerDeck.create() playerDeck.addCard(CardPack.cards[0]) - + val actual = playerDeck.cardDeck[0] assertThat(actual).isEqualTo(CardPack.cards[0]) diff --git a/src/test/kotlin/blackJack/player/PlayerFactoryTest.kt b/src/test/kotlin/blackJack/player/PlayerFactoryTest.kt index eee719e011..bde64ebb6f 100644 --- a/src/test/kotlin/blackJack/player/PlayerFactoryTest.kt +++ b/src/test/kotlin/blackJack/player/PlayerFactoryTest.kt @@ -2,7 +2,6 @@ package blackJack.player import org.assertj.core.api.Assertions.assertThat import org.junit.jupiter.api.Test -import player.Player import player.PlayerFactory class PlayerFactoryTest { From 1c2fd96212d78e83b8b5b8116a9e4d8529b5a4eb Mon Sep 17 00:00:00 2001 From: OYJ Date: Wed, 6 Dec 2023 21:34:23 +0900 Subject: [PATCH 51/54] =?UTF-8?q?Refactor:=20CardDeck=20interface=20?= =?UTF-8?q?=EC=82=AD=EC=A0=9C,=20=ED=94=8C=EB=A0=88=EC=9D=B4=EC=96=B4=20?= =?UTF-8?q?=EC=83=9D=EC=84=B1=EC=9E=90=20=EC=B6=94=EA=B0=80,=20=EC=B9=B4?= =?UTF-8?q?=EB=93=9C=ED=8C=A9=20=EC=9E=AC=EC=82=AC=EC=9A=A9,=20=EA=B2=8C?= =?UTF-8?q?=EC=9E=84=EB=8D=B1=20=EB=A6=AC=EC=85=8B=20=EA=B8=B0=EB=8A=A5=20?= =?UTF-8?q?=EA=B5=AC=ED=98=84=20=EB=93=B1=20=EB=A6=AC=EB=B7=B0=20=EA=B5=AC?= =?UTF-8?q?=ED=98=84?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- README.md | 1 - src/main/kotlin/card/CardPack.kt | 2 +- src/main/kotlin/card/CardRank.kt | 10 ---- src/main/kotlin/card/PlayingCard.kt | 26 ++++++++-- src/main/kotlin/card/deck/CardDeck.kt | 7 --- src/main/kotlin/card/deck/GameDeck.kt | 17 ++++-- .../card/deck/{PlayerDeck.kt => Hands.kt} | 14 ++--- src/main/kotlin/player/Player.kt | 12 +++-- .../kotlin/blackJack/card/PlayingCardTest.kt | 9 ---- .../blackJack/card/deck/FakeGameDeck.kt | 21 ++++++++ .../blackJack/card/deck/GameDeckTest.kt | 26 +++------- .../kotlin/blackJack/card/deck/HandsTest.kt | 52 +++++++++++++++++++ .../blackJack/card/deck/PlayerDeckTest.kt | 38 -------------- .../kotlin/blackJack/player/PlayerTest.kt | 2 +- 14 files changed, 130 insertions(+), 107 deletions(-) delete mode 100644 src/main/kotlin/card/deck/CardDeck.kt rename src/main/kotlin/card/deck/{PlayerDeck.kt => Hands.kt} (68%) create mode 100644 src/test/kotlin/blackJack/card/deck/FakeGameDeck.kt create mode 100644 src/test/kotlin/blackJack/card/deck/HandsTest.kt delete mode 100644 src/test/kotlin/blackJack/card/deck/PlayerDeckTest.kt diff --git a/README.md b/README.md index f11a5075d8..714e7f8a50 100644 --- a/README.md +++ b/README.md @@ -36,7 +36,6 @@ ### 게임 덱 - [O] 카드를 순차적으로 반환한다. -- [O] 카드덱을 추가할 수 있다. ### 플레이어 덱 - [O] 카드를 추가할 수 있다. diff --git a/src/main/kotlin/card/CardPack.kt b/src/main/kotlin/card/CardPack.kt index 7ce525b581..8ce92082c0 100644 --- a/src/main/kotlin/card/CardPack.kt +++ b/src/main/kotlin/card/CardPack.kt @@ -3,7 +3,7 @@ package card object CardPack { val cards: List = CardRank.values().flatMap { rank -> Suit.values().map { suit -> - PlayingCard(suit = suit, cardRank = rank) + PlayingCard.of(suit = suit, cardRank = rank) } } } diff --git a/src/main/kotlin/card/CardRank.kt b/src/main/kotlin/card/CardRank.kt index 528ab21292..1248e17401 100644 --- a/src/main/kotlin/card/CardRank.kt +++ b/src/main/kotlin/card/CardRank.kt @@ -14,14 +14,4 @@ enum class CardRank(val point: Int, val symbol: String) { JACK(10, "J"), QUEEN(10, "Q"), KING(10, "K"); - - companion object { - - private val cardNumberList = listOf( - ACE, TWO, TREE, FOUR, FIVE, SIX, SEVEN, - EIGHT, NINE, TEN, JACK, QUEEN, KING, - ) - - fun getCardNumberList() = cardNumberList - } } diff --git a/src/main/kotlin/card/PlayingCard.kt b/src/main/kotlin/card/PlayingCard.kt index 8e283b1b67..51bc0e1fc9 100644 --- a/src/main/kotlin/card/PlayingCard.kt +++ b/src/main/kotlin/card/PlayingCard.kt @@ -1,6 +1,6 @@ package card -data class PlayingCard(private val suit: Suit, private val cardRank: CardRank) { +data class PlayingCard(val suit: Suit, val cardRank: CardRank) { fun getPoint(): Int { return cardRank.point } @@ -9,11 +9,27 @@ data class PlayingCard(private val suit: Suit, private val cardRank: CardRank) { return suit.koName } - fun getCardRank(): CardRank { - return cardRank - } - override fun toString(): String { return "${cardRank.symbol}${suit.koName}" } + + companion object { + private val CARDS: MutableMap = mutableMapOf() + + fun of(suit: Suit, cardRank: CardRank): PlayingCard { + return CARDS[toKey(suit, cardRank)] ?: throw NoSuchElementException() + } + + private fun toKey(suit: Suit, cardRank: CardRank): String { + return suit.name + cardRank.name + } + + init { + for (suit in Suit.values()) { + for (cardRank in CardRank.values()) { + CARDS[toKey(suit, cardRank)] = PlayingCard(suit, cardRank) + } + } + } + } } diff --git a/src/main/kotlin/card/deck/CardDeck.kt b/src/main/kotlin/card/deck/CardDeck.kt deleted file mode 100644 index 74f4c9f7b8..0000000000 --- a/src/main/kotlin/card/deck/CardDeck.kt +++ /dev/null @@ -1,7 +0,0 @@ -package card.deck - -import card.PlayingCard - -interface CardDeck { - val cardDeck: MutableList -} diff --git a/src/main/kotlin/card/deck/GameDeck.kt b/src/main/kotlin/card/deck/GameDeck.kt index 4729074f2d..3930666d66 100644 --- a/src/main/kotlin/card/deck/GameDeck.kt +++ b/src/main/kotlin/card/deck/GameDeck.kt @@ -2,18 +2,25 @@ package card.deck import card.PlayingCard -class GameDeck(override val cardDeck: MutableList) : CardDeck { +class GameDeck(private val cardList: MutableList) { init { - cardDeck.shuffle() + cardList.shuffle() } + private var index = 0 fun getCardWithIncrease(): PlayingCard { - return cardDeck[index++] + if (isMaxIndexOfCard()) resetCard() + return cardList[index++] + } + + private fun isMaxIndexOfCard(): Boolean { + return index == cardList.size } - fun addCards(cards: List) { - this.cardDeck.addAll(cards) + private fun resetCard() { + cardList.shuffle() + index = 0 } } diff --git a/src/main/kotlin/card/deck/PlayerDeck.kt b/src/main/kotlin/card/deck/Hands.kt similarity index 68% rename from src/main/kotlin/card/deck/PlayerDeck.kt rename to src/main/kotlin/card/deck/Hands.kt index 9dbd3436d0..92a42daa80 100644 --- a/src/main/kotlin/card/deck/PlayerDeck.kt +++ b/src/main/kotlin/card/deck/Hands.kt @@ -3,14 +3,14 @@ package card.deck import card.CardRank import card.PlayingCard -class PlayerDeck(override val cardDeck: MutableList = mutableListOf()) : CardDeck { +class Hands(val cardList: MutableList = mutableListOf()) { fun addCard(playingCard: PlayingCard) { - cardDeck.add(playingCard) + cardList.add(playingCard) } fun getResultPoint(): Int { - var point = cardDeck.sumOf { it.getPoint() } + var point = cardList.sumOf { it.getPoint() } if (isContainAce()) { point += addAcePoint(point) @@ -19,10 +19,10 @@ class PlayerDeck(override val cardDeck: MutableList = mutableListOf return point } - fun cardDeckSize() = cardDeck.size + fun cardDeckSize() = cardList.size private fun isContainAce(): Boolean { - return cardDeck.any { it.getCardRank() == CardRank.ACE } + return cardList.any { it.cardRank == CardRank.ACE } } private fun addAcePoint(point: Int): Int { @@ -34,14 +34,14 @@ class PlayerDeck(override val cardDeck: MutableList = mutableListOf } companion object { - fun create() = PlayerDeck(mutableListOf()) + fun create() = Hands(mutableListOf()) private const val ADD_ACE_POINT = 10 private const val ADD_ACE_POINT_NONE = 0 } override fun toString(): String { val sb = StringBuilder() - for (card in cardDeck) { + for (card in cardList) { sb.append("$card, ") } sb.deleteCharAt(sb.lastIndex - 1) diff --git a/src/main/kotlin/player/Player.kt b/src/main/kotlin/player/Player.kt index 802d249a02..80e2dfaf37 100644 --- a/src/main/kotlin/player/Player.kt +++ b/src/main/kotlin/player/Player.kt @@ -1,14 +1,18 @@ package player import card.PlayingCard -import card.deck.PlayerDeck +import card.deck.Hands -class Player(val name: String) { +class Player( + val name: String, + status: Status = Status.START, + hands: Hands = Hands(), +) { - var status = Status.START + var status = status private set - var playerDeck = PlayerDeck() + var playerDeck = hands private set fun playDone() { diff --git a/src/test/kotlin/blackJack/card/PlayingCardTest.kt b/src/test/kotlin/blackJack/card/PlayingCardTest.kt index 215126d555..4b20449110 100644 --- a/src/test/kotlin/blackJack/card/PlayingCardTest.kt +++ b/src/test/kotlin/blackJack/card/PlayingCardTest.kt @@ -12,21 +12,12 @@ class PlayingCardTest { fun `트럼프 카드를 생성하고, 해당 카드의 포인트를 요청할 때, 포인트를 반환한다`() { // given : 트럼프 카드를 생성한다. val playingCard = PlayingCard(Suit.SPADE, CardRank.TREE) - val playingCard2 = PlayingCard(Suit.HEART, CardRank.TWO) - val playingCard3 = PlayingCard(Suit.HEART, CardRank.ACE) - val playingCard4 = PlayingCard(Suit.HEART, CardRank.KING) // when : 해당 카드의 포인트를 요청한다. val actual = playingCard.getPoint() - val actual2 = playingCard2.getPoint() - val actual3 = playingCard3.getPoint() - val actual4 = playingCard4.getPoint() // then : 카드별 포인트를 반환한다 assertThat(actual).isEqualTo(3) - assertThat(actual2).isEqualTo(2) - assertThat(actual3).isEqualTo(1) - assertThat(actual4).isEqualTo(10) } @Test diff --git a/src/test/kotlin/blackJack/card/deck/FakeGameDeck.kt b/src/test/kotlin/blackJack/card/deck/FakeGameDeck.kt new file mode 100644 index 0000000000..aea5e56591 --- /dev/null +++ b/src/test/kotlin/blackJack/card/deck/FakeGameDeck.kt @@ -0,0 +1,21 @@ +package blackJack.card.deck + +import card.PlayingCard + +class FakeGameDeck(private val cardList: MutableList) { + + private var index = 0 + + fun getCardWithIncrease(): PlayingCard { + if (isMaxIndexOfCard()) resetCard() + return cardList[index++] + } + + private fun isMaxIndexOfCard(): Boolean { + return index == cardList.size + } + + private fun resetCard() { + index = 0 + } +} diff --git a/src/test/kotlin/blackJack/card/deck/GameDeckTest.kt b/src/test/kotlin/blackJack/card/deck/GameDeckTest.kt index 7cf5425867..6db94ea5a5 100644 --- a/src/test/kotlin/blackJack/card/deck/GameDeckTest.kt +++ b/src/test/kotlin/blackJack/card/deck/GameDeckTest.kt @@ -1,7 +1,9 @@ package blackJack.card.deck import card.CardPack -import card.deck.GameDeck +import card.CardRank +import card.PlayingCard +import card.Suit import org.assertj.core.api.Assertions.assertThat import org.junit.jupiter.api.Test @@ -10,33 +12,19 @@ class GameDeckTest { @Test fun `GameDeck을 생성하고, 카드 반환 요청을 했을 떄, 카드 반환과 카드 인덱스가 증가한다`() { // given : Cards를 생성한다. - val gameDeck = GameDeck(CardPack.cards.toMutableList()) + + val gameDeck = FakeGameDeck(CardPack.cards.toMutableList()) // when : 카드 한장 반환을 요청한다. val actual = gameDeck.getCardWithIncrease() // then : 첫번째 카드를 반환하고 카드 인덱스가 1 증가한다. - - assertThat(actual).isEqualTo(gameDeck.cardDeck[0]) + assertThat(actual).isEqualTo(PlayingCard(Suit.SPADE, CardRank.ACE)) // when : 카드 한장 반환을 요청한다. val actual2 = gameDeck.getCardWithIncrease() // then : 두번째 카드를 반환하고 카드 인덱스가 1 증가한다. - assertThat(actual2).isEqualTo(gameDeck.cardDeck[1]) - } - - @Test - fun `gameDeck을 생성하고, 카드덱을 추가할 때, gameDeck에 카드가 추가된다`() { - // given : 게임 덱을 생성한다. - val gameDeck = GameDeck(CardPack.cards.toMutableList()) - - // when : 게임 덱을 추가한다. - gameDeck.addCards(CardPack.cards) - val actual = gameDeck.cardDeck.size - - // then : 카드 덱이 추가된다. - val expect = CardPack.cards.size * 2 - assertThat(actual).isEqualTo(expect) + assertThat(actual2).isEqualTo(PlayingCard(Suit.HEART, CardRank.ACE)) } } diff --git a/src/test/kotlin/blackJack/card/deck/HandsTest.kt b/src/test/kotlin/blackJack/card/deck/HandsTest.kt new file mode 100644 index 0000000000..430c548688 --- /dev/null +++ b/src/test/kotlin/blackJack/card/deck/HandsTest.kt @@ -0,0 +1,52 @@ +package blackJack.card.deck + +import card.CardPack +import card.CardRank +import card.PlayingCard +import card.Suit +import card.deck.Hands +import org.assertj.core.api.Assertions.assertThat +import org.junit.jupiter.api.Test + +class HandsTest { + + @Test + fun `플레이어 카드 추가`() { + val hands = Hands.create() + + hands.addCard(CardPack.cards[0]) + + val actual = hands.cardList[0] + + assertThat(actual).isEqualTo(PlayingCard(suit = Suit.SPADE, cardRank = CardRank.ACE)) + } + + @Test + fun `카드 점수 반환(ACE == 1)`() { + // given : 플레이어 덱을 생성하고 카드를 추가한다. + val hands = Hands() + hands.addCard(PlayingCard(Suit.DIAMOND, CardRank.ACE)) + hands.addCard(PlayingCard(Suit.DIAMOND, CardRank.TEN)) + hands.addCard(PlayingCard(Suit.DIAMOND, CardRank.TEN)) + + // when : 점수 계산 요청 + val actual: Int = hands.getResultPoint() + + // then : + assertThat(actual).isEqualTo(21) + } + + @Test + fun `카드 점수 반환(ACE == 11)`() { + // given : 플레이어 덱을 생성하고 카드를 추가한다. + val hands = Hands() + hands.addCard(PlayingCard(Suit.DIAMOND, CardRank.ACE)) + hands.addCard(PlayingCard(Suit.DIAMOND, CardRank.TEN)) + + // when : 점수 계산 요청 + val actual: Int = hands.getResultPoint() + + // then : + assertThat(actual).isEqualTo(21) + } +} diff --git a/src/test/kotlin/blackJack/card/deck/PlayerDeckTest.kt b/src/test/kotlin/blackJack/card/deck/PlayerDeckTest.kt deleted file mode 100644 index d0092f10f8..0000000000 --- a/src/test/kotlin/blackJack/card/deck/PlayerDeckTest.kt +++ /dev/null @@ -1,38 +0,0 @@ -package blackJack.card.deck - -import card.CardPack -import card.CardRank -import card.PlayingCard -import card.Suit -import card.deck.PlayerDeck -import org.assertj.core.api.Assertions.assertThat -import org.junit.jupiter.api.Test - -class PlayerDeckTest { - - @Test - fun `플레이어 카드 추가`() { - val playerDeck = PlayerDeck.create() - - playerDeck.addCard(CardPack.cards[0]) - - val actual = playerDeck.cardDeck[0] - - assertThat(actual).isEqualTo(CardPack.cards[0]) - } - - @Test - fun `카드 점수 반환`() { - // given : 플레이어 덱을 생성하고 카드를 추가한다. - val playerDeck = PlayerDeck() - playerDeck.addCard(PlayingCard(Suit.DIAMOND, CardRank.ACE)) - playerDeck.addCard(PlayingCard(Suit.DIAMOND, CardRank.TEN)) - playerDeck.addCard(PlayingCard(Suit.DIAMOND, CardRank.TEN)) - - // when : 점수 계산 요청 - val actual: Int = playerDeck.getResultPoint() - - // then : - assertThat(actual).isEqualTo(21) - } -} diff --git a/src/test/kotlin/blackJack/player/PlayerTest.kt b/src/test/kotlin/blackJack/player/PlayerTest.kt index 0847c0ba1a..f37531119b 100644 --- a/src/test/kotlin/blackJack/player/PlayerTest.kt +++ b/src/test/kotlin/blackJack/player/PlayerTest.kt @@ -19,7 +19,7 @@ class PlayerTest { // when : 플레이어가 카드를 받는다. player.saveCard(card) - val actual = player.playerDeck.cardDeck[0] + val actual = player.playerDeck.cardList[0] // then : assertThat(actual).isEqualTo(card) From 4396f524dee31c7e97fa874922f5d8881e1b5d93 Mon Sep 17 00:00:00 2001 From: OYJ Date: Thu, 7 Dec 2023 01:47:56 +0900 Subject: [PATCH 52/54] =?UTF-8?q?Chore:=20=ED=81=B4=EB=9E=98=EC=8A=A4=20?= =?UTF-8?q?=EB=AA=85=20=EB=B3=80=EA=B2=BD=20GameDeck=20->=20CardDeck?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- src/main/kotlin/BlackjackGame.kt | 4 ++-- src/main/kotlin/BlackjackMain.kt | 6 +++--- src/main/kotlin/card/deck/{GameDeck.kt => CardDeck.kt} | 2 +- .../card/deck/{GameDeckTest.kt => CardDeckTest.kt} | 2 +- 4 files changed, 7 insertions(+), 7 deletions(-) rename src/main/kotlin/card/deck/{GameDeck.kt => CardDeck.kt} (86%) rename src/test/kotlin/blackJack/card/deck/{GameDeckTest.kt => CardDeckTest.kt} (97%) diff --git a/src/main/kotlin/BlackjackGame.kt b/src/main/kotlin/BlackjackGame.kt index 3c65571860..fbb7c17ff7 100644 --- a/src/main/kotlin/BlackjackGame.kt +++ b/src/main/kotlin/BlackjackGame.kt @@ -1,11 +1,11 @@ -import card.deck.GameDeck +import card.deck.CardDeck import player.Player import player.PlayerGroup import player.Status import view.InputView import view.OutputView -class BlackjackGame(private val cardDeck: GameDeck, val playerGroup: PlayerGroup) { +class BlackjackGame(private val cardDeck: CardDeck, val playerGroup: PlayerGroup) { init { for (player in playerGroup.playerList) { diff --git a/src/main/kotlin/BlackjackMain.kt b/src/main/kotlin/BlackjackMain.kt index 6e685fbdff..15f49695ef 100644 --- a/src/main/kotlin/BlackjackMain.kt +++ b/src/main/kotlin/BlackjackMain.kt @@ -1,5 +1,5 @@ import card.CardPack -import card.deck.GameDeck +import card.deck.CardDeck import player.PlayerFactory import player.PlayerGroup import view.InputView @@ -9,9 +9,9 @@ fun main() { val playerNames = InputView.inputPlayerName() val playerGroup = PlayerGroup(PlayerFactory.createPlayerList(playerNames)) - val gameDeck = GameDeck(CardPack.cards.toMutableList()) + val cardDeck = CardDeck(CardPack.cards.toMutableList()) - val game = BlackjackGame(cardDeck = gameDeck, playerGroup = playerGroup) + val game = BlackjackGame(cardDeck = cardDeck, playerGroup = playerGroup) OutputView.showGameStart(game.playerGroup) diff --git a/src/main/kotlin/card/deck/GameDeck.kt b/src/main/kotlin/card/deck/CardDeck.kt similarity index 86% rename from src/main/kotlin/card/deck/GameDeck.kt rename to src/main/kotlin/card/deck/CardDeck.kt index 3930666d66..46aea755be 100644 --- a/src/main/kotlin/card/deck/GameDeck.kt +++ b/src/main/kotlin/card/deck/CardDeck.kt @@ -2,7 +2,7 @@ package card.deck import card.PlayingCard -class GameDeck(private val cardList: MutableList) { +class CardDeck(private val cardList: MutableList) { init { cardList.shuffle() diff --git a/src/test/kotlin/blackJack/card/deck/GameDeckTest.kt b/src/test/kotlin/blackJack/card/deck/CardDeckTest.kt similarity index 97% rename from src/test/kotlin/blackJack/card/deck/GameDeckTest.kt rename to src/test/kotlin/blackJack/card/deck/CardDeckTest.kt index 6db94ea5a5..0b2fda7b99 100644 --- a/src/test/kotlin/blackJack/card/deck/GameDeckTest.kt +++ b/src/test/kotlin/blackJack/card/deck/CardDeckTest.kt @@ -7,7 +7,7 @@ import card.Suit import org.assertj.core.api.Assertions.assertThat import org.junit.jupiter.api.Test -class GameDeckTest { +class CardDeckTest { @Test fun `GameDeck을 생성하고, 카드 반환 요청을 했을 떄, 카드 반환과 카드 인덱스가 증가한다`() { From aacff6c48b9f3b035cabbd183c87553c153e556e Mon Sep 17 00:00:00 2001 From: OYJ Date: Thu, 7 Dec 2023 02:06:43 +0900 Subject: [PATCH 53/54] =?UTF-8?q?Refactor:=20ViewInterfacd=EC=83=9D?= =?UTF-8?q?=EC=84=B1=20=EB=B0=8F=20BlackjackGame=20=EC=83=9D=EC=84=B1?= =?UTF-8?q?=EC=9E=90=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/BlackjackGame.kt | 11 ++++++----- src/main/kotlin/BlackjackMain.kt | 2 +- src/main/kotlin/view/InputView.kt | 4 ++-- src/main/kotlin/view/InputViewInterface.kt | 5 +++++ src/main/kotlin/view/OutputView.kt | 4 ++-- src/main/kotlin/view/OutputViewInterface.kt | 7 +++++++ 6 files changed, 23 insertions(+), 10 deletions(-) create mode 100644 src/main/kotlin/view/InputViewInterface.kt create mode 100644 src/main/kotlin/view/OutputViewInterface.kt diff --git a/src/main/kotlin/BlackjackGame.kt b/src/main/kotlin/BlackjackGame.kt index fbb7c17ff7..1061fb04ca 100644 --- a/src/main/kotlin/BlackjackGame.kt +++ b/src/main/kotlin/BlackjackGame.kt @@ -2,10 +2,10 @@ import card.deck.CardDeck import player.Player import player.PlayerGroup import player.Status -import view.InputView -import view.OutputView +import view.InputViewInterface +import view.OutputViewInterface -class BlackjackGame(private val cardDeck: CardDeck, val playerGroup: PlayerGroup) { +class BlackjackGame(private val cardDeck: CardDeck, val playerGroup: PlayerGroup, private val inputView: InputViewInterface, private val outputView: OutputViewInterface) { init { for (player in playerGroup.playerList) { @@ -21,9 +21,9 @@ class BlackjackGame(private val cardDeck: CardDeck, val playerGroup: PlayerGroup private fun gamePlay(player: Player) { while (player.status == Status.PLAYING) { - val response = InputView.askForHit(player.name) + val response = inputView.askForHit(player.name) handleForResponse(response, player) - OutputView.showPlayingCard(player) + outputView.showPlayingCard(player) } } @@ -51,5 +51,6 @@ class BlackjackGame(private val cardDeck: CardDeck, val playerGroup: PlayerGroup private const val TEXT_RETRY_INPUT = "Y 혹은 N만 입력 가능합니다." private const val TEXT_ANSWER_YES = "Y" private const val TEXT_ANSWER_NO = "N" + } } diff --git a/src/main/kotlin/BlackjackMain.kt b/src/main/kotlin/BlackjackMain.kt index 15f49695ef..13fc36b4c8 100644 --- a/src/main/kotlin/BlackjackMain.kt +++ b/src/main/kotlin/BlackjackMain.kt @@ -11,7 +11,7 @@ fun main() { val playerGroup = PlayerGroup(PlayerFactory.createPlayerList(playerNames)) val cardDeck = CardDeck(CardPack.cards.toMutableList()) - val game = BlackjackGame(cardDeck = cardDeck, playerGroup = playerGroup) + val game = BlackjackGame(cardDeck = cardDeck, playerGroup = playerGroup, InputView, OutputView) OutputView.showGameStart(game.playerGroup) diff --git a/src/main/kotlin/view/InputView.kt b/src/main/kotlin/view/InputView.kt index 2faeae2f08..c56b148029 100644 --- a/src/main/kotlin/view/InputView.kt +++ b/src/main/kotlin/view/InputView.kt @@ -1,6 +1,6 @@ package view -object InputView { +object InputView : InputViewInterface { private const val TEXT_INPUT_PROMPT = "게임에 참여할 사람의 이름을 입력하세요.(쉼표 기준으로 분리)" private const val TEXT_HIT_PROMPT_FORMAT = "%s는 한장의 카드를 더 받겠습니까?(예는 y, 아니오는 n)" @@ -13,7 +13,7 @@ object InputView { return inputData } - fun askForHit(playerName: String): String { + override fun askForHit(playerName: String): String { println(TEXT_HIT_PROMPT_FORMAT.format(playerName)) return readln() } diff --git a/src/main/kotlin/view/InputViewInterface.kt b/src/main/kotlin/view/InputViewInterface.kt new file mode 100644 index 0000000000..b3704a9875 --- /dev/null +++ b/src/main/kotlin/view/InputViewInterface.kt @@ -0,0 +1,5 @@ +package view + +interface InputViewInterface { + fun askForHit(playerName: String): String +} diff --git a/src/main/kotlin/view/OutputView.kt b/src/main/kotlin/view/OutputView.kt index 7e52fa5084..b52a7b8159 100644 --- a/src/main/kotlin/view/OutputView.kt +++ b/src/main/kotlin/view/OutputView.kt @@ -3,7 +3,7 @@ package view import player.Player import player.PlayerGroup -object OutputView { +object OutputView : OutputViewInterface { fun showGameStart(playerGroup: PlayerGroup) { val sb = StringBuilder() @@ -17,7 +17,7 @@ object OutputView { println() } - fun showPlayingCard(player: Player) { + override fun showPlayingCard(player: Player) { println("${player.name}카드: ${player.playerDeck}") } diff --git a/src/main/kotlin/view/OutputViewInterface.kt b/src/main/kotlin/view/OutputViewInterface.kt new file mode 100644 index 0000000000..d6d0713a82 --- /dev/null +++ b/src/main/kotlin/view/OutputViewInterface.kt @@ -0,0 +1,7 @@ +package view + +import player.Player + +interface OutputViewInterface { + fun showPlayingCard(player: Player) +} From ff53d9990283d6f723994681ea000b44137361a2 Mon Sep 17 00:00:00 2001 From: OYJ Date: Thu, 7 Dec 2023 02:12:55 +0900 Subject: [PATCH 54/54] =?UTF-8?q?BlackjackGame=20=EC=83=9D=EC=84=B1?= =?UTF-8?q?=EC=9E=90=EB=A1=9C=20ViewInterFace=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/BlackjackGame.kt | 8 ++++++-- 1 file changed, 6 insertions(+), 2 deletions(-) diff --git a/src/main/kotlin/BlackjackGame.kt b/src/main/kotlin/BlackjackGame.kt index 1061fb04ca..9d96d4de75 100644 --- a/src/main/kotlin/BlackjackGame.kt +++ b/src/main/kotlin/BlackjackGame.kt @@ -5,7 +5,12 @@ import player.Status import view.InputViewInterface import view.OutputViewInterface -class BlackjackGame(private val cardDeck: CardDeck, val playerGroup: PlayerGroup, private val inputView: InputViewInterface, private val outputView: OutputViewInterface) { +class BlackjackGame( + private val cardDeck: CardDeck, + val playerGroup: PlayerGroup, + private val inputView: InputViewInterface, + private val outputView: OutputViewInterface, +) { init { for (player in playerGroup.playerList) { @@ -51,6 +56,5 @@ class BlackjackGame(private val cardDeck: CardDeck, val playerGroup: PlayerGroup private const val TEXT_RETRY_INPUT = "Y 혹은 N만 입력 가능합니다." private const val TEXT_ANSWER_YES = "Y" private const val TEXT_ANSWER_NO = "N" - } }