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

bob558

Пользователи
  • Публикации

    95
  • Зарегистрирован

  • Посещение

  • Победитель дней

    1

Сообщения, опубликованные пользователем bob558


  1. Большое спасибо, за мысли !

    Сейчас разбираюсь с информацией от врат.

     

    Вот простой код, который соеденяет на 30 сеунд врата:

    local comp = require("component")
    local sg = comp.stargate
    local term = require("term")
    
    
    function main()
      term.clear()
      print("Введите адрес врат: ")
      local address = io.read()
      sg.dial(address)
      os.sleep(30)
      sg.disconnect()
    end
    
    
    while true do
     main()
    end

    StarGate control panel  смотрел, но там все завязано на keypad. Я хотел сам устанавливать адреса врат.


  2. Здравствуйте!

     

    Подскажите, как с помощью опенкомпутера соединить две или три воротины из мода Stargate?

    Пытался разобраться в чужих программах. Не понимаю как соединяться с другими воротами, если известны адреса ворот. 


  3. Я проверил по поиску, такой темы не было. Обсуждалось внутри других тем, поэтому найти, где об этом говорилось, достаточно сложно. 

     

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

     

    Такая конструкция кода будет работать, если заранее известно, что роботу в передвижении ничего мешать не будет?

    1. function go()
        while not robot.forward() do
          robot.forward()
        end
      end

    Или он после первой неудачной попытки сделает 2 шага?

     

    Может так?

    repeat    
     until robot.forward()

  4. У сервера есть свооя частная жизнь и часто роботы об этом не знают. Запустив робота, его можно будет потом найти в дальнем углу, куда он ну никак не должен был пойти.

     

    Заметил, что часто это лечат так:

    robot.forward(); os.sleep(0.5)

    Кто-то ставит счетчик движения по координатам.

    function go() 
       while not robot.forward() do 
          robot.swing() 
       end 
       coords.x=coords.x + sx[coords.side];coords.y = coords.y + sy[coords.side]  
    end

    Как вы справляетесь с лагами сервера?


  5. Готова альфа-версия отладчика:

    attachicon.gifDebuger.png

    Отладчик позволяет выполнять код программы пошагово либо до точки останова. Также реализована возможность просмотра текущего значения переменных.

    Предложите кто нибудь тестовый код, чтобы я оформил статью.

    Как быстро! И это средствами LUA в майне?


  6. В далеком 93-м, когда программировал на ассемблере под КР580ВМ80А, была программа "Отладчик", которая показывала значение всех регистров, можно было делать точки останова программе....

     

    Возможно ли такое для LUA?

     

    Какие есть инструменты, методы, чтобы выявить ошибки кода?


  7. Вот кстати непонятно, как лаг сервера может сбить робота.

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

     

    Была такая штука, когда я находил разряженного и выключенного робота забившегося в угол, куда он не должен был попасть по своей воле. Стоило ему добавить после каждого перемещения

    os.sleep(0.3)

    как он стал строго следовать программе. 


  8. У рoбoтoв есть не oчевидная прoблема, если ему дать кoманду сделать шаг, тo oн мoжет ее и не выпoлнить из-за лагoв сервера, пoэтoму каждoе движение дoлжнo быть пoдтвержденo.

    Например: if robor.move(side) then i=i+1 end или даже

    function move(side)
      if not robot.detect(side) and not robot.move(side) then
        move(side)
      end
    end
    
    Чтoбы рабoтать сo счетчикoм, тo лучше так пoдтверждать движение пo всем oсям, так рoбoт будет знать свoю пoзицию и прoще будет егo oтправить на тoчку старта.

    Нo я изначальнo, все фермы делал без всяких счетчикoв, рoбoт узнавал, кoгда надo пoвoрачивать дoстигнув стены, кoтoрая указывала границы пoля.

     

    Дельное замечание. Но со своей стороны я даю некоторое время серверу подумать о лагах после каждого шага робота. Пока ошибок в перемещении не было.

    robot.forward(); os.sleep(0.3)

  9. 1. Добавь скрин : сбоку от поля, на уровне робота - чтобы визуально было видно, уровень установки робота, относительно кактусов.

    2. Будешь ли добавлять статистику сбора урожая ? Сколько собрал - за 1 проход, и сколько - за всё время.

     

    Добавил новые картинки. 

     

    Да, буду добавлять статистику. Спасибо!


  10. Это моя первая программа на этом ресурсе.  Буду рад вашей критике, идеям по оптимизации кода.

     

    Загрузить можно по ссылке  http://pastebin.com/bzBkTvkZ

     

    или набрать в терминале:

    pastebin get bzBkTvkZ cactus

    Snimokekra_1808937_24163381.jpg

     

    Начальные установки:

    6   local len,w = 8,8   -- длинна и ширина поля
    7   local s = 200 -- время ожидания созревания
     

    В 6 строке кода надо указать размеры вашего поля. По умолчанию стоит 8 х 8. В 7 строке время полного созревания урожая.

    Робота нужно установить на высоте 4 блока от уровня будущего поля. За ним поставить сундук. Робот должен обладать Апгрейтом -солнечная панель для подзарядки.

    Snimokekra_9380846_24163402.jpg

     

    Если поле еще не сформированно, то робот сам может засеять поле кактусами в шахматном порядке.

     

    Snimokekra_8010132_24163387.jpg

    cactpng_3166873_24160070.jpg

     

    Робот будет информировать вас о количестве высаженных кактусов, заряде батареи. При необходимости подзаряжаться.

     

    Snimokekra_3629333_24160234.jpg

     

     

    P.S. Хочу сказать спасибо Alex, за гайд 

    http://computercraft.ru/topic/1520-chto-takoe-for-in-pairs/

    Эта статья стала настольной книгой, чтобы разобраться в работе таблиц.

    Fingercomp за объяснение логики lua.

    Отдельное спасибо Totoro и  qwertyMAN за быстрые ответы на мои порой нубские вопросы.

     

    Спасибо вам за терпение.   :)

    • Нравится 8

  11. Вообще, как только возникает место, где копипастится дважды один и тот же кусок кода, стоит сразу задуматься - "а правильно ли я делаю?" =)

     

    Например тут можно переписать код так:

    for i = 1, #t do 
      if t[i] == 9 then
        wX = wXst
        wY = wY + 1
      else
        term.setCursor(wX, wY)
        term.write(draw[t[i]])
        wX = wX + 1
      end
    end
    
    

    P.S. К слову, для переноса строки лучше юзать число 0.

    На случай, если у тебя будет бульше восьми символов для рисования.

    А вот 0 никак не будет конфликтовать, т.к. индексы начинаются с 1.

    Спасибо за дополнения!

     

    Про "0" - это  я не подумал :))))) - хорошая идея!

    Но символов может быть и больше, если ввести в таблицу двухзначные числа.

     

      qwertyMAN, я с таблицами до этого еще не сталкивался. Для данной задачи удалять из таблицы нет необходимости. Но, возможно, это мне пригодится в будущем. 

    Я правильно понял, что перебор таблицы через    

    for i = 1, #t do

    работает быстрее?

     

     

    Спасибо!


  12. Не вчитывался в код, но мне кажется это из-за того, что ты сначала рисуешь символ, а потом перемещаешь курсор.

    Т.е. после перевода строки, первый символ окажется не там где надо, т.к. позиция курсора ещё не обновилась.

    Большое спасибо!!

     

    Вставил строчку - заработало!

    Сначала я подумал, что дело где-то в таблице

    for k, v in pairs(t) do 
      if v==9 then
        wY=wY+1; wX=wXst
        term.setCursor(wX, wY) -- установка новой позиции курсора!
      else
        term.write(draw[v])
        wX=wX+1
        term.setCursor(wX, wY)
      end
    end

  13. Это мои первые попытки работы с таблицами. Извините, если это ну очень нубская ошибка.

    Это продолжение вчерашнего вопроса - вывод на экран символов кодировки

     

    Приведенный ниже код должен выводить квадрат из символов "#" со сторонами в 3 символа. 

    Но печатает на экран 4 символа "#"в подряд. Так не должно быть.

    local term = require("term")
    local wX, wY, draw, wXst = 5, 5, {" ", "#", "*", "█", "▀", "▄", "▗"}, 0
    local t = {2,2,2,9,2,1,2,9,2,2,2} -- 9- перевод строки
    
    term.clear()
    wXst=wX
    term.setCursor(wX, wY)
    
    for k, v in pairs(t) do 
      if v==9 then
        wY=wY+1; wX=wXst
      else
        term.write(draw[v])
        wX=wX+1
        term.setCursor(wX, wY)
      end
    end

    post-15506-0-93798800-1479801377_thumb.png


  14.  

    Ну, во-первых можно просто взять и напечатать.  :)

    print("▓")
    

    CP437 лучше не юзай, юзай Юникод. OpenComputers поддерживает огромное количество символов Юникода.

     

    Для этого предусмотрена специальная либа.

    local unicode = require('unicode')
    
    print(unicode.char(12345))  -- переводим код символа в строку и распечатываем его
    

    Я бы рад напечатать, только как это сделать? Те же знаки псевдографики?

     

    Сейчас буду с юникодом разбираться. 


  15. Не могу понять как выводить на экран символы, которые есть в кодировке, но не вводятся с клавиатуры. Пример тому знаки псевдографики и тп.

     

    Нашел в интернете несколько статей с примерами, но не могу разобраться, как использовать.

     

    http://lua-users.org/wiki/HexDump

    http://stackoverflow.com/questions/9137415/lua-writing-hexadecimal-values-as-a-binary-file


  16. Спасибо, Алекс! Забыл поставить второй знак "=". Увлекся булевыми значениями в другой программе, а этот код только выдержка из нее.

     

     

    Рабочий код, как я думаю, выглядит так.

    local args = {...}
    
    
    if #args ~= 1 then
      print("Ничего")
    else 
    n = tonumber(args[1])
        if n == 1 then
          print (n)
        end
      end
    qwertyMAN, спасибо за дополнения. Этим тестовым кодом хотел разобраться как ввести доп аргументы во время запуска программы.

    Ты предложил:

     if n==1 then print(1)

    Я правильно пронимаю, что print выведет первое значение из таблицы args?

     

    И еще, что значит обработать событие #args==1?


  17. Огромное спасибо!

    Я этого нюанса вообще незнал.  Да и, вероятно,  я мог бы  не найти сам в интернете. Буду использовать в своих программах.

    Хотел переписать для себя эту программу в новых реалиях.

     

    То, что функции лучше делать тоже локальными  не знал, спасибо!


  18.  

    1. work_r и work_l лучше заменить вот на такую штуку

      function work(lenght, side)
          turn = bot[(side == "right") and "turnRight" or "turnLeft"]
          digandplace(lenght)
          turn()
          bot.forward()
          turn()
          bot.forward()
      end
      а вызывать эту функцию так:

      work(l, (i % 2 == 0) and "right" or "left")

     

     

    Очень интересные предложения.  Это очень упрощает код.

     

    Я только не понял, как осуществляется поворот. А именно  вот эту строчку:

    turn = bot[(side == "right") and "turnRight" or "turnLeft"]

    Почему в квадратных скобках?   И почему нет (side == "left")?


  19. Ой как не хватает наглядности. Если есть время добавь картинки рабочего процесса и примеры для экспериментов в фотмате .vox

     

    ----------

     

    Не могу изменить файл в спец конверторе.  Выбираю файл и больше ничего не происходит 

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