codenjoy-client 0.1.002 → 0.1.003

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: a61b7902294632ba13ee721929b14d9c65fda4accda66cdd600bd36f6cf919a2
4
- data.tar.gz: '0865df29d554e8238cbfe0c4ce86cea470970c7726d7b65f49092d8e88dd077a'
3
+ metadata.gz: 5f6e2b556f20d5339438bcc59a9669cfa865fda7ead39b17a4f0dcdbe5565882
4
+ data.tar.gz: 425311003e3a408417152608e497aa0ac3000a69dceaca9dfb80a57878b9e03c
5
5
  SHA512:
6
- metadata.gz: 2156aaac83fd0376e0d0771258f295c9d587a2638f9f288c04a8a21bb32ea766ae585503d05330616acaa52ad05310fe6c992979a672a6a219bb320781aeb05b
7
- data.tar.gz: cd9586a757c9bc527924638d075bdfcf2c6f624a35e2002371d9aa1b5debc737deb699b7a2c181f42ac406bfe5dc6a9422abc229c43ac8279731ce9e27086b27
6
+ metadata.gz: 97033b697c2ff85718b30178e1876b2e2a2bfacccd4d4dd9af3fd023fff7dc6942155e92e080afbe7d4c34fe30ee7433c4c21d17a604b620318875931086ad83
7
+ data.tar.gz: 04c31405fcaea56dd5732afff1396e00addd9c92ddc633bc6bbbbf40061e92d742f1e49feb4a43f5af1fa9d2a0fb9c33b62ff6bf1a908add579b1348cd77ac5b
data/Gemfile.lock CHANGED
@@ -1,7 +1,7 @@
1
1
  PATH
2
2
  remote: .
3
3
  specs:
4
- codenjoy-client (0.1.002)
4
+ codenjoy-client (0.1.003)
5
5
  faye-websocket
6
6
 
7
7
  GEM
data/README.md CHANGED
@@ -1,8 +1,6 @@
1
1
  # Codenjoy::Client
2
2
 
3
- Welcome to your new gem! In this directory, you'll find the files you need to be able to package up your Ruby library into a gem. Put your Ruby code in the file `lib/codenjoy/client`. To experiment with that code, run `bin/console` for an interactive prompt.
4
-
5
- TODO: Delete this and the text above, and describe your gem
3
+ This is ruby client for https://github.com/codenjoyme/codenjoy project. It uses for playing dojorena.io.
6
4
 
7
5
  ## Installation
8
6
 
@@ -22,7 +20,11 @@ Or install it yourself as:
22
20
 
23
21
  ## Usage
24
22
 
25
- TODO: Write usage instructions here
23
+ After you install gem, you can create base client:
24
+
25
+ $ codenjoy-ruby-client
26
+
27
+ The file `game_base_client.rb` created at current folder. You should replace `url` and write your own code at `YourSolver` class.
26
28
 
27
29
  ## Development
28
30
 
@@ -30,6 +32,8 @@ After checking out the repo, run `bin/setup` to install dependencies. Then, run
30
32
 
