liars_dice 0.0.5 → 0.0.6

Sign up to get free protection for your applications and to get access to all the features.
data/liars_dice.gemspec CHANGED
@@ -1,14 +1,15 @@
1
1
  Gem::Specification.new do |gem|
2
2
  gem.name = 'liars_dice'
3
- gem.version = '0.0.5'
4
- gem.date = '2013-07-10'
3
+ gem.version = '0.0.6'
4
+ gem.date = '2013-07-12'
5
5
  gem.summary = "Liar's Dice game"
6
6
  gem.description = "A liar's dice botting environment, developed by Aisle50"
7
7
  gem.authors = ['Ben Schmeckpeper', 'Chris Doyle', 'Max Page', 'Molly Struve']
8
8
  gem.email = 'dev@aisle50.com'
9
9
 
10
- exclusions = [".rvmrc"]
11
- gem.files = `git ls-files`.split($\) - exclusions
10
+ exclusions = %w{ .rvmrc }
11
+ included_bots = %w{ lib/liars_dice/bots/human_bot.rb lib/liars_dice/bots/random_bot.rb }
12
+ gem.files = `git ls-files`.split($\) + included_bots - exclusions
12
13
  gem.test_files = gem.files.grep(%r{^(test|spec|features)/})
13
14
  gem.require_paths = ["lib"]
14
15
  end
data/lib/liars_dice.rb CHANGED
@@ -5,5 +5,4 @@ require 'liars_dice/event'
5
5
  require 'liars_dice/game'
6
6
  require 'liars_dice/seat'
7
7
  require 'liars_dice/command_line_watcher'
8
- require 'liars_dice/random_bot'
9
- require 'liars_dice/human_bot'
8
+ Dir[File.dirname(__FILE__) + '/liars_dice/bots/*.rb'].each {|file| require file }
@@ -0,0 +1,61 @@
1
+ module LiarsDice
2
+ module Bots
3
+ class HumanBot
4
+ attr_accessor :prev_bid, :dice, :seat_number, :name
5
+
6
+ def initialize(seat_number, number_of_players, number_of_dice)
7
+ self.seat_number = seat_number
8
+ self.name = "HumanBot"
9
+ puts "You're playing as HumanBot in seat #{seat_number}"
10
+ puts "When asked for a bid, either enter <TOTAL> <FACE_VALUE> or BS"
11
+ end
12
+
13
+ def handle_event(event)
14
+ if event.is_a? LiarsDice::BidMadeEvent
15
+ self.prev_bid = event.bid
16
+ return if event.seat_number.to_i == self.seat_number.to_i
17
+ puts event.message
18
+ elsif event.is_a? LiarsDice::BSCalledEvent
19
+ return if event.seat_number.to_i == self.seat_number.to_i
20
+ puts event.message
21
+ elsif event.is_a? LiarsDice::LoserEvent
22
+ puts "There were #{event.dice.flatten.select{|i| i == prev_bid.face_value or i == 1}.length} #{prev_bid.face_value}s"
23
+ if event.seat_number == self.seat_number
24
+ puts "You lose a die"
25
+ else
26
+ puts event.message
27
+ end
28
+ puts
29
+ self.prev_bid = nil
30
+ end
31
+ end
32
+
33
+ def format_event(event)
34
+ return if event.seat_number.to_i == seat_number.to_i
35
+ event.message
36
+ end
37
+
38
+ def dice=(dice)
39
+ @dice = dice
40
+ puts "Your dice are #{dice.inspect.to_s}"
41
+ end
42
+
43
+ def bid
44
+ puts "You're bidding first" unless prev_bid
45
+
46
+ print "What do you bid? "
47
+ bid_string = gets.chomp
48
+ if bid_string.downcase == "bs"
49
+ return BS.new
50
+ end
51
+ parts = bid_string.split(" ").map(&:to_i)
52
+ if parts.length == 2
53
+ ret = Bid.new(*parts)
54
+ return ret if ret.valid?
55
+ end
56
+ print "Invalid bid"
57
+ return bid
58
+ end
59
+ end
60
+ end
61
+ end
@@ -0,0 +1,46 @@
1
+ module LiarsDice
2
+ module Bots
3
+ class RandomBot
4
+ attr_accessor :prev_bid, :name
5
+
6
+ def initialize(seat_number, number_of_players, number_of_dice)
7
+ self.name = "RandomBot#{seat_number}"
8
+ end
9
+
10
+
11
+ def handle_event(event)
12
+ if event.is_a? LiarsDice::BidMadeEvent
13
+ self.prev_bid = event.bid
14
+ elsif event.is_a? LiarsDice::LoserEvent
15
+ self.prev_bid = nil
16
+ end
17
+ end
18
+
19
+ def dice=(dice); end
20
+
21
+ def bid
22
+ if prev_bid
23
+ choice = (0...10).to_a.sample
24
+
25
+ if choice == 0
26
+ # Call BS 10% of the time
27
+ LiarsDice::BS.new
28
+ elsif choice <= 6
29
+ # Up the total 50% of the time
30
+ LiarsDice::Bid.new(prev_bid.total + 1, prev_bid.face_value)
31
+ else
32
+ # Up the number 40% of the time
33
+ r = LiarsDice::Bid.new(prev_bid.total, prev_bid.face_value + 1)
34
+ if r.face_value > 6
35
+ r.total += 1
36
+ r.face_value = 2
37
+ end
38
+ r
39
+ end
40
+ else
41
+ LiarsDice::Bid.new(1, 2)
42
+ end
43
+ end
44
+ end
45
+ end
46
+ end
@@ -6,13 +6,13 @@ module LiarsDice
6
6
 
