Class: Battlesnake::Board
Overview
Represents a single iteration (turn) of a Battlesnake board during gameplay.
Instance Attribute Summary collapse
-
#as_json ⇒ Hash
readonly
Board as a data structure usable by other objects.
-
#food ⇒ Array<Location>
readonly
List of food location objects.
-
#hazards ⇒ Array<Location>
readonly
List of hazard location objects.
-
#height ⇒ Integer
readonly
Height of the board.
-
#snakes ⇒ Array<Snake>
readonly
List of snake objects.
-
#width ⇒ Integer
readonly
Width of the board.
Instance Method Summary collapse
-
#available?(location) ⇒ Boolean
Whether the supplied location is available (unoccupied).
-
#available_directions(location) ⇒ Array<String>
List of directions (up, down, left, right) available for moving from given Location.
-
#available_neighbors(location) ⇒ Array<Location>
List of neighboring locations available for moving from given Location.
-
#find_path(from, to, max_distance: nil) ⇒ Array<Path>
List of valid, consecutive paths from one location to the next.
-
#flood_fills(location) ⇒ Hash
List reachable locations in each orthogonal direction.
-
#food?(location) ⇒ Boolean
Whether the supplied location is food.
-
#initialize(json_or_hash) ⇒ Board
constructor
Returns a new instance of Board.
-
#occupied?(location) ⇒ Boolean
Whether the supplied location is occupied.
-
#occupied_locations ⇒ Array<Location>
List of all occupied locations on the board; snakes, hazards, etc.
-
#on_board?(location) ⇒ Boolean
Where the supplied location falls within the boundaries of the board.
Methods inherited from Base
Constructor Details
#initialize(json_or_hash) ⇒ Board
Returns a new instance of Board.
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_json ⇒ Hash (readonly)
Returns 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 |
#food ⇒ Array<Location> (readonly)
Returns list of food location objects.
20 21 22 |
# File 'lib/battlesnake/board.rb', line 20 def food @food end |
#hazards ⇒ Array<Location> (readonly)
Returns list of hazard location objects.
23 24 25 |
# File 'lib/battlesnake/board.rb', line 23 def hazards @hazards end |
#height ⇒ Integer (readonly)
Returns height of the board.
11 12 13 |
# File 'lib/battlesnake/board.rb', line 11 def height @height end |
#snakes ⇒ Array<Snake> (readonly)
Returns list of snake objects.
17 18 19 |
# File 'lib/battlesnake/board.rb', line 17 def snakes @snakes end |
#width ⇒ Integer (readonly)
Returns 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).
79 80 81 |
# File 'lib/battlesnake/board.rb', line 79 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.
99 100 101 102 103 |
# File 'lib/battlesnake/board.rb', line 99 def available_directions(location) Location::DIRECTIONS.select do |direction| available?(location.move(direction)) end end |
#available_neighbors(location) ⇒ Array<Location>
List of neighboring locations available for moving from given Location.
111 112 113 |
# File 'lib/battlesnake/board.rb', line 111 def available_neighbors(location) Location::DIRECTIONS.map{ |direction| location.move(direction) }.select{ |l| available?(l) } end |
#find_path(from, to, max_distance: nil) ⇒ 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.
146 147 148 149 150 151 152 153 154 155 156 157 158 |
# File 'lib/battlesnake/board.rb', line 146 def find_path(from, to, max_distance: nil) distance = from.distance(to) return nil if max_distance && max_distance < distance @paths = [] @ideal_path_size = distance + 1 @shortest_path_size = max_distance || @ideal_path_size @ideal_path_size_found = false recursive_paths(from, to, [from]) @paths.select{ |path| path.size == @shortest_path_size }.first end |
#flood_fills(location) ⇒ Hash
List reachable locations in each orthogonal direction.
119 120 121 122 123 124 125 126 127 128 129 130 |
# File 'lib/battlesnake/board.rb', line 119 def flood_fills(location) fills = Location::DIRECTIONS.map{ |direction| [direction, []]}.to_h available_directions(location).each do |direction| @flood_fill_checked = [] @flood_fill_matches = [] fills[direction] = flood_fill(location.move(direction)) #.uniq(&:coords) end fills end |
#food?(location) ⇒ Boolean
Whether the supplied location is food.
89 90 91 |
# File 'lib/battlesnake/board.rb', line 89 def food?(location) food.include?(location) end |
#occupied?(location) ⇒ Boolean
Whether the supplied location is occupied.
59 60 61 |
# File 'lib/battlesnake/board.rb', line 59 def occupied?(location) occupied_locations.include?(location) end |
#occupied_locations ⇒ Array<Location>
List of all occupied locations on the board; snakes, hazards, etc. Does NOT include food, since we don’t want to avoid that.
48 49 50 51 |
# File 'lib/battlesnake/board.rb', line 48 def occupied_locations return @occupied_locations if defined?(@occupied_locations) @occupied_locations = snakes.map(&:body).flatten + hazards end |
#on_board?(location) ⇒ Boolean
Where the supplied location falls within the boundaries of the board.
69 70 71 |
# File 'lib/battlesnake/board.rb', line 69 def on_board?(location) location.x >= 0 && location.y >= 0 && location.x < width && location.y < height end |