Poker게임에 사용되는 카드 덱을 OOP로 구현해보다
Deck
포커1덱은 모양(4) * 랭크(13) = 52 장의 카드로 구성되어져 있다.
Stack
카드를 썩은후 맨위부터 한장씩 꺼낸다고 해보자
이것은 자료구조중 Stack과 닮아 있다. 한장씩 사용할때마다 POP-POP 하면된다.
물론 모습이 닯은것이고, 큐를 사용하던 리스트를 사용하던 꺼집어 내는것만 있기때문에
FIFO(First in First Out) , LIFO( Last in First Out ) 작동방식과는 아무런 상관이 없다.
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장을 뽑는것과 동일하다