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 CHANGED
@@ -1,7 +1,7 @@
1
1
  ---
2
- SHA1:
3
- metadata.gz: c1ebb2844a2a6fef92a1ce1644cd4a16b984dbc0
4
- data.tar.gz: 29d1a815550ca78b52da80cf48c3b7ab135e92f8
2
+ SHA256:
3
+ metadata.gz: f9701bd389d703e4e3490389aca7cfa461ae8423ac1637cdab665b1c45ba8ac0
4
+ data.tar.gz: e8b8d3772b4e6d2f1f79985710786c775fcf7b0dd9925b7a8d993c4714b32b1e
5
5
  SHA512:
6
- metadata.gz: 3d06f071fb46878e406ddfe2bb16707cba385282cfe730d99a8e935f21647bb86212fe14898d247bbf86cab26a6b1f203c5853f725931275db535b492d428721
7
- data.tar.gz: e518b7e4825bb4e88656b301de9740bfa6137701ed3ff675b93d9add0cbf618072ee452e76e3a1ed45a7caefc68ec523a073a73624c4728b64ce63f7d414655d
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
@@ -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.1'
22
+ spec.required_ruby_version = '>= 2.7'
23
23
 
24
- spec.add_development_dependency "bundler", "~> 1.11"
25
- spec.add_development_dependency "rake", "~> 10.0"
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
@@ -19,7 +19,7 @@ module JustBackgammon
19
19
  # ==== Example:
20
20
  # # Instantiates a new Bar
21
21
  # JustBackgammon::Bar.new({
22
- # pieces: [{owner: 1}, {owner: 1}]
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.owner == player_number }
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 pop_for_player(player_number)
87
- p = pieces.find { |p| p.owner == player_number }
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.concat(@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
@@ -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: [{owner: 1}, {owner: 1}] },
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: [{owner: 1}, {owner: 1}] },
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: [{owner: 2}, {owner: 2}, {owner: 2}, {owner: 2}, {owner: 2}] },
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: [{owner: 2}, {owner: 2}, {owner: 2}] },
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: [{owner: 1}, {owner: 1}, {owner: 1}, {owner: 1}, {owner: 1}] },
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: [{owner: 2}, {owner: 2}, {owner: 2}, {owner: 2}, {owner: 2}] },
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: [{owner: 1}, {owner: 1}, {owner: 1}] },
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: [{owner: 1}, {owner: 1}, {owner: 1}, {owner: 1}, {owner: 1}] },
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: [{owner: 2}, {owner: 2}] },
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 = find_point(move.from.number)
265
- to = find_point(move.to.number)
270
+ from = move.from
271
+ to = move.to
266
272
 
267
- if to.is_a?(JustBackgammon::Point) && to.owned_by_opponent?(current_player_number) && to.blot?
268
- @bar.push(to.pop)
269
- end
273
+ @bar.push(to.pop) if to.hittable?(current_player_number)
270
274
 
271
- popped = if from.is_a?(JustBackgammon::Bar)
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({ from: find_point(move[:from]), to: find_point(move[:to]) })
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 owner.
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: [{owner: 1}, {owner: 1}]
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 owner
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.owner == player_number }
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] owner
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(owner:)
20
- @owner = owner
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 :owner
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
- { owner: owner }
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: [{owner: 1}, {owner: 1}],
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.owner == player_number }
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.owner != player_number }
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
@@ -1,4 +1,4 @@
1
1
  module JustBackgammon
2
2
  # :nodoc:
3
- VERSION = "0.1.2"
3
+ VERSION = "1.1.0"
4
4
  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: 0.1.2
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: 2016-09-22 00:00:00.000000000 Z
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: '1.11'
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: '1.11'
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: '10.0'
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: '10.0'
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: '5.0'
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: '5.0'
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.1'
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
- rubyforge_project:
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