silverlight   发布时间:2022-05-03  发布网站:大佬教程  code.js-code.com
大佬教程收集整理的这篇文章主要介绍了Silverlight+WCF 新手实例 象棋 棋子移动-规则[将、马、士、相、炮](八)大佬教程大佬觉得挺不错的,现在分享给大家,也给大家做个参考。

概述

这节来完成剩下五个种子的规则。 先来将吧 将:只能走一步,而且只能在九宫内行走 看代码,还是和兵的一个样。 if  (Math.Abs(y2  -  y1)  +  Math.Abs(x2  -  x1)  !=   1 ) // 只能走一步                         {                              break ;                
这节来完成剩下五个种子的规则。

先来将吧

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

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

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

 

下面限制九宫内判断:

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

 

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

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

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

 

下面说马,爱日的马。

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

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

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

 

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

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

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

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

 

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

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

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

 

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

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

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

 

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

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

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

 

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

士:九宫内走半日。

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

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

 

完了,两个if搞定了。

下面说说相:

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

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

case@H_450_33@  ChessType.Xiang:
                        @H_450_33@ if@H_450_33@  ((Math.Abs(y2 @H_450_33@ -@H_450_33@  y1) @H_450_33@ ==@H_450_33@  @H_450_33@ 2@H_450_33@  @H_450_33@ &&@H_450_33@  Math.Abs(x2 @H_450_33@ -@H_450_33@  x1) @H_450_33@ ==@H_450_33@  @H_450_33@ 2@H_450_33@ ))@H_450_33@ //@H_450_33@ 先判断走田型@H_450_33@
@H_450_33@                         {
                            @H_450_33@ //@H_450_33@ 有没有田脚点,并且不能过河@H_450_33@
@H_450_33@                             @H_450_33@ if@H_450_33@  (@H_450_33@ !@H_450_33@ IsExits(@H_450_33@ new@H_450_33@  Point((x1 @H_450_33@ +@H_450_33@  x2) @H_450_33@ /@H_450_33@  @H_450_33@ 2@H_450_33@ , (y1 @H_450_33@ +@H_450_33@  y2) @H_450_33@ /@H_450_33@  @H_450_33@ 2@H_450_33@ )))
                            {
                                @H_450_33@ if@H_450_33@  (y2 @H_450_33@ >@H_450_33@  @H_450_33@ 4@H_450_33@ )@H_450_33@ //@H_450_33@ 不过河@H_450_33@
@H_450_33@                                 {
                                    @H_450_33@ return@H_450_33@  @H_450_33@ true@H_450_33@ ;
                                }
                            }
                        }
                        @H_450_33@ break@H_450_33@ ;@H_450_33@

 

三步判断搞定。

下面最后一个就是炮了:

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

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;
                        }

合起来就是:

 

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

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

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

 

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

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

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

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

 

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

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

 

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

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

 

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

///@H_450_33@  @H_450_33@ <sumMary>@H_450_33@
        @H_450_33@ ///@H_450_33@  移动棋子
        @H_450_33@ ///@H_450_33@  @H_450_33@ </sumMary>@H_450_33@
        @H_450_33@ ///@H_450_33@  @H_450_33@ <param NAME="chessman">@H_450_33@ 棋子@H_450_33@ </param>@H_450_33@
        @H_450_33@ ///@H_450_33@  @H_450_33@ <param NAME="toX">@H_450_33@ 移动到X坐标@H_450_33@ </param>@H_450_33@
        @H_450_33@ ///@H_450_33@  @H_450_33@ <param NAME="toY">@H_450_33@ 移动到Y坐标@H_450_33@ </param>@H_450_33@
@H_450_33@         @H_450_33@ public@H_450_33@  @H_450_33@ bool@H_450_33@  MoveTo(Chessman chessman, Point moveTo)
        {
            @H_450_33@ if@H_450_33@  (Rule.IsCanMove(chessman, moveTo))@H_450_33@ //@H_450_33@ 把规则应用到这里就OK了@H_450_33@
@H_450_33@             {
                chessman.Readymove @H_450_33@ =@H_450_33@  @H_450_33@ false@H_450_33@ ;
                chessman.chessman.BACkground @H_450_33@ =@H_450_33@  @H_450_33@ null@H_450_33@ ;
                Playmove(chessman, moveTo);
                chessman.MovePoint @H_450_33@ =@H_450_33@  moveTo;
                @H_450_33@ return@H_450_33@  @H_450_33@ true@H_450_33@ ;
            }
            @H_450_33@ return@H_450_33@  @H_450_33@ false@H_450_33@ ;
        }@H_450_33@

 

OK,运行看下效果

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

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

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

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

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

打完收工!

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

@H_375_1675@

大佬总结

以上是大佬教程为你收集整理的Silverlight+WCF 新手实例 象棋 棋子移动-规则[将、马、士、相、炮](八)全部内容,希望文章能够帮你解决Silverlight+WCF 新手实例 象棋 棋子移动-规则[将、马、士、相、炮](八)所遇到的程序开发问题。

如果觉得大佬教程网站内容还不错,欢迎将大佬教程推荐给程序员好友。

本图文内容来源于网友网络收集整理提供,作为学习参考使用,版权属于原作者。
如您有任何意见或建议可联系处理。小编QQ:384754419,请注明来意。