Silverlight+WCF 新手实例 象棋 主界面-棋谱-布局写谱(三十六)

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

 

这节,我们要实现棋谱列界面布局和棋谱的获取,先上一张久远的图片:

看清楚了,到本节为止,除了第三区棋谱区,其它的区域我们都已完成了,所以,我们抓紧时间,赶紧吧:

 

好了,先布局,和以往一样:

 

1:界面拖一个Border到Index.xaml,到第三区的位置,设置好宽和高[212*602]:


<UserControl ...省略...   d:DesignHeight="620" d:DesignWidth="1000">
    
    <Grid x:Name="LayoutRoot" Background="White">
       
       //...省略之前四个Border...
        <Border BorderBrush="Silver" BorderThickness="1" Height="602" HorizontalAlignment="Left" Margin="538,12,0,0" Name="chessManualBoard" VerticalAlignment="Top" Width="212" />
    </Grid>
</UserControl>

 

 

2:新建一个用户控件:就叫:ChessManual.xaml

3:后台动态加载控件了,后台代码就两行,看今天新加的那


public partial class Index : UserControl
    {
        //..省略N行...
        ChessManual chessManualControl;
        public Index()
        {
           //..省略N行...
           chessManualControl = new ChessManual();//今天新加的
            chessManualBoard.Child = chessManualControl;
          //..省略N行...
        }

        //..省略N行...
    }

 

 

OK,控件加载完了。接下来的任务就是要实现ChessManual控件里的内容显示了:

 

4:接下来我们回到ChessManual.xaml里,改一下总体宽和高为212*602:

<UserControl ...省略一堆...  d:DesignHeight="602" d:DesignWidth="212">
    
    <Grid x:Name="LayoutRoot" Background="White">

    </Grid>
</UserControl>

 

我们往里添加界面布局:


<Grid x:Name="LayoutRoot" Background="White">
        <ListBox Height="520" HorizontalAlignment="Left" Name="lbChessManual" VerticalAlignment="Top" Width="190" Margin="10,10,0,0" />
        <Button Content="回放" Height="23" HorizontalAlignment="Right" Margin="0,541,12,0" Name="btnPlay" VerticalAlignment="Top" Width="53"  />
        <Slider Height="23" HorizontalAlignment="Left" Margin="12,541,0,0" Name="slPlayerInternal" VerticalAlignment="Top" Width="56" SmallChange="0.5"  Maximum="9" LargeChange="1" />
        <TextBox IsEnabled="false" Height="23" HorizontalAlignment="Right" Margin="0,541,110,0" Name="txtValue" Text="0" VerticalAlignment="Top" Width="15" />
        <TextBlock Height="23" HorizontalAlignment="Center" Margin="108,545,70,34" Name="textBlock1" Text="秒/步" VerticalAlignment="Center" Width="34" />
    </Grid>

 

代码看起来不整洁,是有点乱,布完局后的结果就是上面图的第三区了,不另外上图了:

至此,布局就完成了,接下来,我们要进入和棋谱相关的操作了服务端操作了:

 

在双方下棋的过程中,我们不断交互的传送棋步,同时,服务端也记录了每一步的棋步信息;

这节,我们将通过棋步生成棋谱,同时和棋步一起传递。

有一些基础知识要知道,就是棋谱是怎么写出来的?这个,大伙自己百度看看了,不做介绍了!

这里,我封装成一个方法,附加在Chess象棋类里面:

首先呢,棋谱里的数字,一方是数字,一方是中文数字,所以先来一个方法把数字转中文数字:


private string GetGBKNum(int num)
        {
            switch (num)
            {
                case 1:
                    return "一";
                case 2:
                    return "二";
                case 3:
                    return "三";
                case 4:
                    return "四";
                case 5:
                    return "五";
                case 6:
                    return "六";
                case 7:
                    return "七";
                case 8:
                    return "八";
                case 9:
                    return "九";
                default:
                    return "XX";
            }
        }

 

有了这个方法,接着我们实现写棋谱:


  //写棋谱
        public string WriteManual(Chessman chessman, Point moveTo)
        {
            string manual = (chessman.Color == Colors.Red ? "红方:" : "黑方:") + chessman.Name;
            int moveX = 9 - (int)chessman.MovePoint.X;
            int toX = 9 - (int)moveTo.X;
            int value = (int)chessman.MovePoint.Y - (int)moveTo.Y;
            manual += chessman.Color == Colors.Red ? GetGBKNum(moveX) : moveX.ToString();
            manual += value == 0 ? "平" : ((value > 0) ? "进" : "退");
            if (value != 0)
            {
                switch (Action.Rule.GetChessTypeByName(chessman.Name))
                {
                    case ChessType.Bing:
                    case ChessType.Che:
                    case ChessType.Jiang:
                    case ChessType.Pao:
                        toX = Math.Abs(value);
                        break;
                }
            }
            manual += chessman.Color == Colors.Red ? GetGBKNum(toX) : toX.ToString();
            return manual;
        }

 

