lib/99_game.rb in 99_game-2.0.2 vs lib/99_game.rb in 99_game-2.0.3.pre.68

- old
+ new

@@ -1,136 +1,137 @@ -# Used by the CPU to determine which card to play. Parameter card needs to be an instance of Card. - 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 - end - test_value = -100 if test_value > 99 - end -# Tests if obj is not nil. - def not_nil?(obj) - if obj.nil? - return false - else - return 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_reader :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) - 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 - 2.times {@cards.push Card.new("Joker")} - 50.times {@cards.shuffle!} - 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 - +# Used by the CPU to determine which card to play. Parameter card needs to be an instance of Card. + 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 + 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 + else + return 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) + 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 + 2.times {@cards.push Card.new("Joker")} + 50.times {@cards.shuffle!} + 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 +