如何将棋子移动到它的位置

How to move a pawn to its location

我需要用 c# 制作一个名为 "A game of goose" 的棋盘游戏。

在这个游戏中,玩家按下一个按钮来掷骰子来创建一个数字。

我将创建的数字存储为名为 'totaal' 的 int。一切都组合成 'AllVariable.splaats1'。棋子需要在那个数字对应的位置。

但是移动棋子的best/easiest方法是什么?

我想把 Labels 放在棋盘上,然后当 AllVariable.splaats1 = 5 这将指向 label5 并且 pawn 将移动到 Label 的位置。

Click here the see an image

我已经用不同的方法尝试过这个,但是棋子在角落里。

Label lbl = new Label();
lbl.Name = "label" + AllVariable.splaats1;
frmkeuzespelers keuzespelers = new frmkeuzespelers();
picSpeler1.Location = lbl.Location;

这里我得到了一个运行时间错误:CS0029无法将类型'string'隐式转换为'System.Windows.Forms.Label'

Label lbl = "label" + AllVariable.splaats1;
picSpeler1.Location = lbl.Location;

假设您在名为 "label1" 到 "labelX" 的表单上有标签,您可以:

string lblName = "label" + AllVariable.splaats1.ToString();
Control[] matches = this.Controls.Find(lblName, true);
if (matches.Length > 0 && matches[0] is Label)
{
    Label lbl = (Label)matches[0];
    picSpeler1.Location = lbl.Location;
}

Thank you, it works just fine! Can you explain it a bit? – Kartercas

解释:

变量"lblName"只是一个包含我们要查找的标签名称的字符串(由文字值"label"与"AllVariable.splaats1"中的整数值连接而成) .

我们将表示标签名称的字符串值传递给 Controls.Find(),这将 return 一个名称与 "lblName" 中的值匹配的控件数组。该调用的第二个参数中的 "true" 值意味着它将在表单中搜索匹配项,包括任何嵌套容器,无论嵌套容器有多深。这意味着标签仍然可以找到,即使它们位于 Panel(甚至嵌套的 Panels 或其他容器)内,例如。所有匹配项都在名为 "matches" 的控制数组中 returned。如果未找到匹配项,则控制数组将为空且长度为零。实际上可能会找到多个匹配项,因为您可以在 运行 时创建动态控件并为它们指定一个已在使用的名称。通过 IDE 添加的设计时控件没有此问题,因为 Visual Studio 阻止您使用已被使用的名称。

"if" 语句行确保在表单中找到匹配的控件并且在 "matches" 数组中,并且还确保数组中第一个控件的类型是标签控制。 Array 是通用的 Control 类型,因为可以 returned 多种类型;没有什么可以阻止您命名 TextBox、PictureBox、Label、Panel 等,所有名称都与 "groupBox1" 相同。所以检查 Label 类型是为了确保下面一行中的转换不会失败。

"if" 块中的第一行将匹配的控件从通用控件类型转换为实际的标签类型。此引用称为 "lbl",它允许我们访问特定于 Label 控件的任何我们可能需要的属性或方法(而不是仅可用于通用控件的通用属性 and/or 方法)。在这种情况下,我们只访问 "Location()" 属性,因此实际上不需要转换为 Label 类型......我只是认为这对于将来的目的来说是很好的演示。

"if" 块中的最后一行是通过将 pawn 的 Location() 设置为之前找到的匹配 Label 的 Location() 来实际移动 Pawn 的部分。

考虑到所有这些,代码可以简化为:

Control match = this.Controls.Find("label" + AllVariable.splaats1.ToString(), true).FirstOrDefault();
if (match != null)
{
    picSpeler1.Location = match.Location;
}

但我认为这对初学者来说并不容易理解。