Kotlin

[Kotlin] Card Game

hvoon 2022. 9. 14. 16:24

-kind 와 number 를 멤버변수로 만들고 생성자에 전달된 값으로 멤버변수의 값을 대입하는 기본(대표)생성자를 이용.

-전달인수가 없는 보조 생성자도 생성.

-그 외 사항은 코틀린 코드를 이용하여 이전클래스와 같은 동작(toString의 오버라이드)을 할 수 있게 적절히 처리.

-spade, diamond, heart, clover 변수는 자바의 static 처럼 생성

// Class - Card.kt
class Card constructor( var kind:Int, var number:Int){
    constructor():this( 4 , 1){}
    companion object{
        val spade = 4
        val diamond = 3
        val heart = 2
        val clover = 1
    }
    override fun toString(): String {
        val kinds = arrayOf<String>("", "♣", "♥", "◆", "♠")
        val numbers = arrayOf<String>("","A","2","3","4","5","6","7","8","9","10","J","Q","K")
        val str:String  = "[" + kinds[kind] + ":" + numbers[number] + "]"
        return str
    }
}
 
// Class - CardDeck.kt
class CardDeck {
    // 멤버변수 cards- Card 객체 52개의 요소를 갖는 배열
    // 최초 임의의 카드 객체로 초기화함 - 매개변수가 없는 보조 생성자를 호출해서 생성
    var cards = Array<Card>(52, { Card() })

    // 생성자 - 배열에 있는 Card 52장을 스페이드1 ~ 클로버 13까지 카드의 무늬와 숫자를 설정하는 동작
    constructor(){
        var k=1 // kind 값 제어용 변수(1~4 반복)
        var n=1 // number 값 제어용 변수(1~13 반복)
        var p=0 // 52장의 카드 번호(0~51) 제어용 변수
        while(k<=4) {
            n=1
            while (n <= 13) {
                cards[p].kind = k
                cards[p].number = n
                n++
                p++
            }
            k++;
        } // 52번 반복으로 spade:A~Clover:13 각 카드 무늬와 숫자를 세트
    }

    // shuffle 메서드: 52장을 골고루 섞는 메서드
    // (Math.random()*52).toInt(): 0~51 중 랜덤 정수 선택 명령
    fun shuffle(){
        // 0~51번 카드를 순서대로 작업
        // 여기서 작업이란 0~51 중 랜덤한 숫자를 골라서 현재 카드와 랜덤번째 카드를 맞바꿈
        var temp:Card = Card()  // 랜덤카드와 현재 카드를 맞바꿀 때 필요한 임시 카드
        var i:Int = 0
        while(i<=51){
            var r:Int = ( Math.random() *52 ).toInt() // 0~51 중 랜덤 숫자 생성 & 저장
            temp = cards[i]
            cards[i] = cards[r]
            cards[r] = temp
            i++
        }
    }

    // pick 메서드: 전달인수로 온 정수번째의 카드를 리턴해주는 메서드
    fun pick( i:Int ):Card{
        return cards[i]
    }
}
 
// CardPlay.kt
fun main(){
    // CardDeck 객체 생성
    var d:CardDeck = CardDeck()
    d.shuffle()

    // println(d.cards[51])
    // 세명의 플레이어가 받은 카드 배열 생성 p1  p2  p3
    var p1 = Array<Card>(5, { Card() })
    var p2 = Array<Card>(5, { Card() })
    var p3 = Array<Card>(5, { Card() })

    // CardDeck 내부에 카드 섞어서 분배
    d.shuffle()

    // 카드 나눠주고 출력
    var i:Int=0
    var k:Int=0
    while( i<5 ){
        p1[i] = d.pick(k++)
        // p1[i].kind = d.pick(k).kind;
        // p1[i].number = d.pick(k).number;
        // k++;
        p2[i] = d.pick(k++)
        p3[i] = d.pick(k++)
        i++
    }
    for( item in p1) print("$item  ");     println();
    for( item in p2) print("$item  ");     println();
    for( item in p3) print("$item  ");     println();
}