qi 10.0.0.beta7 → 10.0.0.beta9

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.
Files changed (5) hide show
  1. checksums.yaml +4 -4
  2. data/README.md +5 -5
  3. data/lib/qi/error/drop.rb +8 -0
  4. data/lib/qi.rb +47 -11
  5. metadata +3 -2
checksums.yaml CHANGED
@@ -1,7 +1,7 @@
1
1
  ---
2
2
  SHA256:
3
- metadata.gz: e850bab495ea23b4c438ec54439eb4b4b0486d0b6d1afd23f9d9d870eca46e43
4
- data.tar.gz: 0f0e3271857d1a513069416bcb246b439f3fb99b3f550a9a9f1e1bc15b286a35
3
+ metadata.gz: 807fc7b14621e81663ea476f2d737352d455d4d2ab1d49efbe722c3ce571ed15
4
+ data.tar.gz: 9244deacf36f2717897a23b56de132af40ce308cd5977ee92899f57c49368f0e
5
5
  SHA512:
6
- metadata.gz: c94b483676c67796e208e2b354420c9fd20d0f286d2e3f4c6145a70945d61f601b8803af2ebed7bca964435881a27499a63f18151073f8bcf04126a65b265e2a
7
- data.tar.gz: 62665dedc27de056316e923fcf5e6e604de42c399b00b2b015b5a2e44049fae9f05cee3a95d08aaaf655f77a54f1ae923ebcfe69ec373ba37657aa45bb656b52
6
+ metadata.gz: 87cedbb94ddcecb3026647893aac63ce6559c92d37dc65121850efca0eb1ddd7a1616e441a0c40463a2bbe664de59d4498bbcfcfd3aa3caae6075a65851c57c5
7
+ data.tar.gz: 62a213dcaeb4d68cc6c4bc01b4d9b4a2df33b3d8bcca09c5e494e6a5b0eb349b236907437caa12c11777c6eaac559402e927f3db972f89acb4cd07f77408c4d9
data/README.md CHANGED
@@ -13,7 +13,7 @@
13
13
  Add this line to your application's Gemfile:
14
14
 
15
15
  ```ruby
16
- gem "qi", ">= 10.0.0.beta7"
16
+ gem "qi", ">= 10.0.0.beta9"
17
17
  ```
18
18
 
19
19
  And then execute:
@@ -45,8 +45,8 @@ qi0.south_captures # => ["S"]
45
45
  qi0.squares # => {3=>"s", 4=>"k", 5=>"s", 22=>"+P", 43=>"+B"}
46
46
  qi0.north_turn? # => false
47
47
  qi0.south_turn? # => true
48
- qi0.serialize # => "SouthTurn===S,b,g,g,g,g,n,n,n,n,p,p,p,p,p,p,p,p,p,p,p,p,p,p,p,p,p,r,r,s===3:s,4:k,5:s,22:+P,43:+B"
49
- qi0.inspect # => "<Qi SouthTurn===S,b,g,g,g,g,n,n,n,n,p,p,p,p,p,p,p,p,p,p,p,p,p,p,p,p,p,r,r,s===3:s,4:k,5:s,22:+P,43:+B>"
48
+ qi0.serialize # => "south-turn===S,b,g,g,g,g,n,n,n,n,p,p,p,p,p,p,p,p,p,p,p,p,p,p,p,p,p,r,r,s===3:s,4:k,5:s,22:+P,43:+B"
49
+ qi0.inspect # => "<Qi south-turn===S,b,g,g,g,g,n,n,n,n,p,p,p,p,p,p,p,p,p,p,p,p,p,p,p,p,p,r,r,s===3:s,4:k,5:s,22:+P,43:+B>"
50
50
 
51
51
  qi0.to_a
52
52
  # [false,
@@ -61,8 +61,8 @@ qi1.south_captures # => ["S"]
61
61
  qi1.squares # => {3=>"s", 4=>"k", 5=>"s", 22=>"+P", 13=>"+B"}
62
62
  qi1.north_turn? # => true
63
63
  qi1.south_turn? # => false
64
- qi1.serialize # => "NorthTurn===S,b,g,g,g,g,n,n,n,n,p,p,p,p,p,p,p,p,p,p,p,p,p,p,p,p,p,r,r,s===3:s,4:k,5:s,22:+P,13:+B"
65
- qi1.inspect # => "<Qi NorthTurn===S,b,g,g,g,g,n,n,n,n,p,p,p,p,p,p,p,p,p,p,p,p,p,p,p,p,p,r,r,s===3:s,4:k,5:s,22:+P,13:+B>"
64
+ qi1.serialize # => "north-turn===S,b,g,g,g,g,n,n,n,n,p,p,p,p,p,p,p,p,p,p,p,p,p,p,p,p,p,r,r,s===3:s,4:k,5:s,22:+P,13:+B"
65
+ qi1.inspect # => "<Qi north-turn===S,b,g,g,g,g,n,n,n,n,p,p,p,p,p,p,p,p,p,p,p,p,p,p,p,p,p,r,r,s===3:s,4:k,5:s,22:+P,13:+B>"
66
66
 
