中国象棋-开篇

  最近刚看了设计模式,学了就想用,顺便在总结和实战中提升自己,就做了个象棋。实现了单机热座和联网对战功能,至于人工智能,实在想不出来,若哪位前辈大哥能指点一二,感激不尽。下面先说说整体思路:

  象棋三要素:棋子、棋盘、棋手。

  棋子有很多种,帅啊车啊什么的,还有红的和黑的两派,他们虽各具特色,但又有很多共同点。所以我设计了一个超类,让这些棋子继承他,每个子都有一样的属性,名字啊,图片路径啊,位置啊,上一步啊等等,这些每个子都有,只是赋值不同罢了,还有不同的方法,比如马走日象飞田,这些移动上的都是不同的,所以我写了一个虚方法,让他们override,谁该怎么走就怎么走,谁也碍不着谁。下面把这个超类的代码摆上

  #region 棋子的基类
    [Serializable]
    public class Chess
    {
        public string ChessName { get; set; }
        public SoundPlay soundPlayer = new SoundPlay();
        public Point Location { get; set; }
        public Point LastLocation { get; set; }
        public string ImgSrc { get; set; }
        public Chess(string ChessName, Point Location)
        {
            this.ChessName = ChessName;
            this.Location = Location;
            this.ImgSrc = AppDomain.CurrentDomain.BaseDirectory + @"/images/" + ChessName + ".png";
        }
        public bool Move(Point destination, ref List<Chess> chessList, ref bool rollbackNeed, ref Chess deadChess)
        {
            
        }
        protected virtual bool RouteProtocol(Point Location, Point destination, ref List<Chess> chessList, ref bool rollbackNeed, ref Chess deadChess)
        {
            
        }
        protected virtual void IsMurderGeneral(Point destination, List<Chess> chessList)
        {
        }
        protected bool CheckRollBack(Point Location, Point destination, ref List<Chess> chessList, ref Chess deadChess)
        {
            
        }
        protected bool IsAlly(Point destination, List<Chess> chessList, ChessCamp chessCamp)
        {
            
        }

        protected void GeneralMurder(List<Chess> chessList)
        {

        }
    }
    #endregion

  里面有一些方法刚才没提到,后面会细讲,这里不多说了

  再说说棋盘,棋盘分为了90块,棋盘虽说是静态的,但考虑到后面棋子移动后,需要重绘棋子上一步的地方,所以把棋盘分为了90块,每一块就是一个棋子可以落子的位置。每走一步都要重绘棋子上一步的位置和棋子落子的位置。这里是对背景初始化,就是画棋盘,这里省略了画棋盘的代码,大概思路就是先画到一个bmp上,然后按棋盘drawLine就可以了,另外把棋盘的每一块也都存储了下来,以备后续使用

 private void backgroundPanel_Paint(object sender, PaintEventArgs e)
        {
            Graphics g = e.Graphics;
            g.DrawImage(initialChess.DrawChessBoard(), new Point(boardLeftEdge, boardTopEdge));
            cellBmp = initialChess.CellBmp;
            turnBmp = initialChess.TurnBmp;
            this.startX = initialChess.StartX - width / 2;
            this.startY = initialChess.StartY - width / 2;
        }

 

  最后,就是棋手了,说是棋手,其实就是对鼠标点击事件的控制。在此我获取了mouse_down事件

 private void panel1_MouseDown(object sender, MouseEventArgs e)
        {
            if (e.X > startX + boardLeftEdge && e.X < startX + 9 * width + boardLeftEdge && e.Y > boardTopEdge + startY && e.Y < boardTopEdge + startY + 11 * width)
            {
                int newStartX = (e.X - (startX + boardLeftEdge)) / width;
                int newStartY = (e.Y - (startY + boardTopEdge)) / width;
                Point mousePoint = new Point(newStartX, newStartY);
                g = panel1.CreateGraphics();
                if (isChessSelected)
                {
                   //棋子移动

                    if (isMoved)
                    {
                        AfterMove();
                    }
                }
                else
                {
                    SelectChess(mousePoint, gameModels);
                }
            }
        }

  AfterMove和SelectChess从字面上也能看出来,一个是后续的处理,一个是选棋子。具体的先不讲了。

  大概就是这么个思路,当然实现起来还需要一些工作,今天先弄到这吧,欢迎各位吐槽,批评指点,小弟一定虚心接受

posted @ 2015-11-30 20:33  刘小白2011  阅读(431)  评论(0)    收藏  举报