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

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

 

事隔几篇,我们又回到事件区,继续其它两个按钮事件,来张图吧:

Silverlight+WCF 新手实例 象棋 主界面-事件区-游戏开始(二十七) 和之后的几篇,我们实现了游戏开始,

在这篇之前,基本上双方已可以对战了,看似主体功能已完成。只是,大伙都知道,细节的东西,才是花时间的,漫长的路还在后面.......

如标题所示,这节实现“求和+认输”两个事件。

 

每次开始,我们都习惯的先写WCF服务端代码,再回到客户端写代码:

对应着“开始的”StartGame,这节我们也要开始我们的EndGame了。

回到IService.cs,添加接口:

/// <summary>
        ///游戏结束
        /// </summary>
        [OperationContract(IsOneWay = true)]
        void EndGame(Player player);

 

接着是ICallBack.cs,回调接口:

[OperationContract(IsOneWay = true)]
void NotifyEndGame(Player player);

 

紧跟着是实现EndGame接口,和StartGame一样,只需一行代码:

public void EndGame(Player player)
{
    Notify.Game(player, GameType.End);
}

 

接着我们实现Notify.Game里预留的Switch语句:

 

Notify.Game

 

就一个循环,正常是人手一份通知,不过请求平手,对手一份就够了[多了一个21,20,是对方回应标识,下面有说到]。

到此服务端轻松已完成了!!

OK,接着我们回到客户端,对应相应的按钮事件:

喂喂,编绎,更新服务引用哦[我又忘了-_-...]。

一:求和[我查了下E文(平手)叫:Deuce]

我们双击求和按钮,这是我们最本能的反应了,前后台产生了Click事件代码:

我们往后台轻松敲两行代码,为什么App.player后面还有一个"22"的参数???有什么用呢?等会就知!:

//平手事件,我们定义22
private void btnGameDeuce_Click(object sender, RoutedEventArgs e)
{
    App.player.AttachInfo = "22";
    App.client.EndGameAsync(App.player, "22");
}

 

OK,发送完命令就等对方回应了:

这里有一点,我们点击完发送后,要不要提示用户“你的请求已发送,请等待回应”这样的提示语呢?

如果不用,就不用加那个完成事件了,如果要,我们就加一下了,如下

为了不产生多个事件,我们都把事件移到构造函数里:

代码

 

看到事件结束后我们的判断了,那个上面传的参数"22"这里我们就用到了。由于可以多次调用同一个请求,每个请求都会产生一个回调,这样,通过多传一个参数标识是哪个请求的,这样接收的时候,就可以分支处理了。

好了,消息是发送了,可是,对方在哪接收呢?既然是在这里开始,就在这里结束好了!

还是构造函数里添加事件:


public EventButton()
        {
          //省略N行
          App.client.NotifyEndGameReceived += new EventHandler<GameService.NotifyEndGameReceivedEventArgs>(client_NotifyEndGameReceived);
        }

        void client_NotifyEndGameReceived(object sender, GameService.NotifyEndGameReceivedEventArgs e)
        {
            //接收游戏结束消息
        }

 

接下来就是分支处理游戏结束消息了:

 


 void client_NotifyEndGameReceived(object sender, GameService.NotifyEndGameReceivedEventArgs e)
        {
            //接收游戏结束消息
            switch (e.player.AttachInfo)
            {
                case "22"://平手请求
                    MessageBoxResult result = MessageBox.Show("对方请求平手,是否同意!", "游戏请求", MessageBoxButton.OKCancel);
                    if (result == MessageBoxResult.OK)//同意
                    {
                        App.player.AttachInfo = "21";//同意请求标识位设为21
                    }
                    else//拒绝
                    {
                        App.player.AttachInfo = "20";//拒绝请求标识位设为20
                        
                    }
                    App.client.EndGameAsync(App.player);
                    break;
            }
        }

 

看代码,简单的很,如果同意,回复21,拒绝,回复20,

