首页 > 代码库 > 基于C#俄罗斯方块

基于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));                    }                }            }                    }    }  }

 

基于C#俄罗斯方块