2019独角兽企业重金招聘Python工程师标准>>>

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

上一节,我们实现了“开始”游戏,并互相通知可以开始游戏了;可是我们并没有对棋子进行限制,双方都可以随时的下;

所以,接下来我们要实现对棋子的限制,A下B停,B下A停,同时,要传递棋步,对方收到棋步,要反转棋步坐标,还得自动移动棋子。

说了这么多,我们从哪里开始下手呢?其实我也想了很久......

让我们回到Chess象棋类,于是添加一个属性IsCanMove

// 象棋类 by 路过秋天
public   class  Chess
{
         ///   <summary>
         ///  是否可以移动棋子
         ///   </summary>
         public   bool  IsCanMove
        {
             get ;
             set ;
        }

// ...省略N多行...

}

OK,属性有了,我们通过这个属性来控制是不是能移动棋子,接着我们回到棋子类Chessman点击事件里,加上限制,不能移动就不让点:

  // 新加的事件方法,棋子点击事件
void  chessman_MouseLeftButtonDown( object  sender, MouseButtonEventArgs e)
{
             if  ( ! Parent.IsCanMove)
            {
                 return ;
            }

// ...下面省略N行...
}

有了一个属性和一个限制,轻轻松松几行代码,就搞定了,接下来的事,就是要决定什么时候设置IsCanMove的true或false了.

OK,让我们回到[上一节]点击”开始“的事件里,找到收到”回复可以开始“的代码里,既然可以开始了,那这个属性就要设置为true了。

我们回到EventButton.xaml.cs代码里:

void  client_NotifyStartGameReceived( object  sender, GameService.NotifyStartGameReceivedEventArgs e)
        {
             // 收到消息了应该咋办
             switch  (e.player.AttachInfo)
            {
                 // ...省略N行代码...                    
                     case   " 11 " :
                    MessageBox.Show( " 对方同意开始游戏,请开始下棋 " ,  " 游戏通知 " , MessageBoxButton.OK);
                    btnGameStart.IsEnabled  =   false ;
                     // 这里设置一下Chess.IsCanMove=true;
                     break ;
            }
        }

看清楚罗,就在对方同意开始游戏后,我们要设置为true,这样就可以下棋了,可是我们的chess对象,在另外一个下棋区控件里,怎么传递消息?

我们在Silverlight+WCF 新手实例 象棋 主界面-控件消息传递(二十六)这节就讲过了,不懂的回去再看看......

不过呢,这次我们换另外一种方法来传递消息,毕竟这个属性或者说chess类是个比较重要的类,到处都可能用到,我们不能到处委托人的,一次两次的委托人家就算了,件件事都来委托人家就烦了,代码长了也烦。

那用什么方法?还记得我们的player和client对象没?它们到处都可以随时用的。所以了,回到App.xmal.cs里,加多一个全局变量了:

有没有发现,最近我变聪明了,经常性的省略以前的代码,来让重点的代码变的更直观一点。

public   partial   class  App : Application
{
        Grid root  =   new  Grid();
         public   static  GameService.ServiceClient client; // 回调的客户端
         public   static  GameService.Player player; // 当前玩家
         public   static  ChessNewInstance.Chess chess; // 象棋类,新增加的
         public  App()
        {
             // ...省略...
        }
}

此时广州的天空在不停的闪雷...

OK,全局也有了,那在哪里为这个全局赋值,总不能拿一个Null对象到到调吧。

所以,我们回到Chess.xaml.cs里,在实例化Chess的地方,为这个全局赋一下值:

代码较短,就全部Copy进来:

public   partial   class  Chess : UserControl
    {
       ChessNewInstance.Chess chess; // 这里我们同时把它提到全局对象
         public  Chess()
        {
            InitializeComponent();
            chess  =   new  ChessNewInstance.Chess(canvasRoot);
            chess.InitBoard();
            chess.InitChessman();
            canvasRoot.Width  =  chess.Board.Width;
            canvasRoot.Height  =  chess.Board.Height;
            App.chess  =  chess; // 为全局对象赋值
        }
    }

一切就绪,现在可以到处用App.chess对象了,于是我们峰回路转到EventButton.xaml.cs里,只为了加一行代码:

void  client_NotifyStartGameReceived( object  sender, GameService.NotifyStartGameReceivedEventArgs e)
        {
             // 收到消息了应该咋办
             switch  (e.player.AttachInfo)
            {
                 // ...照样省略N行...

case   " 11 " :
                    MessageBox.Show( " 对方同意开始游戏,请开始下棋 " ,  " 游戏通知 " , MessageBoxButton.OK);
                    btnGameStart.IsEnabled  =   false ;
                    App.chess.IsCanMove = true ; // 这里设置一下,就加这一行
                     break ;
            }
        }

OK,到这里,我们可以F5一下看一下效果,又要开始截图了:

我们仔细看一下图,看一下对话哦:

棋子区的图就不别截了,细看一下对话区,由于我们只实现了一部分,A可以下,B停。所以目前永远是这个状态,A可以一直下,B一直信停。

这个状态我们要留到下节来处理情况,如果细看,还会发现,双方头顶上都是黑色棋子,也就是说双方用的都是红色棋???

这个嘛,我们也另开小节来讲解罗。

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

