codenjoy-client 0.1.006 → 0.1.007

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: 75013fae9cc5a55799da8ef5bc5575cd22c5b4480838e003facb7afb7020b85c
4
- data.tar.gz: 4b9379e52b4e73270e8579d4b5975896b28e11cb0731d4e51762bfcbc8a2db46
3
+ metadata.gz: a4294e66ffc1a27e53301dd0f5e35988cdb569a6f6302251221d40bdcdbb2095
4
+ data.tar.gz: d0764a9de7c1fae7fcd4aa6c60a53a18cd919a6f92fd87edebc8b91e642193c9
5
5
  SHA512:
6
- metadata.gz: 6ba6840c23438db3a065ee91fc67cfbd16b853768c783431628fd5ee0fbbea811da629037dec1c16103bcf18f9ddad8f5abdc239f80a2026de7530af39199fb8
7
- data.tar.gz: 04ca47238dec98e7d7edca8d1eef97b800f6a408d2a7f63079552d3e7461aa213b0a49bd7e63199bfbb52e74182adb0d64c06b06ab240dbe466535841ad85f55
6
+ metadata.gz: 3f236bd121dfe6c3b75411f39e665a71ff0ab6bad931e480958bd01122913829220bbc4008e5b2b08b7e302e28223152b09a0f2d36a758828992a799d88477d2
7
+ data.tar.gz: 5d009ade6891ac661abc53e086318106e1c28b0ac92f670408cd4d03eea336563e19a6cbf5dbba24bc993073313067e8b611f723265f94e8c6cdfa85c61743af
data/bin/console CHANGED
@@ -2,6 +2,7 @@
2
2
 
3
3
  require "bundler/setup"
4
4
  require "codenjoy/client"
5
+ require "codenjoy/games/tetris/board"
5
6
 
6
7
  # You can add fixtures and/or initialization code here to make experimenting
7
8
  # with your gem easier. You can also use a different console, if you like.
@@ -1,16 +1,29 @@
1
1
  #!/usr/bin/env ruby
2
2
 
3
- # require "pathname"
4
- require "codenjoy/client"
3
+ require 'fileutils'
4
+ require 'codenjoy/client'
5
5
 
6
6
  game = Codenjoy::Client::Game::new
7
7
  sourse = "#{game.source_path}/game_base_client.rb"
8
8
  dest = "#{Dir.pwd}/game_base_client.rb"
9
9
 
10
- p "#{sourse} ==> #{dest}"
11
- if File.exist?(dest)
12
- p "File already exist"
13
- else
14
- FileUtils.cp(sourse, dest)
10
+ puts "codenjoy-ruby-client util for develop ruby client for https://dojorena.io/"
11
+ puts "--game common cases"
12
+ puts "--dev for dev mode"
13
+
14
+ # def add_dev_line
15
+ # end
16
+
17
+ if ['--dev', '--game'].include?(ARGV[0])
18
+ p "#{sourse} ==> #{dest}"
19
+ if File.exist?(dest)
20
+ p "File already exist"
21
+ else
22
+ FileUtils.cp(sourse, dest)
23
+ if '--dev' == ARGV[0]
24
+ text = "require 'bundler/setup'\n#{File.read(dest)}"
25
+ File.open(dest, "w") { |file| file.write(text) }
26
+ end
27
+ end
15
28
  end
16
29
 
