`
什么世道
  • 浏览: 219697 次
  • 性别: Icon_minigender_1
  • 来自: 长沙
社区版块
存档分类
最新评论

C#实现俄罗斯方块游戏<续>三维优化

阅读更多
    上篇博文已经介绍俄罗斯方块Demo的简单实现,鄙人在完成了弱弱的简单俄罗斯方块Demo后,想要对Demo进行优化和美化设置,使得俄罗斯的可玩性增强。本篇博文主要在将结构的优化、游戏的美化和可玩性的扩展性上进行改进,让我们的游戏变不那么单调,偶尔也要高端霸气上档次。 

 

第一、算法的优化:

    在Demo中,基本上都是用循环来完成向下、向左、向右的移动、检查是否存在可以得分的行等动作。在这些循环中我们使用了从0到最大值的循环。在检测是否满行和绘制背景的时候,之前采用了历边所有的背景数组。将遍历条件设为缩小到俄罗斯方块完成落下的最小高度,可以缩小循环的范围。从而提高执行效率。

 

故声明一个全局变量
private int lowY = 19; //初始化的时候为到最下面一行。初始背景无任何砖块
 

第二、补全砖块类型:

    俄罗斯方块一共有7种砖块类型,上篇博文鄙人只定义了四种类型,现在将其补齐

可能看过上一篇博文的童鞋可能不太懂这个怎么弄的,其实这个容易理解,把是1的连起来就知道是什么图形了。哈哈,简单吧。。。

 
/// <summary>
        /// 定义砖块int[i,j,y,x] 
        /// 4种类型方块,每种方块的4种方位,4*4的位置矩阵
        /// tricks:i为块砖类型,j为状态,x为行,y为列
        /// </summary>
        private int[, , ,] tricks = {{
                                      {
                                          {1,0,0,0},
                                          {1,0,0,0},
                                          {1,0,0,0},
                                          {1,0,0,0}
                                      },
                                      {
                                          {1,1,1,1},
                                          {0,0,0,0},
                                          {0,0,0,0},
                                          {0,0,0,0}
                                      },
                                      {
                                          {1,0,0,0},
                                          {1,0,0,0},
                                          {1,0,0,0},
                                          {1,0,0,0}
                                      },
                                      {
                                          {1,1,1,1},
                                          {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},
                                           {0,0,0,0}
                                       }
                                   },
                                   {
                                       {
                                           {1,0,0,0},
                                           {1,1,0,0},
                                           {0,1,0,0},
                                           {0,0,0,0}
                                       },
                                       {
                                           {0,1,1,0},
                                           {1,1,0,0},
                                           {0,0,0,0},
                                           {0,0,0,0}
                                       },
                                       {
                                           {1,0,0,0},
                                           {1,1,0,0},
                                           {0,1,0,0},
                                           {0,0,0,0}
                                       },
                                       {
                                           {0,1,1,0},
                                           {1,1,0,0},
                                           {0,0,0,0},
                                           {0,0,0,0}
                                       }
                                   },
                                   {
                                       {
                                           {0,1,0,0},
                                           {1,1,0,0},
                                           {1,0,0,0},
                                           {0,0,0,0}
                                       },
                                       {
                                           {1,1,0,0},
                                           {0,1,1,0},
                                           {0,0,0,0},
                                           {0,0,0,0}
                                       },
                                       {
                                           {0,1,0,0},
                                           {1,1,0,0},
                                           {1,0,0,0},
                                           {0,0,0,0}
                                       },
                                       {
                                           {1,1,0,0},
                                           {0,1,1,0},
                                           {0,0,0,0},
                                           {0,0,0,0}
                                       }
                                   },
                                   {
                                       {
                                           {1,1,0,0},
                                           {0,1,0,0},
                                           {0,1,0,0},
                                           {0,0,0,0}
                                       },
                                       {
                                           {0,0,1,0},
                                           {1,1,1,0},
                                           {0,0,0,0},
                                           {0,0,0,0}
                                       },
                                       {
                                           {1,0,0,0},
                                           {1,0,0,0},
                                           {1,1,0,0},
                                           {0,0,0,0}
                                       },
                                       {
                                           {1,1,1,0},
                                           {1,0,0,0},
                                           {0,0,0,0},
                                           {0,0,0,0}
                                       }
                                   },{{
                                         {1,0,0,0},
                                         {1,1,1,0},
                                         {0,0,0,0},
                                         {0,0,0,0}
                                     },
                                     {
                                         {1,1,0,0},
                                         {1,0,0,0},
                                         {1,0,0,0},
                                         {0,0,0,0}
                                     },
                                     {
                                        {1,1,1,0},
                                        {0,0,1,0},
                                        {0,0,0,0},
                                        {0,0,0,0}

                                     },
                                     {
                                         {0,1,0,0},
                                         {0,1,0,0},
                                         {1,1,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},
                                         {0,1,1,0},
                                         {0,1,0,0},
                                         {0,0,0,0}
                                     },
                                     {
                                        {1,1,1,0},
                                        {0,1,0,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}
                                     }}
                                   };
  

 

 

第三、砖块的美化:

   

      添加颜色

颜色表是一个7*3二维数组

tricksColor[type][color]tpye表示方块类型,

每一种类型指定一种颜色

每一个tpye中含有3个color值,

其中第一个为填充基本方块的颜色,第二个为填充方块上多边形的颜色,第三个为填充方块右多边形的颜色,这样做为了凸显出方块的立体感

 

 
        #region 定义颜色表
        /// <summary>
        /// 各个砖块对应的RGB信息
        /// </summary>
        private Color[,] tricksColor =  {
                                        {Color.FromArgb(0,0,255),Color.FromArgb(200,200,253),Color.FromArgb(98,98,140)},
                                        {Color.FromArgb(255,0,0),Color.FromArgb(253,200,200),Color.FromArgb(140,98,98)}, 
                                        {Color.FromArgb(0,255,20),Color.FromArgb(76,206,23),Color.FromArgb(65,206,45)},
                                        {Color.FromArgb(255,0,255),Color.FromArgb(253,200,255),Color.FromArgb(189,84,255)},
                                        {Color.FromArgb(255,255,0),Color.FromArgb(253,253,200),Color.FromArgb(189,189,84)},
                                        {Color.FromArgb(255,128,0),Color.FromArgb(253,148,41),Color.FromArgb(189,108,17)},
                                        {Color.FromArgb(128,64,64),Color.FromArgb(253,78,68),Color.FromArgb(189,68,68)}
                                        };
        #endregion
 

    将背景矩阵也添加颜色参数

初始默认为黑色,这样立体感更明显。

 

 

 /// <summary>
        /// 定义背景
        /// x:行,y:列,color:颜色
        /// </summary>
        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},{0,0},{0,0},{0,0},{0,0},{0,0},{0,0},{0,0},{0,0},{0,0},{0,0}},
                                     {{0,0},{0,0},{0,0},{0,0},{0,0},{0,0},{0,0},{0,0},{0,0},{0,0},{0,0},{0,0},{0,0},{0,0},{0,0}},
                                     {{0,0},{0,0},{0,0},{0,0},{0,0},{0,0},{0,0},{0,0},{0,0},{0,0},{0,0},{0,0},{0,0},{0,0},{0,0}},
                                     {{0,0},{0,0},{0,0},{0,0},{0,0},{0,0},{0,0},{0,0},{0,0},{0,0},{0,0},{0,0},{0,0},{0,0},{0,0}},
                                     {{0,0},{0,0},{0,0},{0,0},{0,0},{0,0},{0,0},{0,0},{0,0},{0,0},{0,0},{0,0},{0,0},{0,0},{0,0}},
                                     {{0,0},{0,0},{0,0},{0,0},{0,0},{0,0},{0,0},{0,0},{0,0},{0,0},{0,0},{0,0},{0,0},{0,0},{0,0}},
                                     {{0,0},{0,0},{0,0},{0,0},{0,0},{0,0},{0,0},{0,0},{0,0},{0,0},{0,0},{0,0},{0,0},{0,0},{0,0}},
                                     {{0,0},{0,0},{0,0},{0,0},{0,0},{0,0},{0,0},{0,0},{0,0},{0,0},{0,0},{0,0},{0,0},{0,0},{0,0}},
                                     {{0,0},{0,0},{0,0},{0,0},{0,0},{0,0},{0,0},{0,0},{0,0},{0,0},{0,0},{0,0},{0,0},{0,0},{0,0}},
                                     {{0,0},{0,0},{0,0},{0,0},{0,0},{0,0},{0,0},{0,0},{0,0},{0,0},{0,0},{0,0},{0,0},{0,0},{0,0}},
                                     {{0,0},{0,0},{0,0},{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基本的正方形,现在增加绘制上边和右边多边形,以增强立体感

 

/// <summary>
        /// 绘制方块的方法
        /// </summary>
        private void DrawTetris()
        {

            Graphics g = Graphics.FromImage(myImage);
            g.Clear(panel1.BackColor);

            for (int bgy = 19; bgy > lowY - 1; bgy--)
            {
                for (int bgx = 0; bgx < 14; bgx++)
                {
                    if (bgGraoud[bgy, bgx, 0] == 1)
                    {
                        //首先绘制一个基本方块
                        g.FillRectangle(new SolidBrush(tricksColor[bgGraoud[bgy, bgx, 1], 0]), bgx * 20, bgy * 20, 20, 20);
                        //绘制上边
                        g.DrawRectangle(new Pen(panel1.BackColor), bgx * 20, bgy * 20, 20, 20);
                        Point[] myPoints1 = { new Point(bgx * 20 + 5, bgy * 20 - 5), new Point(bgx * 20 + 25, bgy * 20 - 5), new Point(bgx * 20 + 20, bgy * 20), new Point(bgx * 20, bgy * 20) };
                        g.FillPolygon(new SolidBrush(tricksColor[bgGraoud[bgy, bgx, 1], 1]), myPoints1);
                        g.DrawPolygon(new Pen(panel1.BackColor), myPoints1);
                        //绘制右边
                        Point[] myPoints2 = { new Point(bgx * 20 + 20, bgy * 20), new Point(bgx * 20 + 25, bgy * 20 - 5), new Point(bgx * 20 + 25, bgy * 20 + 15), new Point(bgx * 20 + 20, bgy * 20 + 20) };
                        g.FillPolygon(new SolidBrush(tricksColor[bgGraoud[bgy, bgx, 1], 2]), myPoints2);
                    }
                }
            }
            //绘制当前的图片
            for (int y = 3; y >= 0; y--)
            {
                for (int x = 0; x < 4; x++)
                {
                    if (currentTrick[y, x, 0] == 1)
                    {
                        //绘制基本方块
                        g.FillRectangle(new SolidBrush(tricksColor[currentTrick[y, x, 1], 0]), (x + currentX) * 20, (y + currentY) * 20, 20, 20);
                        g.DrawRectangle(new Pen(panel1.BackColor), (x + currentX) * 20, (y + currentY) * 20, 20, 20);

                        //绘制周围区域,增强立体感
                        if (x + 1 + currentX < 14)
                        {
                            if (bgGraoud[y + currentY, x + 1 + currentX, 0] == 0)
                            {
                                //绘制上边
                                Point[] myPoints1 = { new Point((x + currentX) * 20 + 5, (y + currentY) * 20 - 5), new Point((x + currentX) * 20 + 25, (y + currentY) * 20 - 5), new Point((x + currentX) * 20 + 20, (y + currentY) * 20), new Point((x + currentX) * 20, (y + currentY) * 20) };
                                g.FillPolygon(new SolidBrush(tricksColor[currentTrick[y, x, 1], 1]), myPoints1);

                                //绘制右边
                                g.DrawPolygon(new Pen(panel1.BackColor), myPoints1);
                                Point[] myPoints2 = { new Point((x + currentX) * 20 + 20, (y + currentY) * 20), new Point((x + currentX) * 20 + 25, (y + currentY) * 20 - 5), new Point((x + currentX) * 20 + 25, (y + currentY) * 20 + 15), new Point((x + currentX) * 20 + 20, (y + currentY) * 20 + 20) };
                                g.FillPolygon(new SolidBrush(tricksColor[currentTrick[y, x, 1], 2]), myPoints2);
                            }
                            else
                            {
                                Point[] myPoints1 = { new Point((x + currentX) * 20 + 5, (y + currentY) * 20 - 5), new Point((x + currentX) * 20 + 20, (y + currentY) * 20 - 5), new Point((x + currentX) * 20 + 20, (y + currentY) * 20), new Point((x + currentX) * 20, (y + currentY) * 20) };
                                g.FillPolygon(new SolidBrush(tricksColor[currentTrick[y, x, 1], 1]), myPoints1);
                                g.DrawPolygon(new Pen(panel1.BackColor), myPoints1);
                            }
                        }
                        else
                        {
                            Point[] myPoints1 = { new Point((x + currentX) * 20 + 5, (y + currentY) * 20 - 5), new Point((x + currentX) * 20 + 20, (y + currentY) * 20 - 5), new Point((x + currentX) * 20 + 20, (y + currentY) * 20), new Point((x + currentX) * 20, (y + currentY) * 20) };
                            g.FillPolygon(new SolidBrush(tricksColor[currentTrick[y, x, 1], 1]), myPoints1);
                            g.DrawPolygon(new Pen(panel1.BackColor), myPoints1);
                        }
                    }
                }
            }
            Graphics gg = panel1.CreateGraphics();

            gg.DrawImage(myImage, 0, 0);
        }
 

 第四、游戏提示等改进:

    增加游戏控制的显示,增加游戏关卡。

 

改进后的游戏预览



 

 

C#俄罗斯方块游戏Demo的设计请猛戳:

 

 游戏所有源代码和项目已打包上传到:

http://download.csdn.net/detail/u011458382/6342325

 

希望大家多多支持和指正。

  • 大小: 7.5 KB
分享到:
评论

相关推荐

    C#三维俄罗斯方块 源代码项目打包

    本游戏模拟俄罗斯方块游戏...本资源与Blog《C#实现俄罗斯方块游戏&lt;续&gt;三维优化》配套。 如果您下载到了本资源。请去blog上看原文,方便一起学习交流。 本资源对应博文地址为: http://yacare.iteye.com/blog/1949398/

    C#+List+GridControl实现主从表嵌套

    C#+List&lt;T&gt;+GridControl实现主从表嵌套

    C# 解析json格式数据为IList

    C# 解析json格式数据为IList&lt;T&gt;

    c#基础实例

    实例3 人民币大写转换案例&lt;br&gt; 实例4 模拟俄罗斯方块游戏&lt;br&gt; 实例5 模拟联五子游戏&lt;br&gt; 第四章 系统文件处理&lt;br&gt; 实例1 文件资源管理器&lt;br&gt; 实例2 模拟IE浏览器&lt;br&gt; 实例3 一个具有查找打印功能的文本编译器&lt;br&gt;&lt;br...

    C#实现俄罗斯方块 C# 小游戏

    C#实现俄罗斯方块,为用C#编写的一个游戏,希望对C#爱好着有帮助。在vs2005,vs2008 调试通过

    C#实现俄罗斯方块游戏源码.zip

    C#实现俄罗斯方块游戏源码,C#实现俄罗斯方块游戏源码

    基于C#,俄罗斯方块游戏系统

    基于C#,俄罗斯方块游戏系统,基于C#,俄罗斯方块游戏系统基于C#,俄罗斯方块游戏系统基于C#,俄罗斯方块游戏系统基于C#,俄罗斯方块游戏系统基于C#,俄罗斯方块游戏系统

    c#做的俄罗斯方块

    c#做的俄罗斯方块&lt;br&gt;c#做的俄罗斯方块&lt;br&gt;c#做的俄罗斯方块

    c#实现俄罗斯方块游戏

    用c#实现俄罗斯方块!程序已经在vs2008上通过调试

    C#实现俄罗斯方块游戏代码

    C#实现俄罗斯方块游戏代码,注释完整,代码规范,供大家学习使用 C#Winform实现俄罗斯方块休息代码 C#绘图,GDI绘图,GDI+绘图 学习资源

    c#编写的俄罗斯方块游戏完整源码

    根据网上视频学习制作的俄罗斯方块游戏,进行了优化,有完整的代码,用C#语言编写的,可以自己设置方块样式,总共10关,一关100分,1000分通关

    C#俄罗斯方块 源代码项目打包

    本游戏模拟俄罗斯方块游戏,功能均...本资源与Blog《C#实现俄罗斯方块游戏&lt;一&gt; 》。 如果您下载到了本资源。请去blog上看原文,方便一起学习交流。 本资源的配套博文地址为: http://yacare.iteye.com/blog/1948971

    C#写的简单俄罗斯方块游戏

    用C#写的窗体俄罗斯方块小游戏,主要用二维数组的形式实现。

    C#课程设计 俄罗斯方块游戏 源码

    C#课程设计 俄罗斯方块游戏 源码,让你的C#课程设计变得简单,真的

    C#俄罗斯方块游戏源代码,带背景音乐和音效

    C#俄罗斯方块游戏源代码,程序设计时加入了背景音乐和声音特效,可以说是一套成熟的作品,正在学习C#开发的童鞋不妨好好参考一下,感谢您对烈火下载的支持与厚爱,但是不要将源码用于商业用途!

    C#编程经验技巧宝典

    43&lt;br&gt;&lt;br&gt;0061 树的实现 44&lt;br&gt;&lt;br&gt;3.2 排序 48&lt;br&gt;&lt;br&gt;0062 如何实现选择排序算法 48&lt;br&gt;&lt;br&gt;0063 如何实现冒泡排序算法 49&lt;br&gt;&lt;br&gt;0064 如何实现快速排序算法 50&lt;br&gt;&lt;br&gt;0065 如何实现插入排序算法 ...

    C#俄罗斯方块游戏源码

    C#俄罗斯方块游戏源码

    C#版编写的俄罗斯方块游戏

    本篇介绍用C#编写一个俄罗斯方块程序的原理,以及在C#里面播放声音,保存游戏设置的方法。 游戏界面预览: 菜单预览: 自定义每个小方块颜色功能界面: 游戏主要有四部分组成:Square类,Block类,game...

    C#俄罗斯方块(多国语言完美版)

    C#编写的俄罗斯方块,功能强大,界面美观,多国语言界面。 ^_^&lt;br&gt;PS:输入 上上下下左右左右 可直接通关。

    C#俄罗斯方块(winform)

    C#俄罗斯方块(winform)C#俄罗斯方块(winform)C#俄罗斯方块(winform)C#俄罗斯方块(winform)C#俄罗斯方块(winform)C#俄罗斯方块(winform)C#俄罗斯方块(winform)

Global site tag (gtag.js) - Google Analytics