codenjoy-client 0.1.0 → 0.1.001
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 +4 -4
- data/.gitignore +1 -0
- data/Gemfile.lock +1 -1
- data/game_base_client.rb +27 -1
- data/lib/codenjoy/client/version.rb +1 -1
- data/lib/codenjoy/games/battlecity/board.rb +305 -0
- metadata +2 -1
checksums.yaml
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
---
|
2
2
|
SHA256:
|
3
|
-
metadata.gz:
|
4
|
-
data.tar.gz:
|
3
|
+
metadata.gz: 41ec2318a826d4c2c7cce14b6f76168535d98b5e31cde82f06d16638519d7e6c
|
4
|
+
data.tar.gz: 4f055a21ea138a67c7af9d0842f0b4d8d958962e59e1f6c88e3ccca5dd5650b9
|
5
5
|
SHA512:
|
6
|
-
metadata.gz:
|
7
|
-
data.tar.gz:
|
6
|
+
metadata.gz: 2a862542b7161d1b263eda0cc9dde1b3db48663e6b19b41173524b4c6b0d8bf6a85810d73a11cf74aaa9b75191eef5d5d96c69a0aa39dccc4617a4d1e61e4e3a
|
7
|
+
data.tar.gz: 3b985416180cb9e3832b09eea98d0c6c1f88c18cd24b9cef1ef5cfa3728ae51f018f6a717b79908a39300407cf5cfcda6dec68541e08fde5bcdf60cfa9e76371
|
data/.gitignore
CHANGED
data/Gemfile.lock
CHANGED
data/game_base_client.rb
CHANGED
@@ -1,14 +1,40 @@
|
|
1
1
|
# require_relative "codenjoy/client"
|
2
2
|
require "bundler/setup"
|
3
3
|
require "codenjoy/client"
|
4
|
+
require "codenjoy/games/battlecity/board"
|
5
|
+
|
6
|
+
class YourSolver
|
7
|
+
# UP: 'up', // you can move
|
8
|
+
# DOWN: 'down',
|
9
|
+
# LEFT: 'left',
|
10
|
+
# RIGHT:'right',
|
11
|
+
# ACT: 'act', // fire
|
12
|
+
# STOP: '' // stay
|
13
|
+
def get_answer(board)
|
14
|
+
|
15
|
+
#######################################################################
|
16
|
+
#
|
17
|
+
# YOUR ALGORITHM HERE
|
18
|
+
#
|
19
|
+
#######################################################################
|
20
|
+
|
21
|
+
return 'act'
|
22
|
+
end
|
23
|
+
|
24
|
+
end
|
4
25
|
|
5
26
|
game = Codenjoy::Client::Game.new
|
27
|
+
board = Codenjoy::Client::Games::Battlecity::Board.new
|
6
28
|
|
7
29
|
url = "https://dojorena.io/codenjoy-contest/board/player/70xewv6o7ddy9yphm1u0?code=2603484461919438773&gameName=battlecity"
|
8
30
|
count = 0
|
9
31
|
|
32
|
+
|
10
33
|
game.play(url) do |ws, msg|
|
11
|
-
|
34
|
+
json = msg[6..-1].force_encoding('UTF-8')
|
35
|
+
board.process(json)
|
36
|
+
puts board.to_s
|
37
|
+
|
12
38
|
ws.send('Up')
|
13
39
|
p count
|
14
40
|
count += 1
|
@@ -0,0 +1,305 @@
|
|
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
|
+
|
23
|
+
require 'json'
|
24
|
+
|
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
|
+
class LengthToXY
|
75
|
+
def initialize(board_size)
|
76
|
+
@board_size = board_size
|
77
|
+
end
|
78
|
+
|
79
|
+
def inversionY(y)
|
80
|
+
@board_size - 1 - y;
|
81
|
+
end
|
82
|
+
|
83
|
+
def inversionX(x)
|
84
|
+
x;
|
85
|
+
end
|
86
|
+
|
87
|
+
def getXY(length)
|
88
|
+
return nil if (length == -1)
|
89
|
+
x = inversionX(length % @board_size);
|
90
|
+
y = inversionY((length / @board_size).floor);
|
91
|
+
return Point.new(x, y);
|
92
|
+
end
|
93
|
+
|
94
|
+
def getLength(x, y)
|
95
|
+
xx = inversionX(x);
|
96
|
+
yy = inversionY(y);
|
97
|
+
yy * @board_size + xx;
|
98
|
+
end
|
99
|
+
end
|
100
|
+
|
101
|
+
module Codenjoy
|
102
|
+
module Client
|
103
|
+
module Games
|
104
|
+
end
|
105
|
+
end
|
106
|
+
end
|
107
|
+
|
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
|
196
|
+
|
197
|
+
def size
|
198
|
+
@size ||= Math.sqrt(@raw.length);
|
199
|
+
end
|
200
|
+
|
201
|
+
def xyl
|
202
|
+
@xyl ||= LengthToXY.new(size);
|
203
|
+
end
|
204
|
+
|
205
|
+
def getAt(x, y)
|
206
|
+
return false if Point.new(x, y).out_of?(size)
|
207
|
+
@raw[xyl.getLength(x, y)];
|
208
|
+
end
|
209
|
+
|
210
|
+
def at?(x, y, element)
|
211
|
+
return false if Point.new(x, y).out_of?(size)
|
212
|
+
getAt(x, y) == element;
|
213
|
+
end
|
214
|
+
|
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;
|
222
|
+
end
|
223
|
+
|
224
|
+
def get_me
|
225
|
+
me = find_by_list(TANK)
|
226
|
+
return nil if me.nil?
|
227
|
+
find_by_list(TANK).flatten
|
228
|
+
end
|
229
|
+
|
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
|
235
|
+
|
236
|
+
def get_enemies
|
237
|
+
find_by_list(ENEMIES)
|
238
|
+
end
|
239
|
+
|
240
|
+
def get_bullets
|
241
|
+
find_by_list([ELEMENTS[:BULLET]])
|
242
|
+
end
|
243
|
+
|
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
|
252
|
+
end
|
253
|
+
result;
|
254
|
+
end
|
255
|
+
|
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
|
260
|
+
|
261
|
+
def count_near(x, y, element)
|
262
|
+
get_near(x, y).select{ |e| e == element}.size
|
263
|
+
end
|
264
|
+
|
265
|
+
def near?(x, y, element)
|
266
|
+
n = get_near(x, y)
|
267
|
+
return false if !n
|
268
|
+
n.include?(element);
|
269
|
+
end
|
270
|
+
|
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
|
275
|
+
|
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;
|
282
|
+
end
|
283
|
+
|
284
|
+
def game_over?
|
285
|
+
get_me.nil?;
|
286
|
+
end
|
287
|
+
|
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
|
291
|
+
|
292
|
+
def get_barriers
|
293
|
+
find_by_list(BARRIERS)
|
294
|
+
end
|
295
|
+
|
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
|
304
|
+
end
|
305
|
+
end
|
metadata
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
--- !ruby/object:Gem::Specification
|
2
2
|
name: codenjoy-client
|
3
3
|
version: !ruby/object:Gem::Version
|
4
|
-
version: 0.1.
|
4
|
+
version: 0.1.001
|
5
5
|
platform: ruby
|
6
6
|
authors:
|
7
7
|
- vgulaev
|
@@ -60,6 +60,7 @@ files:
|
|
60
60
|
- game_base_client.rb
|
61
61
|
- lib/codenjoy/client.rb
|
62
62
|
- lib/codenjoy/client/version.rb
|
63
|
+
- lib/codenjoy/games/battlecity/board.rb
|
63
64
|
homepage: https://github.com/vgulaev/codenjoy-client
|
64
65
|
licenses:
|
65
66
|
- MIT
|