说明:这是我在vs2008测试画围棋盘和棋子的c#代码,棋盘可以自适应窗口的高度变化,自适应窗口宽度变化的代码没有写。
测试时,先画了黑棋子和棋子数字序号的居中显示。后来加了简单的黑白依次下棋的逻辑和判断,运行图和围棋打谱软件的效果一样。
其实,由于没有加入提子逻辑,遇到提子时,显示会不对,死棋还会显示到棋盘上。以后会逐步加上提子,打劫等下棋逻辑,并发布在这里。c#代码和运行截图如下:
//画19路围棋棋盘
float x, y;
int d;
bool yiciFlag,blackFlag,whiteFlag;
int qiziNum;
protected override void OnPaint(PaintEventArgs
e)
{
base.OnPaint(e);
Graphics
g = e.Graphics;
Pen
p = new Pen(Color.Black, 1);
int hy =
this.ClientSize.Height / 20;//自适应高度小于等于宽度的变化
d =
hy;
//int wx =
this.ClientSize.Width / 20;//自适应宽度变化
//画坐19*19棋盘横坐标位字母和纵坐标数字
Font font
= new Font("宋体", d / 3, FontStyle.Bold);
Brush b1 =
new SolidBrush(Color.Black);
StringFormat sf = new StringFormat();
sf2.Alignment = StringAlignment.Near;
int j =
65;//字母A的ASC2码
string s =
"";
for (int i
= 1; i < 20; i++)
{
s =
Convert.ToString(Convert.ToChar(j));//ASC码转换为字符和字符串格式
//画英文字母
g.DrawString(s, font, b1, i *
d, d / 2 - d / 4, sf);
//画数字
g.DrawString(i.ToString(),
font, b1, d / 2, i * d - d / 4, sf);
j++;
}
b1.Dispose();
//画19*19的棋盘线,带边界的间距
for (int i
= 1; i < 20;i++ )
{
g.DrawLine(p, 1*hy, hy*i,
19*hy, hy*i);
g.DrawLine(p, hy * i, 1*hy,
hy * i, 19*hy);
if (i == 4 || i == 10 || i ==
16)//画九颗星位
{
p = new Pen(Color.Black, 2);
if (i == 4)
{
g.DrawEllipse(p, hy * i-1, hy * i-1, 2, 2);
g.DrawEllipse(p, hy * 10-1, hy * i-1, 2, 2);
g.DrawEllipse(p, hy * 16-1, hy * i-1, 2, 2);
}
if (i == 10)
{
g.DrawEllipse(p, hy * 4-1, hy * i-1, 2, 2);
g.DrawEllipse(p, hy * 10-1, hy * i-1, 2, 2);
g.DrawEllipse(p, hy * 16-1, hy * i-1, 2, 2);
}
if (i == 16)
{
g.DrawEllipse(p, hy * 4-1, hy * i-1, 2, 2);
g.DrawEllipse(p, hy * 10-1, hy * i-1, 2, 2);
g.DrawEllipse(p, hy * 16-1, hy * i-1, 2, 2);
}
p.Dispose();
p = new Pen(Color.Black, 1);
}
}
g.Dispose();
p.Dispose();
}
//当棋盘大小变化时,刷新重画
private void Form1_ClientSizeChanged(object
sender, EventArgs e)
{
Graphics
g = this.CreateGraphics();
g.Clear(BackColor);
g.Dispose();
this.Refresh();
}
//点击鼠标时,画棋子和棋子里的数字序号
private void
Form1_MouseClick(object sender, MouseEventArgs e)
{
if
(yiciFlag)//黑白交替落子
{
x = (Convert.ToInt32(e.X) + d
/ 2) / d * d + d / 2;
y = (Convert.ToInt32(e.Y) + d
/ 2) / d * d + d / 2;
Graphics g =
this.CreateGraphics();
Pen p = new Pen(Color.Black,
1);
Brush br;
//黑落子
if (blackFlag)
{
br = new SolidBrush(Color.Black);
//在棋盘范围里点击鼠标,则画棋子,
if (19.5 * d > e.X && e.X > d / 2
&& 19.5 * d > e.Y && e.Y > d / 2)
{
g.FillEllipse(br, x - d, y - d, d - 2, d - 2);//画黑色棋子
Font mf =
new Font("宋体", d / 3, FontStyle.Bold);
Brush b2 =
new SolidBrush(Color.White);
StringFormat strf = new StringFormat();
strf.Alignment = StringAlignment.Center;
//画棋子的数字序号
g.DrawString(qiziNum.ToString(), mf, b2, x - d + d / 2, y - d + d /
3, strf);
b2.Dispose();
}
g.Dispose();
p.Dispose();
br.Dispose();
}
//白落子
if (whiteFlag)
{
br = new SolidBrush(Color.White);
//在棋盘范围里点击鼠标,则画棋子,
if (19.5 * d > e.X && e.X > d / 2
&& 19.5 * d > e.Y && e.Y > d / 2)
{
g.FillEllipse(br, x - d, y - d, d - 2, d - 2);//画白色棋子
Font mf =
new Font("宋体", d / 3, FontStyle.Bold);
Brush b2 =
new SolidBrush(Color.Black);
StringFormat strf = new StringFormat();
strf.Alignment = StringAlignment.Center;
//画棋子的数字序号
g.DrawString(qiziNum.ToString(), mf, b2, x - d + d / 2, y - d + d /
3, strf);
b2.Dispose();
}
g.Dispose();
p.Dispose();
br.Dispose();
}
qiziNum++;//棋子的数字序号
//修改黑白交替落子标志
if (blackFlag)
{ blackFlag = false;
whiteFlag = true; }
else
{ whiteFlag = false;
blackFlag = true; }
}
}
加载中,请稍候......