天天看点

Silverlight+WCF 实战-网络象棋最终篇之十字轨迹(一)

前言

Silverlight+WCF 实战-网络象棋最终篇之十字轨迹(一)
Silverlight+WCF 实战-网络象棋最终篇之十字轨迹(一)
Silverlight+WCF 实战-网络象棋最终篇之十字轨迹(一)

乱七杂八说两句:

一个多月没碰vs2010了,今天回头看原来的象棋系列代码,感觉到有点陌生了,

好多原来的思路,都忘的差不多了,要续写这系列文章,感觉还得像个新手一样重温下代码才行呢。

本系列为进阶优化系列,会在原来的基础上,慢慢改动很多代码的哦,欢迎持续关注!

正文:

Silverlight+WCF 实战-网络象棋最终篇之十字轨迹(一)

ok,从这图片我知道双方是在下棋了,可是我们并不知道现在该谁下了?

当然了,认真看一下棋谱,还是知道刚刚是黑方下了一步,不过还是要很用力的猜车一平二是怎么个平法。

十字轨迹的出现,解决了这个问题,如果到qq平台下过棋,也见过的,就是那个棋子周围加上的一个边框了,那这个为啥叫十字轨迹?这个这个...

好!大伙知道十字轨迹是什么就好了,现在说说实现思路

大伙想啊,十字轨迹是在棋步移动之后,在棋盘上就有两个出现了,一个在移动的棋子的原来位置,一个在移动后的位置,而且整个棋盘就只能有两个,于是,我们的思路定位就很简单了。

一:在棋盘上先创建好两个十字轨迹,默认隐藏

二:在棋手移动完棋子之后,把两个十字轨迹移动到相应的位置

就这么两步,很简单吧,该出手时就出手。

实现步骤如下:

一:棋盘board类画十字轨迹

1:增加两个十字轨迹属性

Silverlight+WCF 实战-网络象棋最终篇之十字轨迹(一)
Silverlight+WCF 实战-网络象棋最终篇之十字轨迹(一)

   /// <summary>

    /// 棋盘 by 路过秋天

    /// http://cyq1162.cnblogs.com

    /// </summary>

    public class board

    {

        /// <summary>

        /// 十字轨迹框

        /// </summary>

        public canvas trackfrom

        {

            get;

            set;

        }

        public canvas trackto

        //下面省略n多代码

     }

Silverlight+WCF 实战-网络象棋最终篇之十字轨迹(一)

2:增加一函数,用于画十字轨迹

Silverlight+WCF 实战-网络象棋最终篇之十字轨迹(一)
Silverlight+WCF 实战-网络象棋最终篇之十字轨迹(一)

        private void drawtrack(panel panel)

            double width = panel.width - 8;

            //横线4条

            drawline(0, 0, width / 4, 0, 3, panel, false);//l-

            drawline(0, width, width / 4, width, 3, panel, false);//lb-

            drawline(width * 3 / 4, 0, width, 0, 3, panel, false);//r-

            drawline(width * 3 / 4, width, width, width, 3, panel, false);//rb-

            //直线四条

            drawline(0, 0, 0, width / 4, 3, panel, false);//l| ok

            drawline(width, 0, width, width / 4, 3, panel, false);//r| ok

            drawline(0, width, 0, width * 3 / 4, 3, panel, false);//lb|

            drawline(width, width * 3 / 4, width, width, 3, panel, false);//rb|

Silverlight+WCF 实战-网络象棋最终篇之十字轨迹(一)

说明:

画这么个框,记得以前还真费了不少劲,在那调坐标和宽度;

注意哦,drawline方法变成5个参数了,以前只有四个的。

3:drawline方法小调整

Silverlight+WCF 实战-网络象棋最终篇之十字轨迹(一)
Silverlight+WCF 实战-网络象棋最终篇之十字轨迹(一)

        private void drawline(double x1, double y1, double x2, double y2)//保留原有方法原型,不用改其它画线代码

            drawline(x1, y1, x2, y2, 1, container, true);

        private void drawline(double x1, double y1, double x2, double y2, int thick, panel panel, bool auto)

            double tempgap = ((x1 + y1) > 19 || !auto) ? 1 : gap;//就这行加了一个!auto,其它没变过

            line line = new line()

            {

                x1 = x1 * tempgap + marginleft,

                y1 = y1 * tempgap + margintop,

                x2 = x2 * tempgap + marginleft,

                y2 = y2 * tempgap + margintop,

                stroke = new solidcolorbrush(colors.black),

                strokethickness = thick

            };

            panel.children.add(line);

