曾经自学C#做计算机图形学的作业,GDI+画图确实好用,目前在找.NET的实习,尝试做了一个最基本的五子棋,复习一下C#的基本语法,目前只能当跟基友一起玩的单机小游戏,之后再加入AI和联网对战功能。目前我还是小菜鸟,过程设计和代码有不合理或者能优化的地方欢迎各位大神指正。
首先是界面设计,最后就是这样,控件一共有一个PictureBox;一个开始Button,命名为btnStart;一个重置Button,命名为btnReset;一个Label,用于显示游戏状态。
五子棋界面

然后是各基本类。新建一个MainSize类用于存放界面上的可能用到的参数,主框体大小520*460,棋盘是一个PictureBox控件,大小401*401,棋盘20行20列,每个格子边长20,棋子直径16。新建一个ChessBoard类表示棋盘,有一个静态函数DrawBoard。之前做计算机图形学作业画函数时用到的画坐标系方法在这里同样适用,函数代码如下。
class ChessBoard
{
static readonly Color color = Color.Black;
static readonly float penWid = 1.0f;
static readonly Pen pen = new Pen(color, penWid);
public static void DrawCB(Graphics gra,PictureBox pic)
{
//每排数量
int horC = MainSize.CBWid / MainSize.CBGap;
//间隔
int gap = MainSize.CBGap;
Image img = new Bitmap(MainSize.CBWid, MainSize.CBHei);
gra = Graphics.FromImage(img);
gra.Clear(Color.White);
gra.DrawRectangle(pen, 0, 0, MainSize.CBWid, MainSize.CBHei);
//画棋盘
for (int i = 0; i < horC; i++)
{
gra.DrawLine(pen, 0, i * gap, MainSize.CBWid, i * gap);
gra.DrawLine(pen, i * gap, 0, i * gap, MainSize.CBHei);
}
gra.DrawLine(pen, 0, horC * gap, MainSize.CBWid, horC * gap - 1);
gra.DrawLine(pen, horC * gap - 1, 0, horC * gap, MainSize.CBHei);
pic.Image = img;
}
}
还有一个基本类Chess,用来表示棋子,有一个静态函数DrawChess,代码如下。这里代码有点乱,写的时候没加注释。bool型变量用于表示下棋的双方,pen1和pen2用于绘制双方的棋子,颜色设置为红蓝,因为自古红蓝出CP【其实是本来想用黑白的但picturebox背景白色再画白色棋子就看不出来】。整型变量nexX和newY用于表示棋子在棋盘上的坐标,根据四舍五入就近原则落点。这里的四舍五入我花了很长时间,写了很长的一段判断代码但都会出错,最后借鉴了github上Xu Pu同学的数据结构假期作业中的方法才完成了这个函数,在此感谢这位同学~
class Chess
{
public static void DrawChess(bool type,PictureBox pic,Graphics graphic,MouseEventArgs e)
{
graphic = pic.CreateGraphics();
Pen pen1 = new Pen(Color.Red, 1);
Brush bru1 = new SolidBrush(Color.Red);
Pen pen2 = new Pen(Color.Blue, 1);
Brush bru2 = new SolidBrush(Color.Blue);
int newX = (int)((e.X + MainSize.CBGap / 2) / MainSize.CBGap) * MainSize.CBGap - MainSize.ChessRadious / 2;
int newY = (int)((e.Y + MainSize.CBGap / 2) / MainSize.CBGap) * MainSize.CBGap - MainSize.ChessRadious / 2;
if (type)
{
graphic.DrawEllipse(pen1, newX, newY, MainSize.ChessRadious, MainSize.ChessRadious);
graphic.FillEllipse(bru1, newX, newY, MainSize.ChessRadious, MainSize.ChessRadious);
}
if (!type)
{
graphic.DrawEllipse(pen2, newX, newY, MainSize.ChessRadious, MainSize.ChessRadious);
graphic.FillEllipse(bru2, newX, newY, MainSize.ChessRadious, MainSize.ChessRadious);
}
graphic.Dispose();
}
}










