software_challenge_client 21.0.0 → 21.0.1

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
2
  SHA256:
3
- metadata.gz: 74d3e7ec3f292ffb010f928e647171a6573202f61b154461f613cd2def89bfec
4
- data.tar.gz: f8cea2ed79f675c0a2c66e9c6aea6fd6c9b9b308de932f0e9df809b0e8812885
3
+ metadata.gz: fb6f7046235b14fdf74c293c8c4f1b40a014373f949e9c9987f1ee36db6e579f
4
+ data.tar.gz: 95cb06324e9ae3ef77e7a76200bd45f47af3176f18f744f138c835d14ef7ade2
5
5
  SHA512:
6
- metadata.gz: 3815a93d8336a3e48fe7244f72eb2afa484374ff692a9a7c0a8312c3ab6d469ad894c16684c534eb0dda55aa0cf30c9a657a73072b2c77a2460a3f15b854b646
7
- data.tar.gz: e591f2e1fbc51e025453174225811d35257c48ba2e2c64adc3bddc9df4401bcd69ab53fd85584db80b279561a5c09051dddbda5ef1d49aaf042f9e36f2cdb29d
6
+ metadata.gz: 382fe8164ebb55803018b0ebec3c04061d9fbc65e770702383190ea9a5279f5cb6e0ddcbb12e3a3b3057d31450f416f4388d3ddafb1e14447c15bd2fb16a937a
7
+ data.tar.gz: fa76ba63c8634597486a9b34665a0c731870a25ace4ddef3d4b9b05206b6c31e97077a2bf12106193e321dfec6225c99d3361435d8938229169e77ecad9b0c3a
@@ -1 +1 @@
1
- 2.7.2
1
+ 2.5.5
@@ -1,3 +1,7 @@
1
+ = 21.0.1
2
+
3
+ Improved performance and defined Ruby version 2.5.5 as minimum requirement
4
+
1
5
  = 21.0.0
2
6
 
3
7
  First version for game "Blokus"
@@ -100,7 +100,7 @@ class Board
100
100
  def fields_of_color(color, fields = [Coordinates.new(0, 0),
101
101
  Coordinates.new(0, BOARD_SIZE - 1),
102
102
  Coordinates.new(BOARD_SIZE - 1, BOARD_SIZE - 1),
103
- Coordinates.new(BOARD_SIZE - 1, 0)].filter { |it| field_at(it).color == color })
103
+ Coordinates.new(BOARD_SIZE - 1, 0)].select { |it| field_at(it).color == color })
104
104
  copy = Array.new(fields)
105
105
 
106
106
  copy.each do |field|
@@ -9,13 +9,6 @@ class Color < TypesafeEnum::Base
9
9
  new :RED, 'R'
10
10
  new :GREEN, 'G'
11
11
 
12
- # Implementiert den [] Operator für diese Klasse
13
- class << self
14
- def [](digit)
15
- constants.find { |const| const_get(const) == digit }
16
- end
17
- end
18
-
19
12
  # Gibt den color namen zurück
20
13
  def to_s
21
14
  self.key.to_s
@@ -70,10 +70,13 @@ class GameRuleLogic
70
70
  moves.merge(moves_for_shape_on(color, shape, Coordinates.new(BOARD_SIZE - area1.x, BOARD_SIZE - area1.y)))
71
71
  moves.merge(moves_for_shape_on(color, shape, Coordinates.new(BOARD_SIZE - area2.x, BOARD_SIZE - area2.y)))
72
72
 
73
- moves.filter { |m| valid_set_move?(gamestate, m) }.to_a
73
+ moves.select { |m| valid_set_move?(gamestate, m) }.to_a
74
74
  end
75
75
 
76
- # Helper method to calculate all transformations of one shape on one spot
76
+ # Hilfsmethode um Legezüge für eine [PieceShape] zu berechnen.
77
+ # @param color [Color] Die Farbe der Spielsteine der Züge
78
+ # @param shape [PieceShape] Die Form der Spielsteine der Züge
79
+ # @param position [Coordinates] Die Position der Spielsteine der Züge
77
80
  def self.moves_for_shape_on(color, shape, position)
