C#winform实现简单的五子棋(详细)

1.首先拖拽组件完成窗口界面

简单的7个组件组成界面
朴实的界面

2.代码编写

代码整体结构如下
在这里插入图片描述

(1)变量声明

在这里插入图片描述
PS:因为棋盘采用矩形进行绘制,所以说这里的size指棋盘行列的方格数,那么能够供棋子落子的棋盘大小则要加上1,即棋盘有14行,14列。

(2)初始化对局方法

此方法 初始化棋盘二维数组并绘制棋盘

棋盘二维数组分为三个值,0代表此格未落子,1代表此格为红子,-1代表黑子。
private void initializeGame()//初始化对局
        {
            start = false;//对局未开始
            for (int i = 0; i <= size; i++)//初始化棋盘数组
            {
                for (int j=0;j<=size;j++)
                {
                    CheckBoard[i, j] = 0;//把代表落子的二维数组全置为0
                }
            }
            Point pt0 = new Point(0, 0);//棋盘绘制初始点位,即从pictureBox左上角开始
            int width = 30;//方格的宽,即棋盘两点间的距离()
            var g = pictureBox1.CreateGraphics();//用pictureBox创建画布
            g.Clear(Color.White);//背景颜色设置
            var pen = new Pen(Color.Black);//黑色笔刷
            for (int line = 0; line < size; line++)
            {
                for (int i = 0; i < size; i++)
                {
                    if (line % 2 == 0 && i % 2 == 0)//绘制偶数列和偶数行的方格
                    {
                        g.DrawRectangle(pen, i * 1 * width + pt0.X, 1 * line * width + pt0.Y, width, width);//绘制一格
                    }
                    else//绘制奇数列和奇数行的方格
                    {
                        g.DrawRectangle(pen, i * 1 * width + pt0.X, 1 * line * width + pt0.Y, width, width);
                    }
                }
            }    
            g.Dispose();  
        }

效果如下图
在这里插入图片描述

(3)按钮点击事件

“开始”按钮

点击后,游戏开始
private void button1_Click(object sender, EventArgs e)
        {
            initializeGame();//调用棋盘初始化方法
            start = true;//游戏置为开始状态
            button1.Text = "重新开始";//改变此按钮文本为“重新开始”
            label2.Text = "等待红子落子";//首回合红子先落子
            round = 1;//回合置1
            label5.Text = round + "";//用label5显示回合数
        }

“结束”按钮

点击后,直接退出程序
private void button2_Click(object sender, EventArgs e)
     {
         this.Dispose();
     }

(4)棋盘点击事件

1.点击棋盘,可在棋盘上该位置绘制棋子。
2.用鼠标在棋盘上的坐标,运算得到棋子在二维数组上的坐标。
3.以棋盘该点位为中心绘制棋子,
  因为鼠标点击后,绘制方法会以鼠标点击位置为原点向右下角方向绘制,
  则我们需要更改绘制坐标,使得其从鼠标点击位置为中心点绘制棋子。
  更改的话,只需要在调用绘制方法时,x,y轴的坐标都减去一个棋子的半径即可。
private void pictureBox1_Click(object sender, EventArgs e)
        {
            Graphics g = pictureBox1.CreateGraphics();//再次创建画布
            if (start)//游戏开始,才可以点击
            {
                Point box1Ponit = pictureBox1.PointToClient(Control.MousePosition);//设置鼠标点击后在pictureBox(即棋盘)上的坐标
                int x = box1Ponit.X % 30 > 15 ? box1Ponit.X / 30 + 1 : box1Ponit.X / 30;//将横坐标对30取余,判断鼠标点击的点靠进左边的落点,还是靠进右边的落点,从而得出棋子在二维数组里的坐标即小x
                int y = box1Ponit.Y % 30 > 15 ? box1Ponit.Y / 30 + 1 : box1Ponit.Y / 30;//小y同小x
                if (CheckBoard[x, y]!=0)//如果该点位有棋子
                {
                    MessageBox.Show("请勿重复落子");
                }
                else
                {
                    if (ChessCheck)//判断是哪方的回合
                    {
                        g.FillEllipse(Brushes.Red, x * 30 - 13, y * 30 - 13, 26, 22);//小x*30得到位于棋盘交叉点的位置,绘制时减13则可以交叉点为中心绘制棋子
                        CheckBoard[x, y] = 1;//二维数组置1,表示以落红子
                        ChessCheck = !ChessCheck;//红子先手回合结束
                        label2.Text = "等待黑子落子";
                    }
                    else
                    {
                        g.FillEllipse(Brushes.Black, x * 30 - 13, y * 30 - 13, 26, 22);//同上
                        CheckBoard[x, y] = -1;
                        ChessCheck = !ChessCheck;
                        label2.Text = "等待红子落子";
                        round++;//黑子回合后手结束后,回合数加一
                        label5.Text = round + "";
                    }
                    g.Dispose();
                    SuccessCheck(x,y);//每下一个棋子,调用方法判断是否连成5个
                }
            }
        }

(5)输赢判断