Silverlight+WCF 新手实例 象棋 该谁下棋-A下B停(二十八)相关推荐

  1. Silverlight+WCF 新手实例 象棋 该谁下棋-B下A停(三十)

    2019独角兽企业重金招聘Python工程师标准>>> 在线演示地址:Silverlight+WCF 新手实例 象棋 在线演示 上上一节,就是二十八节:Silverlight+WCF ...

  2. Silverlight+WCF 新手实例 象棋 主界面-棋谱-获取列表(三十八)

    2019独角兽企业重金招聘Python工程师标准>>> 在线演示地址:Silverlight+WCF 新手实例 象棋 在线演示 在Silverlight+WCF 新手实例 象棋 主界 ...

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

    在线演示地址:Silverlight+WCF 新手实例 象棋 在线演示 还是那张图: 本节实现返回大厅和退出系统: 一:返回大厅,其实很简单的说,就是转向房间列表了. 可是,转向前也有很多事情要处理的 ...

  4. Silverlight+WCF 新手实例 象棋 主界面-棋谱-回放-结局(四十)

    在线演示地址: Silverlight+WCF 新手实例 象棋 在线演示 在Silverlight+WCF 新手实例 象棋 主界面-棋谱-回放(三十九)中,我们实现了用户的棋谱回放,在文章的下面,我们 ...

  5. Silverlight+WCF 新手实例 象棋 棋子移动-规则[附加上半盘限制](十)

    上上一节,我们对棋子的下半盘棋子做了所有的规则限制,因为我们下棋的总是用下半盘的棋子来下,总没人用上半盘棋来下那么高境界的吧. 不过这节简单追加点代码,让那些企图高境界的人士可以临时性的自己和自己下. ...

  6. Silverlight+WCF 新手实例 象棋 主界面-棋谱-回放(三十九)

    在线演示地址:Silverlight+WCF 新手实例 象棋 在线演示 本节完后,同时会更新Silverlight+WCF 新手实例 象棋 专题索引,并顺路提供第八阶段源码 在Silverlight+ ...

  7. Silverlight+WCF 新手实例 象棋 主界面-实时聊天区(二十五)

    在线演示地址:Silverlight+WCF 新手实例 象棋 在线演示 演示已更新到此节介绍:Silverlight+WCF 新手实例 象棋 介绍III(二十三) 本节连着Silverlight+WC ...

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

    在线演示地址:Silverlight+WCF 新手实例 象棋 在线演示 事隔几篇,我们又回到事件区,继续其它两个按钮事件,来张图吧: 在Silverlight+WCF 新手实例 象棋 主界面-事件区- ...

  9. Silverlight+WCF 新手实例 象棋 棋盘(二)

    2019独角兽企业重金招聘Python工程师标准>>> 1.先新建一个和棋子相关的类库 打开VS2010后->新建->项目->Silverlight类库,名称就定为 ...

  10. Silverlight+WCF 新手实例 象棋 棋子(三)

    2019独角兽企业重金招聘Python工程师标准>>> 棋盘上有棋子,棋子应该还有一些属性,按原始冲动新建一个棋子类. 上google翻译下棋子E文叫什么,查到了叫Chessman, ...

最新文章

  1. 我们如此努力,也不过是个普通人
  2. tensorflow源码编译教程_源码编译安装tensorflow 1.8
  3. 前端学习(1745):前端调试值之查看元素最终样式
  4. 人民邮电出版社与作者陈黎夫共同举办在线编辑、作者交流活动
  5. java-数组排序--插入排序
  6. “服务器发送了一个意外的数据包。received:3,expected:20“问题的解决方法
  7. Win11掉帧严重是怎么回事?Win11玩游戏掉帧的解决方法
  8. nicescroll参数
  9. mysql触发器trigger 实例详解
  10. arcgis伪节点检查_ARCGIS 拓扑检查步骤与修正拓扑错误技巧
  11. 装IDT声卡时总是说检测到的硬件不受此IDT软件程序包支持安装将终止
  12. 哈佛幸福课个人使用精华
  13. 必应 Bing 新特性之最新文章, Wolfram|Alpha 整合, 天气搜索等已推出
  14. 计算机型号或配置,新手必看电脑配置及型号含义速成!
  15. ImageJ自动批量多通道图片无损分离为单色荧光图
  16. 2022-03-15 工作记录--PHP-判断数组的长度 + 展示数组的长度
  17. C++/Qt:最小外接矩形
  18. 怎么用CDR将图片转换为JPG格式
  19. HTTP中常见的状态码代表的意思比如202、303、404、505、访问网络时有时经常见的状态,也是面试题中关于HTTP经常出现的
  20. PHP网页中转发到微信群中 代码,微信网页授权域名之通用中转域名

热门文章

  1. 【bzoj2199/Usaco2011 Jan】奶牛议会——2-sat
  2. ComponentOne 2016 年产品规划
  3. Android复习之冒泡排序
  4. VS2010下编译sqlite3
  5. BZOJ3711 : [PA2014]Druzyny
  6. js select 联动
  7. 从零开始react实战:云书签-1 react环境搭建
  8. Eclipes中AndbaseDemo 手动导入 Android studio
  9. SQLAlchemy介绍
  10. Redis之Pipeline使用注意事项