@@ -0,0 +1,61 @@
1
+ require "codenjoy/utils"
2
+
3
+ class BaseBoard
4
+ def xyl
5
+ @xyl ||= LengthToXY.new(size);
6
+ end
7
+
8
+ def size
9
+ @size ||= Math.sqrt(@raw.length);
10
+ end
11
+
12
+ def board_to_s
13
+ Array.new(size).each_with_index.map{ |e, n| @raw[(n * size)..((n + 1) * size - 1)]}.join("\n")
14
+ end
15
+
16
+ def get_at(x, y)
17
+ return false if Point.new(x, y).out_of?(size)
18
+ @raw[xyl.getLength(x, y)]
19
+ end
20
+
21
+ def any_of_at?(x, y, elements = [])
22
+ return false if Point.new(x, y).out_of?(size)
23
+ elements.each do |e|
24
+ return true if at?(x, y, e)
25
+ end
26
+ false;
27
+ end
28
+
29
+ def near?(x, y, element)
30
+ return false if Point.new(x, y).out_of?(size)
31
+ at?(x + 1, y, element) || at?(x - 1, y, element) || at?(x, y + 1, element) || at?(x, y - 1, element)
32
+ end
33
+
34
+ def at?(x, y, element)
35
+ return false if Point.new(x, y).out_of?(size)
36
+ get_at(x, y) == element;
37
+ end
38
+
39
+ def find_all(element)
40
+ result = []
41
+ @raw.length.times do |i|
42
+ point = xyl.getXY(i);
43
+ result.push(point) if at?(point.x, point.y, element)
44
+ end
45
+ result;
46
+ end
47
+
48
+ def find_by_list(list)
49
+ list.map{ |e| find_all(e) }.flatten.map{ |e| [e.x, e.y] }
50
+ end
51
+
52
+ def count_near(x, y, element)
53
+ return 0 if Point.new(x, y).out_of?(size)
54
+ count = 0
55
+ count += 1 if at?(x - 1, y , element)
56
+ count += 1 if at?(x + 1, y , element)
57
+ count += 1 if at?(x , y - 1, element)
58
+ count += 1 if at?(x , y + 1, element)
59
+ count
60
+ end
61
+ end
@@ -1,5 +1,5 @@
1
1
  module Codenjoy
2
2
  module Client
3
- VERSION = "0.1.006"
3
+ VERSION = "0.1.007"
4
4
  end
5
5
  end
@@ -21,34 +21,7 @@
21
21
  ###
22
22
 
23
23
  require "codenjoy/utils"
24
- require 'json'
25
-
26
- class LengthToXY
27
- def initialize(board_size)
28
- @board_size = board_size
29
- end
30
-
31
- def inversionY(y)
32
- @board_size - 1 - y;
33
- end
34
-
35
- def inversionX(x)
36
- x;
37
- end
38
-
39
- def getXY(length)
40
- return nil if (length == -1)
41
- x = inversionX(length % @board_size);
42
- y = inversionY((length / @board_size).floor);
43
- return Point.new(x, y);
44
- end
45
-
46
- def getLength(x, y)
47
- xx = inversionX(x);
48
- yy = inversionY(y);
49
- yy * @board_size + xx;
50
- end
51
- end
24
+ require "codenjoy/base_board"
52
25
 
53
26
  module Codenjoy
54
27
  module Client
@@ -59,7 +32,7 @@ module Codenjoy
59
32
  end
60
33
  end
61
34
 
62
- class Codenjoy::Client::Games::Battlecity::Board
35
+ class Codenjoy::Client::Games::Battlecity::Board < BaseBoard
63
36
 
64
37
  ELEMENTS = {
65
38
  NONE: ' ',
@@ -147,33 +120,10 @@ class Codenjoy::Client::Games::Battlecity::Board
147
120
  @raw = data
148
121
  end
149
122
 
150
- def size
151
- @size ||= Math.sqrt(@raw.length);
152
- end
153
-
154
123
  def xyl
155
124
  @xyl ||= LengthToXY.new(size);
156
125
  end
157
126
 
158
- def getAt(x, y)
159
- return false if Point.new(x, y).out_of?(size)
160
- @raw[xyl.getLength(x, y)];
161
- end
162
-
163
- def at?(x, y, element)
164
- return false if Point.new(x, y).out_of?(size)
165
- getAt(x, y) == element;
166
- end
167
-
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)
173
- end
174
- result;
175
- end
176
-
177
127
  def get_me
178
128
  me = find_by_list(TANK)
179
129
  return nil if me.nil?
@@ -181,7 +131,7 @@ class Codenjoy::Client::Games::Battlecity::Board
181
131
  end
182
132
 
183
133
  def find_by_list(list)
184
- result = list.map{ |e| findAll(e) }.flatten.map{ |e| [e.x, e.y] }
134
+ result = list.map{ |e| find_all(e) }.flatten.map{ |e| [e.x, e.y] }
185
135
  return nil if (result.length == 0)
186
136
  result
187
137
  end
@@ -200,7 +150,7 @@ class Codenjoy::Client::Games::Battlecity::Board
200
150
  (-1..1).each do |dx|
201
151
  (-1..1).each do |dy|
202
152
  next if (dx == 0 && dy == 0)
203
- result.push(getAt(x + dx, y + dy))
153
+ result.push(get_at(x + dx, y + dy))
204
154
  end
205
155
  end
