Gem Version Test suite

Deck of cards handler

A ruby gem for simulating real-world deck handling: shuffle, cut, deal, cull and more.

Installation

Run the following terminal command:

gem install deck_of_cards_handler

Quickstart

require "deck_of_cards_handler"

# Cards
c = Card.new(suit: "S", value: "A")
c.red?        # => false
c.black?      # => true
c.spades?      # => true
c.hearts?      # => false
c.to_s        # => "A of S"
c.rank        # => 14 (Ace high)

Card.suits       # => ["C","D","H","S"]
Card.values      # => ["A","2",...,"10","J","Q","K"]

# Packets (decks or piles)
deck = Packet.new                    # empty unless you pass cards
one_card = Packet.new(cards: [c])
full = Packet.build_from_text_file(file_path: "data/mnemonica.txt")
five = Packet.build_from_string(string: "A:C, K:D, Q:H, J:S, 10:C")

full.size                            # => 52
full.shuffle                         # in-place shuffle
full.reverse                         # in-place reverse
top = full.top_deal                  # remove and return top card (Card)
sec = full.second_deal               # remove and return second card (Card)
bot = full.bottom_deal               # remove and return bottom card (Card)

piles = full.deal_into_piles(number_of_piles: 4, number_of_cards: 5)
# => [[Card,...],[...],[...],[...]]

# Reassemble piles (all return Packet)
full.reassemble_left_to_right_on_top(piles)

# Packet ↔︎ Poker hand
hand = five.to_poker_hand            # => a PokerHands::PokerHand subclass

Shuffling

# Perfect interleaving (Faro)
top_half = deck.cut(number: 26)
deck.faro(other_packet: top_half)

# Imperfect riffle shuffle
left_half = deck.cut(number: 26)
deck.riffle_shuffle(other_packet: left_half)

# Random shuffle
deck.shuffle

Convert Packets to Poker Hand

five = Packet.build_from_string(string: "A:C, K:D, Q:H, J:S, 10:C")
hand = five.to_poker_hand   # => PokerHands::Straight

Usage examples

Create the Mnemonica stack from Stay Stack ```ruby require "deck_of_cards_handler" # create a deck in stay stack order clubs = Card.values.map { Card.new(suit: "C", value: _1) } hearts = Card.values.map { Card.new(suit: "H", value: _1) } diamonds = Card.values.map { Card.new(suit: "D", value: _1) } spades = Card.values.map { Card.new(suit: "S", value: _1) } deck = Packet.new(cards: [clubs, hearts, diamonds.reverse, spades.reverse].flatten) # make 4 faro shuffles 4.times do top_half = deck.cut(number: 26) deck.faro(other_packet: top_half) end # reverse the first 26 cards top_half = deck.cut(number: 26) top_half.reverse deck.cards = [top_half.cards, deck.cards].flatten # faro the 18 first cards top_half = deck.cut(number: 18) deck.faro(other_packet: top_half) # cut the 9D to the bottom deck.cut_and_complete(number: 9) # assign a position value to the cards deck.set_cards_positions deck # => # , #, #, #, #, #, #, #... #, #, #, #, #, #, #, #]> ```
Distribute 5 hands of poker ```ruby require "deck_of_cards_handler" # create a full deck of cards cards = [] Card.suits.each do |suit| Card.values.each do |value| cards << Card.new(suit:, value:) end end deck = Packet.new(cards:) deck.shuffle piles = deck.deal_into_piles(number_of_piles: 5, number_of_cards: 5) hands = piles.map(&:to_poker_hand) # => [#PokerHands::OnePair, [...],[...],[...],[...]] ```

Development

After checking out the repo, run:

bin/setup

This installs dependencies.

Run the test suite:

rake test

You can also open an interactive console for experimentation:

bin/console