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语句:

 

09125648_ohIs.gif Notify.Game
internal   static   void  Game(Player player, GameType type)
        {
            
switch  (type)
            {
                
case  GameType.Start: // 通知对方玩家开始游戏
                  
// 省略已实现的代码
                    break ;
                
case  GameType.Move: // 通知移动了,房间内人手一份
                   
// 省略已实现的代码
                     break ;
                
case  GameType.End: // 通知游戏结束了,房间内人手一份
                    foreach (KeyValuePair<Guid, Player> item in Service.playerList[player.RoomID])
                    {
                      //请求平手,只发给对手
                      if (player.AttachInfo == "22"|| player.AttachInfo == "21" || player.AttachInfo == "20")
                        {
                            if (item.Value.ColorValue + player.ColorValue == 3)
                            {
                                item.Value.CallBack.NotifyEndGame(player);
                                break;
                            }
                        }
                        else
                        {
                            item.Value.CallBack.NotifyEndGame(player);
                        }
                    }
                      break ;
            }
        }

 

就一个循环,正常是人手一份通知,不过请求平手,对手一份就够了[多了一个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,发送完命令就等对方回应了:

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

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

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

09125648_ohIs.gif 代码
public  EventButton()
        {
            
// 省略N行
            App.client.EndGameCompleted  +=   new  EventHandler < System.ComponentModel.AsyncCompletedEventArgs > (client_EndGameCompleted);
        }

        
void  client_EndGameCompleted( object  sender, System.ComponentModel.AsyncCompletedEventArgs e)
        {
            
if  (Convert.ToString(e.UserState)  ==   " 22 " )
            {
                MessageBox.Show(
" 你的请求已发送,请等待回应 " " 游戏通知 " , MessageBoxButton.OK);
            }
        }

 

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

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

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

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

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

 

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

 

09125648_ohIs.gif
  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的回复进行处理了。

09125648_ohIs.gif
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 
=   " " ;
            App.client.EndGameAsync(App.player);
        }

 

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

09125648_ohIs.gif
void  client_NotifyEndGameReceived( object  sender, GameService.NotifyEndGameReceivedEventArgs e)
        {
            
// 接收游戏结束消息
             switch  (e.player.AttachInfo)
            {
                
case   " 22 " : // 平手请求
                   
// ...能省则省...
                     break ;
                
case   " 21 " :
                   
// ...能省则省...
                     break ;
                
case   " 20 " :
                  
// ...能省则省...
                     break ;
                
case   " 2 " :
                   
// ...能省则省...
                     break ;
                
case   " " :
                    MessageBox.Show(e.player.NickName
+ " 认输了! " " 游戏结果通知 " , MessageBoxButton.OK);
                    
break ;
            }
        }

 

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

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

