Class: Codenjoy::Client::Games::Battlecity::Board

Inherits:
Object
  • Object
show all
Defined in:
lib/codenjoy/games/battlecity/board.rb

Constant Summary collapse

ELEMENTS =
{
  NONE: ' ',
  BATTLE_WALL: '',
  BANG: 'Ѡ',

  CONSTRUCTION: '',

  CONSTRUCTION_DESTROYED_DOWN: '',
  CONSTRUCTION_DESTROYED_UP: '',
  CONSTRUCTION_DESTROYED_LEFT: '',
  CONSTRUCTION_DESTROYED_RIGHT: '',

  CONSTRUCTION_DESTROYED_DOWN_TWICE: '',
  CONSTRUCTION_DESTROYED_UP_TWICE: '',
  CONSTRUCTION_DESTROYED_LEFT_TWICE: '',
  CONSTRUCTION_DESTROYED_RIGHT_TWICE: '',

  CONSTRUCTION_DESTROYED_LEFT_RIGHT: '',
  CONSTRUCTION_DESTROYED_UP_DOWN: '',

  CONSTRUCTION_DESTROYED_UP_LEFT: '',
  CONSTRUCTION_DESTROYED_RIGHT_UP: '',
  CONSTRUCTION_DESTROYED_DOWN_LEFT: '',
  CONSTRUCTION_DESTROYED_DOWN_RIGHT: '',

  CONSTRUCTION_DESTROYED: ' ',

  BULLET: '',

  TANK_UP: '',
  TANK_RIGHT: '',
  TANK_DOWN: '',
  TANK_LEFT: '',

  OTHER_TANK_UP: '˄',
  OTHER_TANK_RIGHT: '˃',
  OTHER_TANK_DOWN: '˅',
  OTHER_TANK_LEFT: '˂',

  AI_TANK_UP: '?',
  AI_TANK_RIGHT: '»',
  AI_TANK_DOWN: '¿',
  AI_TANK_LEFT: '«'
}
ENEMIES =
[
  ELEMENTS[:AI_TANK_UP],
  ELEMENTS[:AI_TANK_DOWN],
  ELEMENTS[:AI_TANK_LEFT],
  ELEMENTS[:AI_TANK_RIGHT],
  ELEMENTS[:OTHER_TANK_UP],
  ELEMENTS[:OTHER_TANK_DOWN],
  ELEMENTS[:OTHER_TANK_LEFT],
  ELEMENTS[:OTHER_TANK_RIGHT]
]
TANK =
[
  ELEMENTS[:TANK_UP],
  ELEMENTS[:TANK_DOWN],
  ELEMENTS[:TANK_LEFT],
  ELEMENTS[:TANK_RIGHT]
]
BARRIERS =
[
  ELEMENTS[:BATTLE_WALL],
  ELEMENTS[:CONSTRUCTION],
  ELEMENTS[:CONSTRUCTION_DESTROYED_DOWN],
  ELEMENTS[:CONSTRUCTION_DESTROYED_UP],
  ELEMENTS[:CONSTRUCTION_DESTROYED_LEFT],
  ELEMENTS[:CONSTRUCTION_DESTROYED_RIGHT],
  ELEMENTS[:CONSTRUCTION_DESTROYED_DOWN_TWICE],
  ELEMENTS[:CONSTRUCTION_DESTROYED_UP_TWICE],
  ELEMENTS[:CONSTRUCTION_DESTROYED_LEFT_TWICE],
  ELEMENTS[:CONSTRUCTION_DESTROYED_RIGHT_TWICE],
  ELEMENTS[:CONSTRUCTION_DESTROYED_LEFT_RIGHT],
  ELEMENTS[:CONSTRUCTION_DESTROYED_UP_DOWN],
  ELEMENTS[:CONSTRUCTION_DESTROYED_UP_LEFT],
  ELEMENTS[:CONSTRUCTION_DESTROYED_RIGHT_UP],
  ELEMENTS[:CONSTRUCTION_DESTROYED_DOWN_LEFT],
  ELEMENTS[:CONSTRUCTION_DESTROYED_DOWN_RIGHT]
]

Instance Method Summary collapse

Instance Method Details

#any_of_at?(x, y, elements = []) ⇒ Boolean

Returns:

  • (Boolean)


229
230
231
232
233
234
235
# File 'lib/codenjoy/games/battlecity/board.rb', line 229

def any_of_at?(x, y, elements = [])
  return false if Point.new(x, y).out_of?(size)
  elements.each do |e|
    return true if at?(x, y, e)
  end
  false;
end

#at?(x, y, element) ⇒ Boolean

Returns:

  • (Boolean)


163
164
165
166
# File 'lib/codenjoy/games/battlecity/board.rb', line 163

