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()); }
위 테스트 코드는 무작위의 카드중 맨윗부터 3장을 꺼내기때문에
덱에 포함된 무작위 카드 3장을 뽑는것과 동일하다