基于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();
}
}
三、关键优化点
-
抗锯齿处理
使用
SmoothingMode.AntiAlias和LinearGradientBrush实现棋子边缘平滑 -
点击区域优化
通过
PixelToGrid方法实现点击区域容错(±5像素内自动吸附到网格中心) -
状态管理
使用独立类管理棋盘状态,分离绘制逻辑与业务逻辑
-
界面响应
通过
PictureBox.Invalidate()触发重绘,避免界面卡顿
四、扩展功能建议
-
AI对战
添加Minimax算法实现初级AI,参考中的博弈树实现
-
网络对战
使用Socket实现局域网联机功能
-
棋谱保存
将棋盘状态序列化保存为XML文件
-
音效反馈
添加落子音效和胜利提示音
参考代码 c#休闲五子棋 www.youwenfan.com/contentcnr/93649.html
五、项目部署
- 使用Visual Studio 2022创建Windows Forms项目
- 添加上述代码文件及资源文件
- 设置PictureBox的Dock属性为Fill
- 设置按钮事件绑定(如
btnRestart_Click)