转帖地址: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,至此,棋子上下盘都按规则走了,高境界的人群自己可以动手走两边了。。。
打完收工!