Недавно влезал в эту часть кода, чтобы вспомнить. И решил расписать, если кому вдруг будет полезно или интересно.
Алгоритм
Самым простым способом сравнения рецепта с окном крафта является поиск по шаблону. Так как нам для поиска нужно чтобы были заполнены те ячейки что требуются крафту и чтобы остальные ячейки были не заполнены.
Шаблоны симулируют расположение крафта в указанных рамках окна крафта. Например, если окно крафта 2х2, а размер крафта 1х1 (дубовые бревна (1) -> дубовые доски (2)):
Входящее окно крафта 2x2: [0, 0, 0, 1], рецепт: [1]
Шаблон 1 (положение 0;0) = [1, 0, 0, 0] = не совпадает
Шаблон 2 (положение 0;1) = [0, 1, 0, 0] = не совпадает
Шаблон 3 (положение 1;0) = [0, 0, 1, 0] = не совпадает
Шаблон 4 (положение 1;1) = [0, 0, 0, 1] = совпадает, рецепт выполняется
Учитывая что шаблоны заполняются автоматически, сравнение рецепта может происходить по окну крафта с любым размером, лишь бы сам крафт был меньше окна крафта.
Оптимизация
Так уж вышло, что проверять каждый рецепт напрямую довольно затратно. Для оптимизации, перед самой проверкой крафта была использована проверка суммы - id предметов окна крафта (2х2, 3х3, итп) складываются, при загрузке рецептов так же складываются id в рамках рецепта. При поиске крафта просто сравниваются два числа суммы и уже потом начинается тест рецепта.
Сумма сверяется так (допустим что 1 - доски, 2 - палки):
Окно крафта 2х2 (0, 1, 0, 1) = сумма будет 2
Окно крафта 2х2 (1, 0, 1, 0) = сумма будет 2
Рецепт палок 1х2 (1, 1) = сумма так же 2
Рецепт верстака 2х2 (1, 1, 1, 1) = сумма 4
Непосредственно во время выполнения алгоритма шаблонов, при сравнении шаблона, первый несовпадающий элемент естественно прерывает тестирования шаблона и переходит к созданию следующего шаблона. Если же тестирование шаблона показывает совпадение, сравнение останавливается и сообщает системе о полном совпадении с крафтом.
p.s: ResCraft J2ME не создавал шаблоны динамически так как не имел гибкого алгоритма сравнения. Заранее записанные методы создавали шаблоны вручную для 2x2 и 3x3 окон крафта. В какой то мере это было даже быстрее чем современный алгоритм.