天天看點

Silverlight+WCF 新手執行個體 象棋 棋子定位與象棋類(四)

上節建立顯示了一顆棋子,由于沒有margin屬性,是以隻能靠邊站。

現在,我們建立一個象棋類,讓它包括棋盤和棋子,同時附加幾個常用函數。

還是對着Silverlight類庫項目右鍵添加類:Chess.cs

Silverlight+WCF 新手執行個體 象棋 棋子定位與象棋類(四)

/// <summary>

    /// 象棋 by 路過秋天

    /// </summary>

    public class Chess

    {

    }

Silverlight+WCF 新手執行個體 象棋 棋子定位與象棋類(四)

既然要包括象棋當然是要包括棋盤和棋子了,于是我們為之加兩個屬性,棋子有很多顆,是以用List清單。

Silverlight+WCF 新手執行個體 象棋 棋子定位與象棋類(四)
Silverlight+WCF 新手執行個體 象棋 棋子定位與象棋類(四)

 /// <summary>

        /// <summary>

        /// 棋子清單

        /// </summary>

        public List<Chessman> ChessmanList

        {

            get;

            set;

        }

        /// 棋盤

        public Board Board

Silverlight+WCF 新手執行個體 象棋 棋子定位與象棋類(四)

我們再将初始化棋盤的行為放到象棋裡來,于是增加一個初始棋盤的方法

裡面有個container呢,就是Panel容器了

Silverlight+WCF 新手執行個體 象棋 棋子定位與象棋類(四)

Panel container;//歸屬容器

        /// 初始化棋盤

        public void InitBoard()

            Board = new Board();

            Board.DrawIn(container);

Silverlight+WCF 新手執行個體 象棋 棋子定位與象棋類(四)

至于棋子嘛,太多了,不好弄啊。。。36顆棋子,顔色又不一樣,想for一下,沒規律啊,咋整。。。

難道直接複制36條了。。。-_-...

經過研究發現,棋子的數量有1,2,5三種,顔色隻有黑和紅,于是折騰出了這麼個建立的函數:

第一個參數傳數量了。分支裡,如果是2個的,位置對稱,是以[8-x]就OK,5個的,隔兩個位置一顆,于是就這麼出來了。

Silverlight+WCF 新手執行個體 象棋 棋子定位與象棋類(四)
Silverlight+WCF 新手執行個體 象棋 棋子定位與象棋類(四)

private void CreateChessman(int count,double x,double y,Color color,string name)

            if (count == 1)

            {

                Chessman chessmane = new Chessman(x, y, radius, color, name,this);

                ChessmanList.Add(chessmane);

            }

            if (count == 2)

                Chessman chessmane1 = new Chessman(x, y, radius, color, name, this);

                Chessman chessmane2 = new Chessman(8 - x, y, radius, color, name, this);

                ChessmanList.Add(chessmane1);

                ChessmanList.Add(chessmane2);

            else if (count == 5)

                for (int i = 0; i < 5; i++)

                {

                    Chessman chessmane = new Chessman(i * 2, y, radius, color, name, this);

                    ChessmanList.Add(chessmane);

                }

Silverlight+WCF 新手執行個體 象棋 棋子定位與象棋類(四)

注意:

1.參數裡還有棋子的半徑呢,是以呢,記得在外面再定義一個:

private int radius=15;//棋子半徑

2.在Chessman的構造函數裡,傳進了this自身對象,這是為了在棋子函數裡可以調用Chess的方法。

是以我們需要修改下上節的棋子的構造函數,新增加一個傳參:

Silverlight+WCF 新手執行個體 象棋 棋子定位與象棋類(四)

代碼

好了,現在開始建立黑棋的函數代碼相對簡潔了一點,這裡多了一個int[] y,用來幹什麼的?

本來啊,一開始是直接寫數字的,後來比較了下黑棋和紅棋的差別,就是這裡的不同,可以交換棋子是在上面還是在下面。

棋子弄好時,隻有兵 炮 上面一排或下面一排,其實就是隻有6條線上有棋子,而且總是對稱的。

Silverlight+WCF 新手執行個體 象棋 棋子定位與象棋類(四)
Silverlight+WCF 新手執行個體 象棋 棋子定位與象棋類(四)

private void CreateBlackChessman(int[] y)

            //黑色棋 将一個,士、象、車、馬、炮各兩個,卒五個

            CreateChessman(2, 0, y[0], Colors.Black, "車");

            CreateChessman(2, 1, y[0], Colors.Black, "馬");

            CreateChessman(2, 2, y[0], Colors.Black, "象");

            CreateChessman(2, 3, y[0], Colors.Black, "士");

            CreateChessman(2, 1, y[1], Colors.Black, "炮");

            CreateChessman(5, 0, y[2], Colors.Black, "卒");

            CreateChessman(1, 4, y[0], Colors.Black, "将");

Silverlight+WCF 新手執行個體 象棋 棋子定位與象棋類(四)

再看一下紅棋的建立函數,其實就一個樣,名字不同而已

