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

先来将吧

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

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

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. GDCM:gdcm::DefinedTerms的测试程序
  2. 阿里云自研数据库支撑双11,助力电商客户订单峰值突破每秒20万笔
  3. windows下git命令的使用
  4. (转)Java随机数
  5. android今日头条刷新,仿今日头条刷新vector动画
  6. App iPhone版内部测试使用办法
  7. VB 按指定编码格式写入文本文件
  8. ibm服务器系统电池型号,IBM服务器_X366型号2003系统恢复
  9. 试用期java_Java试用资源
  10. rhel5 安装Oracle Database 10g Release 2(II)
  11. 如何判断一个算式是几位运算
  12. Spring中ClassPathXmlApplication与FileSystemXmlApplicationContext的区别
  13. Office文件格式兼容包FileFormatConverters(office 2010)
  14. 简约创意个人简历求职竞聘PPT模板
  15. 视频采集卡是什么?采集卡的妙用!
  16. 为什么学习计算机的时候学语文,小学语文“为什么要学拼音呢”?告诉你学拼音技巧!...
  17. 使用 pandoc 进行文档转换(markdown转pdf)
  18. idea弹窗 Placing the unmodified important.txt in the zip file with the agent jar in the same directo
  19. 提取富文本内容(包括去除图片)
  20. python五边形的代码_python正五边形代码

热门文章

  1. 全栈项目|小书架|微信小程序-实现搜索功能
  2. mybatis-plus批量插入数据
  3. 【转】不懂得使用工具的测试不是好测试
  4. 《Rank-LIME: Local Model-Agnostic Feature Attribution for Learning to Rank》论文精读
  5. java 文本分析 关键词提取_文本关键词提取算法总结
  6. 微信小程序下载与注册
  7. 程序员怎么接私活:外包众包接单方法网站全介绍
  8. Python实现猎人猎物优化算法(HPO)优化支持向量机回归模型(SVR算法)项目实战
  9. Adobe CC2018 总是提示Adobe Crash repoter已停止工作,求解决方法
  10. Centos7的配置与优化