新手silverlight練習--五子棋( 二 )

         新一天又開始了,繼續上次的話題,講到哪裏了呢:?   (這都忘記了,先拍一板磚)。。。ide

嘿嘿,想起來了,上次講到把棋盤作好了。那咱們就繼續,接着講棋子的設計。其實棋子比棋盤還簡單------------函數

設計思路:佈局

1.簡單的定義它幾個屬性:測試

(1)棋子顏色(黑和白)Colorspa

(2)棋子半徑  Radius設計

(3)棋子座標  Pointcode

(4)棋子的標記(0,1,2) ----到時候方便用來判斷(0表示沒有棋子,1表示黑棋,2表示白棋)Tagblog

2.作一個函數:ip

此函數用來畫棋子,並把棋子放到棋盤上去。放到棋盤上去的方法,和上篇文章中把棋盤格子畫到棋盤上去的方法同樣,因此函數大概是這樣的:get

 

代碼
  ///   <summary>
        
///  畫棋子
        
///   </summary>
         public   void  DrowChessman(Canvas container)
        {

            Ellipse el 
=   new  Ellipse();                  
            el.Fill 
=   new  SolidColorBrush(CHcolor);     //  設置顏色
            el.Width  =  CRadius  *   2 ;
            el.Height 
=  CRadius  *   2 ;
            
            container.Children.Add(el);
            Canvas.SetLeft(el,Cpoint.X
- 300 - CRadius);    // 在棋盤中定位棋子
            Canvas.SetTop(el, Cpoint.Y - CRadius);
        }

 

 

這個函數有一個形參,主要用來傳進來上級容器,就是容納棋子的容器(棋盤) ,而後根據棋子自己屬性來設置顏色,大小等屬性。而

Canvas.SetLeft(el,Cpoint.X-300-CRadius);   //在棋盤中定位棋子
Canvas.SetTop(el, Cpoint.Y-CRadius);
這兩個是用來定位在棋盤中棋子的,涉及到了屏幕座標和Canvas容器內座標的關係轉換,下面我用圖示簡單講解下原理:

 

     如今咱們要設置的是棋子在棋盤中的位置,咱們以棋盤左上角的黑棋爲例:

因爲在以前進行佈局的時候,在一個Grid中分紅了三列,棋盤是中間的一列,而它左邊的一列有300個單位,在進行畫棋盤格子的時候咱們當初用MarginLeft設置爲50,因此最邊上的豎線距離棋盤左邊邊緣50個單位。距離上邊緣30個單位。而如今咱們是在Canvas中對它進行定位,因此MarginLeft應該爲50-radius;而咱們能獲得的是咱們鼠標按下時候的屏幕座標,在這個位置獲得的x座標爲350,經過Cpoint.X-300-radius=50-radius 就推算出屏幕座標與Canvas定位座標的關係。其實,也能夠這麼想,假設當整個棋盤充滿整個窗口的時候,咱們獲得的x座標就能夠直接用來在Canvas中進行定位,由於在Canvas中距離左邊緣的位子,就是等於距離窗口最左邊的位子。而如今,咱們的Canvas相對於窗口向右邊移動了300個單位,因此當咱們獲得屏幕座標後須要減去300個單位。而y座標也相同原理。

整個ChessMan類以下:

 

代碼
namespace  ChessGame
{
    
public   class  ChessMan
    {
       
        
///   <summary>
        
///  棋子座標
        
///   </summary>
         public  Point Cpoint {  get set ; }
        
///   <summary>
        
///  棋子半徑
        
///   </summary>
         public   int  CRadius {  get set ; }
        
///   <summary>
        
///  棋子顏色
        
///   </summary>
         public  Color CHcolor {  get set ; }

        
///   <summary>
        
///    顏色標記,便於操做
        
///   </summary>

        
public   int  tag {  get set ; }

        



       
///   <summary>
       
///  構造函數
       
///   </summary>
       
///   <param name="pt"></param>
       
///   <param name="radius"></param>
       
///   <param name="color"></param>
         public  ChessMan()
        {
            tag 
=   0 ;
        }
        
public  ChessMan(Point pt,  int  radius, Color color, int  x)
        {
            CRadius 
=  radius;
            Cpoint 
=  pt;
            CHcolor 
=  color;
            tag 
=  x;
        }

        
///   <summary>
        
///  畫棋子
        
///   </summary>
         public   void  DrowChessman(Canvas container)
        {

            Ellipse el 
=   new  Ellipse();
            el.Fill 
=   new  SolidColorBrush(CHcolor);
            el.Width 
=  CRadius  *   2 ;
            el.Height 
=  CRadius  *   2 ;
            
            container.Children.Add(el);
            Canvas.SetLeft(el,Cpoint.X
- 300 - CRadius);
            Canvas.SetTop(el, Cpoint.Y
- CRadius);
        }
       
    }
}

 

ChessMan類作好了,接下來繼續來作剩下的一個類,GameEnigin類--------

有了棋盤,棋子,是該下幾顆棋子了,那麼就須要有個東西來控制下棋,這就是GameEnigin類的功能。這個類相比前面兩個就要複雜的多,不過先別怕,咱們慢慢來完善它。其它先無論,作棋盤,棋子作那麼辛苦,也不知道它們有沒有用,因此,我決定先在GameEnigin類中來控制下畫棋盤。棋子,暫時不考慮位置啊,座標啥的,先能把棋子放到棋盤上再說。

因而,就開始了。。。

  先定義一個構造函數:

 

代碼
public  GameEnigin(Panel control)
        {
            
            ChessBoard cb 
=   new  ChessBoard(control);
            cb.DrawBoard();
            ChessMan ce
= new  ChessMan( new  Point( 350 , 28 ),radius,Colors.Black, 1 );
            ce.DrowChessman(Board);
         }
             

 

完工。。。。

等等,這邊還有個radius(棋子半徑)沒定義,因此在GameEnigin類中定義radius=15;

這樣,GameEnigin類就是這個樣子了:

 

代碼
namespace  ChessGame
{
    
public   class  GameEnigin
    {
        
int  radius  =   15 ;


   
public  GameEnigin(Panel control)
        {
            
            ChessBoard cb 
=   new  ChessBoard(control);
            cb.DrawBoard();
            ChessMan ce
= new  ChessMan( new  Point( 350 , 28 ),radius,Colors.Black, 1 );
            ce.DrowChessman(Board);
         }
             
}
}

 

 

接下來,咱們就開始測試吧;打開MainPage.xaml.cs文件,

在MainPage()函數中加入代碼,以下:

 

public  MainPage()
        {
            InitializeComponent();
            GameEnigin ge
= new  GameEnigin(Board);
         }

 

好運行下看看。。

運氣不錯,成功了,今天就到這裏,在下一篇中將講解黑白棋子的分別建立和屏幕座標與邏輯座標的轉換。

相關文章
相關標籤/搜索