【C#课程作业】五子棋

label(1)--------------------panel(2)------------------button(3)
左边为panel2
右边为panel1
button1开始游戏
button2重新游戏
button3退出

在这里插入图片描述

using System;
using System.Collections.Generic;
using System.ComponentModel;
using System.Data;
using System.Drawing;
using System.Drawing.Drawing2D;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
using System.Windows.Forms;

namespace fc
{






    //主程序

    public partial class Form1 : Form
    {
        private bool start;     // 游戏是否开始
        private bool ChessCheck = true;     // 白子黑子回合
        private const int size = 15;     // 棋盘大小
        private int[,] CheckBoard = new int[size, size];     // 棋盘点位数组

        public Form1()
        {
            InitializeComponent();
        }



        private void Form1_Load(object sender, EventArgs e)
        {
            initializeGame();                       //初始化游戏
            this.Width =  MainSize.FormWidth;      // 设置窗口宽度
            this.Height = MainSize.FormHeight;     // 设置窗口高度
            this.Location = new Point(400, 75);    // 设置窗口位置
        }



        //初始化游戏
        private  void initializeGame()
        {
            //棋盘点位,恢复默认,也就是0
            for (int i = 0; i < size; i++)
                for (int j = 0; j < size; j++)
                    CheckBoard[i, j] = 0;
            start = false;
            label1.Text = "游戏未开始";
            //开始游戏显示
            button1.Visible = true;
            //重新游戏隐藏
            button2.Visible = false;

        }


   private void panel2_Paint(object sender, PaintEventArgs e)
        {          
            Graphics g = panel2.CreateGraphics();      // 创建面板画布
            ChessBoard.DrawCB(g);                      // 调用画棋盘方法
            Chess.ReDrawC(panel2, CheckBoard);         // 调用重新加载棋子方法
            
        }

        private void panel1_Paint(object sender, PaintEventArgs e)
        {

            // 设置控制界面的大小
            //(宽度,高度)
            panel1.Size = new Size(MainSize.FormWidth - MainSize.CBoardWidth - 20, MainSize.FormHeight);
        }



     

        private void button1_Click(object sender, EventArgs e)
        {
            start = true;                              // 开始
            ChessCheck = true;                         // 黑子回合
            label1.Text = "黑子回合";                  // 提示文本改为"黑子回合"
            button1.Visible = true ;                   // 隐藏'开始游戏'按钮
            button2.Visible = true;                    // 显示'重新开始'按钮
           // panel2.Invalidate();                       // 重绘面板"棋盘"

        }

        private void button2_Click(object sender, EventArgs e)
        {
            // 确认是否重新开始
            if (MessageBox.Show("确认要重新开始?", "提示", MessageBoxButtons.OKCancel, MessageBoxIcon.Question, MessageBoxDefaultButton.Button2) == DialogResult.OK)
            {

                initializeGame();                      // 调用初始化游戏方法
                button1_Click(sender, e);              // 调用按钮"开始游戏"Click事件
            }
        }

        private void button3_Click(object sender, EventArgs e)
        {
            this.Dispose();
        }

        private void panel2_MouseDown(object sender, MouseEventArgs e)
        {
            // 判断游戏是否开始
            if (start)
            {
                int Judgment = 0;            // 判断数组当前行列,白子还是黑子回合,0表示没有,1表示黑子,2表示白子、用来判断胜利

                int PlacementX = e.X / MainSize.CBoardGap;      // 求鼠标点击的X方向的第几个点位
                int PlacementY = e.Y / MainSize.CBoardGap;      // 求鼠标点击的Y方向的第几个点位

                try
                {
                    // 判断此位置是否为空
                    if (CheckBoard[PlacementX, PlacementY] != 0)
                    {
                        return;                                 // 此位置有棋子
                    }

                    // 黑子回合还是白子回合
                    if (ChessCheck)
                    {
                        CheckBoard[PlacementX, PlacementY] = 1; // 黑子回合
                        Judgment = 1;                           // 切换为判断黑子
                        label1.Text = "白子回合";               // 提示文本改为"白子回合"
                    }
                    else
                    {
                        CheckBoard[PlacementX, PlacementY] = 2; // 白子回合
                        Judgment = 2;                           // 切换为判断白子
                        label1.Text = "黑子回合";               // 提示文本改为"黑子回合"
                    }

                    Chess.DrawC(panel2, ChessCheck, PlacementX, PlacementY);  // 画棋子

                    // 胜利判断
                    if (WinJudgment.ChessJudgment(CheckBoard, Judgment))
                    {
                        // 判断黑子还是白子胜利
                        if (Judgment == 1)
                        {
                            MessageBox.Show("五连珠,黑胜!", "胜利提示");    // 提示黑胜
                        }
                        else
                        {
                            MessageBox.Show("五连珠,白胜!", "胜利提示");    // 提示白胜
                        }
                        initializeGame();                      // 调用初始化游戏
                    }

                    ChessCheck = !ChessCheck;                   // 换棋子
                }
                catch (Exception) { }                            // 防止鼠标点击边界,导致数组越界

            }
            else
            {
                MessageBox.Show("请先开始游戏!", "提示");      // 提示开始游戏
            }
        }
    }












