C# 为超级井字游戏创建按钮方法

C# 为超级井字游戏创建按钮方法,c#,visual-studio-2010,tic-tac-toe,C#,Visual Studio 2010,Tic Tac Toe,我正在做一个超级技战术游戏(它基本上是一个3x3网格的技战术战术趾板) 其中,电路板由一块3x3的按钮组成,采用以下点击方式 private void buttonI_Click(object sender, EventArgs e) { if(jar == true) { buttonI.Text = "X"; } if(jar == false) { buttonI.text = "O"; } j

我正在做一个超级技战术游戏(它基本上是一个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脚本为
1Wow.大规模生成代码。。好啊基本规则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)
}
避免“大规模生产代码”。。。如果以后需要更改功能,则必须更改81个方法。那是不可维护的

那么,该怎么办?

首先,我甚至不会手动将每个按钮放入窗口。我会让我的代码为我添加每个按钮。现在,您没有说您是在做
WinForms
还是
WPF
。因此,我将假设WPF
WPF
,因为它更新了,而且我认为更好

以编程方式添加按钮

使用名为
gMain
网格创建一个
窗口
。然后连接到窗口的
初始化
事件:

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
,放入正确的单元格,然后绑定到
单击事件。现在让我们看看事件处理程序

事件处理程序

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...
}

请注意,我们可以告诉列和行。。。从这一点上,你应该能够做任何你需要的逻辑。这很好,因为这样您就不需要一大堆不同的方法。

我猜您实际上没有将代码连接到按钮本身。我发现生成连接的最简单方法是双击IDE中的按钮,让VS为您创建连接。那么这种连接到底是如何工作的呢?有没有一种方法可以在不双击所有按钮的情况下执行此操作?当然,您必须将您的方法附加到您的事件中,例如
button1.Clicked+=YourMethodName。只要看看designer.cs类,您就会看到VS是如何连接它们的。这些方法的参数是什么?这是所说的按钮的名称吗,“actionEvent”的参数是什么?我如何找到designer.cs类?因此我必须制作81行私有的void button_kClick(等等){anyButton_Click(sender,e);}?不,只有一行!使所有按钮转到相同的onClick方法。您可以使用按钮的ID参数(或名称,或其他)轻松确定点击了哪个按钮。您能进一步解释一下吗?您所给出的方法是否完全能够处理所有按钮,或者这里还有更多的工作要做?
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...
}