基于C#俄罗斯方块

最近在看C#,写了一个很水的方块游戏练手。

namespace game
{
    class Square
    {
        public Square()
        {
            state = 0;
            positionY = 0;
            positionX = 0;
        }
        public Square(int InitShapeCnt, int InitState)
        {
            state = InitState;
            positionY = 0;
            positionX = 0;
            InitShape(InitShapeCnt);


        }
        public void InitShape(int ShapeCnt)
        {
            if (ShapeCnt > 6 || ShapeCnt < 0)
                return;
            else
            {
                switch (ShapeCnt)
                {
                    case (0):
                        Shape = LeftLShape;
                        break;
                    case (1):
                        Shape = RightLShape;
                        break;
                    case (2):
                        Shape = RightZShape;
                        break;
                    case (3):
                        Shape = LeftZShape;
                        break;
                    case (4):
                        Shape = lShape;
                        break;
                    case (5):
                        Shape = TuShape;
                        break;
                    case (6):
                        Shape = TianShape;
                        break;
                    default:
                        break;
                }
            }
        }

        //方向 外形 颜色
        public int[, ,,] Shape = new int[4, 4, 4, 2];
        private int state;  //方向
        public int State
        {
            get
            {
                return (state);
             }
            set
            {
                state = value;
            }
        }


        public void DrawSquare(ref Graphics dc)
        {

            for (int Cnt1 = 0; Cnt1<4; Cnt1++)
            {
                for(int Cnt2=0;Cnt2<4;Cnt2++)
                {
                    //Shape[State][Cnt1][Cnt2][1] = 0;
                    if (Shape[state, Cnt1, Cnt2, 0] == 1)
                    {
                        SolidBrush Brush;
                        switch(Shape[state, Cnt1, Cnt2, 1])
                        {
                            case (1):
                                Brush = new SolidBrush(Color.Red);
                                break;
                            case (2):
                                Brush = new SolidBrush(Color.Blue);
                                break;
                            case (3):
                                Brush = new SolidBrush(Color.Yellow);
                                break;
                            case (4):
                                Brush = new SolidBrush(Color.Green);
                                break;
                            case (5):
                                Brush = new SolidBrush(Color.Tan);
                                break;
                            case (6):
                                Brush = new SolidBrush(Color.Honeydew);
                                break;
                            case (7):
                                Brush = new SolidBrush(Color.ForestGreen);
                                break;
                            default:
                                Brush = new SolidBrush(Color.Red);
                                break;
                                
                        }
                        dc.FillRectangle(Brush, new Rectangle((positionX*16+16*Cnt2), (positionY*16+16*Cnt1), 16, 16));
                    }
                }
            }
        }
        private int positionX;
        public int PositionX
        {
            get
            {
                return (positionX);
            }
            set
            {
                positionX = value;
            }
        }

        private int positionY;
        public int PositionY
        {
            get
            {
                return (positionY);
            }
            set
            {
                positionY = value;
            }
        }


        public void Switch(GameCtrl game)
        {
            if (CoverEdge(game))
                state = (state + 1) % 4;
            
        }
        public void AddX(GameCtrl game)
        {
            //判断右侧
            if(RightEdge(game))
                positionX++;
        }
        public bool AddY(GameCtrl game)
        {
            if (this.Land(game) == false)
            {
                positionY++;
                return (true);
            }
            else
                return(false);
                
                
        }
        public void SubX(GameCtrl game)
        {
            //判断右侧
            if (LeftEdge(game))
                positionX--;
        }
        public void SubY()
        {

        }

        private bool Land(GameCtrl game)
        {
            for (int i = 3; i >= 0; i--)
            {
                int rowNum = 21 - this.PositionY - i;
                for (int j = 0; j < 4; j++)
                {
                    int colNum = this.PositionX + j + 3;

                    if (this.Shape[this.State, i, j, 0] == 1)
                    {
                        if (game.GameBox[rowNum][colNum, 0] == 1)
                        {
                            game.AddBox(this);                        
                            return (true);
                        }
                    }

                }
            }

            return (false);

        }

        private bool RightEdge(GameCtrl game)
        {
            //判断右侧
            for (int i = 3; i >= 0; i--)
            {
                int rowNum = this.PositionX + i + 4;
                for (int j = 0; j < 4; j++)
                {
                    int colNum = 22-this.PositionY-j;

                    if (this.Shape[this.State, j, i, 0] == 1)
                    {
                        if (game.GameBox[colNum][rowNum, 0] == 1)
                        {
                            return (false);
                        }
                    }
                }

            }
            return (true);


        }

