Циклы с датчиками
До сих пор программы работали с фиксированными данными: зашитыми в код числами и строками. Но настоящая автоматизация — это реакция на то, что происходит в мире прямо сейчас: есть ли блок впереди, поступил ли сигнал, что лежит в слоте инвентаря.
while в связке с датчиками позволяет строить программы, которые адаптируются к ситуации.
Датчики черепашки
Черепашка умеет проверять окружение в трёх направлениях:
turtle.detect() -- блок спереди? (true/false)
turtle.detectUp() -- блок сверху?
turtle.detectDown() -- блок снизу?
turtle.inspect() -- что за блок спереди? (ok, data)
turtle.inspectUp()
turtle.inspectDown()
inspect возвращает два значения: успех и таблицу с данными о блоке:
local ok, data = turtle.inspect()
if ok then
print(data.name) -- например "minecraft:stone"
end
Идём вперёд пока путь свободен
while not turtle.detect() do
turtle.forward()
end
print("Достигли препятствия")
Копаем пока не дойдём до нужного блока
local found = false
while not found do
local ok, data = turtle.inspectDown()
if ok and data.name == "minecraft:diamond_ore" then
found = true
print("Нашли алмазную руду!")
else
turtle.digDown()
turtle.down()
end
end
Редстоун как датчик
Редстоун-сигналы — универсальный способ общаться с черепашкой из игрового мира:
-- Ждём нажатия кнопки (кнопка подаёт сигнал на сторону "back")
print("Нажми кнопку для старта...")
while not redstone.getInput("back") do
sleep(0.1)
end
print("Кнопка нажата, начинаю работу")
-- Следим за рычагом: работаем пока рычаг включён
while redstone.getInput("left") do
turtle.dig()
turtle.forward()
sleep(0.2)
end
print("Рычаг выключен, остановка")
Инвентарь как датчик
-- Ждём пока в первом слоте не появится предмет
print("Положи предмет в первый слот...")
while turtle.getItemCount(1) == 0 do
sleep(0.5)
end
print("Предмет получен: " .. turtle.getItemDetail(1).name)
-- Работаем пока инвентарь не заполнится
local function inventoryFull()
for slot = 1, 16 do
if turtle.getItemCount(slot) == 0 then
return false
end
end
return true
end
while not inventoryFull() do
turtle.dig()
turtle.forward()
end
print("Инвентарь заполнен, возвращаемся")
Комбинированные условия
Реальные программы проверяют несколько вещей одновременно:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
local function canContinue()
local hasFuel = turtle.getFuelLevel() > 50
local hasSpace = not inventoryFull()
local pathClear = not turtle.detect() or turtle.dig()
return hasFuel and hasSpace and pathClear
end
while canContinue() do
turtle.forward()
sleep(0.1)
end
if turtle.getFuelLevel() <= 50 then
print("Остановка: мало топлива")
elseif inventoryFull() then
print("Остановка: инвентарь полон")
end
🚀 Задания
Задание 1
Напиши программу: черепашка идёт вперёд пока впереди нет блока. Встречает блок — копает. Если блок не удалось скопать (жидкость, бедрок) — останавливается и сообщает причину.
Задание 2
Напиши охранника-дверь: бесконечный цикл слушает редстоун-сигнал сбоку. Когда сигнал появился — подаёт сигнал вперёд (открывает дверь) на 3 секунды, потом убирает.
Задание 3
Напиши сортировщик: в бесконечном цикле проверяй первый слот. Если в нём что-то появилось — определи имя предмета через turtle.getItemDetail(1).name и выводи на экран. Жди 1 секунду между проверками.
Задание 4
Напиши бурильщик с защитой: черепашка копает вниз. Перед каждым шагом проверяет что снизу — если "minecraft:lava" или "minecraft:water" — останавливается. Выводит глубину на каждом шаге.
Задание 5
Напиши программу, которая использует три датчика одновременно: топливо > 20, инвентарь не полон, впереди нет лавы. Если любое из условий нарушается — останавливается с сообщением о причине.