dice_box 0.1.0 → 0.2.0
Sign up to get free protection for your applications and to get access to all the features.
- 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
|
![Dice Box](https://raw.githubusercontent.com/rafaelgonzalez/dice_box/master/dice.jpg)
|
4
4
|
|
5
|
+
[![Gem Version](https://badge.fury.io/rb/dice_box.svg)](http://badge.fury.io/rb/dice_box)
|
5
6
|
[![Build Status](https://travis-ci.org/rafaelgonzalez/dice_box.svg?branch=master)](https://travis-ci.org/rafaelgonzalez/dice_box)
|
6
7
|
[![Code Climate](https://codeclimate.com/github/rafaelgonzalez/dice_box.png)](https://codeclimate.com/github/rafaelgonzalez/dice_box)
|
7
8
|
[![Test Coverage](https://codeclimate.com/github/rafaelgonzalez/dice_box/coverage.png)](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
|