        private bool LeftEdge(GameCtrl game)
        {
            //判断左侧
            for (int i = 0; i < 4; i++)
            {
                int rowNum = this.PositionX + i +2;
                for (int j = 0; j < 4; j++)
                {

                    int colNum = 22 - this.PositionY - j;

                    if (this.Shape[this.State, j, i, 0] == 1)
                    {
                        if (game.GameBox[colNum][rowNum, 0] == 1)
                        {
                            return (false);
                        }
                    }
                }

            }
            return (true);


        }

        private bool CoverEdge(GameCtrl game)
        {
            //判断变行是否有覆盖
            int preState = (this.State + 1) % 4;
            for (int i = 0; i < 4; i++)
            {
                int rowNum = this.PositionX + i + 3;
                for (int j = 0; j < 4; j++)
                {

                    int colNum = 22 - this.PositionY - j;

                    if (this.Shape[preState, j, i, 0] == 1)
                    {
                        if (game.GameBox[colNum][rowNum, 0] == 1)
                        {
                            return (false);
                        }
                    }
                }

            }
            return (true);
            //return (false);


        }
        private int[, , ,] LeftLShape = {
                              {{{1,1},{0,0},{0,0},{0,0}},
                               {{1,1},{0,0},{0,0},{0,0}},
                               {{1,1},{1,1},{0,0},{0,0}},
                               {{0,0},{0,0},{0,0},{0,0}}},

                              {{{1,1},{1,1},{1,1},{0,0}},
                               {{1,1},{0,0},{0,0},{0,0}},
                               {{0,0},{0,0},{0,0},{0,0}},
                               {{0,0},{0,0},{0,0},{0,0}}},

                              {{{0,0},{1,1},{1,1},{0,0}},
                               {{0,0},{0,0},{1,1},{0,0}},
                               {{0,0},{0,0},{1,1},{0,0}},
                               {{0,0},{0,0},{0,0},{0,0}}},

                              {{{0,0},{0,0},{0,0},{0,0}},
                               {{0,0},{0,0},{1,1},{0,0}},
                               {{1,1},{1,1},{1,1},{0,0}},
                               {{0,0},{0,0},{0,0},{0,0}}}
                                      };

        private int[, , ,] RightLShape = {
                              {{{0,0},{0,0},{1,2},{0,0}},
                              {{0,0},{0,0},{1,2},{0,0}},
                              {{0,0},{1,2},{1,2},{0,0}},
                              {{0,0},{0,0},{0,0},{0,0}}},

                              {{{0,0},{0,0},{0,0},{0,0}},
                              {{1,2},{0,0},{0,0},{0,0}},
                              {{1,2},{1,2},{1,2},{0,0}},
                              {{0,0},{0,0},{0,0},{0,0}}},

                              {{{1,2},{1,2},{0,0},{0,0}},
                              {{1,2},{0,0},{0,0},{0,0}},
                              {{1,2},{0,0},{0,0},{0,0}},
                              {{0,0},{0,0},{0,0},{0,0}}},

                              {{{1,2},{1,2},{1,2},{0,0}},
                              {{0,0},{0,0},{1,2},{0,0}},
                              {{0,0},{0,0},{0,0},{0,0}},
                              {{0,0},{0,0},{0,0},{0,0}}}


                               };
        private int[, , ,] LeftZShape = {
                              {{{1,3},{1,3},{0,0},{0,0}},
                              {{0,0},{1,3},{1,3},{0,0}},
                              {{0,0},{0,0},{0,0},{0,0}},
                              {{0,0},{0,0},{0,0},{0,0}}},

                              {{{0,0},{1,3},{0,0},{0,0}},
                              {{1,3},{1,3},{0,0},{0,0}},
                              {{1,3},{0,0},{0,0},{0,0}},
                              {{0,0},{0,0},{0,0},{0,0}}},

                              {{{1,3},{1,3},{0,0},{0,0}},
                              {{0,0},{1,3},{1,3},{0,0}},
                              {{0,0},{0,0},{0,0},{0,0}},
                              {{0,0},{0,0},{0,0},{0,0}}},

                              {{{0,0},{1,3},{0,0},{0,0}},
                              {{1,3},{1,3},{0,0},{0,0}},
                              {{1,3},{0,0},{0,0},{0,0}},
                              {{0,0},{0,0},{0,0},{0,0}}}
                               };

