71 lines
1.5 KiB
Lua
71 lines
1.5 KiB
Lua
--[[
|
|
Author: Andrew Lalis
|
|
File: movescript.lua
|
|
Version: 1.0
|
|
Last Modified: 27-09-2018
|
|
|
|
Description:
|
|
This library enables string representation of robot movement, for easier
|
|
robotic control without repeating functions many times.
|
|
--]]
|
|
|
|
local r = require("robot")
|
|
|
|
local movescript = {}
|
|
|
|
local functionMap = {
|
|
["U"] = r.up,
|
|
["D"] = r.down,
|
|
["L"] = r.turnLeft,
|
|
["R"] = r.turnRight,
|
|
["F"] = r.forward,
|
|
["B"] = r.back
|
|
}
|
|
|
|
--[[
|
|
Executes a single instruction once.
|
|
c - character: One uppercase character to translate into movement.
|
|
--]]
|
|
local function executeChar(c)
|
|
local f = functionMap[c]
|
|
if (f == nil) then
|
|
return
|
|
end
|
|
local success = f()
|
|
while (not success) do
|
|
success = f()
|
|
end
|
|
end
|
|
|
|
--[[
|
|
Executes a single instruction, such as '15D'
|
|
instruction - string: An integer followed by an uppercase character.
|
|
--]]
|
|
local function executeInstruction(instruction)
|
|
local count = string.match(instruction, "%d+")
|
|
local char = string.match(instruction, "%u")
|
|
if (count == nil) then
|
|
count = 1
|
|
end
|
|
if (char == nil) then
|
|
return
|
|
end
|
|
for i=1,count do
|
|
executeChar(char)
|
|
end
|
|
end
|
|
|
|
--[[
|
|
Executes a given script.
|
|
script - string: The script to execute.
|
|
--]]
|
|
function movescript.execute(script)
|
|
while (script ~= nil and script ~= "") do
|
|
-- Matches the next instruction, possibly prefixed by an integer value.
|
|
local next_instruction = string.match(script, "%d*%u")
|
|
executeInstruction(next_instruction)
|
|
script = string.sub(script, string.len(next_instruction) + 1)
|
|
end
|
|
end
|
|
|
|
return movescript |