Оптимальный подсчёт блоков

Версия Minecraft
1.7.10
API
Forge
236
4
22
Всем ещё раз здравствуйте. Я конечно понимаю, что наверное задрал тут вопросы кидать, но не хочется делать костыли, а потом гадать, откуда всплывают ошибки и прочие неприятности. Теперь к сути:

У меня есть 2 тайла. 1ый - контроллер хранилища, 2ой - "обшивка". Контроллер является провайдером и приёмником энергии, а его ёмкость зависит от кол-ва подключенных обшивок. Подключать их можно с любой стороны от контроллера, и, соответственно, можно к обшивке ещё обшивку ставить. То есть любые вплотную меж собой установленные обшивки к контроллеру добавляют ему ёмкость. Я решил поступать так: в тайле обшивки запоминаю координаты контроллера, чтобы если обшивка ломается - по этим координатам вызывается метод refreshStructure() в контроллере. Также при установке блока по такой же механике будет вызван этот метод. По названию метода всё понятно - он должен посчитать, сколько обшивок стоит вплотную к этому контроллеру. Вот тут и возникает вопрос - как их посчитать? Сначала я думал делать что-то вроде цикла for, но скорее всего тут его не достаточно, возможно нужен рекурсивный поиск... Голова идёт кругом - не могу придумать нормальный алгоритм. Также нужно, чтобы был лимит поиска N блоков. То есть если уже нашлось например 30 блоков - поиск обрывается (в целях оптимизации, ибо вдруг построят целый чанк таких оболочек...)

Играться с рекурсией я даже побоялся, ибо с шансом 99% я ухвачу стак овер флоу экзепшн по своей же тупости. Пожалуйта, подскажите, где можно найти алгоритм такого поиска :(
 
153
21
41
Играться с рекурсией я даже побоялся, ибо с шансом 99% я ухвачу стак овер флоу экзепшн по своей же тупости.
Так в чем проблема проверить, если схватишь - исправишь, если не получится исправить - уберешь, зато без дела сидеть не будешь и ждать чуда.

Pseudocode:
public void count(World world, Block block)
{
    if (world.getBlock(block.getPosition().add(0, 1, 0)) instanceof Block)
        count(world, world.getBlock(block.getPosition().add(0, 1, 0)));
}
 
Последнее редактирование:

GoogleTan

Картошка :3
1,354
43
310
Как подсчитать? Обход в глубину или обход в ширину. Раскажу как сделать обход в глубину. Фором идешь по всем фейснигам, и если там находится нужный блок, проверяешь, был ли запуск от него и запускаешься он него при надобности.

В идеале, надо в каждом блоке хранить список блоков, которые исчезнут из структуры при его ломании. Тогда можно будет не пересобирать структуру полностью при ломании блока, но это уже олимпиадная информатика.
 
Сверху