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

    技术2022-07-01  88

    转帖地址:http://www.cnblogs.com/cyq1162/archive/2010/07/10/1774734.html

     

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

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

    好了,要为上半盘棋子也做限制,所以我们要知道棋子是归属于上半盘还是下半盘的,这里,我们为棋子类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,至此,棋子上下盘都按规则走了,高境界的人群自己可以动手走两边了。。。

    打完收工!


    最新回复(0)