コンピュータサイエンスには2つの難しい問題があります。命名、キャッシュの無効化、オフバイワンエラー。
これはキャッシュ無効化の問題です。
「内部にある」という記録がある場合、ブロックが配置または削除されるたびに、塗りつぶしによってブロックとその領域を更新するのは非常に簡単です。
これを最適化するには、「内部」の階層のセットが必要な場合があります。
「セル」とは、プレーヤーが配置したブロック(特定のサイズまで)に囲まれた領域です。
「部屋」とは、背景タイルのあるセルです。
「内側」は、ドア、照明、椅子のある部屋です。
プレイヤーが配置した前景ブロックを配置するとき、時計回り/反時計回りに歩いて、新しいセルが形成されるかどうかを確認します。プレイヤーが配置した前景ブロックを削除する場合、セルが破損していないかどうかを調べます。破損している場合は、2つを結合して新しいセルが形成されるかどうかを確認します。
新しいセルが形成されるか、または形成されない場合、部屋または内部であることを確認します。
セルは、部屋にするために必要な背景タイルの数を追跡できます。次に、セルが形成されるとき、背景タイルがセルに追加またはセルから削除されるときの単純なカウントにより、それが部屋であるかどうかを判断できます。
同様に、Cellsは、椅子と光源(および実際にはあらゆる種類のオブジェクト)がいくつあるかを追跡できます。その後、内部チェックは簡単です。
入場のカウントも行うことができます。
そのため、マップに「セル」を追加します。タイルが追加または削除されると、場所のセルを確認し、セル内のカウントをインクリメント/デクリメントします。
時計回り/反時計回りの歩行を使用して、前景ブロックを追加または削除するときにセルの内部と外部を定義します。セルのサイズが制限されているため、このウォークには制限された数のステップが必要です。
おまけとして、部屋には各オブジェクトタイプの数があるため、「豪華な」部屋、「部屋は聖なる噴水に恵まれている」、または部屋について何か他のものについて話す安価な方法があります。(または、部屋のサイズに制限があるため、繰り返しを行うだけです。これによりキャッシュが削除されます)。
各場所は最大1つのセルにあるため、メインマップに各場所のセルIDを保存できます。