Silverlight+WCF 新手实例 象棋 棋子移动-规则补充(三十七)

在线演示地址:Silverlight+WCF 新手实例 象棋 在线演示

 

Silverlight+WCF 新手实例 象棋 棋子移动-规则[附加上半盘限制](十)中,由Silenus-G提出规则还有点bug:

红车竟然可以走到红马的地盘:这是由于鼠标点在棋子之外的地方时,我们产生的是棋子移动[不是吃子],而在移动之时,我们又没有判断要移动到的位置上是不是有其它棋子从而引发了经济纠纷。因此,解决这个问题,我们只需在点击事件里增加一下判断棋子存不存在就可以了。

而在移动的规则里,这节我们同时进行补充,小调整一下其它两个规则:

1:车和炮的判断语句少了几个“括号”;

2:增加将军面对面可以吃子

 

 

下面开始:

对于红车抢马地盘这个问题,我们增加一行if代码就可以解决了,我们回到Chess象棋类里,找到鼠标点击事件:


 void control_MouseLeftButtonDown(object sender, MouseButtonEventArgs e)
        {
            if (e.OriginalSource is Canvas || e.OriginalSource is Line)
            {
                Chessman chessman =ReadyMoveChessman;
                if (chessman != null)
                {
                    Point fixPoint = FixPoint(e.GetPosition(null));
                    if (FindChessman(fixPoint) == null)//这里是新增加的一行判断语句
                    {
                        Action.MoveTo(chessman, fixPoint);
                    }
                   
                }
            }
        }

 

OK,红车抢马的事故我们一行代码就解决了,下面为原有规则的车和炮增加括号:

我们回到ChessRule规则类里:

车规则修正:

//这一行是车原有的if判断:
if (x1 == x2 && yCount == 0 || y1 == y2 && xCount == 0)

//加上括号修正为:
if ((x1 == x2 && yCount == 0) || (y1 == y2 && xCount == 0))

 

炮规则修正:


//这个是炮原有的if语句
if (x1 == x2 && (yCount == 0 && !exits) || (yCount == 1 && exits)
 || y1 == y2 && (xCount == 0 && !exits) || (xCount == 1 && exits))

//现修正括号为:
if (x1 == x2 && ((yCount == 0 && !exits) || (yCount == 1 && exits))
 || y1 == y2 && ((xCount == 0 && !exits) || (xCount == 1 && exits)))

 

 

OK,接下来是增加将军面对面的规则了:

同时增加棋子同种颜色判断[目前来说该规则没啥用。吃子规则里同颜色会自动切换,不会产生吃子]:


 /// <summary>
        /// 移动规则
        /// </summary>
        /// <param name="move">棋子</param>
        /// <param name="eat">移动的位置的数组</param>
        /// <returns></returns>
        public bool IsCanMove(Chessman chessman, Point moveTo)
        {
            //...省略N行...            
            if (x2 >= 0 && x2 < 9 && y2 >= 0 && y2 < 10 && !(x1 == x2 && y1 == y2))//在棋盘之内,非原步。
            {
                Chessman man = Action.Parent.FindChessman(moveTo);
                if (man != null && chessman.Color == man.Color)//增加棋子存在和颜色判断
                {
                    return false;
                }
                ChessType chessType = GetChessTypeByName(chessman.Name);
                switch (chessType)
                {
                  //...省略N行...            
                    case ChessType.Jiang:
                        //将军面对面
                        if (man != null && GetChessTypeByName(man.Name) == ChessType.Jiang)
                        {
                            OutCount(chessman.MovePoint, moveTo, out xCount, out yCount);
                            return x1 == x2 && yCount == 0;
                        }
                       //...省略N行...                            }
            }
            return false;
        }

我们增加了棋子查找,然后在将军里判断一下移动到的位置的点上的棋子是不是对方的将军,如果是,就按类似车的规则[只竖走]进行移动。

 

OK,本节就点到为止了。

版权声明:本文原创发表于博客园,作者为路过秋天,原文链接:

http://www.cnblogs.com/cyq1162/archive/2010/08/09/1795476.html

时间: 2024-10-02 13:46:18

Silverlight+WCF 新手实例 象棋 棋子移动-规则补充(三十七)的相关文章

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

上上一节,我们对棋子的下半盘棋子做了所有的规则限制,因为我们下棋的总是用下半盘的棋子来下,总没人用上半盘棋来下那么高境界的吧. 不过这节简单追加点代码,让那些企图高境界的人士可以临时性的自己和自己下. 好了,要为上半盘棋子也做限制,所以我们要知道棋子是归属于上半盘还是下半盘的,这里,我们为棋子类Chessman增加一个属性,IsUp,是否上半盘棋,反之就下半盘了.初始为该属性赋值也相当的简单:  /// <summary>         /// 棋子默认在上半盘/反之在下半盘        

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

上两节实现了棋子的两种走法,吃子和没移动到线交叉点.不过我们都是没有规则的走,这节为棋子的走法增加规则,棋的规则我就不多说了,基本要找个不会下象棋的很难,就是找到的估计也不会看这文章.   当我们移动棋子的时候,总是要判断一下移动是不是合规则的,合规则的才让下,不合规则的就不能下了,什么马象田马日车炮跑,将军卫士陷九宫,[本人涅造句子]之类的. 好了,原始冲动,新建棋子规则类,也是本棋子裤的最后一个类了: 对着项目内裤右键->添加类->输入:ChessRule.cs. /// <summ

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

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

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

在线演示地址:Silverlight+WCF 新手实例 象棋 在线演示   本节完后,同时会更新Silverlight+WCF 新手实例 象棋 专题索引,并顺路提供第八阶段源码   在Silverlight+WCF 新手实例 象棋 主界面-棋谱-布局写谱(三十六)节中,我们完成了下棋双方的棋谱传递 在Silverlight+WCF 新手实例 象棋 主界面-棋谱-获取列表(三十八)节中,我们完成了观棋者获取棋谱列表 在本节中,我们要进行最一步了,棋谱回放: 首先,当用户进入列表后,获取完棋谱信息之

Silverlight+WCF 新手实例 象棋 主界面-状态重置(三十四)

在线演示地址:Silverlight+WCF 新手实例 象棋 在线演示   正如我们在:Silverlight+WCF 新手实例 象棋 主界面-事件区-求和认输(三十二)里面提到的一样: "游戏结束了,要干点什么呢?当然就是棋盘复位了,按钮重置了,如果还有棋谱之类的,全都得重置.这些,我们留下到另一节优化处理吧."   所以,本节就做这些手尾工作了. 由于游戏结束,我们复位的工作很多,至少有N个控件需要复位,因此,Silverlight+WCF 新手实例 象棋 主界面-控件消息传递(二

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

上一节,我们给棋子赋于了鼠标点击事件,并通过故事板Storyboard 来移动棋子,同时实现了吃棋子. 现在我们在实现鼠标在棋盘上点击,然后棋子就移动到那去. 好了,鼠标在棋盘上点击,这里要为点击的棋盘,其实就是最外面那个Panel容器啦,还是加上一个MouseLeftButtonDown事件. 我们回到Chess类,因为这里是第一手Canvas传进来的地方,我们在Chess的构造函数里,为Panel添加这一事件    public Chess(Panel control)         {

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

棋盘上有棋子,棋子应该还有一些属性,按原始冲动新建一个棋子类. 上google翻译下棋子E文叫什么,查到了叫Chessman,于是对着项目右键添加一个Chessman.cs    /// <summary>     /// 棋子类 by 路过秋天     ///http://cyq1162.cnblogs.com/     /// </summary>    public class Chessman     {     }     乱七八糟: 想了想,要画棋子还是找图片好,图片也

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

上节创建显示了一颗棋子,由于没有margin属性,所以只能靠边站. 现在,我们创建一个象棋类,让它包括棋盘和棋子,同时附加几个常用函数. 还是对着Silverlight类库项目右键添加类:Chess.cs /// <summary>     /// 象棋 by 路过秋天     /// </summary>    public class Chess     {     }   既然要包括象棋当然是要包括棋盘和棋子了,于是我们为之加两个属性,棋子有很多颗,所以用List列表.  /

Silverlight+WCF 新手实例 象棋 棋子移动-吃子(五)

上一节,我们的棋子就是一个Canvas,里面add进了一个Ellipse圆圈和TextBlock字 想想我们是怎么下棋的,要先选中棋子吧,选中后,随便找个地方点,棋就会自动移过去. 所以,这里就产生了两件事,一是选中,二是移动. 要选中,其实就是选中棋子,选中棋子就是选中Canvas了. 于是,我们为Canvas增加一个鼠标点击事件. 让我们回到棋子类Chessman的Draw方法里,为chessman添加一个MouseLeftButtonDown事件,于是代码变成了    private vo