206
156
  result;
@@ -223,7 +173,7 @@ class Codenjoy::Client::Games::Battlecity::Board
223
173
 
224
174
  def bullet_at?(x, y)
225
175
  return false if Point.new(x, y).out_of?(size)
226
- getAt(x, y) == ELEMENTS[:BULLET]
176
+ get_at(x, y) == ELEMENTS[:BULLET]
227
177
  end
228
178
 
229
179
  def any_of_at?(x, y, elements = [])
@@ -238,10 +188,6 @@ class Codenjoy::Client::Games::Battlecity::Board
238
188
  get_me.nil?;
239
189
  end
240
190
 
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
244
-
245
191
  def get_barriers
246
192
  find_by_list(BARRIERS)
247
193
  end
@@ -0,0 +1,223 @@
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 "codenjoy/utils"
24
+ require "codenjoy/base_board"
25
+
26
+ module Codenjoy
27
+ module Client
28
+ module Games
29
+ module Icancode
30
+ end
31
+ end
32
+ end
33
+ end
34
+
35
+ class Layer < BaseBoard
36
+ def initialize(data)
37
+ @raw = data
38
+ end
39
+ end
40
+
41
+ class Codenjoy::Client::Games::Icancode::Board
42
+
43
+ ELEMENT = {
44
+ EMPTY: '-',
45
+ FLOOR: '.',
46
+
47
+ ANGLE_IN_LEFT: '╔',
48
+ WALL_FRONT: '═',
49
+ ANGLE_IN_RIGHT: '┐',
50
+ WALL_RIGHT: '│',
51
+ ANGLE_BACK_RIGHT: '┘',
52
+ WALL_BACK: '─',
53
+ ANGLE_BACK_LEFT: '└',
54
+ WALL_LEFT: '║',
55
+ WALL_BACK_ANGLE_LEFT: '┌',
56
+ WALL_BACK_ANGLE_RIGHT: '╗',
57
+ ANGLE_OUT_RIGHT: '╝',
58
+ ANGLE_OUT_LEFT: '╚',
59
+ SPACE: ' ',
60
+
61
+ LASER_MACHINE_CHARGING_LEFT: '˂',
62
+ LASER_MACHINE_CHARGING_RIGHT: '˃',
63
+ LASER_MACHINE_CHARGING_UP: '˄',
64
+ LASER_MACHINE_CHARGING_DOWN: '˅',
65
+
66
+ LASER_MACHINE_READY_LEFT: '◄',
67
+ LASER_MACHINE_READY_RIGHT: '►',
68
+ LASER_MACHINE_READY_UP: '▲',
69
+ LASER_MACHINE_READY_DOWN: '▼',
70
+
71
+ START: 'S',
72
+ EXIT: 'E',
73
+ HOLE: 'O',
74
+ BOX: 'B',
75
+ ZOMBIE_START: 'Z',
76
+ GOLD: '$',
77
+
78
+ ROBOT: '☺',
79
+ ROBOT_FALLING: 'o',
80
+ ROBOT_FLYING: '*',
81
+ ROBOT_LASER: '☻',
82
+
83
+ ROBOT_OTHER: 'X',
84
+ ROBOT_OTHER_FALLING: 'x',
85
+ ROBOT_OTHER_FLYING: '^',
86
+ ROBOT_OTHER_LASER: '&',
87
+
88
+ LASER_LEFT: '←',
89
+ LASER_RIGHT: '→',
90
+ LASER_UP: '↑',
91
+ LASER_DOWN: '↓',
92
+
93
+ FEMALE_ZOMBIE: '♀',
94
+ MALE_ZOMBIE: '♂',
95
+ ZOMBIE_DIE: '✝'
96
+ }
97
+
98
+ WALLS = [
99
+ :ANGLE_IN_LEFT, :WALL_FRONT, :ANGLE_IN_RIGHT, :WALL_RIGHT, :ANGLE_BACK_RIGHT,
100
+ :WALL_BACK, :ANGLE_BACK_LEFT, :WALL_LEFT, :WALL_BACK_ANGLE_LEFT, :WALL_BACK_ANGLE_RIGHT,
101
+ :ANGLE_OUT_RIGHT, :ANGLE_OUT_LEFT, :SPACE
102
+ ]
103
+
104
+ attr_accessor :l1, :l2, :l3 # short names for layers
105
+
106
+ def command
107
+ # 'up' // you can move
108
+ # 'down'
109
+ # 'left'
110
+ # 'right'
111
+ # 'act(1)' // jump
112
+ # 'act(2)' // pull box
113
+ # 'act(3)' // fire
114
+ # 'act(0)' // die
115
+ end
116
+
117
+ def process(data)
118
+ @data = JSON.parse(data)
119
+ @raw = @data["layers"][0]
120
+ @l1 = Layer.new(@data["layers"][0])
121
+ @l2 = Layer.new(@data["layers"][1])
122
+ @l3 = Layer.new(@data["layers"][2])
123
+ end
124
+
125
+ def nline(i)
126
+ return " 0" if 0 == i
127
+ format("%02.0d", i)
128
+ end
129
+
130
+ def numberinline(length)
131
+ Array.new(length) { |i| (i % 10).to_s }.join
132
+ end
133
+
134
+ def headfoot
135
+ Array.new(3).map{ |i| " " + numberinline(size) }.join
136
+ end
137
+
138
+ def headlayers
139
+ spaces = ([' '] * (size - 6)).join()
140
+ @data["layers"].each_with_index.map{ |e, n| " Layers#{n + 1}#{spaces}" }.join('')
141
+ end
142
+
143
+ def get_me
144
+ [@data['heroPosition']['x'], @data['heroPosition']['y']]
145
+ end
146
+
147
+ def get_other_heroes
148
+ l2.find_by_list([
149
+ :ROBOT_OTHER, :ROBOT_OTHER_FALLING, :ROBOT_OTHER_LASER
150
+ ].map{ |e| ELEMENT[e] }) + l3.find_by_list([ELEMENT[:ROBOT_OTHER_FLYING]])
151
+ end
152
+
153
+ def get_gold
154
+ l1.find_by_list([ELEMENT[:GOLD]])
155
+ end
156
+
157
+ def get_starts
158
+ l1.find_by_list([ELEMENT[:START]])
159
+ end
160
+
161
+ def get_exits
162
+ l1.find_by_list([ELEMENT[:EXIT]])
163
+ end
164
+
165
+ def get_boxes
166
+ l2.find_by_list([ELEMENT[:BOX]])
167
+ end
168
+
169
+ def get_holes
170
+ l1.find_by_list([ELEMENT[:HOLE]])
171
+ end
172
+
173
+ def get_laser_machines
174
+ l1.find_by_list([:LASER_MACHINE_CHARGING_LEFT, :LASER_MACHINE_CHARGING_RIGHT,
175
+ :LASER_MACHINE_CHARGING_UP, :LASER_MACHINE_CHARGING_DOWN,
176
+ :LASER_MACHINE_READY_LEFT, :LASER_MACHINE_READY_RIGHT,
177
+ :LASER_MACHINE_READY_UP, :LASER_MACHINE_READY_DOWN].map{ |e| ELEMENT[e] })
178
+ end
179
+
180
+ def get_lasers
181
+ l2.find_by_list([:LASER_LEFT, :LASER_RIGHT, :LASER_UP, :LASER_DOWN].map{ |e| ELEMENT[e] })
182
+ end
183
+
184
+ def get_zombies
185
+ l2.find_by_list([:FEMALE_ZOMBIE, :MALE_ZOMBIE, :ZOMBIE_DIE].map{ |e| ELEMENT[e] })
186
+ end
187
+
188
+ def get_walls
189
+ l1.find_by_list(WALLS.map{ |e| ELEMENT[e] })
190
+ end
191
+
192
+ def wall_at?(x, y)
193
+ WALLS.map{ |e| ELEMENT[e] }.include?(l1.get_at(x,y))
194
+ end
195
+
196
+ def infoline(n)
197
+ res = [
198
+ " Robots: #{get_me}, #{get_other_heroes}",
199
+ " Gold: #{get_gold}",
200
+ " Starts: #{get_starts}",
201
+ " Exits: #{get_exits}",
202
+ " Boxes: #{get_boxes}",
203
+ " Holes: #{get_holes}",
204
+ " LaserMachine: #{get_laser_machines}",
205
+ " Lasers: #{get_lasers}",
206
+ " Zombies: #{get_zombies}"
207
+ ]
208
+ d = 1
209
+ return res[n - d] if d <= n && n < res.size + d
210
+ ""
211
+ end
212
+
213
+ def board_to_s
214
+ ([headlayers, headfoot] +
215
+ Array.new(size).each_with_index.map do |e, n|
216
+ @data["layers"].map{ |l| nline(size - n - 1) + l[(n * size)..((n + 1) * size - 1)] }.join + infoline(n)
217
+ end + [headfoot]).join("\n")
218
+ end
219
+
220
+ def to_s
221
+ board_to_s
222
+ end
223
+ end
@@ -0,0 +1,190 @@
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 "codenjoy/utils"
24
+ require "codenjoy/base_board"
25
+
26
+ module Codenjoy
27
+ module Client
28
+ module Games
29
+ module Loderunner
30
+ end
31
+ end
32
+ end
33
+ end
34
+
35
+ class Codenjoy::Client::Games::Loderunner::Board < BaseBoard
36
+
37
+ ELEMENTS = {
38
+ # a void
39
+ NONE: ' ',
40
+
41
+ # walls
42
+ BRICK: '#',
43
+ PIT_FILL_1: '1',
44
+ PIT_FILL_2: '2',
45
+ PIT_FILL_3: '3',
46
+ PIT_FILL_4: '4',
47
+ UNDESTROYABLE_WALL: '☼',
48
+
49
+ DRILL_PIT: '*',
50
+
51
+ # this is enemy
52
+ ENEMY_LADDER: 'Q',
53
+ ENEMY_LEFT: '«',
54
+ ENEMY_RIGHT: '»',
55
+ ENEMY_PIPE_LEFT: '<',
56
+ ENEMY_PIPE_RIGHT: '>',
57
+ ENEMY_PIT: 'X',
58
+
59
+ # gold ;)
60
+ GOLD: '$',
61
+
62
+ # this is you
63
+ HERO_DIE: 'Ѡ',
64
+ HERO_DRILL_LEFT: 'Я',
65
+ HERO_DRILL_RIGHT: 'R',
66
+ HERO_LADDER: 'Y',
67
+ HERO_LEFT: '◄',
68
+ HERO_RIGHT: '►',
69
+ HERO_FALL_LEFT: ']',
70
+ HERO_FALL_RIGHT: '[',
71
+ HERO_PIPE_LEFT: '{',
72
+ HERO_PIPE_RIGHT: '}',
73
+
74
+ # this is other players
75
+ OTHER_HERO_DIE: 'Z',
76
+ OTHER_HERO_LEFT: ')',
77
+ OTHER_HERO_RIGHT: '(',
78
+ OTHER_HERO_LADDER: 'U',
79
+ OTHER_HERO_PIPE_LEFT: 'Э',
80
+ OTHER_HERO_PIPE_RIGHT: 'Є',
81
+
82
+ # ladder and pipe - you can walk
83
+ LADDER: 'H',
84
+ PIPE: '~'
85
+ };
86
+
87
+ HERO = [
88
+ :HERO_DIE, :HERO_DRILL_LEFT, :HERO_DRILL_RIGHT,
89
+ :HERO_FALL_RIGHT, :HERO_FALL_LEFT, :HERO_LADDER,
90
+ :HERO_LEFT, :HERO_RIGHT, :HERO_PIPE_LEFT, :HERO_PIPE_RIGHT
91
+ ]
92
+
93
+ OTHER_HERO = [
94
+ :OTHER_HERO_LEFT, :OTHER_HERO_RIGHT, :OTHER_HERO_LADDER, :OTHER_HERO_PIPE_LEFT, :OTHER_HERO_PIPE_RIGHT
95
+ ]
96
+
97
+ ENEMY = [
98
+ :ENEMY_LADDER, :ENEMY_LADDER, :ENEMY_LEFT, :ENEMY_PIPE_LEFT, :ENEMY_PIPE_RIGHT, :ENEMY_RIGHT, :ENEMY_PIT
99
+ ]
100
+
101
+ PIPE = [
102
+ :PIPE, :HERO_PIPE_LEFT, :HERO_PIPE_RIGHT, :OTHER_HERO_PIPE_LEFT, :OTHER_HERO_PIPE_RIGHT
103
+ ]
104
+
105
+ def process(data)
106
+ @raw = data
107
+ end
108
+
109
+ def to_s
110
+ [
111
+ "Board:",
112
+ board_to_s,
113
+ "Me at: #{get_me}",
114
+ "Other heroes at: #{get_other_heroes}",
115
+ "Enemies at: #{get_enemies}",
116
+ "Gold at: #{get_gold}"
117
+ ].join("\n")
118
+ end
119
+
120
+ def get_me
121
+ find_by_list(HERO.map{ |e| ELEMENTS[e] })
122
+ end
123
+
124
+ def get_other_heroes
125
+ find_by_list(OTHER_HERO.map{ |e| ELEMENTS[e] })
126
+ end
127
+
128
+ def get_enemies
129
+ find_by_list(ENEMY.map{ |e| ELEMENTS[e] })
130
+ end
131
+
132
+ def get_gold
133
+ find_by_list([ELEMENTS[:GOLD]])
134
+ end
135
+
136
+ def get_walls
137
+ find_by_list([ELEMENTS[:BRICK], ELEMENTS[:UNDESTROYABLE_WALL]])
138
+ end
139
+
140
+ def get_ladders
141
+ find_by_list([ELEMENTS[:LADDER], ELEMENTS[:HERO_LADDER], ELEMENTS[:ENEMY_LADDER]])
142
+ end
143
+
144
+ def get_pipes
145
+ find_by_list(PIPE.map{ |e| ELEMENTS[e] })
146
+ end
147
+
148
+ def game_over?
149
+ !@raw.index(ELEMENTS[:HERO_DIE]).nil?
150
+ end
151
+
152
+ def get_barriers
153
+ [get_enemies, get_other_heroes, get_walls].flatten(1)
154
+ end
155
+
156
+ def barrier_at?(x, y)
157
+ return false if Point.new(x, y).out_of?(size)
158
+ !get_barriers.index([x, y]).nil?
159
+ end
160
+
161
+ def enemy_at?(x, y)
162
+ return false if Point.new(x, y).out_of?(size)
163
+ any_of_at?(x, y, ENEMY.map{ |e| ELEMENTS[e] })
164
+ end
165
+
166
+ def other_hero_at?(x, y)
167
+ return false if Point.new(x, y).out_of?(size)
168
+ any_of_at?(x, y, OTHER_HERO.map{ |e| ELEMENTS[e] })
169
+ end
170
+
171
+ def wall_at?(x, y)
172
+ return false if Point.new(x, y).out_of?(size)
173
+ any_of_at?(x, y, [ELEMENTS[:BRICK], ELEMENTS[:UNDESTROYABLE_WALL]])
174
+ end
175
+
176
+ def ladder_at?(x, y)
177
+ return false if Point.new(x, y).out_of?(size)
178
+ any_of_at?(x, y, [ELEMENTS[:LADDER], ELEMENTS[:HERO_LADDER], ELEMENTS[:ENEMY_LADDER]])
179
+ end
180
+
181
+ def gold_at?(x, y)
182
+ return false if Point.new(x, y).out_of?(size)
183
+ at?(x, y, ELEMENTS[:GOLD])
184
+ end
185
+
186
+ def pipe_at?(x, y)
187
+ return false if Point.new(x, y).out_of?(size)
188
+ any_of_at?(x, y, PIPE.map{ |e| ELEMENTS[e] })
189
+ end
190
+ end
@@ -0,0 +1,89 @@
1
+ require "codenjoy/utils"
2
+ require "codenjoy/base_board"
3
+
4
+ module Codenjoy
5
+ module Client
6
+ module Games
7
+ module Snake
8
+ end
9
+ end
10
+ end
11
+ end
12
+
13
+ class Codenjoy::Client::Games::Snake::Board < BaseBoard
14
+ ELEMENTS = {
15
+ BAD_APPLE: '☻',
16
+ GOOD_APPLE: '☺',
17
+
18
+ BREAK: '☼',
19
+
20
+ HEAD_DOWN: '▼',
21
+ HEAD_LEFT: '◄',
22
+ HEAD_RIGHT: '►',
23
+ HEAD_UP: '▲',
24
+
25
+ TAIL_END_DOWN: '╙',
26
+ TAIL_END_LEFT: '╘',
27
+ TAIL_END_UP: '╓',
28
+ TAIL_END_RIGHT: '╕',
29
+ TAIL_HORIZONTAL: '═',
30
+ TAIL_VERTICAL: '║',
31
+ TAIL_LEFT_DOWN: '╗',
32
+ TAIL_LEFT_UP: '╝',
33
+ TAIL_RIGHT_DOWN: '╔',
34
+ TAIL_RIGHT_UP: '╚',
35
+
36
+ NONE: ' '
37
+ }
38
+
39
+ def process(str)
40
+ puts "-------------------------------------------------------------------------------------------"
41
+ puts str
42
+ @raw = str
43
+ end
44
+
45
+ def get_my_head
46
+ find_by_list([:HEAD_DOWN, :HEAD_UP, :HEAD_RIGHT, :HEAD_LEFT].map{ |e| ELEMENTS[e] })
47
+ end
48
+
49
+ def get_my_body
50
+ find_by_list([
51
+ :HEAD_DOWN, :HEAD_LEFT, :HEAD_RIGHT, :HEAD_UP,
52
+ :TAIL_END_DOWN, :TAIL_END_LEFT, :TAIL_END_UP,
53
+ :TAIL_END_RIGHT, :TAIL_HORIZONTAL, :TAIL_VERTICAL,
54
+ :TAIL_LEFT_DOWN, :TAIL_LEFT_UP, :TAIL_RIGHT_DOWN, :TAIL_RIGHT_UP
55
+ ].map{ |e| ELEMENTS[e] })
56
+ end
57
+
58
+ def get_apple
59
+ find_by_list([ELEMENTS[:GOOD_APPLE]])
60
+ end
61
+
62
+ def get_stone
63
+ find_by_list([ELEMENTS[:BAD_APPLE]])
64
+ end
65
+
66
+ def get_walls
67
+ find_by_list([ELEMENTS[:BREAK]])
68
+ end
69
+
70
+ def get_barriers
71
+ find_by_list([ELEMENTS[:BREAK], ELEMENTS[:BAD_APPLE]])
72
+ end
73
+
74
+ def barrier_at?(x, y)
75
+ return false if Point.new(x, y).out_of?(size)
76
+ get_barriers.include?([x.to_f, y.to_f]);
77
+ end
78
+
79
+ def to_s
80
+ [
81
+ "Board:",
82
+ board_to_s,
83
+ "My head at: #{get_my_head}",
84
+ "My body at: #{get_my_body}",
85
+ "Apple at: #{get_apple}",
86
+ "Stone at: #{get_stone}"
87
+ ].join("\n")
88
+ end
89
+ end
@@ -22,54 +22,6 @@
22
22
  require "codenjoy/utils"
