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

查看本系列其他相关文章请点击:Silverlight+WCF 新手实例象棋专题索引

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

Silverlight+WCF 新手实例 象棋 主界面-棋谱-回放(三十九)中,我们实现了用户的棋谱回放,在文章的下面,我们曾留下了两个问题:

  • 下棋者在下棋过程,要不要开放“回放”功能,如果开放,需要注意什么?
  • 观众在回放过程中,突然又传来一个棋步,需要注意什么?

在解答这两个问题之前,我们先来解答上一篇的截图中发现的问题:

不知有没有人发现?图中有三个“炮”或三个”马“,出现这个事故的原因,

是由于在每次重置chess.Reset的时候,我们没有清除棋子列表,造成了有重复的棋子。找到了原因,解决的方法就相当的简单了,

只要在chess象棋类里的确Reset方法里,添加一行棋子列表.clear方法清除下就行了,增加的只有第一行:

public void Reset()
{
   ChessmanList.Clear();//增加棋子列表清除
   container.Children.Clear();//棋盘和棋子一并清掉了
   InitBoard();//只好重新初始棋盘了
   InitChessman();//只好重新初始棋子了
   IsCanMove = false;//设置状态不能移动了
   IsGaming = false;//这个差点忘了
}

好了,一行代码解决了我们上一节隐藏在图片中的bug。

接下来,我们要对上节留下的两个问题做一下解答了:

我们把问题顺序倒一下,先解答第二个问题吧:观众在回放过程中,突然又传来一个棋步,需要注意什么?

我们在上一节,曾定义过一个全局变量:

public static bool chessManualPlaying = false;//棋谱正回放中

而上节中,我只说了后面会用到[很后哦],所以,这节我们要用到了,因为这个变量可以解答问题:

我们假设:当观众在回放棋步的过程中,棋手双方在不停的下棋,不断的传递新的棋步过来;

这时,我们仅需要处理的,只是不执行自动播放而已,至于写棋谱区文字和添加到棋谱列表的照常就行了。

所以,我们要做的事情就是:开始播放时,设置App.chessManualPlaying为true;播放结束后,设置为false;

于是我们回到播放时的代码增加:

 private void PlayStep()
        {
            if (App.stepList.Count > 0)
            {
                //播放前复位棋子
                  App.chess.Reset();
                App.chessManualPlaying = true;//增加的一行
                timer.Interval = TimeSpan.FromSeconds(slPlayerInternal.Value);
                timer.Start();
            }
        }

于是我们再回到播放结束时的代码增加:

void timer_Tick(object sender, EventArgs e)
        {
            //...省略N行...
           if (moveStepIndex == App.stepList.Count)//棋步结束
            {
                moveStepIndex = 0;//重置索引
                  timer.Stop();//停止timer
                App.chessManualPlaying = false;//增加的一行
            }
        }

标识位加完了,我们回到设置自动移动棋步的地方,加判断,如果播放中,切断棋步自动移动:

接收棋步的通知在Chess.xaml.cs里,我们只需要添加半行代码[下面的!App.chessManualPlaying]:

void client_NotifyMoveStepReceived(object sender, NotifyMoveStepReceivedEventArgs e)
        {
            App.stepList.Add(e.player.Step);//添加棋步
            if (!App.chessManualPlaying && App.player.ID != e.player.ID)//非棋步播放中,非自己
            {
              //...省略棋步移动相关代码...
             }
            HelpSetChessManualEvent(e.player.Step);//写棋谱区
        }

第二个问题,至此就解决了,总共添加了2.5行代码。

现在转回第一个问题了:下棋者在下棋过程,要不要开放“回放”功能,如果开放,需要注意什么?

不开放:只需要把“回放”按钮启用状态设置为false就行了;

开放:其实也不难:我们只要限制在播放过程中,不让棋手下棋就行了,

同时棋手播放过程也会产生第一个问题:不过,我们刚才已经解决,加的代码对棋手也是同样有效。

如何限制棋手不让下棋,其实很简单了,chess.IsCanMove属性就能限制了,只要播放时,设置为false,播放完,设置回原值就行了;

是不是感觉和第一个问题太相似了?动手吧,还是播放开始和结束,只不过,也要增加一个变量,来存棋手的下棋状态:

增加一行全局变量:

 public partial class ChessManual : UserControl
    {
       //...省略2行代码...
        bool tempIsCanMove;//保存棋手之前的状态
        public ChessManual()
        {
            //...省略N行代码...

        }
       //...省略N行代码...
   }

播放时,先取状态,再设置IsCanMove=false[这句在Reset重置里已经有了,可以省了];

 private void PlayStep()
        {
            if (App.stepList.Count > 0)
            {
                //播放前复位棋子
                tempIsCanMove = App.chess.IsCanMove;//先存之前状态
                App.chess.Reset();//重置状态时会设置IsCanMove=false,所以不用写多一行
                App.chessManualPlaying = true;
                timer.Interval = TimeSpan.FromSeconds(slPlayerInternal.Value);
                timer.Start();
            }
        }

接着播放结束时,状态设置回来[最后一行代码]:

void timer_Tick(object sender, EventArgs e)
        {
            //...省略N行代码...
            if (moveStepIndex == App.stepList.Count)//判断棋步结束没有
            {
                moveStepIndex = 0;//重置索引
                timer.Stop();//停止timer
                App.chessManualPlaying = false;
                App.chess.IsCanMove = tempIsCanMove;//增加的一行
            }
        }

 

OK,至此,我们用了同样的方法,解决了上节的两个问题,接下来又到F5的showtime时间:

正常,上图,这下棋步回放是正常的了:

1:棋手正下棋不久:

2:观众进来了,播放了棋步,定位到实时状态:

3:观众想看下棋过程,开始“回放”棋步:

4:“回放”到第三步棋中:

5:回放到第五步棋中:

OK,截图到就到此了,本系列文章,一不小心就写了40节了,在这系列的40节里,所有功能已完全的开放源码并讲解完了!

有兴趣的读者欢迎关注本系列文章,明天公司又要搬家了,本系列有没有后续文章,目前情况不明......

顺路更新下索引:Silverlight+WCF 新手实例 象棋 专题索引

时间: 2024-10-01 02:20:17

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

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

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

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

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

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

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

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

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

Silverlight+WCF 新手实例 象棋 主界面-实时聊天区(二十五)

在线演示地址:Silverlight+WCF 新手实例 象棋 在线演示 演示已更新到此节介绍:Silverlight+WCF 新手实例 象棋 介绍III(二十三)   本节连着Silverlight+WCF 新手实例 象棋 主界面-在线用户区(二十四) 发,主界面就不截图了,这节我们实现"实时聊天区": 这节内容几乎和上节一个样的逻辑 1:新建一个用户控件:就叫:Chat.xaml,用来在线聊天 2: 界面拖一个Border到Index.xaml,现在界面上有三个Border了,第三个

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

在线演示地址:Silverlight+WCF 新手实例 象棋 在线演示   这节,我们要实现棋谱列界面布局和棋谱的获取,先上一张久远的图片: 看清楚了,到本节为止,除了第三区棋谱区,其它的区域我们都已完成了,所以,我们抓紧时间,赶紧吧:   好了,先布局,和以往一样:   1:界面拖一个Border到Index.xaml,到第三区的位置,设置好宽和高[212*602]: <UserControl ...省略...   d:DesignHeight="620" d:DesignWi

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