Oshuma-gambler 0.0.2 → 0.0.3

Sign up to get free protection for your applications and to get access to all the features.
@@ -1,3 +1,8 @@
1
+ === 0.0.3 / 2008-06-14
2
+
3
+ * Blackjack is basically playable!
4
+ * The client (./bin/gambler_client) uses all functionality of the Blackjack class.
5
+
1
6
  === 0.0.2 / 2008-06-09
2
7
 
3
8
  * Basic gambling framework!
@@ -8,6 +8,8 @@ bin/gambler_client
8
8
  gambler.gemspec
9
9
  lib/gambler.rb
10
10
  lib/gambler/card.rb
11
+ lib/gambler/client.rb
12
+ lib/gambler/client/client_helper.rb
11
13
  lib/gambler/deck.rb
12
14
  lib/gambler/exceptions.rb
13
15
  lib/gambler/game.rb
@@ -21,6 +23,8 @@ tasks/override_rake_task.rb
21
23
  tasks/rcov.rake
22
24
  tasks/site.rake
23
25
  tasks/util.rb
26
+ test/client/test_client.rb
27
+ test/client/test_client_helper.rb
24
28
  test/game/test_basic_game.rb
25
29
  test/game/test_blackjack.rb
26
30
  test/helper.rb
data/README.txt CHANGED
@@ -27,6 +27,9 @@ Pure Ruby, so far.
27
27
  $ gem sources -a http://gems.github.com/ (You only need to do this once.)
28
28
  $ gem install Oshuma-gambler
29
29
 
30
+ == USAGE:
31
+ See http://gambler.rubyforge.org/api/ for usage documentation.
32
+
30
33
  == LICENSE:
31
34
 
32
35
  DO WHAT THE FUCK YOU WANT TO PUBLIC LICENSE
data/Rakefile CHANGED
@@ -29,15 +29,17 @@ Dir["#{GAMBLER_ROOT}/tasks/**/*.rake"].sort.each { |task| load task }
29
29
 
30
30
  task :default => [ :test, :rcov ]
31
31
 
32
- desc 'Clean up dynamically generated files'
33
- task :cleanup do
34
- %w{
35
- docs:clear
36
- issues:report:clear
37
- rcov:clear
38
- site:clear_local
39
- }.each do |clean|
40
- Rake::Task[clean].invoke
32
+ namespace :gambler do
33
+ desc 'Clean up dynamically generated files'
34
+ task :cleanup do
35
+ %w{
36
+ docs:clear
37
+ issues:report:clear
38
+ rcov:clear
39
+ site:clear_local
40
+ }.each do |clean|
41
+ Rake::Task[clean].invoke
42
+ end
41
43
  end
42
44
  end
43
45
 
@@ -4,211 +4,5 @@ GAMBLER_ROOT = File.join(File.dirname(__FILE__), '..')
4
4
  $LOAD_PATH.unshift File.join(GAMBLER_ROOT, 'lib')
5
5
  require 'gambler'
6
6
 