23
23
  require 'json'
24
24
 
25
- ##################################### ELEMENTS TYPES #########################################################
26
-
27
- ELEMENTS = Hash.new
28
-
29
- # This is glass content
30
- ELEMENTS[:I_BLUE] = 'I'
31
- ELEMENTS[:J_CYAN] = 'J'
32
- ELEMENTS[:L_ORANGE] = 'L'
33
- ELEMENTS[:O_YELLOW] = 'O'
34
- ELEMENTS[:S_GREEN] = 'S'
35
- ELEMENTS[:T_PURPLE] = 'T'
36
- ELEMENTS[:Z_RED] = 'Z'
37
- ELEMENTS[:NONE] = '.'
38
-
39
- # List of figures
40
- FIGURES = [
41
- ELEMENTS[:I_BLUE],
42
- ELEMENTS[:J_CYAN],
43
- ELEMENTS[:L_ORANGE],
44
- ELEMENTS[:O_YELLOW],
45
- ELEMENTS[:S_GREEN],
46
- ELEMENTS[:T_PURPLE],
47
- ELEMENTS[:Z_RED]
48
- ]
49
-
50
- ##################################### END OF ELEMENTS TYPES #########################################################
51
-
52
- # Return list of indexes of char +char+ in string +s+ ("STR".index returns only first char/string appear)
53
- #
54
- # @param [String] s string to search in
55
- # @param [String] char substring to search
56
- # @return [Array] list of indexes
57
- def indexes(s, char)
58
- (0 ... s.length).find_all { |i| s[i,1] == char }
59
- end
60
-
61
- def compare(pt1, pt2)
62
- if (pt1.x <=> pt2.x) != 0
63
- pt1.x <=> pt2.x
64
- else
65
- pt1.y <=> pt2.y
66
- end
67
- end
68
-
69
- def sort(array)
70
- array.sort { |pt1, pt2| compare(pt1, pt2) }
71
- end
72
-
73
25
  module Codenjoy
