Silverlight+WCF 新手实例 象棋 棋手颜色(二十九)

    xiaoxiao2022-07-08  163

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

     

    在上一节Silverlight+WCF 新手实例 象棋 该谁下棋-A下B停(二十八),我们在最后聊天对话中看到,双方棋手用的竟然都是红色,这个......

    这节,我们来让双方使用不同的颜色下棋:

     

    我们通过什么来决定棋手的颜色?其实,Player玩家属性里,不就有一个ColorValue么,有了这个,一切就好办了。

    我们回到Chess象棋类里,增加一个属性,玩家颜色,同时,扩展一下构造函数,增加传参:

      ///   <summary>      ///  象棋 by 路过秋天      ///   http://cyq1162.cnblogs.com      ///   </summary>      public   class  Chess     {          ///   <summary>          ///  玩家的棋子颜色          ///   </summary>          public  Color PlayerColor         {              get ;              set ;         }          // ...省略其它属性...           public  Chess(Panel control,Color playerColor)         {             PlayerColor  =  playerColor;             // ...省略其它赋值属性...         }                    // ...省略其它N行代码... }

     

    增加的代码就两行,是相当的简洁的,有了个家玩家属性,那我们在哪实现玩家颜色变化的呢?

    看,我们回到了初始化棋子的地方,只是增加了一个if语句,只有if语句的才是新增加的哦。轻松搞定了:

      ///   <summary>          ///  初始化棋子          ///   </summary>          public   void  InitChessman()         {              int [] up  =   new [] {  0 2 3  }; // 棋子在上面              int [] down  =   new [] {  9 7 6  };  // 棋子在下面              if  (PlayerColor  ==  Colors.Black) // 这里是新增加的             {                  // 黑色在下                 up  =   new [] {  9 7 6  };               down  =   new [] {  0 2 3  };             }             CreateBlackChessman(up);             CreateRedChessman(down);             ShowChessman();         }

     

    当然了,那个if语句其实就是交换数组了,这里用最简单的方式实现了:"那个,不用第三个变量,怎么实现两值的交换的问题"。

     

    构造函数发生变化了,我们要回到实例化Chess类的地方Chess.xaml.cs,多传一个参数:

    由于玩家只有颜色值,我们要把它变成颜色Color,所以多了一个转换函数。

     

      public   partial   class  Chess : UserControl     {         ChessNewInstance.Chess chess; // 这里我们同时把它提到全局对象          public  Chess()         {             InitializeComponent();             chess  =   new  ChessNewInstance.Chess(canvasRoot,GetColor(App.player.ColorValue)); // 就这里变化了             chess.InitBoard();             chess.InitChessman();             canvasRoot.Width  =  chess.Board.Width;             canvasRoot.Height  =  chess.Board.Height;             App.chess  =  chess; // 为全局对象赋值         }          private  Color GetColor( int  colorVallue)         {              switch  (colorVallue)             {                  case   1 :                      return  Colors.Red;                  case   2 :                      return  Colors.Black;                  default :                      return  Colors.Blue;             }         }     }

     

     

    大伙别问我为什么:“为啥构造函数里不直接传颜色值,而要传Color呢,这样还得转换啊“,这么复杂的问题。

    其实呢,这个问题是有由来的,这里就简单说一下:

    在一开始呢,我在定义Player属性的时候,是定义Color来传递的,可是最后发现:

    WCF里的Color是在System.Drawing下

    Silverlight里的Color是在System.Windows.Media下

    所以,把Color从WCF往Silverlight里传,直接赋值就会出现问题了,所以呢,就换了ColorValue来传递了

    这下大伙明白了吧。

     

    好了,代码写完了,非常非常的简短吧,F5运行看效果了:

     

    看到效果了吧,这下双方所用的颜色就一红一黑了。

    OK, 本节打完收工!

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

    http://www.cnblogs.com/cyq1162/archive/2010/07/28/1786726.html

    相关资源:敏捷开发V1.0.pptx
    最新回复(0)