7
- module Gambler
8
- # A simple Client which allows you to play around with Gambler.
9
- # Most of this class can be ignored, as it just sets up the gaming
10
- # environment. The method to pay attention to is +play_blackjack+.
11
- # This is the method that actually creates and deals a Blackjack game.
12
- class Client
13
- WIDTH = 50
14
-
15
- $player_quits = false
16
-
17
- attr_accessor :bots
18
- attr_accessor :player
19
-
20
- def initialize
21
- @player = setup_player
22
- @bots = Array.new
23
- end
24
-
25
- # This is the main client menu.
26
- def menu
27
- display_header
28
- until $player_quits do
29
- display_player_stats
30
- display_game_menu
31
- choice = STDIN.gets.chomp
32
-
33
- case choice
34
- when '1':
35
- play_blackjack
36
- when '2':
37
- puts 'This game is not implemented yet.'
38
- when '3':
39
- puts 'This game is not implemented yet.'
40
- when /a/i:
41
- add_ai_player
42
- when /p/i:
43
- setup_player
44
- when /d/i:
45
- debug_console
46
- when /q/i:
47
- $player_quits = true
48
- exit
49
- else
50
- puts 'Invalid choice, dumbass.'
51
- end
52
- end
53
- end # of menu
54
-
55
- private
56
-
57
- # Add an AI Player as an opponent.
58
- def add_ai_player
59
- @bots << setup_player(:bot => true)
60
- end
61
-
62
- # Simple debugging console.
63
- def debug_console
64
- stop_debug = false
65
- code = Array.new
66
-
67
- puts # spacer
68
- puts '== DEBUG CONSOLE =='
69
- puts 'Commands:'
70
- puts ' /run - Quit debugger and run the code.'
71
- puts ' /show - Show the code currently in the buffer.'
72
- puts ' /quit - Quit debugger without running the code.'
73
-
74
- until stop_debug do
75
- print "eval:#{code.size + 1}> "
76
- line = STDIN.gets.chomp
77
-
78
- case line
79
- when '/run':
80
- run_code(code)
81
- stop_debug = true
82
- when '/show':
83
- show_code_buffer(code)
84
- when '/quit':
85
- stop_debug = true
86
- else # not a command, must be some Ruby code.
87
- code << line
88
- end
89
- end
90
- end # of debug_console
91
-
92
- # Client header.
93
- def display_header
94
- puts # spacer
95
- puts ''.center(WIDTH, '=')
96
- puts " Gambler v#{Gambler::VERSION} ".center(WIDTH, '=')
97
- puts ''.center(WIDTH, '=')
98
- puts '----------------------------------------'.center(WIDTH)
99
- puts '| Feeding yet another human addiction. |'.center(WIDTH)
100
- puts '----------------------------------------'.center(WIDTH)
101
- end # of display_header
102
-
103
- # Pretty print the player's stats.
104
- def display_player_stats
105
- puts '- Players -'.center(WIDTH)
106
- seperator = "\t"
107
- stat_width = WIDTH - 5
108
- stats = String.new
109
- bot_stats = String.new
110
-
111
- stats << "Player: #{@player.name}".ljust(WIDTH/2)
112
- stats << seperator
113
- stats << "Chips: #{@player.chips}"
114
- puts stats.center(stat_width)
115
-
116
- if @bots.empty?
117
- puts 'No AI opponents.'.center(WIDTH)
118
- else
119
- @bots.each do |bot|
120
- bot_stats = "AI: #{bot.name}".ljust(WIDTH/2)
121
- bot_stats << seperator
122
- bot_stats << "Chips: #{bot.chips}"
123
- puts bot_stats.center(stat_width)
124
- end
125
- end
126
- end # of display_player_stats
127
-
128
- # Client game menu.
129
- def display_game_menu
130
- puts '-----------------------'.center(WIDTH)
131
- puts '| 1) Blackjack |'.center(WIDTH)
132
- puts '| 2) Stud Poker |'.center(WIDTH)
133
- puts "| 3) Texas Hold 'em |".center(WIDTH)
134
- puts '| A) Add AI Player |'.center(WIDTH)
135
- puts '| D) Debug Console |'.center(WIDTH)
136
- puts '| P) Setup Player |'.center(WIDTH)
137
- puts '| Q) Quit |'.center(WIDTH)
138
- puts '-----------------------'.center(WIDTH)
139
- puts
140
- print 'Game: '
141
- end # of display_menu
142
-
143
- # Play a quick 1vs1 game of Blackjack.
144
- def play_blackjack
145
- begin
146
- # Create an array and add the player and bots.
147
- players = Array.new
148
- players << @player
149
- players << @bots
150
- players.flatten!
151
-
152
- @game = Gambler::Game::Blackjack.new(:players => players)
153
- rescue Gambler::Exceptions::InvalidPlayerSize
154
- puts 'Need at least 2 players for blackjack.'
155
- until @bots.size >= 1
156
- @bots << setup_player(:bot => true)
157
- end
158
- retry
159
- end # of begin ZOMG!!1
160
- end # of play_blackjack
161
-
162
- # Takes an array of +code+ lines and <tt>eval</tt>'s them.
163
- def run_code(code)
164
- puts # spacer
165
- begin
166
- puts " BEGIN DEBUG ".center(WIDTH, '=')
167
- eval(code.join("\n")) # Need to join, since +code+ is an Array.
168
- puts " END DEBUG ".center(WIDTH, '=')
169
- rescue Exception => error
170
- puts " DEBUG FAILED ".center(WIDTH, '=')
171
- puts error
172
- end
173
- puts # spacer
174
- end
175
-
176
- # Setup a new Player instance.
177
- def setup_player(options = {})
178
- default_chips = 100
179
- if options[:bot]
180
- who = 'AI player'
181
- default_name = 'Kenny'
182
- else
183
- who = 'your player'
184
- default_name = 'Human'
185
- end
186
-
187
- puts "Setting up #{who}."
188
- print "Name [#{default_name}]: "
189
- name = STDIN.gets.chomp
190
- name = default_name if name.empty?
191
-
192
- print "Chips [#{default_chips}]: "
193
- chips = STDIN.gets.chomp.to_i
194
- chips = default_chips if chips.zero?
195
-
196
- return Gambler::Player.new(name, :chips => chips)
197
- end # of setup_player
198
-
199
- # Takes an array of +code+ lines and prints them.
200
- def show_code_buffer(code)
201
- return (puts "Buffer empty.") if code.size.zero?
202
- puts "== BUFFER ==\n"
203
- code.each_with_index do |buf, line_num|
204
- print "#{line_num + 1}: ".rjust(5)
205
- puts buf
206
- end
207
- end
208
-
209
- end # of Client
210
-
211
- end # of Gambler
212
-
213
- # Let's do this!
7
+ # See lib/gambler/client.rb
214
8
  Gambler::Client.new.menu
