У інформатиці є 2 важких проблеми. Іменування речей, недійсність кешу та помилки окремо.
Це проблема недійсності кеша.
Якщо у вас є запис "це всередині", щоразу, коли блок або розміщений блок, оновити його та його регіон досить легко за допомогою заливки.
Для оптимізації цього, можливо, ви хочете мати набір ярусів "внутрішності".
"Осередок" - це область, оточена розміщеними гравцем блоками (до певного розміру).
"Кімната" - це клітина з фоновими плитками.
"Всередині" - це кімната з дверима, світлом і стільцем.
Коли ви розміщуєте розміщений на передньому плані блок для гравців, виконайте ходьбу за годинниковою стрілкою / проти годинникової стрілки, щоб побачити, чи утворена нова комірка. Коли ви виймете розміщений на гравці блок переднього плану, вивчіть, чи він порушує будь-які комірки - якщо так, подивіться, чи утворюється нова комірка шляхом об'єднання двох.
Коли нова клітина сформована або неформована, перевірте, чи це кімната чи внутрішня частина.
Клітини можуть відслідковувати, скільки фонових плиток потрібно для приміщення. Тоді за простим підрахунком, коли формується комірка, додається або вилучається фоновий плитка з комірки, можна визначити, чи це кімната.
Так само Клітини можуть відслідковувати, скільки стільців та джерел світла (а насправді предметів усіх видів) знаходиться в них. Тоді внутрішня перевірка є тривіальною.
Підрахунок входів також можна зробити.
Отже, ми збільшуємо карту за допомогою "комірок". Коли плитки додаються або видаляються, ми перевіряємо комірку місця розташування та збільшуємо / зменшуємо кількість в комірці.
Використовуйте ходьбу за годинниковою стрілкою / проти годинникової стрілки для визначення внутрішньої та зовнішньої сторони комірки, коли додається або виймається блок переднього плану. Оскільки розмір комірок обмежений, ця прогулянка буде робити обмежену кількість кроків.
Як бонус, тепер у вас є дешевий спосіб поговорити про "багатючі" кімнати, або "кімнату благословляють святим фонтаном", або що-небудь ще про кімнату, оскільки в номерах є кількість кожного типу об'єктів всередині них. (Або, оскільки кімнати обмежені за розміром, просто робіть ітерацію; це видаляє кеш).
Кожне місце розташування є щонайменше в одній клітинці, тому ви можете зберігати ідентифікатор комірки кожного місця на головній карті.