Jump to content


Photo

[1.7.10] ComputerCraft [1.74]


  • Please log in to reply
2863 replies to this topic

#2341 Dimus

Dimus

    Странник

  • Пользователи
  • Active Posts89

Posted 22.07.2013 - 17:22

У тебя сундук будет ставиться, только если torch > 8.

А почему бы нет? Тогда сундук всегда будет напротив факела. Только сундук нужно ставить не по правую, а по левую руку.

#2342 DU_HAST

DU_HAST

    Добытчик камня

  • Пользователи
  • Active Posts271
  • Ник в Minecraft:
    Rostisha
  • Откуда: Краснодар

Posted 22.07.2013 - 20:05

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

#2343 Cyxapuk

Cyxapuk

     

  • Главные модераторы
  • Active Posts8706
  • Ник в Minecraft:
    Meegoo

Posted 22.07.2013 - 21:27

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

Ничего не понял. Вообщем держи готовую
function dropItems()  if turtle[paste][/paste]getItemCount(16) == 0 then    print("Out of chests")    error()  end  if turtle[paste][/paste]getItemCount(14) >= 1 then    turtle[paste][/paste]turnLeft()    while turtle[paste][/paste]dig() do end    turtle[paste][/paste]up()    turtle[paste][/paste]dig()    turtle[paste][/paste]down()    turtle[paste][/paste]select(16)    turtle[paste][/paste]place()    for i = 1,14 do      turtle[paste][/paste]select(i)      if turtle[paste][/paste]getFuelLevel() < 200 then        turtle[paste][/paste]refuel()      else        turtle[paste][/paste]drop()      end    end    turtle[paste][/paste]turnRight()    turtle[paste][/paste]select(1)  endendfunction placeTorch()  if turtle[paste][/paste]getItemCount(15) == 0 then    print("Out of torches")    error()  end  if torch==8 then    turtle[paste][/paste]turnRight()    while turtle[paste][/paste]dig() do end    turtle[paste][/paste]select(15)    turtle[paste][/paste]place()    turtle[paste][/paste]select(1)    turtle[paste][/paste]turnLeft()    torch=1  endendfunction refuel()  local slot=1  if turtle[paste][/paste]getFuelLevel()<20 then    turtle[paste][/paste]select(slot)    while not turtle[paste][/paste]refuel() do      turtle[paste][/paste]select(slot)      slot=slot+1	  if slot==15 then	    print("Out of fuel")            error() 	  end    end	turtle[paste][/paste]select(1)  endendfunction dig()  while turtle[paste][/paste]dig() do end  while turtle[paste][/paste]digUp() do end  turtle[paste][/paste]digDown()  placeTorch()  dropItems()  refuel()  turtle[paste][/paste]forward()  torch=torch+1endlocal tArgs={[paste][/paste][paste][/paste][paste][/paste]}torch=0turtle[paste][/paste]select(1)if tArgs[1] == nil then  while true do    dig()  endelse  for d = 1, tArgs[1] do	   dig()	 endend
UPD1. Сделал так, что бы при отсутствии факелов, сундуков или топлива программа вылетала.
Объясняю, что умеет
1. Поддержка аргументов (например dig 12 будет выкапывать туннель 12 блоков в длину, dig 15 - 15 блоков и т.д.) Если аргументов нету, то будет копать, пока не вылетит программа
2. Программа вылетает если

    [*]Нету факелов
    [*]Нету сундуков
    [*]Нету топлива в инвентаре и уровень топлива в черепашке меньше 20
    [/list]3. Сундуки ставит налево, факелы направо. Копает блок над сундуком, что бы можно было его потом открыть.
    4. Черепаха жрет топливо:

      [*]Принудительно, если уровень топлива меньше 20
      [*]При выкидывании предметов в сундук, если уровень топлива меньше 200
      [/list]5. Защита от гравия при установке сундуков, факелов и по ходу движения.
      6. Факелы ставит каждые 8 блоков. Сундуки ставит, когда начинает заполняться 14ый слот
      7. Факелы класть в 15ый слот, сундуки в 16ый. Вроде все