7
7
  def initialize
8
8
  self.names = {}
9
- append_after_dice_rolled method(:print_dice)
10
- append_after_bid lambda{|seat, bid| puts "#{name(seat, true)} bids #{bid}" }
11
- append_after_bs lambda{|seat| puts "#{name(seat)} calls BS" }
12
- append_after_game lambda{|winner| puts "Game over. #{name(winner)} wins." }
13
- append_after_round lambda{|loser| puts "#{name(loser)} loses a die" }
14
- append_after_invalid_bid lambda{|seat| puts "#{name(seat)} made an invalid bid" }
15
- append_after_seats_assigned lambda{|assignments| self.names = assignments }
9
+ after_dice_rolled :print_dice
10
+ after_bid lambda{|seat, bid| puts "#{name(seat, true)} bids #{bid}" }
11
+ after_bs lambda{|seat| puts "#{name(seat)} calls BS" }
12
+ after_game lambda{|winner| puts "Game over. #{name(winner)} wins." }
13
+ after_round lambda{|loser| puts "#{name(loser)} loses a die" }
14
+ after_invalid_bid lambda{|seat| puts "#{name(seat)} made an invalid bid" }
15
+ after_seats_assigned lambda{|assignments| self.names = assignments }
16
16
  end
17
17
 
18
18
  def name(seat_number, justified=false)
@@ -6,7 +6,7 @@ module LiarsDice
6
6
 
7
7
  def play(bot_classes)
8
8
  w = LiarsDice::CommandLineWatcher.new
9
- w.append_after_round lambda { |*args| gets }
9
+ w.after_round lambda { |*args| gets }
10
10
  e = LiarsDice::Engine.new(bot_classes, 5, w)
11
11
  e.run
12
12
  end
@@ -1,32 +1,31 @@
1
1
  module LiarsDice
2
2
  module Watcher
3
- attr_reader :after_roll, :after_bid, :after_round, :after_bs, :after_game, :after_dice_rolled, :after_seats_assigned, :after_invalid_bid
4
3
 
5
- def append_after_bid(callback)
4
+ def after_bid(callback)
6
5
  append_callback(:after_bid, callback)
7
6
  end
8
7
 
9
- def append_after_round(callback)
8
+ def after_round(callback)
10
9
  append_callback(:after_round, callback)
11
10
  end
12
11
 
13
- def append_after_bs(callback)
12
+ def after_bs(callback)
14
13
  append_callback(:after_bs, callback)
15
14
  end
16
15
 
17
- def append_after_game(callback)
16
+ def after_game(callback)
18
17
  append_callback(:after_game, callback)
19
18
  end
20
19
 
21
- def append_after_dice_rolled(callback)
20
+ def after_dice_rolled(callback)
22
21
  append_callback(:after_dice_rolled, callback)
23
22
  end
24
23
 
25
- def append_after_seats_assigned(callback)
24
+ def after_seats_assigned(callback)
26
25
  append_callback(:after_seats_assigned, callback)
27
26
  end
28
27
 
29
- def append_after_invalid_bid(callback)
28
+ def after_invalid_bid(callback)
30
29
  append_callback(:after_invalid_bid, callback)
31
30
  end
32
31
 
@@ -54,15 +53,19 @@ module LiarsDice
54
53
  end
55
54
 
56
55
  def append_callback(callback_name, callback)
57
- raise ArgumentError.new("Callback does not respond to call") unless callback.respond_to? :call
58
56
  raise ArgumentError.new("Unsupported callback #{callback_name}") unless allowed_callbacks.include? callback_name
57
+ raise ArgumentError.new("Callback does not respond to call") unless callback.respond_to?(:call) or callback.is_a? Symbol
59
58
  watcher_callbacks[callback_name] << callback
60
59
  end
61
60
 
62
61
  def fire(callback_name, *args)
63
62
  raise ArgumentError.new("Unsupported callback #{callback_name}") unless allowed_callbacks.include? callback_name
64
63
  watcher_callbacks[callback_name].each do |callback|
65
- callback.call(*args)
64
+ if callback.is_a? Symbol
65
+ send(callback, *args)
66
+ else
67
+ callback.call(*args)
68
+ end
66
69
  end