31
33
  To install this gem onto your local machine, run `bundle exec rake install`. To release a new version, update the version number in `version.rb`, and then run `bundle exec rake release`, which will create a git tag for the version, push git commits and tags, and push the `.gem` file to [rubygems.org](https://rubygems.org).
32
34
 
35
+ For add new game crate new folder at `lib/codenjoy/games` and add necessary classes.
36
+
33
37
  ## Contributing
34
38
 
35
39
  Bug reports and pull requests are welcome on GitHub at https://github.com/[USERNAME]/codenjoy-client.
@@ -1,5 +1,5 @@
1
1
  module Codenjoy
2
2
  module Client
3
- VERSION = "0.1.002"
3
+ VERSION = "0.1.003"
4
4
  end
5
5
  end
@@ -24,7 +24,8 @@ class YourSolver
24
24
  end
25
25
 
26
26
  game = Codenjoy::Client::Game.new
27
- board = Codenjoy::Client::Games::Battlecity::Board.new
27
+ # board = Codenjoy::Client::Games::Battlecity::Board.new
28
+ board = Codenjoy::Client::Games::Tetris::Board.new
28
29
 
29
30
  url = "https://dojorena.io/codenjoy-contest/board/player/70xewv6o7ddy9yphm1u0?code=2603484461919438773&gameName=battlecity"
30
31
  count = 0
@@ -20,57 +20,9 @@
20
20
  # #L%
21
21
  ###
22
22
 
23
+ require "codenjoy/utils"
23
24
  require 'json'
24
25
 
25
- # Point class
26
- class Point
27
- attr_accessor :x
28
- attr_accessor :y
29
-
30
- # Coords (1,1) - upper left side of field
31
- #
32
- # @param [Integer] x X coord
33
- # @param [Integer] y Y coord
34
- def initialize(x, y)
35
- @x = x
36
- @y = y
37
- end
38
-
39
- # Override of compare method for Point
40
- def == (other_object)
41
- other_object.x == @x && other_object.y == @y
42
- end
43
-
44
- # For better +.inspect+ output
45
- def to_s
46
- "[#{@x},#{@y}]"
47
- end
48
-
49
- # Position of point above current
50
- def up
51
- Point.new(@x, @y + 1)
52
- end
53
-
54
- # Position of point below current
55
- def down
56
- Point.new(@x, @y - 1)
57
- end
58
-
59
- # Position of point on the left side
60
- def left
61
- Point.new(@x - 1, @y)
62
- end
63
-
64
- # Position of point on the right side
65
- def right
66
- Point.new(@x + 1, @y)
67
- end
68
-
69
- def out_of?(board_size)
70
- x >= board_size || y >= board_size || x < 0 || y < 0;
71
- end
72
- end
73
-
74
26
  class LengthToXY
75
27
  def initialize(board_size)
76
28
  @board_size = board_size
@@ -101,205 +53,205 @@ end
101
53
  module Codenjoy
102
54
  module Client
103
55
  module Games
56
+ module Battlecity
57
+ end
104
58
  end
105
59
  end
106
60
  end
107
61
 
108
- module Codenjoy::Client::Games::Battlecity
109
- class Board
110
-
111
- ELEMENTS = {
112
- NONE: ' ',
113
- BATTLE_WALL: '',
114
- BANG: 'Ѡ',
115
-
116
- CONSTRUCTION: '╬',
117
-
118
- CONSTRUCTION_DESTROYED_DOWN: '',
119
- CONSTRUCTION_DESTROYED_UP: '',
120
- CONSTRUCTION_DESTROYED_LEFT: '',
121
- CONSTRUCTION_DESTROYED_RIGHT: '╣',
122
-
123
- CONSTRUCTION_DESTROYED_DOWN_TWICE: '',
124
- CONSTRUCTION_DESTROYED_UP_TWICE: '',
125
- CONSTRUCTION_DESTROYED_LEFT_TWICE: '',
126
- CONSTRUCTION_DESTROYED_RIGHT_TWICE: '╡',
127
-
128
- CONSTRUCTION_DESTROYED_LEFT_RIGHT: '',
129
- CONSTRUCTION_DESTROYED_UP_DOWN: '─',
130
-
131
- CONSTRUCTION_DESTROYED_UP_LEFT: '',
132
- CONSTRUCTION_DESTROYED_RIGHT_UP: '',
133
- CONSTRUCTION_DESTROYED_DOWN_LEFT: '',
134
- CONSTRUCTION_DESTROYED_DOWN_RIGHT: '┘',
135
-
136
- CONSTRUCTION_DESTROYED: ' ',
137
-
138
- BULLET: '•',
139
-
140
- TANK_UP: '',
141
- TANK_RIGHT: '',
142
- TANK_DOWN: '',
143
- TANK_LEFT: '◄',
144
-
145
- OTHER_TANK_UP: '˄',
146
- OTHER_TANK_RIGHT: '˃',
147
- OTHER_TANK_DOWN: '˅',
148
- OTHER_TANK_LEFT: '˂',
149
-
150
- AI_TANK_UP: '?',
151
- AI_TANK_RIGHT: '»',
152
- AI_TANK_DOWN: '¿',
153
- AI_TANK_LEFT: '«'
154
- }
155
-
156
- ENEMIES = [
157
- ELEMENTS[:AI_TANK_UP],
158
- ELEMENTS[:AI_TANK_DOWN],
159
- ELEMENTS[:AI_TANK_LEFT],
160
- ELEMENTS[:AI_TANK_RIGHT],
161
- ELEMENTS[:OTHER_TANK_UP],
162
- ELEMENTS[:OTHER_TANK_DOWN],
163
- ELEMENTS[:OTHER_TANK_LEFT],
164
- ELEMENTS[:OTHER_TANK_RIGHT]
165
- ]
166
-
167
- TANK = [
168
- ELEMENTS[:TANK_UP],
169
- ELEMENTS[:TANK_DOWN],
170
- ELEMENTS[:TANK_LEFT],
171
- ELEMENTS[:TANK_RIGHT]
172
- ]
173
-
174
- BARRIERS = [
175
- ELEMENTS[:BATTLE_WALL],
176
- ELEMENTS[:CONSTRUCTION],
177
- ELEMENTS[:CONSTRUCTION_DESTROYED_DOWN],
178
- ELEMENTS[:CONSTRUCTION_DESTROYED_UP],
179
- ELEMENTS[:CONSTRUCTION_DESTROYED_LEFT],
180
- ELEMENTS[:CONSTRUCTION_DESTROYED_RIGHT],
181
- ELEMENTS[:CONSTRUCTION_DESTROYED_DOWN_TWICE],
182
- ELEMENTS[:CONSTRUCTION_DESTROYED_UP_TWICE],
183
- ELEMENTS[:CONSTRUCTION_DESTROYED_LEFT_TWICE],
184
- ELEMENTS[:CONSTRUCTION_DESTROYED_RIGHT_TWICE],
185
- ELEMENTS[:CONSTRUCTION_DESTROYED_LEFT_RIGHT],
186
- ELEMENTS[:CONSTRUCTION_DESTROYED_UP_DOWN],
187
- ELEMENTS[:CONSTRUCTION_DESTROYED_UP_LEFT],
188
- ELEMENTS[:CONSTRUCTION_DESTROYED_RIGHT_UP],
189
- ELEMENTS[:CONSTRUCTION_DESTROYED_DOWN_LEFT],
190
- ELEMENTS[:CONSTRUCTION_DESTROYED_DOWN_RIGHT]
191
- ]
192
-
193
- def process(data)
194
- @raw = data
195
- end
62
+ class Codenjoy::Client::Games::Battlecity::Board
63
+
64
+ ELEMENTS = {
65
+ NONE: ' ',
66
+ BATTLE_WALL: '',
67
+ BANG: 'Ѡ',
68
+
69
+ CONSTRUCTION: '╬',
70
+
71
+ CONSTRUCTION_DESTROYED_DOWN: '╩',
72
+ CONSTRUCTION_DESTROYED_UP: '',
73
+ CONSTRUCTION_DESTROYED_LEFT: '',
74
+ CONSTRUCTION_DESTROYED_RIGHT: '',
75
+
76
+ CONSTRUCTION_DESTROYED_DOWN_TWICE: '╨',
77
+ CONSTRUCTION_DESTROYED_UP_TWICE: '',
78
+ CONSTRUCTION_DESTROYED_LEFT_TWICE: '',
79
+ CONSTRUCTION_DESTROYED_RIGHT_TWICE: '',
80
+
81
+ CONSTRUCTION_DESTROYED_LEFT_RIGHT: '│',
82
+ CONSTRUCTION_DESTROYED_UP_DOWN: '',
83
+
84
+ CONSTRUCTION_DESTROYED_UP_LEFT: '┌',
85
+ CONSTRUCTION_DESTROYED_RIGHT_UP: '',
86
+ CONSTRUCTION_DESTROYED_DOWN_LEFT: '',
87
+ CONSTRUCTION_DESTROYED_DOWN_RIGHT: '',
88
+
89
+ CONSTRUCTION_DESTROYED: ' ',
90
+
91
+ BULLET: '•',
92
+
93
+ TANK_UP: '▲',
94
+ TANK_RIGHT: '',
95
+ TANK_DOWN: '',
96
+ TANK_LEFT: '',
97
+
98
+ OTHER_TANK_UP: '˄',
99
+ OTHER_TANK_RIGHT: '˃',
100
+ OTHER_TANK_DOWN: '˅',
101
+ OTHER_TANK_LEFT: '˂',
102
+
103
+ AI_TANK_UP: '?',
104
+ AI_TANK_RIGHT: '»',
105
+ AI_TANK_DOWN: '¿',
106
+ AI_TANK_LEFT: '«'
107
+ }
108
+
109
+ ENEMIES = [
110
+ ELEMENTS[:AI_TANK_UP],
111
+ ELEMENTS[:AI_TANK_DOWN],
112
+ ELEMENTS[:AI_TANK_LEFT],
113
+ ELEMENTS[:AI_TANK_RIGHT],
114
+ ELEMENTS[:OTHER_TANK_UP],
115
+ ELEMENTS[:OTHER_TANK_DOWN],
116
+ ELEMENTS[:OTHER_TANK_LEFT],
117
+ ELEMENTS[:OTHER_TANK_RIGHT]
118
+ ]
119
+
120
+ TANK = [
121
+ ELEMENTS[:TANK_UP],
122
+ ELEMENTS[:TANK_DOWN],
123
+ ELEMENTS[:TANK_LEFT],
124
+ ELEMENTS[:TANK_RIGHT]
125
+ ]
126
+
127
+ BARRIERS = [
128
+ ELEMENTS[:BATTLE_WALL],
129
+ ELEMENTS[:CONSTRUCTION],
130
+ ELEMENTS[:CONSTRUCTION_DESTROYED_DOWN],
131
+ ELEMENTS[:CONSTRUCTION_DESTROYED_UP],
132
+ ELEMENTS[:CONSTRUCTION_DESTROYED_LEFT],
133
+ ELEMENTS[:CONSTRUCTION_DESTROYED_RIGHT],
134
+ ELEMENTS[:CONSTRUCTION_DESTROYED_DOWN_TWICE],
135
+ ELEMENTS[:CONSTRUCTION_DESTROYED_UP_TWICE],
136
+ ELEMENTS[:CONSTRUCTION_DESTROYED_LEFT_TWICE],
137
+ ELEMENTS[:CONSTRUCTION_DESTROYED_RIGHT_TWICE],
138
+ ELEMENTS[:CONSTRUCTION_DESTROYED_LEFT_RIGHT],
139
+ ELEMENTS[:CONSTRUCTION_DESTROYED_UP_DOWN],
140
+ ELEMENTS[:CONSTRUCTION_DESTROYED_UP_LEFT],
141
+ ELEMENTS[:CONSTRUCTION_DESTROYED_RIGHT_UP],
142
+ ELEMENTS[:CONSTRUCTION_DESTROYED_DOWN_LEFT],
143
+ ELEMENTS[:CONSTRUCTION_DESTROYED_DOWN_RIGHT]
144
+ ]
145
+
146
+ def process(data)
147
+ @raw = data
148
+ end
196
149
 
197
- def size
198
- @size ||= Math.sqrt(@raw.length);
199
- end
150
+ def size
151
+ @size ||= Math.sqrt(@raw.length);
152
+ end
200
153
 
201
- def xyl
202
- @xyl ||= LengthToXY.new(size);
203
- end
154
+ def xyl
155
+ @xyl ||= LengthToXY.new(size);
156
+ end
204
157
 
205
- def getAt(x, y)
206
- return false if Point.new(x, y).out_of?(size)
207
- @raw[xyl.getLength(x, y)];
208
- end
158
+ def getAt(x, y)
159
+ return false if Point.new(x, y).out_of?(size)
160
+ @raw[xyl.getLength(x, y)];
161
+ end
209
162
 
210
- def at?(x, y, element)
211
- return false if Point.new(x, y).out_of?(size)
212
- getAt(x, y) == element;
213
- end
163
+ def at?(x, y, element)
164
+ return false if Point.new(x, y).out_of?(size)
165
+ getAt(x, y) == element;
166
+ end
214
167
 
215
- def findAll(element)
216
- result = []
217
- @raw.length.times do |i|
218
- point = xyl.getXY(i);
219
- result.push(point) if at?(point.x, point.y, element)
220
- end
221
- result;
168
+ def findAll(element)
169
+ result = []
170
+ @raw.length.times do |i|
171
+ point = xyl.getXY(i);
172
+ result.push(point) if at?(point.x, point.y, element)
222
173
  end
174
+ result;
175
+ end
223
176
 
224
- def get_me
225
- me = find_by_list(TANK)
226
- return nil if me.nil?
227
- find_by_list(TANK).flatten
228
- end
177
+ def get_me
178
+ me = find_by_list(TANK)
179
+ return nil if me.nil?
180
+ find_by_list(TANK).flatten
181
+ end
229
182
 
230
- def find_by_list(list)
231
- result = list.map{ |e| findAll(e) }.flatten.map{ |e| [e.x, e.y] }
232
- return nil if (result.length == 0)
233
- result
234
- end
183
+ def find_by_list(list)
184
+ result = list.map{ |e| findAll(e) }.flatten.map{ |e| [e.x, e.y] }
185
+ return nil if (result.length == 0)
186
+ result
187
+ end
235
188
 
236
- def get_enemies
237
- find_by_list(ENEMIES)
238
- end
189
+ def get_enemies
190
+ find_by_list(ENEMIES)
191
+ end
239
192
 
240
- def get_bullets
241
- find_by_list([ELEMENTS[:BULLET]])
242
- end
193
+ def get_bullets
194
+ find_by_list([ELEMENTS[:BULLET]])
195
+ end
243
196
 
244
- def get_near(x, y)
245
- return false if Point.new(x, y).out_of?(size)
246
- result = []
247
- (-1..1).each do |dx|
248
- (-1..1).each do |dy|
249
- next if (dx == 0 && dy == 0)
250
- result.push(getAt(x + dx, y + dy))
251
- end
197
+ def get_near(x, y)
198
+ return false if Point.new(x, y).out_of?(size)
199
+ result = []
200
+ (-1..1).each do |dx|
201
+ (-1..1).each do |dy|
202
+ next if (dx == 0 && dy == 0)
203
+ result.push(getAt(x + dx, y + dy))
252
204
  end
253
- result;
254
205
  end
206
+ result;
207
+ end
255
208
 
256
- def barrier_at?(x, y)
257
- return false if Point.new(x, y).out_of?(size)
258
- get_barriers.include?([x.to_f, y.to_f]);
259
- end
209
+ def barrier_at?(x, y)
210
+ return false if Point.new(x, y).out_of?(size)
211
+ get_barriers.include?([x.to_f, y.to_f]);
212
+ end
260
213
 
261
- def count_near(x, y, element)
262
- get_near(x, y).select{ |e| e == element}.size
263
- end
214
+ def count_near(x, y, element)
215
+ get_near(x, y).select{ |e| e == element}.size
216
+ end
264
217
 
265
- def near?(x, y, element)
266
- n = get_near(x, y)
267
- return false if !n
268
- n.include?(element);
269
- end
218
+ def near?(x, y, element)
219
+ n = get_near(x, y)
220
+ return false if !n
221
+ n.include?(element);
222
+ end
270
223
 
271
- def bullet_at?(x, y)
272
- return false if Point.new(x, y).out_of?(size)
273
- getAt(x, y) == ELEMENTS[:BULLET]
274
- end
224
+ def bullet_at?(x, y)
225
+ return false if Point.new(x, y).out_of?(size)
226
+ getAt(x, y) == ELEMENTS[:BULLET]
227
+ end
275
228
 
276
- def any_of_at?(x, y, elements = [])
277
- return false if Point.new(x, y).out_of?(size)
278
- elements.each do |e|
279
- return true if at?(x, y, e)
280
- end
281
- false;
229
+ def any_of_at?(x, y, elements = [])
230
+ return false if Point.new(x, y).out_of?(size)
231
+ elements.each do |e|
232
+ return true if at?(x, y, e)
282
233
  end
234
+ false;
235
+ end
283
236
 
284
- def game_over?
285
- get_me.nil?;
286
- end
237
+ def game_over?
238
+ get_me.nil?;
239
+ end
287
240
 
288
- def board_to_s
289
- Array.new(size).each_with_index.map{ |e, n| @raw[(n * size)..((n + 1) * size - 1)]}.join("\n")
290
- end
241
+ def board_to_s
242
+ Array.new(size).each_with_index.map{ |e, n| @raw[(n * size)..((n + 1) * size - 1)]}.join("\n")
243
+ end
291
244
 
292
- def get_barriers
293
- find_by_list(BARRIERS)
294
- end
245
+ def get_barriers
246
+ find_by_list(BARRIERS)
247
+ end
295
248
 
296
- def to_s
297
- [
298
- "Board:\n#{board_to_s}",
299
- "My tank at: #{get_me}",
300
- "Enemies at: #{get_enemies}",
301
- "Bullets at: #{get_bullets}"
302
- ].join("\n")
303
- end
249
+ def to_s
250
+ [
251
+ "Board:\n#{board_to_s}",
252
+ "My tank at: #{get_me}",
253
+ "Enemies at: #{get_enemies}",
254
+ "Bullets at: #{get_bullets}"
255
+ ].join("\n")
304
256
  end
305
257
  end
@@ -0,0 +1,265 @@
1
+ ###
2
+ # #%L
3
+ # Codenjoy - it's a dojo-like platform from developers to developers.
4
+ # %%
5
+ # Copyright (C) 2018 Codenjoy
6
+ # %%
7
+ # This program is free software: you can redistribute it and/or modify
8
+ # it under the terms of the GNU General Public License as
9
+ # published by the Free Software Foundation, either version 3 of the
10
+ # License, or (at your option) any later version.
11
+ #
12
+ # This program is distributed in the hope that it will be useful,
13
+ # but WITHOUT ANY WARRANTY; without even the implied warranty of
14
+ # MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
15
+ # GNU General Public License for more details.
16
+ #
17
+ # You should have received a copy of the GNU General Public
18
+ # License along with this program. If not, see
19
+ # <http://www.gnu.org/licenses/gpl-3.0.html>.
20
+ # #L%
21
+ ###
22
+ require 'json'
23
+
24
+ ##################################### ELEMENTS TYPES #########################################################
25
+
26
+ ELEMENTS = Hash.new
27
+
28
+ # This is glass content
29
+ ELEMENTS[:I_BLUE] = 'I'
30
+ ELEMENTS[:J_CYAN] = 'J'
31
+ ELEMENTS[:L_ORANGE] = 'L'
32
+ ELEMENTS[:O_YELLOW] = 'O'
33
+ ELEMENTS[:S_GREEN] = 'S'
34
+ ELEMENTS[:T_PURPLE] = 'T'
35
+ ELEMENTS[:Z_RED] = 'Z'
36
+ ELEMENTS[:NONE] = '.'
37
+
38
+ # List of figures
39
+ FIGURES = [
40
+ ELEMENTS[:I_BLUE],
41
+ ELEMENTS[:J_CYAN],
42
+ ELEMENTS[:L_ORANGE],
43
+ ELEMENTS[:O_YELLOW],
44
+ ELEMENTS[:S_GREEN],
45
+ ELEMENTS[:T_PURPLE],
46
+ ELEMENTS[:Z_RED]
47
+ ]
48
+
49
+ ##################################### END OF ELEMENTS TYPES #########################################################
50
+
51
+ # Return list of indexes of char +char+ in string +s+ ("STR".index returns only first char/string appear)
52
+ #
53
+ # @param [String] s string to search in
54
+ # @param [String] char substring to search
55
+ # @return [Array] list of indexes
56
+ def indexes(s, char)
57
+ (0 ... s.length).find_all { |i| s[i,1] == char }
58
+ end
59
+
60
+ def compare(pt1, pt2)
61
+ if (pt1.x <=> pt2.x) != 0
62
+ pt1.x <=> pt2.x
63
+ else
64
+ pt1.y <=> pt2.y
65
+ end
66
+ end
67
+
68
+ def sort(array)
69
+ array.sort { |pt1, pt2| compare(pt1, pt2) }
70
+ end
71
+
72
+ module Codenjoy
73
+ module Client
74
+ module Games
75
+ module Tetris
76
+ end
77
+ end
78
+ end
79
+ end
80
+
81
+ class Codenjoy::Client::Games::Tetris::Board
82
+ attr_accessor :board
83
+ attr_accessor :size
84
+ attr_accessor :current_figure_type
85
+ attr_accessor :future_figures
86
+ attr_accessor :current_figure_point
87
+
88
+ def process(str)
89
+ puts "-------------------------------------------------------------------------------------------"
90
+ json = JSON.parse(str)
91
+ @board = json["layers"][0]
92
+ @size = Math.sqrt(@board.length).round
93
+ @current_figure_type = json["currentFigureType"]
94
+ @future_figures = json["futureFigures"]
95
+ @current_figure_point = Point.new(json["currentFigurePoint"]["x"], json["currentFigurePoint"]["y"])
96
+ end
97
+
98
+ def to_s
99
+ return ("currentFigure: \"" + @current_figure_type + "\" at: " + @current_figure_point.to_s + "\n" +
100
+ "futureFigures: " + @future_figures.to_s + "\n" +
101
+ "board:" + "\n" +
102
+ @board.scan(/.{#{@size}}|.+/).join("\n"))
103
+ end
104
+
105
+ # Returns board size
106
+ # @return [Integer] board size
107
+ def size
108
+ Math.sqrt(board.length).to_i
109
+ end
110
+
111
+ # Get object at position
112
+ #
113
+ # @param [Point] point position
114
+ # @return [String] char with object, compare with +ELEMENTS[...]+
115
+ def get_at(point)
116
+ board[coords_to_pos(point)]
117
+ end
118
+
119
+ # Is element type/s is at specified X,Y?
120
+ #
121
+ # @param [Point] point position
122
+ # @param [String, Array] element one or array of +ELEMENTS[...]+
123
+ # @return [Boolean] if +element+ at position
124
+ def is_at?(point, element)
125
+ if element.is_a?(Array)
126
+ element.include?(get_at(point))
127
+ elsif element.is_a?(String)
128
+ get_at(point) == element
129
+ else
130
+ raise ArgumentError.new("Invalid argument type #{element.class}")
131
+ end
132
+ end
133
+
134
+ # Check if element is near position
135
+ #
136
+ # @param [Point] point position
137
+ # @param [String, Array] element one or array of +ELEMENTS[...]+
138
+ def get_near(point)
139
+ res = []
140
+
141
+ for dx in -1..1
142
+ for dy in -1..1
143
+ if dx == 0 && dy == 0
144
+ next
145
+ end
146
+ res << get_at(Point.new(point.x + dx, point.y + dy))
147
+ end
148
+ end
149
+
150
+ res.empty? ? nil : res
151
+ end
152
+
153
+ # Count how many objects of specified type around position
154
+ #
155
+ # @param [Point] point position
156
+ # @param [String, Array] element one or array of +ELEMENTS[...]+
157
+ # @return [Integer] number of objects around
158
+ def count_near(point, element)
159
+ elements = get_near(point)
160
+ elements.count { |it| it == element }
161
+ end
162
+
163
+ # Count how many objects of specified type around position
164
+ #
165
+ # @param [Point] point position
166
+ # @param [String, Array] element one or array of +ELEMENTS[...]+
167
+ # @return [Integer] number of objects around
168
+ def is_near?(point, element)
169
+ elements = get_near(point)
170
+ elements.find { |it| it == element } != nil
171
+ end
172
+
173
+ # Check if figures (elements of +FIGURES+ array) at position
174
+ #
175
+ # @param [Point] point position
176
+ # @return [Boolean] true if barrier at
177
+ def is_free?(point)
178
+ element = board[coords_to_pos(point)]
179
+ !FIGURES.include? element
180
+ end
181
+
182
+ # List of given elements
183
+ #
184
+ # @param [String, Array] element one or array of +ELEMENTS[...]+
185
+ # @return [Array[Point]] list of barriers on the filed
186
+ def get(element)
187
+ res = []
188
+ pos = 0
189
+ board.chars.each do |ch|
190
+ if element.is_a?(Array)
191
+ res << pos_to_coords(pos) if element.include? ch
192
+ elsif element.is_a?(String)
193
+ res << pos_to_coords(pos) if element == ch
194
+ else
195
+ raise ArgumentError.new("Invalid argument type #{element.class}")
196
+ end
197
+ pos += 1
198
+ end
199
+
200
+ sort(res)
201
+ end
202
+
203
+ # List of busy spaces in the glass
204
+ #
205
+ # @return [Array[Point]] list of barriers on the filed
206
+ def get_figures
207
+ get(FIGURES)
208
+ end
209
+
210
+ # Return list of free spaces in the glass
211
+ #
212
+ # @return [Array[Point]] array of walls positions
213
+ def get_free_space
214
+ get(ELEMENTS[:NONE])
215
+ end
216
+
217
+ # How far specified element from position (strait direction)
218
+ # Return +size+ if wall in specified direction
219
+ #
220
+ # @param [Point] point position
221
+ # @param [String] direction direction 'UP', 'DOWN', 'LEFT', 'RIGHT'
222
+ # @param [String] element on of +ELEMENTS[...]+
223
+ # @return [Integer] distance
224
+ def next_element_in_direction(point, direction, element)
225
+ dirs = {
226
+ 'UP' => [0, -1],
227
+ 'DOWN' => [0, +1],
228
+ 'LEFT' => [-1, 0],
229
+ 'RIGHT' => [+1, 0],
230
+ }
231
+
232
+ (1..size).each do |distance|
233
+ el = get_at(
234
+ Point.new(
235
+ (point.x + distance * dirs[direction].first),
236
+ (point.y + distance * dirs[direction].last)
237
+ )
238
+ )
239
+
240
+ return size if element == ELEMENTS[:WALL]
241
+ return distance if element == el
242
+ end
243
+
244
+ size
245
+ end
246
+
247
+ # Converts position in +board+ string to coords
248
+ #
249
+ # @param [Integer] pos position in string
250
+ # @return [Point] point object
251
+ def pos_to_coords(pos)
252
+ x = (pos % size)
253
+ y = size - 1 - (pos / size).to_i
254
+
255
+ Point.new x, y
256
+ end
257
+
258
+ # Converts position in +board+ string to coords
259
+ #
260
+ # @param [Point] point position
261
+ # @return [Integer] position in +board+ string
262
+ def coords_to_pos(point)
263
+ (size - 1 - point.y) * size + point.x
264
+ end
265
+ end
@@ -0,0 +1,47 @@
1
+ class Point
2
+ attr_accessor :x
3
+ attr_accessor :y
4
+
5
+ # Coords (1,1) - upper left side of field
6
+ #
7
+ # @param [Integer] x X coord
8
+ # @param [Integer] y Y coord
9
+ def initialize(x, y)
10
+ @x = x
11
+ @y = y
12
+ end
13
+
14
+ # Override of compare method for Point
15
+ def == (other_object)
16
+ other_object.x == @x && other_object.y == @y
17
+ end
18
+
19
+ # For better +.inspect+ output
20
+ def to_s
21
+ "[#{@x},#{@y}]"
22
+ end
23
+
24
+ # Position of point above current
25
+ def up
26
+ Point.new(@x, @y + 1)
27
+ end
28
+
29
+ # Position of point below current
30
+ def down
31
+ Point.new(@x, @y - 1)
32
+ end
33
+
34
+ # Position of point on the left side
35
+ def left
36
+ Point.new(@x - 1, @y)
37
+ end
38
+
39
+ # Position of point on the right side
40
+ def right
41
+ Point.new(@x + 1, @y)
42
+ end
43
+
44
+ def out_of?(board_size)
45
+ x >= board_size || y >= board_size || x < 0 || y < 0;
46
+ end
47
+ end
metadata CHANGED
@@ -1,14 +1,14 @@
1
1
  --- !ruby/object:Gem::Specification
2
2
  name: codenjoy-client
3
3
  version: !ruby/object:Gem::Version
4
- version: 0.1.002
4
+ version: 0.1.003
5
5
  platform: ruby
6
6
  authors:
7
7
  - vgulaev
8
8
  autorequire:
9
9
  bindir: exe
10
10
  cert_chain: []
11
- date: 2020-02-23 00:00:00.000000000 Z
11
+ date: 2020-02-27 00:00:00.000000000 Z
12
12
  dependencies:
13
13
  - !ruby/object:Gem::Dependency
14
14
  name: faye-websocket
@@ -63,6 +63,8 @@ files:
63
63
  - lib/codenjoy/client/version.rb
64
64
  - lib/codenjoy/game_base_client.rb
65
65
  - lib/codenjoy/games/battlecity/board.rb
66
+ - lib/codenjoy/games/tetris/board.rb
67
+ - lib/codenjoy/utils.rb
66
68
  homepage: https://github.com/vgulaev/codenjoy-client
67
69
  licenses:
68
70
  - MIT