67
67
  qi1.to_a
68
68
  # [true,
@@ -0,0 +1,8 @@
1
+ # frozen_string_literal: true
2
+
3
+ class Qi
4
+ module Error
5
+ class Drop < ::IndexError
6
+ end
7
+ end
8
+ end
data/lib/qi.rb CHANGED
@@ -1,5 +1,8 @@
1
1
  # frozen_string_literal: true
2
2
 
3
+ require "digest"
4
+ require_relative "qi/error/drop"
5
+
3
6
  # A class that represents the state of a game.
4
7
  class Qi
5
8
  # @!attribute [r] north_captures
@@ -39,6 +42,37 @@ class Qi
39
42
  self.class.new(!north_turn?, *modified_captures, modified_squares)
40
43
  end
41
44
 
45
+ def eql?(other)
46
+ return false unless other.respond_to?(:serialize)
47
+
48
+ other.serialize == serialize
49
+ end
50
+ alias == eql?
51
+
52
+ def other_captures
53
+ if north_turn?
54
+ south_captures
55
+ else
56
+ north_captures
57
+ end
58
+ end
59
+
60
+ def owned_captures
61
+ if north_turn?
62
+ north_captures
63
+ else
64
+ south_captures
65
+ end
66
+ end
67
+
68
+ def side_name
69
+ if north_turn?
70
+ "north"
71
+ else
72
+ "south"
73
+ end
74
+ end
75
+
42
76
  # Checks if it is the north turn or not.
43
77
  #
44
78
  # @return [Boolean] true if it is the north turn and false otherwise
@@ -85,6 +119,11 @@ class Qi
85
119
  }
86
120
  end
87
121
 
122
+ # Returns the hash-code for the position.
123
+ def hash
124
+ ::Digest::SHA256.hexdigest(serialize)
125
+ end
126
+
88
127
  # Returns a string representation of the Qi object's attributes.
89
128
  #
90
129
  # @return [String] a string containing three parts separated by "===":
@@ -92,7 +131,7 @@ class Qi
92
131
  # - the captures, sorted and joined by ","
93
132
  # - the squares, mapped to "coordinate:piece" pairs and joined by ","
94
133
  def serialize
95
- serialized_turn = (north_turn? ? "NorthTurn" : "SouthTurn")
134
+ serialized_turn = "#{side_name}-turn"
96
135
  serialized_captures = (north_captures + south_captures).sort.join(",")
97
136
  serialized_squares = squares.keys.map { |i| "#{i}:#{squares.fetch(i)}" }.join(",")
98
137
 
@@ -116,14 +155,11 @@ class Qi
116
155
  def update_captures(in_hand, is_drop:)
117
156
  return [north_captures, south_captures] if in_hand.nil?
118
157
 
119
- captures = north_turn? ? north_captures : south_captures
120
- other_captures = north_turn? ? south_captures : north_captures
121
-
122
- if is_drop
123
- captures = remove_from_captures(in_hand, *captures)
124
- else
125
- captures += [in_hand]
126
- end
158
+ captures = if is_drop
159
+ remove_from_captures(in_hand, *owned_captures)
160
+ else
161
+ owned_captures + [in_hand]
162
+ end
127
163
 
128
164
  north_turn? ? [captures, other_captures] : [other_captures, captures]
129
165
  end
@@ -133,10 +169,10 @@ class Qi
133
169
  # @param piece [Object] the piece to be removed
134
170
  # @param captures [Array<Object>] the array of captures
135
171
  # @return [Array<Object>] the modified array of captures
136
- # @raise [IndexError] if the piece is not found in the array
172
+ # @raise [Qi::Error::Drop] if the piece is not found in the array
137
173
  def remove_from_captures(piece, *captures)
138
174
  index = captures.rindex(piece)
139
- raise ::IndexError, "#{piece} not found!" if index.nil?
175
+ raise Error::Drop, "There are no #{piece} in hand." if index.nil?
140
176
 
141
177
  captures.delete_at(index)
142
178
  captures
metadata CHANGED
@@ -1,14 +1,14 @@
1
1
  --- !ruby/object:Gem::Specification
2
2
  name: qi
3
3
  version: !ruby/object:Gem::Version
4
- version: 10.0.0.beta7
4
+ version: 10.0.0.beta9
5
5
  platform: ruby
6
6
  authors:
7
7
  - Cyril Kato
8
8
  autorequire:
9
9
  bindir: bin
10
10
  cert_chain: []
11
- date: 2023-05-02 00:00:00.000000000 Z
11
+ date: 2023-05-06 00:00:00.000000000 Z
12
12
  dependencies: []
13
13
  description: An abstraction that could help to update positions for games like Shogi.
14
14
  email: contact@cyril.email
@@ -19,6 +19,7 @@ files:
19
19
  - LICENSE.md
20
20
  - README.md
21
21
  - lib/qi.rb
22
+ - lib/qi/error/drop.rb
22
23
  homepage: https://github.com/sashite/qi.rb
23
24
  licenses:
24
25
  - MIT