dice_box 0.1.0 → 0.2.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- checksums.yaml +4 -4
- data/.gitignore +1 -0
- data/.travis.yml +1 -1
- data/README.md +29 -10
- data/lib/dice_box.rb +2 -1
- data/lib/dice_box/cup.rb +47 -0
- data/lib/dice_box/dice.rb +25 -9
- data/lib/dice_box/dice/side.rb +2 -2
- data/lib/dice_box/version.rb +1 -1
- data/spec/dice_box/cup_spec.rb +126 -0
- data/spec/dice_box/dice_spec.rb +62 -0
- metadata +5 -2
checksums.yaml
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
---
|
2
2
|
SHA1:
|
3
|
-
metadata.gz:
|
4
|
-
data.tar.gz:
|
3
|
+
metadata.gz: 4a4dcaca70ba3a0420120279c4933da3f01c35e7
|
4
|
+
data.tar.gz: 54f5b75307f7caae345b22de1ed080ef9ff331ba
|
5
5
|
SHA512:
|
6
|
-
metadata.gz:
|
7
|
-
data.tar.gz:
|
6
|
+
metadata.gz: 0ebefdba428de973713c83c9b531dfe7fe11d06c9e5518a90c2cc170a7e41e2de3f4c9c5386b648a238e6c2e538ef8688635e6f8b2e7fbadec5c056ca7d88721
|
7
|
+
data.tar.gz: 508e21422f71948c1aea7507c4a757dcdf68afda48c697d80a8d3d758dcc3cc5e437fe3f9e74070dca13b855359e2a13c60db0c7487b1607bd7ed092a9a15000
|
data/.gitignore
CHANGED
data/.travis.yml
CHANGED
data/README.md
CHANGED
@@ -2,6 +2,7 @@
|
|
2
2
|
|
3
3
|

