본문 바로가기

Kotlin/BlackJack

BlackJack(1) - Overview

개발환경

  • JDK 8
  • IntelliJ

블랙잭이라는 게임을 만들어보면서 코틀린의 기본문법을 익혀볼게요.

먼저 블랙잭이라는 게임에 대해 알아볼게요.

블랙잭이란?

  • 조커를 제외한 52장의 트럼프카드를 이용합니다
  • 보통 4개 혹은 6개 덱을 섞어서 게임을 진행합니다. 그러니까 208 또는 312 장의 카드를 이용합니다
  • 숫자의 합이 21 이하의 큰 숫자를 만드는 것을 목표로 합니다
  • 몇명의 플레이어가 게임을 진행하든, 딜러와 플레이어의 1:1 배틀입니다
  • 플레이어와 딜러가 각각 2장의 카드를 받고 모든 카드를 공개한 상태에서 플레이어가 원하는 만큼 카드를 받습니다
  • 플레이어가 22 이상이 되면 딜러의 패와 상관없 즉시 패배합니다.
  • 딜러는 플레이어의 플레이가 끝난후에 시작하므로 15이하이면 무조건 한장을 더받고 16이상이면 무조건 받을 수 없는 핸디캡이 있습니다
  • 딜러의 턴이 끝나면 게임이 종료됩니다.
  • 10 J Q K 는 모두 10으로 계산하고, A는 1 또는 11중에 유리한 숫자로 자동 계산이 됩니다
  • 나머지 숫자는 숫자가 점수가 됩니다.

설명은 길었지만 굉장히 간단한 게임입니다.

사실 실제 게임에서는 스플릿, 더블다운, 이븐, 인슈어런스등의 룰이 추가 되긴합니다만

한 때는 게임이 빠르게 진행되고 사행성이 높다는 이유로 온라인에서 플레이가 금지되기도 했었죠. 자 그러면 실제로 게임을 만들어보도록 할게요

 

 

1. 클래스 만들기

Kotlin은 함수형 프로그래밍 언어이지만, JAVA처럼  객체지향성도 가지고 있습니다. 그러면 클래스를 만들어볼게요

 

1.1 카드 클래스

한장 한장의 카드를 나타내는 클래스가 필요하겠죠? 각각의 카드가 가지는 속성(property)을 나열해 보면

  • name:String 숫자 혹은 문자 (A, 2, 3, 4, ... , J, Q, K)
  • score:Int 점수 (1,2,3,4,5, ... , 10)
  • suit:String 문양 (♠♦♥♣)

이 세가지가 필요합니다.

코틀린으로 만들면

data class Card(
    var name:String,
    var score:Int,
    var suit:String
){
}
 
1.2 덱 클래스

게임을 진행하는 실제 덱입니다. 카드의 묶음이니, 별도로 클래스로 만들지 않아도 됩니다만, 연습이니까 이것도 만들어볼게요

  • deckCount:Int 몇 벌의 카드인지 나열합니다. 4벌 혹은 6벌이라고 위에 설명드렸죠?
  • cards:ArrayList 덱이 포함하고 있는 카드목록입니다.
data class Deck(
    var deckCount:Int,
    var cards:ArrayList<Card> = ArrayList()
) {
}

ArrayList는, 간단히 설명하자면 배열과 리스트의 성질을 모두 가지고 있는 자료구조입니다. 즉, 삽입, 삭제, 수정, 이동이 간편하고, 객체 접근도 원활합니다. 사용 방법은 간단합니다.

var a:ArrayList<Int> = ArrayList() // 선언과 초기화
a.add(3)    // 맨 뒤에 삽입

a.clear()   // 모든 인자 제거

a.add(1)	// {1}
a.add(2)    // {1, 2}

a.set(0, 3) // {3, 2} 특정 위치의 값 수정

println(a[1]) // 값 불러오기 (2)

이 정도가 기본이고, 나머지 사용법은 필요할 때 다루도록 할게요

 

1.3 유저 클래스

게임을 진행하는 플레이어와 딜러의 클래스입니다. 각각 카드를 가지고 있고, 그 카드로 점수를 가지게 되겠죠?

  • hand:ArrayList 손에들고 있는 카드입니다
  • score:Int 가지고 있는 카드로 계산한 점수입니다.
data class User(
    var score:Int = 0
    var hand:ArrayList<Card> = ArrayList(),

) {
}

이번 클래스에 score와 hand가 모두 값을 가지고 있습니다. property는 기본 값을 가지고 있지 않더라도, 클래스 생성과 동시에 property를 반드시 넣어줘야 하는 성질이 있습니다. 하지만, 이렇게 기본값을 넣어두는 경우, property를 넣지 않아도 클래스 생성이 가능합니다. 다만, 기본값이 정해져 있는 인자는 마지막에 만들어주는 것이 좋습니다. 예를들면,

data class Person(
    var name:String,
    var age:Int,
    var nation:String = "한국"
) {
}

fun main() {
    var gogildong:Person = Person("고길동", "51")
    println(gogildong) // "고길동" "51" "한국"
    
    var dooly:Person = Person("둘리", "10", "남극")
    println(dooly) // "둘리", "10", "남극"
}

이 것은 자연스럽게 됩니다, 하지만 다음과 같은 경우에는 문제가 됩니다

data class Hero(
    var nation:String = "조선",
    var name:String,
    var age:Int
) {
}

fun main() {
    var honggildong:Person = Person("홍길동", "20") // error
    var honggildong:Person = Person("조선", "홍길동", "20") // ok
    println(honggildong) // "조선", "홍길동", "20"
}

위에서 볼 수 있듯이, 앞에 기본값이 있는 변수는 일반적으로 사용할 수 없어서 의미가 없습니다. 그러므로 기본값이 주어지는 변수는 뒤에 배치하는 것이 좋습니다.

 

 

이제 구조는 다 만들었습니다. 그럼 다음 글에서 각각의 클래스의 세부 내용을 만들어볼게요