新手silverlight练习--五子棋( 二 )
2019獨(dú)角獸企業(yè)重金招聘Python工程師標(biāo)準(zhǔn)>>>
???????? 新一天又開始了,繼續(xù)上次的話題,講到哪里了呢:??? (這都忘記了,先拍一板磚)。。。
嘿嘿,想起來了,上次講到把棋盤做好了。那我們就繼續(xù),接著講棋子的設(shè)計。其實(shí)棋子比棋盤還簡單------------
設(shè)計思路:
1.簡單的定義它幾個屬性:
(1)棋子顏色(黑和白)Color
(2)棋子半徑? Radius
(3)棋子坐標(biāo)? Point
(4)棋子的標(biāo)記(0,1,2) ----到時候方便用來判斷(0表示沒有棋子,1表示黑棋,2表示白棋)Tag
2.做一個函數(shù):
此函數(shù)用來畫棋子,并把棋子放到棋盤上去。放到棋盤上去的方法,和上篇文章中把棋盤格子畫到棋盤上去的方法一樣,所以函數(shù)大概是這樣的:
?
代碼 ? /// ? <summary>???????? /// ?畫棋子
???????? /// ? </summary>
???????? public ? void ?DrowChessman(Canvas?container)
????????{
????????????Ellipse?el? = ? new ?Ellipse();??????????????????
????????????el.Fill? = ? new ?SolidColorBrush(CHcolor);???? // ?設(shè)置顏色
????????????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);
????????}
?
?
這個函數(shù)有一個形參,主要用來傳進(jìn)來上級容器,就是容納棋子的容器(棋盤) ,然后根據(jù)棋子本身屬性來設(shè)置顏色,大小等屬性。而
Canvas.SetLeft(el,Cpoint.X-300-CRadius);???//在棋盤中定位棋子
Canvas.SetTop(el,?Cpoint.Y-CRadius);
這兩個是用來定位在棋盤中棋子的,涉及到了屏幕坐標(biāo)和Canvas容器內(nèi)坐標(biāo)的關(guān)系轉(zhuǎn)換,下面我用圖示簡單講解下原理:
?
???? 現(xiàn)在我們要設(shè)置的是棋子在棋盤中的位置,我們以棋盤左上角的黑棋為例:
由于在之前進(jìn)行布局的時候,在一個Grid中分成了三列,棋盤是中間的一列,而它左邊的一列有300個單位,在進(jìn)行畫棋盤格子的時候我們當(dāng)初用MarginLeft設(shè)置為50,所以最邊上的豎線距離棋盤左邊邊緣50個單位。距離上邊緣30個單位。而現(xiàn)在我們是在Canvas中對它進(jìn)行定位,所以MarginLeft應(yīng)該為50-radius;而我們能得到的是我們鼠標(biāo)按下時候的屏幕坐標(biāo),在這個位置得到的x坐標(biāo)為350,通過Cpoint.X-300-radius=50-radius 就推算出屏幕坐標(biāo)與Canvas定位坐標(biāo)的關(guān)系。其實(shí),也可以這么想,假設(shè)當(dāng)整個棋盤充滿整個窗口的時候,我們得到的x坐標(biāo)就可以直接用來在Canvas中進(jìn)行定位,因為在Canvas中距離左邊緣的位子,就是等于距離窗口最左邊的位子。而現(xiàn)在,我們的Canvas相對于窗口向右邊移動了300個單位,所以當(dāng)我們得到屏幕坐標(biāo)后需要減去300個單位。而y坐標(biāo)也相同原理。
整個ChessMan類如下:
?
代碼 namespace ?ChessGame{
???? public ? class ?ChessMan
????{
???????
???????? /// ? <summary>
???????? /// ?棋子坐標(biāo)
???????? /// ? </summary>
???????? public ?Point?Cpoint?{? get ;? set ;?}
???????? /// ? <summary>
???????? /// ?棋子半徑
???????? /// ? </summary>
???????? public ? int ?CRadius?{? get ;? set ;?}
???????? /// ? <summary>
???????? /// ?棋子顏色
???????? /// ? </summary>
???????? public ?Color?CHcolor?{? get ;? set ;?}
???????? /// ? <summary>
???????? /// ???顏色標(biāo)記,便于操作
???????? /// ? </summary>
???????? public ? int ?tag?{? get ;? set ;?}
????????
??????? /// ? <summary>
??????? /// ?構(gòu)造函數(shù)
??????? /// ? </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類做好了,接下來繼續(xù)來做剩下的一個類,GameEnigin類--------
有了棋盤,棋子,是該下幾顆棋子了,那么就需要有個東西來控制下棋,這就是GameEnigin類的功能。這個類相比前面兩個就要復(fù)雜的多,不過先別怕,我們慢慢來完善它。其它先不管,做棋盤,棋子做那么辛苦,也不知道它們有沒有用,所以,我決定先在GameEnigin類中來控制下畫棋盤。棋子,暫時不考慮位置啊,坐標(biāo)啥的,先能把棋子放到棋盤上再說。
于是,就開始了。。。
? 先定義一個構(gòu)造函數(shù):
?
代碼 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()函數(shù)中加入代碼,如下:
?
public ?MainPage()????????{
????????????InitializeComponent();
????????????GameEnigin?ge = new ?GameEnigin(Board);
?????????}
?
好運(yùn)行下看看。。
運(yùn)氣不錯,成功了,今天就到這里,在下一篇中將講解黑白棋子的分別創(chuàng)建和屏幕坐標(biāo)與邏輯坐標(biāo)的轉(zhuǎn)換。
轉(zhuǎn)載于:https://my.oschina.net/u/1446855/blog/643482
新人創(chuàng)作打卡挑戰(zhàn)賽發(fā)博客就能抽獎!定制產(chǎn)品紅包拿不停!總結(jié)
以上是生活随笔為你收集整理的新手silverlight练习--五子棋( 二 )的全部內(nèi)容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: solr后台登录验证
- 下一篇: 【Android】ListView Vi