А почему бы нет? Тогда сундук всегда будет напротив факела. Только сундук нужно ставить не по правую, а по левую руку.У тебя сундук будет ставиться, только если torch > 8.
[1.7.10] ComputerCraft [1.74]
#2341
Posted 22.07.2013 - 17:22
#2343
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() endendUPD1. Сделал так, что бы при отсутствии факелов, сундуков или топлива программа вылетала.
Объясняю, что умеет
1. Поддержка аргументов (например dig 12 будет выкапывать туннель 12 блоков в длину, dig 15 - 15 блоков и т.д.) Если аргументов нету, то будет копать, пока не вылетит программа
2. Программа вылетает если
[*]Нету факелов
[*]Нету сундуков
[*]Нету топлива в инвентаре и уровень топлива в черепашке меньше 20
[/list]3. Сундуки ставит налево, факелы направо. Копает блок над сундуком, что бы можно было его потом открыть.
4. Черепаха жрет топливо:
[*]Принудительно, если уровень топлива меньше 20
[*]При выкидывании предметов в сундук, если уровень топлива меньше 200
[/list]5. Защита от гравия при установке сундуков, факелов и по ходу движения.
6. Факелы ставит каждые 8 блоков. Сундуки ставит, когда начинает заполняться 14ый слот
7. Факелы класть в 15ый слот, сундуки в 16ый. Вроде все
#2345
Posted 23.07.2013 - 12:36
#2347
Posted 23.07.2013 - 12:45
#2348
Posted 23.07.2013 - 13:52
#2350
Posted 23.07.2013 - 22:48
#2351
Posted 24.07.2013 - 19:09
#2353
Posted 24.07.2013 - 19:58
Сделать реагирование на каждую клавишу(для ввода)?Через read - нельзя, можно через os.pullEvent.
#2354
Posted 24.07.2013 - 20:16
#2355
Posted 24.07.2013 - 20:42
Имхо, не красиво.На каждое поле ввода - переменную. Ловишь буквы и прибавляешь к переменной. Ну а побочно можно ловить все остальные кнопки.
У меня была идея, с потоками. Как я уже говорил, я не разбираюсь в них, но чисто теоретически, возможно так:
#2357
Posted 25.07.2013 - 01:19
Почитал, поэкспериментировал с потоками, и понял:Сделаешь с coroutine - похлопаю стоя.
- многопоточность в луа липовая, второе ядро не используется
- такие функции, как: os.pullEvent(), sleep(), read() работают не пойми как
Если в основном, и в созданном потоке есть эти функции, то программа работать не будет. Нужно каждую из них завернуть в отдельный поток, но в таком случае нужно поддерживать чем-то основной , так как если он выполнится, программа завершится, и не будет ждать остальные потоки. А поддерживать его без os.pullEvent(), sleep(), read() нереально, разве что бесконечный цикл =)
В общем, я решил использовать parallel. Написано что он сделан на тех же coroutine, но я не знаю как там всё устроено. Вот код:
Что бы переместить read() на новую позицию, его нужно создать заново, поэтому while.
Посмотрев на этот код, я понял что это более не "красиво", чем первый вариант. И ещё, read() не запоминает прошлое значение. Так что однозначно первый вариант.
#2358
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
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
Posted 25.07.2013 - 10:06
На сколько я понял Апокалипса, таким образом событие, перехваченное основной программой, передается в сопрограмму.Но зачем передавать unpack(eventData) я так и не понял.
6 user(s) are reading this topic
0 members, 6 guests, 0 anonymous users