接着,我们要对21,20的回复进行处理了。


void client_NotifyEndGameReceived(object sender, GameService.NotifyEndGameReceivedEventArgs e)
        {
            //接收游戏结束消息
            switch (e.player.AttachInfo)
            {
                case "22"://平手请求
                    //...省略...
                    break;
                case "21":
                    //显示同意平手,结束游戏,向大伙广播游戏结束了
                    MessageBox.Show("对方同意平局", "游戏通知", MessageBoxButton.OK);
                    App.player.AttachInfo = "2";//发出游戏平局广播。
                    App.client.StartGameAsync(App.player);

                    break;
                case "20":
                    //显示拒绝,然后当什么事也没发生
                    MessageBox.Show("对方拒绝平局", "游戏通知", MessageBoxButton.OK);
                    break;
            }
        }

 

唉,又多了一个游戏平局广播标识"2"又要处理,好吧,处理吧,等会不会又出来其它数字吧,唉,这个还真有,认命吧。

                case "2":
                    MessageBox.Show("双方平局", "游戏结果通知", MessageBoxButton.OK);
                    break;

 

粗略的算处理了。游戏结束了,要干点什么呢?当然就是棋盘复位了,按钮重置了,如果还有棋谱之类的,全都得重置。这些,我们留下到另一节优化处理吧。

吃饭时间快到了,要写快一点,接下来处理认输事件了:

 

二:认输

同样的,双击认输按钮,产生事件,这里代码也同样很简单,起个标志位,发送过去,认输就直接广播说输了就行了:

private void btnGameLose_Click(object sender, RoutedEventArgs e)
        {
            App.player.AttachInfo = "0";
            App.client.EndGameAsync(App.player);
        }

 

大伙在游戏结束通知消息里处理一下:

 

OK,到此,两个事件就处理完成了,只是游戏结束后的复位功能没用实现,我们留到下节处理了,时间不等人,赶紧F5看下效果:

没啥效果,默认那个两个按钮是不可用的,在游戏开始后,要开启那两个按钮,赶紧赶紧,加两行代码:


void client_NotifyStartGameReceived(object sender, GameService.NotifyStartGameReceivedEventArgs e)
        {
            //收到消息了应该咋办
            switch (e.player.AttachInfo)
            {
                case "0"://通知可以开始游戏
                   //...能省则省...
                    break;
                case "1"://请求开始游戏
                 //...能省则省...

                  if (result == MessageBoxResult.OK)//同意开始游戏
                  {
                      btnGameDeuce.IsEnabled = true;
                      btnGameLose.IsEnabled = true;
                  }
                    break;
                case "10":
                 //...能省则省...
                    break;
                case "11":
                  //...能省则省...

                    btnGameDeuce.IsEnabled = true;
                    btnGameLose.IsEnabled = true;
                    break;
            }
        }

 

好了,抓紧F5看效果[上面那段1的if语句(绿色的),是截图后补上去的,不然就只有一方的求各认输按钮显示了]:

上图看效果,“马还走一步”,博客园上图片出错了,吃完饭回来再看看补上了。

文章先发了,图后补。

 

现在补图了:

1:游戏开始了,“求和-认输”启用了:

 

2:求和发送,对方收到消息:

 



 

 

 

3:对方拒绝的后果:

4:对方同意的结果:

 

 



 

 

5:对方认输了:

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

http://www.cnblogs.com/cyq1162/archive/2010/08/03/1791063.html

时间: 2024-11-03 21:37:34

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

Silverlight+WCF 新手实例 象棋 主界面-棋盘区(二十二)

在线演示地址:Silverlight+WCF 新手实例 象棋 在线演示   这节我们要布局Index.xaml界面. 首先,我们定义一下全局的宽和高:1000*620[数字差不多就行了] 一堆代码,都是自动生成的,只是改了两个数字,不说大伙也知道改啥数字了. <UserControl x:Class="NewChessProject.Index"     xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presen

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

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