@@ -0,0 +1,22 @@
1
+ Gem::Specification.new do |s|
2
+ s.name = 'gambler'
3
+ s.version = '0.0.3'
4
+ s.date = '2008-06-09'
5
+
6
+ s.authors = ['Dale Campbell']
7
+ s.email = ['dale@save-state.net']
8
+ s.homepage = 'http://gambler.rubyforge.org/'
9
+
10
+ s.summary = 'Ruby library to satisfy yet another human addiction.'
11
+ s.description = "Gambler is a Ruby library which can be included into other classes/modules. It provides an object oriented interface for common gambling games such as Blackjack, Poker, etc."
12
+
13
+ s.require_paths = ['lib']
14
+ s.files = ['History.txt', 'Manifest.txt', 'README', 'README.rdoc', 'README.txt', 'Rakefile', 'bin/gambler_client', 'gambler.gemspec', 'lib/gambler.rb', 'lib/gambler/card.rb', 'lib/gambler/deck.rb', 'lib/gambler/exceptions.rb', 'lib/gambler/game.rb', 'lib/gambler/game/basic_game.rb', 'lib/gambler/game/blackjack.rb', 'lib/gambler/player.rb', 'tasks/ditz.rake', 'tasks/docs.rake', 'tasks/git.rake', 'tasks/override_rake_task.rb', 'tasks/rcov.rake', 'tasks/site.rake', 'tasks/util.rb', 'test/game/test_basic_game.rb', 'test/game/test_blackjack.rb', 'test/helper.rb', 'test/suite.rb', 'test/test_card.rb', 'test/test_deck.rb', 'test/test_gambler.rb', 'test/test_player.rb', 'test/client/test_client.rb', 'test/client/test_client_helper.rb']
15
+ s.test_files = ['test/client/test_client.rb', 'test/client/test_client_helper.rb', 'test/game/test_basic_game.rb', 'test/game/test_blackjack.rb', 'test/test_card.rb', 'test/test_deck.rb', 'test/test_gambler.rb', 'test/test_player.rb']
16
+
17
+ s.has_rdoc = true
18
+ s.rdoc_options = ['--main', 'README.txt']
19
+ s.extra_rdoc_files = ['History.txt', 'Manifest.txt', 'README.txt']
20
+
21
+ s.add_dependency('hoe', '>= 1.5.3')
22
+ end
@@ -6,6 +6,7 @@ require 'rubygems'
6
6
 