|
4
4
|
|
5
|
+
[](http://badge.fury.io/rb/dice_box)
|
5
6
|
[](https://travis-ci.org/rafaelgonzalez/dice_box)
|
6
7
|
[](https://codeclimate.com/github/rafaelgonzalez/dice_box)
|
7
8
|
[](https://codeclimate.com/github/rafaelgonzalez/dice_box)
|
@@ -10,9 +11,9 @@ A gem of dices, to get rolling with Ruby.
|
|
10
11
|
|
11
12
|
**Supported Ruby versions:**
|
12
13
|
|
13
|
-
- 2.1.0
|
14
|
-
- 2.0.0
|
15
|
-
- 1.
|
14
|
+
- MRI 2.1.0
|
15
|
+
- MRI 2.0.0
|
16
|
+
- JRuby 1.7.13
|
16
17
|
|
17
18
|
## Installation
|
18
19
|
|
@@ -38,9 +39,9 @@ Complete documentation available [here](http://rubydoc.info/github/rafaelgonzale
|
|
38
39
|
|
39
40
|
# Using an instance
|
40
41
|
dice = DiceBox::Dice.new(12)
|
41
|
-
dice.
|
42
|
+
dice.result # => nil
|
42
43
|
dice.roll # => 24
|
43
|
-
dice.
|
44
|
+
dice.result # => 24
|
44
45
|
```
|
45
46
|
|
46
47
|
- [DiceBox::Dice::Sides](http://rubydoc.info/github/rafaelgonzalez/dice_box/DiceBox/Dice/Side) (cheating with sides weights)
|
@@ -56,17 +57,35 @@ Complete documentation available [here](http://rubydoc.info/github/rafaelgonzale
|
|
56
57
|
dice.roll # => 2
|
57
58
|
```
|
58
59
|
|
60
|
+
- [DiceBox::Cup](http://rubydoc.info/github/rafaelgonzalez/dice_box/DiceBox/Cup) (rolling multiple dice instances)
|
61
|
+
|
62
|
+
```ruby
|
63
|
+
dices = [DiceBox::Dice.new(6), DiceBox::Dice.new(20), DiceBox::Dice.new(100)]
|
64
|
+
cup = DiceBox::Cup.new(dices)
|
65
|
+
|
66
|
+
cup.result # => nil
|
67
|
+
cup.roll # => 103
|
68
|
+
cup.result # => 103
|
69
|
+
|
70
|
+
cup.dices[0].result # => 2
|
71
|
+
cup.dices[1].result # => 19
|
72
|
+
cup.dices[2].result # => 88
|
73
|
+
```
|
74
|
+
|
59
75
|
## Versioning
|
60
76
|
|
61
77
|
DiceBox follows the principles of [semantic versioning](http://semver.org).
|
62
78
|
|
63
|
-
|
79
|
+
Given a version number MAJOR.MINOR.PATCH:
|
80
|
+
|
81
|
+
- MAJOR is incremented when incompatible API changes are made
|
82
|
+
- MINOR is incremented when functionalities are added in a backwards-compatible manner
|
83
|
+
- PATCH is incremented when backwards-compatible bug fixes are made
|
64
84
|
|
65
|
-
|
66
|
-
> - MINOR version when you add functionality in a backwards-compatible manner, and
|
67
|
-
> - PATCH version when you make backwards-compatible bug fixes.
|
85
|
+
## Similar Libraries
|
68
86
|
|
69
|
-
|
87
|
+
- [GamesDice](https://github.com/neilslater/games_dice) (Ruby gem)
|
88
|
+
- [Droll](https://github.com/thebinarypenguin/droll) (Javascript)
|
70
89
|
|
71
90
|
## License
|
72
91
|
|
data/lib/dice_box.rb
CHANGED
data/lib/dice_box/cup.rb
ADDED
@@ -0,0 +1,47 @@
|
|
1
|
+
module DiceBox
|
2
|
+
# Commodity class to use multiple Dice instances at the same time
|
3
|
+
class Cup
|
4
|
+
# @!attribute [rw] dices
|
5
|
+
# @return [Array] the Array of Dices
|
6
|
+
attr_accessor :dices
|
7
|
+
|
8
|
+
# @!attribute [r] rolled_sides
|
9
|
+
# @return [Array] the last rolled Sides of each Dice
|
10
|
+
attr_reader :rolled_sides
|
11
|
+
|
12
|
+
# @!attribute [r] result
|
13
|
+
# @return [Integer] the result from the previous roll
|
14
|
+
attr_reader :result
|
15
|
+
alias_method :rolled, :result
|
16
|
+
alias_method :rolled_value, :result
|
17
|
+
|
18
|
+
# @param dices [Array] an Array of Dices to put in the Cup
|
19
|
+
def initialize(dices = [])
|
20
|
+
@dices = dices
|
21
|
+
@rolled_sides = []
|
22
|
+
end
|
23
|
+
|
24
|
+
# Rolls all the Dices in the Cup
|
25
|
+
# @return [Integer] the sum of the rolled Dices
|
26
|
+
def roll
|
27
|
+
@result = dices.map { |dice| dice.roll }.reduce(&:+)
|
28
|
+
@rolled_sides = dices.map(&:rolled_side)
|
29
|
+
|
30
|
+
result
|
31
|
+
end
|
32
|
+
|
33
|
+
# Returns the highest value the Cup can roll
|
34
|
+
# @return [Integer] minimum roll value
|
35
|
+
def maximum
|
36
|
+
dices.map(&:maximum).reduce(:+)
|
37
|
+
end
|
38
|
+
alias_method :max, :maximum
|
39
|
+
|
40
|
+
# Returns the lowest value the Cup can roll
|
41
|
+
# @return [Integer] minimum roll value
|
42
|
+
def minimum
|
43
|
+
dices.map(&:minimum).reduce(:+)
|
44
|
+
end
|
45
|
+
alias_method :min, :minimum
|
46
|
+
end
|
47
|
+
end
|
data/lib/dice_box/dice.rb
CHANGED
@@ -6,13 +6,20 @@ module DiceBox
|
|
6
6
|
attr_reader :sides
|
7
7
|
|
8
8
|
# @!attribute [r] rolled_side
|
9
|
-
# @return [
|
9
|
+
# @return [Dice::Side] the last rolled Side
|
10
10
|
attr_reader :rolled_side
|
11
11
|
|
12
|
+
# @!attribute [r] result
|
13
|
+
# @return [Integer] the result from the previous roll
|
14
|
+
attr_reader :result
|
15
|
+
alias_method :rolled, :result
|
16
|
+
alias_method :rolled_value, :result
|
17
|
+
|
12
18
|
# @param sides_number [Integer] the number of Sides this Dice should have
|
13
19
|
def initialize(sides_number)
|
14
20
|
@sides = build_sides(sides_number)
|
15
21
|
@rolled_side = nil
|
22
|
+
@rolled = nil
|
16
23
|
end
|
17
24
|
|
18
25
|
# Rolls multiple dices with the same number of sides
|
@@ -29,17 +36,26 @@ module DiceBox
|
|
29
36
|
|
30
37
|
# Rolls the dice
|
31
38
|
# @note Sets #rolled_side to the rolled Side
|
39
|
+
# @note Sets #rolled_value to the rolled Side's value
|
32
40
|
# @return [Integer] the value of the rolled Side
|
33
41
|
def roll
|
34
42
|
@rolled_side = balanced? ? sides.sample : weighted_roll
|
35
|
-
rolled_side.value
|
43
|
+
@result = rolled_side.value
|
44
|
+
end
|
45
|
+
|
46
|
+
# Returns the highest value the Dice can roll
|
47
|
+
# @return [Integer] maximum roll value
|
48
|
+
def maximum
|
49
|
+
sides.map(&:value).max
|
36
50
|
end
|
51
|
+
alias_method :max, :maximum
|
37
52
|
|
38
|
-
# Returns the
|
39
|
-
# @return [Integer]
|
40
|
-
def
|
41
|
-
|
53
|
+
# Returns the lowest value the Dice can roll
|
54
|
+
# @return [Integer] minimum roll value
|
55
|
+
def minimum
|
56
|
+
sides.map(&:value).min
|
42
57
|
end
|
58
|
+
alias_method :min, :minimum
|
43
59
|
|
44
60
|
# Determines if all Sides of the Dice have the same weight
|
45
61
|
# @return [Boolean]
|
@@ -63,9 +79,9 @@ module DiceBox
|
|
63
79
|
|
64
80
|
private
|
65
81
|
|
66
|
-
#
|
67
|
-
# @param sides_number [Integer] the number of Sides to
|
68
|
-
# @return [Array] the Array of
|
82
|
+
# Instantiates multiple Sides
|
83
|
+
# @param sides_number [Integer] the number of Sides to instantiate
|
84
|
+
# @return [Array] the Array of instantiated Sides
|
69
85
|
def build_sides(sides_number)
|
70
86
|
sides_number.times.map do |number|
|
71
87
|
Side.new(number + 1)
|
data/lib/dice_box/dice/side.rb
CHANGED
@@ -2,9 +2,9 @@ module DiceBox
|
|
2
2
|
class Dice
|
3
3
|
# Representation of the side of a dice
|
4
4
|
class Side
|
5
|
-
# @!attribute [
|
5
|
+
# @!attribute [rw] value
|
6
6
|
# @return [Integer] the actual value of the Side
|
7
|
-
|
7
|
+
attr_accessor :value
|
8
8
|
|
9
9
|
# @!attribute [rw] weight
|
10
10
|
# @return [Float] the weight of the Side
|
data/lib/dice_box/version.rb
CHANGED
@@ -0,0 +1,126 @@
|
|
1
|
+
describe DiceBox::Cup do
|
2
|
+
let(:dices) { [] }
|
3
|
+
subject { described_class.new(dices) }
|
4
|
+
|
5
|
+
describe '#roll' do
|
6
|
+
let(:dice_1) { DiceBox::Dice.new(6) }
|
7
|
+
let(:dice_2) { DiceBox::Dice.new(4) }
|
8
|
+
let(:dice_3) { DiceBox::Dice.new(12) }
|
9
|
+
let(:dices) { [dice_1, dice_2, dice_3] }
|
10
|
+
|
11
|
+
it 'returns the sum of the rolled values' do
|
12
|
+
expect(dice_1).to receive(:roll).and_return(3)
|
13
|
+
expect(dice_2).to receive(:roll).and_return(1)
|
14
|
+
expect(dice_3).to receive(:roll).and_return(10)
|
15
|
+
|
16
|
+
expect(subject.roll).to eql 14
|
17
|
+
end
|
18
|
+
end
|
19
|
+
|
20
|
+
describe '#result' do
|
21
|
+
let(:dice_1) { DiceBox::Dice.new(6) }
|
22
|
+
let(:dice_2) { DiceBox::Dice.new(4) }
|
23
|
+
let(:dice_3) { DiceBox::Dice.new(12) }
|
24
|
+
let(:dices) { [dice_1, dice_2, dice_3] }
|
25
|
+
|
26
|
+
it 'returns the sum of the last rolled values' do
|
27
|
+
rolled_value = subject.roll
|
28
|
+
|
29
|
+
expect(subject.result).to eql rolled_value
|
30
|
+
end
|
31
|
+
|
32
|
+
it 'does not change value if dices are rerolled' do
|
33
|
+
rolled_value = subject.roll
|
34
|
+
|
35
|
+
expect(subject.result).to eql rolled_value
|
36
|
+
|
37
|
+
expect(dice_1).to receive(:roll).and_return(1)
|
38
|
+
expect(dice_2).to receive(:roll).and_return(1)
|
39
|
+
expect(dice_3).to receive(:roll).and_return(1)
|
40
|
+
|
41
|
+
dice_1.roll
|
42
|
+
dice_2.roll
|
43
|
+
dice_3.roll
|
44
|
+
|
45
|
+
expect(subject.result).to eql rolled_value
|
46
|
+
end
|
47
|
+
end
|
48
|
+
|
49
|
+
describe '#rolled_sides' do
|
50
|
+
let(:dice_1) { DiceBox::Dice.new(6) }
|
51
|
+
let(:dice_2) { DiceBox::Dice.new(4) }
|
52
|
+
let(:dice_3) { DiceBox::Dice.new(12) }
|
53
|
+
let(:dices) { [dice_1, dice_2, dice_3] }
|
54
|
+
|
55
|
+
it 'returns an Array of Sides' do
|
56
|
+
expect(subject.rolled_sides).to be_an(Array)
|
57
|
+
expect(subject.rolled_sides).to be_empty
|
58
|
+
|
59
|
+
subject.roll
|
60
|
+
|
61
|
+
expect(subject.rolled_sides).to be_an(Array)
|
62
|
+
expect(subject.rolled_sides).to be_an(Array)
|
63
|
+
end
|
64
|
+
|
65
|
+
it 'does not change if dices are not rolled with the cup' do
|
66
|
+
subject.roll
|
67
|
+
rolled_sides = subject.rolled_sides
|
68
|
+
|
69
|
+
dice_1.roll
|
70
|
+
dice_2.roll
|
71
|
+
dice_3.roll
|
72
|
+
expect(subject.rolled_sides).to eql rolled_sides
|
73
|
+
end
|
74
|
+
end
|
75
|
+
|
76
|
+
describe '#maximum' do
|
77
|
+
let(:dices) { [DiceBox::Dice.new(6), DiceBox::Dice.new(20), DiceBox::Dice.new(100)] }
|
78
|
+
subject { DiceBox::Cup.new(dices) }
|
79
|
+
|
80
|
+
context 'with classical dices' do
|
81
|
+
it 'returns the highest value the cup can roll' do
|
82
|
+
expect(subject.maximum).to eql 126
|
83
|
+
end
|
84
|
+
end
|
85
|
+
|
86
|
+
context 'with dices with changed side values' do
|
87
|
+
before do
|
88
|
+
dices[0].sides[0].value = 56
|
89
|
+
dices[1].sides[0].value = 98
|
90
|
+
dices[2].sides[0].value = 112
|
91
|
+
end
|
92
|
+
|
93
|
+
it 'returns the highest value the cup can roll' do
|
94
|
+
expect(subject.maximum).to eql 266
|
95
|
+
end
|
96
|
+
end
|
97
|
+
end
|
98
|
+
|
99
|
+
describe '#minimum' do
|
100
|
+
let(:dices) { [DiceBox::Dice.new(6), DiceBox::Dice.new(6), DiceBox::Dice.new(6)] }
|
101
|
+
subject { DiceBox::Cup.new(dices) }
|
102
|
+
|
103
|
+
context 'with classical dices' do
|
104
|
+
it 'returns the lowest value the cup can roll' do
|
105
|
+
expect(subject.minimum).to eql 3
|
106
|
+
end
|
107
|
+
end
|
108
|
+
|
109
|
+
context 'with dices with changed side values' do
|
110
|
+
before do
|
111
|
+
dices.each do |dice|
|
112
|
+
dice.sides[0].value = 102
|
113
|
+
dice.sides[1].value = 206
|
114
|
+
dice.sides[2].value = 191
|
115
|
+
dice.sides[3].value = 76
|
116
|
+
dice.sides[4].value = 213
|
117
|
+
dice.sides[5].value = 87
|
118
|
+
end
|
119
|
+
end
|
120
|
+
|
121
|
+
it 'returns the lowest value the cup can roll' do
|
122
|
+
expect(subject.minimum).to eql 228
|
123
|
+
end
|
124
|
+
end
|
125
|
+
end
|
126
|
+
end
|
data/spec/dice_box/dice_spec.rb
CHANGED
@@ -112,6 +112,68 @@ describe DiceBox::Dice do
|
|
112
112
|
expect(subject.rolled).to eql rolled_value
|
113
113
|
end
|
114
114
|
end
|
115
|
+
|
116
|
+
context 'with a rolled side that changes value' do
|
117
|
+
it 'returns the rolled value' do
|
118
|
+
rolled_value = subject.roll
|
119
|
+
|
120
|
+
expect(subject.rolled).to eql rolled_value
|
121
|
+
|
122
|
+
subject.rolled_side.value = 1000
|
123
|
+
|
124
|
+
expect(subject.rolled).to eql rolled_value
|
125
|
+
end
|
126
|
+
end
|
127
|
+
end
|
128
|
+
|
129
|
+
describe '#maximum' do
|
130
|
+
subject { DiceBox::Dice.new(6) }
|
131
|
+
|
132
|
+
context 'with a classical dice' do
|
133
|
+
it 'returns the highest value the dice can roll' do
|
134
|
+
expect(subject.maximum).to eql 6
|
135
|
+
end
|
136
|
+
end
|
137
|
+
|
138
|
+
context 'with a dice with changed side values' do
|
139
|
+
before do
|
140
|
+
subject.sides[0].value = 247
|
141
|
+
subject.sides[1].value = 12
|
142
|
+
subject.sides[2].value = 271
|
143
|
+
subject.sides[3].value = 9
|
144
|
+
subject.sides[4].value = 46
|
145
|
+
subject.sides[5].value = 5
|
146
|
+
end
|
147
|
+
|
148
|
+
it 'returns the highest value the dice can roll' do
|
149
|
+
expect(subject.maximum).to eql 271
|
150
|
+
end
|
151
|
+
end
|
152
|
+
end
|
153
|
+
|
154
|
+
describe '#minimum' do
|
155
|
+
subject { DiceBox::Dice.new(6) }
|
156
|
+
|
157
|
+
context 'with a classical dice' do
|
158
|
+
it 'returns the lowest value the dice can roll' do
|
159
|
+
expect(subject.minimum).to eql 1
|
160
|
+
end
|
161
|
+
end
|
162
|
+
|
163
|
+
context 'with a dice with changed side values' do
|
164
|
+
before do
|
165
|
+
subject.sides[0].value = 247
|
166
|
+
subject.sides[1].value = 12
|
167
|
+
subject.sides[2].value = 271
|
168
|
+
subject.sides[3].value = 9
|
169
|
+
subject.sides[4].value = 46
|
170
|
+
subject.sides[5].value = 5
|
171
|
+
end
|
172
|
+
|
173
|
+
it 'returns the lowest value the dice can roll' do
|
174
|
+
expect(subject.minimum).to eql 5
|
175
|
+
end
|
176
|
+
end
|
115
177
|
end
|
116
178
|
|
117
179
|
describe '#balanced?' do
|
metadata
CHANGED
@@ -1,14 +1,14 @@
|
|
1
1
|
--- !ruby/object:Gem::Specification
|
2
2
|
name: dice_box
|
3
3
|
version: !ruby/object:Gem::Version
|
4
|
-
version: 0.
|
4
|
+
version: 0.2.0
|
5
5
|
platform: ruby
|
6
6
|
authors:
|
7
7
|
- Rafaël Gonzalez
|
8
8
|
autorequire:
|
9
9
|
bindir: bin
|
10
10
|
cert_chain: []
|
11
|
-
date: 2014-
|
11
|
+
date: 2014-08-10 00:00:00.000000000 Z
|
12
12
|
dependencies:
|
13
13
|
- !ruby/object:Gem::Dependency
|
14
14
|
name: bundler
|
@@ -142,9 +142,11 @@ files:
|
|
142
142
|
- dice.jpg
|
143
143
|
- dice_box.gemspec
|
144
144
|
- lib/dice_box.rb
|
145
|
+
- lib/dice_box/cup.rb
|
145
146
|
- lib/dice_box/dice.rb
|
146
147
|
- lib/dice_box/dice/side.rb
|
147
148
|
- lib/dice_box/version.rb
|
149
|
+
- spec/dice_box/cup_spec.rb
|
148
150
|
- spec/dice_box/dice/side_spec.rb
|
149
151
|
- spec/dice_box/dice_spec.rb
|
150
152
|
- spec/spec_helper.rb
|
@@ -173,6 +175,7 @@ signing_key:
|
|
173
175
|
specification_version: 4
|
174
176
|
summary: A gem with dices, to get rolling with Ruby.
|
175
177
|
test_files:
|
178
|
+
- spec/dice_box/cup_spec.rb
|
176
179
|
- spec/dice_box/dice/side_spec.rb
|
177
180
|
- spec/dice_box/dice_spec.rb
|
178
181
|
- spec/spec_helper.rb
|