Skip to content

Instantly share code, notes, and snippets.

@brownmike brownmike/cards.rb
Created Jan 15, 2014

Embed
What would you like to do?
Save me
# TODO: Create InvalidCard, DuplicateCard & InvalidDeck exceptions
class Card
# 11 - 14 represent Jack through Ace respectively
VALUES = (2..14).to_a
SUITS = [:spades, :clubs, :hearts, :diamonds]
attr_reader :value, :suit
def initialize value, suit
ensure_valid value, suit
@value = value
@suit = suit
end
def to_s
case @value
when 11
"Jack of " + suit_to_s
when 12
"Queen of " + suit_to_s
when 13
"King of " + suit_to_s
when 14
"Ace of " + suit_to_s
else
@value.to_s + " of " + suit_to_s
end
end
def >(other_card)
@value > other_card.value
end
def <(other_card)
@value < other_card.value
end
def ==(other_card)
@value == other_card.value
end
private
def ensure_valid value, suit
# TODO: raise InvalidCard
raise TypeError unless VALUES.include?(value) && SUITS.include?(suit)
end
def suit_to_s
@suit.to_s.capitalize
end
end
# Monkeypatch to determine if an array consists of unique elements
class Array
def uniq?
self.length == self.uniq.length
end
end
class Deck
include Enumerable
extend Forwardable
def initialize cards=[]
ensure_valid cards
@cards = cards
end
def_delegator :@cards, :shift, :draw
def_delegator :@cards, :shift, :deal_card
def_delegator :@cards, :include?, :has_card?
def_delegators :@cards, :first, :last, :select
def each &block
@cards.each &block
end
def shuffle
Deck.new @cards.shuffle
end
def shuffle!
@cards.shuffle!
self
end
def << new_card
Deck.new @cards << new_card
end
def self.full_deck
all_cards = []
Card::SUITS.each do |suit|
Card::VALUES.each do |value|
all_cards << Card.new(value, suit)
end
end
Deck.new all_cards
end
private
def ensure_valid cards
raise TypeError unless cards.uniq? # TODO: raise DuplicateCard
cards.each do |card|
raise TypeError unless card.is_a?(Card) # TODO: raise InvalidDeck
end
end
end
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment
You can’t perform that action at this time.