7
7
  # Gambler libraries.
8
8
  require 'gambler/card'
9
+ require 'gambler/client'
9
10
  require 'gambler/deck'
10
11
  require 'gambler/exceptions'
11
12
  require 'gambler/game'
@@ -20,5 +21,5 @@ module Gambler
20
21
 
21
22
  self.debug = false
22
23
 
23
- VERSION = '0.0.2'
24
+ VERSION = '0.0.3'
24
25
  end
@@ -34,7 +34,7 @@ module Gambler
34
34
  # Example:
35
35
  # @deck.shuffle!
36
36
  def shuffle!
37
- @cards.sort! {rand}
37
+ @cards = @cards.sort_by { rand }
38
38
  @shuffled = true
39
39
  end
40
40
 
@@ -5,8 +5,12 @@ module Gambler
5
5
  # Gambler
6
6
  class MustOverrideMethod < Exception; end
7
7
 
8
+ # Blackjack
9
+ class PlayerBust < Exception; end
10
+
8
11
  # Card
9
12
  class InvalidCardType < Exception; end
13
+ class NoWinner < Exception; end
10
14
 
11
15
  # Deck
12
16
  class DeckEmpty < Exception; end
@@ -15,6 +19,7 @@ module Gambler
15
19
  # Game
16
20
  class InvalidPlayers < Exception; end
17
21
  class InvalidPlayerSize < Exception; end
22
+ class NotEnoughChips < Exception; end
18
23
  class NoPlayers < Exception; end
19
24
 
20
25
  # Player
@@ -0,0 +1,68 @@
1
+ module Gambler
2
+
3
+ module Game
4
+
5
+ # The basic game class in which all others can inherit.
6
+ # Feel free to create your own game class which does not inherit
7
+ # from BasicGame, but uses Player, Deck, etc. directly.
8
+ #
9
+ # BasicGame gives some free functionality to it's children:
10
+ # * <tt>players</tt>: Instance reader for the game's Player(s).
11
+ # * <tt>ante</tt>: Instance accessor for the game's current ante.
12
+ # * <tt>deck</tt>: Brand new, fully shuffled Deck to play with.
13
+ # * <tt>pot</tt>: Instance accessor for the game's current pot.
14
+ #
15
+ # The +options+ hash only requires one element, +players+, which must
16
+ # be an array of Gambler::Player object(s).
17
+ #
18
+ # Example:
19
+ # class Poker < Gambler::Game::BasicGame
20
+ # def initialize(options = {})
21
+ # # .. do custom shit (if needed) ..
22
+ # super(options) # Required to recieve free functionality.
23
+ # # .. more custom shit (if needed) ..
24
+ # end
25
+ #
26
+ # def poker_stuff
27
+ # !cheat
28
+ # end
29
+ # end
30
+ #
31
+ # # Create some players.
32
+ # @dale = Gambler::Player.new('Dale')
33
+ # @kenny = Gambler::Player.new('Kenny')
34
+ #
35
+ # # This will be passed to Poker.new.
36
+ # options = {
37
+ # :players => [@dale, @kenny], # The only required option.
38
+ # :ante => 50,
39
+ # :pot => 1_000
40
+ # }
41
+ #
42
+ # @game = Poker.new(options)
43
+ # @game.poker_stuff
44
+ class BasicGame
45
+ INITIAL_ANTE = 10
46
+ INITIAL_POT = 0
47
+
48
+ attr_reader :players
49
+ attr_accessor :ante, :deck, :pot
50
+
51
+ def initialize(options = {})
52
+ raise Exceptions::NoPlayers unless options[:players].size > 0
53
+ options[:players].each do |player|
54
+ raise Exceptions::InvalidPlayers unless player.is_a? Player
55
+ end
56
+ @players = options[:players]
57
+
58
+ @deck = Deck.new
59
+ 3.times { @deck.shuffle! }
60
+
61
+ @ante = options[:ante] || INITIAL_ANTE
62
+ @pot = options[:pot] || INITIAL_POT
63
+ end
64
+ end # of BasicGame
65
+
66
+ end # of Game
67
+
68
+ end # of Gambler
@@ -4,25 +4,125 @@ module Gambler
4
4
 
