• GDI学习之俄罗斯方块续


    当前方块对象

    #region 定义砖块int[i,j,y,x] Tricks:i为那块砖,j为状态,y为列,x为行
            private int[, , ,] Tricks = {{  
                                          {  
                                              {0,1,0,0},  
                                              {0,1,0,0},  
                                              {0,1,0,0},  
                                              {0,1,0,0}  
                                          },  
                                          {  
                                              {0,0,0,0},   
                                              {0,0,0,0}, 
                                              {1,1,1,1},  
                                              {0,0,0,0}  
                                          },  
                                          {  
                                              {0,0,1,0},  
                                              {0,0,1,0},  
                                              {0,0,1,0},  
                                              {0,0,1,0}  
                                          },  
                                          {  
                                              {0,0,0,0},  
                                              {1,1,1,1},  
                                              {0,0,0,0},  
                                              {0,0,0,0}  
                                          }  
                                      },  
                                      {  
                                           {  
                                               {0,0,0,0},  
                                               {0,1,1,0},  
                                               {0,1,1,0},  
                                               {0,0,0,0}  
                                           },  
                                           {  
                                               {0,0,0,0},  
                                               {0,1,1,0},  
                                               {0,1,1,0},  
                                               {0,0,0,0}  
                                           },  
                                           {  
                                               {0,0,0,0},  
                                               {0,1,1,0},  
                                               {0,1,1,0},  
                                               {0,0,0,0}  
                                           },  
                                           {  
                                               {0,0,0,0},  
                                               {0,1,1,0},  
                                               {0,1,1,0},  
                                               {0,0,0,0}  
                                           }  
                                       },  
                                       {  
                                           {  
                                               {0,1,0,0},  
                                               {0,1,1,0},  
                                               {0,0,1,0},  
                                               {0,0,0,0}  
                                           },  
                                           {  
                                               {0,0,0,0},  
                                               {0,0,1,1},  
                                               {0,1,1,0},  
                                               {0,0,0,0}  
                                           },  
                                           {  
                                               {0,1,0,0},  
                                               {0,1,1,0},  
                                               {0,0,1,0},  
                                               {0,0,0,0}   
                                           },  
                                           {  
                                               {0,0,0,0},  
                                               {0,0,1,1},  
                                               {0,1,1,0},  
                                               {0,0,0,0}  
                                           }  
                                       },  
                                       {  
                                           {  
                                               {0,0,1,0},  
                                               {0,1,1,0},  
                                               {0,1,0,0},  
                                               {0,0,0,0}  
                                           },  
                                           {  
                                               {0,0,0,0},  
                                               {1,1,0,0},  
                                               {0,1,1,0},  
                                               {0,0,0,0}  
                                           },  
                                           {  
                                               {0,0,1,0},  
                                               {0,1,1,0},  
                                               {0,1,0,0}, 
                                               {0,0,0,0}  
                                           },  
                                           {  
                                               {0,0,0,0},  
                                               {1,1,0,0},  
                                               {0,1,1,0},  
                                               {0,0,0,0}   
                                           }  
                                       },  
                                       {  
                                           {  
                                               {0,1,1,0},  
                                               {0,0,1,0},  
                                               {0,0,1,0},  
                                               {0,0,0,0}  
                                           },  
                                           {  
                                               {0,0,1,0},  
                                               {1,1,1,0},  
                                               {0,0,0,0},  
                                               {0,0,0,0}  
                                           },  
                                           {  
                                               {0,1,0,0},  
                                               {0,1,0,0},  
                                               {0,1,1,0},  
                                               {0,0,0,0}  
                                           },  
                                           {  
                                               {1,1,1,0},  
                                               {1,0,0,0},  
                                               {0,0,0,0},  
                                               {0,0,0,0}  
                                           }  
                                       },  
                                       {  
                                           {  
                                               {0,1,1,0},  
                                               {0,1,0,0},  
                                               {0,1,0,0},  
                                               {0,0,0,0}  
                                           },  
                                           {  
                                               {1,1,1,0},  
                                               {0,0,1,0},  
                                               {0,0,0,0},  
                                               {0,0,0,0}  
                                           },  
                                           {  
                                               {0,0,1,0},  
                                               {0,0,1,0},  
                                               {0,1,1,0},  
                                               {0,0,0,0}  
                                           },  
                                           {  
                                               {1,0,0,0},  
                                               {1,1,1,0},  
                                               {0,0,0,0},  
                                               {0,0,0,0}  
                                           }  
                                       },  
                                       {  
                                           {  
                                               {0,1,0,0},  
                                               {1,1,1,0},  
                                               {0,0,0,0},  
                                               {0,0,0,0}  
                                           },  
                                           {  
                                               {0,1,0,0},  
                                               {1,1,0,0},  
                                               {0,1,0,0},  
                                               {0,0,0,0}  
                                           },  
                                           {  
                                               {0,0,0,0},  
                                               {1,1,1,0},  
                                               {0,1,0,0},  
                                               {0,0,0,0}  
                                           },  
                                           {  
                                               {0,1,0,0},  
                                               {0,1,1,0},  
                                               {0,1,0,0},  
                                               {0,0,0,0}  
                                           }  
                                       }};
    
            #endregion
    
            //当前的砖块  
            public int[,] CurrentTrick = new int[4, 4];
    
            //CurrentTrickNum当前砖块的数目, CurrentStatusNum当前状态,CurrentColor当前颜色, CurrentX当前x, CurrentY当前y
            public int CurrentTrickNum, CurrentStatusNum, CurrentColor, CurrentX, CurrentY;
    
            //方块种类
            private int TricksNum = 4;
    
            //方块样式
            private int StatusNum = 4;
    
            //颜色种类
            private int ColorNum = 5;
    
            private Random rand = new Random();
    
            /// <summary>  
            /// 随机生成方块和状态  
            /// </summary>  
            public void BeginTricks()
            {
                //随机生成砖码和状态码  
                CurrentTrickNum = rand.Next(0, TricksNum);
                CurrentStatusNum = rand.Next(0, StatusNum);
                CurrentColor = rand.Next(1, ColorNum);
                //分配数组  
                for (int y = 0; y < 4; y++)
                {
                    for (int x = 0; x < 4; x++)
                    {
                        CurrentTrick[y, x] = Tricks[CurrentTrickNum, CurrentStatusNum, y, x];
                    }
                }
                CurrentX = 5;
                CurrentY = 0;
            }
    
            /// <summary>  
            /// 变化方块  
            /// </summary>  
            public void ChangeTricks()
            {
                if (CurrentStatusNum < 3)
                {
                    CurrentStatusNum++;
                }
                else
                {
                    CurrentStatusNum = 0;
                }
                for (int y = 0; y < 4; y++)
                {
                    for (int x = 0; x < 4; x++)
                    {
                        CurrentTrick[y, x] = Tricks[CurrentTrickNum, CurrentStatusNum, y, x];
                    }
                }
            }
    
            /// <summary>  
            /// 下落方块  
            /// </summary>  
            public void DownTricks()
            {
                CurrentY++;
            }
    
            /// <summary>  
            /// 左移方块  
            /// </summary>  
            public void LeftTricks()
            {
                CurrentX--;
            }
    
            /// <summary>  
            /// 右移方块  
            /// </summary>  
            public void RightTricks()
            {
                CurrentX++;
            }
    Brick

    操作类

    #region 定义背景
            private int[,] bgGraoud ={  
                                         {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,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,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,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,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,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,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,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,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,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,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,0,0,0,0,0}  
                                     };
            #endregion
    
            //定义颜色
            private Color[] TrickColor = { Color.Transparent, Color.Red, Color.Blue, Color.Orange, Color.Green };
    
            //Sorce分数  
            public int Sorce;
    
            private Image myImage;
    
            private Color backColor;
    
            private Brick brick = new Brick();
    
            public TetrisHelper(Image myImage, Color backColor)
            {
                this.myImage = myImage;
                this.backColor = backColor;
            }
    
            /// <summary>
            /// 重新开始
            /// </summary>
            public void Renew()
            {
                Sorce = 0;
                for (int y = 0; y < 20; y++)
                {
                    for (int x = 0; x < 14; x++)
                    {
                        bgGraoud[y, x] = 0;
                    }
                }
            }
    
            /// <summary>  
            /// 随机生成方块和状态  
            /// </summary>  
            public void BeginTricks()
            {
                brick.BeginTricks();
            }
    
            /// <summary>  
            /// 变化方块  
            /// </summary>  
            public void ChangeTricks()
            {
                brick.ChangeTricks();
            }
    
            /// <summary>  
            /// 检测是否可以向下了  
            /// </summary>  
            /// <returns></returns>  
            private bool CheckIsDown()
            {
                for (int y = 0; y < 4; y++)
                {
                    for (int x = 0; x < 4; x++)
                    {
                        if (brick.CurrentTrick[y, x] == 1)
                        {
                            //超过了背景  
                            if (y + brick.CurrentY + 1 >= 20)
                            {
                                return false;
                            }
                            if (x + brick.CurrentX >= 14)
                            {
                                brick.CurrentX = 13 - x;
                            }
                            if (bgGraoud[y + brick.CurrentY + 1, x + brick.CurrentX] >= 1)
                            {
                                return false;
                            }
                        }
                    }
                }
                return true;
            } 
    
            /// <summary>  
            /// 下落方块  
            /// </summary>  
            public bool DownTricks()
            {
                if (CheckIsDown())
                {
                    brick.DownTricks();
                }
                else
                {
                    if (brick.CurrentY == 0)
                    {
                        return false;
                    }
                    //下落完成,修改背景  
                    for (int y = 0; y < 4; y++)
                    {
                        for (int x = 0; x < 4; x++)
                        {
                            if (brick.CurrentTrick[y, x] == 1)
                            {
                                bgGraoud[brick.CurrentY + y, brick.CurrentX + x] = brick.CurrentColor;
                            }
                        }
                    }
                    CheckSore();
                    BeginTricks();
    
                }
                return true;
            }
    
            /// <summary>  
            /// 检测是否可以左移  
            /// </summary>  
            /// <returns></returns>  
            private bool CheckIsLeft()
            {
                for (int y = 0; y < 4; y++)
                {
                    for (int x = 0; x < 4; x++)
                    {
                        if (brick.CurrentTrick[y, x] == 1)
                        {
                            if (x + brick.CurrentX - 1 < 0)
                            {
                                return false;
                            }
                            if (bgGraoud[y + brick.CurrentY, x + brick.CurrentX - 1] >= 1)
                            {
                                return false;
                            }
                        }
                    }
                }
                return true;
            }  
    
            /// <summary>  
            /// 左移方块  
            /// </summary> 
            public void LeftTricks()
            {
                if (CheckIsLeft())
                {
                    brick.LeftTricks();
                }
            }
    
            /// <summary>  
            /// 检测是否可以右移  
            /// </summary>  
            /// <returns></returns>  
            private bool CheckIsRight()
            {
                for (int y = 0; y < 4; y++)
                {
                    for (int x = 0; x < 4; x++)
                    {
                        if (brick.CurrentTrick[y, x] == 1)
                        {
                            if (x + brick.CurrentX + 1 >= 14)
                            {
                                return false;
                            }
                            if (bgGraoud[y + brick.CurrentY, x + brick.CurrentX + 1] >= 1)
                            {
                                return false;
                            }
                        }
                    }
                }
                return true;
            }  
    
    
            /// <summary>  
            /// 右移方块  
            /// </summary> 
            public void RightTricks()
            {
                if (CheckIsRight())
                {
                    brick.RightTricks();
                }
            }
    
            public Image Draw()
            {
                Graphics g = Graphics.FromImage(myImage);
                g.Clear(backColor);
                for (int bgy = 0; bgy < 20; bgy++)
                {
                    for (int bgx = 0; bgx < 14; bgx++)
                    {
                        if (bgGraoud[bgy, bgx] > 0)
                        {
                            g.FillRectangle(new SolidBrush(TrickColor[bgGraoud[bgy, bgx]]), bgx * 20, bgy * 20, 20, 20);
                            g.DrawRectangle(Pens.White, bgx * 20, bgy * 20, 20, 20);
                        }
                    }
                }
                //绘制当前的图片  
                for (int y = 0; y < 4; y++)
                {
                    for (int x = 0; x < 4; x++)
                    {
                        if (brick.CurrentTrick[y, x] == 1)
                        {
                            g.FillRectangle(new SolidBrush(TrickColor[brick.CurrentColor]), (x + brick.CurrentX) * 20, (y + brick.CurrentY) * 20, 20, 20);
                            g.DrawRectangle(Pens.White, (x + brick.CurrentX) * 20, (y + brick.CurrentY) * 20, 20, 20);
                        }
                    }
                }
    
                return myImage;
            }
    
            private void CheckSore()
            {
                for (int y = 19; y > -1; y--)
                {
                    bool isFull = true;
                    for (int x = 13; x > -1; x--)
                    {
                        if (bgGraoud[y, x] == 0)
                        {
                            isFull = false;
                            break;
                        }
                    }
                    if (isFull)
                    {
                        //增加积分  
                        Sorce = Sorce + 100;
                        for (int yy = y; yy > 0; yy--)
                        {
                            for (int xx = 0; xx < 14; xx++)
                            {
                                int temp = bgGraoud[yy - 1, xx];
                                bgGraoud[yy, xx] = temp;
                            }
                        }
                        y++;
                    }
                }
            }
    TetrisHelper

    窗体代码

    public Form1()
            {
                InitializeComponent();
            }
    
            TetrisHelper tetrisHelper;
    
            private void Form1_Load(object sender, EventArgs e)
            {
                //初始化
                Image myImage = new Bitmap(panel1.Width, panel1.Height);
                tetrisHelper = new TetrisHelper(myImage, panel1.BackColor);
                loadGame();
            }
    
            protected override void OnPaint(PaintEventArgs e)
            {
                Draw();
                base.OnPaint(e);
            }
    
            private void loadGame()
            {
                timer1.Interval = 1000;
                tetrisHelper.Renew();
                label1.Text = "分数:" + tetrisHelper.Sorce;
                tetrisHelper.BeginTricks();
                button2.Text = "开始游戏";
                this.Focus();
            }
    
    
    
            private void timer1_Tick(object sender, EventArgs e)
            {
                if (tetrisHelper.DownTricks())
                {
                    Draw();
                }
                else
                {
                    timer1.Stop();
                    if (MessageBox.Show("哈哈,你玩玩了", "确认", MessageBoxButtons.OK, MessageBoxIcon.Information) == DialogResult.OK)
                    {
                        loadGame();
                    }
                }
            }
    
            private void Form1_KeyDown(object sender, KeyEventArgs e)
            {
                if (timer1.Enabled == false)
                {
                    return;
                }
                if (e.KeyCode == Keys.W)
                {
                    tetrisHelper.ChangeTricks();
                    Draw();
                }
                else if (e.KeyCode == Keys.A)
                {
                    tetrisHelper.LeftTricks();
                    Draw();
                }
                else if (e.KeyCode == Keys.D)
                {
                    tetrisHelper.RightTricks();
                    Draw();
                }
                else if (e.KeyCode == Keys.S)
                {
                    timer1.Stop();
                    timer1.Interval = 10;
                    timer1.Start();
                }
            }
    
            private void Form1_KeyUp(object sender, KeyEventArgs e)
            {
                if (timer1.Enabled == false)
                {
                    return;
                }
                if (e.KeyCode == Keys.S)
                {
                    timer1.Stop();
                    timer1.Interval = 1000;
                    timer1.Start();
                }
            }
    
            private void Draw()
            {
                Image img = tetrisHelper.Draw();
    
                Graphics gg = panel1.CreateGraphics();
    
                gg.DrawImage(img, 0, 0);
            }  
    
            private void button2_Click(object sender, EventArgs e)
            {
                if (button2.Text == "暂停游戏")
                {
                    button2.Text = "开始游戏";
                    timer1.Stop();
                }
                else
                {
                    button2.Text = "暂停游戏";
                    timer1.Start();
                }
            }
    Form1

    页面展现

  • 相关阅读:
    Ubuntu 14.04 apt-get update失效解决(转)
    linux内核动态调试技术
    Ubuntu18.04开机挂载硬盘
    valgrind memcheck使用方法及效果(转)
    网络测试工具netperf(转)
    开发pc端项目可支持多个窗口登陆
    sql常用语句
    包装类和基础类的区别
    @param
    前台后台的顺序
  • 原文地址:https://www.cnblogs.com/margin-gu/p/5310363.html
Copyright © 2020-2023  润新知