zoukankan      html  css  js  c++  java
  • 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 新手实例 象棋 棋子移动-规则补充(三十七)

    版权声明:本文原创发表于 博客园,作者为 路过秋天 本文欢迎转载,但未经作者同意必须保留此段声明,且在文章页面明显位置给出原文连接,否则视为侵权。
    个人微信公众号
    创业QQ群:617713515
    Donation(扫码支持作者):支付宝:
    Donation(扫码支持作者):微信:
  • 相关阅读:
    Equal Cut
    【线段树】Interval GCD
    zookeeper错误
    HBase之过滤器
    Hbase之缓存扫描加快读取速度
    Hbase之遍历超时处理
    Hbase之遍历获取数据
    Hbase之使用回调函数进行批处理操作
    Hbase之进行批处理操作
    Hbase之原子性更新数据
  • 原文地址:https://www.cnblogs.com/cyq1162/p/1774734.html
Copyright © 2011-2022 走看看