74
26
  module Client
75
27
  module Games
@@ -80,12 +32,39 @@ module Codenjoy
80
32
  end
81
33
 
82
34
  class Codenjoy::Client::Games::Tetris::Board
35
+ # This is glass content
36
+ ELEMENTS = {
37
+ :I_BLUE => 'I',
38
+ :J_CYAN => 'J',
39
+ :L_ORANGE => 'L',
40
+ :O_YELLOW => 'O',
41
+ :S_GREEN => 'S',
42
+ :T_PURPLE => 'T',
43
+ :Z_RED => 'Z',
44
+ :NONE => '.',
45
+ }
46
+
47
+ FIGURES = [:I_BLUE, :J_CYAN, :L_ORANGE, :O_YELLOW, :S_GREEN, :T_PURPLE, :Z_RE]
48
+ .map{ |e| Codenjoy::Client::Games::Tetris::Board::ELEMENTS[e] }
49
+
83
50
  attr_accessor :board
84
51
  attr_accessor :size
85
52
  attr_accessor :current_figure_type
86
53
  attr_accessor :future_figures
87
54
  attr_accessor :current_figure_point
88
55
 
56
+ def compare(pt1, pt2)
57
+ if (pt1.x <=> pt2.x) != 0
58
+ pt1.x <=> pt2.x
59
+ else
60
+ pt1.y <=> pt2.y
61
+ end
62
+ end
63
+
64
+ def sort(array)
65
+ array.sort { |pt1, pt2| compare(pt1, pt2) }
66
+ end
67
+
89
68
  def process(str)