上面这段函数可能没那么好理解,大伙需要先理解棋谱的基础知识,才能好好的理解这段代码,不理解就直接使用跳过也行了;

反正一步棋就产生一行中文说明的棋谱信息。

 

有了写棋谱函数,我们在哪里使用呢?当然是回到我们提交棋步到服务端那时了,回到Chess.xaml.cs里:


void Action_HelpMoveStepEvent(ChessNewInstance.Chessman chessman, Point moveTo)
        {
            MoveStep step = new MoveStep();
            step.FromX = chessman.MovePoint.X;
            step.FromY = chessman.MovePoint.Y;
            step.ToX = moveTo.X;
            step.ToY = moveTo.Y;
            step.ColorValue = chessman.Color == Colors.Red ? 1 : 2;

            step.Name = chess.WriteManual(chessman, moveTo);//这里只加一行代码
           
            App.player.Step = step;//附加棋步
            App.client.MoveStepAsync(App.player);
            chess.IsCanMove = false;
        }

 

在这里,我们只添加了一行代码,把棋谱放到棋步的Name里面,然后随便棋步一起过去了。

 

OK,接着我们回到接收棋步的地方,同样的,我们收到棋步后,把棋步的Name显示到棋谱区就行了。

我们接收棋步是在Chess.xaml.cs里,可是我们要显示的棋谱区却在我们新添加的ChessManual.xaml里;

所以,我们需要在控件间传递消息,所以,我们又要请出委托了:

在Chess.xaml.cs里添加委托,添加两行,然后在接收到棋步的最后,调用一下就OK了,参数就是传递棋步了:


public partial class Chess : UserControl
    {
        public delegate void HelpSetChessManual(MoveStep step);
        public event HelpSetChessManual HelpSetChessManualEvent;
        ChessNewInstance.Chess chess;//这里我们同时把它提到全局对象
        public Chess()
        {
           //...省略N行...
        }

        //...省略N行...

        void client_NotifyMoveStepReceived(object sender, NotifyMoveStepReceivedEventArgs e)
        {
           if (App.player.ID != e.player.ID)//非自己
            {
                //...省略N行...
            }
            HelpSetChessManualEvent(e.player.Step);//这里调用
        }
        //...省略N行...

 }

 

好了,我们的Index.xaml.cs又要干活了:

先和棋谱控件约好接口调用先,所以我们在棋谱区添加一个方法:

代码

 

是不是发现和Chat聊天区的极其相似,其实就是代码Copy一下,改改名称也就是了。

好了,接口也有了,我们回到Index.xaml.cs里做一下功夫:

 


public partial class Index : UserControl
    {
       
        //...省略N行...
        public Index()
        {
            //...省略N行...            

    chessControl.HelpSetChessManualEvent += new Chess.HelpSetChessManual(chessControl_HelpSetChessManualEvent);

        }

        void chessControl_HelpSetChessManualEvent(GameService.MoveStep step)
        {
            chessManualControl.Add(step);
        }

        //...省略N行...
    }

 

 

OK,至此,我们布局完了,写谱也有了,接谱也有了,该F5看下效果了:

一切正常,上图:

 

 

 

 

 

 

 

看到了吧,双方每走一步都有棋谱显示,只是棋谱,我们还没完?观众进来时,怎么还原棋谱?棋谱又该怎么回放?我们下节解说

本节就点到为止。

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

http://www.cnblogs.com/cyq1162/archive/2010/08/07/1794788.html

时间: 2024-11-08 18:20:17

Silverlight+WCF 新手实例 象棋 主界面-棋谱-布局写谱(三十六)的相关文章

Silverlight+WCF 新手实例 象棋 主界面-事件区-求和认输(三十二)

在线演示地址:Silverlight+WCF 新手实例 象棋 在线演示   事隔几篇,我们又回到事件区,继续其它两个按钮事件,来张图吧: 在Silverlight+WCF 新手实例 象棋 主界面-事件区-游戏开始(二十七) 和之后的几篇,我们实现了游戏开始, 在这篇之前,基本上双方已可以对战了,看似主体功能已完成.只是,大伙都知道,细节的东西,才是花时间的,漫长的路还在后面....... 如标题所示,这节实现"求和+认输"两个事件.   每次开始,我们都习惯的先写WCF服务端代码,再回

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

