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

OpenComputers. SAPI

Объяснение  

7 пользователей проголосовало

У вас нет разрешения голосовать в этом опросе или просматривать его результаты. Пожалуйста, войдите или зарегистрируйтесь для голосования в опросе.

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

Хочу представить свой апи который я назвал в свою честь: SAPI
API это предназначено для моду OpenComputers, представляет собой как функции для робота так и для обычного компьютера. Сейчас имеются такие функции:
* moveToCord(a, b, f): side если не указана
* algLi2D(grid, ax, ay, bx, by): boolean, px, py
* algLi3D(grid, a, b): boolean, px, py, pz
* sendFile(fileName): nil
* receiveFile(): nil
Пока это все.

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

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


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

А так понимаю, это две библиотеки.

Одна - алгоритмы поиска пути для робота по известной карте.

Вторая - для пересылке файлов по сети.

 

Я думаю стоит разбить на две небольшие библиотеки, сделать каждой описание и ссылку на Pastebin.

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


Ссылка на сообщение
Поделиться на других сайтах
А так понимаю, это две библиотеки.

Одна - алгоритмы поиска пути для робота по известной карте.

Вторая - для пересылке файлов по сети.

 

Я думаю стоит разбить на две небольшие библиотеки, сделать каждой описание и ссылку на Pastebin.

Это библиотека функций которые я писал и использовал, могу разбить на "классы"

Добавил 3 класса:

1. Robot

* moveToCord()

2. Map

* algLi2D()

* algLi3D()

3. Modem

* sendFile()

* receiveFile()

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


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

Вобщем работают они так:

* robot.moveToCord(a: table, b: table, f: table): nil

Эта функция принимает 2 таблицы a и b структуры {["x"] = x: number, ["y"] = y: number, ["z"] = z: number, ["side"] = side: number[1..4]} точка a содержит координаты старта робота, b содержит координаты конечной точки. Также функция принимает f = {["uWall"] = f: function, ["dWall"] = f: function, ["wall"] = f: fucntion} это функции которые будут выполняться когда робот замечает преграду:

uWall - преграда вверху

dWall - внизу

wall - спереди

Пример вызова функции:

local moov = require("sapi").robot
local a = {} --создаем точку а
a.x = 0
a.y = 0
a.z = 0
a.side = 1
local b = {} --создаем точку b
b.x = 5
b.y = 2
b.z = 3
b.side = 2 --в конце робот обязательно повернется направо относительно начального положения
function sReturn() --создаем функцию для возврата false при обнаружении стены
  return false
end
local f = {}
f.wall = sReturn
f.uWall = sReturn
f.dWall = sReturn
moov.moveToCord(a, b, f) --в итоге робот проедет 5 блоков вперед, 3 блока направо, поднисется на 2 блока и повернется направо относительно начального положения
Изменено пользователем Syabro

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


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

* map.algLi2D(grid: table, ax: number, ay:number, bx: number, by: number): boolean, table, table

Функция принимает карту в виде таблицы grid[x][y], координаты начала x = ax, y = ay и координаты конца x = bx, y = by. Карта должа состоять из значений: стена = -1, пустота = -2

Фозвращает функция: true или false в зависимости от проходимости карты, если true то после идет 2 таблицы с координатами шагов. Первая таблица x, вторая - y.

Пример использования:

local moov = require("sapi").robot
local map = require("sapi").map
local grid = tableRead("map") --считываем карту, такой функции в этот API еще нет, скоро добавлю!
local r1,r2,r3 = map.algLi2D(grid,1,1,15,17) --получаем координаты шагов для робота
local side = 1
local a, b = {}, {} --создаем точки для функции moveToCordfunction 
a.x, a.y, a.z, a.side = 1, 1, 1, 1
function fail() --иначе это никак не назовешь...
  return "fail"
end
local x, z = 1, 1 --присваеваем начальные координаты робота
lcoal f = {} --создаем таблицу ошибок
f.wall = fail
f.uWall = fail
f.dWall = fail
if r1 then --если есть проход:
  for k=1,#r2 do
    b.x = r2[k]
    b.y = 1 --высота всегда одна и не меняется так что можно оставить 1
    b.z = r3[k] --сделал если не указать side робот не повернется в конце и возратит свой side
    side = moov.moveToCord(a, b, f) --удобно использовать эту функцию т.к. она легко поворачивает и передвигает робота
    a = b
    a.side = side
  end
end
Изменено пользователем Syabro

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


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

* map.algLi3D(grid: table, a: table, b: table): boolean, table, table, table

Эта функция как и предидущая принимает карту но уже трехмерную: grid[x][y][z], точку a типа {x,y,z} и точку b такого же типа. Эти точки - точка начала и точка конца соответственно. Возвращает функция boolean зависящий от проходимости карты, и три даблицы: x, y и z - координаты шагов.

Пример использования:

local map = require("sapi").map
local moov = require("sapi").robot
local grid = tableRead("map")

local r1, r2, r3, r4 = map.algLi3D(grid,{1,1,1},{15,17,1}) --проходим карту

local a,b = {},{}

function fail() --иначе это никак не назовешь...
  return "fail"
end

lcoal f = {} --создаем таблицу ошибок
f.wall = fail
f.uWall = fail
f.dWall = fail

a.x = 1
a.y = 1
a.z = 1
a.side = 1

if r1 then --если карта проходима отправляем робота по ней
  for k=1,#r2 do
    b.x = r2[k]
    b.y = r3[k]
    b.z = r4[k]
    b.side = nil --теперь если b.side == nil то робот не поворачиватеся
    local side = moov.moveToCord(a,b) -- и возвращает сторону в которую сейчас смотрит
    a = b --ну робот проехал шаг и его координаты стали конечной точкой
    a.side = side --а вот сторону он нам должен сказать...
  end
end

P.s. пример писал на скорую руку по этому может не работать...

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

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


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

* modem.receiveFile(): nil

* modem.sendFile(fileName): nil

С эити все прост! Если вм нужно скачать программу с робота на основной компьютер или с планшета на планшет можно воспользоваться этими функциями. На компьютере приемнике вызываем receiveFile после этого визываем на компьютере отправителе sendFile передав название файла. Далее функции инициализируют друг друга по локальной сети и начинают отправку файла, на компьютере приемнике файл сохраняется в точности как на компьютере отправителе т.е. если на компьютере отправителе фойла "/lolsFiles/lol[n].lua" то и на компьютере приемнике он сохранится в этом же адресе!

Ну вроде как-то так...

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


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

Вышла ошибочка... Передавать файл из иной папки нельзя. Можно передать файл который находится уже в соданой папке на принимающем компьютере, наверное, например "/bin/internet.lua"

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


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

Вскором времени добавлю класс lift. Что в нем за функции будут угадайте сами :3

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


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

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

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

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

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

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

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

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

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


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