C# 为超级井字游戏创建按钮方法
我正在做一个超级技战术游戏(它基本上是一个3x3网格的技战术战术趾板) 其中,电路板由一块3x3的按钮组成,采用以下点击方式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
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
。因此,我将假设WPFWPF
,因为它更新了,而且我认为更好
以编程方式添加按钮
使用名为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...
}