8000 GitHub - seosh817/kotlin-blackjack
[go: up one dir, main page]
More Web Proxy on the site http://driver.im/
Skip to content

seosh817/kotlin-blackjack

 
 

Repository files navigation

kotlin-blackjack

Step1 - 코틀린 DSL

실습 환경 구축

블랙잭 저장소를 기반으로 미션을 진행한다. 온라인 코드 리뷰 요청 1단계 문서를 참고해 실습 환경을 구축한다.

  1. 미션 시작 버튼을 눌러 미션을 시작한다.
  2. 저장소에 자신의 GitHub 아이디로 된 브랜치가 생성되었는지 확인한다.
  3. 저장소를 자신의 계정으로 Fork 한다.

좋은 개발 코드의 8가지 특징

  • 잘 작동한다.
  • 읽기 쉽다.
  • 테스트 가능하다.
  • 관리가 쉽다.
  • 외관이 보기 좋다.
  • 변경이 쉽다.
  • 간결하다.
  • 효율적이다.

API가 깔끔하다

  • 읽기 쉽다.
  • 외관이 보기 좋다.
  • 간결하다.

코틀린은 간결한 구문을 어떻게 지원하는가?

  • 확장 함수
  • 중위 호출
  • 연산자 오버로딩
  • get 메서드에 대한 관례
  • 람다를 괄호 밖으로 빼내는 관례
  • 수신 객체 지정 람다

도메인 특화 언어

DSL(Domain-specific language) ↔ 범용 프로그래밍 언어

  • 선언적 언어
  • 세부 실행은 언어를 해석하는 엔진에 맡긴다.
  • 컴파일 시점에 제대로 검증하는 것이 어렵다. e.g. SQL, 정규 표현식

코틀린 DSL

  • 범용 언어(= 코틀린)로 작성된 프로그램의 일부
  • 범용 언어와 동일한 문법을 사용한다.
  • 호출 결과를 객체로 변환하기 위해 노력할 필요가 없다.
  • 타입 안전성을 보장한다.
  • 코틀린 코드를 원하는 대로 사용할 수 있다.

확장 함수 Extension functions

StringUtils.lastChar("Kotlin")

fun lastChar(s: String): Char {
    return s.get(s.length - 1)
}
"Kotlin".lastChar()

fun String.lastChar(): Char {
    return this.get(this.length - 1)
}

중위 표기 Infix notation

1.to("one")

fun Any.to(other: Any) = Pair(this, other)
1 to "one"

infix fun Any.to(other: Any) = Pair(this, other)

연산자 오버로딩 Operator overloading

Point(0, 1).plus(Point(1, 2))

data class Point(val x: Int, val y: Int) {
    fun plus(other: Point): Point = Point(x + other.x, y + other.y)
}
Point(0, 1) + Point(1, 2)

data class Point(val x: Int, val y: Int) {
    operator fun plus(other: Point): Point = Point(x + other.x, y + other.y)
}

get 메서드에 대한 관례 Indexed access operator

val names = listOf("Jason", "Pobi")
names.get(0)
names[0]

람다를 괄호 밖으로 빼내는 관례 Passing a lambda to the last parameter

check(false, { -> "Check failed." })
check(false) { "Check failed." }

수신 객체 지정 람다 Lambda with receiver

val sb = StringBuilder()
sb.append("Yes")
sb.append("No")
val sb = StringBuilder()
sb.apply {
    this.append("Yes")
    append("No")
}

코틀린 DSL 실습

introduce {
  name("박재성")
  company("우아한형제들")
  skills {
    soft("A passion for problem solving")
    soft("Good communication skills")
    hard("Kotlin")
  }
  languages {
    "Korean" level 5
    "English" level 3
  }
}

Step2 - 블랙잭

기능 요구사항

블랙잭 게임을 변형한 프로그램을 구현한다. 블랙잭 게임은 딜러와 플레이어 중 카드의 합이 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

프로그래밍 요구사항

  • 모든 기능을 TDD로 구현해 단위 테스트가 존재해야 한다. 단, UI(System.out, System.in) 로직은 제외
  • indent(인덴트, 들여쓰기) depth를 2를 넘지 않도록 구현한다. 1까지만 허용한다.
  • 모든 엔티티를 작게 유지한다.
  • 함수(또는 메서드)의 길이가 15라인을 넘어가지 않도록 구현한다.
  • 기능을 구현하기 전에 README.md 파일에 구현할 기능 목록을 정리해 추가한다.
  • git의 commit 단위는 앞 단계에서 README.md 파일에 정리한 기능 목록 단위로 추가한다.

Step3 - 블랙잭(딜러)

기능 요구사항

블랙잭 게임을 변형한 프로그램을 구현한다. 블랙잭 게임은 딜러와 플레이어 중 카드의 합이 21 또는 21에 가장 가까운 숫자를 가지는 쪽이 이기는 게임이다.

  • 카드의 숫자 계산은 카드 숫자를 기본으로 하며, 예외로 Ace는 1 또는 11로 계산할 수 있으며, King, Queen, Jack은 각각 10으로 계산한다.
  • 게임을 시작하면 플레이어는 두 장의 카드를 지급 받으며, 두 장의 카드 숫자를 합쳐 21을 초과하지 않으면서 21에 가깝게 만들면 이긴다. 21을 넘지 않을 경우 원한다면 얼마든지 카드를 계속 뽑을 수 있다.
  • 딜러는 처음에 받은 2장의 합계가 16이하이면 반드시 1장의 카드를 추가로 받아야 하고, 17점 이상이면 추가로 받을 수 없다.
  • 딜러가 21을 초과하면 그 시점까지 남아 있던 플레이어들은 가지고 있는 패에 상관 없이 승리한다.
  • 게임을 완료한 후 각 플레이어별로 승패를 출력한다.

