这节来完成剩下五个种子的规则。

先来将吧

将:只能走一步,而且只能在九宫内行走

看代码,还是和兵的一个样。

if  (Math.Abs(y2  -  y1)  +  Math.Abs(x2  -  x1)  !=   1 ) // 只能走一步
                        {
                             break ;
                        }

下面限制九宫内判断:

if  ( 2   <  x2  &&  x2  <   6   &&  y2  >   6 )
                            {
                                 return   true ;
                            }

完了,将的验证太简单了,句合起来就是:

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

下面说马,爱日的马。

马:有两种走法,一种竖着日,一种横着日,如果没有顶心顶肺马脚就日过去了。

先说竖着日,y方向走跨两步,x方向跨一步,是不是很简单:

if  ((Math.Abs(y2  -  y1)  ==   2   &&  Math.Abs(x2  -  x1)  ==   1 )) // 先判断走竖日型
{
// 再判断有没有马脚。
}

那马脚咋判断?我们只要判断马脚上存不存在棋子就可以了,至于马脚点的坐标,

其实就是:(x1 + x2) / 2, y1,y不变,x方向和移动点之间的点。

要判断棋子存不存在呢,我们要加多个函数来判断了。

  ///   <summary>
         ///  是否存在指定的点
         ///   </summary>
         public   bool  IsExits(Point point)
        {//待实现
            return true;
        }

好了,现在我们在马日里实现马脚判断就行了:

if  ((Math.Abs(y2  -  y1)  ==   2   &&  Math.Abs(x2  -  x1)  ==   1 )) // 先判断走竖日型
                        {
                             // 有没有马脚点
                             if  ( ! IsExits( new  Point(x1, (y1  +  y2)  /   2 )))
                            {
                                 return   true ;
                            }
                        }

这样就完成竖着日,横着日嘛,也很简单了,y方向一步,x方向两步:

代码

if  ((Math.Abs(y2  -  y1)  ==   1   &&  Math.Abs(x2  -  x1)  ==   2 )) // 先判断走横日型
                        {
                             // 有没有马脚点
                             if  ( ! IsExits( new  Point((x1  +  x2)  /   2 , y1)))
                            {
                                 return   true ;
                            }
                        }

两个合起来嘛,完整代码就是:

case  ChessType.Ma:
                         if  ((Math.Abs(y2  -  y1)  ==   2   &&  Math.Abs(x2  -  x1)  ==   1 )) // 先判断走竖日型
                        {
                             // 有没有马脚点
                             if  ( ! IsExits( new  Point(x1, (y1  +  y2)  /   2 )))
                            {
                                 return   true ;
                            }
                        }
                         else   if  ((Math.Abs(y2  -  y1)  ==   1   &&  Math.Abs(x2  -  x1)  ==   2 )) // 先判断走横日型
                        {
                             // 有没有马脚点
                             if  ( ! IsExits( new  Point((x1  +  x2)  /   2 , y1)))
                            {
                                 return   true ;
                            }
                        }
                         break ;

下面说说士啦[上面那个点的判断后面再实现,其实就是一个循环棋子找点]

士:九宫内走半日。

  case  ChessType.Shi:
                         if  ( 2   <  x2  &&  x2  <   6   &&  y2  >   6 )
                        {
                             // 九宫内走
                             if  ((Math.Abs(y2  -  y1)  ==   1   &&  Math.Abs(x2  -  x1)  ==   1 )) //半日
                            {
                                 return   true ;
                            }
                        }
                         break ;

完了,两个if搞定了。

下面说说相:

相:走两日合成田,不能有马脚,还不能过河。

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  (y2  >   4 ) // 不过河
                                {
                                     return   true ;
                                }
                            }
                        }
                         break ;

三步判断搞定。

下面最后一个就是炮了:

炮:能和车一样直来直往。还能隔空打炮,不过只能隔一炮打一炮,即隔着炮的时候必须有炮给打,要是没东西打就不能过去。

1。好,先调用和车一样的障碍物函数:

OutCount(chessman.MovePoint, moveTo, out xCount, out yCount);

2。判断是不是目标地点有“炮可打”

bool exits = IsExits(moveTo);

3。最后进行判断,看下面那句说明:

if (x1 == x2 && (yCount == 0 && !exits) || (yCount == 1 && exits)
                         || y1 == y2 && (xCount == 0 && !exits) || (xCount == 1 && exits))
                        {//坚走/横走没有最多一个障碍别
                            return true;
                        }

合起来就是:

  case  ChessType.Pao:
                        OutCount(chessman.MovePoint, moveTo,  out  xCount,  out  yCount);
                         bool  exits  =  IsExits(moveTo);

if  (x1  ==  x2  &&  (yCount  ==     &&   ! exits)  ||  (yCount  ==   1   &&  exits)
                          ||  y1  ==  y2  &&  (xCount  ==     &&   ! exits)  ||  (xCount  ==   1   &&  exits))
                        { // 坚走/横走没有最多一个障碍别
                             return   true ;
                        }
                         break ;

OK,至此,所以规则都做完了,oh,还有一个判断马脚田脚和猪脚的函数没实现,现在来实现一下:

由于根据一个点找一颗棋子,这函数是在以后会用到,所以,我们在Chess类里先实现一个函数来返回一颗棋子:

///   <summary>
         ///  找棋子
         ///   </summary>
         public  Chessman FindChessman(Point point)
        {
             for  ( int  i  =   ; i  <  ChessmanList.Count; i ++ )
            {
                 if  (point  ==  ChessmanList[i].MovePoint)
                {
                     return  ChessmanList[i];
                }
            }
             return   null ;
        }

接下我们那个IsExits函数就相当的简单了:

///   <summary>
         ///  是否存在指定的点
         ///   </summary>
         public   bool  IsExits(Point point)
        {
             return  Action.Parent.FindChessman(point)  !=   null ;
        }

终于,该做的都做完了,我们对下半盘棋子都做了规则限制了。

那我们到现在还没应用呢,应用呢,很简单了,回到动作类里ChessAction里,在MoveTo方法加一个if判断就行了

///   <summary>
         ///  移动棋子
         ///   </summary>
         ///   <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)) // 把规则应用到这里就OK了
            {
                chessman.ReadyMove  =   false ;
                chessman.chessman.Background  =   null ;
                PlayMove(chessman, moveTo);
                chessman.MovePoint  =  moveTo;
                 return   true ;
            }
             return   false ;
        }

OK,运行看下效果:

试了一下,下面的红色棋都正常的按规则走了。

不过上半棋黑色棋,还是个别的是不能按规则走,不过我们下棋都一般只下下面的棋,所以应用的话只对下半盘做限制就行了。

如果需要对上半盘也做限制,另外方式补充了。

好到这一阶段,提供第二阶段源码:点击下载

打完收工!

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

原文链接: http://www.cnblogs.com/cyq1162/archive/2010/07/09/1774401.html

转载于:https://my.oschina.net/chen106106/blog/43494

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

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

    上上一节,我们对棋子的下半盘棋子做了所有的规则限制,因为我们下棋的总是用下半盘的棋子来下,总没人用上半盘棋来下那么高境界的吧. 不过这节简单追加点代码,让那些企图高境界的人士可以临时性的自己和自己下. ...

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

    上两节实现了棋子的两种走法,吃子和没移动到线交叉点.不过我们都是没有规则的走,这节为棋子的走法增加规则,棋的规则我就不多说了,基本要找个不会下象棋的很难,就是找到的估计也不会看这文章. 当我们移动棋子 ...

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

    上一节,我们给棋子赋于了鼠标点击事件,并通过故事板Storyboard 来移动棋子,同时实现了吃棋子. 现在我们在实现鼠标在棋盘上点击,然后棋子就移动到那去. 好了,鼠标在棋盘上点击,这里要为点击的棋 ...

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

    2019独角兽企业重金招聘Python工程师标准>>> 棋盘上有棋子,棋子应该还有一些属性,按原始冲动新建一个棋子类. 上google翻译下棋子E文叫什么,查到了叫Chessman, ...

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

    上节创建显示了一颗棋子,由于没有margin属性,所以只能靠边站. 现在,我们创建一个象棋类,让它包括棋盘和棋子,同时附加几个常用函数. 还是对着Silverlight类库项目右键添加类:Chess. ...

  6. Silverlight+WCF 新手实例 象棋 该谁下棋-B下A停(三十)

    2019独角兽企业重金招聘Python工程师标准>>> 在线演示地址:Silverlight+WCF 新手实例 象棋 在线演示 上上一节,就是二十八节:Silverlight+WCF ...

  7. Silverlight+WCF 新手实例 象棋 主界面-棋谱-获取列表(三十八)

    2019独角兽企业重金招聘Python工程师标准>>> 在线演示地址:Silverlight+WCF 新手实例 象棋 在线演示 在Silverlight+WCF 新手实例 象棋 主界 ...

  8. Silverlight+WCF 新手实例 象棋 主界面-棋谱-回放-结局(四十)

    在线演示地址: Silverlight+WCF 新手实例 象棋 在线演示 在Silverlight+WCF 新手实例 象棋 主界面-棋谱-回放(三十九)中,我们实现了用户的棋谱回放,在文章的下面,我们 ...

  9. Silverlight+WCF 新手实例 象棋 主界面-棋谱-回放(三十九)

    在线演示地址:Silverlight+WCF 新手实例 象棋 在线演示 本节完后,同时会更新Silverlight+WCF 新手实例 象棋 专题索引,并顺路提供第八阶段源码 在Silverlight+ ...

最新文章

  1. 过滤驱动加密文件(代码)
  2. IT十八掌作业_java基础第八天_多线程
  3. pycharm如何改为中文显示?
  4. 科大星云诗社动态20210403
  5. golang设置运行CPU数量及sync.Mutex全局互斥锁的使用示例
  6. iOS查看静态库命令
  7. js 递归编程要注意的:return
  8. TomCat JDK环境变量
  9. 本地上传文件到Linux云服务器
  10. 一个基于angularJS的工资计算器
  11. 2015-点餐系统(服务器)
  12. 区块链钱包开发(Android篇)
  13. windows搭建redis java简易访问客户端
  14. RuntimeError: __iter__() is only supported inside of tf.function or when eager execution is enabled.
  15. 【爬虫】一种基于网页相似度去重的爬虫系统
  16. VSCode代码格式化快捷键及保存时自动格式化
  17. LIKE IS = 的区别
  18. oracle clob 类型条件,Oracle中Clob类型如何处理?
  19. 面试编程题-猴子偷桃
  20. 利用深度摄像头生成仿激光数据并构建地图

热门文章

  1. 掌门1对1java面试_掌门1对1面试经验分享
  2. 接棒Oracle的“准遗产”,华为云的云数据库靠谱吗?
  3. ListView常见的优化方式简述
  4. python批处理_python写批处理
  5. 台式计算机鼠标,鼠标 台式电脑知识 ZOL术语
  6. 为什么浏览器会使用多进程架构
  7. 通达信接口API的简介
  8. 算法作业2-轮流取石头游戏
  9. 荣耀手表magic2 鸿蒙,荣耀要爆炸?荣耀Magic2后又来耳机手表,都想要!!
  10. 华三dhcp设置保留地址范围