zoukankan      html  css  js  c++  java
  • 基于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));
                        }
                    }
                }
    
                
            }
        }
    
      
    }
  • 相关阅读:
    Oracle 11g学习笔记(3)
    模式识别,图像处理工程师的要求
    vc++17 进程间的通信
    vc++学习笔记16 线程同步,异步套接字
    类型转换 float与int ,(int&)a,(int)&a
    vc++学习笔记16 线程同步,异步套接字
    vc++学习之15 多线程与聊天室程序的创建
    testl指令的问题
    C语言的几种位运算
    C语言的几种位运算
  • 原文地址:https://www.cnblogs.com/hebaichuanyeah/p/4192730.html
Copyright © 2011-2022 走看看