Silverlight+WCF 新手實例 象棋 棋子(三)

棋盤上有棋子,棋子應該還有一些屬性,按原始衝動新建一個棋子類。

上google翻譯下棋子E文叫什麼,查到了叫Chessman,於是對着項目右鍵添加一個Chessman.cs

 

複製代碼
  ///   <summary>
    
///  棋子類 by 路過秋天
    ///http://cyq1162.cnblogs.com/
    
///   </summary>
     public   class  Chessman
    {

    }
複製代碼

 

 

亂七八糟:

想了想,要畫棋子還是找圖片好,圖片也不是不好找,網上一搜還是有的,只是圖片啊,算了,還是畫棋子了,反正棋盤也是畫出來的。於是想了想怎麼畫,先畫一個圓圈,裏面再畫一個字。圓圈好說了,有個Ellipse類,設一下屬性就得了。畫字,於是又朝GDI+的方向想了,找什麼DrawString,飛了半天也找不到方向,沒辦法,最後塵埃落定到了TextBlock上了。

 

這棋子都要有什麼了,想了想,基本上得有的就是:

Name,有個名字,叫「兵」,「炮」,之類的名字

Color,不是紅就是黑色了

Radius,棋子半徑,這棋子總有個大小。

InitPoint,棋子的座標位置

MovePoint,棋子總得會移動,移動後的位置。

好了,在類裏敲入「prop"按兩下Tab鍵,寫好類型,按下Tab,起好名稱,回車,一個屬性就寫完了,繼續重複,於是有了以下代碼:

 

複製代碼
ExpandedBlockStart.gif
///   <summary>
    
///  棋子類
    
///   </summary>
     public   class  Chessman
    {
        
///   <summary>
        
///  棋子名稱
        
///   </summary>
         public   string  Name
        {
            
get ;
            
set ;
        }
        
///   <summary>
        
///  棋子顏色
        
///   </summary>
         public  Color Color
        {
            
get ;
            
set ;
        }
        
///   <summary>
        
///  棋子半徑
        
///   </summary>
         public   double  Radius
        {
            
get ;
            
set ;
        }
        
///   <summary>
        
///  棋子數組座標
        
///   </summary>
         public  Point InitPoint
        {
            
get ;
            
set ;
        }
        
///   <summary>
        
///  移動後數組座標
        
///   </summary>
         public  Point MovePoint
        {
            
get ;
            
set ;
        }
    }
複製代碼

 

我們再加個構造函數初始化一下屬性的數據

 

複製代碼
ExpandedBlockStart.gif
public  Chessman( double  x,  double  y,  double  radius, Color color,  string  name)
        {
            InitPoint 
=   new  Point(x, y);
            MovePoint 
=  InitPoint;
            Radius 
=  radius;
            Color 
=  color;
            Name 
=  name;
        }
複製代碼

 

好啦,我們要畫棋子了

參考下棋盤的畫法,我們新增加了兩個函數,一個Panel容器是要的了。DrawIn用於外部調用了。

 

複製代碼
ExpandedBlockStart.gif 代碼
Panel container;
        
public   void  DrawIn(Panel control)
        {
            container 
=  control;
            Draw();
        }
        
private   void  Draw()
        {
            
// 這裏實現畫啦
        }
複製代碼

 

怎麼畫怎麼畫,急啦啦。

想啦想,要畫一個圈,又要畫一個字,這兩個還得組合成一個。於是新建一個Canvas,再把兩個放到Canvas裏面。這樣把Canvas當成棋子。因爲棋子遲早是要移動的,你不能只移動個圓圈,或移動一個字吧。

好了,看下圓圈的代碼,基本就是賦些屬性了事了:

 

複製代碼
ExpandedBlockStart.gif
Ellipse elp  =   new  Ellipse()
            {
                 Width
= Radius * 2 ,
                 Height
= Radius * 2 ,
                 Stroke
= new  SolidColorBrush(Color),
                 Fill 
=   new  SolidColorBrush(Color),
                 Opacity
= 15
            };
複製代碼

 

好了,再看下文字的代碼,又是賦了一堆屬性值了事,那個margin值還真不好調的呢,對的不是很齊,將就點了:

 

複製代碼
ExpandedBlockStart.gif
TextBlock text  =   new  TextBlock()
            {
                TextAlignment 
=  TextAlignment.Center,
                Foreground 
=   new  SolidColorBrush(Colors.White),
                Text 
=  Name,
                FontFamily 
=   new  FontFamily( " 宋體 " ),
                FontSize 
=  Radius,
                FontWeight 
=  FontWeights.Bold,
                Margin 
=   new  Thickness(Radius  /   2   -   2 , Radius  /   2   -   2 0 0 )
            };
複製代碼

 

 

接下來要New一個Canvas,把它倆加進去,最後把棋子放到容器Panel裏

 

chessman  =   new  Canvas();
            chessman.Children.Add(elp);
            chessman.Children.Add(text);
            container.Children.Add(chessman);

 

chessman 的前面咋沒有Canvas,是寫少了?不是了,這裏是把它定義到外面去了,後面應該會用到。

public Canvas chessman;//棋子,這個定義在外面了。

 

到此,棋子類就差不多了,不過目前少了兩個重點。

1。就是棋子的位置,棋子的位置可以通過Margin屬性來調整,但目前我們先不寫,因爲要把原始座標轉成象素座標,

單獨的棋子類沒法完成這種事,所以留着,待下一篇我們新增加一個Chess象棋類來控制。

2。就是棋子被點擊的事件,下棋你總要先選中棋子的,不選中你就下不了。

這兩個重點我們留到下節再補。

 

我們到上篇New Board的地方下面再New Chessman一個棋子,看看效果。

在Silverlight應用程序的界面代碼:

 

複製代碼
ExpandedBlockStart.gif
  public   partial   class  MainPage : UserControl
    {
        
public  MainPage()
        {
            InitializeComponent();
            Board board 
=   new  Board();
            board.DrawIn(canvas1);
            Chessman chessman 
=   new  Chessman( 0 0 15 , Colors.Red,  " " );
            chessman.DrawIn(canvas1);

        }
    }
複製代碼

 

運行,看效果圖,一個棋子就出來了:

 

好了,打完收工。下節再完成重點棋子的位置及點擊事件。

版權聲明:本文原創發表於博客園,作者爲路過秋天,原文鏈接:

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