        private int[, , ,] RightZShape = {
                              {{{0,0},{1,4},{1,4},{0,0}},
                              {{1,4},{1,4},{0,0},{0,0}},
                              {{0,0},{0,0},{0,0},{0,0}},
                              {{0,0},{0,0},{0,0},{0,0}}},

                              {{{1,4},{0,0},{0,0},{0,0}},
                              {{1,4},{1,4},{0,0},{0,0}},
                              {{0,0},{1,4},{0,0},{0,0}},
                              {{0,0},{0,0},{0,0},{0,0}}},

                              {{{0,0},{1,4},{1,4},{0,0}},
                              {{1,4},{1,4},{0,0},{0,0}},
                              {{0,0},{0,0},{0,0},{0,0}},
                              {{0,0},{0,0},{0,0},{0,0}}},

                              {{{1,4},{0,0},{0,0},{0,0}},
                              {{1,4},{1,4},{0,0},{0,0}},
                              {{0,0},{1,4},{0,0},{0,0}},
                              {{0,0},{0,0},{0,0},{0,0}}}
                               };

        private int[, , ,] lShape = {
                              {{{1,6},{0,0},{0,0},{0,0}},
                              {{1,6},{0,0},{0,0},{0,0}},
                              {{1,6},{0,0},{0,0},{0,0}},
                              {{1,6},{0,0},{0,0},{0,0}}},

                              {{{0,0},{0,0},{0,0},{0,0}},
                              {{1,6},{1,6},{1,6},{1,6}},
                              {{0,0},{0,0},{0,0},{0,0}},
                              {{0,0},{0,0},{0,0},{0,0}}},

                              {{{1,6},{0,0},{0,0},{0,0}},
                              {{1,6},{0,0},{0,0},{0,0}},
                              {{1,6},{0,0},{0,0},{0,0}},
                              {{1,6},{0,0},{0,0},{0,0}}},

                              {{{0,0},{0,0},{0,0},{0,0}},
                              {{1,6},{1,6},{1,6},{1,6}},
                              {{0,0},{0,0},{0,0},{0,0}},
                              {{0,0},{0,0},{0,0},{0,0}}}
                               };
        private int[, , ,] TuShape = {
                              {{{0,0},{1,7},{0,0},{0,0}},
                              {{1,7},{1,7},{1,7},{0,0}},
                              {{0,0},{0,0},{0,0},{0,0}},
                              {{0,0},{0,0},{0,0},{0,0}}
                              },

                              {{{0,0},{1,7},{0,0},{0,0}},
                              {{1,7},{1,7},{0,0},{0,0}},
                              {{0,0},{1,7},{0,0},{0,0}},
                              {{0,0},{0,0},{0,0},{0,0}}
                              },

                              {{{0,0},{0,0},{0,0},{0,0}},
                              {{1,7},{1,7},{1,7},{0,0}},
                              {{0,0},{1,7},{0,0},{0,0}},
                              {{0,0},{0,0},{0,0},{0,0}}
                              },

                              {{{0,0},{1,7},{0,0},{0,0}},
                              {{0,0},{1,7},{1,7},{0,0}},
                              {{0,0},{1,7},{0,0},{0,0}},
                              {{0,0},{0,0},{0,0},{0,0}}
                              },
                               };
        private int[, , ,] TianShape = {
                              {
                              {{1,5},{1,5},{0,0},{0,0}},
                              {{1,5},{1,5},{0,0},{0,0}},
                              {{0,0},{0,0},{0,0},{0,0}},
                              {{0,0},{0,0},{0,0},{0,0}}
                              },

                              {
                              {{1,5},{1,5},{0,0},{0,0}},
                              {{1,5},{1,5},{0,0},{0,0}},
                              {{0,0},{0,0},{0,0},{0,0}},
                              {{0,0},{0,0},{0,0},{0,0}}
                              },

                              {
                              {{1,5},{1,5},{0,0},{0,0}},
                              {{1,5},{1,5},{0,0},{0,0}},
                              {{0,0},{0,0},{0,0},{0,0}},
                              {{0,0},{0,0},{0,0},{0,0}}
                              },

                              {
                              {{1,5},{1,5},{0,0},{0,0}},
                              {{1,5},{1,5},{0,0},{0,0}},
                              {{0,0},{0,0},{0,0},{0,0}},
                              {{0,0},{0,0},{0,0},{0,0}}
                              }
                               };
    }
    class GameCtrl
    {
        public List<int[,]> GameBox = new List<int[,]>();

        public int gameSclpe;

