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(null, null);//发送认输
                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(null, null);//发送认输
                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运行,重复进入房间,再重复登陆退出房间,终于正常了!

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

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

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

好了,本节点到为止了。

 

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

http://www.cnblogs.com/cyq1162/archive/2010/08/04/1791843.html

时间: 2024-07-29 20:14:57

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

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

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

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

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

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

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了,第三个