在线演示地址:Silverlight+WCF 新手实例 象棋 在线演示   在Silverlight+WCF 新手实例 象棋 主界面-棋谱-布局写谱(三十六)中,我们完成下棋双方的棋谱显示,这节,我们为观众增加棋子列表: 观众进入房间后,第一时间当然也要获取棋步列表了,不然进来干麻呢?你当这是聊天室啊,光聊天不看棋.   首先,当然是要在服务端添加一个获取棋步列表的接口方法了: WCF服务端,IService.cs:  /// <summary>     /// 服务端方法接口 by 路过秋天

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

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

Silverlight+WCF 新手实例 象棋 主界面-棋谱-回放-结局(四十)

查看本系列其他相关文章请点击:Silverlight+WCF 新手实例象棋专题索引 在线演示地址:Silverlight+WCF 新手实例 象棋 在线演示 在Silverlight+WCF 新手实例 象棋 主界面-棋谱-回放(三十九)中,我们实现了用户的棋谱回放,在文章的下面,我们曾留下了两个问题: 下棋者在下棋过程,要不要开放"回放"功能,如果开放,需要注意什么? 观众在回放过程中,突然又传来一个棋步,需要注意什么? 在解答这两个问题之前,我们先来解答上一篇的截图中发现的问题: 不知

一起谈.NET技术,Silverlight+WCF 新手实例 象棋 主界面-棋谱-回放-结局(四十)

查看本系列其他相关文章请点击:Silverlight+WCF 新手实例象棋专题索引 在线演示地址:Silverlight+WCF 新手实例 象棋 在线演示 在Silverlight+WCF 新手实例 象棋 主界面-棋谱-回放(三十九)中,我们实现了用户的棋谱回放,在文章的下面,我们曾留下了两个问题: 下棋者在下棋过程,要不要开放"回放"功能,如果开放,需要注意什么? 观众在回放过程中,突然又传来一个棋步,需要注意什么? 在解答这两个问题之前,我们先来解答上一篇的截图中发现的问题: 不知

Silverlight+WCF 新手实例 象棋 主界面-事件区-返回退出(三十三)

在线演示地址:Silverlight+WCF 新手实例 象棋 在线演示   还是那张图:  本节实现返回大厅和退出系统: 一:返回大厅,其实很简单的说,就是转向房间列表了. 可是,转向前也有很多事情要处理的: 1:退出前要通知服务器,说我要退出了,不然其它人看到你在房间里占着毛坑又不拉. 2:如果已经在游戏中,你还得先"认输" 3:没其它事了,直接就返回大厅了. 二:退出系统,和返回大厅一样,只是最后结果的转向不一样,只是转向登陆界面.   这里就产生第一个问题了,怎么知道自己是在游戏

Silverlight+WCF 新手实例 象棋 主界面-事件区-游戏开始(二十七)

本专题出产简单原由: 一开始的初衷,只是想写个简单的单机BS人机对战版的,开始还下了点AI算法看看的: 但是写到最后,都写成了通讯版本的对战了,只因中间不小心看到了WCF的相关内容,顺便加了进来; 最后就定局了,反正新手实例,能加多点内容就加多点了. 关于原始初衷,后期再补上了.       好了,先上几个附加索引: 1:Silverlight+WCF 新手实例 象棋 在线演示 2:Silverlight+WCF 简单部署问题集 3:Silverlight4 ListBox bug 4:Silv

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

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

赶紧接着上一节:Silverlight+WCF 新手实例 象棋 主界面-实时聊天区(二十五) 这节我们实现上节没实现的纠结的进出房间的消息提示 我们清楚的知道,我们每个区都是一个用户控件,我们的在线用户进出时,得到聊天区域显示信息,这就涉及到用户控件之间的消息传递了。 在线用户区说:反正我是

赶紧接着上一节:Silverlight+WCF 新手实例 象棋 主界面-实时聊天区(二十五)  这节我们实现上节没实现的纠结的进出房间的消息提示 我们清楚的知道,我们每个区都是一个用户控件,我们的在线用户进出时,得到聊天区域显示信息,这就涉及到用户控件之间的消息传递了. 在线用户区说:反正我是没权直接去实时聊天区写东西,没办法,找中介委托设置一下了. 那谁是中介呢?委托谁呢?当然是衣食父母Index.xaml了,是它撑着整个家庭的. 好了,知道中介了,那我就签个委托书了: 回到OnlineUse