def at?(x, y, element)
  return false if Point.new(x, y).out_of?(size)
  getAt(x, y) == element;
end

#barrier_at?(x, y) ⇒ Boolean

Returns:

  • (Boolean)


209
210
211
212
# File 'lib/codenjoy/games/battlecity/board.rb', line 209

def barrier_at?(x, y)
  return false if Point.new(x, y).out_of?(size)
  get_barriers.include?([x.to_f, y.to_f]);
end

#board_to_sObject



241
242
243
# File 'lib/codenjoy/games/battlecity/board.rb', line 241

def board_to_s
  Array.new(size).each_with_index.map{ |e, n| @raw[(n * size)..((n + 1) * size - 1)]}.join("\n")
end

#bullet_at?(x, y) ⇒ Boolean

Returns:

  • (Boolean)


224
225
226
227
# File 'lib/codenjoy/games/battlecity/board.rb', line 224

def bullet_at?(x, y)
  return false if Point.new(x, y).out_of?(size)
  getAt(x, y) == ELEMENTS[:BULLET]
end

#count_near(x, y, element) ⇒ Object



214
215
216
# File 'lib/codenjoy/games/battlecity/board.rb', line 214

def count_near(x, y, element)
  get_near(x, y).select{ |e| e == element}.size
end

#find_by_list(list) ⇒ Object



183
184
185
186
187
# File 'lib/codenjoy/games/battlecity/board.rb', line 183

def find_by_list(list)
  result = list.map{ |e| findAll(e) }.flatten.map{ |e| [e.x, e.y] }
  return nil if (result.length == 0)
  result
end

#findAll(element) ⇒ Object



168
169
170
171
172
173
174
175
# File 'lib/codenjoy/games/battlecity/board.rb', line 168

def findAll(element)
  result = []
  @raw.length.times do |i|
    point = xyl.getXY(i);
    result.push(point) if at?(point.x, point.y, element)
  end
  result;
end

#game_over?Boolean

Returns:

  • (Boolean)


237
238
239
# File 'lib/codenjoy/games/battlecity/board.rb', line 237

def game_over?
  get_me.nil?;
end

#get_barriersObject



245
246
247
# File 'lib/codenjoy/games/battlecity/board.rb', line 245

def get_barriers
  find_by_list(BARRIERS)
end

#get_bulletsObject



193
194
195
# File 'lib/codenjoy/games/battlecity/board.rb', line 193

def get_bullets
  find_by_list([ELEMENTS[:BULLET]])
end

#get_enemiesObject



189
190
191
# File 'lib/codenjoy/games/battlecity/board.rb', line 189

def get_enemies
  find_by_list(ENEMIES)
end

#get_meObject



177
178
179
180
181
# File 'lib/codenjoy/games/battlecity/board.rb', line 177

def get_me
  me = find_by_list(TANK)
  return nil if me.nil?
  find_by_list(TANK).flatten
end

#get_near(x, y) ⇒ Object



197
198
199
200
201
202
203
204
205
206
207
# File 'lib/codenjoy/games/battlecity/board.rb', line 197

def get_near(x, y)
  return false if Point.new(x, y).out_of?(size)
  result = []
  (-1..1).each do |dx|
    (-1..1).each do |dy|
        next if (dx == 0 && dy == 0)
        result.push(getAt(x + dx, y + dy))
    end
  end
  result;
end

#getAt(x, y) ⇒ Object



158
159
160
161
# File 'lib/codenjoy/games/battlecity/board.rb', line 158

def getAt(x, y)
  return false if Point.new(x, y).out_of?(size)
  @raw[xyl.getLength(x, y)];
end

#near?(x, y, element) ⇒ Boolean

Returns:

  • (Boolean)


218
219
220
221
222
# File 'lib/codenjoy/games/battlecity/board.rb', line 218

def near?(x, y, element)
  n = get_near(x, y)
  return false if !n
  n.include?(element);
end

#process(data) ⇒ Object



146
147
148
# File 'lib/codenjoy/games/battlecity/board.rb', line 146

def process(data)
  @raw = data
end

#sizeObject



150
151
152
# File 'lib/codenjoy/games/battlecity/board.rb', line 150

def size
  @size ||= Math.sqrt(@raw.length);
end

#to_sObject



249
250
251
252
253
254
255
256
# File 'lib/codenjoy/games/battlecity/board.rb', line 249

def to_s
  [
    "Board:\n#{board_to_s}",
    "My tank at: #{get_me}",
    "Enemies at: #{get_enemies}",
    "Bullets at: #{get_bullets}"
  ].join("\n")
end

#xylObject



154
155
156
# File 'lib/codenjoy/games/battlecity/board.rb', line 154

def xyl
  @xyl ||= LengthToXY.new(size);
end