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