Poker게임에 사용되는 카드 덱을 OOP로 구현해보다
Deck
포커1덱은 모양(4) * 랭크(13) = 52 장의 카드로 구성되어져 있다.
Stack
카드를 썩은후 맨위부터 한장씩 꺼낸다고 해보자
이것은 자료구조중 Stack과 닮아 있다. 한장씩 사용할때마다 POP-POP 하면된다.
물론 모습이 닯은것이고, 큐를 사용하던 리스트를 사용하던 꺼집어 내는것만 있기때문에
FIFO(First in First Out) , LIFO( Last in First Out ) 작동방식과는 아무런 상관이 없다.
이게 무슨말인고하니..
접시쌓기를 생각하면된다. 설겆이가 끝난 여러개의 접시를 차례로 쌓았서 정리했다고 해보자
처리가 먼저 끝난 접시는, 제일 밑에 쌓여있기때문에 뽑기가 어렵다. ( 물론 전체 접시를 든후 빼내면된다 )
마지막에 처리된 접시를 가장 먼저 사용이 가능하며 이것을 스택이라고 하고 LIFO 작동방식이라고 보면된다.
카드도 맨아래에 카드를 빼는것보다 일반적으로 맨위에 카드를 사용하는것이 일반적이기 때문에
모습만 닯았다고 표현을하였다.
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()); }
위 테스트 코드는 무작위의 카드중 맨윗부터 3장을 꺼내기때문에
덱에 포함된 무작위 카드 3장을 뽑는것과 동일하다