    class MainSize
    {
        // 窗口大小
        public static int FormWidth { get { return 800; } }
        public static int FormHeight { get { return 640; } }

        // 棋盘大小
        public static int CBoardWidth { get { return 600; } }
        public static int CBoardHeight { get { return 600; } }

        // 棋格宽度
        public static int CBoardGap { get { return 40; } }

        // 棋子直径
        public static int ChessDiameter { get { return 37; } }
    }












    //using System.Drawing;
    //using System.Windows.Forms;
    // 棋盘类
    class ChessBoard
    {
        // 画棋盘方法
        public static void DrawCB(Graphics g)  //这里的形参,是画布对象
        {
            int GapWidth = MainSize.CBoardGap;                   // 棋格宽度
            int GapNum = MainSize.CBoardWidth / MainSize.CBoardGap - 1;    // 棋格数量 15棋子-1=格数
 

            //这个是 没有用棋盘图片时,用的“画笔”画棋盘方法
            g.Clear(Color.White );                               // 清除画布、并用Bisque颜色填满画布
            Pen pen = new Pen(Color.Black );    // 实例化画笔
            // 画棋盘
            for (int i = 0; i < GapNum + 1; i++)
            {
                //画行
                //依次连接a1,a2     b1,b2......
                //a1(20,20)           b1(20,60)     (20,100)        (20,140)        (20,180)
                //a2(14*40+20=580,20)   b2 (580,60)       (580,100)          (580,140)          (580,200)  
                g.DrawLine(pen, new Point(20, i * GapWidth + 20), new Point(GapWidth * GapNum + 20, i * GapWidth + 20));
                //画列
                g.DrawLine(pen, new Point(i * GapWidth + 20, 20), new Point(i * GapWidth + 20, GapWidth * GapNum + 20));
            }
            
        }
    }


















    //using System.Drawing.Drawing2D;

    // 棋子类
    class Chess
    {
        // 画棋子
        public static void DrawC(Panel p, bool ChessCheck, int PlacementX, int PlacementY)
        {
            Graphics g = p.CreateGraphics();                // 创建面板画布

            int AccurateX = PlacementX * MainSize.CBoardGap + 20 - 17; // 精确棋子的X中心位置
            int AccurateY = PlacementY * MainSize.CBoardGap + 20 - 17; // 精确棋子的Y中心位置

            // 判断谁的回合并画棋子
            if (ChessCheck)
            {
                // 线性渐变会平铺整个面板,根据你的位置填颜色,从上至下渐变,使棋子具有真实感
                g.FillEllipse(new LinearGradientBrush(new Point(20, 0), new Point(20, 40), Color/*.Red */.FromArgb(122, 122, 122), Color/*.Blue*/ .FromArgb(0, 0, 0)),           /*矩形中心位置=棋子中心*/     new Rectangle(new Point(AccurateX, AccurateY),                  /*圆的直径*/    new Size(MainSize.ChessDiameter, MainSize.ChessDiameter)));
            }
            else
            {
                g.FillEllipse(new LinearGradientBrush(new Point(20, 0), new Point(20, 40), Color.FromArgb(255, 255, 255), Color.FromArgb(204, 204, 204)),                                           new Rectangle(new Point(AccurateX, AccurateY),                                   new Size(MainSize.ChessDiameter, MainSize.ChessDiameter)));
            }
        }

