Перейти к публикации
Новости
  • В ближайшее время постараюсь разобраться с картой сервера/ЛК/бб кодами
  • Новости
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
  • Like 2

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


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

Что-то подобное у меня в 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, так как сначала я делал так, как в исходниках других библиотек, но библиотека не подгружалась.

 

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

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


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

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

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

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

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


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

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

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


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

Создайте аккаунт или войдите в него для комментирования

Вы должны быть пользователем, чтобы оставить комментарий

Создать аккаунт

Зарегистрируйтесь для получения аккаунта. Это просто!

Зарегистрировать аккаунт

Войти

Уже зарегистрированы? Войдите здесь.

Войти сейчас

×