        public GameCtrl()
        {
            gameSclpe = 0;
            this.InitBox();
        }
        public void InitBox()
        {
            int[,] InitZore = new int[18, 2] { { 1, 0 }, { 1, 0 }, { 1, 0 },{ 0, 0 }, { 0, 0 }, { 0, 0 },
                                               { 0, 0 }, { 0, 0 }, { 0, 0 },{ 0, 0 }, { 0, 0 }, { 0, 0 }, 
                                               { 0, 0 }, { 0, 0 }, { 0, 0 }, { 1, 0 }, { 1, 0 }, { 1, 0 }};

            int[,] InitOne = new int[18, 2]  { { 1, 0 }, { 1, 0 }, { 1, 0 }, { 1, 0 }, { 1, 0 }, { 1, 0 },
                                                { 1, 0 }, { 1, 0 }, { 1, 0 }, { 1, 0 }, { 1, 0 }, { 1, 0 },
                                               { 1, 0 }, { 1, 0 }, { 1, 0 }, { 1, 0 }, { 1, 0 }, { 1, 0 } };
            GameBox.Add(InitOne);
            GameBox.Add(InitOne);
            GameBox.Add(InitOne);
            for (int Cnt = 0; Cnt < 20; Cnt++)
                GameBox.Add(InitZore);

        }
        public void ClrBox()
        {
            GameBox.Clear();
        }

        public void AddBox(Square landSquare)
        {
            for (int i = 0; i < 4; i++)
            {
                int rowNum = 22 - landSquare.PositionY - i;
                int[,] ShapeRow = new int[18, 2];

                for(int j =0;j<18;j++)
                {
                    if (GameBox[rowNum][j, 0] == 1)
                    {
                        ShapeRow[j, 0] = 1;
                        ShapeRow[j, 1] = GameBox[rowNum][j, 1];
                    }
                }
                for (int j = 0; j < 4; j++)
                {

                    int colNum = landSquare.PositionX + j+3;
                    if (landSquare.Shape[landSquare.State, i, j, 0] == 1)
                    {
                        ShapeRow[colNum, 0] = 1;
                        ShapeRow[colNum, 1] = landSquare.Shape[landSquare.State, i, j, 1];
 
                    }
  
                    
                }
                GameBox[rowNum] = ShapeRow;

            }
            SubBox();
        }


        private void SubBox()
        {
            int[,] InitZore = new int[18, 2] { { 1, 0 }, { 1, 0 }, { 1, 0 },{ 0, 0 }, { 0, 0 }, { 0, 0 },
                                               { 0, 0 }, { 0, 0 }, { 0, 0 },{ 0, 0 }, { 0, 0 }, { 0, 0 }, 
                                               { 0, 0 }, { 0, 0 }, { 0, 0 }, { 1, 0 }, { 1, 0 }, { 1, 0 }};
            int Cnt;
            for (Cnt = 3; Cnt < 23; Cnt++)
            {
                int ColSum,Cnt2;
                for (ColSum = 0, Cnt2 = 3; Cnt2 < 15;Cnt2++ )
                    ColSum += GameBox[Cnt][Cnt2, 0];
                if(ColSum==12)
                {
                    this.gameSclpe++;
                    GameBox.RemoveAt(3);
                    GameBox.Add(InitZore);
                    Cnt--;
                }
            }

    
        }

        public void BoxDraw(ref Graphics dc)
        {
            for (int Cnt1 = 3; Cnt1 < 23; Cnt1++)
            {
                for (int Cnt2 = 3; Cnt2 < 15; Cnt2++)
                {
                    if (GameBox[Cnt1][Cnt2, 0] == 1)
                    {
                        SolidBrush Brush;
                        switch (GameBox[Cnt1][Cnt2, 1])
                        {
                            case (1):
                                Brush = new SolidBrush(Color.Red);
                                break;
                            case (2):
                                Brush = new SolidBrush(Color.Blue);
                                break;
                            case (3):
                                Brush = new SolidBrush(Color.Yellow);
                                break;
                            case (4):
                                Brush = new SolidBrush(Color.Green);
                                break;
                            case (5):
                                Brush = new SolidBrush(Color.Tan);
                                break;
                            case (6):
                                Brush = new SolidBrush(Color.Honeydew);
                                break;
                            case (7):
                                Brush = new SolidBrush(Color.ForestGreen);
                                break;
                            default:
                                Brush = new SolidBrush(Color.Red);
                                break;

                        }
                        dc.FillRectangle(Brush, new Rectangle((Cnt2-3)* 16, (22 - Cnt1) * 16, 16, 16));
                    }
                }
            }

            
        }
    }

  
}

 

posted @ 2014-12-30 00:53  默默地EEer  阅读(1964)  评论(1编辑  收藏  举报