Перейти к содержимому
Lgmrszd

[OpenComputers] moving api

Рекомендуемые сообщения

Так уж вышло, что Сябро первый выложил на форум библиотеку для робота, а я свою написал ещё неделю назад (скрипач Морф - свидетель)

Так вот, данное поделие служит для управления роботом и получением его координат.

Сам код на pastebin кидать не буду, ибо он слишком прост.

 

 

local moving={}
local robot=require('robot')
local x=0
local y=0
local z=0
local direct='N'
function getX()
  return x
end
function getY()
  return y
end
function getZ()
  return z
end
function getDirection()
return direct
end
function getCoordinates()
  return x,y,z,direct
end

function smartTurnLeft()
  robot.turnLeft()
  if direct=='N' then
    direct='W'
  elseif direct=='W' then
    direct='S'
  elseif direct=='S' then
    direct='E'
  elseif direct=='E' then
    direct='N'
  end
end

function smartTurnRight()
  robot.turnRight()
  if direct=='N' then
    direct='E'
  elseif direct=='E' then
    direct='S'
  elseif direct=='S' then
    direct='W'
  elseif direct=='W' then
    direct='N'
  end
end

function smartTurnAround()
  robot.turnAround()
  if direct=='N' then
    direct='S'
  elseif direct=='W' then
    direct='E'
  elseif direct=='S' then
    direct='N'
  elseif direct=='E' then
    direct='W'
  end
end

function turnNorth()
  if direct=='S' then
    robot.turnAround()
  elseif direct=='W' then
    robot.turnRight()
  elseif direct=='E' then
    robot.turnLeft()
  end
  direct='N'
end

function turnWest()
  if direct=='E' then
    robot.turnAround()
  elseif direct=='S' thenect='N'
end

function turnWest()
if direct=='E' then
robot.turnAround()
elseif direct=='S' then
robot.turnRight()
elseif direct=='N' then
robot.turnLeft()
end
direct='W'
end

function turnSouth()
if direct=='N' then
robot.turnAround()
elseif direct=='E' then
robot.turnRight()
elseif direct=='W' then
robot.turnLeft()
end
direct='S'
end

function turnEast()
if direct=='W' then
robot.turnAround()
elseif direct=='N' then
robot.turnRight()
elseif direct=='S' then
robot.turnLeft()
end
direct='E'
end

function goNorth()
if direct=='N' then
a=robot.forward()
elseif direct=='S' then
a=robot.back()
elseif direct=='W' then
smartTurnRight()
a=robot.forward()
elseif direct=='E' then
smartTurnLeft()
a=robot.forward()
end
if a then
x=x+1
end
return a
end

function goSouth()
if direct=='S' then
a=robot.forward()
elseif direct=='N' then
a=robot.back()
elseif direct=='E' then
smartTurnRight()
a=robot.forward()
elseif direct=='W' then
smartTurnLeft()
a=robot.forward()
end
if a then
x=x-1
end
return a
end

function goWest()
if direct=='W' then
a=robot.forward()
elseif direct=='E' then
a=robot.back()
elseif direct=='S' then
smartTurnRight()
a=robot.forward()
elseif direct=='N' then
smartTurnLeft()
a=robot.forward()
end
if a then
z=z-1
end
return a
end

function goEast()
if direct=='E' then
a=robot.forward()
elseif direct=='W' then
a=robot.back()
elseif direct=='N' then
smartTurnRight()
a=robot.forward()
elseif direct=='S' then
smartTurnLeft()
a=robot.forward()
end
if a then
z=z+1
end
return a
end

function goUp()
if robot.up() then
y=y+1
end
end

function goDown()
if robot.down() then
y=y+1
end
end

moving['getX']=getX
moving['getY']=getY
moving['getZ']=getZ
moving['getDirection']=getDirection
moving['smartTurnAround']=smartTurnAround
moving['smartTurnLeft']=smartTurnLeft
moving['smartTurnRight']=smartTurnRight
moving['turnNorth']=turnNorth
moving['turnEast']=turnEast
moving['turnSouth']=turnSouth
moving['turnWest']=turnWest
moving['goNorth']=goNorth
moving['goSouth']=goSouth
moving['goEast']=goEast
moving['goWest']=goWest
moving['goUp']=goUp
moving['goDown']=goDown
moving['getCoordinates']=getCoordinates
package.loaded['moving']=moving

 

 

