我需要用c#制作一款名为“鹅游戏”的棋盘游戏。
在这个游戏中,玩家按下一个按钮来掷骰子,创建一个数字。
我将创建的数字存储为名为'totaal'的int。一切都结合为'AllVariable.splaats1'。 pawn需要位于与该号码对应的位置。
但移动典当的最佳/最简单方法是什么?
我正在考虑将标签放在板上,然后当AllVariable.splaats1 = 5时,这将指向label5,并且pawn将移动到Label的位置。
我已经尝试了这个并采用不同的方法,但典当就在角落里。
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;
答案 0 :(得分:0)
假设您在表单上标有名为" 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;
}
谢谢,它运作得很好!你能解释一下吗? - Kartercas
说明:
变量" lblName"只是一个字符串,其中包含我们要查找的Label的名称(根据文字值"标记"与&#34中的Integer值连接; AllVariable.splaats1")。
我们将表示Label名称的字符串值传递给Controls.Find(),它将返回一个控件数组,这些控件的名称与" lblName"中的值相匹配。 " true"该调用的第二个参数中的值意味着它将搜索表单中的匹配项,包括任何嵌套容器,无论多深。这意味着,即使标签位于Panel内(甚至是嵌套的Panel或其他容器),仍然可以找到标签。所有匹配都在控制数组中返回,名为"匹配"。如果未找到匹配项,则控制数组将为空并且长度为零。实际上可以找到多个匹配项,因为您可以在运行时创建动态控件并为它们指定一个已在使用的名称。通过IDE添加的设计时控件没有此问题,因为Visual Studio阻止您使用已经使用的名称。
" if"语句行确保在表单中找到匹配的控件,并且位于"匹配" Array,还确保Array中第一个控件的类型是Label控件。 Array是通用控件类型,因为可以返回多个类型;没有什么能阻止你命名一个TextBox,PictureBox,Label,Panel等所有相同的名称" groupBox1"。因此,检查Label类型是否存在,以便直接在下面的行中的强制转换不会失败。
"内的第一行;如果" block将匹配的控件从通用Control类型转换为它实际的Label类型。该引用称为" lbl"并允许我们访问特定于Label控件的任何我们可能需要的属性或方法(而不是只有通用属性和/或通用控件可用的方法)。在这种情况下,我们只访问"位置()"属性如此强制转换为标签类型实际上并不是必需的......我只是认为这样做可以用于将来的目的。
" if"的最后一行block是通过将pawn的Location()设置为先前找到的匹配Label的Location()来实际移动Pawn片段的。
考虑到所有这些,代码可以简化为:
Control match = this.Controls.Find("label" + AllVariable.splaats1.ToString(), true).FirstOrDefault();
if (match != null)
{
picSpeler1.Location = match.Location;
}
但我不认为初学者容易理解这一点。