Silverlight+WCF 新手实例 象棋 棋子移动-规则[附加上半盘限制](十)

上上一节,我们对棋子的下半盘棋子做了所有的规则限制,因为我们下棋的总是用下半盘的棋子来下,总没人用上半盘棋来下那么高境界的吧。

不过这节简单追加点代码,让那些企图高境界的人士可以临时性的自己和自己下。

好了,要为上半盘棋子也做限制,所以我们要知道棋子是归属于上半盘还是下半盘的,这里,我们为棋子类Chessman增加一个属性,IsUp,是否上半盘棋,反之就下半盘了。初始为该属性赋值也相当的简单:


 /// <summary>
        /// 棋子默认在上半盘/反之在下半盘
        /// </summary>
        public bool IsUp
        {
            get;
            set;
        }
        public Chessman(double x, double y, double radius, Color color, string name,Chess parent)
        {
            IsUp = y < 5;//新增加的一行代码
            Parent = parent;
            InitPoint = new Point(x, y);
            MovePoint = InitPoint;
            Radius = radius;
            Color = color;
            Name = name;
        }

 

看,相当相当的简单,在构造函数里一行代码就搞定了。

OK,现在知道棋子是归属于上半盘还是下半盘了,我们来为棋子的规则增加上半盘的限制。

 有一些规则是通用的,像爱日的马,硬车和大炮。因为它们可以全局范围活动。

剩下的我们要为兵、将、士、相四种,附加上在半盘的情况的规则限制。

兵先来:

我们之前的兵规则是针对下盘的棋子,所以我们只要加个if else分支一下就完成了

 


case ChessType.Bing:
                        if (Math.Abs(y2 - y1) + Math.Abs(x2 - x1) != 1)//只能走一步
                        {
                            break;
                        }
                        if (chessman.IsUp)//新增加的
                        {
                            if ((x1 == x2 && y2 > y1) || (y1 == y2 && y1 > 5))
                            {//只能直走  //或者 过了河左右走
                                return true;
                            }
                        }
                        else//原来就有的规则。
                        {
                            if ((x1 == x2 && y1 > y2) || (y1 == y2 && y1 < 5))
                            {//只能直走 或者 过了河左右走
                                return true;
                            }
                        }
                        break;

 

看到没有,代码和原来就有规则相比,只是第二个号的">"大于和"<"小于的区别

兵这样加几行代码就完了。

接下来就是将了:

还是if else 说白了全是 if else。。-_-...上半盘和下半盘本来就是这个样的。


 case ChessType.Jiang:
                        if (Math.Abs(y2 - y1) + Math.Abs(x2 - x1) != 1)//只能走一步
                        {
                            break;
                        }
                        if (chessman.IsUp)
                        {
                            if (2 < x2 && x2 < 6 && y2 < 3)
                            {
                                //上半盘九宫
                                return true;
                            }
                        }
                        else
                        {
                            if (2 < x2 && x2 < 6 && y2 > 6)
                            {
                                //下半盘九宫
                                return true;
                            }
                        }
                        break;

 

自己对着棋盘数一数数字,就有这结论了。。。

接下来是士:


 case ChessType.Shi:
                        if ((Math.Abs(y2 - y1) == 1 && Math.Abs(x2 - x1) == 1))//先判断叉型
                        {
                            if (chessman.IsUp)
                            {
                                if (2 < x2 && x2 < 6 && y2 < 3)
                                {//上九宫内
                                    return true;
                                }
                            }
                            else
                            {
                                if (2 < x2 && x2 < 6 && y2 > 6)
                                {//下九宫内
                                    return true;
                                }
                            }
                            break;
                        }
                        break;

 

最后就是相了:


case ChessType.Xiang:
                        if ((Math.Abs(y2 - y1) == 2 && Math.Abs(x2 - x1) == 2))//先判断走田型
                        {
                            //有没有田脚点,并且不能过河
                            if (!IsExits(new Point((x1 + x2) / 2, (y1 + y2) / 2)))
                            {
                                if ((chessman.IsUp) && y2 < 6 || (!chessman.IsUp && y2 > 4))
                                {
                                    return true;
                                }
                            }
                        }
                        break;

 

只有最后一个if有点变化。

好了,最好运行一下F5。看下效果图:

OK,至此,棋子上下盘都按规则走了,高境界的人群自己可以动手走两边了。。。

打完收工!

作者博客:http://cyq1162.cnblogs.com/

 

对于规则补充,请看:Silverlight+WCF 新手实例 象棋 棋子移动-规则补充(三十七)

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

http://www.cnblogs.com/cyq1162/archive/2010/07/10/1774734.html

时间: 2024-09-14 14:27:34

Silverlight+WCF 新手实例 象棋 棋子移动-规则[附加上半盘限制](十)的相关文章

Silverlight+WCF 新手实例 象棋 棋子移动-规则补充(三十七)

