我对C#了解不多,所以如果我的问题在其他地方得到解答,我会提前道歉。我不知道要搜索什么。
我在Windows窗体中制作了一个tic tac toe游戏。我把它设置成这样:每个单元格有2个按钮(x和o)和两个标签(X和O)。单击其中一个按钮会将相应标签的visible属性更改为true,同时禁用(enable = false)选择相反的按钮。总共有9个细胞。我还有一个菜单按钮(重置),单击该按钮将启用所有按钮并隐藏所有标签,以便可以重新播放游戏。
我正在寻找一种方法来重置我想要的所有项目,而无需为每个项目单独输入代码。有没有办法将这些项目组合在一起,以便用最少的代码一次性解决这些问题?
源代码不完整,因为我还在编写程序。我已经发布了三个单元格的代码。
using System;
using System.Collections.Generic;
using System.ComponentModel;
using System.Data;
using System.Drawing;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
using System.Windows.Forms;
namespace Tick_Tack_Toe
{
public partial class Form1 : Form
{
public Form1()
{
InitializeComponent();
}
private void xButton1_Click(object sender, EventArgs e)
{
xLabel1.Visible = true;
oButton1.Enabled = false;
}
private void oButton1_Click(object sender, EventArgs e)
{
oLabel1.Visible = true;
xButton1.Enabled = false;
}
private void xButton2_Click(object sender, EventArgs e)
{
xLabel2.Visible = true;
oButton2.Enabled = false;
}
private void oButton2_Click(object sender, EventArgs e)
{
oLabel2.Visible = true;
xButton2.Enabled = false;
}
private void resetToolStripMenuItem_Click(object sender,
EventArgs e)
{
xButton1.Enabled = true;
oButton1.Enabled = true;
xButton2.Enabled = true;
oButton2.Enabled = true;
xButton3.Enabled = true;
oButton3.Enabled = true;
xLabel1.Visible = false;
oLabel1.Visible = false;
xLabel2.Visible = false;
oLabel2.Visible = false;
xLabel3.Visible = false;
oLabel3.Visible = false;
}
}
}
答案 0 :(得分:2)
您可以这样做的一种方法是循环控件集合。由于您似乎对控件的命名有一个标准,因此您可以先将集合缩小到只有名称以' o'或者' x'。然后,您可以查看控件的类型,如果它是标签,您可以隐藏它,如果它是一个按钮,您可以启用它:
private void ResetControls()
{
foreach (Control control in this.Controls)
{
// Only look at controls whose names begin with 'o' or 'x'
if (control.Name.StartsWith("o") ||control.Name.StartsWith("x"))
{
// Hide it if it's a label
if(control.GetType() == typeof(Label))
{
control.Visible = false;
}
// Enable it if it's a button
else if (control.GetType() == typeof(Button))
{
control.Enabled = true;
}
}
}
}
你提到你所有的按钮和标签都在他们自己的面板控件中,它有自己的控件集合。因此,您可以修改上面的代码,首先搜索面板控件,然后在面板控件的控件集中搜索按钮和标签:
private void ResetControls()
{
foreach (Control control in this.Controls)
{
if (control is Panel)
{
var panel = control as Panel;
foreach (Control panelControl in panel.Controls)
{
// Only look at controls whose names begin with 'o' or 'x'
if (panelControl.Name.StartsWith("o") || panelControl.Name.StartsWith("x"))
{
// Hide it if it's a label
if (panelControl is Label)
{
panelControl.Visible = false;
}
// Enable it if it's a button
else if (panelControl is Button)
{
panelControl.Enabled = true;
}
}
}
}
}
}
请注意,这只是一种可行的解决方案,但肯定不是最好的。通常,控件将在运行时创建,添加到某种类型的集合(通常是一个名为GameBoard
的数组或类似的类型),并通过代码放在表单上。他们的点击事件都将连接到同一个方法,这将根据控件名称或Tag
字段中的某些数据执行正确的操作。
答案 1 :(得分:0)
它们在表单的Controls数组中组合在一起。这是一个如何循环使用它们的简单示例:
private void doReset()
{
foreach (Control c in this.Controls)
{
if (c.GetType() == typeof(Button))
{
c.Enabled = true;
}
else if (c.GetType() == typeof(Label))
{
c.Visible = false;
}
}
}
如果您愿意,可以在那里为特定控件执行更智能的逻辑。如果通过方法获取标签,则为每个按钮添加标签,或者如果要通过该方法获取,则以某种方式命名每个按钮。
答案 2 :(得分:-3)
让我们尝试一下这个想法:
List<Button> buttons = new List<Button>();
List<Label> labels = new List<Label>();
buttons.Add(xButton1)
buttons.Add(oButton1)
buttons.Add(xButton2)
buttons.Add(oButton2)
...
labels.Add(xLabel1)
labels.Add(oLabel1)
labels.Add(xLabel2)
labels.Add(oLabel2)
...
foreach(var ctr in buttons)
{
ctr.Enabled = true;
}
foreach(var ctr in labels)
{
ctr.Enabled = true;
}
答案 3 :(得分:-3)
这就是我经常这样做的方式。如果在click事件中为每个按钮指定不同的文本值,则可以根据文本值执行不同的操作。
using System;
using System.Collections.Generic;
using System.ComponentModel;
using System.Data;
using System.Drawing;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
using System.Windows.Forms;
namespace Tick_Tack_Toe
{
public partial class Form1 : Form
{
public Form1()
{
InitializeComponent();
MyButton.buttons = new List<MyButton>() {
new MyButton() { button = xButton1, label = xLabel1},
new MyButton() { button = xButton2, label = xLabel2},
new MyButton() { button = xButton3, label = xLabel3},
new MyButton() { button = oButton1, label = oLabel1},
new MyButton() { button = oButton2, label = oLabel2},
new MyButton() { button = oButton3, label = oLabel3}
};
foreach (MyButton button in MyButton.buttons)
{
button.button.Click += new EventHandler(Button_Click);
}
}
private void Button_Click(object sender, EventArgs e)
{
MyButton button = sender as MyButton;
button.label.Visible = true;
button.button.Enabled = false;
switch (button.button.Text)
{
case "X":
//enter your code here
break;
case "Y":
//enter your code here
break;
}
}
private void resetToolStripMenuItem_Click(object sender,
EventArgs e)
{
foreach (MyButton button in MyButton.buttons)
{
button.button.Enabled = true;
button.label.Visible = false;
}
}
}
public class MyButton
{
public static List<MyButton> buttons { get; set; }
public Button button { get; set; }
public Label label { get; set; }
}
}