V6xCzSN.png


#2344 DU_HAST

DU_HAST

    Добытчик камня

  • Пользователи
  • Active Posts271
  • Ник в Minecraft:
    Rostisha
  • Откуда: Краснодар

Posted 23.07.2013 - 11:58

Скрытый текст

После длительной проверки черепашки упрямо отказываются работать. Жалуются на ошибку синтаксиса во 2 строке. Якобы отсутствует then
Изображение
Изображение
Нажмите сюда чтобы увидеть всю подпись
Скрытый текст

#2345 Dimus

Dimus

    Странник

  • Пользователи
  • Active Posts89

Posted 23.07.2013 - 12:36

Там во 2-й строке двойной знак равенства. Проверь

#2346 DU_HAST

DU_HAST

    Добытчик камня

  • Пользователи
  • Active Posts271
  • Ник в Minecraft:
    Rostisha
  • Откуда: Краснодар

Posted 23.07.2013 - 12:43

Там во 2-й строке двойной знак равенства. Проверь

Обязательно должен быть двойной?
Изображение
Изображение
Нажмите сюда чтобы увидеть всю подпись
Скрытый текст

#2347 Dimus

Dimus

    Странник

  • Пользователи
  • Active Posts89

Posted 23.07.2013 - 12:45

Ага

#2348 Cyxapuk

Cyxapuk

     

  • Главные модераторы
  • Active Posts8706
  • Ник в Minecraft:
    Meegoo

Posted 23.07.2013 - 13:52

Да, двойной. = устанавливает значение переменной. == проверяет, равно ли значение переменной чему-то.

V6xCzSN.png


#2349 Storm Whisper

Storm Whisper

    Зачарователь

  • Пользователи
  • Active Posts1554
  • Откуда: Убежище 13

Posted 23.07.2013 - 22:34



#2350 Apokalypsys

Apokalypsys

    Добытчик дерева

  • Пользователи
  • Active Posts183

Posted 23.07.2013 - 22:48

:D Журнал DIE DIE DIE!!!! Добавил API "bit". Надеюсь все понятно, если нет - напишите что.

#2351 Ukrainian

Ukrainian

    Странник

  • Пользователи
  • Active Posts83

Posted 24.07.2013 - 19:09

Ещё один вопрос: как сделать так, что-бы при вводе текста(read()), можно было реагировать на другие клавиши? Например, есть три поля, мне нужно что-бы при нажатии стрелок(вверх-вниз) курсор(для ввода текста) перескакивал между этими полями, и текст вводился в выбранное поле. Такое возможно?

#2352 Apokalypsys

Apokalypsys

    Добытчик дерева

  • Пользователи
  • Active Posts183

Posted 24.07.2013 - 19:34

Через read - нельзя, можно через os.pullEvent.

#2353 Ukrainian

Ukrainian

    Странник

  • Пользователи
  • Active Posts83

Posted 24.07.2013 - 19:58

Через read - нельзя, можно через os.pullEvent.

Сделать реагирование на каждую клавишу(для ввода)?

#2354 Apokalypsys

Apokalypsys

    Добытчик дерева

  • Пользователи
  • Active Posts183

Posted 24.07.2013 - 20:16

На каждое поле ввода - переменную. Ловишь буквы и прибавляешь к переменной. Ну а побочно можно ловить все остальные кнопки.

#2355 Ukrainian

Ukrainian

    Странник

  • Пользователи
  • Active Posts83

Posted 24.07.2013 - 20:42

На каждое поле ввода - переменную. Ловишь буквы и прибавляешь к переменной. Ну а побочно можно ловить все остальные кнопки.

Имхо, не красиво.
У меня была идея, с потоками. Как я уже говорил, я не разбираюсь в них, но чисто теоретически, возможно так:
Скрытый текст
?

#2356 Apokalypsys

Apokalypsys

    Добытчик дерева

  • Пользователи
  • Active Posts183

