C#只能点击相邻的单元格2D数组

时间:2018-03-26 11:29:03

标签: c# arrays winforms multidimensional-array

我目前有一个类Tile的二维数组,(playfieldTiles [7,7])和一个2D数组的Pictureboxes,它们是在Tile中生成的,带有一个onclick事件(playfieldPB [7,7,])。在每个Tile实例上都有一系列neihgboring tile(在2D数组中)。 每个瓷砖都有一种颜色,其中灰色是中性色。

我需要能够点击一个牌来"选择"一块瓷砖,只能点击其中一个邻居。

数组中有49个tile和picturebox实例,每个实例都有自己的onclick事件和邻居数组。

示例:

[tile1] [tile2] [tile3]

[tile4] [tile5] [tile6]

[tile7] [tile8] [tile9]

Tile1的backColor设置为红色。 我点击tile1来选择它。 tile1的邻居是{tile 2,tile 4,tile 5}。我希望能够"复制"通过单击它们将tile 1的颜色放到其中一个邻居上。如果我点击任何其他瓷砖然后其中一个邻居,我希望程序返回"这个瓷砖是遥不可及的"然后回去选择一块瓷砖。

我如何实现这一目标?

修改

我想出了以下内容(目前还没有完成工作):

对每个" Vakje"我添加了以下布尔值:

isNeiborOff。

上课" Playfield"我添加了以下布尔值:

turnActive。

虽然这不起作用,但这就是我所拥有的(不是完整的解决方案):

public void SelectTile(object sender, EventArgs e)
    {
        if (playfieldClass.turnActive == false)
        {
            vakjePB.BackColor = Color.Green;
            playfieldClass.turnActive= true; //playfieldClass is an instance of class Playfield

            for (int i = 0; i < neighbors.Length; i++)
            {
                if (neighbors[i] != null)
                {
                    neighborsTiles[i].isNeighborOff = true;
                }
            }
            return;
        }
        else
        {
            if (isNeighborOff== true)
            {
                vakjePB.BackColor = Yellow
                ResetBurenBooleans();
                gamemanager.beurtBezig = false;
                return;
            }
            else
            {
                MessageBox.Show("Error", "This tile is out of reach");
                ResetIsNeighborOff(); //resets isNeighborOff boolean on each Tile.
                playfieldClass.turnActive= false;
                return;
            }
        }
    }

据我所知,这应该是第一次点击选择一个磁贴并使用&#34; isNeighborOff&#34;生成该特定磁贴的所有邻居。布尔值。第二次点击将使Tile Yellow成为邻居并返回&#34;此Tile是遥不可及的&#34;如果不是。

然而,它始终&#34;选择&#34;一个瓷砖,它不会检查点击的第二个瓷砖是否遥不可及。它似乎跳过那一部分。

只是为了澄清:我已经建立了邻居。问题是我不能复制&#34;瓦片给它的一个邻居。点击方法不会进入第二部分,查看Tile是否是第一个Tile的邻居(使用&#34; isNeighborOff&#34; bool)。

那有什么不对?

1 个答案:

答案 0 :(得分:0)

不要试图提前存储所有可能的组合,而是计算您需要的动态。存储初始点击的X,Y坐标。要为相邻单元格着色,请生成相邻单元格的列表。 X,Y坐标基于您为初始点击存储的坐标。一点点循环可以很快完成。

对于第二次单击,因为您正在使用X,Y坐标,测试第二个单元格是否是第一个单元格的邻居很容易:目标必须在所选单元格的 - / + 1范围内(但是当然不是选定的细胞本身。)

这是一个用于演示的控制台程序。输出是:

<link rel='stylesheet' href='/app.css' />

为了简洁起见,Cell 3,1 neighbors 3,2? True Cell 3,1 neighbors 5,4? False For a grid of 7 x 7 cells: Cell neighboring 0,0: 1,0 Cell neighboring 0,0: 0,1 Cell neighboring 0,0: 1,1 IsNeighbor是本地函数,是C#版本7的一个特性。作为奖励,它可以处理任何大小的2D数组。 / p>

GetNeighborIndexes