我是 C# 新手,但我有很多 Java 经验,所以有人告诉我,基于此,C# 相当容易理解。
到目前为止它是。不过目前,我想做一个简单的井字游戏作为练习的一部分。但是我想做的是绘制可以参考的可点击方块,这样我就可以检查该框是否已被点击。
我目前正在使用 Visual Studio Express 2012。我正在制作一个用于桌面使用的 Windows 窗体应用程序。
我四处寻找解决方案,但似乎找不到能做到这一点的东西。
我该怎么做呢?
internal sealed class Box : Control
{
protected override void OnPaint(PaintEventArgs e)
{
e.Graphics.DrawRectangle(Pens.Black, new Rectangle(Point.Empty, new Size(Width - 1, Height - 1)));
}
protected override void OnClick(EventArgs e)
{
MessageBox.Show("You Clicked The Box!");
}
}
创建一个派生自Control
. 从这里您可以覆盖一大堆虚拟成员,包括OnPaint
您可以执行所有绘图逻辑的方法。在 IntelliSense(DrawRectangle、Draw Line 等)的帮助下,这一切都非常直观。
如果您愿意,您可以OnClick
像我在这里所做的那样覆盖,否则您可以像订阅Click
标准控件一样订阅控件的事件。
您还可以从ContainerControl
您的“网格”派生,其行为类似于 Panel 或 GroupBox 控件。
这是一个简单的例子,我只是为了让你开始。在某些分辨率下,边界有点小问题,我将把它留给我糟糕的数学技能。
internal sealed class GameGrid : ContainerControl
{
protected override void OnCreateControl()
{
for (int y = 0; y < 3; y++)
{
for (int x = 0; x < 3; x++)
{
GameButton button = new GameButton
{
Width = Width/3,
Height = Height/3,
};
button.Location = new Point(x*button.Width++, y*button.Height++);
Controls.Add(button);
button.Click += button_Click;
}
}
}
static void button_Click(object sender, EventArgs e)
{
GameButton gameButton = (GameButton)sender;
gameButton.CircleCheck = true;
}
protected override void OnPaint(PaintEventArgs e)
{
e.Graphics.SmoothingMode = SmoothingMode.HighQuality;
e.Graphics.DrawRectangle(Pens.Black, new Rectangle(ClientRectangle.Location, new Size(Width - 1, Height - 1)));
}
}
internal sealed class GameButton : Control
{
private bool _cricleCheck;
public bool CircleCheck
{
get
{
return _cricleCheck;
}
set
{
_cricleCheck = value;
Invalidate();
}
}
private readonly Pen circlePen = new Pen(Brushes.Black, 2.0f);
protected override void OnPaint(PaintEventArgs e)
{
e.Graphics.SmoothingMode = SmoothingMode.HighQuality;
e.Graphics.DrawRectangle(Pens.Black, new Rectangle(ClientRectangle.Location, new Size(Width - 1, Height - 1)));
if (CircleCheck)
{
e.Graphics.DrawEllipse(circlePen, new Rectangle(ClientRectangle.Location.X + 10, ClientRectangle.Location.Y + 10, Width - 30, Height - 30));
}
}
}
最常见的可点击方块是按钮。
如果按钮在当前游戏状态下是可点击的,那么如果点击它,应该在那里显示什么图标,这听起来像是你的后台逻辑的工作。
尝试这个:
希望这可以帮助。
我前两天做过类似的练习,
只需查看本教程,我猜就足够了:
http://www.codeproject.com/Articles/2400/Tic-Tac-Toe-in-C
对于 Square,您可以使用按钮,也可以像本教程一样使用 PictureBox(尽管他们使用的是 vb.net 而不是 c#,但它很容易翻译):
我认为最简单的解决方案是使用带有背景颜色或图像的简单按钮。有一个当前播放用户的变量并更改
button.Text
点击事件。在开头设置“”的所有按钮文本 - 这样您就可以检查按钮是否被单击:
if (button.Text!="")
//it was already clicked