我正在制作一款超级Tac Toe游戏(它基本上是一个3x3网格的井字板)
其中板由3x3的按钮块组成,具有以下点击方法
private void buttonI_Click(object sender, EventArgs e)
{
if(jar == true)
{
buttonI.Text = "X";
}
if(jar == false)
{
buttonI.text = "O";
}
jar = !(jar)
}
其中jar是一个布尔变量,用于跟踪每个玩家的回合。我使用了Python脚本来批量生成1 <= I <= 81
的代码,但。。。只有我的按钮1-9具有正确的功能。这些按钮是使用VisualStudioIDE手动构建的(我只是双击它们来创建按钮单击方法),但我发现这些按钮与我为其批量生成代码的按钮在语法上完全没有区别。
一些帮助和明确的解释会很棒!
避免"批量生产代码"。。。如果以后需要更改功能,则必须更改81种方法。这是不可维护的。
那么,该怎么办
首先,我甚至不会手动将每个按钮放入窗口。我会让我的代码为我添加每个按钮。现在,你没有说你是在做WinForms
还是WPF
。所以我假设WPF
,因为它更新了,而且我认为要好得多。
以编程方式添加按钮
使用名为gMain
的Grid
创建一个Window
。然后绑定到窗口的Initialize
事件:
private void handleWindowInitialized(object sender, EventArgs e)
{
// Add 3 rows and 3 columns.
for (int i = 0; i < 3; i++)
{
gMain.ColumnDefinitions.Add(new ColumnDefinition());
gMain.RowDefinitions.Add(new RowDefinition());
}
// Add button to each cell.
for(int row=0; row<3; row++)
for (int column = 0; column < 3; column++)
createButton(row, column);
}
既然我们已经设置了gMain
,让我们来看看方法createButton()
。
构建按钮
private void createButton(int row, int column)
{
var button = new Button();
// Add to gMain
gMain.Children.Add(button);
// Place the button in the correct cell.
Grid.SetRow(button, row);
Grid.SetColumn(button, column);
// Tie to the click event.
button.Click += handleButtonClick;
}
够简单吗?我们只需创建一个Button
,将其添加到gMain
,放入正确的单元格,然后绑定到Click
事件。现在让我们来看一下事件处理程序。
事件处理程序
void handleButtonClick(object sender, RoutedEventArgs e)
{
var button = (Button)sender;
int row = Grid.GetRow(button);
int column = Grid.GetColumn(button);
// Do what ever you would like to do...
}
注意,我们可以告诉列和行。。。由此,你应该能够做任何你需要的逻辑。这很好,因为这样你就不需要一堆不同的方法了。
哇。。好的。基本规则#1:你是面向对象的。而非模块化。为什么重复该功能?
相反,您可以为按钮设置一个ID,并为所有按钮设置相同的onClick事件
定义9个按钮,每个按钮的id为0..8因此,每个按钮都会调用
private void anyButton_Click(object sender, EventArgs e)
{
// sender is your button! you can use it's .id or anything alike
if(jar == true)
{
buttonI.Text = "X";
}
if(jar == false)
{
buttonI.text = "O";
}
jar = !(jar)
}