C# 俄罗斯方块的实现

步骤一:定义一个单个方块的类
internal class CDrawRectangle : IDisposable
    {
        public int p_x = CCommon.X;
        public int p_y = CCommon.Y;
        public int p_h = CCommon.H;
        public int p_w = CCommon.W;
        public Brush b = Brushes.Blue;
        public Pen p = Pens.White;
        private Panel p_g = null;
        public bool p_delete = false;
        public Button p_btn = new Button();

        public CDrawRectangle(Panel p, int x, int y, int h, int w)
        {
            p_x = x;
            p_y = y;
            p_h = h;
            p_w = w;
            p_g = p;
        }

        public CDrawRectangle(Panel p)
        {
            p_g = p;
        }

        public void DrawRectangle()
        {
            p_btn.Location = new Point(p_x, p_y);
            p_btn.Size = new Size(p_h, p_w);
            if (!p_g.Controls.Contains(p_btn))
            {
                p_g.Controls.Add(p_btn);
            }
        }

        public void Dispose()
        {
            p_btn.Dispose();
            b.Dispose();
        }
    }
步骤二:定义7中图形的类
class CDrawRectangleBase : IDrawRectangle,IDisposable
    {
        #region 变量定义
        private int p_x = CCommon.X;
        private int p_y = CCommon.Y;
        private int p_h = CCommon.H;
        private int p_w = CCommon.W;
        private Panel p_g = null;
        private CDrawRectangle cdr1 = null;
        private CDrawRectangle cdr2 = null;
        private CDrawRectangle cdr3 = null;
        private CDrawRectangle cdr4 = null;
        private int p_IType = 1;
        private int iChangeFlag = 0;
        #endregion

        #region 属性
        public CDrawRectangle Cdr1
        {
            get { return cdr1; }
            set { cdr1 = value; }
        }

        public CDrawRectangle Cdr2
        {
            get { return cdr2; }
            set { cdr2 = value; }
        }
        public CDrawRectangle Cdr3
        {
            get { return cdr3; }
            set { cdr3 = value; }
        }

        public CDrawRectangle Cdr4
        {
            get { return cdr4; }
            set { cdr4 = value; }
        }
        #endregion

        #region CDrawRectangleBase
        /// <summary>
        /// CDrawRectangleChangTiao
        /// </summary>
        /// <param name="g"></param>
        public CDrawRectangleBase(Panel p, int iType)
        {
            p_g = p;
            p_IType = iType;
            Initalize();
        }

        public CDrawRectangleBase(Panel p, int x, int y, int iType)
        {
            p_g = p;
            p_IType = iType;
            p_x = x;
            p_y = y;
            Initalize();
        }
        #endregion

        #region Initalize
        /// <summary>
        /// Initalize
        /// </summary>
        private void Initalize()
        {
            switch (p_IType)
            {
                case 1:
                    //changtiao
                    cdr1 = new CDrawRectangle(p_g, p_x, p_y, p_h, p_w);
                    cdr2 = new CDrawRectangle(p_g, p_x, p_y + CCommon.SIZE, p_h, p_w);
                    cdr3 = new CDrawRectangle(p_g, p_x, p_y + 2 * CCommon.SIZE, p_h, p_w);
                    cdr4 = new CDrawRectangle(p_g, p_x, p_y + 3 * CCommon.SIZE, p_h, p_w);
                    cdr1.p_btn.BackColor = Color.Red;
                    cdr2.p_btn.BackColor = Color.Red;
                    cdr3.p_btn.BackColor = Color.Red;
                    cdr4.p_btn.BackColor = Color.Red;
                    break;
                case 2:
                    //FanL
                    cdr1 = new CDrawRectangle(p_g, p_x, p_y, p_h, p_w);
                    cdr2 = new CDrawRectangle(p_g, p_x, p_y + CCommon.SIZE, p_h, p_w);
                    cdr3 = new CDrawRectangle(p_g, p_x, p_y + 2 * CCommon.SIZE, p_h, p_w);
                    cdr4 = new CDrawRectangle(p_g, p_x - CCommon.SIZE, p_y + 2 * CCommon.SIZE, p_h, p_w);
                    cdr1.p_btn.BackColor = Color.BurlyWood;
                    cdr2.p_btn.BackColor = Color.BurlyWood;
                    cdr3.p_btn.BackColor = Color.BurlyWood;
                    cdr4.p_btn.BackColor = Color.BurlyWood;
                    break;
                case 3:
                    //FanZ
                    cdr1 = new CDrawRectangle(p_g, p_x, p_y, p_h, p_w);
                    cdr2 = new CDrawRectangle(p_g, p_x, p_y + CCommon.SIZE, p_h, p_w);
                    cdr3 = new CDrawRectangle(p_g, p_x - CCommon.SIZE, p_y + CCommon.SIZE, p_h, p_w);
                    cdr4 = new CDrawRectangle(p_g, p_x - CCommon.SIZE, p_y + 2 * CCommon.SIZE, p_h, p_w);
                    cdr1.p_btn.BackColor = Color.Yellow;
                    cdr2.p_btn.BackColor = Color.Yellow;
                    cdr3.p_btn.BackColor = Color.Yellow;
                    cdr4.p_btn.BackColor = Color.Yellow;
                    break;
                case 4:
                    //shan
                    cdr1 = new CDrawRectangle(p_g, p_x - CCommon.SIZE, p_y + CCommon.SIZE, p_h, p_w);
                    cdr2 = new CDrawRectangle(p_g, p_x, p_y + CCommon.SIZE, p_h, p_w);
                    cdr3 = new CDrawRectangle(p_g, p_x + CCommon.SIZE, p_y + CCommon.SIZE, p_h, p_w);
                    cdr4 = new CDrawRectangle(p_g, p_x, p_y, p_h, p_w);
                    cdr1.p_btn.BackColor = Color.Magenta;
                    cdr2.p_btn.BackColor = Color.Magenta;
                    cdr3.p_btn.BackColor = Color.Magenta;
                    cdr4.p_btn.BackColor = Color.Magenta;
                    break;
                case 5:
                    //Tian
                    cdr1 = new CDrawRectangle(p_g, p_x, p_y, p_h, p_w);
                    cdr2 = new CDrawRectangle(p_g, p_x + CCommon.SIZE, p_y, p_h, p_w);
                    cdr3 = new CDrawRectangle(p_g, p_x, p_y + CCommon.SIZE, p_h, p_w);
                    cdr4 = new CDrawRectangle(p_g, p_x + CCommon.SIZE, p_y + CCommon.SIZE, p_h, p_w);
                    cdr1.p_btn.BackColor = Color.Green;
                    cdr2.p_btn.BackColor = Color.Green;
                    cdr3.p_btn.BackColor = Color.Green;
                    cdr4.p_btn.BackColor = Color.Green;
                    break;
                case 6:
                    //ZhengL
                    cdr1 = new CDrawRectangle(p_g, p_x, p_y, p_h, p_w);
                    cdr2 = new CDrawRectangle(p_g, p_x, p_y + CCommon.SIZE, p_h, p_w);
                    cdr3 = new CDrawRectangle(p_g, p_x, p_y + 2 * CCommon.SIZE, p_h, p_w);
                    cdr4 = new CDrawRectangle(p_g, p_x + CCommon.SIZE, p_y + 2 * CCommon.SIZE, p_h, p_w);
                    cdr1.p_btn.BackColor = Color.Orange;
                    cdr2.p_btn.BackColor = Color.Orange;
                    cdr3.p_btn.BackColor = Color.Orange;
                    cdr4.p_btn.BackColor = Color.Orange;
                    break;
                case 7:
                    //ZhengZ
                    cdr1 = new CDrawRectangle(p_g, p_x, p_y, p_h, p_w);
                    cdr2 = new CDrawRectangle(p_g, p_x, p_y + CCommon.SIZE, p_h, p_w);
                    cdr3 = new CDrawRectangle(p_g, p_x + CCommon.SIZE, p_y + CCommon.SIZE, p_h, p_w);
                    cdr4 = new CDrawRectangle(p_g, p_x + CCommon.SIZE, p_y + 2 * CCommon.SIZE, p_h, p_w);
                    cdr1.p_btn.BackColor = Color.Blue;
                    cdr2.p_btn.BackColor = Color.Blue;
                    cdr3.p_btn.BackColor = Color.Blue;
                    cdr4.p_btn.BackColor = Color.Blue;
                    break;
                default:
                    //ZhengZ
                    cdr1 = new CDrawRectangle(p_g, p_x, p_y, p_h, p_w);
                    cdr2 = new CDrawRectangle(p_g, p_x, p_y + CCommon.SIZE, p_h, p_w);
                    cdr3 = new CDrawRectangle(p_g, p_x + CCommon.SIZE, p_y + CCommon.SIZE, p_h, p_w);
                    cdr4 = new CDrawRectangle(p_g, p_x + CCommon.SIZE, p_y + 2 * CCommon.SIZE, p_h, p_w);
                    cdr1.p_btn.BackColor = Color.Blue;
                    cdr2.p_btn.BackColor = Color.Blue;
                    cdr3.p_btn.BackColor = Color.Blue;
                    cdr4.p_btn.BackColor = Color.Blue;
                    break;
            }
        }
        #endregion

        #region DrawRectangle
        /// <summary>
        /// DrawRectangle
        /// </summary>
        public void DrawRectangle()
        {
            if (!cdr1.p_delete)
            {
                cdr1.DrawRectangle();
            }
            if (!cdr2.p_delete)
            {
                cdr2.DrawRectangle();
            }
            if (!cdr3.p_delete)
            {
                cdr3.DrawRectangle();
            }
            if (!cdr4.p_delete)
            {
                cdr4.DrawRectangle();
            }
        }
        #endregion

        #region Down
        /// <summary>
        /// Down
        /// </summary>
        /// <param name="lst"></param>
        /// <returns></returns>
        public bool Down(List<CDrawRectangle> lst)
        {
            bool result = true;

            if (CheckDown(lst))
            {
                cdr1.p_y = cdr1.p_y + CCommon.SIZE;
                cdr2.p_y = cdr2.p_y + CCommon.SIZE;
                cdr3.p_y = cdr3.p_y + CCommon.SIZE;
                cdr4.p_y = cdr4.p_y + CCommon.SIZE;
            }
            else
            {
                result = false;
            }

            DrawRectangle();

            return result;
        }
        #endregion

        #region CheckDown
        /// <summary>
        /// CheckDown
        /// </summary>
        /// <param name="lst"></param>
        /// <returns></returns>
        private bool CheckDown(List<CDrawRectangle> lst)
        {
            bool result = true;

            int x1 = cdr1.p_x;
            int y1 = cdr1.p_y + CCommon.SIZE;
            int x2 = cdr2.p_x;
            int y2 = cdr2.p_y + CCommon.SIZE;
            int x3 = cdr3.p_x;
            int y3 = cdr3.p_y + CCommon.SIZE;
            int x4 = cdr4.p_x;
            int y4 = cdr4.p_y + CCommon.SIZE;

            if (y1 >= CCommon.MAX_H)
            {
                result = false;
            }

            if (y2 >= CCommon.MAX_H)
            {
                result = false;
            }

            if (y3 >= CCommon.MAX_H)
            {
                result = false;
            }

            if (y4 >= CCommon.MAX_H)
            {
                result = false;
            }

            if (result)
            {
                for (int i = 0; i < lst.Count; i++)
                {
                    if (lst[i].p_x == x1 && lst[i].p_y == y1)
                    {
                        result = false;
                        break;
                    }

                    if (lst[i].p_x == x2 && lst[i].p_y == y2)
                    {
                        result = false;
                        break;
                    }

                    if (lst[i].p_x == x3 && lst[i].p_y == y3)
                    {
                        result = false;
                        break;
                    }

                    if (lst[i].p_x == x4 && lst[i].p_y == y4)
                    {
                        result = false;
                        break;
                    }
                }
            }

            return result;
        }
        #endregion

        #region Left
        /// <summary>
        /// Left
        /// </summary>
        /// <param name="lst"></param>
        public void Left(List<CDrawRectangle> lst)
        {
            if (CheckLeft(lst))
            {
                cdr1.p_x = cdr1.p_x - CCommon.SIZE;
                cdr2.p_x = cdr2.p_x - CCommon.SIZE;
                cdr3.p_x = cdr3.p_x - CCommon.SIZE;
                cdr4.p_x = cdr4.p_x - CCommon.SIZE;
            }

            DrawRectangle();
        }
        #endregion

        #region CheckLeft
        /// <summary>
        /// CheckLeft
        /// </summary>
        /// <param name="lst"></param>
        /// <returns></returns>
        private bool CheckLeft(List<CDrawRectangle> lst)
        {
            bool result = true;

            int x1 = cdr1.p_x - CCommon.SIZE;
            int y1 = cdr1.p_y ;
            int x2 = cdr2.p_x - CCommon.SIZE;
            int y2 = cdr2.p_y ;
            int x3 = cdr3.p_x - CCommon.SIZE;
            int y3 = cdr3.p_y ;
            int x4 = cdr4.p_x - CCommon.SIZE;
            int y4 = cdr4.p_y ;

            if (x1 < 0)
            {
                result = false;
            }

            if (x2 < 0)
            {
                result = false;
            }

            if (x3 < 0)
            {
                result = false;
            }

            if (x4 < 0)
            {
                result = false;
            }

            if (result)
            {
                for (int i = 0; i < lst.Count; i++)
                {
                    if (lst[i].p_x == x1 && lst[i].p_y == y1)
                    {
                        result = false;
                        break;
                    }

                    if (lst[i].p_x == x2 && lst[i].p_y == y2)
                    {
                        result = false;
                        break;
                    }

                    if (lst[i].p_x == x3 && lst[i].p_y == y3)
                    {
                        result = false;
                        break;
                    }

                    if (lst[i].p_x == x4 && lst[i].p_y == y4)
                    {
                        result = false;
                        break;
                    }
                }
            }

            return result;
        }
        #endregion
        
        #region Right
        /// <summary>
        /// Right
        /// </summary>
        /// <param name="lst"></param>
        public void Right(List<CDrawRectangle> lst)
        {
            if (CheckRight(lst))
            {
                cdr1.p_x = cdr1.p_x + CCommon.SIZE;
                cdr2.p_x = cdr2.p_x + CCommon.SIZE;
                cdr3.p_x = cdr3.p_x + CCommon.SIZE;
                cdr4.p_x = cdr4.p_x + CCommon.SIZE;
            }
            DrawRectangle();
        }
        #endregion

        #region CheckRight
        /// <summary>
        /// CheckRight
        /// </summary>
        /// <param name="lst"></param>
        /// <returns></returns>
        private bool CheckRight(List<CDrawRectangle> lst)
        {
            bool result = true;

            int x1 = cdr1.p_x + CCommon.SIZE;
            int y1 = cdr1.p_y;
            int x2 = cdr2.p_x + CCommon.SIZE;
            int y2 = cdr2.p_y;
            int x3 = cdr3.p_x + CCommon.SIZE;
            int y3 = cdr3.p_y;
            int x4 = cdr4.p_x + CCommon.SIZE;
            int y4 = cdr4.p_y;

            if (x1 >= CCommon.MAX_W)
            {
                result = false;
            }

            if (x2 >= CCommon.MAX_W)
            {
                result = false;
            }

            if (x3 >= CCommon.MAX_W)
            {
                result = false;
            }

            if (x4 >= CCommon.MAX_W)
            {
                result = false;
            }

            if (result)
            {
                for (int i = 0; i < lst.Count; i++)
                {
                    if (lst[i].p_x == x1 && lst[i].p_y == y1)
                    {
                        result = false;
                        break;
                    }

                    if (lst[i].p_x == x2 && lst[i].p_y == y2)
                    {
                        result = false;
                        break;
                    }

                    if (lst[i].p_x == x3 && lst[i].p_y == y3)
                    {
                        result = false;
                        break;
                    }

                    if (lst[i].p_x == x4 && lst[i].p_y == y4)
                    {
                        result = false;
                        break;
                    }
                }
            }

            return result;
        }
        #endregion

        #region Change
        /// <summary>
        /// Change
        /// </summary>
        /// <param name="lst"></param>
        public void Change(List<CDrawRectangle> lst)
        {
            if (CheckChange(lst))
            {
                #region 变化选择
                switch (p_IType)
                {
                    case 1:
                        //changtiao
                        if (iChangeFlag == 0)
                        {
                            cdr1.p_x = cdr1.p_x - CCommon.SIZE;
                            cdr1.p_y = cdr1.p_y + CCommon.SIZE;

                            cdr3.p_x = cdr3.p_x + CCommon.SIZE;
                            cdr3.p_y = cdr3.p_y - CCommon.SIZE;

                            cdr4.p_x = cdr4.p_x + 2 * CCommon.SIZE;
                            cdr4.p_y = cdr4.p_y - 2 * CCommon.SIZE;
                            iChangeFlag = 1;
                        }
                        else if (iChangeFlag == 1)
                        {
                            cdr1.p_x = cdr1.p_x + CCommon.SIZE;
                            cdr1.p_y = cdr1.p_y - CCommon.SIZE;

                            cdr3.p_x = cdr3.p_x - CCommon.SIZE;
                            cdr3.p_y = cdr3.p_y + CCommon.SIZE;

                            cdr4.p_x = cdr4.p_x - 2 * CCommon.SIZE;
                            cdr4.p_y = cdr4.p_y + 2 * CCommon.SIZE;
                            iChangeFlag = 0;
                        }
                        break;
                    case 2:
                        //FanL
                        if (iChangeFlag == 0)
                        {
                            cdr1.p_x = cdr1.p_x + 2 * CCommon.SIZE;
                            cdr1.p_y = cdr1.p_y + 2 * CCommon.SIZE;

                            cdr2.p_x = cdr2.p_x + CCommon.SIZE;
                            cdr2.p_y = cdr2.p_y + CCommon.SIZE;

                            cdr4.p_x = cdr4.p_x + CCommon.SIZE;
                            cdr4.p_y = cdr4.p_y - CCommon.SIZE;
                            iChangeFlag = 1;
                        }
                        else if (iChangeFlag == 1)
                        {
                            cdr1.p_x = cdr1.p_x - 2 * CCommon.SIZE;
                            cdr1.p_y = cdr1.p_y + 2 * CCommon.SIZE;

                            cdr2.p_x = cdr2.p_x - CCommon.SIZE;
                            cdr2.p_y = cdr2.p_y + CCommon.SIZE;

                            cdr4.p_x = cdr4.p_x + CCommon.SIZE;
                            cdr4.p_y = cdr4.p_y + CCommon.SIZE;
                            iChangeFlag = 2;
                        }
                        else if (iChangeFlag == 2)
                        {
                            cdr1.p_x = cdr1.p_x - 2 * CCommon.SIZE;
                            cdr1.p_y = cdr1.p_y - 2 * CCommon.SIZE;

                            cdr2.p_x = cdr2.p_x - CCommon.SIZE;
                            cdr2.p_y = cdr2.p_y - CCommon.SIZE;

                            cdr4.p_x = cdr4.p_x - CCommon.SIZE;
                            cdr4.p_y = cdr4.p_y + CCommon.SIZE;
                            iChangeFlag = 3;
                        }
                        else if (iChangeFlag == 3)
                        {
                            cdr1.p_x = cdr1.p_x + 2 * CCommon.SIZE;
                            cdr1.p_y = cdr1.p_y - 2 * CCommon.SIZE;

                            cdr2.p_x = cdr2.p_x + CCommon.SIZE;
                            cdr2.p_y = cdr2.p_y - CCommon.SIZE;

                            cdr4.p_x = cdr4.p_x - CCommon.SIZE;
                            cdr4.p_y = cdr4.p_y - CCommon.SIZE;
                            iChangeFlag = 0;
                        }
                        break;
                    case 3:
                        //FanZ
                        if (iChangeFlag == 0)
                        {
                            cdr1.p_x = cdr1.p_x - 2 * CCommon.SIZE;
                            cdr1.p_y = cdr1.p_y;

                            cdr2.p_x = cdr2.p_x - CCommon.SIZE;
                            cdr2.p_y = cdr2.p_y - CCommon.SIZE;

                            cdr4.p_x = cdr4.p_x + CCommon.SIZE;
                            cdr4.p_y = cdr4.p_y - CCommon.SIZE;
                            iChangeFlag = 1;
                        }
                        else if (iChangeFlag == 1)
                        {
                            cdr1.p_x = cdr1.p_x + 2 * CCommon.SIZE;
                            cdr1.p_y = cdr1.p_y;

                            cdr2.p_x = cdr2.p_x + CCommon.SIZE;
                            cdr2.p_y = cdr2.p_y + CCommon.SIZE;

                            cdr4.p_x = cdr4.p_x - CCommon.SIZE;
                            cdr4.p_y = cdr4.p_y + CCommon.SIZE;
                            iChangeFlag = 0;
                        }
                        break;
                    case 4:
                        //shan
                        if (iChangeFlag == 0)
                        {
                            cdr1.p_x = cdr1.p_x + CCommon.SIZE;
                            cdr1.p_y = cdr1.p_y - CCommon.SIZE;

                            cdr3.p_x = cdr3.p_x - CCommon.SIZE;
                            cdr3.p_y = cdr3.p_y + CCommon.SIZE;

                            cdr4.p_x = cdr4.p_x + CCommon.SIZE;
                            cdr4.p_y = cdr4.p_y + CCommon.SIZE;
                            iChangeFlag = 1;
                        }
                        else if (iChangeFlag == 1)
                        {
                            cdr1.p_x = cdr1.p_x + CCommon.SIZE;
                            cdr1.p_y = cdr1.p_y + CCommon.SIZE;

                            cdr3.p_x = cdr3.p_x - CCommon.SIZE;
                            cdr3.p_y = cdr3.p_y - CCommon.SIZE;

                            cdr4.p_x = cdr4.p_x - CCommon.SIZE;
                            cdr4.p_y = cdr4.p_y + CCommon.SIZE;
                            iChangeFlag = 2;
                        }
                        else if (iChangeFlag == 2)
                        {
                            cdr1.p_x = cdr1.p_x - CCommon.SIZE;
                            cdr1.p_y = cdr1.p_y + CCommon.SIZE;

                            cdr3.p_x = cdr3.p_x + CCommon.SIZE;
                            cdr3.p_y = cdr3.p_y - CCommon.SIZE;

                            cdr4.p_x = cdr4.p_x - CCommon.SIZE;
                            cdr4.p_y = cdr4.p_y - CCommon.SIZE;
                            iChangeFlag = 3;
                        }
                        else if (iChangeFlag == 3)
                        {
                            cdr1.p_x = cdr1.p_x - CCommon.SIZE;
                            cdr1.p_y = cdr1.p_y - CCommon.SIZE;

                            cdr3.p_x = cdr3.p_x + CCommon.SIZE;
                            cdr3.p_y = cdr3.p_y + CCommon.SIZE;

                            cdr4.p_x = cdr4.p_x + CCommon.SIZE;
                            cdr4.p_y = cdr4.p_y - CCommon.SIZE;
                            iChangeFlag = 0;
                        }
                        break;
                    case 5:
                        //Tian

                        break;
                    case 6:
                        //ZhengL
                        if (iChangeFlag == 0)
                        {
                            cdr1.p_x = cdr1.p_x + 2 * CCommon.SIZE;
                            cdr1.p_y = cdr1.p_y + 2 * CCommon.SIZE;

                            cdr2.p_x = cdr2.p_x + CCommon.SIZE;
                            cdr2.p_y = cdr2.p_y + CCommon.SIZE;

                            cdr4.p_x = cdr4.p_x - CCommon.SIZE;
                            cdr4.p_y = cdr4.p_y + CCommon.SIZE;
                            iChangeFlag = 1;
                        }
                        else if (iChangeFlag == 1)
                        {
                            cdr1.p_x = cdr1.p_x - 2 * CCommon.SIZE;
                            cdr1.p_y = cdr1.p_y + 2 * CCommon.SIZE;

                            cdr2.p_x = cdr2.p_x - CCommon.SIZE;
                            cdr2.p_y = cdr2.p_y + CCommon.SIZE;

                            cdr4.p_x = cdr4.p_x - CCommon.SIZE;
                            cdr4.p_y = cdr4.p_y - CCommon.SIZE;
                            iChangeFlag = 2;
                        }
                        else if (iChangeFlag == 2)
                        {
                            cdr1.p_x = cdr1.p_x - 2 * CCommon.SIZE;
                            cdr1.p_y = cdr1.p_y - 2 * CCommon.SIZE;

                            cdr2.p_x = cdr2.p_x - CCommon.SIZE;
                            cdr2.p_y = cdr2.p_y - CCommon.SIZE;

                            cdr4.p_x = cdr4.p_x + CCommon.SIZE;
                            cdr4.p_y = cdr4.p_y - CCommon.SIZE;
                            iChangeFlag = 3;
                        }
                        else if (iChangeFlag == 3)
                        {
                            cdr1.p_x = cdr1.p_x + 2 * CCommon.SIZE;
                            cdr1.p_y = cdr1.p_y - 2 * CCommon.SIZE;

                            cdr2.p_x = cdr2.p_x + CCommon.SIZE;
                            cdr2.p_y = cdr2.p_y - CCommon.SIZE;

                            cdr4.p_x = cdr4.p_x + CCommon.SIZE;
                            cdr4.p_y = cdr4.p_y + CCommon.SIZE;
                            iChangeFlag = 0;
                        }
                        break;
                    case 7:
                        //ZhengZ
                        if (iChangeFlag == 0)
                        {
                            cdr1.p_x = cdr1.p_x + 2 * CCommon.SIZE;
                            cdr1.p_y = cdr1.p_y;

                            cdr2.p_x = cdr2.p_x + CCommon.SIZE;
                            cdr2.p_y = cdr2.p_y - CCommon.SIZE;

                            cdr4.p_x = cdr4.p_x - CCommon.SIZE;
                            cdr4.p_y = cdr4.p_y - CCommon.SIZE;
                            iChangeFlag = 1;
                        }
                        else if (iChangeFlag == 1)
                        {
                            cdr1.p_x = cdr1.p_x - 2 * CCommon.SIZE;
                            cdr1.p_y = cdr1.p_y;

                            cdr2.p_x = cdr2.p_x - CCommon.SIZE;
                            cdr2.p_y = cdr2.p_y + CCommon.SIZE;

                            cdr4.p_x = cdr4.p_x + CCommon.SIZE;
                            cdr4.p_y = cdr4.p_y + CCommon.SIZE;
                            iChangeFlag = 0;
                        }
                        break;
                    default:
                        //ZhengZ
                        if (iChangeFlag == 0)
                        {
                            cdr1.p_x = cdr1.p_x + 2 * CCommon.SIZE;
                            cdr1.p_y = cdr1.p_y;

                            cdr2.p_x = cdr2.p_x + CCommon.SIZE;
                            cdr2.p_y = cdr2.p_y - CCommon.SIZE;

                            cdr4.p_x = cdr4.p_x - CCommon.SIZE;
                            cdr4.p_y = cdr4.p_y - CCommon.SIZE;
                            iChangeFlag = 1;
                        }
                        else if (iChangeFlag == 1)
                        {
                            cdr1.p_x = cdr1.p_x - 2 * CCommon.SIZE;
                            cdr1.p_y = cdr1.p_y;

                            cdr2.p_x = cdr2.p_x - CCommon.SIZE;
                            cdr2.p_y = cdr2.p_y + CCommon.SIZE;

                            cdr4.p_x = cdr4.p_x + CCommon.SIZE;
                            cdr4.p_y = cdr4.p_y + CCommon.SIZE;
                            iChangeFlag = 0;
                        }
                        break;
                }
                #endregion
            }
            DrawRectangle();
        }
        #endregion

        #region CheckChange
        /// <summary>
        /// CheckChange
        /// </summary>
        /// <param name="lst"></param>
        /// <returns></returns>
        private bool CheckChange(List<CDrawRectangle> lst)
        {
            bool result = true;

            int x1 = 0;
            int y1 = 0;
            int x2 = 0;
            int y2 = 0;
            int x3 = 0;
            int y3 = 0;
            int x4 = 0;
            int y4 = 0;

            #region 变化赋值
            switch (p_IType)
            {
                case 1:
                    //changtiao
                    if (iChangeFlag == 0)
                    {
                        x1 = cdr1.p_x - CCommon.SIZE;
                        y1 = cdr1.p_y + CCommon.SIZE;

                        x2 = cdr2.p_x;
                        y2 = cdr2.p_y;

                        x3 = cdr3.p_x + CCommon.SIZE;
                        y3 = cdr3.p_y - CCommon.SIZE;

                        x4 = cdr4.p_x + 2 * CCommon.SIZE;
                        y4 = cdr4.p_y - 2 * CCommon.SIZE;
                    }
                    else if (iChangeFlag == 1)
                    {
                        x1 = cdr1.p_x + CCommon.SIZE;
                        y1 = cdr1.p_y - CCommon.SIZE;

                        x2 = cdr2.p_x;
                        y2 = cdr2.p_y;

                        x3 = cdr3.p_x - CCommon.SIZE;
                        y3 = cdr3.p_y + CCommon.SIZE;

                        x4 = cdr4.p_x - 2 * CCommon.SIZE;
                        y4 = cdr4.p_y + 2 * CCommon.SIZE;
                    }
                    break;
                case 2:
                    //FanL
                    if (iChangeFlag == 0)
                    {
                        x1 = cdr1.p_x + 2 * CCommon.SIZE;
                        y1 = cdr1.p_y + 2 * CCommon.SIZE;

                        x2 = cdr2.p_x + CCommon.SIZE;
                        y2 = cdr2.p_y + CCommon.SIZE;

                        x3 = cdr3.p_x;
                        y3 = cdr3.p_y;

                        x4 = cdr4.p_x + CCommon.SIZE;
                        y4 = cdr4.p_y - CCommon.SIZE;
                    }
                    else if (iChangeFlag == 1)
                    {
                        x1 = cdr1.p_x - 2 * CCommon.SIZE;
                        y1 = cdr1.p_y + 2 * CCommon.SIZE;

                        x2 = cdr2.p_x - CCommon.SIZE;
                        y2 = cdr2.p_y + CCommon.SIZE;

                        x3 = cdr3.p_x;
                        y3 = cdr3.p_y;

                        x4 = cdr4.p_x + CCommon.SIZE;
                        y4 = cdr4.p_y + CCommon.SIZE;
                    }
                    else if (iChangeFlag == 2)
                    {
                        x1 = cdr1.p_x - 2 * CCommon.SIZE;
                        y1 = cdr1.p_y - 2 * CCommon.SIZE;

                        x2 = cdr2.p_x - CCommon.SIZE;
                        y2 = cdr2.p_y - CCommon.SIZE;

                        x3 = cdr3.p_x;
                        y3 = cdr3.p_y;

                        x4 = cdr4.p_x - CCommon.SIZE;
                        y4 = cdr4.p_y + CCommon.SIZE;
                    }
                    else if (iChangeFlag == 3)
                    {
                        x1 = cdr1.p_x + 2 * CCommon.SIZE;
                        y1 = cdr1.p_y - 2 * CCommon.SIZE;

                        x2 = cdr2.p_x + CCommon.SIZE;
                        y2 = cdr2.p_y - CCommon.SIZE;

                        x3 = cdr3.p_x;
                        y3 = cdr3.p_y;

                        x4 = cdr4.p_x - CCommon.SIZE;
                        y4 = cdr4.p_y - CCommon.SIZE;
                    }
                    break;
                case 3:
                    //FanZ
                    if (iChangeFlag == 0)
                    {
                        x1 = cdr1.p_x - 2 * CCommon.SIZE;
                        y1 = cdr1.p_y;

                        x2 = cdr2.p_x - CCommon.SIZE;
                        y2 = cdr2.p_y - CCommon.SIZE;

                        x3 = cdr3.p_x;
                        y3 = cdr3.p_y;

                        x4 = cdr4.p_x + CCommon.SIZE;
                        y4 = cdr4.p_y - CCommon.SIZE;
                    }
                    else if (iChangeFlag == 1)
                    {
                        x1 = cdr1.p_x + 2 * CCommon.SIZE;
                        y1 = cdr1.p_y;

                        x2 = cdr2.p_x + CCommon.SIZE;
                        y2 = cdr2.p_y + CCommon.SIZE;

                        x3 = cdr3.p_x;
                        y3 = cdr3.p_y;

                        x4 = cdr4.p_x - CCommon.SIZE;
                        y4 = cdr4.p_y + CCommon.SIZE;
                    }
                    break;
                case 4:
                    //shan
                    if (iChangeFlag == 0)
                    {
                        x1 = cdr1.p_x + CCommon.SIZE;
                        y1 = cdr1.p_y - CCommon.SIZE;

                        x2 = cdr2.p_x;
                        y2 = cdr2.p_y;

                        x3 = cdr3.p_x - CCommon.SIZE;
                        y3 = cdr3.p_y + CCommon.SIZE;

                        x4 = cdr4.p_x + CCommon.SIZE;
                        y4 = cdr4.p_y + CCommon.SIZE;
                    }
                    else if (iChangeFlag == 1)
                    {
                        x1 = cdr1.p_x + CCommon.SIZE;
                        y1 = cdr1.p_y + CCommon.SIZE;

                        x2 = cdr2.p_x;
                        y2 = cdr2.p_y;

                        x3 = cdr3.p_x - CCommon.SIZE;
                        y3 = cdr3.p_y - CCommon.SIZE;

                        x4 = cdr4.p_x - CCommon.SIZE;
                        y4 = cdr4.p_y + CCommon.SIZE;
                    }
                    else if (iChangeFlag == 2)
                    {
                        x1 = cdr1.p_x - CCommon.SIZE;
                        y1 = cdr1.p_y + CCommon.SIZE;

                        x2 = cdr2.p_x;
                        y2 = cdr2.p_y;

                        x3 = cdr3.p_x + CCommon.SIZE;
                        y3 = cdr3.p_y - CCommon.SIZE;

                        x4 = cdr4.p_x - CCommon.SIZE;
                        y4 = cdr4.p_y - CCommon.SIZE;
                    }
                    else if (iChangeFlag == 3)
                    {
                        x1 = cdr1.p_x - CCommon.SIZE;
                        y1 = cdr1.p_y - CCommon.SIZE;

                        x2 = cdr2.p_x;
                        y2 = cdr2.p_y;

                        x3 = cdr3.p_x + CCommon.SIZE;
                        y3 = cdr3.p_y + CCommon.SIZE;

                        x4 = cdr4.p_x + CCommon.SIZE;
                        y4 = cdr4.p_y - CCommon.SIZE;
                    }
                    break;
                case 5:
                    //Tian

                    break;
                case 6:
                    //ZhengL
                    if (iChangeFlag == 0)
                    {
                        x1 = cdr1.p_x + 2 * CCommon.SIZE;
                        y1 = cdr1.p_y + 2 * CCommon.SIZE;

                        x2 = cdr2.p_x + CCommon.SIZE;
                        y2 = cdr2.p_y + CCommon.SIZE;

                        x3 = cdr3.p_x;
                        y3 = cdr3.p_y;

                        x4 = cdr4.p_x - CCommon.SIZE;
                        y4 = cdr4.p_y + CCommon.SIZE;
                    }
                    else if (iChangeFlag == 1)
                    {
                        x1 = cdr1.p_x - 2 * CCommon.SIZE;
                        y1 = cdr1.p_y + 2 * CCommon.SIZE;

                        x2 = cdr2.p_x - CCommon.SIZE;
                        y2 = cdr2.p_y + CCommon.SIZE;

                        x3 = cdr3.p_x;
                        y3 = cdr3.p_y;

                        x4 = cdr4.p_x - CCommon.SIZE;
                        y4 = cdr4.p_y - CCommon.SIZE;
                    }
                    else if (iChangeFlag == 2)
                    {
                        x1 = cdr1.p_x - 2 * CCommon.SIZE;
                        y1 = cdr1.p_y - 2 * CCommon.SIZE;

                        x2 = cdr2.p_x - CCommon.SIZE;
                        y2 = cdr2.p_y - CCommon.SIZE;

                        x3 = cdr3.p_x;
                        y3 = cdr3.p_y;

                        x4 = cdr4.p_x + CCommon.SIZE;
                        y4 = cdr4.p_y - CCommon.SIZE;
                    }
                    else if (iChangeFlag == 3)
                    {
                        x1 = cdr1.p_x + 2 * CCommon.SIZE;
                        y1 = cdr1.p_y - 2 * CCommon.SIZE;

                        x2 = cdr2.p_x + CCommon.SIZE;
                        y2 = cdr2.p_y - CCommon.SIZE;

                        x3 = cdr3.p_x;
                        y3 = cdr3.p_y;

                        x4 = cdr4.p_x + CCommon.SIZE;
                        y4 = cdr4.p_y + CCommon.SIZE;
                    }
                    break;
                case 7:
                    //ZhengZ
                    if (iChangeFlag == 0)
                    {
                        x1 = cdr1.p_x + 2 * CCommon.SIZE;
                        y1 = cdr1.p_y;

                        x2 = cdr2.p_x + CCommon.SIZE;
                        y2 = cdr2.p_y - CCommon.SIZE;

                        x3 = cdr3.p_x;
                        y3 = cdr3.p_y;

                        x4 = cdr4.p_x - CCommon.SIZE;
                        y4 = cdr4.p_y - CCommon.SIZE;
                    }
                    else if (iChangeFlag == 1)
                    {
                        x1 = cdr1.p_x - 2 * CCommon.SIZE;
                        y1 = cdr1.p_y;

                        x2 = cdr2.p_x - CCommon.SIZE;
                        y2 = cdr2.p_y + CCommon.SIZE;

                        x3 = cdr3.p_x;
                        y3 = cdr3.p_y;

                        x4 = cdr4.p_x + CCommon.SIZE;
                        y4 = cdr4.p_y + CCommon.SIZE;
                    }
                    break;
                default:
                    //ZhengZ
                    if (iChangeFlag == 0)
                    {
                        x1 = cdr1.p_x + 2 * CCommon.SIZE;
                        y1 = cdr1.p_y;

                        x2 = cdr2.p_x + CCommon.SIZE;
                        y2 = cdr2.p_y - CCommon.SIZE;

                        x3 = cdr3.p_x;
                        y3 = cdr3.p_y;

                        x4 = cdr4.p_x - CCommon.SIZE;
                        y4 = cdr4.p_y - CCommon.SIZE;
                    }
                    else if (iChangeFlag == 1)
                    {
                        x1 = cdr1.p_x - 2 * CCommon.SIZE;
                        y1 = cdr1.p_y;

                        x2 = cdr2.p_x - CCommon.SIZE;
                        y2 = cdr2.p_y + CCommon.SIZE;

                        x3 = cdr3.p_x;
                        y3 = cdr3.p_y;

                        x4 = cdr4.p_x + CCommon.SIZE;
                        y4 = cdr4.p_y + CCommon.SIZE;
                    }
                    break;
            }
            #endregion

            if (x1 >= CCommon.MAX_W || x1 < 0)
            {
                result = false;
            }

            if (x2 >= CCommon.MAX_W || x2 < 0)
            {
                result = false;
            }

            if (x3 >= CCommon.MAX_W || x3 < 0)
            {
                result = false;
            }

            if (x4 >= CCommon.MAX_W || x4 < 0)
            {
                result = false;
            }

            if (y1 >= CCommon.MAX_H)
            {
                result = false;
            }

            if (y2 >= CCommon.MAX_H)
            {
                result = false;
            }

            if (y3 >= CCommon.MAX_H)
            {
                result = false;
            }

            if (y4 >= CCommon.MAX_H)
            {
                result = false;
            }

            if (result)
            {
                for (int i = 0; i < lst.Count; i++)
                {
                    if (lst[i].p_x == x1 && lst[i].p_y == y1)
                    {
                        result = false;
                        break;
                    }

                    if (lst[i].p_x == x2 && lst[i].p_y == y2)
                    {
                        result = false;
                        break;
                    }

                    if (lst[i].p_x == x3 && lst[i].p_y == y3)
                    {
                        result = false;
                        break;
                    }

                    if (lst[i].p_x == x4 && lst[i].p_y == y4)
                    {
                        result = false;
                        break;
                    }
                }
            }

            return result;
        }
        #endregion

        public void Dispose()
        {
            cdr1.Dispose();
            cdr1.Dispose();
            cdr1.Dispose();
        }
    }
步骤三:更具上面的两个类,自定义一个Form,使用Timer控件定时来刷新。
 
步骤四:共通类定义
 class CCommon
    {
        public const int X = 120;
        public const int Y = 0;
        public const int H = 20;
        public const int W = 20;
        public const int SIZE = 20;
        public const int MAX_H = 600;
        public const int MAX_W = 240;
    }
总结:俄罗斯方块刚开始我使用在Panel绘图,但是有刷新,一闪一闪,最后我用了在Panel上添加Button控件的方法,这样就没有刷新的,闪屏的感觉。
  • 1
    点赞
  • 6
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值