Silverlight+WCF 实战-网络象棋最终篇之十字轨迹(一)

增加一个auto是干虾米用的呢?这是因为在画十字轨迹时,我们传进的是实际像素值,然而又可能出现x1+y1<19的情况,为了保证它是按像素计算,所以...你懂的!

还有,为啥是19,其实应该是17[数一下横线+直线有多少条,索引从0开始],这个问题在以前就说过了,这里不多解释了,保留19也没错。

4:初始化画棋盘时,把十字轨迹也画上

Silverlight+WCF 实战-网络象棋最终篇之十字轨迹(一)
Silverlight+WCF 实战-网络象棋最终篇之十字轨迹(一)

        private void draw()

            //省略画棋盘线代码

            #region 画棋步轨迹

            //创建两个十字修饰框

            trackfrom = new canvas()

                width = gap,

                height = gap,

                margin = new thickness(-marginleft * 12, -marginleft * 12, 0, 0)

            trackto = new canvas()

            drawtrack(trackfrom);

            drawtrack(trackto);

            container.children.add(trackfrom);

            container.children.add(trackto);

            #endregion

            #region 画楚河汉界

              drawfont("路过秋天");

Silverlight+WCF 实战-网络象棋最终篇之十字轨迹(一)

二:chess象棋类增加设置十字焦点方法

1:增加设置十字焦点方法

Silverlight+WCF 实战-网络象棋最终篇之十字轨迹(一)
Silverlight+WCF 实战-网络象棋最终篇之十字轨迹(一)

        /// 设置轨迹十字框

        public void setfocus(point from, point to)

            from = switchpixelarray(from);

            to = switchpixelarray(to);

            double offset = board.trackfrom.width / 2 - board.marginleft * 11 - 4;//要减去默认初始位置,默认是*-12

            canvas.setleft(board.trackfrom, from.x - offset);

            canvas.settop(board.trackfrom, from.y - offset);

            canvas.setleft(board.trackto, to.x - offset);

            canvas.settop(board.trackto, to.y - offset);

Silverlight+WCF 实战-网络象棋最终篇之十字轨迹(一)

在移动棋步的时候,我们调用一下这个方法,把两个轨迹移动到相应的位置就ok了,

重点是:移动时,要减去原来的默认初始的位置,这个调整起来很麻烦。

三:chessaction棋子动作类

1:棋手移动时调用设置十字轨迹焦点函数

Silverlight+WCF 实战-网络象棋最终篇之十字轨迹(一)
Silverlight+WCF 实战-网络象棋最终篇之十字轨迹(一)

        /// 移动棋子

        /// <param name="chessman">棋子</param>

        /// <param name="tox">移动到x坐标</param>

        /// <param name="toy">移动到y坐标</param>

        public bool moveto(chessman chessman, point moveto)

            if (rule.iscanmove(chessman, moveto))

                chessman.readymove = false;

                chessman.chessman.background = null;

                playmove(chessman, moveto);

                parent.setfocus(chessman.movepoint, moveto);//就这一行代码增加

                helpmovestepevent(chessman, moveto);

                chessman.movepoint = moveto;

                return true;

            }

            return false;

Silverlight+WCF 实战-网络象棋最终篇之十字轨迹(一)

2:对方棋手下棋手,系统会自动移动棋子,也要自动设置十字轨迹焦点

Silverlight+WCF 实战-网络象棋最终篇之十字轨迹(一)
Silverlight+WCF 实战-网络象棋最终篇之十字轨迹(一)

       /// <summary>

        /// 系统自动移动棋子

        public void automoveto(point from, point to)

            chessman chessman = parent.findchessman(from);

            chessman eatchessman = parent.findchessman(to);

            if (chessman != null)

                playmove(chessman, to);

                parent.setfocus(from, to);//就这一行代码增加

                chessman.movepoint = to;

                if (eatchessman != null)

                {

                    setisgameend(eatchessman);

                    eatchessman.gotodead();

                }

Silverlight+WCF 实战-网络象棋最终篇之十字轨迹(一)

四:f5看运行结果

1:运行后直接上图了

Silverlight+WCF 实战-网络象棋最终篇之十字轨迹(一)

ok,大伙看到效果了吧!

版权声明:本文原创发表于博客园,作者为路过秋天,原文链接:

http://www.cnblogs.com/cyq1162/archive/2010/10/11/1847625.html