Class: RubyWarrior::Position
- Inherits:
-
Object
- Object
- RubyWarrior::Position
- Defined in:
- lib/ruby_warrior/position.rb
Constant Summary collapse
- DIRECTIONS =
[:north, :east, :south, :west]
- RELATIVE_DIRECTIONS =
[:forward, :right, :backward, :left]
Instance Attribute Summary collapse
-
#floor ⇒ Object
readonly
Returns the value of attribute floor.
Instance Method Summary collapse
- #at?(x, y) ⇒ Boolean
- #direction ⇒ Object
- #direction_of(space) ⇒ Object
- #distance_from_stairs ⇒ Object
-
#initialize(floor, x, y, direction = nil) ⇒ Position
constructor
A new instance of Position.
- #move(forward, right = 0) ⇒ Object
- #relative_direction(direction) ⇒ Object
- #relative_direction_of(space) ⇒ Object
- #relative_direction_of_stairs ⇒ Object
- #relative_space(forward, right = 0) ⇒ Object
- #rotate(amount) ⇒ Object
- #space ⇒ Object
Constructor Details
#initialize(floor, x, y, direction = nil) ⇒ Position
Returns a new instance of Position.
7 8 9 10 11 12 |
# File 'lib/ruby_warrior/position.rb', line 7 def initialize(floor, x, y, direction = nil) @floor = floor @x = x @y = y @direction_index = DIRECTIONS.index(direction || :north) end |
Instance Attribute Details
#floor ⇒ Object (readonly)
Returns the value of attribute floor.
3 4 5 |
# File 'lib/ruby_warrior/position.rb', line 3 def floor @floor end |
Instance Method Details
#at?(x, y) ⇒ Boolean
14 15 16 |
# File 'lib/ruby_warrior/position.rb', line 14 def at?(x, y) @x == x && @y == y end |
#direction ⇒ Object
18 19 20 |
# File 'lib/ruby_warrior/position.rb', line 18 def direction DIRECTIONS[@direction_index] end |
#direction_of(space) ⇒ Object
53 54 55 56 57 58 59 60 |
# File 'lib/ruby_warrior/position.rb', line 53 def direction_of(space) space_x, space_y = *space.location if (@x - space_x).abs > (@y - space_y).abs space_x > @x ? :east : :west else space_y > @y ? :south : :north end end |
#distance_from_stairs ⇒ Object
40 41 42 43 |
# File 'lib/ruby_warrior/position.rb', line 40 def distance_from_stairs stairs_x, stairs_y = *@floor.stairs_location (@x - stairs_x).abs + (@y - stairs_y).abs end |
#move(forward, right = 0) ⇒ Object
36 37 38 |
# File 'lib/ruby_warrior/position.rb', line 36 def move(forward, right = 0) @x, @y = *translate_offset(forward, right) end |
#relative_direction(direction) ⇒ Object
62 63 64 65 66 67 |
# File 'lib/ruby_warrior/position.rb', line 62 def relative_direction(direction) offset = DIRECTIONS.index(direction) - @direction_index offset -= 4 while offset > 3 offset += 4 while offset < 0 RELATIVE_DIRECTIONS[offset] end |
#relative_direction_of(space) ⇒ Object
49 50 51 |
# File 'lib/ruby_warrior/position.rb', line 49 def relative_direction_of(space) relative_direction(direction_of(space)) end |
#relative_direction_of_stairs ⇒ Object
45 46 47 |
# File 'lib/ruby_warrior/position.rb', line 45 def relative_direction_of_stairs relative_direction_of(@floor.stairs_space) end |
#relative_space(forward, right = 0) ⇒ Object
28 29 30 |
# File 'lib/ruby_warrior/position.rb', line 28 def relative_space(forward, right = 0) @floor.space(*translate_offset(forward, right)) end |
#rotate(amount) ⇒ Object
22 23 24 25 26 |
# File 'lib/ruby_warrior/position.rb', line 22 def rotate(amount) @direction_index += amount @direction_index -= 4 while @direction_index > 3 @direction_index += 4 while @direction_index < 0 end |
#space ⇒ Object
32 33 34 |
# File 'lib/ruby_warrior/position.rb', line 32 def space @floor.space(@x, @y) end |