我目前有一个类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)。
那有什么不对?
答案 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