diff --git a/blackjack.rb b/blackjack.rb index b6dcda9..2d1b234 100644 --- a/blackjack.rb +++ b/blackjack.rb @@ -14,9 +14,8 @@ def value end def to_s - "#{@value}-#{suit}" + "#{@value}#{suit.to_s.chars.first.upcase}" end - end @@ -55,6 +54,34 @@ def value cards.inject(0) {|sum, card| sum += card.value } end + def dealer_cards(winner) + if winner.nil? + hide_dealer_cards + else + cards + end + end + + def dealer_value(winner) + if winner.nil? + hide_dealer_value + else + value + end + end + + def hide_dealer_cards + "[XX, #{@cards[1]}]" + end + + def hide_dealer_value + :unknown + end + + def bust? + value > 21 + end + def play_as_dealer(deck) if value < 16 hit!(deck) @@ -69,12 +96,18 @@ def initialize @deck = Deck.new @player_hand = Hand.new @dealer_hand = Hand.new - 2.times { @player_hand.hit!(@deck) } + 2.times { @player_hand.hit!(@deck) } 2.times { @dealer_hand.hit!(@deck) } end def hit @player_hand.hit!(@deck) + player_loses if @player_hand.bust? + end + + def player_loses + puts "Player Busts at #{@player_hand.value}" + @winner = :dealer end def stand @@ -83,10 +116,10 @@ def stand end def status - {:player_cards=> @player_hand.cards, + {:player_cards => @player_hand.cards, :player_value => @player_hand.value, - :dealer_cards => @dealer_hand.cards, - :dealer_value => @dealer_hand.value, + :dealer_cards => @dealer_hand.dealer_cards(@winner), + :dealer_value => @dealer_hand.dealer_value(@winner), :winner => @winner} end @@ -133,9 +166,19 @@ def inspect card.value.should eq(11) end - it "should be formatted nicely" do + it "should show AD instead of A-diamonds" do card = Card.new(:diamonds, "A") - card.to_s.should eq("A-diamonds") + card.to_s.should eq("AD") + end + + it "should show QH instead of queen-hearts" do + card = Card.new(:hearts, "Q") + card.to_s.should eq("QH") + end + + it "should show 7C instead of 7-clubs" do + card = Card.new(:clubs, "7") + card.to_s.should eq("7C") end end @@ -162,9 +205,19 @@ def inspect hand.value.should eq(14) end + it "should calculate a bust" do + deck = mock(:deck, :cards => [Card.new(:clubs, 4), Card.new(:diamonds, 10), Card.new(:hearts, 2), Card.new(:spades, "A")]) + hand = Hand.new + 2.times { hand.hit!(deck) } + hand.value.should eq(14) + 2.times { hand.hit!(deck) } + hand.value.should eq(27) + hand.bust?.should eq(true) + end + it "should take from the top of the deck" do club4 = Card.new(:clubs, 4) - diamond7 = Card.new(:diamonds, 7) + diamond7 = Card.new(:diamonds, 7) clubK = Card.new(:clubs, "K") deck = mock(:deck, :cards => [club4, diamond7, clubK]) @@ -190,8 +243,8 @@ def inspect hand.value.should eq(17) end it "should stop on 21" do - deck = mock(:deck, :cards => [Card.new(:clubs, 4), - Card.new(:diamonds, 7), + deck = mock(:deck, :cards => [Card.new(:clubs, 4), + Card.new(:diamonds, 7), Card.new(:clubs, "K")]) hand = Hand.new 2.times { hand.hit!(deck) } @@ -227,16 +280,16 @@ def inspect describe "#determine_winner" do it "should have dealer win when player busts" do - Game.new.determine_winner(22, 15).should eq(:dealer) + Game.new.determine_winner(22, 15).should eq(:dealer) end it "should player win if dealer busts" do - Game.new.determine_winner(18, 22).should eq(:player) + Game.new.determine_winner(18, 22).should eq(:player) end it "should have player win if player > dealer" do - Game.new.determine_winner(18, 16).should eq(:player) + Game.new.determine_winner(18, 16).should eq(:player) end it "should have push if tie" do - Game.new.determine_winner(16, 16).should eq(:push) + Game.new.determine_winner(16, 16).should eq(:push) end end end