Posted 24.07.2013 - 21:35

Сделаешь с coroutine - похлопаю стоя.

#2357 Ukrainian

Ukrainian

    Странник

  • Пользователи
  • Active Posts83

Posted 25.07.2013 - 01:19

Сделаешь с coroutine - похлопаю стоя.

Почитал, поэкспериментировал с потоками, и понял:
- многопоточность в луа липовая, второе ядро не используется
- такие функции, как: os.pullEvent(), sleep(), read() работают не пойми как
Если в основном, и в созданном потоке есть эти функции, то программа работать не будет. Нужно каждую из них завернуть в отдельный поток, но в таком случае нужно поддерживать чем-то основной , так как если он выполнится, программа завершится, и не будет ждать остальные потоки. А поддерживать его без os.pullEvent(), sleep(), read() нереально, разве что бесконечный цикл =)
В общем, я решил использовать parallel. Написано что он сделан на тех же coroutine, но я не знаю как там всё устроено. Вот код:
Скрытый текст

Что бы переместить read() на новую позицию, его нужно создать заново, поэтому while.
Посмотрев на этот код, я понял что это более не "красиво", чем первый вариант. И ещё, read() не запоминает прошлое значение. Так что однозначно первый вариант.
Скрытый текст


#2358 Apokalypsys

Apokalypsys

    Добытчик дерева

  • Пользователи
  • Active Posts183

Posted 25.07.2013 - 01:54

По поводу красоты даже не парился. Код получился ни разу не гибкий, но перделки-свистелки можно легко устроить.
user = coroutine[paste][/paste]create(  function()    return read()   end)pass = coroutine[paste][/paste]create(  function()    return read("*")  end)routines = {user, pass}pos = {{1, 1}, {1, 5}}select = 1term[paste][/paste]clear()term[paste][/paste]setCursorPos(unpack(pos[1]))write("User: ")term[paste][/paste]setCursorPos(unpack(pos[2]))write("Pass: ")RESULT = {}while #routines > 0 do  eventData = { os[paste][/paste]pullEventRaw() }  if eventData[1] == "key" then    if eventData[2] == 200 then      select = select - 1      if select < 1 then        select = #routines      end    elseif eventData[2] == 208 then      select = select + 1      if select > #routines then        select = 1      end    end  end  term[paste][/paste]setCursorPos(pos[select][1] + 6, pos[select][2])  ok, param = coroutine[paste][/paste]resume(routines[select], unpack(eventData))  if ok and param then    routines[select] = nil    RESULT[select] = param    os[paste][/paste]queueEvent("key", 28)    select = 1  endendterm[paste][/paste]setCursorPos(1, 10)print(RESULT[1])print(RESULT[2])


#2359 Ukrainian

Ukrainian

    Странник

  • Пользователи
  • Active Posts83

Posted 25.07.2013 - 05:50

ok, param = coroutine[paste][/paste]resume(routines[select], unpack(eventData))
Немного не понял зачем передаются, и принимаются две переменных, ведь:
user = coroutine[paste][/paste]create(  function()    return read()   end)
не принимает аргументы, и возвращает только один.
UPD: Понял зачем ok, param. Первый true если поток удачно запущен, а второй возвращаемое значение. Но зачем передавать unpack(eventData) я так и не понял.
UPD2: Написал свою реализацию read(), назвал её smart_read:
smart_read([key1,key2,..keyN],[start_text])
Работает как обычный read, завершается когда нажат enter, или keyN. Возвращает два значения, введенный текст, и код нажатой клавиши. start_text, тот текст что будет уже введён при вызове.
Код:
Скрытый текст

Жду конструктивную критику, возможно эту функцию можно написать лучше.

#2360 Dimus

Dimus

    Странник

  • Пользователи
  • Active Posts89

Posted 25.07.2013 - 10:06

Но зачем передавать unpack(eventData) я так и не понял.

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


6 user(s) are reading this topic

0 members, 6 guests, 0 anonymous users