新手silverlight练习--五子棋( 二 )
2019獨角獸企業重金招聘Python工程師標準>>>
???????? 新一天又開始了,繼續上次的話題,講到哪里了呢:??? (這都忘記了,先拍一板磚)。。。
嘿嘿,想起來了,上次講到把棋盤做好了。那我們就繼續,接著講棋子的設計。其實棋子比棋盤還簡單------------
設計思路:
1.簡單的定義它幾個屬性:
(1)棋子顏色(黑和白)Color
(2)棋子半徑? Radius
(3)棋子坐標? Point
(4)棋子的標記(0,1,2) ----到時候方便用來判斷(0表示沒有棋子,1表示黑棋,2表示白棋)Tag
2.做一個函數:
此函數用來畫棋子,并把棋子放到棋盤上去。放到棋盤上去的方法,和上篇文章中把棋盤格子畫到棋盤上去的方法一樣,所以函數大概是這樣的:
?
代碼 ? /// ? <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);
?????????}
?
好運行下看看。。
運氣不錯,成功了,今天就到這里,在下一篇中將講解黑白棋子的分別創建和屏幕坐標與邏輯坐標的轉換。
轉載于:https://my.oschina.net/u/1446855/blog/643482
新人創作打卡挑戰賽發博客就能抽獎!定制產品紅包拿不停!總結
以上是生活随笔為你收集整理的新手silverlight练习--五子棋( 二 )的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: solr后台登录验证
- 下一篇: java中的foreach用法及总结