67
70
  end
68
71
 
metadata CHANGED
@@ -1,7 +1,7 @@
1
1
  --- !ruby/object:Gem::Specification
2
2
  name: liars_dice
3
3
  version: !ruby/object:Gem::Version
4
- version: 0.0.5
4
+ version: 0.0.6
5
5
  prerelease:
6
6
  platform: ruby
7
7
  authors:
@@ -12,7 +12,7 @@ authors:
12
12
  autorequire:
13
13
  bindir: bin
14
14
  cert_chain: []
15
- date: 2013-07-10 00:00:00.000000000Z
15
+ date: 2013-07-12 00:00:00.000000000Z
16
16
  dependencies: []
17
17
  description: A liar's dice botting environment, developed by Aisle50
18
18
  email: dev@aisle50.com
@@ -25,12 +25,12 @@ files:
25
25
  - liars_dice.gemspec
26
26
  - lib/liars_dice.rb
27
27
  - lib/liars_dice/bid.rb
28
+ - lib/liars_dice/bots/human_bot.rb
29
+ - lib/liars_dice/bots/random_bot.rb
28
30
  - lib/liars_dice/command_line_watcher.rb
29
31
  - lib/liars_dice/engine.rb
30
32
  - lib/liars_dice/event.rb
31
33
  - lib/liars_dice/game.rb
32
- - lib/liars_dice/human_bot.rb
33
- - lib/liars_dice/random_bot.rb
34
34
  - lib/liars_dice/seat.rb
35
35
  - lib/liars_dice/watcher.rb
36
36
  - spec/bid_spec.rb
@@ -1,58 +0,0 @@
1
- module LiarsDice
2
- class HumanBot
3
- attr_accessor :prev_bid, :dice, :seat_number
4
-
5
- def initialize(seat_number, number_of_players, number_of_dice)
6
- self.seat_number = seat_number
7
- puts "You're playing as HumanBot in seat #{seat_number}"
8
- puts "When asked for a bid, either enter <TOTAL> <FACE_VALUE> or BS"
9
- end
10
-
11
- def handle_event(event)
12
- if event.is_a? LiarsDice::BidMadeEvent
13
- self.prev_bid = event.bid
14
- return if event.seat_number.to_i == self.seat_number.to_i
15
- puts event.message
16
- elsif event.is_a? LiarsDice::BSCalledEvent
17
- return if event.seat_number.to_i == self.seat_number.to_i
18
- puts event.message
19
- elsif event.is_a? LiarsDice::LoserEvent
20
- puts "There were #{event.dice.flatten.select{|i| i == prev_bid.face_value or i == 1}.length} #{prev_bid.face_value}s"
21
- if event.seat_number == self.seat_number
22
- puts "You lose a die"
23
- else
24
- puts event.message
25
- end
26
- puts
27
- self.prev_bid = nil
28
- end
29
- end
30
-
31
- def format_event(event)
32
- return if event.seat_number.to_i == seat_number.to_i
33
- event.message
34
- end
35
-
36
- def dice=(dice)
37
- @dice = dice
38
- puts "Your dice are #{dice.inspect.to_s}"
39
- end
40
-
41
- def bid
42
- puts "You're bidding first" unless prev_bid
43
-
44
- print "What do you bid? "
45
- bid_string = gets.chomp
46
- if bid_string.downcase == "bs"
47
- return BS.new
48
- end
49
- parts = bid_string.split(" ").map(&:to_i)
50
- if parts.length == 2
51
- ret = Bid.new(*parts)
52
- return ret if ret.valid?
53
- end
54
- print "Invalid bid"
55
- return bid
56
- end
57
- end
58
- end
@@ -1,42 +0,0 @@
1
- module LiarsDice
2
- class RandomBot
3
- attr_accessor :prev_bid
4
-
5
- def initialize(seat_number, number_of_players, number_of_dice); end
6
-
7
-
8
- def handle_event(event)
9
- if event.is_a? LiarsDice::BidMadeEvent
10
- self.prev_bid = event.bid
11
- elsif event.is_a? LiarsDice::LoserEvent
12
- self.prev_bid = nil
13
- end
14
- end
15
-
16
- def dice=(dice); end
17
-
18
- def bid
19
- if prev_bid
20
- choice = (0...10).to_a.sample
21
-
22
- if choice == 0
23
- # Call BS 10% of the time
24
- LiarsDice::BS.new
25
- elsif choice <= 6
26
- # Up the total 50% of the time
27
- LiarsDice::Bid.new(prev_bid.total + 1, prev_bid.face_value)
28
- else
29
- # Up the number 40% of the time
30
- r = LiarsDice::Bid.new(prev_bid.total, prev_bid.face_value + 1)
31
- if r.face_value > 6
32
- r.total += 1
33
- r.face_value = 2
34
- end
35
- r
36
- end
37
- else
38
- LiarsDice::Bid.new(1, 2)
39
- end
40
- end
41
- end
42
- end