【问题标题】:Creating button methods for a SUPER TIC TAC TOE game为 SUPER TIC TAC TOE 游戏创建按钮方法
【发布时间】:2014-01-23 21:49:08
【问题描述】:

我正在制作一个 Super 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 具有正确的功能。这些按钮是使用 Visual Studio IDE 手动构建的(我只是双击它们来创建按钮单击方法),但我发现这些按钮和我为其大量生成代码的按钮之间的语法完全没有区别。

一些帮助和清晰的解释会很棒!

【问题讨论】:

  • 我的猜测是您实际上并没有将代码连接到按钮本身。我发现生成连线最简单的方法是双击 IDE 中的按钮,让 VS 为您创建连接。
  • 那么这种接线究竟是如何工作的呢?有没有办法在不实际双击所有按钮的情况下做到这一点?
  • 当然,您必须将您的方法附加到您的事件中,类似于button1.Clicked += YourMethodName;。只需看一下 Designer.cs 类,您就会了解 VS 是如何将它们连接起来的。
  • 方法的参数是什么?它会是所述按钮的名称吗?“actionEvent”的参数是什么?
  • 如何找到designer.cs类?

标签: c# visual-studio-2010 tic-tac-toe


【解决方案1】:

避免“大量生产代码”...如果以后您需要更改功能,则必须为 81 种方法更改它。这是不可维护的。

那么,该怎么办?

首先,我什至不会手动将每个按钮放到窗口中。我会让我的代码为我添加每个按钮。现在,你没有说你是在做WinForms 还是WPF。所以我假设WPF,因为它更新并且我认为更好。

以编程方式添加按钮

使用名为gMainGrid 创建一个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...
}

请注意,我们能够分辨列和行...从这里您应该能够执行您需要的任何逻辑。这很棒,因为这样您就不需要一堆不同的方法了。

【讨论】:

    【解决方案2】:

    哇.. 好的。基本规则#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 行 private void button_kClick(etc...) { anyButton_Click(sender, e); }?
    • 不,只有一个!使所有按钮都转到相同的 onClick 方法。您可以使用按钮的 ID 参数(或名称,或其他任何内容)轻松识别被点击的按钮
    • 您能进一步解释一下吗?您给出的方法是否完全可以使用所有按钮,还是这里还有更多工作要做?
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2021-07-18
    • 1970-01-01
    • 2023-04-07
    • 2014-01-19
    相关资源
    最近更新 更多