複雑さとパフォーマンスの制約によって異なります。以前のように直接ルックアップテーブルは、単純なグリッドルックアップの場合ほど効率的ですが、オフセットアレイを1回作成するたびにルックアップアレイを作成するのではなく、それを行うには程度の最も簡単な方法である2D配列のタイプについては
// an array of offset coordinates in pairs x,y 8 pairs skipping the center
const NEIGHBOURS = [-1, -1, 0, -1, 1, -1, -1, 0, 1, 0, -1, 1, 0, 1, 1, 1];
const GIRD_SIZE = 10; // 10 by ten grid
function checkNeighbourTiles(x,y){
var lx, ly, cellResult;
var i = 0;
while(i < 16){ // check for each offset
lx = x + NEIGHBOURS[i++]; // get the x offset
ly = y + NEIGHBOURS[i++]; // get the y offset
// ensure you are inside the grid
if(ly >= 0 && ly < GRID_SIZE && lx >= 0 && lx < GRID_SIZE){
cellResult = cell[lx][ly];
// do what is needed with the result;
}
}
}
。
代替案は、各セルが保持している隣接セルへの参照配列をリンクした配列です。 こうして(そして簡潔さを念頭に置いて)右上と左下のちょうど左上。あなたは
の上にあるセル見つけたい場合は、任意の時点で、その後の適切な細胞
// first add all the cells to the array
// then for each cell call this
function AddCell(cell,x,y){
cell.top = cells[x][y-1];
cell.left = cells[x-1][y];
cell.right = cells[x+1][y];
cell.bottom = cells[x][y+1];
// also the cells you just reference should also reference back
// where top refs botton and left refs right and so fourth.
cells.top.bottom = cell;
cells.bottom.top = cell;
cells.left.right = cell;
cells.right.left = cell;
}
にあなたが参照を設定するセルを追加するときに、各セルは、その後
cell = {
top : undefined,
left : undefined,
right : undefined,
bottom : undefined,
... other data
}
ようになります。
//x and y are the cell
var cellAbove = cell[x][y].top;
このメソッドには、デッドセルやセルのスキップなど複雑なリンクが開始されたり、セルを挿入してグリッドのトポロジを変更したりするときに多くの利点があります。
また、2のような複雑な検索は
resultCall = cell[x][y].left.left.bottom; // returns the cell two left one down
ダウン1を残してくださいすることができます。しかし、あなたの方法があり、単純な2次元グリッドのように、関連する余分なコードがたくさんあるとして、リンクを維持するための痛みですベスト。
よく、ゲームの目的は、グリッド内のすべての色を可能な限り少ないセルで接続し、同じ色のセルだけが接触できるようにすることです。 現在、私は隣接セルが白または同色(セルは色で塗りつぶすことができる)かどうかを確認する必要があるターゲットセルのクリックを処理しようとしています またはいくつかの他の色があります 私は今[-1、-1]ですが、今はそのハンドルに焦点を当てています。 – Red
私の答えを更新しました。 – FvB