Применительно к копалкам первое решение хуже второго. Третье решение обещает дать лучший результат, но не оправдывает надежд. Оно лучше первого, но также хуже второго.
В случае, если маршрут робота пролегает в целом через пустые блоки, оптимален вариант "если не удалось осуществить движение, бей блок".
Если пустые блоки на пути робота встречаются редко, оптимален вариант "сначала ударь блок перед роботом, затем двигайся".
Вариант "сначала проверь блок, а затем бей или двигайся" уместен только на фермах опыта, где двигаться вообще не надо. Впрочем, возможно, даже там неуместен, я не проводил таких исследований.
При желании можно даже посчитать тот уровень заполненности пути робота блоками, выше которого выгодно будет использовать первый вариант, а ниже – второй. Если тема получит развитие, можно будет и посчитать точное значение. А пока для простоты я буду исходить из предположения, что пещеры довольно редки, и почти всегда на пути робота находится блок.
В случае, когда робот сначала пытается двигаться, а затем рубить блок в случае неудачи затраты времени примерно такие:
10 тиков на неудачную попытку движения.
6 тиков (предположим) на рубку блока.
8 тиков на успешную попытку движения.
В случае, если робот сначала бьёт, а затем двигается:
6 тиков на рубку блока
8 тиков на движение
Скорость продвижения увеличится в 24/14=1.71 раза. При сплошной копке "слой через два" ускорение не столь высоко, но всё равно ощутимо: в 1.38 раз. В случае, если перед роботом нет препятствий, и он выполняет неудачный взмах киркой до выполнения движения, произойдёт замедление в (1+8)/8 = 1.125 раза. Но при работе в шахте препятствие перед роботом чаще присутствует, нежели отсутствует.
Применив подобные расчёты для варианта с использованием detect(), ты обнаружишь, что его применение вредно. По крайней мере, в шахте без больших полостей.