5
5
  # The Game of Blackjack.
6
6
  class Blackjack < Gambler::Game::BasicGame
7
+ BUST = 21 # The hand_value in which the Player busts.
7
8
  INITIAL_CARDS = 2
8
9
 
10
+ # These are used instead of Card::FACE_VALUES to accommodate Blackjack.
11
+ FACE_VALUES = {
12
+ 'A' => 11,
13
+ 'K' => 10,
14
+ 'Q' => 10,
15
+ 'J' => 10,
16
+ 'T' => 10,
17
+ '9' => 9,
18
+ '8' => 8,
19
+ '7' => 7,
20
+ '6' => 6,
21
+ '5' => 5,
22
+ '4' => 4,
23
+ '3' => 3,
24
+ '2' => 2,
25
+ 'L' => 1 # Magic low Ace.
26
+ }
27
+
28
+ attr_reader :players_in_round
29
+ attr_reader :round_winner
30
+
9
31
  def initialize(options = {})
10
32
  raise Exceptions::InvalidPlayerSize unless options[:players].size >= 2
11
33
  super(options)
12
34
  @players.each { |player| player.empty_hand! }
35
+ @players_in_round = Array.new
36
+ @players_in_round.replace(@players)
37
+ @round_winner = nil
38
+ end
39
+
40
+ # Forces each Player to put ante in the pot.
41
+ def ante_up!
42
+ @players_in_round.each { |player| place_bet(player, @ante) }
43
+ end
44
+
45
+ # Calculates the integer value for a Blackjack +hand+.
46
+ # Aces are converted to their lower value if the total hand value
47
+ # will bust the Player (and there are aces in the +hand+, of course).
48
+ def hand_value(hand)
49
+ return 0 if hand.empty?
50
+ value = 0
51
+
52
+ # Add up the face values
53
+ hand.each do |card|
54
+ value += FACE_VALUES[card.face]
55
+ end
56
+
57
+ # Handle any needed Ace changes.
58
+ while value > BUST
59
+ hand.each do |card|
60
+ if card.face == 'A'
61
+ # Subtract the difference between high and low ace (10).
62
+ value -= (FACE_VALUES['A'] - FACE_VALUES['L'])
63
+ end
64
+ end
65
+ break # no aces to change, bail
66
+ end
67
+
68
+ return value
69
+ end # of hand_value
70
+
71
+ # Give +player+ a Card.
72
+ def hit(player)
73
+ @deck.deal_to player
74
+ if player_bust?(player)
75
+ @players_in_round.delete(player)
76
+ raise Exceptions::PlayerBust
77
+ end
78
+ end
79
+
80
+ # Allows +player+ to place a bet for +amount+ which will be added to
81
+ # the current hand's pot.
82
+ def place_bet(player, amount)
83
+ raise Exceptions::NotEnoughChips if player.chips < amount
84
+ @pot += amount
85
+ player.chips -= amount
86
+ end
87
+
88
+ # Returns true of the Player's hand has a value above BUST.
89
+ def player_bust?(player)
90
+ hand_value(player.hand) > BUST
91
+ end
92
+
93
+ # This should be called at the beginning of every round (not game),
94
+ # and sets up things like the ante and dealing initial hands.
95
+ def start_round!
96
+ @players.each { |player| player.empty_hand! }
97
+ @players_in_round.replace(@players)
98
+ @round_winner = nil
99
+ ante_up!
13
100
  deal_initial_hands
14
101
  end
15
102
 
