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,起好名称,回车,一个属性就写完了,继续重复,于是有了以下代码:

 


/// <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;
        }
    }

 

我们再加个构造函数初始化一下属性的数据

 


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用于外部调用了。

 


代码

Panel container;
        public void DrawIn(Panel control)
        {
            container = control;
            Draw();
        }
        private void Draw()
        {
            //这里实现画啦
        }

 

怎么画怎么画,急啦啦。

想啦想,要画一个圈,又要画一个字,这两个还得组合成一个。于是新建一个Canvas,再把两个放到Canvas里面。这样把Canvas当成棋子。因为棋子迟早是要移动的,你不能只移动个圆圈,或移动一个字吧。

好了,看下圆圈的代码,基本就是赋些属性了事了:

 


Ellipse elp = new Ellipse()
            {
                 Width=Radius*2,
                 Height=Radius*2,
                 Stroke=new SolidColorBrush(Color),
                 Fill = new SolidColorBrush(Color),
                 Opacity=15
            };

 

好了,再看下文字的代码,又是赋了一堆属性值了事,那个margin值还真不好调的呢,对的不是很齐,将就点了:

 


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应用程序的界面代码:

 


 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

时间: 2024-10-18 11:28:15

Silverlight+WCF 新手实例 象棋 棋子(三)的相关文章

Silverlight+WCF 新手实例 象棋 棋子移动-规则补充(三十七)

在线演示地址:Silverlight+WCF 新手实例 象棋 在线演示   在Silverlight+WCF 新手实例 象棋 棋子移动-规则[附加上半盘限制](十)中,由Silenus-G提出规则还有点bug: 红车竟然可以走到红马的地盘:这是由于鼠标点在棋子之外的地方时,我们产生的是棋子移动[不是吃子],而在移动之时,我们又没有判断要移动到的位置上是不是有其它棋子从而引发了经济纠纷.因此,解决这个问题,我们只需在点击事件里增加一下判断棋子存不存在就可以了. 而在移动的规则里,这节我们同时进行补

Silverlight+WCF 新手实例 象棋 棋子移动-规则[附加上半盘限制](十)

上上一节,我们对棋子的下半盘棋子做了所有的规则限制,因为我们下棋的总是用下半盘的棋子来下,总没人用上半盘棋来下那么高境界的吧. 不过这节简单追加点代码,让那些企图高境界的人士可以临时性的自己和自己下. 好了,要为上半盘棋子也做限制,所以我们要知道棋子是归属于上半盘还是下半盘的,这里,我们为棋子类Chessman增加一个属性,IsUp,是否上半盘棋,反之就下半盘了.初始为该属性赋值也相当的简单:  /// <summary>         /// 棋子默认在上半盘/反之在下半盘        

Silverlight+WCF 新手实例 象棋 棋子定位与象棋类(四)

上节创建显示了一颗棋子,由于没有margin属性,所以只能靠边站. 现在,我们创建一个象棋类,让它包括棋盘和棋子,同时附加几个常用函数. 还是对着Silverlight类库项目右键添加类:Chess.cs /// <summary>     /// 象棋 by 路过秋天     /// </summary>    public class Chess     {     }   既然要包括象棋当然是要包括棋盘和棋子了,于是我们为之加两个属性,棋子有很多颗,所以用List列表.  /

Silverlight+WCF 新手实例 象棋 棋子移动-吃子(五)

上一节,我们的棋子就是一个Canvas,里面add进了一个Ellipse圆圈和TextBlock字 想想我们是怎么下棋的,要先选中棋子吧,选中后,随便找个地方点,棋就会自动移过去. 所以,这里就产生了两件事,一是选中,二是移动. 要选中,其实就是选中棋子,选中棋子就是选中Canvas了. 于是,我们为Canvas增加一个鼠标点击事件. 让我们回到棋子类Chessman的Draw方法里,为chessman添加一个MouseLeftButtonDown事件,于是代码变成了    private vo

Silverlight+WCF 新手实例 象棋 棋子移动-规则[将、马、士、相、炮](八)

这节来完成剩下五个种子的规则. 先来将吧 将:只能走一步,而且只能在九宫内行走 看代码,还是和兵的一个样. if (Math.Abs(y2 - y1) + Math.Abs(x2 - x1) != 1)//只能走一步                        {                             break;                         }   下面限制九宫内判断: if (2 < x2 && x2 < 6 && y

Silverlight+WCF 新手实例 象棋 棋子移动-线交叉点(六)

上一节,我们给棋子赋于了鼠标点击事件,并通过故事板Storyboard 来移动棋子,同时实现了吃棋子. 现在我们在实现鼠标在棋盘上点击,然后棋子就移动到那去. 好了,鼠标在棋盘上点击,这里要为点击的棋盘,其实就是最外面那个Panel容器啦,还是加上一个MouseLeftButtonDown事件. 我们回到Chess类,因为这里是第一手Canvas传进来的地方,我们在Chess的构造函数里,为Panel添加这一事件    public Chess(Panel control)         {

Silverlight+WCF 新手实例 象棋 棋子移动-规则[兵、车](七)

上两节实现了棋子的两种走法,吃子和没移动到线交叉点.不过我们都是没有规则的走,这节为棋子的走法增加规则,棋的规则我就不多说了,基本要找个不会下象棋的很难,就是找到的估计也不会看这文章.   当我们移动棋子的时候,总是要判断一下移动是不是合规则的,合规则的才让下,不合规则的就不能下了,什么马象田马日车炮跑,将军卫士陷九宫,[本人涅造句子]之类的. 好了,原始冲动,新建棋子规则类,也是本棋子裤的最后一个类了: 对着项目内裤右键->添加类->输入:ChessRule.cs. /// <summ

Silverlight+WCF 新手实例 象棋 主界面-事件区-游戏开始(二十七)

本专题出产简单原由: 一开始的初衷,只是想写个简单的单机BS人机对战版的,开始还下了点AI算法看看的: 但是写到最后,都写成了通讯版本的对战了,只因中间不小心看到了WCF的相关内容,顺便加了进来; 最后就定局了,反正新手实例,能加多点内容就加多点了. 关于原始初衷,后期再补上了.       好了,先上几个附加索引: 1:Silverlight+WCF 新手实例 象棋 在线演示 2:Silverlight+WCF 简单部署问题集 3:Silverlight4 ListBox bug 4:Silv

Silverlight+WCF 新手实例 象棋 主界面-棋谱-获取列表(三十八)

在线演示地址:Silverlight+WCF 新手实例 象棋 在线演示   在Silverlight+WCF 新手实例 象棋 主界面-棋谱-布局写谱(三十六)中,我们完成下棋双方的棋谱显示,这节,我们为观众增加棋子列表: 观众进入房间后,第一时间当然也要获取棋步列表了,不然进来干麻呢?你当这是聊天室啊,光聊天不看棋.   首先,当然是要在服务端添加一个获取棋步列表的接口方法了: WCF服务端,IService.cs:  /// <summary>     /// 服务端方法接口 by 路过秋天