【问题标题】:How can I reset the grid through the button in tic-tac-toe game?如何通过井字游戏中的按钮重置网格?
【发布时间】:2019-03-17 21:17:04
【问题描述】:

如何通过单击按钮重置网格(游戏场)(已经有空事件处理程序)?我尝试添加RefreshInvalidate,但它不起作用。我无法将 X 或 O 放置在重置之前放置的位置(通过使用 Invalidate),并且每次点击后获胜计数继续有效。我不能使用按钮或图像,只能绘制和定义坐标,所以它使任务复杂化(至少我是这么认为的)

这是我的代码:

public partial class Form1 : Form
{
    int win;
    int move = 0;
    int[,] mas = new int[3, 3];
    int draw = 0;
    int xwin = 0;
    int owin = 0;

    public Form1()
    {
        InitializeComponent();
    }

    private void Form1_Paint(object sender, PaintEventArgs e)
    {
        Graphics g = e.Graphics;
        g.DrawLine(new Pen(Color.Black, 4.0f), 100, 100, 100, 700);
        g.DrawLine(new Pen(Color.Black, 4.0f), 100, 100, 700, 100);
        g.DrawLine(new Pen(Color.Black, 4.0f), 700, 100, 700, 700);
        g.DrawLine(new Pen(Color.Black, 4.0f), 100, 700, 700, 700);
        g.DrawLine(new Pen(Color.Black, 4.0f), 100, 300, 700, 300);
        g.DrawLine(new Pen(Color.Black, 4.0f), 100, 500, 700, 500);
        g.DrawLine(new Pen(Color.Black, 4.0f), 300, 100, 300, 700);
        g.DrawLine(new Pen(Color.Black, 4.0f), 500, 100, 500, 700);
    }