Для тех, кто ничего не понял, вот список функций (вместо {side} подставить North, South, West или East соответсвенно):

getCoordinates():x,y,z,d

Возвращает текущее положение робота и его направление (x,y,z - числа, d='N','S','W','E')

go{side}():boolean

Перемещает подопытного. Возвращает true в случае успеха. goUp() и goDown() делают то же самое, только... угадайте куда :) .

smartTurnRight(), smartTurnLeft() и smartTurnAround() - ну тут всё понятно.

turn{Side}() - поворачивают на север, юг... в общем, куда надо.

getX(), getY(), getZ(), getDirection() - интересно, что же они возвращают... (подсказка - первые три - числа, четвёртая - строку)

---------------

Новая версия!

Изменения:

Почти ничего, а именно: добавлены функции goX(), goY(), goZ().

Cкачать можно на Яндекс.Диске.

Изменено пользователем MineUbuntu

Поделиться сообщением


Ссылка на сообщение
Поделиться на других сайтах

Что-то подобное у меня в Recursive Miner за роботом следит.

 

У тебя под спойлером кусок кода продублировался в конце.

 

Кстати, в API которые я видел в OpenComputers немного по другому обычно делалось.

Там вначале объявлялась таблица (moving) и реквайры,

а потом все переменные и функции делались полями этой таблицы сразу.

 

Примерно так:

function moving.getX()
  return x
end
function moving.getY()
  return y
end

А последней строкой библиотеки шло:

return moving

Интересно, есть ли какие-то значительные различия в этих двух методах создания библиотеки.

Изменено пользователем Totoro

Поделиться сообщением


Ссылка на сообщение
Поделиться на других сайтах

Что-то подобное у меня в Recursive Miner за роботом следит.

 

У тебя под спойлером кусок кода продублировался в конце.

 

Кстати, в API которые я видел в OpenComputers немного по другому обычно делалось.

Там вначале объявлялась таблица (moving) и реквайры,

а потом все переменные и функции делались полями этой таблицы сразу.

 

Примерно так:

function moving.getX()
  return x
end
function moving.getY()
  return y
end

А последней строкой библиотеки шло:

return moving

Интересно, есть ли какие-то значительные различия в этих двух методах создания библиотеки.

Так было сделано по совету NEO, так как сначала я делал так, как в исходниках других библиотек, но библиотека не подгружалась.

Поделиться сообщением


Ссылка на сообщение
Поделиться на других сайтах

Так было сделано по совету NEO, так как сначала я делал так, как в исходниках других библиотек, но библиотека не подгружалась.

 

Исходный код сохранился? (Старой версии)

Поделиться сообщением


Ссылка на сообщение
Поделиться на других сайтах

Исходный код сохранился? (Старой версии)

Нет, конечно! Я же редактировал прямо на сервере, и не делал бэкапы.

Но буду признателен, если кто-нибудь подготовит версию с таким способом.

Поделиться сообщением


Ссылка на сообщение
Поделиться на других сайтах

Выложил новую версию.

Поделиться сообщением


Ссылка на сообщение
Поделиться на других сайтах

Присоединяйтесь к обсуждению

Вы можете написать сейчас и зарегистрироваться позже. Если у вас есть аккаунт, авторизуйтесь, чтобы опубликовать от имени своего аккаунта.

Гость
Ответить в тему...

×   Вы вставили отформатированное содержимое.   Удалить форматирование

  Разрешено использовать не более 75 эмодзи.

×   Ваша ссылка была автоматически встроена.   Отобразить как ссылку

×   Ваш предыдущий контент был восстановлен.   Очистить редактор

×   Вы не можете вставлять изображения напрямую. Загружайте или вставляйте изображения по ссылке.


×
×
  • Создать...