78
81
  moves = Set[]
79
82
  Rotation.each do |r|
@@ -85,6 +88,7 @@ class GameRuleLogic
85
88
  end
86
89
 
87
90
  # Gib eine Liste aller möglichen Legezüge zurück, auch wenn es die erste Runde ist.
91
+ # @param gamestate [GameState] Der zu untersuchende Spielstand.
88
92
  def self.all_possible_setmoves(gamestate)
89
93
  moves = []
90
94
  fields = valid_fields(gamestate)
@@ -95,7 +99,7 @@ class GameRuleLogic
95
99
  end
96
100
 
97
101
  # Gibt eine Liste aller möglichen SetMoves für diese Form zurück.
98
- # @param gamestate Der aktuelle Spielstand
102
+ # @param gamestate [GameState] Der zu untersuchende Spielstand.
99
103
  # @param shape Die [PieceShape], die die Züge nutzen sollen
100
104
  #
101
105
  # @return Alle möglichen Züge mit der Form
@@ -104,20 +108,18 @@ class GameRuleLogic
104
108
 
105
109
  moves = Set[]
106
110
  fields.each do |field|
107
- Rotation.each do |r|
108
- [true, false].each do |f|
109
- piece = Piece.new(color, shape, r, f, Coordinates.new(0, 0))
110
- piece.coords.each do |pos|
111
- moves << SetMove.new(Piece.new(color, shape, r, f, Coordinates.new(field.x - pos.x, field.y - pos.y)))
112
- end
111
+ shape.unique_transforms().each do |t|
112
+ piece = Piece.new(color, shape, t.r, t.f, Coordinates.new(0, 0))
113
+ piece.coords.each do |pos|
114
+ moves << SetMove.new(Piece.new(color, shape, t.r, t.f, Coordinates.new(field.x - pos.x, field.y - pos.y)))
113
115
  end
114
116
  end
115
117
  end
116
- moves.filter { |m| valid_set_move?(gamestate, m) }.to_a
118
+ moves.select { |m| valid_set_move?(gamestate, m) }.to_a
117
119
  end
118
120
 
119
121
  # Gibt eine Liste aller Felder zurück, an denen möglicherweise Züge gemacht werden kann.
120
- # @param gamestate Der aktuelle Spielstand
122
+ # @param gamestate [GameState] Der zu untersuchende Spielstand.
121
123
  def self.valid_fields(gamestate)
122
124
  color = gamestate.current_color
123
125
  board = gamestate.board
@@ -138,9 +140,9 @@ class GameRuleLogic
138
140
  end
139
141
 
140
142
  # Überprüft, ob das gegebene Feld ein Nachbarfeld mit der Farbe [color] hat
141
- # @param board Das aktuelle Board
142
- # @param field Das zu überprüfende Feld
143
- # @param color Nach der zu suchenden Farbe
143
+ # @param board [Board] Das aktuelle Board
144
+ # @param field [Field] Das zu überprüfende Feld
145
+ # @param color [Color] Nach der zu suchenden Farbe
144
146
  def self.neighbor_of_color?(board, field, color)
