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

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

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

 

 

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

在Silverlight+WCF 新手实例 象棋
主界面-棋谱-布局写谱(三十六)惨遭,我们得下棋双方的棋谱显示,这节,我们呢观众增加棋子列表:

红车竟然好走至红马的势力范围:这是由于鼠标点在棋子之外的地方经常,我们发出的是棋子移动[无是吃子],而当动的常,我们同时尚未看清要活动至的位置上是匪是发任何棋子从而吸引了经济纠纷。因此,解决这题目,我们只有待于点击事件里增加一下判断棋子存不在就是足以了。

观众进入房间后,第一时间当然为只要落棋步列表了,不然进来干麻呢?你当就是聊天室啊,光聊天不看棋。

假若于倒的条条框框里,这节咱们同时展开续,小调整一下别样少单规则:

 

1:车及煎的判定语句少了几乎独“括号”;

首先,当然是如果于服务端上加一个取棋步列表的接口方法了:

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

WCF服务端,IService.cs:

 

图片 1图片 2

 

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

脚开始:

 

对红车抢马地盘这个题目,我们多一行if代码就足以缓解了,我们回到Chess象棋类里,找到鼠标点击事件:

咱俩回来的是一个泛型的List,这个得留心了。

图片 3图片 4

跟着我们来贯彻此艺术,回到IService.svc.cs:

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

图片 5图片 6

 

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

OK,红车抢马的故我们一行代码就缓解了,下面为本来规则的切削与煎增加括号:

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

咱们回去ChessRule规则类里:

 

车规则修正:

圈,每次我们服务端代码都十分粗略,就一行。

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

服务端轻松自在写了了,我们编绎一下,更新服务引用。

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

 

 

随即我们返回客户端ChessManual.xaml.cs,在页面加载时,我们若调用获取一下列表:

炮规则修正:

周页面代码不多,就净复制了:

图片 7图片 8

图片 9图片 10

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

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

//现修正括号呢:
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);
        }
    }

 

 

 

随后我们若实现把获得到的列表Add到棋谱区去矣,可是,这个时我们发现一个题目,上图:

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

图片 11

又增加棋子同种颜色判断[现阶段以来该规则没啥用。吃子规则里同颜色会活动切换,不会见发生吃子]:

顾Result出来的提示无,我们返回的凡一个List,结果回到了个System.Collections.ObjectModel.ObservableCollection

图片 12图片 13

即时是嗑回事啊?我们直接返回Dictionary都不错的,咋返回个List就变成是法了,大伙摸急,方法是部分:我们看下图说:

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

1:对正值引用的GameService右键:

咱们加了棋子查找,然后在将军里判断一下移动至的职务的点上的棋类是勿是对方的将,如果是,就本类似车的平整[只竖走]开展移动。

图片 14

 

2:我们选中配置服务引用:

OK,本节尽管点及为止了。

图片 15

3:从达图我们视了集类型,默认是十分ObservableCollection了底,于是我们选一下下拉框看看:

图片 16

视了发出List了吧,选中它,确定,系统会活动重新更新引用,就OK了,不另外截图把e.Result的唤起截出了:

 

乃,我们更赶回棋谱区,继续完成我们的代码:

图片 17图片 18

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

 

OK,到者,观众尽管可以取到棋步列表了。我们F5周转看下力量:

图片 19

 

OK,观众进入的早晚来棋谱了,可是观众人数棋盘还是始于状态的吗??

是嘛,我们要拿棋谱从头到尾播放平次等,状态自然就是和下棋者的一样了;

咱留下至下节说明,本节即使点及了了。