    private void Form1_MouseClick(object sender, MouseEventArgs e)
    {


            {
                Graphics g = this.CreateGraphics();


                if (move % 2 == 0)
                {
                    if ((e.X > 100) && (e.X < 300) && (e.Y > 100) && (e.Y < 300) && (mas[0, 0] == 0))
                    {
                        g.DrawLine(new Pen(Color.Black, 4.0f), 105, 105, 295, 295);
                        g.DrawLine(new Pen(Color.Black, 4.0f), 105, 295, 295, 105);
                        move++;
                        mas[0, 0] = 1;
                    }
                    if ((e.X > 300) && (e.X < 500) && (e.Y > 100) && (e.Y < 300) && (mas[0, 1] == 0))
                    {
                        g.DrawLine(new Pen(Color.Black, 4.0f), 305, 105, 495, 295);
                        g.DrawLine(new Pen(Color.Black, 4.0f), 305, 295, 495, 105);
                        move++;
                        mas[0, 1] = 1;
                    }

                    if ((e.X > 500) && (e.X < 700) && (e.Y > 100) && (e.Y < 300) && (mas[0, 2] == 0))
                    {
                        g.DrawLine(new Pen(Color.Black, 4.0f), 505, 105, 695, 295);
                        g.DrawLine(new Pen(Color.Black, 4.0f), 505, 295, 695, 105);
                        move++;
                        mas[0, 2] = 1;
                    }
                    if ((e.X > 100) && (e.X < 300) && (e.Y > 300) && (e.Y < 500) && (mas[1, 0] == 0))
                    {
                        g.DrawLine(new Pen(Color.Black, 4.0f), 105, 305, 295, 495);
                        g.DrawLine(new Pen(Color.Black, 4.0f), 105, 495, 295, 305);
                        move++;
                        mas[1, 0] = 1;
                    }
                    if ((e.X > 300) && (e.X < 500) && (e.Y > 300) && (e.Y < 500) && (mas[1, 1] == 0))
                    {
                        g.DrawLine(new Pen(Color.Black, 4.0f), 305, 305, 495, 495);
                        g.DrawLine(new Pen(Color.Black, 4.0f), 495, 305, 305, 495);
                        move++;
                        mas[1, 1] = 1;
                    }

                    if ((e.X > 500) && (e.X < 700) && (e.Y > 300) && (e.Y < 500) && (mas[1, 2] == 0))
                    {
                        g.DrawLine(new Pen(Color.Black, 4.0f), 505, 305, 695, 495);
                        g.DrawLine(new Pen(Color.Black, 4.0f), 505, 495, 695, 305);
                        move++;
                        mas[1, 2] = 1;
                    }
                    if ((e.X > 100) && (e.X < 300) && (e.Y > 500) && (e.Y < 700) && (mas[2, 0] == 0))
                    {
                        g.DrawLine(new Pen(Color.Black, 4.0f), 105, 505, 295, 695);
                        g.DrawLine(new Pen(Color.Black, 4.0f), 105, 695, 295, 505);
                        move++;
                        mas[2, 0] = 1;
                    }
                    if ((e.X > 300) && (e.X < 500) && (e.Y > 500) && (e.Y < 700) && (mas[2, 1] == 0))
                    {
                        g.DrawLine(new Pen(Color.Black, 4.0f), 305, 505, 495, 695);
                        g.DrawLine(new Pen(Color.Black, 4.0f), 305, 695, 495, 505);
                        move++;
                        mas[2, 1] = 1;
                    }
                    if ((e.X > 500) && (e.X < 700) && (e.Y > 500) && (e.Y < 700) && (mas[2, 2] == 0))
                    {
                        g.DrawLine(new Pen(Color.Black, 4.0f), 505, 505, 695, 695);
                        g.DrawLine(new Pen(Color.Black, 4.0f), 505, 695, 695, 505);
                        move++;
                        mas[2, 2] = 1;
                    }

                }
                else
                {

                    if ((e.X > 100) && (e.X < 300) && (e.Y > 100) && (e.Y < 300) && (mas[0, 0] == 0))
                    {
                        g.DrawEllipse(new Pen(Color.Black, 4.0f), 105, 105, 190, 190);
                        move++;
                        mas[0, 0] = 2;
                    }
                    if ((e.X > 300) && (e.X < 500) && (e.Y > 100) && (e.Y < 300) && (mas[0, 1] == 0))
                    {
                        g.DrawEllipse(new Pen(Color.Black, 4.0f), 305, 105, 190, 190);
                        hod++;
                        mas[0, 1] = 2;
                    }
                    if ((e.X > 500) && (e.X < 700) && (e.Y > 100) && (e.Y < 300) && (mas[0, 2] == 0))
                    {
                        g.DrawEllipse(new Pen(Color.Black, 4.0f), 505, 105, 190, 190);
                        move++;
                        mas[0, 2] = 2;
                    }
                    if ((e.X > 100) && (e.X < 300) && (e.Y > 300) && (e.Y < 500) && (mas[1, 0] == 0))
                    {
                        g.DrawEllipse(new Pen(Color.Black, 4.0f), 105, 305, 190, 190);
                        move++;
                        mas[1, 0] = 2;
                    }
                    if ((e.X > 300) && (e.X < 500) && (e.Y > 300) && (e.Y < 500) && (mas[1, 1] == 0))
                    {
                        g.DrawEllipse(new Pen(Color.Black, 4.0f), 305, 305, 190, 190);
                        move++;
                        mas[1, 1] = 2;
                    }
                    if ((e.X > 500) && (e.X < 700) && (e.Y > 300) && (e.Y < 500) && (mas[1, 2] == 0))
                    {
                        g.DrawEllipse(new Pen(Color.Black, 4.0f), 505, 305, 190, 190);
                        move++;
                        mas[1, 2] = 2;
                    }
                    if ((e.X > 100) && (e.X < 300) && (e.Y > 500) && (e.Y < 700) && (mas[2, 0] == 0))
                    {
                        g.DrawEllipse(new Pen(Color.Black, 4.0f), 105, 505, 190, 190);
                        move++;
                        mas[2, 0] = 2;
                    }
                    if ((e.X > 300) && (e.X < 500) && (e.Y > 500) && (e.Y < 700) && (mas[2, 1] == 0))
                    {
                        g.DrawEllipse(new Pen(Color.Black, 4.0f), 305, 505, 190, 190);
                        move++;
                        mas[2, 1] = 2;
                    }
                    if ((e.X > 500) && (e.X < 700) && (e.Y > 500) && (e.Y < 700) && (mas[2, 2] == 0))
                    {
                        g.DrawEllipse(new Pen(Color.Black, 4.0f), 505, 505, 190, 190);
                        move++;
                        mas[2, 2] = 2;

                    }

                }


                if ((mas[0, 0] == 1 && mas[0, 1] == 1 && mas[0, 2] == 1))
                {
                    win = 1;
                    g.DrawLine(new Pen(Color.Red, 6.0f), 105, 200, 695, 200);
                    xwin += 1;

                }

                if ((mas[1, 0] == 1 && mas[1, 1] == 1 && mas[1, 2] == 1))
                {
                    win = 1;
                    g.DrawLine(new Pen(Color.Red, 6.0f), 105, 400, 695, 400);
                    xwin += 1;
                }
                if ((mas[2, 0] == 1 && mas[2, 1] == 1 && mas[2, 2] == 1))
                {
                    win = 1;
                    g.DrawLine(new Pen(Color.Red, 6.0f), 105, 600, 695, 600);
                    xwin += 1;
                }
                if ((mas[0, 0] == 1 && mas[1, 0] == 1 && mas[2, 0] == 1))
                {
                    win = 1;
                    g.DrawLine(new Pen(Color.Red, 6.0f), 200, 105, 200, 695);
                    xwin += 1;
                }

                if ((mas[0, 1] == 1 && mas[1, 1] == 1 && mas[2, 1] == 1))
                {
                    win = 1;
                    g.DrawLine(new Pen(Color.Red, 6.0f), 400, 105, 400, 695);
                    xwin += 1;
                }
                if ((mas[0, 2] == 1 && mas[1, 2] == 1 && mas[2, 2] == 1))
                {
                    win = 1;
                    g.DrawLine(new Pen(Color.Red, 6.0f), 600, 105, 600, 695);
                    xwin += 1;
                }

                if ((mas[0, 0] == 1 && mas[1, 1] == 1 && mas[2, 2] == 1))
                {
                    win = 1;
                    g.DrawLine(new Pen(Color.Red, 6.0f), 105, 105, 695, 695);
                    xwin += 1;
                }
                if ((mas[0, 2] == 1 && mas[1, 1] == 1 && mas[2, 0] == 1))
                {
                    g.DrawLine(new Pen(Color.Red, 6.0f), 695, 105, 105, 695);
                    xwin += 1;
                }


                if ((mas[0, 0] == 2 && mas[0, 1] == 2 && mas[0, 2] == 2))
                {
                    win = 2;
                    g.DrawLine(new Pen(Color.Blue, 6.0f), 105, 200, 695, 200);
                    owin += 1;
                }


                if ((mas[1, 0] == 2 && mas[1, 1] == 2 && mas[1, 2] == 2))
                {
                    win = 2;
                    g.DrawLine(new Pen(Color.Blue, 6.0f), 105, 400, 695, 400);
                    owin += 1;
                }
                if ((mas[2, 0] == 2 && mas[2, 1] == 2 && mas[2, 2] == 2))
                {
                    win = 2;
                    g.DrawLine(new Pen(Color.Blue, 6.0f), 105, 600, 695, 600);
                    owin += 1;
                }
                if ((mas[0, 0] == 2 && mas[1, 0] == 2 && mas[2, 0] == 2))
                {
                    win = 2;
                    g.DrawLine(new Pen(Color.Blue, 6.0f), 200, 105, 200, 695);
                    owin += 1;
                }
                if ((mas[0, 1] == 2 && mas[1, 1] == 2 && mas[2, 1] == 2))
                {
                    win = 2;
                    g.DrawLine(new Pen(Color.Blue, 6.0f), 400, 105, 400, 695);
                    owin += 1;
                }
                if ((mas[0, 2] == 2 && mas[1, 2] == 2 && mas[2, 2] == 2))
                {
                    win = 2;
                    g.DrawLine(new Pen(Color.Blue, 6.0f), 600, 105, 600, 695);
                    owin += 1;
                }
                if ((mas[0, 0] == 2 && mas[1, 1] == 2 && mas[2, 2] == 2))
                {
                    win = 2;
                    g.DrawLine(new Pen(Color.Blue, 6.0f), 105, 105, 695, 695);
                    owin += 1;
                }
                if ((mas[0, 2] == 2 && mas[1, 1] == 2 && mas[2, 0] == 2))
                {
                    win = 2;
                    g.DrawLine(new Pen(Color.Blue, 6.0f), 695, 105, 105, 695);
                    owin += 1;
                }
                if ((hod >= 9) && (win == 0))
                {
                    MessageBox.Show("Draw");
                    draw += 1;

                }

                label1.Text = "X won : " + xwin;
                label2.Text = "O won : " + owin;
                label3.Text = "Draws: " + draw;

            }

    }

    private void button1_Click(object sender, EventArgs e)
    {

    }
}
}

【问题讨论】:

  • 你应该只画Form1_Paint。其他方法应该只更改mas 中的单元格,然后调用Invalidate。 paint 方法将首先绘制背景,然后绘制网格,然后在两个嵌套循环中根据单元格的内容绘制 X 和 O 或什么都不画。 Invalidate 只会导致调用 Form1_Paint。它什么也不做。另外,你经常重复自己。通过使用一些循环和一些数学运算,您的代码会变得更短。应避免使用几乎相同的代码的 9 个副本。

标签: c# .net visual-studio paint tic-tac-toe


【解决方案1】:

您需要重置您的 mas 数组以跟踪谁点击了哪些位置,然后您才能接受新的点击。

【讨论】:

  • 所以我添加了这部分代码: private void button1_Click(object sender, EventArgs e) { Array.Clear (mas, 0, mas.Length);无效();但是现在“draws”不能正常工作,并且当它绘制时计数器不会改变。即使游戏已经获胜,我也可以在空白处放置“X”或“O”,并且每次点击后计数器都会改变。我能用它做什么? :/ –
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2013-07-15
  • 2022-12-10
  • 1970-01-01
  • 2016-06-24
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多