Silverlight+WCF 新手实例 象棋 主界面-棋谱-获取列表(三十八)

 

图片 1图片 2

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

 

 

 

车规则核查:

 

红车竟然能够走到红马的地盘:那是出于鼠标点在棋子之外的地方时,大家发出的是棋子移动[不是吃子],而在活动之时,大家又从未看清要运动到的职位上是否有其余棋子从而抓住了经济纠纷。由此,消除那么些难题,大家只需在点击事件里扩张一下论断棋子存不存在就可以了。

 

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

这么些嘛,大家只要把棋谱从头到尾播放两回,状态自然就跟下棋者的如出一辙了;

OK,红车抢马的事故大家一行代码就解决了,上面为原始规则的车和炮增加括号:

public partial class ChessManual : UserControl
    {
        public ChessManual()
        {
            InitializeComponent();
            App.client.GetMoveStepListCompleted += new EventHandler<GameService.GetMoveStepListCompletedEventArgs>(client_GetMoveStepListCompleted);
            App.client.GetMoveStepListAsync(App.player.RoomID);
        }

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

随之大家要促成把收获到的列表Add到棋谱区去了,不过,那些时候大家发现一个题材,上图:

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

观者进入房间后,第一时间当然也要博取棋步列表了,不然进来干麻呢?你当那是聊天室啊,光聊天不看棋。

 

 

图片 3图片 4

 

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

WCF服务端,IService.cs:

而在运动的条条框框里,那节大家同时拓展补偿,小调整一下任何多个规则:

图片 5图片 6

炮规则校对:

那是咋回事呢?大家一直再次回到Dictionary都不含糊的,咋再次回到个List就成那几个样子了,大伙摸急,方法是一些:大家看下图说:

 

图片 7图片 8

图片 9图片 10

图片 11

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

大家回来的是一个泛型的List,那几个得留心了。

OK,本节就点到完工了。

观看了有List了啊,选中它,确定,系统会自动重新更新引用,就OK了,不别的截图把e.Result的唤起截出来了:

OK,接下去是扩充将军面对面的平整了:

OK,到此,观者就足以拿走到棋步列表了。大家F5运转看下效果:

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

图片 12

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

        void client_GetMoveStepListCompleted(object sender, GameService.GetMoveStepListCompletedEventArgs e)
        {
            //获取完棋谱后,那里循环调用Add就可以了
        }
        public void Add(GameService.MoveStep step)
        {
            lbChessManual.Items.Add(step.ID + “:” + step.Name);
            lbChessManual.SelectedIndex = lbChessManual.Items.Count – 1;
            lbChessManual.UpdateLayout();
            lbChessManual.ScrollIntoView(lbChessManual.SelectedItem);
        }
    }

咱俩增添了棋子查找,然后在将军里判断一下移动到的职位的点上的棋类是或不是对方的战将,若是是,就按类似车的平整[只竖走]拓展移动。

于是乎,大家重新归来棋谱区,继续落成大家的代码:

图片 13图片 14

1:对着引用的GameService右键:

 

        public List<MoveStep> GetMoveStepList(int roomID)
        {
            return roomList[roomID].StepList;
        }
    }

对于红车抢马地盘这一个题目,我们扩大一行if代码就可以缓解了,大家重返Chess象棋类里,找到鼠标点击事件:

 

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

2:大家选中配置服务引用:

 

全套页面代码不多,就全复制了:

咱们回来ChessRule规则类里:

3:从上图大家看出了汇集类型,默许是分外ObservableCollection了的,于是大家选一下下拉框看看:

还要扩张棋子同种颜色判断[现阶段以来该规则没啥用。吃子规则里同颜色会活动切换,不会发出吃子]:

Silverlight+WCF 新手实例 象棋
主界面-棋谱-布局写谱(三十六)
中,我们完毕下棋双方的棋谱突显,那节,我们为观者增添棋子列表:

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

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

 

图片 15

 

看,每一遍大家服务端代码都很简单,就一行。

上面先河:

图片 16图片 17

 /// <summary>
    /// 服务端方法接口 by 路过夏季
    /// </summary>
    [ServiceContract(CallbackContract = typeof(ICallBack))]
    public interface IService
    {
       //…省略N行代码…
        [OperationContract]
        System.Collections.Generic.List<MoveStep> GetMoveStepList(int roomID);//获取棋步列表 
        //…省略N行代码…
    }

进而我们回去客户端ChessManual.xaml.cs,在页面加载时,大家要调用获取一下列表:

看样子Result出来的指示没有,我们回去的是一个List,结果回到了个System.Collections.ObjectModel.ObservableCollection

我们留到下节分解,本节就点到截止了。

进而大家来落实这一个方法,回到IService.svc.cs:

OK,听众进入的时候有棋谱了,可是听大千世界棋盘照旧初阶状态的吗??

void client_GetMoveStepListCompleted(object sender, GameService.GetMoveStepListCompletedEventArgs e)
        {
            //获取完棋谱后,那里循环调用充裕就可以了
            if (e.Result != null && e.Result.Count > 0)
            {
                foreach (GameService.MoveStep step in e.Result)
                {
                    lbChessManual.Items.Add(step.ID + “:” + step.Name);
                }
            }
        }

 

 public class Service : IService
    {
        //…省略N行代码…

图片 18

图片 19

服务端轻松自在写完了,大家编绎一下,更新服务引用。

率先,当然是要在服务端添加一个到手棋步列表的接口方法了: