1

我是 C# 新手,但我有很多 Java 经验,所以有人告诉我,基于此,C# 相当容易理解。

到目前为止它是。不过目前,我想做一个简单的井字游戏作为练习的一部分。但是我想做的是绘制可以参考的可点击方块,这样我就可以检查该框是否已被点击。

我目前正在使用 Visual Studio Express 2012。我正在制作一个用于桌面使用的 Windows 窗体应用程序。

我四处寻找解决方案,但似乎找不到能做到这一点的东西。

我该怎么做呢?

4

5 回答 5

3
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));
        }
    }
}
于 2013-03-11T09:18:19.770 回答
0

最常见的可点击方块是按钮

如果按钮在当前游戏状态下是可点击的,那么如果点击它,应该在那里显示什么图标,这听起来像是你的后台逻辑的工作。

于 2013-03-11T09:11:57.563 回答
0

尝试这个:

  • 创建一个新表单
  • 将 PictureBox 控件拖放到窗体内以呈现井字游戏板
  • 处理 Paint 事件以进行图形渲染
  • 处理 MouseClick 事件以检测用户是否在棋盘内单击,并使用事件参数来确定用户单击了棋盘的 9 个方格中的哪一个

希望这可以帮助。

于 2013-03-11T09:12:04.483 回答
0

我前两天做过类似的练习,

只需查看本教程,我猜就足够了:

http://www.codeproject.com/Articles/2400/Tic-Tac-Toe-in-C

对于 Square,您可以使用按钮,也可以像本教程一样使用 PictureBox(尽管他们使用的是 vb.net 而不是 c#,但它很容易翻译):

http://vbprogramming.8k.com/tutorials/tic-tac-toe.htm

于 2013-03-11T09:16:02.563 回答
0

我认为最简单的解决方案是使用带有背景颜色或图像的简单按钮。有一个当前播放用户的变量并更改

button.Text

点击事件。在开头设置“”的所有按钮文本 - 这样您就可以检查按钮是否被单击:

if (button.Text!="") 
     //it was already clicked
于 2013-03-11T09:18:10.643 回答