실행 결과

게임에 참여할 사람의 이름을 입력하세요.(쉼표 기준으로 분리)
pobi,jason

딜러와 pobi, jason에게 2장의 나누었습니다.
딜러: 3다이아몬드
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스페이드

딜러는 16이하라 한장의 카드를 더 받았습니다.

딜러 카드: 3다이아몬드, 9클로버, 8다이아몬드 - 결과: 20
pobi카드: 2하트, 8스페이드, A클로버 - 결과: 21
jason카드: 7클로버, K스페이드 - 결과: 17

## 최종 승패
딜러: 11패
pobi: 승 
jason:

프로그래밍 요구사항

  • 모든 기능을 TDD로 구현해 단위 테스트가 존재해야 한다. 단, UI(System.out, System.in) 로직은 제외
  • indent(인덴트, 들여쓰기) depth를 2를 넘지 않도록 구현한다. 1까지만 허용한다.
  • 모든 엔티티를 작게 유지한다.
  • 3개 이상의 인스턴스 변수를 가진 클래스를 쓰지 않는다.
  • 딜러와 플레이어에서 발생하는 중복 코드를 제거해야 한다.
  • 함수(또는 메서드)의 길이가 15라인을 넘어가지 않도록 구현한다.
  • 기능을 구현하기 전에 README.md 파일에 구현할 기능 목록을 정리해 추가한다.
  • git의 commit 단위는 앞 단계에서 README.md 파일에 정리한 기능 목록 단위로 추가한다.

힌트

  • 상속을 활용해 중복을 제거해 본다.

🚀 4단계 - 블랙잭(베팅)

기능 요구사항

블랙잭 게임을 변형한 프로그램을 구현한다. 블랙잭 게임은 딜러와 플레이어 중 카드의 합이 21 또는 21에 가장 가까운 숫자를 가지는 쪽이 이기는 게임이다.

  • 플레이어는 게임을 시작할 때 베팅 금액을 정해야 한다.
  • 카드의 숫자 계산은 카드 숫자를 기본으로 하며, 예외로 Ace는 1 또는 11로 계산할 수 있으며, King, Queen, Jack은 각각 10으로 계산한다.
  • 게임을 시작하면 플레이어는 두 장의 카드를 지급 받으며, 두 장의 카드 숫자를 합쳐 21을 초과하지 않으면서 21에 가깝게 만들면 이긴다. 21을 넘지 않을 경우 원한다면 얼마든지 카드를 계속 뽑을 수 있다. 단, 카드를 추가로 뽑아 21을 초과할 경우 베팅 금액을 모두 잃게 된다.
  • 처음 두 장의 카드 합이 21일 경우 블랙잭이 되면 베팅 금액의 1.5 배를 딜러에게 받는다. 딜러와 플레이어가 모두 동시에 블랙잭인 경우 플레이어는 베팅한 금액을 돌려받는다.
  • 딜러는 처음에 받은 2장의 합계가 16이하이면 반드시 1장의 카드를 추가로 받아야 하고, 17점 이상이면 추가로 받을 수 없다.
  • 딜러가 21을 초과하면 그 시점까지 남아 있던 플레이어들은 가지고 있는 패에 상관 없이 승리해 베팅 금액을 받는다.

실행 결과

게임에 참여할 사람의 이름을 입력하세요.(쉼표 기준으로 분리)
pobi,jason

pobi의 배팅 금액은?
10000

jason의 배팅 금액은?
20000

딜러와 pobi, jason에게 2장의 나누었습니다.
딜러: 3다이아몬드
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스페이드

딜러는 16이하라 한장의 카드를 더 받았습니다.

딜러 카드: 3다이아몬드, 9클로버, 8다이아몬드 - 결과: 20
pobi카드: 2하트, 8스페이드, A클로버 - 결과: 21
jason카드: 7클로버, K스페이드 - 결과: 17

## 최종 수익
딜러: 10000
pobi: 10000
jason: -20000

프로그래밍 요구 사항

  • 모든 기능을 TDD로 구현해 단위 테스트가 존재해야 한다. 단, UI(System.out, System.in) 로직은 제외
  • indent(인덴트, 들여쓰기) depth를 2를 넘지 않도록 구현한다. 1까지만 허용한다.
  • 모든 엔티티를 작게 유지한다.
  • 3개 이상의 인스턴스 변수를 가진 클래스를 쓰지 않는다.
  • 딜러와 플레이어에서 발생하는 중복 코드를 제거해야 한다.
  • 함수(또는 메서드)의 길이가 15라인을 넘어가지 않도록 구현한다.
  • 기능을 구현하기 전에 README.md 파일에 구현할 기능 목록을 정리해 추가한다.
  • git의 commit 단위는 앞 단계에서 README.md 파일에 정리한 기능 목록 단위로 추가한다.

About

No description, website, or topics provided.

Resources

Stars

Watchers

Forks

Releases

No releases published

Packages

No packages published

Languages

  • Kotlin 100.0%
0