博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
Silverlight+WCF 新手实例 象棋 主界面-事件区-返回退出(三十三)
阅读量:7015 次
发布时间:2019-06-28

本文共 2837 字,大约阅读时间需要 9 分钟。

hot3.png

在线演示地址:

 

还是那张图: 

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

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

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

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

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

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

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

 

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

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

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

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

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

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

 

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

05233342_CJRU.gif
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,现在,我们可以知道自己是不是正在游戏状态中了,双击“返回大厅”按钮,和“退出系统”,代码如下:

05233342_CJRU.gif
//
返回大厅
        
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判断了]。

05233342_CJRU.gif
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运行,重复进入房间,再重复登陆退出房间,终于正常了!

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

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

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

好了,本节点到为止了。

 

转载于:https://my.oschina.net/secyaher/blog/274141

你可能感兴趣的文章
NEO改进协议提案6(NEP-6)
查看>>
iOS补位动画、沙漏效果、移动UITableViewCell、模拟贪吃蛇、拖拽进度等源码
查看>>
webapp字号大小跟随系统字号大小缩放
查看>>
[LeetCode] 430. Flatten a Multilevel Doubly Linked List
查看>>
常用布局
查看>>
交互式数据可视化-D3.js(四)形状生成器
查看>>
浅谈easy-mock 最好的备胎没有之一
查看>>
ES学习笔记(6)--数字操作
查看>>
数据上报分析一
查看>>
Vue.js 3.0 新特性预览
查看>>
什么是Jython?
查看>>
实现前后端分离的心得
查看>>
LeetCode 144 ——二叉树的前序遍历
查看>>
Windows上的Redis
查看>>
nginx系列2----从源码安装nginx和echo-nginx-module模块
查看>>
简洁易用的基于Promise的jsonp库easy-jsonp,了解下
查看>>
PHP-FPM设置max_chindren、max_requests
查看>>
[LintCode/LeetCode] Count Univalue Subtrees
查看>>
JS -- offsetXY、clientXY、pageXY、screenXY的区别
查看>>
每日一题 / 在yii2的restful中,如何复写action?
查看>>