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


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

    还是那张图: 

    本节实现返回大厅和退出系统:

    一:返回大厅,其实很简单的说,就是转向房间列表了。

    可是,转向前也有很多事情要处理的:

    1:退出前要通知服务器,说我要退出了,不然其它人看到你在房间里占着毛坑又不拉。

    2:如果已经在游戏中,你还得先“认输”

    3:没其它事了,直接就返回大厅了。

    二:退出系统,和返回大厅一样,只是最后结果的转向不一样,只是转向登陆界面。

    这里就产生第一个问题了,怎么知道自己是在游戏状态???不能通过说我是坐在红黑的位置上就是游戏状态了吧?

    我们有游戏“同意”和接收“同意”事件,在那可以知道是否进入游戏。

    我们也有游戏“结束”通知,在那可以也知道游戏是否结束。

    所以,我们需要增加一个标识,来标识当前是否在游戏中,在哪增加呢?其实呢,原来我是在全局里加的,不过这里认为在Chess象棋类里增加好点。

    增加一个属性,没什么难度了:

     /// <summary>
        
    /// 象棋 by 路过秋天
        
    /// http://cyq1162.cnblogs.com
        
    /// </summary>
        public class Chess
        {
            
    /// <summary>
            
    /// 是否游戏开始了
            
    /// </summary>
            public bool IsGaming
            {
                
    get;
                
    set;
            }
            
    //...下面省略N行代码...
        }

    接着我们要在“同意”和接收“同意”标识一下这个属性了:

    void client_NotifyStartGameReceived(object sender, GameService.NotifyStartGameReceivedEventArgs e)
            {
                
    //收到消息了应该咋办
                switch (e.player.AttachInfo)
                {
                    
    case "0"://通知可以开始游戏
                       
    //...省略N行...
                    case "1"://请求开始游戏
                     
    //...省略N行...
                      if (result == MessageBoxResult.OK)//同意开始游戏
                      {
                          btnGameDeuce.IsEnabled 
    = true;
                          btnGameLose.IsEnabled 
    = true;
                          App.chess.IsGaming 
    = true;//新加的
                      }
                        
    break;
                    
    case "10":
                        MessageBox.Show(
    "对方拒绝开始游戏""游戏通知", MessageBoxButton.OK);
                        
    break;
                    
    case "11":
                        MessageBox.Show(
    "对方同意开始游戏,请开始下棋""游戏通知", MessageBoxButton.OK);
                        
    //...省略N行...
                        App.chess.IsGaming = true;//新加的
                        break;
                }
            }

    还有游戏“结束”通知那里呢?我们先不标识回来了,下节我们处理游戏结束,重置所有状态时,再一起并处理。

    OK,现在,我们可以知道自己是不是正在游戏状态中了,双击“返回大厅”按钮,和“退出系统”,代码如下:

    //返回大厅
            private void btnBackRoom_Click(object sender, RoutedEventArgs e)
            {
                
    if (App.chess.IsGaming)
                {
                    btnGameLose_Click(
    nullnull);//发送认输
                    App.chess.IsGaming = false;
                }
                App.client.OutRoomAsync(App.player, App.player.RoomID, App.player.AttachInfo);
                ((App)Application.Current).RedirectTo(
    new Room());
            }
            
    //退出系统
            private void btnLogout_Click(object sender, RoutedEventArgs e)
            {
                
    if (App.chess.IsGaming)
                {
                    btnGameLose_Click(
    nullnull);//发送认输
                    App.chess.IsGaming = false;
                }
                App.client.OutRoomAsync(App.player, App.player.RoomID, App.player.AttachInfo);
                ((App)Application.Current).RedirectTo(
    new Login());
            }

    代码都一样,只有最后一行没变化,既然有这么多共同的代码(4行)咋不抽出来弄到一个函数里去,这个,我们留到优化的时候再处理吧。

    在游戏状态下我们这里匆匆认输,快速修改游戏标志IsGaming,然后就退出了。

    到此时,我们就完成了事件里的几个按钮事件了,只是还有一点“游戏结束,状态的重置,还没处理呢”,这个请看下节。

    好了,该F5了,每次写完,我都要自己先调试通过,才放上来的,大伙对代码的完整性可以放心的。

    调试:

    进入房间-》返回大厅-》再进入:异常了:

    服务器未提供有意义的回复;这可能是由协定不匹配、会话过早关闭或内部服务器错误引起的。

     遇到这问题怎么调试呢?

     把后台WCF开启服务,看前台的命令传到后台没有:

    断点,进去了,WCF端,在如下产生错误:截图如下:

    那个Player.RoomID值为0

    我们并没有在roomList记录房间为0的记录,所以就报这个错了,这里我们当然可以添加判断了,添加if判断一下在不在,再更改房间人数。

    不过这里,我们直接注释掉好了,这属性暂时也没什么用,[大伙还是直接加if判断了]。

    public static void ChangeRoom(Player player, int roomID)
            {
                RemovePlayer(player);
                AddPlayer(player, roomID);
                
    //roomList[player.RoomID].Count = playerList[player.RoomID].Count;
                
    //roomList[roomID].Count = playerList[roomID].Count;
            }

    OK,找到问题了,继续F5运行,重复进入房间,再重复登陆退出房间,终于正常了!

    对了,还有对战中退出房间没测试,经测试,正常,所以,上图一张:

    我们在返回大厅和退出系统时,按理如果对手是在游戏状态,应该提示一下的,我们这里没提示,

    所以一点按钮,就自动认输退出,这个小细节,大伙自觉加上了。

    好了,本节点到为止了。

    版权声明:本文原创发表于 博客园,作者为 路过秋天 本文欢迎转载,但未经作者同意必须保留此段声明,且在文章页面明显位置给出原文连接,否则视为侵权。
    个人微信公众号
    创业QQ群:617713515
    Donation(扫码支持作者):支付宝:
    Donation(扫码支持作者):微信:
  • 相关阅读:
    win7 重装 docker 启动后无法启动错误解决
    ASP.NET MVC 播放远程服务器上的MP3文件
    ubuntu+mono+PetaPoco+Oracle+.net 程序部署
    .NET Core 2.0 问题杂记
    博客园挂了吗?
    Content-Type: application/vnd.ms-excel">
    Storm
    Razor语法
    类型后面加问号 int?
    Apache vue site configuration
  • 原文地址:https://www.cnblogs.com/cyq1162/p/1791843.html
Copyright © 2020-2023  润新知