画一个可点击的广场?

时间:2013-03-11 09:01:51

标签: c# winforms

我是C#的新手,但我有很多Java经验,所以我被告知C#很容易理解。

到目前为止。目前,我想做一个简单的TicTacToe作为练习的一部分。但是,我想要做的是绘制可以引用的可点击方块,这样我就可以检查是否已经点击了该框。

我目前正在使用Visual Studio Express 2012.我正在为桌面使用制作Windows窗体应用程序。

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

我将如何做到这一点?

5 个答案:

答案 0 :(得分: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));
        }
    }
}

答案 1 :(得分:0)

最常见的可点击广场是button

如果按钮在当前游戏状态中是可点击的,那么如果点击该按钮,则应该显示哪个图标听起来像是背景逻辑的作业。

答案 2 :(得分:0)

试试这个:

  • 创建新表单
  • 在表单内放置PictureBox控件以呈现Tic Tac Toe板
  • 处理Paint事件以执行图形渲染
  • 处理MouseClick事件以检测用户是否已在电路板内部单击并使用事件参数来确定用户点击的电路板的9个方块中的哪一个

希望这有帮助。

答案 3 :(得分:0)

我在2天前做过类似的练习,

请查看本教程,我想这就足够了:

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

答案 4 :(得分:0)

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

button.Text

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

if (button.Text!="") 
     //it was already clicked