컴퓨터 과학에는 두 가지 어려운 문제가 있습니다. 이름 지정, 캐시 무효화 및 일대일 오류.
이것은 캐시 무효화 문제입니다.
"이것이 내부에있다"라는 기록이 있다면 블록을 배치하거나 제거 할 때마다 플러드 필을 통해 블록과 해당 영역을 업데이트하기가 매우 쉽습니다.
이를 최적화하기 위해 일련의 "내부"계층을 원할 수 있습니다.
"셀"은 플레이어가 배치 한 블록 (특정 크기까지)으로 둘러싸인 영역입니다.
"방"은 배경 타일이있는 셀입니다.
"내부"는 문, 조명 및 의자가있는 방입니다.
플레이어가 배치 한 전경 블록을 배치 할 때 시계 방향 / 반 시계 방향으로 이동하여 새 셀이 형성되는지 확인하십시오. 플레이어가 배치 한 포 그라운드 블록을 제거 할 때 셀이 깨 졌는지 확인하십시오. 그렇다면 두 셀을 병합하여 새 셀이 형성되는지 확인하십시오.
새로운 세포가 형성되거나 형성되지 않으면, 방이나 내부에 있는지 확인하십시오.
셀은 룸에 필요한 배경 타일 수를 추적 할 수 있습니다. 그런 다음 셀이 형성되고 백그라운드 타일이 셀에서 추가되거나 제거 될 때 간단한 카운트는 셀이 룸인지 판별 할 수 있습니다.
마찬가지로 셀은 의자와 광원 (및 모든 종류의 물체)이 몇 개나 있는지 추적 할 수 있습니다. 그런 다음 내부 점검은 간단합니다.
출입도 가능합니다.
그래서 우리는 "셀"로지도를 보강합니다. 타일이 추가되거나 제거되면 위치의 셀을 확인하고 셀의 수를 늘리거나 줄입니다.
전경 블록을 추가하거나 제거 할 때 시계 방향 / 반 시계 방향 걷기를 사용하여 셀의 내부와 외부를 정의합니다. 셀의 크기가 제한되어 있으므로이 보행은 제한된 수의 단계를 수행합니다.
보너스로, 당신은 이제 방 안에 각 개체 유형의 개수가 있기 때문에 "부족한"방이나 "방이 거룩한 분수로 축복을 받았다"또는 방에 대한 다른 것에 대해 이야기 할 수있는 저렴한 방법이 있습니다. 또는 방의 크기가 제한되어 있으므로 반복을 수행하면 캐시가 제거됩니다.
각 위치는 최대 하나의 셀에 있으므로 각 위치의 셀 ID를 기본 맵에 저장할 수 있습니다.