        // 界面重新聚焦时,重新加载棋子
        public static void ReDrawC(Panel p, int[,] CheckBoard)
        {
            Graphics g = p.CreateGraphics();                // 创建面板画布

            // 遍历 获取棋盘数组的每行
            for (int i = 0; i < CheckBoard.GetLength(1); i++)
            {
                // 遍历 获取棋盘数组每行的每列
                for (int j = 0; j < CheckBoard.GetLength(0); j++)
                {
                    int Judgment = CheckBoard[j, i];        // 判断数组当前行列,白子还是黑子回合,0表示没有,1表示黑子,2表示白子

                    // 判断是否有棋子
                    if (Judgment != 0)
                    {
                        int AccurateX = j * MainSize.CBoardGap + 20 - 17; // 精确棋子的X中心位置
                        int AccurateY = i * MainSize.CBoardGap + 20 - 17; // 精确棋子的Y中心位置

                        // 判断谁的回合并画棋子
                        if (Judgment == 1)
                        {
                            // 线性渐变会平铺整个面板,根据你的位置填颜色,从上至下渐变,使棋子具有真实感
                         //黑棋
                           g.FillEllipse(new LinearGradientBrush(new Point(20, 0), new Point(20, 40), Color.FromArgb(122, 122, 122), Color.FromArgb(0, 0, 0)), new Rectangle(new Point(AccurateX, AccurateY), new Size(MainSize.ChessDiameter, MainSize.ChessDiameter)));
                        }
                        //白棋
                        else
                        {
                           g.FillEllipse(new LinearGradientBrush(new Point(20, 0), new Point(20, 40), Color.FromArgb(255, 255, 255), Color.FromArgb(204, 204, 204)), new Rectangle(new Point(AccurateX, AccurateY), new Size(MainSize.ChessDiameter, MainSize.ChessDiameter)));
                        }
                    }
                }
            }
        }
    }














    class WinJudgment
    {
        // 棋子判断
        public static bool ChessJudgment(int[,] CheckBoard, int Judgment)
        {
            bool Win = false;         // 胜利判断

            // 遍历 获取棋盘数组的每行
            for (int i = 0; i < CheckBoard.GetLength(1); i++)
            {
                // 遍历 获取棋盘数组每行的每列
                for (int j = 0; j < CheckBoard.GetLength(0); j++)
                {
                    // 判断是否有棋子
                    if (CheckBoard[j, i] == Judgment)
                    {
                        // 水平判断
                        if (j < 11)
                        {
                            if (CheckBoard[j + 1, i] == Judgment && CheckBoard[j + 2, i] == Judgment && CheckBoard[j + 3, i] == Judgment && CheckBoard[j + 4, i] == Judgment)
                            {
                                return Win = true;
                            }
                        }
                        // 垂直判断
                        if (i < 11)
                        {
                            if (CheckBoard[j, i + 1] == Judgment && CheckBoard[j, i + 2] == Judgment && CheckBoard[j, i + 3] == Judgment && CheckBoard[j, i + 4] == Judgment)
                            {
                                return Win = true;
                            }
                        }
                        // 右下判断
                        if (j < 11 && i < 11)
                        {
                            if (CheckBoard[j + 1, i + 1] == Judgment && CheckBoard[j + 2, i + 2] == Judgment && CheckBoard[j + 3, i + 3] == Judgment && CheckBoard[j + 4, i + 4] == Judgment)
                            {
                                return Win = true;
                            }
                        }
                        // 左下判断
                        if (j > 3 && i < 11)
                        {
                            if (CheckBoard[j - 1, i + 1] == Judgment && CheckBoard[j - 2, i + 2] == Judgment && CheckBoard[j - 3, i + 3] == Judgment && CheckBoard[j - 4, i + 4] == Judgment)
                            {
                                return Win = true;
                            }
                        }
                    }`在这里插入代码片`
                }
            }
            return Win;
        }
    }



}
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值