之前写了一个联网五子棋,棋格使用的是pictureBox,棋子是在棋格中间的,而且很多picturebox感觉效率不高,今天换了一个方法。使用了GDI+绘图,画了棋子和棋格。
这个绘图的难点在于棋子,在一个棋盘交叉点的周围点击时,要保证棋子绘制在正确的交叉点上。
pictureBox实现棋格的博客:http://www.cnblogs.com/fmnisme/archive/2011/06/08/2074750.html
GDI+实现五子棋的源代码地址,vs2008:https://files.cnblogs.com/fmnisme/%E4%BA%94%E5%AD%90%E6%A3%8B3_drawing.rar
下面介绍实现方法。
首先是棋格:
//重绘棋格函数。
public void DrawCheckerboar()
{
int checkerNum = 15; //棋盘的线条数。
int initBase = 10; //画棋盘的初始位置。
int checkPoint = 0; //用于画线条的位置,每画一个线条,加chessLength的长度。
int chessLength = 30; //棋格的长度
Graphics gp = this.CreateGraphics(); //this.CreateGraphics()方法要在窗体显示出来后才能使用。
//想在窗口初始化时就绘图,参见:http://www.cnblogs.com/long-gengyun/archive/2010/04/01/1702578.html?login=1
SolidBrush sbh = new SolidBrush(Color.DarkOrange);
//绘制线条长度时,长度是要绘制的线条数-1,所以要checkerNum-1,这里小心点。
Rectangle rec = new Rectangle(initBase, initBase, chessLength * (checkerNum - 1), chessLength * (checkerNum - 1));
gp.FillRectangle(sbh, rec); //画一个矩形,填充颜色。
Pen p = new Pen(Color.Black, 2); //创建画笔
//下面循环画了横条,竖条,组成棋盘。
for (int x = 0; x < checkerNum; x++)
{
gp.DrawLine(p, checkPoint + initBase, initBase, checkPoint + initBase, chessLength * (checkerNum-1) + initBase); //竖线
gp.DrawLine(p, initBase, checkPoint + initBase, initBase + chessLength * (checkerNum - 1), initBase + checkPoint);
checkPoint += chessLength;
}
}
落子的实现:
首先要添加鼠标点击事件处理
this.Click += new EventHandler(MouseClick);
处理鼠标点击的MouseClick()函数,这个在源代码中有,我在此介绍下思路。
首先简化一下,假设只有一条x轴,该轴上每个30px就有一个点,要求点击该x轴时,在距离鼠标点击处最近的点上画一个实心圆。可以这样实现:
假设鼠标点击的位置为:mouseX=32。
取整:int xm=(int)mouseX/30;取余:int xn=mouseX%30;
这里余数xn为2,我们,将2舍去,这时就得到绘图的点:_x=xm*30.只要在该点上绘制一个圆就行了。
假如mouseX=55。55/30的余数是25,25更接近30所以将最接近mouseX的点就是:_x=(xm+1)*30.
x轴时这样的,y轴也同理,组合起来就是最接近鼠标点击处的棋盘交叉点了。