09125648_ohIs.gif
void  client_NotifyStartGameReceived( object  sender, GameService.NotifyStartGameReceivedEventArgs e)
        {
            
// 收到消息了应该咋办
             switch  (e.player.AttachInfo)
            {
                
case   " " : // 通知可以开始游戏
                   
// ...能省则省...
                     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

转载于:https://my.oschina.net/chen106106/blog/43466

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
Go语言(也称为Golang)是由Google开发的一种静态强类型、编译型的编程语言。它旨在成为一门简单、高效、安全和并发的编程语言,特别适用于构建高性能的服务器和分布式系统。以下是Go语言的一些要特点和优势: 简洁性:Go语言的语法简单直观,易于学习和使用。它避免了复杂的语法特性,如继承、重载等,转而采用组合和接口来实现代码的复用和扩展。 高性能:Go语言具有出色的性能,可以媲美C和C++。它使用静态类型系统和编译型语言的优势,能够生成高效的机器码。 并发性:Go语言内置了对并发的支持,通过轻量级的goroutine和channel机制,可以轻松实现并发编程。这使得Go语言在构建高性能的服务器和分布式系统时具有天然的优势。 安全性:Go语言具有强大的类型系统和内存管理机制,能够减少运行时错误和内存泄漏等问题。它还支持编译时检查,可以在编译阶段就发现潜在的问题。 标准库:Go语言的标准库非常丰富,包含了大量的实用功能和工具,如网络编程、文件操作、加密解密等。这使得开发者可以更加专注于业务逻辑的实现,而无需花费太多时间在底层功能的实现上。 跨平台:Go语言支持多种操作系统和平台,包括Windows、Linux、macOS等。它使用统一的构建系统(如Go Modules),可以轻松地跨平台编译和运行代码。 开源和社支持:Go语言是开源的,具有庞大的社支持和丰富的资源。开发者可以通过社获取帮助、分享经验和学习资料。 总之,Go语言是一种简单、高效、安全、并发的编程语言,特别适用于构建高性能的服务器和分布式系统。如果你正在寻找一种易于学习和使用的编程语言,并且需要处理大量的并发请求和数据,那么Go语言可能是一个不错的选择。
Go语言(也称为Golang)是由Google开发的一种静态强类型、编译型的编程语言。它旨在成为一门简单、高效、安全和并发的编程语言,特别适用于构建高性能的服务器和分布式系统。以下是Go语言的一些要特点和优势: 简洁性:Go语言的语法简单直观,易于学习和使用。它避免了复杂的语法特性,如继承、重载等,转而采用组合和接口来实现代码的复用和扩展。 高性能:Go语言具有出色的性能,可以媲美C和C++。它使用静态类型系统和编译型语言的优势,能够生成高效的机器码。 并发性:Go语言内置了对并发的支持,通过轻量级的goroutine和channel机制,可以轻松实现并发编程。这使得Go语言在构建高性能的服务器和分布式系统时具有天然的优势。 安全性:Go语言具有强大的类型系统和内存管理机制,能够减少运行时错误和内存泄漏等问题。它还支持编译时检查,可以在编译阶段就发现潜在的问题。 标准库:Go语言的标准库非常丰富,包含了大量的实用功能和工具,如网络编程、文件操作、加密解密等。这使得开发者可以更加专注于业务逻辑的实现,而无需花费太多时间在底层功能的实现上。 跨平台:Go语言支持多种操作系统和平台,包括Windows、Linux、macOS等。它使用统一的构建系统(如Go Modules),可以轻松地跨平台编译和运行代码。 开源和社支持:Go语言是开源的,具有庞大的社支持和丰富的资源。开发者可以通过社获取帮助、分享经验和学习资料。 总之,Go语言是一种简单、高效、安全、并发的编程语言,特别适用于构建高性能的服务器和分布式系统。如果你正在寻找一种易于学习和使用的编程语言,并且需要处理大量的并发请求和数据,那么Go语言可能是一个不错的选择。
Go语言(也称为Golang)是由Google开发的一种静态强类型、编译型的编程语言。它旨在成为一门简单、高效、安全和并发的编程语言,特别适用于构建高性能的服务器和分布式系统。以下是Go语言的一些要特点和优势: 简洁性:Go语言的语法简单直观,易于学习和使用。它避免了复杂的语法特性,如继承、重载等,转而采用组合和接口来实现代码的复用和扩展。 高性能:Go语言具有出色的性能,可以媲美C和C++。它使用静态类型系统和编译型语言的优势,能够生成高效的机器码。 并发性:Go语言内置了对并发的支持,通过轻量级的goroutine和channel机制,可以轻松实现并发编程。这使得Go语言在构建高性能的服务器和分布式系统时具有天然的优势。 安全性:Go语言具有强大的类型系统和内存管理机制,能够减少运行时错误和内存泄漏等问题。它还支持编译时检查,可以在编译阶段就发现潜在的问题。 标准库:Go语言的标准库非常丰富,包含了大量的实用功能和工具,如网络编程、文件操作、加密解密等。这使得开发者可以更加专注于业务逻辑的实现,而无需花费太多时间在底层功能的实现上。 跨平台:Go语言支持多种操作系统和平台,包括Windows、Linux、macOS等。它使用统一的构建系统(如Go Modules),可以轻松地跨平台编译和运行代码。 开源和社支持:Go语言是开源的,具有庞大的社支持和丰富的资源。开发者可以通过社获取帮助、分享经验和学习资料。 总之,Go语言是一种简单、高效、安全、并发的编程语言,特别适用于构建高性能的服务器和分布式系统。如果你正在寻找一种易于学习和使用的编程语言,并且需要处理大量的并发请求和数据,那么Go语言可能是一个不错的选择。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值