lib/99_game.rb in 99_game-2.0.3 vs lib/99_game.rb in 99_game-2.1.0
- old
+ new
@@ -1,137 +1,65 @@
-# Used by the CPU to determine which card to play. Parameter card needs to be an instance of Card.
+autoload :CardDeck, "card_deck"
+autoload :Card, "card"
+autoload :Hand, "hand"
+
+=begin
+@param card [CardDeck::Card]
+@param actual_value [Integer]
+@param test_value [Integer]
+@return [Integer]
+@note Used by the CPU to determine which card to play. Parameter card needs to be an instance of Card.
+=end
def test(card, actual_value, test_value)
if card.num == "King"
test_value = 99
elsif card.num == "Joker"
test_value = 0
- else; test_value = actual_value + card.value
+ else
+ test_value = actual_value + card.value
end
test_value = -100 if test_value > 99
return test_value
end
# Tests if obj is not nil.
def not_nil?(obj)
if obj.nil?
- return false
+ false
else
- return true
+ true
end
end
# Converts input to an integer if String#capitalize does something. If parameter input is an abbreviation, _input_ is converted to what it stands for. Otherwise, it simply returns a capitalized version of _input_. If _input_ is nil or an emtpy string, raises a CardError
- def converter(input)
- abbrev = {"$" => "Joker", "K" => "King", "J" => "Jack", "Q" => "Queen", "A" => "Ace"}
- raise(CardError, "Input cannot be blank") if input == String.new
- if input.to_i == 0
- case input.capitalize
- when "$" then "Joker"
- when "K" then "King"
- when "J" then "Jack"
- when "Q" then "Queen"
- when "A" then "Ace"
- end
- else
- input.to_i
- end
- end
# Expected errors
- class CardError < Exception; end
-class Card # Represents a card in the deck
- # Gives the number on the card
- attr_reader :num
- # Gives the Card's value
- attr_reader :value
- # Backup method for Card#value
- def _value
- return case @num
- when "Ace" then 1
- when 2..3 then @num
- when 4 then 0
- when 5..8 then @num
- when 9 then 0
- when 10 then 10
- when "Jack" then 0
- when "Queen" then -10
- when "King" then 99
- when "Joker" then 0
- end
- end
- # Creates a new card with num as the attribute :num
- def initialize(num)
- @num, @value = num, case num
- when "Ace" then 1
- when 4 then 0
- when 9 then 0
- when "Jack" then 0
- when "Joker" then 0
- when "King" then 99
- when "Queen" then -10
- else
- num.to_i
- end
- end
-end
-class Hand # Creates an object that holds and can play cards. Interacts with Deck objects.
- # The actual hand
- attr_accessor :hand
- # Creates a new Hand. The deck argument tells the object which deck to use in Hand#play
- def initialize(deck_in_use)
- @hand, @deck = [deck_in_use.draw, deck_in_use.draw, deck_in_use.draw], deck_in_use
- end
- # Gameplay method. The parameter 'card' is the card being played.
- def play(card)
- if card.num == "King"; $value = 99
- elsif card.num == "Joker"; $value = 0
- else; $value += card.value
- end
- i, done = 0, false
- for index in @hand
- if index.num == card.num and not done
- discard = @hand[ i ]
- @hand.delete_at i
- @hand.push @deck.draw
- @deck.discard discard
- done = true
- end
- i += 1
- end
- end
- # Allows you to see your cards.
- def view
- print "\tThese are your cards: "
- @hand.each {|card| print "\t#{card.num}"}
- end
-end
-# Combines sleep and a newline. 'p' is the amount of time waited.
- def pause(p)
+class CardError < Exception; end
+=begin
+Combines sleep and a newline
+@param p [Integer] amount of time to sleep
+@return [void]
+=end
+def pause(p)
sleep p
puts
- end
-class Deck # Cards are stored in these objects
- # The contents of the deck
- attr_reader :cards
- def initialize # Creates a new deck that can now be used for playing the game
- @cards = Array.new
- 4.times do # Add the cards to the deck
- @cards.push Card.new("Ace")
- @cards.push Card.new("King")
- @cards.push Card.new("Queen")
- @cards.push Card.new("Jack")
- @cards.push Card.new(10)
- @cards.push Card.new(9)
- @cards.push Card.new(8)
- @cards.push Card.new(7)
- @cards.push Card.new(6)
- @cards.push Card.new(5)
- @cards.push Card.new(4)
- @cards.push Card.new(3)
- @cards.push Card.new(2)
+end
+=begin
+@param input [String]
+@return [String, Integer]
+If parameter input is an abbreviation, input is converted to what it stands for.
+Otherwise, it simply returns a capitalized version of input.
+@raise [CardError] if input is nil or an emtpy string
+=end
+def converter(input)
+ abbrev = {"$" => "Joker", "K" => "King", "J" => "Jack", "Q" => "Queen", "A" => "Ace"}
+ raise(CardError, "Input cannot be blank") if input == String.new
+ if input.to_i == 0
+ case input.capitalize
+ when ?$ then "Joker"
+ when ?K then "King"
+ when ?J then "Jack"
+ when ?Q then "Queen"
+ when ?A then "Ace"
end
- 2.times {@cards.push Card.new("Joker")}
- 50.times {@cards.shuffle!}
+ else
+ input.to_i
end
- # Draw from the deck
- def draw; @cards.shift; end
- # Adds 'card' to the deck. Used with Hand#play.
- def discard(card); @cards.push card; end
end