zl程序教程

您现在的位置是:首页 >  后端

当前栏目

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

WCFWCF实例规则 移动 限制 新手 附加
2023-09-11 14:20:03 时间

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

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

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

复制代码 ExpandedBlockStart.gif  ///  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分支一下就完成了

 

复制代码 ExpandedBlockStart.gif 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。。-_-...上半盘和下半盘本来就是这个样的。

复制代码 ExpandedBlockStart.gif  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;
复制代码 ExpandedBlockStart.gif  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;
复制代码 ExpandedBlockStart.gif 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;