Ruby gem of crazy robots and benevolent tables that keep watching over them.
Issue commands to control the robots and the tables will keep you from making them fall.
You monster!
- GLadOS
- Robots can not move until placed on a table.
- Robots are free to roam around the surface of the table, but will be prevented from
- falling from the table
- crashing into other robots on the same table
Via RubyGems:
$ gem install loco_bot
Or in a Gemfile:
gem 'loco_bot'
From the CLI, you can place a robot on a table of 5x5 and play around with it.
This means you only have a unique instance of Robot
and Table
available through this interface.
To use multiple robots and tables, see the API usage further below.
Just run the binary and start typing commands:
$ loco_bot_cli
Available commands are:
-
PLACE X,Y,F
Puts the robot on the table in position X,Y and facing NORTH, SOUTH, EAST or WEST.
-
MOVE
Moves the robot one unit forward in the direction it is currently facing.
-
LEFT and RIGHT
Rotates the robot 90 degrees in the specified direction without changing its position.
-
REPORT
Announces the X,Y and F of the robot.
-
HODOR
Outputs a friendly greating.
Example:
$ loco_bot_cli
PLACE 1,2,SOUTH
MOVE
LEFT
MOVE
MOVE
REPORT
0,4,EAST
You can also use files to issue commands, like so:
$ loco_bot_cli < ./spec/support/test_1.txt
Full documentation is available here.
You can specify the dimensions of the Table
. Default dimensions are 5x5.
table = LocoBot::Table.new
table.width # => 5
table.height # => 5
table = LocoBot::Table.new(20, 25)
table.width # => 20
table.height # => 25
Place the given Robot
on the Table
.
This method works the same way as Robot#place
, only a Robot
is passed as first argument instead of a Table
.
Placing a Robot
on a Table
will:
-
update the
Table
's list ofRobot
srobot = LocoBot::Robot.new table = LocoBot::Table.new(10, 20) table.robots # => [] table.place_robot(robot, 2, 3, LocoBot::Robot::Direction::North) # => true table.robots # => [#<LocoBot::Robot:0x007f9212e7ad5>]
-
update the
Robot
's positionsrobot = LocoBot::Robot.new table = LocoBot::Table.new(10, 20) robot.x # => nil robot.y # => nil robot.direction # => nil robot.table # => nil table.place_robot(robot, 2, 3, LocoBot::Robot::Direction::North) # => true robot.x # => 2 robot.y # => 3 robot.direction # => LocoBot::Robot::Direction::North robot.table # => #<LocoBot::Table:0x007f9212e62480 @width=10, @height=20>
A Robot
can not be placed on a spot outside the Table
.
robot = LocoBot::Robot.new
table = LocoBot::Table.new(10, 20)
table.place_robot(robot, 100, 12, LocoBot::Robot::Direction::North) # => false
robot.table # => nil
table.robots # => []
A Robot
can not be placed on a spot of the Table
where there is another Robot
.
robot = LocoBot::Robot.new
table = LocoBot::Table.new(10, 20)
table.place_robot(LocoBot::Robot.new, 2, 3, LocoBot::Robot::Direction::North) # => true
table.place_robot(robot, 2, 3, LocoBot::Robot::Direction::East) # => false
robot.table # => nil
table.robots.count # => 1
Removes the given Robot
from the Table
.
robot = LocoBot::Robot.new
table = LocoBot::Table.new(10, 20)
table.place_robot(robot, 2, 3, LocoBot::Robot::Direction::North) # => true
table.robots # => [#<LocoBot::Robot:0x007f9212e7ad5>]
robot.table # => #<LocoBot::Table:0x007f9212e62480 @width=10, @height=20>
table.remove_remove(robot)
table.robots # => []
robot.table # => nil
All the following methods, except for #report
and #hodor
, return a Boolean
.
If they return true
, the operation as succeded and the state of the Robot has changed. They will return false
otherwise.
Place the Robot
on the given Table
.
This method works the same way as Table#place_robot
, only a Table
is passed as first argument instead of a Robot
.
Placing a Robot
on a Table
will:
-
update the
Table
's list ofRobot
srobot = LocoBot::Robot.new table = LocoBot::Table.new(10, 20) table.robots # => [] robot.place(table, 2, 3, LocoBot::Robot::Direction::North) # => true table.robots # => [#<LocoBot::Robot:0x007f9212e7ad5>]
-
update the
Robot
's positionsrobot = LocoBot::Robot.new table = LocoBot::Table.new(10, 20) robot.x # => nil robot.y # => nil robot.direction # => nil robot.table # => nil robot.place(table, 2, 3, LocoBot::Robot::Direction::North) # => true robot.x # => 2 robot.y # => 3 robot.direction # => LocoBot::Robot::Direction::North robot.table # => #<LocoBot::Table:0x007f9212e62480 @width=10, @height=20>
A Robot
can not be placed on a spot outside the Table
.
robot = LocoBot::Robot.new
table = LocoBot::Table.new(10, 20)
robot.place(table, 100, 12, LocoBot::Robot::Direction::North) # => false
robot.table # => nil
table.robots # => []
A Robot
can not be placed on a spot of the Table
where there is another Robot
.
robot = LocoBot::Robot.new
table = LocoBot::Table.new(10, 20)
LocoBot::Robot.new.place(table, 2, 3, LocoBot::Robot::Direction::North) # => true
robot.place(table, 2, 3, LocoBot::Robot::Direction::East) # => false
robot.table # => nil
table.robots.count # => 1
Removes the Robot
from its current Table
.
robot = LocoBot::Robot.new
table = LocoBot::Table.new(10, 20)
robot.place(table, 2, 3, LocoBot::Robot::Direction::North) # => true
table.robots # => [#<LocoBot::Robot:0x007f9212e7ad5>]
robot.table # => #<LocoBot::Table:0x007f9212e62480 @width=10, @height=20>
robot.remove
table.robots # => []
robot.table # => nil
Changes the Robot
's facing direction without changing its position.
robot = LocoBot::Robot.new
table = LocoBot::Table.new
robot.place(table, 2, 3, LocoBot::Robot::Direction::West)
robot.direction # => LocoBot::Robot::Direction::West
robot.turn_right # => true
robot.direction # => LocoBot::Robot::Direction::North
robot.turn_left # => true
robot.direction # => LocoBot::Robot::Direction::West
Moves the robot one unit forward in the direction it is currently facing.
robot = LocoBot::Robot.new
table = LocoBot::Table.new
robot.place(table, 2, 3, LocoBot::Robot::Direction::West)
robot.move # => true
robot.x # => 1
robot.y # => 3
The robot will not move if it makes it fall out of the table.
robot = LocoBot::Robot.new
table = LocoBot::Table.new
robot.place(table, 0, 0, LocoBot::Robot::Direction::South)
robot.move # => false
robot.x # => 0
robot.y # => 0
It will not move either if there is another robot on the destination spot.
robot = LocoBot::Robot.new
table = LocoBot::Table.new
LocoBot::Robot.new.place(table, 0, 0, LocoBot::Robot::Direction::South)
robot.move # => false
robot.x # => 0
robot.y # => 0
Returns a Hash describing the Robot
's position and facing direction.
robot = LocoBot::Robot.new
table = LocoBot::Table.new
robot.place(table, 2, 3, LocoBot::Robot::Direction::West)
robot.report
# => {x: 2, y: 3, direction: LocoBot::Robot::Direction::West}
Outputs a friendly message.
LocoBot::Robot.new.hodor!
# stdout => "HODOR HODOR !\n"
You can still access the command line interface through code.
cli = LocoBot::CLI.new
cli.input!('PLACE 1,2,WEST')
cli.robot.x # => 1
cli.robot.y # => 2
cli.robot.direction # => LocoBot::Robot::Direction::West
Copyright 2014 Rafaël Gonzalez
Released under the terms of the MIT licence. See the LICENSE file for more details.
- Fork it ( https://github.com/rafaelgonzalez/loco_bot/fork )
- Create your feature branch (
git checkout -b my-new-feature
) - Commit your changes (
git commit -am 'Add some feature'
) - Push to the branch (
git push origin my-new-feature
) - Create a new Pull Request