zoukankan      html  css  js  c++  java
  • Silverlight+WCF 新手实例 象棋 该谁下棋A下B停(二十八)

    在线演示地址: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一直信停。

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

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

    版权声明:本文原创发表于 博客园,作者为 路过秋天 本文欢迎转载,但未经作者同意必须保留此段声明,且在文章页面明显位置给出原文连接,否则视为侵权。
    个人微信公众号
    创业QQ群:617713515
    Donation(扫码支持作者):支付宝:
    Donation(扫码支持作者):微信:
  • 相关阅读:
    执行插件的替代方式:用JS调用操作
    查找字段的筛选-使用addCustomView
    Dynamics CRM 中Web API中的深度创建(Deep Insert)
    使用JS通过Web API执行批量操作,多个操作是一个事务!
    使用Dynamics 365 CE Web API查询数据加点料及选项集字段常用查询
    配置Postman通过OAuth 2 implicit grant获取Dynamics 365 CE Online实例的Access Token
    Dynamics 365 Customer Engagement中使用JavaScript和C#调用操作Action示例
    Dynamics 365 We API ODATA语法根据父记录查询子记录,根据子记录查询父记录(附上根据团队,队列名称查成员)
    Dynamics 365 Online通过OAuth 2 Client Credential授权(Server-to-Server Authentication)后调用Web API
    控制台程序(C#)不弹出登录窗口连接到Dynamics CRM Online的Web API
  • 原文地址:https://www.cnblogs.com/cyq1162/p/1786605.html
Copyright © 2011-2022 走看看