以当前落点棋子为中心,分别判断其8个方向的棋子是否能连成五个
以左边为例,判断时分为三个步骤
 1.该落点左边是否够四个点位  2.判断第四个点位上是否是己方棋子
 3.前两项都满足后,再逐一判断左边连续的三个点位是否为己方棋子
 4.如果第三项判断成功则满足五子连线,赢得比赛
  private void SuccessCheck(int x,int y)//传入当前落子的坐标(棋盘点击事件方法中获取到的二维数组中的坐标)
        {
            int color=CheckBoard[x, y];//当前落子颜色
            int success = 0;//连续的棋子数
            int width = 30;
            if (x - 4 >= 0 && CheckBoard[x-4,y]==color)//判断棋子左边四个点位,如果左边有四个点位,且该尽头点位有同色棋子的话
            {
                for (int i = 1; i <= 3; i++)//判断中间3个棋子是否同色
                {
                    if (CheckBoard[x - i, y] == color) { success++;}//有同色棋子则success加一        
                }
                if (success == 3) { //success为3时,加上本身与尽头则有5个棋子,获胜
                    Graphics g = pictureBox1.CreateGraphics();
                    g.DrawLine(new Pen(Color.Red, 2), new Point(x* width+ width, y* width), new Point((x - 4)* width- width, y* width));//将五个连续的棋子用红线画出
                    MessageBox.Show(color == 1 ? "红子胜利!" : "黑子胜利!");
                    g.Dispose();
                }
                success = 0;
            }
            else if (x + 4 <= 13 && CheckBoard[x + 4, y] == color)//右边判断
            { 
                for (int i = 1; i < 4; i++)
                {
                    if (CheckBoard[x + i, y] == color) { success++;}
                }
                if (success == 3)
                {
                    Graphics g = pictureBox1.CreateGraphics();
                    g.DrawLine(new Pen(Color.Red, 2), new Point(x * width- width, y * width), new Point((x + 4) * width+ width, y * width));
                    MessageBox.Show(color == 1 ? "红子胜利!" : "黑子胜利!");
                    g.Dispose();
                }
                success = 0;
            }
            else if (y - 4 >= 0 && CheckBoard[x, y-4] == color)//上边判断
            {
                for (int i = 1; i < 4; i++)
                {
                    if (CheckBoard[x, y - i] == color) { success++;}
                }
                if (success == 3)
                {
                    Graphics g = pictureBox1.CreateGraphics();
                    g.DrawLine(new Pen(Color.Red, 2), new Point(x * width, y * width+ width), new Point(x * width, (y-4) * width- width));
                    MessageBox.Show(color == 1 ? "红子胜利!" : "黑子胜利!");
                    g.Dispose();
                }
                success = 0;
            }
            else if (y + 4 <= 13 && CheckBoard[x, y+4] == color)//下边判断
            {
                for (int i = 1; i < 4; i++)
                {
                    if (CheckBoard[x, y + i] == color) { success++;}
                }
                if (success == 3)
                {
                    Graphics g = pictureBox1.CreateGraphics();
                    g.DrawLine(new Pen(Color.Red, 2), new Point(x * width, y * width- width), new Point(x * width,(y+4) * width+ width));
                    MessageBox.Show(color == 1 ? "红子胜利!" : "黑子胜利!");
                    g.Dispose();
                }
                success = 0;
            }
            else if (x - 4 >= 0 && y - 4 >= 0&& CheckBoard[x -4, y-4] == color)//左上判断
            {
                for (int i = 1; i < 4; i++)
                {
                    if (CheckBoard[x-i, y - i] == color) { success++;}
                }
                if (success == 3)
                {
                    Graphics g = pictureBox1.CreateGraphics();
                    g.DrawLine(new Pen(Color.Red, 2), new Point(x * width+ width, y * width+ width), new Point((x-4) * width- width, (y - 4) * width- width));
                    MessageBox.Show(color == 1 ? "红子胜利!" : "黑子胜利!");
                    g.Dispose();
                }
                success = 0;
            }
            else if (x + 4 <= 13 && y - 4 >= 0 && CheckBoard[x + 4, y - 4] == color)//右上判断
            {
                for (int i = 1; i < 4; i++)
                {
                    if (CheckBoard[x + i, y - i] == color) { success++;}
                }
                if (success == 3)
                {
                    Graphics g = pictureBox1.CreateGraphics();
                    g.DrawLine(new Pen(Color.Red, 2), new Point(x * width- width, y * width+ width), new Point((x+4) * width+ width, (y - 4) * width- width));
                    MessageBox.Show(color == 1 ? "红子胜利!" : "黑子胜利!");
                    g.Dispose();
                }
                success = 0;
            }
            else if (x - 4 >= 0 && y + 4 <= 13 && CheckBoard[x - 4, y + 4] == color)//左下判断
            {
                for (int i = 1; i < 4; i++)
                {
                    if (CheckBoard[x - i, y + i] == color) { success++;}
                }
                if (success == 3)
                {
                    Graphics g = pictureBox1.CreateGraphics();
                    g.DrawLine(new Pen(Color.Red, 2), new Point(x * width+ width, y * width- width), new Point((x - 4) * width- width, (y + 4) * width+ width));
                    MessageBox.Show(color == 1 ? "红子胜利!" : "黑子胜利!");
                    g.Dispose();
                }
                success = 0;
            }
            else if (x + 4 <= 13 && y + 4 <=13 && CheckBoard[x + 4, y + 4] == color)//右下判断
            {
                for (int i = 1; i < 4; i++)
                {
                    if (CheckBoard[x + i, y + i] == color) { success++;}
                }
                if (success == 3)
                {
                    Graphics g = pictureBox1.CreateGraphics();
                    g.DrawLine(new Pen(Color.Red,2), new Point(x * width- width, y * width- width), new Point((x + 4) * width+ width, (y + 4) * width+ width));
                    MessageBox.Show(color == 1 ? "红子胜利!" : "黑子胜利!");
                    g.Dispose();
                }
                success = 0;
            }

3.最终效果

在这里插入图片描述

第一次写c#,记录下,希望加深记忆的同时为有缘人提供帮助,参考了站内许多大佬的思路,感谢大佬。

评论 11
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值