145
147
  [Coordinates.new(field.x - 1, field.y),
146
148
  Coordinates.new(field.x, field.y - 1),
@@ -175,7 +177,7 @@ class GameRuleLogic
175
177
  # --- Move Validation ------------------------------------------------------------
176
178
 
177
179
  # Prüft, ob der gegebene [Move] zulässig ist.
178
- # @param gamestate der aktuelle Spielstand
180
+ # @param gamestate [GameState] Der zu untersuchende Spielstand.
179
181
  # @param move der zu überprüfende Zug
180
182
  #
181
183
  # @return ob der Zug zulässig ist
@@ -237,8 +239,8 @@ class GameRuleLogic
237
239
 
238
240
  # Überprüft, ob das gegebene Feld ein diagonales Nachbarfeld mit der Farbe [color] hat
239
241
  # @param board [Board] Das aktuelle Spielbrett
240
- # @param field Das zu überprüfende [Field]
241
- # @param color Nach der zu suchenden [Color]
242
+ # @param position [Field] Das zu überprüfende Feld
243
+ # @param color [Color] Nach der zu suchenden Farbe
242
244
  def self.corners_on_color?(board, position, color)
243
245
  [Coordinates.new(1, 1), Coordinates.new(1, -1), Coordinates.new(-1, -1), Coordinates.new(-1, 1)].any? do |it|
244
246
  board.in_bounds?(position + it) && board[position + it].color == color
@@ -56,6 +56,9 @@ class PieceShape < TypesafeEnum::Base
56
56
  new :PENTO_X, [c(1, 0), c(0, 1), c(1, 1), c(2, 1), c(1, 2)]
57
57
  new :PENTO_Y, [c(0, 1), c(1, 0), c(1, 1), c(1, 2), c(1, 3)]
58
58
 
59
+ @transformations
60
+ Transform = Struct.new(:r, :f, :coords)
61
+
59
62
  # Anzahl Felder, die der Stein belegt
60
63
  def size
61
64
  value.size
@@ -76,6 +79,29 @@ class PieceShape < TypesafeEnum::Base
76
79
  coordinates.rotate(rotation).flip(flip)
77
80
  end
78
81
 
82
+ # Gibt alle Kombinationen aus Rotation und Flipping zurück, welche zu einzigartigen
83
+ # Koordinatenmengen dieser Form führen.
84
+ # @return [Array<Transform>] Transform Structs mit Rotation r, Boolean f
85
+ def unique_transforms()
86
+ if not defined? @transformations then
87
+ existing_transforms = []
88
+
89
+ Rotation.each do |r|
90
+ [true, false].each do |f|
91
+ new_transform = Transform.new(r, f, transform(r, f))
92
+
93
+ if existing_transforms.none? { |t| t.coords == new_transform.coords } then
94
+ existing_transforms << new_transform
95
+ end
96
+ end
97
+ end
98
+
99
+ @transformations = existing_transforms
100
+ end
101
+
102
+ @transformations
103
+ end
104
+
79
105
  # Gibt den Form Namen zurück
80
106
  def to_s
81
107
  self.key.to_s
@@ -1,5 +1,5 @@
1
1
  # encoding: UTF-8
2
2
  # frozen_string_literal: true
3
3
  module SoftwareChallengeClient
4
- VERSION = '21.0.0'
4
+ VERSION = '21.0.1'
5
5
  end
@@ -19,7 +19,7 @@ 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.3'
22
+ spec.required_ruby_version = '>= 2.5.5'
23
23
  spec.add_dependency 'builder'
24
24
  spec.add_dependency 'typesafe_enum'
25
25
 
metadata CHANGED
@@ -1,7 +1,7 @@
1
1
  --- !ruby/object:Gem::Specification
2
2
  name: software_challenge_client
3
3
  version: !ruby/object:Gem::Version
4
- version: 21.0.0
4
+ version: 21.0.1
5
5
  platform: ruby
6
6
  authors:
7
7
  - 'kwollw '
@@ -10,7 +10,7 @@ authors:
10
10
  autorequire:
11
11
  bindir: exe
12
12
  cert_chain: []
13
- date: 2020-11-11 00:00:00.000000000 Z
13
+ date: 2020-11-20 00:00:00.000000000 Z
14
14
  dependencies:
15
15
  - !ruby/object:Gem::Dependency
16
16
  name: builder
@@ -321,14 +321,15 @@ required_ruby_version: !ruby/object:Gem::Requirement
321
321
  requirements:
322
322
  - - ">="
323
323
  - !ruby/object:Gem::Version
324
- version: '2.3'
324
+ version: 2.5.5
325
325
  required_rubygems_version: !ruby/object:Gem::Requirement
326
326
  requirements:
327
327
  - - ">="
328
328
  - !ruby/object:Gem::Version
329
329
  version: '0'
330
330
  requirements: []
331
- rubygems_version: 3.1.4
331
+ rubyforge_project:
332
+ rubygems_version: 2.7.6.2
332
333
  signing_key:
333
334
  specification_version: 4
334
335
  summary: Provides functions to build a client for the coding competition Software-Challenge