103
+ # This should be called after all players bust or stay. Sets the
104
+ # <tt>@round_winner</tt> variable to the Player object who won and
105
+ # gives them the pot.
106
+ def finish_round!
107
+ raise Exceptions::NoWinner if @players_in_round.nil?
108
+ # The winner is the Player with the highest hand_value.
109
+ @round_winner = @players_in_round.sort_by do |player|
110
+ hand_value(player.hand)
111
+ end.reverse.first
112
+ @round_winner.chips += @pot
113
+ @pot = INITIAL_POT
114
+ end
115
+
16
116
  private
17
117
 
18
118
  # Deal out the initial cards to each Player.
19
119
  def deal_initial_hands
20
120
  INITIAL_CARDS.times do
21
- @players.each do |player|
121
+ @players_in_round.each do |player|
22
122
  @deck.deal_to player
23
123
  end
24
124
  end
25
- end
125
+ end # of deal_initial_hands
26
126
 
27
127
  end # of Blackjack
28
128
 
@@ -37,12 +37,33 @@ module Gambler
37
37
  %Q{#<Gambler::Player '#{@name}'>}
38
38
  end
39
39
 
40
+ # Return true/false depending on if the Player has chips.
41
+ def is_broke?
42
+ @chips <= 0
43
+ end
44
+
40
45
  # Pretty printing of a Player.
41
46
  def to_s
42
47
  "#{@name} ($#{@chips})"
43
48
  end
44
49
 
45
50
  # Allows a Player to view their +hand+ in various formats.
51
+ # Examples:
52
+ # @player = Player.new('Dale', :hand => [Card.new('Ad'), Card.new('Kd')])
53
+ #
54
+ # # :format => :array (the default)
55
+ # @player.view_hand
56
+ # => ['Ad', 'Kd']
57
+ # @player.view_hand(:pretty => true)
58
+ # => ['Ace of Diamonds', 'King of Diamonds']
59
+ #
60
+ # # :format => :string
61
+ # @player.view_hand(:format => :string)
62
+ # => 'Ad Kd'
63
+ # @player.view_hand(:format => :string, :pretty => true)
64
+ # => 'Ace of Diamonds, King of Diamonds'
65
+ # @player.view_hand(:format => :string, :pretty => true, :seperator => ' | ')
66
+ # => 'Ace of Diamonds | King of Diamonds'
46
67
  def view_hand(options = {})
47
68
  format = options[:format] || :array
48
69
  pretty = options[:pretty] || false
@@ -49,6 +49,7 @@ namespace :docs do
49
49
 
50
50
  desc 'Remove the Gambler API docs'
51
51
  task :clear do
52
+ header("Removing documentation from #{API_DOCS}")
52
53
  system("rm -rf #{API_DOCS}")
53
54
  end
54
55
 
@@ -37,6 +37,7 @@ namespace :site do
37
37
  task :upload => :setup_dir do
38
38
  header('Uploading local site to remote site.')
39
39
  sh "cd #{LOCAL_SITE} && scp -r ./* #{REMOTE_SITE}"
40
+ sh "open http://gambler.rubyforge.org/" if RUBY_PLATFORM =~ /darwin/
40
41
  end
41
42
 
42
43
  private
@@ -0,0 +1,8 @@
1
+ require File.dirname(__FILE__) + '/../helper'
2
+
3
+ # Tests Gambler::Client
4
+ class TestClient < Test::Unit::TestCase
5
+ def test_truth
6
+ assert true
7
+ end
8
+ end
@@ -0,0 +1,8 @@
1
+ require File.dirname(__FILE__) + '/../helper'
2
+
3
+ # Tests Gambler::ClientHelper
4
+ class TestClientHelper < Test::Unit::TestCase
5
+ def test_truth
6
+ assert true
7
+ end
8
+ end
@@ -6,15 +6,17 @@ class TestBlackjack < Test::Unit::TestCase
6
6
 
7
7
  def setup
8
8
  @dale = Player.new('Dale')
9
- @kenny = Player.new('Kenny')
9
+ @kenny = Player.new('The Gambler')
10
10
  @game = Blackjack.new(:players => [@dale, @kenny])
11
+ @game.start_round!
11
12
  end
12
13
 
13
14
  def test_new_blackjack_game
14
15
  assert_kind_of(Blackjack, @game)
15
16
  assert_equal(10, @game.ante)
16
- assert_equal(0, @game.pot)
17
+ assert_equal(20, @game.pot)
17
18
  assert_kind_of(Deck, @game.deck)
19
+ assert(@game.deck.shuffled, "#{@game.deck} not shuffled")
18
20
  end
19
21
 
20
22
  def test_invalid_player_size
@@ -23,4 +25,84 @@ class TestBlackjack < Test::Unit::TestCase
23
25
  Blackjack.new(:players => [@dale])
24
26
  end
25
27
  end
28
+
29
+ def test_ante_up!
30
+ @game.ante_up!
31
+ assert_equal(40, @game.pot)
32
+ end
33
+
34
+ def test_hand_value
35
+ @player = Player.new('Newb', :hand => [ Card.new('2s'), Card.new('3s') ])
36
+ assert_equal(5, @game.hand_value(@player.hand))
37
+ end
38
+
39
+ def test_hand_value_with_aces
40
+ @player = Player.new('Newb', :hand => [
41
+ Card.new('As'), Card.new('2s'), Card.new('3s') ])
42
+ assert_equal(16, @game.hand_value(@player.hand))
43
+ end
44
+
45
+ def test_hand_value_treating_ace_as_one
46
+ @player = Player.new('Newb', :hand => [
47
+ Card.new('As'), Card.new('2s'), Card.new('Ks') ])
48
+ assert_equal(13, @game.hand_value(@player.hand))
49
+ end
50
+
51
+ def test_hit # shouldn't bust
52
+ @dale.hand = [ Card.new('2d'), Card.new('3d') ]
53
+ @game.hit(@dale)
54
+ assert_equal(3, @dale.hand.size)
55
+ end
56
+
57
+ def test_place_bet
58
+ @game.place_bet(@dale, 10)
59
+ assert_equal(30, @game.pot)
60
+ end
61
+
62
+ def test_player_bust?
63
+ @dale.hand = [ Card.new('Kd'), Card.new('Qd') ]
64
+ assert_raise(Exceptions::PlayerBust) do
65
+ @game.hit @dale
66
+ end
67
+ end
68
+
69
+ def test_start_round!
70
+ @game = Blackjack.new(:players => [@dale, @kenny])
71
+ assert(@dale.hand.empty?, "#{@dale}'s hand is not empty")
72
+ assert(@kenny.hand.empty?, "#{@kenny}'s hand is not empty")
73
+ assert_equal(0, @game.pot)
74
+ @game.start_round!
75
+ assert_equal(2, @dale.hand.size)
76
+ assert_equal(2, @kenny.hand.size)
77
+ assert_equal(20, @game.pot)
78
+ end
79
+
80
+ def test_finish_round!
81
+ @winner = Player.new('Winner')
82
+ @middle = Player.new('Middle')
83
+ @loser = Player.new('Loser')
84
+
85
+ # Randomize the order.
86
+ players = [@winner, @middle, @loser].sort_by { rand }
87
+ @game = Blackjack.new(:players => players)
88
+ @game.start_round!
89
+
90
+ # Used in the asserts below.
91
+ winner_chips = @winner.chips
92
+ middle_chips = @middle.chips
93
+ loser_chips = @loser.chips
94
+ pot = @game.pot
95
+
96
+ # Craft a round with a known outcome.
97
+ @winner.hand = [Card.new('Kd'), Card.new('Ks')] # => 20
98
+ @middle.hand = [Card.new('5h'), Card.new('5c')] # => 10
99
+ @loser.hand = [Card.new('2d'), Card.new('2s')] # => 4
100
+ @game.finish_round!
101
+
102
+ assert_equal(@winner, @game.round_winner)
103
+ assert_equal((winner_chips + pot), @winner.chips)
104
+ assert_equal(middle_chips, @middle.chips)
105
+ assert_equal(loser_chips, @loser.chips)
106
+ assert_equal(0, @game.pot)
107
+ end
26
108
  end
@@ -3,7 +3,7 @@ require File.dirname(__FILE__) + '/helper'
3
3
  # Tests the Gambler module.
4
4
  class TestGambler < Test::Unit::TestCase
5
5
  def test_version_string
6
- assert_equal(Gambler::VERSION, '0.0.2')
6
+ assert_equal(Gambler::VERSION, '0.0.3')
7
7
  end
8
8
 
9
9
  def test_debug
@@ -72,6 +72,13 @@ class TestPlayer < Test::Unit::TestCase
72
72
  assert_equal(pretty_hand, @player.view_hand(:format => :string, :pretty => true))
73
73
  end
74
74
 
75
+ def test_view_hand_as_pretty_string_with_seperator
76
+ @player = Player.new('Dale', :hand => [Card.new('Ad'), Card.new('Kd')])
77
+ pretty_hand = 'Ace of Diamonds | King of Diamonds'
78
+ assert_equal(pretty_hand,
79
+ @player.view_hand(:format => :string, :pretty => true, :seperator => ' | '))
80
+ end
81
+
75
82
  def test_default_chip_stack
76
83
  assert_equal(100, @player.chips)
77
84
  end
@@ -93,4 +100,14 @@ class TestPlayer < Test::Unit::TestCase
93
100
  @player.chips += pot # You win!
94
101
  assert_equal(pot + chips, @player.chips)
95
102
  end
103
+
104
+ def test_is_broke?
105
+ @player.chips = 0
106
+ assert(@player.is_broke?, "#{@player} isn't broke")
107
+ end
108
+
109
+ def test_is_not_broke
110
+ assert_equal(100, @player.chips)
111
+ assert_equal(false, @player.is_broke?)
112
+ end
96
113
  end
metadata CHANGED
@@ -1,7 +1,7 @@
1
1
  --- !ruby/object:Gem::Specification
2
2
  name: Oshuma-gambler
3
3
  version: !ruby/object:Gem::Version
4
- version: 0.0.2
4
+ version: 0.0.3
5
5
  platform: ruby
6
6
  authors:
7
7
  - Dale Campbell
@@ -11,8 +11,16 @@ cert_chain: []
11
11
 
12
12
  date: 2008-06-09 00:00:00 -07:00
13
13
  default_executable:
14
- dependencies: []
15
-
14
+ dependencies:
15
+ - !ruby/object:Gem::Dependency
16
+ name: hoe
17
+ version_requirement:
18
+ version_requirements: !ruby/object:Gem::Requirement
19
+ requirements:
20
+ - - ">="
21
+ - !ruby/object:Gem::Version
22
+ version: 1.5.3
23
+ version:
16
24
  description: Gambler is a Ruby library which can be included into other classes/modules. It provides an object oriented interface for common gambling games such as Blackjack, Poker, etc.
17
25
  email:
18
26
  - dale@save-state.net
@@ -32,6 +40,7 @@ files:
32
40
  - README.txt
33
41
  - Rakefile
34
42
  - bin/gambler_client
43
+ - gambler.gemspec
35
44
  - lib/gambler.rb
36
45
  - lib/gambler/card.rb
37
46
  - lib/gambler/deck.rb
@@ -55,6 +64,8 @@ files:
55
64
  - test/test_deck.rb
56
65
  - test/test_gambler.rb
57
66
  - test/test_player.rb
67
+ - test/client/test_client.rb
68
+ - test/client/test_client_helper.rb
58
69
  has_rdoc: true
59
70
  homepage: http://gambler.rubyforge.org/
60
71
  post_install_message:
@@ -83,6 +94,8 @@ signing_key:
83
94
  specification_version: 2
84
95
  summary: Ruby library to satisfy yet another human addiction.
85
96
  test_files:
97
+ - test/client/test_client.rb
98
+ - test/client/test_client_helper.rb
86
99
  - test/game/test_basic_game.rb
87
100
  - test/game/test_blackjack.rb
88
101
  - test/test_card.rb