所以,我试图模仿winforms中的扫雷游戏,就像练习一样。到目前为止,我有两个类,一个名为“Cell”,它派生自常规按钮类,但它有自己的几个属性和一个处理逻辑的类(基本上我做了一个二维数组,填充了类型为“Cell”的对象并用炸弹填充它。我遇到了一个问题 - 如何将我的“Cell”按钮控件数组附加到表单?没有从头开始重写一切?这两个课程显然都没有完成,只是我想检查它在表格上的样子并意识到我被卡住了。
这是我的Cell类
class Cell : Button
{
//private GraphicsPath path;
const int width = 20;
const int height = 20;
public byte Value { get; set; }
public bool IsBomb { get; set; }
public Cell()
{
}
public Cell(int x, int y)
{
this.Location = new Point(x, y);
}
protected override void OnPaint(PaintEventArgs pevent)
{
base.OnPaint(pevent);
this.Width = width;
this.Height = height;
}
protected override void OnClick(EventArgs e)
{
base.OnClick(e);
this.Text = Value.ToString();
}
}
这是我的数组类
class CellArray
{
private int _rows = 0;
private int _columns = 0;
private int _bombAmount = 0;
private Random rand;
private Cell[,] cellMatrix;
public CellArray(int rows, int columns, int bombAmount)
{
_rows = rows;
_columns = columns;
_bombAmount = bombAmount;
populate();
setBombs();
}
private void populate()
{
cellMatrix = new Cell[_rows, _columns];
for (int i = 1; i < _rows; i++)
{
for (int j = 1; j < _columns; j++)
{
cellMatrix[i, j] = new Cell();
cellMatrix[i, j].IsBomb = false;
}
}
}
private void setBombs()
{
//*****************************************QUESTIONABLE************************************
rand = new Random();
int k = 1;
while (k < _bombAmount)
{
Flag:
{
int i = rand.Next(_rows);
int j = rand.Next(_columns);
if (cellMatrix[i, j].IsBomb == false)
cellMatrix[i, j].IsBomb = true;
else
goto Flag;
}
}
//*****************************************QUESTIONABLE************************************
for (int i = 1; i < _rows; i++)
{
for (int j = 1; j < _columns; j++)
{
if (cellMatrix[i - 1, j - 1].IsBomb == true)
{
cellMatrix[i, j].Value++;
}
if (cellMatrix[i - 1, j].IsBomb == true)
{
cellMatrix[i, j].Value++;
}
if (cellMatrix[i, j - 1].IsBomb == true)
{
cellMatrix[i, j].Value++;
}
if (cellMatrix[i - 1, j + 1].IsBomb == true)
{
cellMatrix[i, j].Value++;
}
if (cellMatrix[i, j + 1].IsBomb == true)
{
cellMatrix[i, j].Value++;
}
if (cellMatrix[i + 1, j + 1].IsBomb == true)
{
cellMatrix[i, j].Value++;
}
if (cellMatrix[i + 1, j].IsBomb == true)
{
cellMatrix[i, j].Value++;
}
if (cellMatrix[i + 1, j - 1].IsBomb == true)
{
cellMatrix[i, j].Value++;
}
}
}
}
}
答案 0 :(得分:1)
如何附加我的&#34; Cell&#34; 按钮控件到表单
这个问题可以解决类似这个问题:
Using programatically created CheckBoxes in Windows Form [C#]
想法是使用YourForm.Controls.Add(...)
。不要忘记为表格坐标系中的单元格/按钮提供适当的位置。
当然,我想提及恕我直言从Cell
派生Button
是一个可怕的设计决定。更好地将您的数据类(如Cell
)与GUI类(如Button
)完全分开,并选择类似Asher在其第一个答案中建议的技术(向Tag
添加一个单元格每个Button的属性)在Cell对象和相应的Button对象之间创建连接。