Перейти к публикации
Форум - ComputerCraft
theCPU

Управление роботом через чат

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

Робот получает сигналы через "улучшение: чат" из мода Computronics

Управление 

q = Вниз

e = Вверх

w = Вперёд

s = Назад

a = Поворот налево

d = Поворот направот

Пример: #qewsad

 

 

local component = require("component")

local event = require("event")
local robot = require("robot")
 
function check(t) --Проверка и выполнения команд
tostring(t)
for i = 1,#t do
if t[1] == "#" then 
table.remove(t,1)
elseif t[1] == "w" then
robot.forward()
table.remove(t,1)
elseif t[1] == "a" then
robot.turnLeft()
table.remove(t,1)
elseif t[1] == "s" then
robot.back()
table.remove(t,1)
elseif t[1] == "d" then
robot.turnRight()
table.remove(t,1)
elseif t[1] == "e" then
robot.up()
table.remove(t,1)
elseif t[1] == "q" then
robot.down()
table.remove(t,1)
else end
os.sleep(0.1) --Задержка
end
end
 
while true do
local _, _, _, msg = event.pull("chat_message") --Получение сообщения из чата
t = {}
str=msg
str:gsub(".",function© table.insert(t,c) end) --Перевод строки в массив
if t[1] == "#" then -- Если содержит символ # то далее происходит выполнение команды
check(t)
end
os.sleep(0.05) --задержка
t=0 --Очистка массива
end

  • Like 2

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


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

Массив можно было вообще не очищать,ну и очистка делается присвоением nil или {}

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


Ссылка на сообщение
Поделиться на других сайтах
local component = require("component")
local event = require("event")
local robot = component.robot

local function move(side)
  if not robot.detect(side) and not robot.move(side) then
    move(side)
  end
end

local CMD = {
  w = function() move(3) end,
  a = function() robot.turn(false) move(3) end,
  s = function() robot.move(2) end,
  d = function() robot.turn(true) move(3) end,
  e = function() move(1) end,
  q = function() move(0) end
}

while true do
  local e = {event.pull('chat_message')}
  if e[4]:sub(1,1) == '#' then
    for i = 2, #e[4] do
      local index = e[4]:sub(i,i)
      if CMD[index] then
        CMD[index]()
      end
    end
  end
end

А вот версия для ЕЕPROM:

local robot = component.proxy(component.list('robot')())
 
local function move(side)
  if not robot.detect(side) and not robot.move(side) then
    move(side)
  end
end
 
local CMD = {
  w = function() move(3) end,
  a = function() robot.turn(false) move(3) end,
  s = function() robot.move(2) end,
  d = function() robot.turn(true) move(3) end,
  e = function() move(1) end,
  q = function() move(0) end
}
 
while true do
  local e = {computer.pullSignal()}
  if e[1] == 'chat_message' and e[4]:sub(1,1) == '#' then
    for i = 2, #e[4] do
      local index = e[4]:sub(i,i)
      if CMD[index] then
        CMD[index]()
      end
    end
  end
end
Изменено пользователем Doob
  • Like 5

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


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

Массив можно было вообще не очищать,ну и очистка делается присвоением nil или {}

Не очищали мы массив, остался в памяти, и потом... not enough memory...

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


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

@theCPU: Используй тег разметки code для оформления кода. Это поможет сохранить отступы, облегчит чтение кода другим участниками и подтолкнет и к кнопочке «Нравится».

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


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

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

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

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

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

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

Войти

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

Войти сейчас

×