From 1d2c9d23a98a3f8ce61b1bd10940d03893c13b35 Mon Sep 17 00:00:00 2001 From: "aeji.kim" Date: Sun, 25 Jun 2023 02:50:04 +0900 Subject: [PATCH 01/10] =?UTF-8?q?test:=20dsl=20=ED=95=99=EC=8A=B5=20?= =?UTF-8?q?=ED=85=8C=EC=8A=A4=ED=8A=B8?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- src/main/kotlin/.gitkeep | 0 src/main/kotlin/learning/Language.kt | 3 + src/main/kotlin/learning/LanguageBuilder.kt | 9 +++ src/main/kotlin/learning/Languages.kt | 3 + src/main/kotlin/learning/Person.kt | 3 + src/main/kotlin/learning/PersonBuilder.kt | 32 ++++++++ src/main/kotlin/learning/Skill.kt | 3 + src/main/kotlin/learning/SkillType.kt | 6 ++ src/main/kotlin/learning/Skills.kt | 3 + src/main/kotlin/learning/SkillsBuilder.kt | 13 ++++ src/test/kotlin/.gitkeep | 0 src/test/kotlin/learning/DslTest.kt | 86 +++++++++++++++++++++ 12 files changed, 161 insertions(+) delete mode 100644 src/main/kotlin/.gitkeep create mode 100644 src/main/kotlin/learning/Language.kt create mode 100644 src/main/kotlin/learning/LanguageBuilder.kt create mode 100644 src/main/kotlin/learning/Languages.kt create mode 100644 src/main/kotlin/learning/Person.kt create mode 100644 src/main/kotlin/learning/PersonBuilder.kt create mode 100644 src/main/kotlin/learning/Skill.kt create mode 100644 src/main/kotlin/learning/SkillType.kt create mode 100644 src/main/kotlin/learning/Skills.kt create mode 100644 src/main/kotlin/learning/SkillsBuilder.kt delete mode 100644 src/test/kotlin/.gitkeep create mode 100644 src/test/kotlin/learning/DslTest.kt diff --git a/src/main/kotlin/.gitkeep b/src/main/kotlin/.gitkeep deleted file mode 100644 index e69de29bb2..0000000000 diff --git a/src/main/kotlin/learning/Language.kt b/src/main/kotlin/learning/Language.kt new file mode 100644 index 0000000000..3bacd74366 --- /dev/null +++ b/src/main/kotlin/learning/Language.kt @@ -0,0 +1,3 @@ +package learning + +data class Language(val lang: String, val level: Int) diff --git a/src/main/kotlin/learning/LanguageBuilder.kt b/src/main/kotlin/learning/LanguageBuilder.kt new file mode 100644 index 0000000000..bdc90f7f68 --- /dev/null +++ b/src/main/kotlin/learning/LanguageBuilder.kt @@ -0,0 +1,9 @@ +package learning + +class LanguageBuilder { + val languages = mutableListOf() + + infix fun String.level(level: Int) { + languages.add(Language(this, level)) + } +} diff --git a/src/main/kotlin/learning/Languages.kt b/src/main/kotlin/learning/Languages.kt new file mode 100644 index 0000000000..996bde3611 --- /dev/null +++ b/src/main/kotlin/learning/Languages.kt @@ -0,0 +1,3 @@ +package learning + +class Languages(val languages: MutableList) diff --git a/src/main/kotlin/learning/Person.kt b/src/main/kotlin/learning/Person.kt new file mode 100644 index 0000000000..25e193029b --- /dev/null +++ b/src/main/kotlin/learning/Person.kt @@ -0,0 +1,3 @@ +package learning + +class Person(val name: String, val company: String?, val skills: Skills, val languages: Languages) diff --git a/src/main/kotlin/learning/PersonBuilder.kt b/src/main/kotlin/learning/PersonBuilder.kt new file mode 100644 index 0000000000..29041cd73d --- /dev/null +++ b/src/main/kotlin/learning/PersonBuilder.kt @@ -0,0 +1,32 @@ +package learning + +class PersonBuilder { + private lateinit var name: String + private var company: String? = null + private val skills = mutableListOf() + private val languages = mutableListOf() + + fun name(value: String) { + name = value + } + + fun company(value: String) { + company = value + } + + fun skills(block: SkillsBuilder.() -> Unit) { + val skillsBuilder = SkillsBuilder().apply(block) + skills.addAll(skillsBuilder.skills) + } + + fun languages(block: LanguageBuilder.() -> Unit) { + val languageBuilder = LanguageBuilder().apply(block) + languages.addAll(languageBuilder.languages) + } + + fun build(): Person { + val skills = Skills(skills) + val languages = Languages(languages) + return Person(name, company, skills, languages) + } +} diff --git a/src/main/kotlin/learning/Skill.kt b/src/main/kotlin/learning/Skill.kt new file mode 100644 index 0000000000..604ce48316 --- /dev/null +++ b/src/main/kotlin/learning/Skill.kt @@ -0,0 +1,3 @@ +package learning + +data class Skill(val type: SkillType, val value: String) diff --git a/src/main/kotlin/learning/SkillType.kt b/src/main/kotlin/learning/SkillType.kt new file mode 100644 index 0000000000..c247e91d03 --- /dev/null +++ b/src/main/kotlin/learning/SkillType.kt @@ -0,0 +1,6 @@ +package learning + +enum class SkillType(val type: String) { + SOFT("soft"), + HARD("hard"), +} diff --git a/src/main/kotlin/learning/Skills.kt b/src/main/kotlin/learning/Skills.kt new file mode 100644 index 0000000000..180d2b0a69 --- /dev/null +++ b/src/main/kotlin/learning/Skills.kt @@ -0,0 +1,3 @@ +package learning + +class Skills(val skills: MutableList) diff --git a/src/main/kotlin/learning/SkillsBuilder.kt b/src/main/kotlin/learning/SkillsBuilder.kt new file mode 100644 index 0000000000..ec780d3655 --- /dev/null +++ b/src/main/kotlin/learning/SkillsBuilder.kt @@ -0,0 +1,13 @@ +package learning + +class SkillsBuilder { + val skills = mutableListOf() + + fun soft(value: String) { + skills.add(Skill(SkillType.SOFT, value)) + } + + fun hard(value: String) { + skills.add(Skill(SkillType.HARD, value)) + } +} diff --git a/src/test/kotlin/.gitkeep b/src/test/kotlin/.gitkeep deleted file mode 100644 index e69de29bb2..0000000000 diff --git a/src/test/kotlin/learning/DslTest.kt b/src/test/kotlin/learning/DslTest.kt new file mode 100644 index 0000000000..e5e89ebf6c --- /dev/null +++ b/src/test/kotlin/learning/DslTest.kt @@ -0,0 +1,86 @@ +package learning + +import io.kotest.matchers.nulls.shouldBeNull +import io.kotest.matchers.shouldBe +import org.junit.jupiter.api.Test +import org.junit.jupiter.params.ParameterizedTest +import org.junit.jupiter.params.provider.ValueSource + +/*** + * introduce { + * name("홍길동") + * company("활빈당") + * skills { + * soft("A passion for problem solving") + * soft("Good communication skills") + * hard("Kotlin") + * } + * languages { + * "Korean" level 5 + * "English" level 3 + * } + * } + * + */ +class DslTest { + @ValueSource(strings = ["홍길동", "edge"]) + @ParameterizedTest + fun introduce(value: String) { + val person: Person = introduce { + name(value) + } + person.name shouldBe value + person.company.shouldBeNull() + } + + @Test + fun company() { + val person = introduce { + name("홍길동") + company("활빈당") + } + person.name shouldBe "홍길동" + person.company shouldBe "활빈당" + } + + @Test + fun skills() { + val person: Person = introduce { + name("홍길동") + company("활빈당") + skills { + soft("A passion for problem solving") + soft("Good communication skills") + hard("Kotlin") + } + languages { + "Korean" level 5 + "English" level 3 + } + } + + person.languages.languages[0] shouldBe Language("Korean", 5) + person.languages.languages[1] shouldBe Language("English", 3) + } + + @Test + fun languages() { + val person: Person = introduce { + name("홍길동") + company("활빈당") + skills { + soft("A passion for problem solving") + soft("Good communication skills") + hard("Kotlin") + } + } + + person.skills.skills[0] shouldBe Skill(SkillType.SOFT, "A passion for problem solving") + person.skills.skills[1] shouldBe Skill(SkillType.SOFT, "Good communication skills") + person.skills.skills[2] shouldBe Skill(SkillType.HARD, "Kotlin") + } +} + +fun introduce(block: PersonBuilder.() -> Unit): Person { + return PersonBuilder().apply(block).build() +} From 56d95875ff4fd7b27a86503617071137ad2a8473 Mon Sep 17 00:00:00 2001 From: rladowl92 Date: Wed, 12 Jul 2023 10:39:28 +0900 Subject: [PATCH 02/10] =?UTF-8?q?refactor(dsl):=20builder=20=EC=B6=94?= =?UTF-8?q?=EA=B0=80,=20shouldBeIn=EC=9C=BC=EB=A1=9C=20=EB=B9=84=EA=B5=90?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- src/main/kotlin/learning/LanguageBuilder.kt | 6 +++++- src/main/kotlin/learning/PersonBuilder.kt | 10 ++++------ src/main/kotlin/learning/SkillsBuilder.kt | 6 +++++- src/test/kotlin/learning/DslTest.kt | 19 ++++++++++--------- 4 files changed, 24 insertions(+), 17 deletions(-) diff --git a/src/main/kotlin/learning/LanguageBuilder.kt b/src/main/kotlin/learning/LanguageBuilder.kt index bdc90f7f68..08d848b653 100644 --- a/src/main/kotlin/learning/LanguageBuilder.kt +++ b/src/main/kotlin/learning/LanguageBuilder.kt @@ -1,9 +1,13 @@ package learning class LanguageBuilder { - val languages = mutableListOf() + private val languages = mutableListOf() infix fun String.level(level: Int) { languages.add(Language(this, level)) } + + fun build(): MutableList { + return languages + } } diff --git a/src/main/kotlin/learning/PersonBuilder.kt b/src/main/kotlin/learning/PersonBuilder.kt index 29041cd73d..6ce9e7acce 100644 --- a/src/main/kotlin/learning/PersonBuilder.kt +++ b/src/main/kotlin/learning/PersonBuilder.kt @@ -3,8 +3,8 @@ package learning class PersonBuilder { private lateinit var name: String private var company: String? = null - private val skills = mutableListOf() - private val languages = mutableListOf() + private var skills = mutableListOf() + private var languages = mutableListOf() fun name(value: String) { name = value @@ -15,13 +15,11 @@ class PersonBuilder { } fun skills(block: SkillsBuilder.() -> Unit) { - val skillsBuilder = SkillsBuilder().apply(block) - skills.addAll(skillsBuilder.skills) + this.skills = SkillsBuilder().apply(block).build() } fun languages(block: LanguageBuilder.() -> Unit) { - val languageBuilder = LanguageBuilder().apply(block) - languages.addAll(languageBuilder.languages) + this.languages = LanguageBuilder().apply(block).build() } fun build(): Person { diff --git a/src/main/kotlin/learning/SkillsBuilder.kt b/src/main/kotlin/learning/SkillsBuilder.kt index ec780d3655..67e5e58bf1 100644 --- a/src/main/kotlin/learning/SkillsBuilder.kt +++ b/src/main/kotlin/learning/SkillsBuilder.kt @@ -1,7 +1,7 @@ package learning class SkillsBuilder { - val skills = mutableListOf() + private val skills = mutableListOf() fun soft(value: String) { skills.add(Skill(SkillType.SOFT, value)) @@ -10,4 +10,8 @@ class SkillsBuilder { fun hard(value: String) { skills.add(Skill(SkillType.HARD, value)) } + + fun build(): MutableList { + return skills + } } diff --git a/src/test/kotlin/learning/DslTest.kt b/src/test/kotlin/learning/DslTest.kt index e5e89ebf6c..751900abfc 100644 --- a/src/test/kotlin/learning/DslTest.kt +++ b/src/test/kotlin/learning/DslTest.kt @@ -1,5 +1,6 @@ package learning +import io.kotest.matchers.collections.shouldBeIn import io.kotest.matchers.nulls.shouldBeNull import io.kotest.matchers.shouldBe import org.junit.jupiter.api.Test @@ -53,14 +54,11 @@ class DslTest { soft("Good communication skills") hard("Kotlin") } - languages { - "Korean" level 5 - "English" level 3 - } } - person.languages.languages[0] shouldBe Language("Korean", 5) - person.languages.languages[1] shouldBe Language("English", 3) + Skill(SkillType.SOFT, "A passion for problem solving").shouldBeIn(person.skills.skills) + Skill(SkillType.SOFT, "Good communication skills").shouldBeIn(person.skills.skills) + Skill(SkillType.HARD, "Kotlin").shouldBeIn(person.skills.skills) } @Test @@ -73,11 +71,14 @@ class DslTest { soft("Good communication skills") hard("Kotlin") } + languages { + "Korean" level 5 + "English" level 3 + } } - person.skills.skills[0] shouldBe Skill(SkillType.SOFT, "A passion for problem solving") - person.skills.skills[1] shouldBe Skill(SkillType.SOFT, "Good communication skills") - person.skills.skills[2] shouldBe Skill(SkillType.HARD, "Kotlin") + Language("Korean", 5).shouldBeIn(person.languages.languages) + Language("English", 3).shouldBeIn(person.languages.languages) } } From 5eb257af0d4bd0be6c86c51c4de87e335f0537ea Mon Sep 17 00:00:00 2001 From: rladowl92 Date: Fri, 21 Jul 2023 16:13:59 +0900 Subject: [PATCH 03/10] =?UTF-8?q?docs(blackjack):=20=EA=B8=B0=EB=8A=A5=20?= =?UTF-8?q?=EC=9A=94=EA=B5=AC=EC=82=AC=ED=95=AD=20=EB=B0=8F=20=EA=B8=B0?= =?UTF-8?q?=EB=8A=A5=EB=AA=A9=EB=A1=9D=20=EC=9E=91=EC=84=B1?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- README.md | 38 +++++++++++++++++++++++++++++++++++++- 1 file changed, 37 insertions(+), 1 deletion(-) diff --git a/README.md b/README.md index e1c7c927d8..a7c8ae6d37 100644 --- a/README.md +++ b/README.md @@ -1 +1,37 @@ -# kotlin-blackjack \ No newline at end of file +# kotlin-blackjack +### 기능 요구사항 +- 블랙잭 게임을 변형한 프로그램을 구현한다. 블랙잭 게임은 딜러와 플레이어 중 카드의 합이 21 또는 21에 가장 가까운 숫자를 가지는 쪽이 이기는 게임이다. + +- 카드의 숫자 계산은 카드 숫자를 기본으로 하며, 예외로 Ace는 1 또는 11로 계산할 수 있으며, King, Queen, Jack은 각각 10으로 계산한다. +- 게임을 시작하면 플레이어는 두 장의 카드를 지급 받으며, 두 장의 카드 숫자를 합쳐 21을 초과하지 않으면서 21에 가깝게 만들면 이긴다. 21을 넘지 않을 경우 원한다면 얼마든지 카드를 계속 뽑을 수 있다. + +### 실행 결과 +``` +게임에 참여할 사람의 이름을 입력하세요.(쉼표 기준으로 분리) +pobi,jason + +pobi, jason에게 2장의 카드를 나누었습니다. +pobi카드: 2하트, 8스페이드 +jason카드: 7클로버, K스페이드 + +pobi는 한장의 카드를 더 받겠습니까?(예는 y, 아니오는 n) +y +pobi카드: 2하트, 8스페이드, A클로버 +pobi는 한장의 카드를 더 받겠습니까?(예는 y, 아니오는 n) +n +jason은 한장의 카드를 더 받겠습니까?(예는 y, 아니오는 n) +n +jason카드: 7클로버, K스페이드 + +pobi카드: 2하트, 8스페이드, A클로버 - 결과: 21 +jason카드: 7클로버, K스페이드 - 결과: 17 +``` + +### 기능목록 +- card + - shape, number +- player + - name, card list, score +- players + - player list +- 입출력 \ No newline at end of file From a990c24c874c68e0665db6c69e682161530cc289 Mon Sep 17 00:00:00 2001 From: rladowl92 Date: Fri, 21 Jul 2023 16:49:51 +0900 Subject: [PATCH 04/10] =?UTF-8?q?feat(blackjack):=20card=20=EA=B4=80?= =?UTF-8?q?=EB=A0=A8=20=EB=8F=84=EB=A9=94=EC=9D=B8=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 +- build.gradle.kts | 2 +- src/main/kotlin/blackjack/domain/Card.kt | 3 +++ src/main/kotlin/blackjack/domain/CardNumber.kt | 16 ++++++++++++++++ src/main/kotlin/blackjack/domain/CardShape.kt | 8 ++++++++ src/test/kotlin/blackjack/domain/CardTest.kt | 10 ++++++++++ 6 files changed, 39 insertions(+), 2 deletions(-) create mode 100644 src/main/kotlin/blackjack/domain/Card.kt create mode 100644 src/main/kotlin/blackjack/domain/CardNumber.kt create mode 100644 src/main/kotlin/blackjack/domain/CardShape.kt create mode 100644 src/test/kotlin/blackjack/domain/CardTest.kt diff --git a/README.md b/README.md index a7c8ae6d37..22656f32ec 100644 --- a/README.md +++ b/README.md @@ -29,7 +29,7 @@ jason카드: 7클로버, K스페이드 - 결과: 17 ### 기능목록 - card - - shape, number + - card shape, card number - player - name, card list, score - players diff --git a/build.gradle.kts b/build.gradle.kts index e78e729567..43c17967be 100644 --- a/build.gradle.kts +++ b/build.gradle.kts @@ -13,7 +13,7 @@ repositories { dependencies { testImplementation("org.junit.jupiter", "junit-jupiter", "5.8.2") testImplementation("org.assertj", "assertj-core", "3.22.0") - testImplementation("io.kotest", "kotest-runner-junit5", "5.2.3") + testImplementation("io.kotest", "kotest-runner-junit5", "5.5.0") } tasks { diff --git a/src/main/kotlin/blackjack/domain/Card.kt b/src/main/kotlin/blackjack/domain/Card.kt new file mode 100644 index 0000000000..1a7aaad0fb --- /dev/null +++ b/src/main/kotlin/blackjack/domain/Card.kt @@ -0,0 +1,3 @@ +package blackjack.domain + +data class Card(val shape: CardShape, val number: CardNumber) diff --git a/src/main/kotlin/blackjack/domain/CardNumber.kt b/src/main/kotlin/blackjack/domain/CardNumber.kt new file mode 100644 index 0000000000..33f773a2ef --- /dev/null +++ b/src/main/kotlin/blackjack/domain/CardNumber.kt @@ -0,0 +1,16 @@ +package blackjack.domain + +enum class CardNumber(number: Number, named: String = "number") { + ACE(1, "ace"), + TWO(2), + TREE(3), + FOUR(4), + FIVE(5), + SIX(6), + SEVEN(7), + EIGHT(8), + NINE(9), + JACK(10, "jack"), + QUEEN(10, "queen"), + KING(10, "king"), +} diff --git a/src/main/kotlin/blackjack/domain/CardShape.kt b/src/main/kotlin/blackjack/domain/CardShape.kt new file mode 100644 index 0000000000..ffbe2b0cdd --- /dev/null +++ b/src/main/kotlin/blackjack/domain/CardShape.kt @@ -0,0 +1,8 @@ +package blackjack.domain + +enum class CardShape(shape: String) { + SPADE("스페이드"), + DIAMOND("다이아"), + HEART("하트"), + CLOVA("클로버") +} diff --git a/src/test/kotlin/blackjack/domain/CardTest.kt b/src/test/kotlin/blackjack/domain/CardTest.kt new file mode 100644 index 0000000000..188b919176 --- /dev/null +++ b/src/test/kotlin/blackjack/domain/CardTest.kt @@ -0,0 +1,10 @@ +package blackjack.domain + +import io.kotest.core.spec.style.StringSpec +import io.kotest.matchers.shouldBe + +class CardTest : StringSpec({ + "Card 생성 성공" { + Card(CardShape.CLOVA, CardNumber.JACK) shouldBe Card(CardShape.CLOVA, CardNumber.JACK) + } +}) From ecfb3994b9c64e8070833338217938f7ff128ef5 Mon Sep 17 00:00:00 2001 From: rladowl92 Date: Wed, 26 Jul 2023 15:16:26 +0900 Subject: [PATCH 05/10] =?UTF-8?q?feat(blackjack):=20player=20=EA=B4=80?= =?UTF-8?q?=EB=A0=A8=20=EB=8F=84=EB=A9=94=EC=9D=B8=20=EC=B6=94=EA=B0=80?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../kotlin/blackjack/domain/CardNumber.kt | 2 +- src/main/kotlin/blackjack/domain/Player.kt | 13 +++++++ src/main/kotlin/blackjack/domain/Players.kt | 29 +++++++++++++++ .../kotlin/blackjack/domain/PlayerTest.kt | 35 +++++++++++++++++++ .../kotlin/blackjack/domain/PlayersTest.kt | 18 ++++++++++ 5 files changed, 96 insertions(+), 1 deletion(-) create mode 100644 src/main/kotlin/blackjack/domain/Player.kt create mode 100644 src/main/kotlin/blackjack/domain/Players.kt create mode 100644 src/test/kotlin/blackjack/domain/PlayerTest.kt create mode 100644 src/test/kotlin/blackjack/domain/PlayersTest.kt diff --git a/src/main/kotlin/blackjack/domain/CardNumber.kt b/src/main/kotlin/blackjack/domain/CardNumber.kt index 33f773a2ef..a20c6efbed 100644 --- a/src/main/kotlin/blackjack/domain/CardNumber.kt +++ b/src/main/kotlin/blackjack/domain/CardNumber.kt @@ -1,6 +1,6 @@ package blackjack.domain -enum class CardNumber(number: Number, named: String = "number") { +enum class CardNumber(val value: Number, val named: String = "number") { ACE(1, "ace"), TWO(2), TREE(3), diff --git a/src/main/kotlin/blackjack/domain/Player.kt b/src/main/kotlin/blackjack/domain/Player.kt new file mode 100644 index 0000000000..99e1f6ed88 --- /dev/null +++ b/src/main/kotlin/blackjack/domain/Player.kt @@ -0,0 +1,13 @@ +package blackjack.domain + +class Player(val name: String, initCards: List) { + val cards: MutableList = initCards.toMutableList() + + fun addCard(card: Card) { + cards.add(card) + } + + fun cardSum(): Number { + return cards.sumOf { it.number.value.toInt() } + } +} diff --git a/src/main/kotlin/blackjack/domain/Players.kt b/src/main/kotlin/blackjack/domain/Players.kt new file mode 100644 index 0000000000..228e4c65a1 --- /dev/null +++ b/src/main/kotlin/blackjack/domain/Players.kt @@ -0,0 +1,29 @@ +package blackjack.domain + +class Players(names: List) { + private val cards = mutableListOf() + private val players = names.map { Player(it, arrayListOf(randomCard(), randomCard())) } + + init { + require(names.size == setOf(names).size) + } + + fun getPlayer(name: String): Player { + return players.find { it.name == name } ?: throw IllegalArgumentException("no such player") + } + + private fun randomCard(): Card { + val cardShape = CardShape.values().toList().shuffled()[0] + val cardNumber = CardNumber.values().toList().shuffled()[0] + val card = Card(cardShape, cardNumber) + if (hasCard(card)) { + return randomCard() + } + cards.add(card) + return card + } + + private fun hasCard(card: Card): Boolean { + return cards.contains(card) + } +} diff --git a/src/test/kotlin/blackjack/domain/PlayerTest.kt b/src/test/kotlin/blackjack/domain/PlayerTest.kt new file mode 100644 index 0000000000..f8cd482a94 --- /dev/null +++ b/src/test/kotlin/blackjack/domain/PlayerTest.kt @@ -0,0 +1,35 @@ +package blackjack.domain + +import io.kotest.core.spec.style.StringSpec +import io.kotest.matchers.shouldBe + +class PlayerTest : StringSpec({ + val initCards = listOf(Card(CardShape.CLOVA, CardNumber.JACK), Card(CardShape.HEART, CardNumber.JACK)) + var edge = Player("edge", initCards) + + beforeEach { + edge = Player("edge", initCards) + } + + "player 생성 성공" { + edge.name shouldBe "edge" + } + + "player 카드 확인하기" { + edge.cards shouldBe initCards + } + + "player 카드 합산하기" { + edge.cardSum() shouldBe 20 + } + + "player에 카드 추가하기" { + val addCard = Card(CardShape.DIAMOND, CardNumber.JACK) + edge.addCard(addCard) + + edge.cardSum() shouldBe 30 + val list = mutableListOf(addCard) + list.addAll(initCards) + edge.cards shouldBe list + } +}) diff --git a/src/test/kotlin/blackjack/domain/PlayersTest.kt b/src/test/kotlin/blackjack/domain/PlayersTest.kt new file mode 100644 index 0000000000..e9c2c593c3 --- /dev/null +++ b/src/test/kotlin/blackjack/domain/PlayersTest.kt @@ -0,0 +1,18 @@ +package blackjack.domain + +import io.kotest.assertions.throwables.shouldThrow +import io.kotest.core.spec.style.StringSpec +import io.kotest.matchers.shouldBe + +class PlayersTest : StringSpec({ + "players 생성 성공" { + val players = Players(listOf("edge", "test")) + players.getPlayer("edge").name shouldBe "edge" + } + + "player 이름이 중복되면 에러" { + shouldThrow { + Players(listOf("edge", "edge")) + } + } +}) From 1e880ec7dfc4a3b0515799aa6fe3b96637811d23 Mon Sep 17 00:00:00 2001 From: rladowl92 Date: Wed, 26 Jul 2023 17:47:40 +0900 Subject: [PATCH 06/10] =?UTF-8?q?feat(blackjack):=20view=20=EB=B0=8F=20app?= =?UTF-8?q?lication=20=EC=B6=94=EA=B0=80?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- README.md | 3 +- .../kotlin/blackjack/BlackjackApplication.kt | 28 +++++++++++++++++++ src/main/kotlin/blackjack/domain/CardShape.kt | 2 +- src/main/kotlin/blackjack/domain/Players.kt | 9 ++++-- .../kotlin/blackjack/view/InputConsoleView.kt | 15 ++++++++++ .../blackjack/view/OutputConsoleView.kt | 28 +++++++++++++++++++ .../kotlin/blackjack/domain/PlayerTest.kt | 4 +-- 7 files changed, 83 insertions(+), 6 deletions(-) create mode 100644 src/main/kotlin/blackjack/BlackjackApplication.kt create mode 100644 src/main/kotlin/blackjack/view/InputConsoleView.kt create mode 100644 src/main/kotlin/blackjack/view/OutputConsoleView.kt diff --git a/README.md b/README.md index 22656f32ec..e340798cac 100644 --- a/README.md +++ b/README.md @@ -31,7 +31,8 @@ jason카드: 7클로버, K스페이드 - 결과: 17 - card - card shape, card number - player - - name, card list, score + - name, card list + - cardSum() - players - player list - 입출력 \ No newline at end of file diff --git a/src/main/kotlin/blackjack/BlackjackApplication.kt b/src/main/kotlin/blackjack/BlackjackApplication.kt new file mode 100644 index 0000000000..12bd11a9af --- /dev/null +++ b/src/main/kotlin/blackjack/BlackjackApplication.kt @@ -0,0 +1,28 @@ +package blackjack + +import blackjack.domain.Players +import blackjack.view.InputConsoleView +import blackjack.view.OutputConsoleView + +object BlackjackApplication { + private val inputConsoleView = InputConsoleView() + private val outputConsoleView = OutputConsoleView() + + @JvmStatic + fun main(args: Array) { + val namesOfPlayers = inputConsoleView.namesOfPlayers() + val players = Players(namesOfPlayers) + + outputConsoleView.printInitCardMsg(players) + players.players.map { player -> + while (inputConsoleView.wannaGetNextCard(player)) { + players.getCard(player.name) + outputConsoleView.printCards(player) + } + } + + outputConsoleView.printResult(players) +// val winners = racingCarService.play(namesOfCars, numberOfAttempts) +// outputConsoleView.printWinners(winners) + } +} diff --git a/src/main/kotlin/blackjack/domain/CardShape.kt b/src/main/kotlin/blackjack/domain/CardShape.kt index ffbe2b0cdd..181f01a1bf 100644 --- a/src/main/kotlin/blackjack/domain/CardShape.kt +++ b/src/main/kotlin/blackjack/domain/CardShape.kt @@ -1,6 +1,6 @@ package blackjack.domain -enum class CardShape(shape: String) { +enum class CardShape(val value: String) { SPADE("스페이드"), DIAMOND("다이아"), HEART("하트"), diff --git a/src/main/kotlin/blackjack/domain/Players.kt b/src/main/kotlin/blackjack/domain/Players.kt index 228e4c65a1..91ba305b6e 100644 --- a/src/main/kotlin/blackjack/domain/Players.kt +++ b/src/main/kotlin/blackjack/domain/Players.kt @@ -2,16 +2,21 @@ package blackjack.domain class Players(names: List) { private val cards = mutableListOf() - private val players = names.map { Player(it, arrayListOf(randomCard(), randomCard())) } + val players = names.map { Player(it, arrayListOf(randomCard(), randomCard())) } init { - require(names.size == setOf(names).size) + require(names.size == names.toSet().size) } fun getPlayer(name: String): Player { return players.find { it.name == name } ?: throw IllegalArgumentException("no such player") } + fun getCard(name: String) { + val player = players.find { it.name == name } ?: throw IllegalArgumentException("no such player") + player.addCard(randomCard()) + } + private fun randomCard(): Card { val cardShape = CardShape.values().toList().shuffled()[0] val cardNumber = CardNumber.values().toList().shuffled()[0] diff --git a/src/main/kotlin/blackjack/view/InputConsoleView.kt b/src/main/kotlin/blackjack/view/InputConsoleView.kt new file mode 100644 index 0000000000..2b55767c2c --- /dev/null +++ b/src/main/kotlin/blackjack/view/InputConsoleView.kt @@ -0,0 +1,15 @@ +package blackjack.view + +import blackjack.domain.Player + +class InputConsoleView { + fun namesOfPlayers(): List { + println("게임에 참여할 사람의 이름을 입력하세요.(쉼표 기준으로 분리)") + return readln().split(",") + } + + fun wannaGetNextCard(player: Player): Boolean { + println("${player.name}는 한장의 카드를 더 받겠습니까?(예는 y, 아니오는 n)") + return readln() == "y" + } +} diff --git a/src/main/kotlin/blackjack/view/OutputConsoleView.kt b/src/main/kotlin/blackjack/view/OutputConsoleView.kt new file mode 100644 index 0000000000..b632b0ac23 --- /dev/null +++ b/src/main/kotlin/blackjack/view/OutputConsoleView.kt @@ -0,0 +1,28 @@ +package blackjack.view + +import blackjack.domain.Card +import blackjack.domain.Player +import blackjack.domain.Players + +class OutputConsoleView { + fun printInitCardMsg(players: Players) { + println("${players.players.map { it.name }.joinToString(",")} 에게 2장의 카드를 나누었습니다.") + players.players.map { printCards(it) } + } + + fun printResult(players: Players) { + players.players.map { println("${cardsToString(it)} - 결과: ${it.cardSum()}") } + } + + fun printCards(player: Player) { + println(cardsToString(player)) + } + + private fun cardsToString(player: Player): String { + return "${player.name}카드: ${player.cards.joinToString(", ") { cardToString(it) }}" + } + + private fun cardToString(card: Card): String { + return "${card.number.value}${card.shape.value}" + } +} diff --git a/src/test/kotlin/blackjack/domain/PlayerTest.kt b/src/test/kotlin/blackjack/domain/PlayerTest.kt index f8cd482a94..85ebbb0024 100644 --- a/src/test/kotlin/blackjack/domain/PlayerTest.kt +++ b/src/test/kotlin/blackjack/domain/PlayerTest.kt @@ -28,8 +28,8 @@ class PlayerTest : StringSpec({ edge.addCard(addCard) edge.cardSum() shouldBe 30 - val list = mutableListOf(addCard) - list.addAll(initCards) + val list = initCards.toMutableList() + list.add(addCard) edge.cards shouldBe list } }) From 056d3795309ce53150b7f45726cabe56c39c7068 Mon Sep 17 00:00:00 2001 From: rladowl92 Date: Wed, 26 Jul 2023 17:49:41 +0900 Subject: [PATCH 07/10] =?UTF-8?q?feat(blackjack):=20view=20=EB=B0=8F=20app?= =?UTF-8?q?lication=20=EC=B6=94=EA=B0=80?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- src/main/kotlin/blackjack/BlackjackApplication.kt | 2 -- 1 file changed, 2 deletions(-) diff --git a/src/main/kotlin/blackjack/BlackjackApplication.kt b/src/main/kotlin/blackjack/BlackjackApplication.kt index 12bd11a9af..5dc1890ed1 100644 --- a/src/main/kotlin/blackjack/BlackjackApplication.kt +++ b/src/main/kotlin/blackjack/BlackjackApplication.kt @@ -22,7 +22,5 @@ object BlackjackApplication { } outputConsoleView.printResult(players) -// val winners = racingCarService.play(namesOfCars, numberOfAttempts) -// outputConsoleView.printWinners(winners) } } From 1c596bb6dc24b7f8dec1ced78e15dd80d3fdef91 Mon Sep 17 00:00:00 2001 From: rladowl92 Date: Wed, 26 Jul 2023 18:14:04 +0900 Subject: [PATCH 08/10] =?UTF-8?q?feat(blackjack):=20ace=EB=8A=94=201=20?= =?UTF-8?q?=EB=98=90=EB=8A=94=2011=EB=A1=9C=20=EA=B3=84=EC=82=B0?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../kotlin/blackjack/BlackjackApplication.kt | 4 ++-- .../kotlin/blackjack/domain/CardNumber.kt | 2 +- src/main/kotlin/blackjack/domain/Player.kt | 8 ++++++-- src/main/kotlin/blackjack/domain/Players.kt | 3 +-- .../blackjack/view/OutputConsoleView.kt | 2 ++ .../kotlin/blackjack/domain/PlayerTest.kt | 19 ++++++++++++++++--- 6 files changed, 28 insertions(+), 10 deletions(-) diff --git a/src/main/kotlin/blackjack/BlackjackApplication.kt b/src/main/kotlin/blackjack/BlackjackApplication.kt index 5dc1890ed1..6abae48a09 100644 --- a/src/main/kotlin/blackjack/BlackjackApplication.kt +++ b/src/main/kotlin/blackjack/BlackjackApplication.kt @@ -15,8 +15,8 @@ object BlackjackApplication { outputConsoleView.printInitCardMsg(players) players.players.map { player -> - while (inputConsoleView.wannaGetNextCard(player)) { - players.getCard(player.name) + while (player.cardSum() < 21 && inputConsoleView.wannaGetNextCard(player)) { + players.getCard(player) outputConsoleView.printCards(player) } } diff --git a/src/main/kotlin/blackjack/domain/CardNumber.kt b/src/main/kotlin/blackjack/domain/CardNumber.kt index a20c6efbed..a3a11f7965 100644 --- a/src/main/kotlin/blackjack/domain/CardNumber.kt +++ b/src/main/kotlin/blackjack/domain/CardNumber.kt @@ -3,7 +3,7 @@ package blackjack.domain enum class CardNumber(val value: Number, val named: String = "number") { ACE(1, "ace"), TWO(2), - TREE(3), + THREE(3), FOUR(4), FIVE(5), SIX(6), diff --git a/src/main/kotlin/blackjack/domain/Player.kt b/src/main/kotlin/blackjack/domain/Player.kt index 99e1f6ed88..be7800fc2f 100644 --- a/src/main/kotlin/blackjack/domain/Player.kt +++ b/src/main/kotlin/blackjack/domain/Player.kt @@ -7,7 +7,11 @@ class Player(val name: String, initCards: List) { cards.add(card) } - fun cardSum(): Number { - return cards.sumOf { it.number.value.toInt() } + fun cardSum(): Int { + val sum = cards.sumOf { it.number.value.toInt() } + if (cards.map { it.number }.contains(CardNumber.ACE) && sum < 11) { + return sum + 10 + } + return sum } } diff --git a/src/main/kotlin/blackjack/domain/Players.kt b/src/main/kotlin/blackjack/domain/Players.kt index 91ba305b6e..201f50fd8a 100644 --- a/src/main/kotlin/blackjack/domain/Players.kt +++ b/src/main/kotlin/blackjack/domain/Players.kt @@ -12,8 +12,7 @@ class Players(names: List) { return players.find { it.name == name } ?: throw IllegalArgumentException("no such player") } - fun getCard(name: String) { - val player = players.find { it.name == name } ?: throw IllegalArgumentException("no such player") + fun getCard(player: Player) { player.addCard(randomCard()) } diff --git a/src/main/kotlin/blackjack/view/OutputConsoleView.kt b/src/main/kotlin/blackjack/view/OutputConsoleView.kt index b632b0ac23..338e5fafeb 100644 --- a/src/main/kotlin/blackjack/view/OutputConsoleView.kt +++ b/src/main/kotlin/blackjack/view/OutputConsoleView.kt @@ -8,9 +8,11 @@ class OutputConsoleView { fun printInitCardMsg(players: Players) { println("${players.players.map { it.name }.joinToString(",")} 에게 2장의 카드를 나누었습니다.") players.players.map { printCards(it) } + println() } fun printResult(players: Players) { + println() players.players.map { println("${cardsToString(it)} - 결과: ${it.cardSum()}") } } diff --git a/src/test/kotlin/blackjack/domain/PlayerTest.kt b/src/test/kotlin/blackjack/domain/PlayerTest.kt index 85ebbb0024..4508a13112 100644 --- a/src/test/kotlin/blackjack/domain/PlayerTest.kt +++ b/src/test/kotlin/blackjack/domain/PlayerTest.kt @@ -4,7 +4,7 @@ import io.kotest.core.spec.style.StringSpec import io.kotest.matchers.shouldBe class PlayerTest : StringSpec({ - val initCards = listOf(Card(CardShape.CLOVA, CardNumber.JACK), Card(CardShape.HEART, CardNumber.JACK)) + val initCards = listOf(Card(CardShape.CLOVA, CardNumber.TWO), Card(CardShape.HEART, CardNumber.THREE)) var edge = Player("edge", initCards) beforeEach { @@ -20,16 +20,29 @@ class PlayerTest : StringSpec({ } "player 카드 합산하기" { - edge.cardSum() shouldBe 20 + edge.cardSum() shouldBe 5 } "player에 카드 추가하기" { val addCard = Card(CardShape.DIAMOND, CardNumber.JACK) edge.addCard(addCard) - edge.cardSum() shouldBe 30 + edge.cardSum() shouldBe 15 val list = initCards.toMutableList() list.add(addCard) edge.cards shouldBe list } + + "합이 11보다 작으면 ace를 11로 계산하기" { + edge.addCard(Card(CardShape.DIAMOND, CardNumber.ACE)) + + edge.cardSum() shouldBe 16 + } + + "합이 11보다 크면 ace를 1로 계산하기" { + edge.addCard(Card(CardShape.DIAMOND, CardNumber.ACE)) + edge.addCard(Card(CardShape.DIAMOND, CardNumber.JACK)) + + edge.cardSum() shouldBe 16 + } }) From e32214abcfb531a5c40d3a0194339c96b2e71fd7 Mon Sep 17 00:00:00 2001 From: rladowl92 Date: Wed, 26 Jul 2023 18:20:02 +0900 Subject: [PATCH 09/10] =?UTF-8?q?refactor(blackjack):=20=EC=B9=B4=EB=93=9C?= =?UTF-8?q?=20=EB=84=98=EB=B2=84=20=ED=91=9C=EC=8B=9C=20=ED=98=95=EC=8B=9D?= =?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 --- .../kotlin/blackjack/domain/CardNumber.kt | 26 +++++++++---------- src/main/kotlin/blackjack/domain/CardShape.kt | 4 +-- .../blackjack/view/OutputConsoleView.kt | 2 +- 3 files changed, 16 insertions(+), 16 deletions(-) diff --git a/src/main/kotlin/blackjack/domain/CardNumber.kt b/src/main/kotlin/blackjack/domain/CardNumber.kt index a3a11f7965..fc4e4d2a78 100644 --- a/src/main/kotlin/blackjack/domain/CardNumber.kt +++ b/src/main/kotlin/blackjack/domain/CardNumber.kt @@ -1,16 +1,16 @@ package blackjack.domain -enum class CardNumber(val value: Number, val named: String = "number") { - ACE(1, "ace"), - TWO(2), - THREE(3), - FOUR(4), - FIVE(5), - SIX(6), - SEVEN(7), - EIGHT(8), - NINE(9), - JACK(10, "jack"), - QUEEN(10, "queen"), - KING(10, "king"), +enum class CardNumber(val value: Number, val display: String) { + ACE(1, "A"), + TWO(2, "2"), + THREE(3, "3"), + FOUR(4, "4"), + FIVE(5, "5"), + SIX(6, "6"), + SEVEN(7, "7"), + EIGHT(8, "8"), + NINE(9, "9"), + JACK(10, "J"), + QUEEN(10, "Q"), + KING(10, "K"), } diff --git a/src/main/kotlin/blackjack/domain/CardShape.kt b/src/main/kotlin/blackjack/domain/CardShape.kt index 181f01a1bf..1ddaa709ef 100644 --- a/src/main/kotlin/blackjack/domain/CardShape.kt +++ b/src/main/kotlin/blackjack/domain/CardShape.kt @@ -1,8 +1,8 @@ package blackjack.domain -enum class CardShape(val value: String) { +enum class CardShape(val display: String) { SPADE("스페이드"), DIAMOND("다이아"), HEART("하트"), - CLOVA("클로버") + CLOVA("클로버"), } diff --git a/src/main/kotlin/blackjack/view/OutputConsoleView.kt b/src/main/kotlin/blackjack/view/OutputConsoleView.kt index 338e5fafeb..c1496f2904 100644 --- a/src/main/kotlin/blackjack/view/OutputConsoleView.kt +++ b/src/main/kotlin/blackjack/view/OutputConsoleView.kt @@ -25,6 +25,6 @@ class OutputConsoleView { } private fun cardToString(card: Card): String { - return "${card.number.value}${card.shape.value}" + return "${card.number.display}${card.shape.display}" } } From 9c284877a5838b299a4253962c890f8bcff6fd18 Mon Sep 17 00:00:00 2001 From: rladowl92 Date: Wed, 26 Jul 2023 18:25:14 +0900 Subject: [PATCH 10/10] =?UTF-8?q?fix(blackjack):=20=ED=95=A9=EC=9D=B4=2011?= =?UTF-8?q?=EA=B3=BC=20"=EA=B0=99=EC=9D=80"=20=EA=B2=BD=EC=9A=B0=EC=97=90?= =?UTF-8?q?=EB=8F=84=20ace=EB=A5=BC=2011=EB=A1=9C=20=EC=B7=A8=EA=B8=89?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- src/main/kotlin/blackjack/domain/Player.kt | 2 +- src/test/kotlin/blackjack/domain/PlayerTest.kt | 2 +- 2 files changed, 2 insertions(+), 2 deletions(-) diff --git a/src/main/kotlin/blackjack/domain/Player.kt b/src/main/kotlin/blackjack/domain/Player.kt index be7800fc2f..0fcc4d1feb 100644 --- a/src/main/kotlin/blackjack/domain/Player.kt +++ b/src/main/kotlin/blackjack/domain/Player.kt @@ -9,7 +9,7 @@ class Player(val name: String, initCards: List) { fun cardSum(): Int { val sum = cards.sumOf { it.number.value.toInt() } - if (cards.map { it.number }.contains(CardNumber.ACE) && sum < 11) { + if (cards.map { it.number }.contains(CardNumber.ACE) && sum <= 11) { return sum + 10 } return sum diff --git a/src/test/kotlin/blackjack/domain/PlayerTest.kt b/src/test/kotlin/blackjack/domain/PlayerTest.kt index 4508a13112..c69d8cbd9f 100644 --- a/src/test/kotlin/blackjack/domain/PlayerTest.kt +++ b/src/test/kotlin/blackjack/domain/PlayerTest.kt @@ -33,7 +33,7 @@ class PlayerTest : StringSpec({ edge.cards shouldBe list } - "합이 11보다 작으면 ace를 11로 계산하기" { + "합이 11보다 작거나 같으면 ace를 11로 계산하기" { edge.addCard(Card(CardShape.DIAMOND, CardNumber.ACE)) edge.cardSum() shouldBe 16