加载中…
个人资料
  • 博客等级:
  • 博客积分:
  • 博客访问:
  • 关注人气:
  • 获赠金笔:0支
  • 赠出金笔:0支
  • 荣誉徽章:
正文 字体大小:

c#画19路围棋盘、黑白棋子和数字序号

(2016-12-23 09:00:28)
标签:

c编程

围棋编程

画棋盘

长安南山围棋教室

长安围棋

说明:这是我在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; }
            }
        }



0

阅读 收藏 喜欢 打印举报/Report
  

新浪BLOG意见反馈留言板 欢迎批评指正

新浪简介 | About Sina | 广告服务 | 联系我们 | 招聘信息 | 网站律师 | SINA English | 产品答疑

新浪公司 版权所有