Poker게임에 사용되는 카드 덱을 OOP로 구현해보자


Deck

포커1덱은 모양(4) * 랭크(13) = 52 장의 카드로 구성되어져 있다. 


Stack

카드를 썩은후 맨위부터 한장씩 꺼낸다고 해보자


이것은 자료구조중 Stack과 닮아 있다. 한장씩 사용할때마다 POP-POP 하면된다.

물론 모습이 닯은것이고, 큐를 사용하던 리스트를 사용하던 꺼집어 내는것만 있기때문에

FIFO(First in First Out) , LIFO( Last in First Out ) 작동방식과는 아무런 상관이 없다.

이게 무슨말인고하니..

접시쌓기를 생각하면된다.  설겆이가 끝난 여러개의 접시를 차례로 쌓았서 정리했다고 해보자

처리가 먼저 끝난 접시는, 제일 밑에 쌓여있기때문에 뽑기가 어렵다. ( 물론 전체 접시를 든후 빼내면된다 )

마지막에 처리된 접시를 가장 먼저 사용이 가능하며 이것을 스택이라고 하고 LIFO 작동방식이라고 보면된다.

카드도 맨아래에 카드를 빼는것보다 일반적으로 맨위에 카드를 사용하는것이 일반적이기 때문에

모습만 닯았다고 표현을하였다. 

내가 빙다리 핫바지로 보이냐? : 타짜중 밑장빼기를 저지하는 아귀 - 스택의 규칙을 어기면 큰일난다~


Stack을 이용하는데 밑장을 빼면 성능상 느려지기도 하지만 ( 자료구조상 성능이 늦어진다.) 

룰에도 어긋난다. 그래서 자료구조를 이해하는것은 성능과도 연관이 있다.

Deck 구현

그럼 이것을 자바코드로 실제 구현을 해보자 

package game.poker;
import java.util.Collections;
import java.util.Random;
import java.util.Stack;

import game.poker.Card.Suit;

public class Deck
{

    private Stack<Card> cards;
    private Random rand;

    public Deck()
    {
        rand = new Random();
        init();
    }

    public Deck(Random givenGenerator)
    {
        rand = givenGenerator;
        init();
    }

    public Card pop()
    {
        return cards.pop();
    }

    /**
     * Initializes a new deck of 52 cards.
     */
    private void init()
    {
        cards = new Stack<>();
        int index = 0;
        for (int rank = 1; rank <= 13; ++rank)
        {
            cards.push(new Card(rank, Suit.CLUBS));
            cards.push(new Card(rank, Suit.DIAMONDS));
            cards.push(new Card(rank, Suit.HEARTS));
            cards.push(new Card(rank, Suit.SPADES));
        }

        // Todo : Improve Shuffle Rule...
        Collections.shuffle(cards);
    }
}
  • init : 덱을 초기화후 자동으로 썩어준다. /

  • shuffle : 카드를 썩어주는 기능을 한다. 난수발생기를 고오급화하여 적용할수도 있다. 서비스에 실 사용시 난수검증은 중요한 사항이다. ( 이것만 검증하여 인증마크 달아주고 돈을 버는 기업들도 있다.)


Deck Test

@Test
public void deckTest(){
    Deck deck = new Deck();
    System.out.println(deck.pop());
    System.out.println(deck.pop());
    System.out.println(deck.pop());
}

Nine of HEARTS
King of DIAMONDS
Two of CLUBS


위 테스트 코드는 무작위의 카드중 맨윗부터 3장을 꺼내기때문에

덱에 포함된 무작위 카드 3장을 뽑는것과 동일하다





  • No labels