Silverlight+WCF 新手執行個體 象棋 棋子定位與象棋類(四)
Silverlight+WCF 新手執行個體 象棋 棋子定位與象棋類(四)

 private void CreateRedChessman(int[] y)

            //紅色棋 帥一個,仕、相、車、馬、炮各兩個,兵五個

            CreateChessman(2, 0, y[0], Colors.Red, "車");

            CreateChessman(2, 1, y[0], Colors.Red, "馬");

            CreateChessman(2, 2, y[0], Colors.Red, "相");

            CreateChessman(2, 3, y[0], Colors.Red, "仕");

            CreateChessman(2, 1, y[1], Colors.Red, "炮");

            CreateChessman(5, 0, y[2], Colors.Red, "兵");

            CreateChessman(1, 4, y[0], Colors.Red, "帥");

Silverlight+WCF 新手執行個體 象棋 棋子定位與象棋類(四)

好了,現在可以寫出棋子初始化的函數了

Silverlight+WCF 新手執行個體 象棋 棋子定位與象棋類(四)
Silverlight+WCF 新手執行個體 象棋 棋子定位與象棋類(四)

        /// 初始化棋子

        public void InitChessman()

            int[] up = new[] { 0, 2, 3 };//棋子在上面

            int[] down = new[] { 9, 7, 6 }; //棋子在下面

            CreateBlackChessman(up);

            CreateRedChessman(down);

            ShowChessman();

        private void ShowChessman()

            foreach (Chessman chessmane in ChessmanList)

                chessmane.DrawIn(container);

Silverlight+WCF 新手執行個體 象棋 棋子定位與象棋類(四)

這裡就定義了棋子在上面還是下面了,換up和down換一下,棋子上下的位置也會發現變化,這裡我們以後再利用。

多了一個ShowChessman(),一個循環而已,抽出來放到函數裡了,不喜歡就把循環的代碼弄上去,再不喜歡就到

ChessmanList.Add(chessmane);的地方直接DrawIn一下,這樣就少了這個函數了。

OK,棋盤和棋子都有了。

增加個構造函數傳進入Panel先,還有執行個體化一個棋子清單,不然就報錯啦。

  public Chess(Panel control)

            container = control;

            ChessmanList = new List<Chessman>(32);

到界面裡調用一下看看效果,silghtlight應用程式的調用代碼要變一變了

Silverlight+WCF 新手執行個體 象棋 棋子定位與象棋類(四)
Silverlight+WCF 新手執行個體 象棋 棋子定位與象棋類(四)

public partial class MainPage : UserControl

        public MainPage()

            InitializeComponent();

            Chess chess = new Chess(canvas1);

            chess.InitBoard();

            chess.InitChessman();

Silverlight+WCF 新手執行個體 象棋 棋子定位與象棋類(四)

F5運作了,出來了。。

Silverlight+WCF 新手執行個體 象棋 棋子定位與象棋類(四)

yo~~隻看到一個帥,還不錯,挺帥的。。。

依呀喲,由于我們的原始坐标沒有和像素坐标進行轉換呢。

好了,在Chess類裡增加一個坐标雙向轉換的函數:

進階用法,本來是加多一個參數true或false來進行是像素-》坐标,還是坐标->像素的。

後來發現坐标x+y怎麼也比像素小,是以裡面加個判斷就搞定了。

裡面還要用到棋盤的一些屬性,是以方法放到這裡來,是比較合适的。

Silverlight+WCF 新手執行個體 象棋 棋子定位與象棋類(四)
Silverlight+WCF 新手執行個體 象棋 棋子定位與象棋類(四)

        /// 棋子坐标和實際像素交換

        public Point SwitchPixelArray(Point point)

            if (point.X + point.Y > 17)//最大值x=8,y=9,大于17則為像素 ,轉為數組

                return new Point(((point.X - Board.marginLeft) / Board.gap), ((point.Y - Board.marginTop) / Board.gap));

            //轉為坐标

            return new Point(point.X * Board.gap + Board.marginLeft, point.Y * Board.gap + Board.marginTop);

Silverlight+WCF 新手執行個體 象棋 棋子定位與象棋類(四)

好了,回到之前的棋子類的Draw函數裡,為Canvas增加一個Margin屬性了。

Silverlight+WCF 新手執行個體 象棋 棋子定位與象棋類(四)
Silverlight+WCF 新手執行個體 象棋 棋子定位與象棋類(四)

 private void Draw()

            //這裡實作畫啦

            Ellipse elp = new Ellipse()

                Width = Radius * 2,

                Height = Radius * 2,

                Stroke = new SolidColorBrush(Color),

                Fill = new SolidColorBrush(Color),

                Opacity = 15

            };

            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)

            chessman = new Canvas();

            Point pixel = Parent.SwitchPixelArray(InitPoint);//新加的一行

            chessman.Margin = new Thickness(pixel.X - Radius, pixel.Y - Radius, 0, 0);//新加的一行

            chessman.Children.Add(elp);

            chessman.Children.Add(text);

            container.Children.Add(chessman);

Silverlight+WCF 新手執行個體 象棋 棋子定位與象棋類(四)

好了,現在重新運作,F5,看到效果圖如下:

Silverlight+WCF 新手執行個體 象棋 棋子定位與象棋類(四)

好了,棋子終于全部塵埃落地了。

版權聲明:本文原創發表于部落格園,作者為路過秋天,原文連結:

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

繼續閱讀