just_backgammon 0.1.2 → 1.1.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 +5 -5
- data/README.md +6 -0
- data/just_backgammon.gemspec +4 -4
- data/lib/just_backgammon/bar.rb +5 -5
- data/lib/just_backgammon/common.rb +3 -3
- data/lib/just_backgammon/dice_set.rb +3 -2
- data/lib/just_backgammon/die.rb +11 -4
- data/lib/just_backgammon/game_state.rb +25 -25
- data/lib/just_backgammon/off_board.rb +9 -6
- data/lib/just_backgammon/piece.rb +14 -7
- data/lib/just_backgammon/point.rb +9 -5
- data/lib/just_backgammon/version.rb +1 -1
- metadata +10 -11
checksums.yaml
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
---
|
2
|
-
|
3
|
-
metadata.gz:
|
4
|
-
data.tar.gz:
|
2
|
+
SHA256:
|
3
|
+
metadata.gz: f9701bd389d703e4e3490389aca7cfa461ae8423ac1637cdab665b1c45ba8ac0
|
4
|
+
data.tar.gz: e8b8d3772b4e6d2f1f79985710786c775fcf7b0dd9925b7a8d993c4714b32b1e
|
5
5
|
SHA512:
|
6
|
-
metadata.gz:
|
7
|
-
data.tar.gz:
|
6
|
+
metadata.gz: 6cbd24b890137042e410895ca3d7f5d1941dd307d8b64201c945bd7e16dfa194f205a6149ea5684db8740c864607913611b7858550f1a6e344b9926f8feda544
|
7
|
+
data.tar.gz: 858e12df9646c17baf8b09558c8db8a171ff32fc204a115fc2c38c52bd60b4203555cb2f6fbbef1c1fe8c17156c0289a0ac64ff20320328e54836716007d3d77
|
data/README.md
CHANGED
@@ -34,6 +34,12 @@ Moves can be made by passing in the player number, and an array of moves each co
|
|
34
34
|
game_state.move(1, [{from: 1, to: 2}]])
|
35
35
|
```
|
36
36
|
|
37
|
+
The last change with all its details are found in the `last_change` attribute
|
38
|
+
|
39
|
+
```ruby
|
40
|
+
game_state.last_change
|
41
|
+
```
|
42
|
+
|
37
43
|
If something happens errors may be found in the errors attribute
|
38
44
|
|
39
45
|
```ruby
|
data/just_backgammon.gemspec
CHANGED
@@ -19,9 +19,9 @@ Gem::Specification.new do |spec|
|
|
19
19
|
spec.executables = spec.files.grep(%r{^exe/}) { |f| File.basename(f) }
|
20
20
|
spec.require_paths = ["lib"]
|
21
21
|
|
22
|
-
spec.required_ruby_version = '>= 2.
|
22
|
+
spec.required_ruby_version = '>= 2.7'
|
23
23
|
|
24
|
-
spec.add_development_dependency "bundler", "~> 1.
|
25
|
-
spec.add_development_dependency "rake", "~>
|
26
|
-
spec.add_development_dependency "minitest", "~> 5.0"
|
24
|
+
spec.add_development_dependency "bundler", "~> 2.1.4"
|
25
|
+
spec.add_development_dependency "rake", "~> 13.0.1"
|
26
|
+
spec.add_development_dependency "minitest", "~> 5.14.0"
|
27
27
|
end
|
data/lib/just_backgammon/bar.rb
CHANGED
@@ -19,7 +19,7 @@ module JustBackgammon
|
|
19
19
|
# ==== Example:
|
20
20
|
# # Instantiates a new Bar
|
21
21
|
# JustBackgammon::Bar.new({
|
22
|
-
# pieces: [{
|
22
|
+
# pieces: [{player_number: 1}, {player_number: 1}]
|
23
23
|
# })
|
24
24
|
def initialize(pieces:)
|
25
25
|
@pieces = JustBackgammon::Piece.load(pieces)
|
@@ -44,7 +44,7 @@ module JustBackgammon
|
|
44
44
|
#
|
45
45
|
# @return [Array<Piece>]
|
46
46
|
def pieces_owned_by_player(player_number)
|
47
|
-
pieces.select { |p| p.
|
47
|
+
pieces.select { |p| p.player_number == player_number }
|
48
48
|
end
|
49
49
|
|
50
50
|
# Number of pieces owned by the specified player.
|
@@ -83,8 +83,8 @@ module JustBackgammon
|
|
83
83
|
# the specified player number.
|
84
84
|
#
|
85
85
|
# @return [Piece,NilClass]
|
86
|
-
def
|
87
|
-
p = pieces.find { |p| p.
|
86
|
+
def pop(player_number)
|
87
|
+
p = pieces.find { |p| p.player_number == player_number }
|
88
88
|
pieces.delete(p)
|
89
89
|
end
|
90
90
|
|
@@ -105,4 +105,4 @@ module JustBackgammon
|
|
105
105
|
{ pieces: pieces.map(&:as_json) }
|
106
106
|
end
|
107
107
|
end
|
108
|
-
end
|
108
|
+
end
|
@@ -18,11 +18,11 @@ module JustBackgammon
|
|
18
18
|
def load(argument)
|
19
19
|
case argument
|
20
20
|
when Hash
|
21
|
-
self.new(argument)
|
21
|
+
self.new(**argument)
|
22
22
|
when Array
|
23
23
|
case
|
24
24
|
when argument.all? { |o| o.instance_of?(Hash) }
|
25
|
-
argument.map { |o| self.new(o) }
|
25
|
+
argument.map { |o| self.new(**o) }
|
26
26
|
when argument.all? { |o| o.instance_of?(self) }
|
27
27
|
argument
|
28
28
|
else
|
@@ -35,4 +35,4 @@ module JustBackgammon
|
|
35
35
|
end
|
36
36
|
end
|
37
37
|
end
|
38
|
-
end
|
38
|
+
end
|
@@ -51,7 +51,8 @@ module JustBackgammon
|
|
51
51
|
def roll
|
52
52
|
@dice.each(&:roll)
|
53
53
|
if @dice.first == @dice.last
|
54
|
-
@dice.
|
54
|
+
dup_dice = @dice.map { |d| Die.new(id: d.id + 2, number: d.number) }
|
55
|
+
@dice.concat(dup_dice)
|
55
56
|
end
|
56
57
|
end
|
57
58
|
|
@@ -72,4 +73,4 @@ module JustBackgammon
|
|
72
73
|
dice.map(&:as_json)
|
73
74
|
end
|
74
75
|
end
|
75
|
-
end
|
76
|
+
end
|
data/lib/just_backgammon/die.rb
CHANGED
@@ -10,16 +10,23 @@ module JustBackgammon
|
|
10
10
|
|
11
11
|
# A new instance of Die.
|
12
12
|
#
|
13
|
+
# @param [Fixnum] id
|
14
|
+
# The identifier of the die.
|
15
|
+
#
|
13
16
|
# @param [Fixnum, NilClass] number
|
14
17
|
# The number of the die. Returns nil if not yet rolled.
|
15
18
|
#
|
16
19
|
# ==== Example:
|
17
20
|
# # Instantiates a new Die
|
18
|
-
# JustBackgammon::Die.new(number: 1)
|
19
|
-
def initialize(number:)
|
21
|
+
# JustBackgammon::Die.new(id: 1, number: 1)
|
22
|
+
def initialize(id: , number:)
|
23
|
+
@id = id
|
20
24
|
@number = number
|
21
25
|
end
|
22
26
|
|
27
|
+
# @return [Fixnum] the identifier of the die.
|
28
|
+
attr_reader :id
|
29
|
+
|
23
30
|
# @return [Fixnum] the number of the die. Returns nil if not yet rolled
|
24
31
|
attr_reader :number
|
25
32
|
|
@@ -48,7 +55,7 @@ module JustBackgammon
|
|
48
55
|
#
|
49
56
|
# @return [Hash]
|
50
57
|
def as_json
|
51
|
-
{ number: number }
|
58
|
+
{ id: id, number: number }
|
52
59
|
end
|
53
60
|
end
|
54
|
-
end
|
61
|
+
end
|
@@ -64,7 +64,7 @@ module JustBackgammon
|
|
64
64
|
# pieces: [],
|
65
65
|
# },
|
66
66
|
# points: [
|
67
|
-
# { number: 1, pieces: [{
|
67
|
+
# { number: 1, pieces: [{player_number: 1}, {player_number: 1}] },
|
68
68
|
# { number: 2, pieces: [] }
|
69
69
|
# ],
|
70
70
|
# off_board: {
|
@@ -79,51 +79,52 @@ module JustBackgammon
|
|
79
79
|
@points = JustBackgammon::PointSet.load(points: points)
|
80
80
|
@off_board = JustBackgammon::OffBoard.load(off_board)
|
81
81
|
@errors = []
|
82
|
+
@last_change = {}
|
82
83
|
end
|
83
84
|
|
84
85
|
# Instantiates a new GameState object in the starting position
|
85
86
|
#
|
86
87
|
# @return [GameState]
|
87
88
|
def self.default
|
88
|
-
new(
|
89
|
+
new(
|
89
90
|
current_player_number: 1,
|
90
91
|
current_phase: ROLL,
|
91
92
|
dice: [
|
92
|
-
{ number: nil },
|
93
|
-
{ number: nil }
|
93
|
+
{ id: 1, number: nil },
|
94
|
+
{ id: 2, number: nil }
|
94
95
|
],
|
95
96
|
bar: { pieces: [] },
|
96
97
|
points: [
|
97
|
-
{ number: 1, pieces: [{
|
98
|
+
{ number: 1, pieces: [{id: 1, player_number: 1}, {id: 2, player_number: 1}] },
|
98
99
|
{ number: 2, pieces: [] },
|
99
100
|
{ number: 3, pieces: [] },
|
100
101
|
{ number: 4, pieces: [] },
|
101
102
|
{ number: 5, pieces: [] },
|
102
|
-
{ number: 6, pieces: [{
|
103
|
+
{ number: 6, pieces: [{id: 3, player_number: 2}, {id: 4, player_number: 2}, {id: 5, player_number: 2}, {id: 6, player_number: 2}, {id: 7, player_number: 2}] },
|
103
104
|
|
104
105
|
{ number: 7, pieces: [] },
|
105
|
-
{ number: 8, pieces: [{
|
106
|
+
{ number: 8, pieces: [{id: 8, player_number: 2}, {id: 9, player_number: 2}, {id: 10, player_number: 2}] },
|
106
107
|
{ number: 9, pieces: [] },
|
107
108
|
{ number: 10, pieces: [] },
|
108
109
|
{ number: 11, pieces: [] },
|
109
|
-
{ number: 12, pieces: [{
|
110
|
+
{ number: 12, pieces: [{id: 11, player_number: 1}, {id: 12, player_number: 1}, {id: 13, player_number: 1}, {id: 14, player_number: 1}, {id: 15, player_number: 1}] },
|
110
111
|
|
111
|
-
{ number: 13, pieces: [{
|
112
|
+
{ number: 13, pieces: [{id: 16, player_number: 2}, {id: 17, player_number: 2}, {id: 18, player_number: 2}, {id: 19, player_number: 2}, {id: 20, player_number: 2}] },
|
112
113
|
{ number: 14, pieces: [] },
|
113
114
|
{ number: 15, pieces: [] },
|
114
115
|
{ number: 16, pieces: [] },
|
115
|
-
{ number: 17, pieces: [{
|
116
|
+
{ number: 17, pieces: [{id: 21, player_number: 1}, {id: 22, player_number: 1}, {id: 23, player_number: 1}] },
|
116
117
|
{ number: 18, pieces: [] },
|
117
118
|
|
118
|
-
{ number: 19, pieces: [{
|
119
|
+
{ number: 19, pieces: [{id: 24, player_number: 1}, {id: 25, player_number: 1}, {id: 26, player_number: 1}, {id: 27, player_number: 1}, {id: 28, player_number: 1}] },
|
119
120
|
{ number: 20, pieces: [] },
|
120
121
|
{ number: 21, pieces: [] },
|
121
122
|
{ number: 22, pieces: [] },
|
122
123
|
{ number: 23, pieces: [] },
|
123
|
-
{ number: 24, pieces: [{
|
124
|
+
{ number: 24, pieces: [{id: 29, player_number: 2}, {id: 30, player_number: 2}] },
|
124
125
|
],
|
125
126
|
off_board: { pieces: [] }
|
126
|
-
|
127
|
+
)
|
127
128
|
end
|
128
129
|
|
129
130
|
# @return [Fixnum] who's turn it is
|
@@ -147,6 +148,9 @@ module JustBackgammon
|
|
147
148
|
# @return [Array<Error>] errors if any.
|
148
149
|
attr_reader :errors
|
149
150
|
|
151
|
+
# @return [Hash] the last change made.
|
152
|
+
attr_reader :last_change
|
153
|
+
|
150
154
|
# Rolls the dice
|
151
155
|
#
|
152
156
|
# Two dice are rolled and returns true on success.
|
@@ -172,6 +176,7 @@ module JustBackgammon
|
|
172
176
|
else
|
173
177
|
@dice.roll
|
174
178
|
step
|
179
|
+
@last_change = { type: 'roll', data: { player_number: player_number, dice: @dice.as_json } }
|
175
180
|
end
|
176
181
|
|
177
182
|
@errors.none?
|
@@ -204,6 +209,7 @@ module JustBackgammon
|
|
204
209
|
elsif move_valid?(move_list)
|
205
210
|
perform_move(move_list)
|
206
211
|
step
|
212
|
+
@last_change = { type: 'move', data: { player_number: player_number, list: list }}
|
207
213
|
end
|
208
214
|
|
209
215
|
@errors.none?
|
@@ -261,18 +267,12 @@ module JustBackgammon
|
|
261
267
|
|
262
268
|
def perform_move(list) # :nodoc:
|
263
269
|
list.each do |move|
|
264
|
-
from =
|
265
|
-
to =
|
270
|
+
from = move.from
|
271
|
+
to = move.to
|
266
272
|
|
267
|
-
|
268
|
-
@bar.push(to.pop)
|
269
|
-
end
|
273
|
+
@bar.push(to.pop) if to.hittable?(current_player_number)
|
270
274
|
|
271
|
-
popped =
|
272
|
-
from.pop_for_player(current_player_number)
|
273
|
-
else
|
274
|
-
from.pop
|
275
|
-
end
|
275
|
+
popped = from.pop(current_player_number)
|
276
276
|
|
277
277
|
to.push(popped)
|
278
278
|
end
|
@@ -311,9 +311,9 @@ module JustBackgammon
|
|
311
311
|
|
312
312
|
def sanitize_list(move_list) # :nodoc:
|
313
313
|
moves = move_list.map do |move|
|
314
|
-
JustBackgammon::Move.new(
|
314
|
+
JustBackgammon::Move.new(from: find_point(move[:from]), to: find_point(move[:to]))
|
315
315
|
end
|
316
316
|
JustBackgammon::MoveList.new(moves: moves)
|
317
317
|
end
|
318
318
|
end
|
319
|
-
end
|
319
|
+
end
|
@@ -1,4 +1,3 @@
|
|
1
|
-
require 'just_backgammon/off_board'
|
2
1
|
require 'just_backgammon/piece'
|
3
2
|
|
4
3
|
module JustBackgammon
|
@@ -12,18 +11,18 @@ module JustBackgammon
|
|
12
11
|
# A new instance of OffBoard.
|
13
12
|
#
|
14
13
|
# @param [Array<Hash>] pieces
|
15
|
-
# All the pieces off board, each piece has an
|
14
|
+
# All the pieces off board, each piece has an player_number.
|
16
15
|
#
|
17
16
|
# ==== Example:
|
18
17
|
# # Instantiates a new OffBoard
|
19
18
|
# JustBackgammon::OffBoard.new({
|
20
|
-
# pieces: [{
|
19
|
+
# pieces: [{player_number: 1}, {player_number: 1}]
|
21
20
|
# })
|
22
21
|
def initialize(pieces:)
|
23
22
|
@pieces = Piece.load(pieces)
|
24
23
|
end
|
25
24
|
|
26
|
-
# @return [Array<Piece>] all the pieces on the bar, each piece has an
|
25
|
+
# @return [Array<Piece>] all the pieces on the bar, each piece has an player_number
|
27
26
|
attr_reader :pieces
|
28
27
|
|
29
28
|
# The identifier of the bar, returns the string 'bar'.
|
@@ -40,7 +39,7 @@ module JustBackgammon
|
|
40
39
|
#
|
41
40
|
# @return [Array<Piece>]
|
42
41
|
def pieces_owned_by_player(player_number)
|
43
|
-
pieces.select { |p| p.
|
42
|
+
pieces.select { |p| p.player_number == player_number }
|
44
43
|
end
|
45
44
|
|
46
45
|
# Number of pieces owned by the specified player.
|
@@ -63,6 +62,10 @@ module JustBackgammon
|
|
63
62
|
@pieces.push(piece)
|
64
63
|
end
|
65
64
|
|
65
|
+
def hittable?(_=nil)
|
66
|
+
false
|
67
|
+
end
|
68
|
+
|
66
69
|
# A hashed serialized representation of off board.
|
67
70
|
#
|
68
71
|
# @return [Hash]
|
@@ -70,4 +73,4 @@ module JustBackgammon
|
|
70
73
|
{ pieces: pieces.map(&:as_json) }
|
71
74
|
end
|
72
75
|
end
|
73
|
-
end
|
76
|
+
end
|
@@ -10,24 +10,31 @@ module JustBackgammon
|
|
10
10
|
|
11
11
|
# A new instance of Piece.
|
12
12
|
#
|
13
|
-
# @param [Fixnum]
|
13
|
+
# @param [Fixnum] id
|
14
|
+
# The identifier of the piece.
|
15
|
+
#
|
16
|
+
# @param [Fixnum] player_number
|
14
17
|
# The owner of the piece.
|
15
18
|
#
|
16
19
|
# ==== Example:
|
17
20
|
# # Instantiates a new Piece
|
18
|
-
# JustBackgammon::Piece.new(1)
|
19
|
-
def initialize(
|
20
|
-
@
|
21
|
+
# JustBackgammon::Piece.new(id: 1, player_number: 1)
|
22
|
+
def initialize(id: , player_number:)
|
23
|
+
@id = id
|
24
|
+
@player_number = player_number
|
21
25
|
end
|
22
26
|
|
27
|
+
# @return [Fixnum] the identifier of the piece.
|
28
|
+
attr_reader :id
|
29
|
+
|
23
30
|
# @return [Fixnum] the owner of the piece
|
24
|
-
attr_reader :
|
31
|
+
attr_reader :player_number
|
25
32
|
|
26
33
|
# A hashed serialized representation of the piece.
|
27
34
|
#
|
28
35
|
# @return [Hash]
|
29
36
|
def as_json
|
30
|
-
{
|
37
|
+
{ id: id, player_number: player_number }
|
31
38
|
end
|
32
39
|
end
|
33
|
-
end
|
40
|
+
end
|
@@ -22,7 +22,7 @@ module JustBackgammon
|
|
22
22
|
# ==== Example:
|
23
23
|
# # Instantiates a new Point
|
24
24
|
# JustBackgammon::Point.new({
|
25
|
-
# pieces: [{
|
25
|
+
# pieces: [{player_number: 1}, {player_number: 1}],
|
26
26
|
# number: 1
|
27
27
|
# })
|
28
28
|
def initialize(pieces: , number:)
|
@@ -42,7 +42,7 @@ module JustBackgammon
|
|
42
42
|
# Removes a piece and returns it.
|
43
43
|
#
|
44
44
|
# @return [Piece,NilClass]
|
45
|
-
def pop
|
45
|
+
def pop(_=nil)
|
46
46
|
@pieces.pop
|
47
47
|
end
|
48
48
|
|
@@ -57,14 +57,14 @@ module JustBackgammon
|
|
57
57
|
#
|
58
58
|
# @return [Boolean]
|
59
59
|
def owned_by_player?(player_number)
|
60
|
-
pieces.any? { |p| p.
|
60
|
+
pieces.any? { |p| p.player_number == player_number }
|
61
61
|
end
|
62
62
|
|
63
63
|
# Checks if point has pieces owned by the opponent of the specified player.
|
64
64
|
#
|
65
65
|
# @return [Boolean]
|
66
66
|
def owned_by_opponent?(player_number)
|
67
|
-
pieces.any? { |p| p.
|
67
|
+
pieces.any? { |p| p.player_number != player_number }
|
68
68
|
end
|
69
69
|
|
70
70
|
# Checks if point has more than one piece.
|
@@ -95,6 +95,10 @@ module JustBackgammon
|
|
95
95
|
end
|
96
96
|
end
|
97
97
|
|
98
|
+
def hittable?(player_number)
|
99
|
+
owned_by_opponent?(player_number) && blot?
|
100
|
+
end
|
101
|
+
|
98
102
|
# A hashed serialized representation of the bar.
|
99
103
|
#
|
100
104
|
# @return [Hash]
|
@@ -102,4 +106,4 @@ module JustBackgammon
|
|
102
106
|
{ number: number, pieces: pieces.map(&:as_json) }
|
103
107
|
end
|
104
108
|
end
|
105
|
-
end
|
109
|
+
end
|
metadata
CHANGED
@@ -1,14 +1,14 @@
|
|
1
1
|
--- !ruby/object:Gem::Specification
|
2
2
|
name: just_backgammon
|
3
3
|
version: !ruby/object:Gem::Version
|
4
|
-
version:
|
4
|
+
version: 1.1.0
|
5
5
|
platform: ruby
|
6
6
|
authors:
|
7
7
|
- Mark Humphreys
|
8
8
|
autorequire:
|
9
9
|
bindir: exe
|
10
10
|
cert_chain: []
|
11
|
-
date:
|
11
|
+
date: 2021-06-07 00:00:00.000000000 Z
|
12
12
|
dependencies:
|
13
13
|
- !ruby/object:Gem::Dependency
|
14
14
|
name: bundler
|
@@ -16,42 +16,42 @@ dependencies:
|
|
16
16
|
requirements:
|
17
17
|
- - "~>"
|
18
18
|
- !ruby/object:Gem::Version
|
19
|
-
version:
|
19
|
+
version: 2.1.4
|
20
20
|
type: :development
|
21
21
|
prerelease: false
|
22
22
|
version_requirements: !ruby/object:Gem::Requirement
|
23
23
|
requirements:
|
24
24
|
- - "~>"
|
25
25
|
- !ruby/object:Gem::Version
|
26
|
-
version:
|
26
|
+
version: 2.1.4
|
27
27
|
- !ruby/object:Gem::Dependency
|
28
28
|
name: rake
|
29
29
|
requirement: !ruby/object:Gem::Requirement
|
30
30
|
requirements:
|
31
31
|
- - "~>"
|
32
32
|
- !ruby/object:Gem::Version
|
33
|
-
version:
|
33
|
+
version: 13.0.1
|
34
34
|
type: :development
|
35
35
|
prerelease: false
|
36
36
|
version_requirements: !ruby/object:Gem::Requirement
|
37
37
|
requirements:
|
38
38
|
- - "~>"
|
39
39
|
- !ruby/object:Gem::Version
|
40
|
-
version:
|
40
|
+
version: 13.0.1
|
41
41
|
- !ruby/object:Gem::Dependency
|
42
42
|
name: minitest
|
43
43
|
requirement: !ruby/object:Gem::Requirement
|
44
44
|
requirements:
|
45
45
|
- - "~>"
|
46
46
|
- !ruby/object:Gem::Version
|
47
|
-
version:
|
47
|
+
version: 5.14.0
|
48
48
|
type: :development
|
49
49
|
prerelease: false
|
50
50
|
version_requirements: !ruby/object:Gem::Requirement
|
51
51
|
requirements:
|
52
52
|
- - "~>"
|
53
53
|
- !ruby/object:Gem::Version
|
54
|
-
version:
|
54
|
+
version: 5.14.0
|
55
55
|
description: Provides a representation of a backgammon game complete with rules enforcement
|
56
56
|
and serialisation.
|
57
57
|
email:
|
@@ -108,15 +108,14 @@ required_ruby_version: !ruby/object:Gem::Requirement
|
|
108
108
|
requirements:
|
109
109
|
- - ">="
|
110
110
|
- !ruby/object:Gem::Version
|
111
|
-
version: '2.
|
111
|
+
version: '2.7'
|
112
112
|
required_rubygems_version: !ruby/object:Gem::Requirement
|
113
113
|
requirements:
|
114
114
|
- - ">="
|
115
115
|
- !ruby/object:Gem::Version
|
116
116
|
version: '0'
|
117
117
|
requirements: []
|
118
|
-
|
119
|
-
rubygems_version: 2.5.1
|
118
|
+
rubygems_version: 3.1.2
|
120
119
|
signing_key:
|
121
120
|
specification_version: 4
|
122
121
|
summary: A backgammon engine written in ruby
|