在线演示地址:Silverlight+WCF 新手实例 象棋 在线演示   在Silverlight+WCF 新手实例 象棋 棋子移动-规则[附加上半盘限制](十)中,由Silenus-G提出规则还有点bug: 红车竟然可以走到红马的地盘:这是由于鼠标点在棋子之外的地方时,我们产生的是棋子移动[不是吃子],而在移动之时,我们又没有判断要移动到的位置上是不是有其它棋子从而引发了经济纠纷.因此,解决这个问题,我们只需在点击事件里增加一下判断棋子存不存在就可以了. 而在移动的规则里,这节我们同时进行补

Silverlight+WCF 新手实例 象棋 棋子移动-规则[兵、车](七)

上两节实现了棋子的两种走法,吃子和没移动到线交叉点.不过我们都是没有规则的走,这节为棋子的走法增加规则,棋的规则我就不多说了,基本要找个不会下象棋的很难,就是找到的估计也不会看这文章.   当我们移动棋子的时候,总是要判断一下移动是不是合规则的,合规则的才让下,不合规则的就不能下了,什么马象田马日车炮跑,将军卫士陷九宫,[本人涅造句子]之类的. 好了,原始冲动,新建棋子规则类,也是本棋子裤的最后一个类了: 对着项目内裤右键->添加类->输入:ChessRule.cs. /// <summ

Silverlight+WCF 新手实例 象棋 棋子移动-规则[将、马、士、相、炮](八)

这节来完成剩下五个种子的规则. 先来将吧 将:只能走一步,而且只能在九宫内行走 看代码,还是和兵的一个样. if (Math.Abs(y2 - y1) + Math.Abs(x2 - x1) != 1)//只能走一步                        {                             break;                         }   下面限制九宫内判断: if (2 < x2 && x2 < 6 && y

Silverlight+WCF 新手实例 象棋 主界面-棋谱-布局写谱(三十六)

在线演示地址:Silverlight+WCF 新手实例 象棋 在线演示   这节,我们要实现棋谱列界面布局和棋谱的获取,先上一张久远的图片: 看清楚了,到本节为止,除了第三区棋谱区,其它的区域我们都已完成了,所以,我们抓紧时间,赶紧吧:   好了,先布局,和以往一样:   1:界面拖一个Border到Index.xaml,到第三区的位置,设置好宽和高[212*602]: <UserControl ...省略...   d:DesignHeight="620" d:DesignWi

Silverlight+WCF 新手实例 象棋 主界面-事件区-求和认输(三十二)

在线演示地址:Silverlight+WCF 新手实例 象棋 在线演示   事隔几篇,我们又回到事件区,继续其它两个按钮事件,来张图吧: 在Silverlight+WCF 新手实例 象棋 主界面-事件区-游戏开始(二十七) 和之后的几篇,我们实现了游戏开始, 在这篇之前,基本上双方已可以对战了,看似主体功能已完成.只是,大伙都知道,细节的东西,才是花时间的,漫长的路还在后面....... 如标题所示,这节实现"求和+认输"两个事件.   每次开始,我们都习惯的先写WCF服务端代码,再回

Silverlight+WCF 新手实例 象棋 棋子定位与象棋类(四)

上节创建显示了一颗棋子,由于没有margin属性,所以只能靠边站. 现在,我们创建一个象棋类,让它包括棋盘和棋子,同时附加几个常用函数. 还是对着Silverlight类库项目右键添加类:Chess.cs /// <summary>     /// 象棋 by 路过秋天     /// </summary>    public class Chess     {     }   既然要包括象棋当然是要包括棋盘和棋子了,于是我们为之加两个属性,棋子有很多颗,所以用List列表.  /

Silverlight+WCF 新手实例 象棋 棋子移动-线交叉点(六)

上一节,我们给棋子赋于了鼠标点击事件,并通过故事板Storyboard 来移动棋子,同时实现了吃棋子. 现在我们在实现鼠标在棋盘上点击,然后棋子就移动到那去. 好了,鼠标在棋盘上点击,这里要为点击的棋盘,其实就是最外面那个Panel容器啦,还是加上一个MouseLeftButtonDown事件. 我们回到Chess类,因为这里是第一手Canvas传进来的地方,我们在Chess的构造函数里,为Panel添加这一事件    public Chess(Panel control)         {

Silverlight+WCF 新手实例 象棋 棋子(三)

棋盘上有棋子,棋子应该还有一些属性,按原始冲动新建一个棋子类. 上google翻译下棋子E文叫什么,查到了叫Chessman,于是对着项目右键添加一个Chessman.cs    /// <summary>     /// 棋子类 by 路过秋天     ///http://cyq1162.cnblogs.com/     /// </summary>    public class Chessman     {     }     乱七八糟: 想了想,要画棋子还是找图片好,图片也

Silverlight+WCF 新手实例 象棋 棋子移动-吃子(五)

上一节,我们的棋子就是一个Canvas,里面add进了一个Ellipse圆圈和TextBlock字 想想我们是怎么下棋的,要先选中棋子吧,选中后,随便找个地方点,棋就会自动移过去. 所以,这里就产生了两件事,一是选中,二是移动. 要选中,其实就是选中棋子,选中棋子就是选中Canvas了. 于是,我们为Canvas增加一个鼠标点击事件. 让我们回到棋子类Chessman的Draw方法里,为chessman添加一个MouseLeftButtonDown事件,于是代码变成了    private vo