90
69
  puts "-------------------------------------------------------------------------------------------"
91
70
  json = JSON.parse(str)
@@ -212,7 +191,7 @@ class Codenjoy::Client::Games::Tetris::Board
212
191
  #
213
192
  # @return [Array[Point]] array of walls positions
214
193
  def get_free_space
215
- get(ELEMENTS[:NONE])
194
+ get(Codenjoy::Client::Games::Tetris::Board::ELEMENTS[:NONE])
216
195
  end
217
196
 
218
197
  # How far specified element from position (strait direction)
@@ -238,7 +217,7 @@ class Codenjoy::Client::Games::Tetris::Board
238
217
  )
239
218
  )
240
219
 
241
- return size if element == ELEMENTS[:WALL]
220
+ return size if element == Codenjoy::Client::Games::Tetris::Board::ELEMENTS[:WALL]
242
221
  return distance if element == el
243
222
  end
244
223
 
@@ -45,3 +45,30 @@ class Point
45
45
  x >= board_size || y >= board_size || x < 0 || y < 0;
46
46
  end
47
47
  end
48
+
49
+ class LengthToXY
50
+ def initialize(board_size)
51
+ @board_size = board_size
52
+ end
53
+
54
+ def inversionY(y)
55
+ @board_size - 1 - y;
56
+ end
57
+
58
+ def inversionX(x)
59
+ x;
60
+ end
61
+
62
+ def getXY(length)
63
+ return nil if (length == -1)
64
+ x = inversionX(length % @board_size);
65
+ y = inversionY((length / @board_size).floor);
66
+ return Point.new(x, y);
67
+ end
68
+
69
+ def getLength(x, y)
70
+ xx = inversionX(x);
71
+ yy = inversionY(y);
72
+ yy * @board_size + xx;
73
+ end
74
+ 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.006
4
+ version: 0.1.007
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-27 00:00:00.000000000 Z
11
+ date: 2020-03-16 00:00:00.000000000 Z
12
12
  dependencies:
13
13
  - !ruby/object:Gem::Dependency
14
14
  name: faye-websocket
@@ -58,10 +58,14 @@ files:
58
58
  - bin/setup
59
59
  - codenjoy-client.gemspec
60
60
  - exe/codenjoy-ruby-client
61
+ - lib/codenjoy/base_board.rb
61
62
  - lib/codenjoy/client.rb
62
63
  - lib/codenjoy/client/version.rb
63
64
  - lib/codenjoy/game_base_client.rb
64
65
  - lib/codenjoy/games/battlecity/board.rb
66
+ - lib/codenjoy/games/icancode/board.rb
67
+ - lib/codenjoy/games/loderunner/board.rb
68
+ - lib/codenjoy/games/snake/board.rb
65
69
  - lib/codenjoy/games/tetris/board.rb
66
70
  - lib/codenjoy/utils.rb
67
71
  homepage: https://github.com/vgulaev/codenjoy-client