基于C# WinForm的休闲五子棋游戏实现

基于C# WinForm的休闲五子棋游戏实现


一、项目结构设计

GobangGame/
├── MainSize.cs          // 全局常量类
├── ChessBoard.cs        // 棋盘绘制类
├── Chess.cs             // 棋子绘制类
├── MainForm.cs          // 主窗体逻辑
└── Resources/           // 资源文件(棋盘背景图、棋子贴图)

二、核心代码实现

1. 全局常量配置(MainSize.cs)

public static class MainSize
{
    public const int FormWidth = 800;   // 窗体宽度
    public const int FormHeight = 600;  // 窗体高度
    public const int BoardSize = 15;    // 棋盘网格数(15x15)
    public const int GridWidth = 40;    // 每个格子宽度
    public const int ChessSize = 35;    // 棋子直径
}

2. 棋盘绘制(ChessBoard.cs)

public static class ChessBoard
{
    private static readonly Pen gridPen = new Pen(Color.FromArgb(50,50,50), 1);
    
    public static void DrawBoard(Graphics g, PictureBox pb)
    {
        int width = MainSize.BoardSize * MainSize.GridWidth;
        Bitmap buffer = new Bitmap(width, width);
        
        using (Graphics bufferG = Graphics.FromImage(buffer))
        {
            bufferG.Clear(Color.White);
            
            // 绘制棋盘网格
            for (int i = 0; i <= MainSize.BoardSize; i++)
            {
                // 横线
                bufferG.DrawLine(gridPen, 
                    new Point(0, i * MainSize.GridWidth),
                    new Point(width, i * MainSize.GridWidth));
                
                // 竖线
                bufferG.DrawLine(gridPen,
                    new Point(i * MainSize.GridWidth, 0),
                    new Point(i * MainSize.GridWidth, width));
            }
        }
        
        pb.Image = buffer;
    }
}

3. 棋子绘制(Chess.cs)

public static class Chess
{
    public static void DrawPiece(Graphics g, Point pos, bool isRed)
    {
        int x = pos.X * MainSize.GridWidth + MainSize.ChessSize/2;
        int y = pos.Y * MainSize.GridWidth + MainSize.ChessSize/2;
        
        using (GraphicsPath path = new GraphicsPath())
        {
            path.AddEllipse(x - MainSize.ChessSize/2, 
                           y - MainSize.ChessSize/2,
                           MainSize.ChessSize, 
                           MainSize.ChessSize);
            
            LinearGradientBrush brush = new LinearGradientBrush(
                new Point(x - 5, y - 5), 
                new Point(x + 5, y + 5),
                isRed ? Color.FromArgb(255,100,100) : Color.FromArgb(100,100,255),
                Color.FromArgb(50,50,50));
            
            g.SmoothingMode = SmoothingMode.AntiAlias;
            g.FillPath(brush, path);
        }
    }
}

4. 主窗体逻辑(MainForm.cs)

public partial class MainForm : Form
{
    private int[,] boardState = new int[MainSize.BoardSize+1, MainSize.BoardSize+1]; // 0空 1红 -1黑
    private bool isRedTurn = true;
    private int round = 0;
    private bool gameOver = false;

    public MainForm()
    {
        InitializeComponent();
        InitializeGame();
    }

    private void InitializeGame()
    {
        lblStatus.Text = "红方先手";
        btnRestart.Enabled = false;
        chessBoardPB.Invalidate(); // 触发重绘
    }

    private void chessBoardPB_MouseClick(object sender, MouseEventArgs e)
    {
        if (gameOver) return;

        Point gridPos = PixelToGrid(e.Location);
        
        if (gridPos.X < 0 || gridPos.Y < 0 || 
            gridPos.X >= MainSize.BoardSize || gridPos.Y >= MainSize.BoardSize)
            return;

        if (boardState[gridPos.X, gridPos.Y] != 0)
            return;

        // 绘制棋子
        Chess.DrawPiece(chessBoardPB.CreateGraphics(), gridPos, isRedTurn);
        boardState[gridPos.X, gridPos.Y] = isRedTurn ? 1 : -1;

        // 胜负判定
        if (CheckWin(gridPos))
        {
            string winner = isRedTurn ? "红方" : "黑方";
            MessageBox.Show($"{winner}胜利!", "游戏结束");
            gameOver = true;
            btnRestart.Enabled = true;
            return;
        }

        // 检查平局
        if (++round == MainSize.BoardSize * MainSize.BoardSize)
        {
            MessageBox.Show("平局!", "游戏结束");
            gameOver = true;
            btnRestart.Enabled = true;
            return;
        }

        isRedTurn = !isRedTurn;
        lblStatus.Text = isRedTurn ? "红方回合" : "黑方回合";
    }

    private Point PixelToGrid(Point pixel)
    {
        int x = (pixel.X / MainSize.GridWidth) * MainSize.GridWidth;
        int y = (pixel.Y / MainSize.GridWidth) * MainSize.GridWidth;
        return new Point(x / MainSize.GridWidth, y / MainSize.GridWidth);
    }

    private bool CheckWin(Point pos)
    {
        // 检查四个方向
        return CheckDirection(pos, 1,0) ||  // 横向
               CheckDirection(pos, 0,1) ||  // 纵向
               CheckDirection(pos, 1,1) ||  // 正斜
               CheckDirection(pos, 1,-1);   // 反斜
    }

    private bool CheckDirection(Point pos, int dx, int dy)
    {
        int count = 1;
        for(int i=1; i<=4; i++)
        {
            int x = pos.X + i*dx;
            int y = pos.Y + i*dy;
            if(x >=0 && x < MainSize.BoardSize && y >=0 && y < MainSize.BoardSize &&
               boardState[x,y] == boardState[pos.X,pos.Y])
                count++;
            else break;
        }
        for(int i=1; i<=4; i++)
        {
            int x = pos.X - i*dx;
            int y = pos.Y - i*dy;
            if(x >=0 && x < MainSize.BoardSize && y >=0 && y < MainSize.BoardSize &&
               boardState[x,y] == boardState[pos.X,pos.Y])
                count++;
            else break;
        }
        return count >=5;
    }

    private void btnRestart_Click(object sender, EventArgs e)
    {
        InitializeGame();
        chessBoardPB.Invalidate();
    }
}

三、关键优化点

  1. 抗锯齿处理

    使用SmoothingMode.AntiAliasLinearGradientBrush实现棋子边缘平滑

  2. 点击区域优化

    通过PixelToGrid方法实现点击区域容错(±5像素内自动吸附到网格中心)

  3. 状态管理

    使用独立类管理棋盘状态,分离绘制逻辑与业务逻辑

  4. 界面响应

    通过PictureBox.Invalidate()触发重绘,避免界面卡顿


四、扩展功能建议

  1. AI对战

    添加Minimax算法实现初级AI,参考中的博弈树实现

  2. 网络对战

    使用Socket实现局域网联机功能

  3. 棋谱保存

    将棋盘状态序列化保存为XML文件

  4. 音效反馈

    添加落子音效和胜利提示音

参考代码 c#休闲五子棋 www.youwenfan.com/contentcnr/93649.html

五、项目部署

  1. 使用Visual Studio 2022创建Windows Forms项目
  2. 添加上述代码文件及资源文件
  3. 设置PictureBox的Dock属性为Fill
  4. 设置按钮事件绑定(如btnRestart_Click

 

专注于matlab/simulink,电子电路,编程