Class: Battlesnake::Board

Inherits:
Base
  • Object
show all
Defined in:
lib/battlesnake/board.rb

Overview

Represents a single iteration (turn) of a Battlesnake board during gameplay.

Instance Attribute Summary collapse

Instance Method Summary collapse

Methods inherited from Base

#==

Constructor Details

#initialize(json_or_hash) ⇒ Board

Returns a new instance of Board.

Parameters:

  • json_or_hash (String, Hash)

    can be a hash of attributes, or a JSON string which represents such a structure.



32
33
34
35
36
37
38
39
40
41
# File 'lib/battlesnake/board.rb', line 32

def initialize(json_or_hash)
  data = json_or_hash.is_a?(String) ? JSON.parse(json_or_hash) : json_or_hash

  @as_json = data
  @height = data['height']
  @width = data['width']
  @snakes = data['snakes'].map{ |attrs| Snake.new(attrs) }
  @food = data['food'].map{ |attrs| Location.new(attrs) }
  @hazards = data['hazards'].map{ |attrs| Location.new(attrs) }
end

Instance Attribute Details

#as_jsonHash (readonly)

Returns board as a data structure usable by other objects.

Returns:

  • (Hash)

    board as a data structure usable by other objects.



8
9
10
# File 'lib/battlesnake/board.rb', line 8

def as_json
  @as_json
end

#foodArray<Location> (readonly)

Returns list of food location objects.

Returns:

  • (Array<Location>)

    list of food location objects



20
21
22
# File 'lib/battlesnake/board.rb', line 20

def food
  @food
end

#hazardsArray<Location> (readonly)

Returns list of hazard location objects.

Returns:

  • (Array<Location>)

    list of hazard location objects



23
24
25
# File 'lib/battlesnake/board.rb', line 23

def hazards
  @hazards
end

#heightInteger (readonly)

Returns height of the board.

Returns:

  • (Integer)

    height of the board



11
12
13
# File 'lib/battlesnake/board.rb', line 11

def height
  @height
end

#snakesArray<Snake> (readonly)

Returns list of snake objects.

Returns:

  • (Array<Snake>)

    list of snake objects



17
18
19
# File 'lib/battlesnake/board.rb', line 17

def snakes
  @snakes
end

#widthInteger (readonly)

Returns width of the board.

Returns:

  • (Integer)

    width of the board



14
15
16
# File 'lib/battlesnake/board.rb', line 14

def width
  @width
end

Instance Method Details

#available?(location) ⇒ Boolean

Whether the supplied location is available (unoccupied).

Parameters:

  • location (Location)

    being tested for availability.

Returns:

  • (Boolean)

    true if location is available (unoccupied by snakes, food, hazards, etc).



78
79
80
# File 'lib/battlesnake/board.rb', line 78

def available?(location)
  on_board?(location) && !occupied?(location)
end

#available_directions(location) ⇒ Array<String>

List of directions (up, down, left, right) available for moving from given Location.

Parameters:

  • location (Location)

    from which moving is desired.

Returns:

  • (Array<String>)

    list of direction strings (“up”, “down”, “left”, “right”)



88
89
90
91
92
# File 'lib/battlesnake/board.rb', line 88

def available_directions(location)
  Location::DIRECTIONS.select do |direction|
    available?(location.move(direction))
  end
end

#occupied?(location) ⇒ Boolean

Whether the supplied location is occupied.

Parameters:

  • location (Location)

    being checked for occupancy.

Returns:

  • (Boolean)

    true if location is occupied by snakes, food, hazards, etc.



58
59
60
# File 'lib/battlesnake/board.rb', line 58

def occupied?(location)
  occupied_locations.include?(location)
end

#occupied_locationsArray<Location>

List of all occupied locations on the board; snakes, food, hazards, etc

Returns:

  • (Array<Location>)

    list of occupied locations



47
48
49
50
# File 'lib/battlesnake/board.rb', line 47

def occupied_locations
  return @occupied_locations if defined?(@occupied_locations)
  @occupied_locations = snakes.map(&:body).flatten + food + hazards
end

#on_board?(location) ⇒ Boolean

Where the supplied location falls within the boundaries of the board.

Parameters:

Returns:

  • (Boolean)

    true if location is within the boundaries of the board.



68
69
70
# File 'lib/battlesnake/board.rb', line 68

def on_board?(location)
  location.x >= 0 && location.y >= 0 && location.x < width && location.y < height
end

#paths(from, to) ⇒ Array<Path>

List of valid, consecutive paths from one location to the next. Paths may not:

- wander outside board boundaries.
- use the same location more than once.
- contain occupied locations, EXCEPT the start/end locations.

The exception for start/end locations allows us to generate paths, for example, from a snake to a food location, without having to calulate the starting/ending permutations ourselves.

Parameters:

  • from (Location)

    starting location, may be occupied

  • to (Location)

    starting location, may be occupied

Returns:

  • (Array<Path>)

    a list of paths, which themselves are lists of consecutive, valid locations.



108
109
110
# File 'lib/battlesnake/board.rb', line 108

def paths(from, to)

end