- 浏览: 222833 次
- 性别:
- 来自: 长沙
文章分类
最新评论
-
jeffsc:
请问楼主最后得出的结论是什么呢,自定义的hashmap比较快? ...
深入浅出HashMap -
fnet:
hibernate 1+N 是程序员的福音
Hibernate 1+N 问题 -
zyz251314:
这个springsize3里面早就有了啊
Hibernte基于泛型DAO设计 -
当时我就震惊了:
https://github.com/neesonqk/Hib ...
Hibernte基于泛型DAO设计 -
当时我就震惊了:
https://github.com/neesonqk/Hib ...
Hibernte基于泛型DAO设计
上篇博文已经介绍俄罗斯方块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的设计请猛戳:
相关推荐
本游戏模拟俄罗斯方块游戏...本资源与Blog《C#实现俄罗斯方块游戏<续>三维优化》配套。 如果您下载到了本资源。请去blog上看原文,方便一起学习交流。 本资源对应博文地址为: http://yacare.iteye.com/blog/1949398/
《C#实现的俄罗斯方块游戏详解》 俄罗斯方块,这款经典的电子游戏自1984年诞生以来,就以其简洁的规则和无尽的挑战性吸引了无数玩家。而用C#语言实现的俄罗斯方块系统,不仅保留了游戏的本质魅力,还展示了C#在图形...
《C#实现俄罗斯方块小游戏详解》 C#是一种广泛应用于游戏开发的编程语言,尤其在Windows平台上的小型游戏开发中,C#以其强大的性能和易用性深受开发者喜爱。本篇文章将深入探讨如何利用C#语言设计一个简易的俄罗斯...
在现代编程领域,用C#语言实现俄罗斯方块是一种常见的学习实践,它有助于开发者掌握游戏开发的基础知识,包括图形界面设计、事件处理、数据结构和算法等。本文将深入探讨C#实现俄罗斯方块的原理,并通过源码分析,...
在俄罗斯方块游戏中,我们需要实现游戏的逻辑,包括俄罗斯方块的移动、旋转和消除。在游戏中,我们可以使用状态机来实现游戏的逻辑。 8.游戏开发 在俄罗斯方块游戏中,我们需要开发游戏的界面和逻辑。在C#中,我们...
《C#俄罗斯方块游戏制作学习》 C#是一种广泛应用于Windows桌面应用、游戏开发、Web应用等领域的编程语言,其简洁的语法和强大的.NET框架支持使得开发过程高效且易于理解。本篇将深入探讨如何使用C#进行俄罗斯方块...
总结,通过C#实现的俄罗斯方块游戏,不仅展示了C#编程的基本原理和面向对象的设计思想,也涉及到了游戏开发中的一些核心概念,如游戏逻辑、图形界面设计和性能优化。学习这个项目,可以帮助开发者进一步理解C#语言和...
《C# WinForm技术在构建俄罗斯方块游戏中的应用详解》 C# WinForm是一种基于.NET Framework的桌面应用程序开发框架,它为开发者提供了丰富的控件和API,使得创建交互式用户界面变得简单易行。本项目是利用C# ...
《C#实现俄罗斯方块详解》 在编程领域,俄罗斯方块是一款经典的休闲游戏,它以其简单的规则和无尽的挑战性吸引了无数玩家。本文将深入探讨如何使用C#编程语言来实现这一经典游戏,同时提供相关的源码供学习参考。 ...
《C#版俄罗斯方块游戏开发详解》 俄罗斯方块,这款诞生于1984年的经典游戏,凭借其简洁的规则和无限的挑战性,一直深受全球玩家喜爱。如今,借助C#这一强大且易学的编程语言,我们可以自行构建一款属于自己的俄罗斯...
在提供的"C#俄罗斯方块全部源代码.rar"中,主要包含了Tetris项目文件,可能包括以下几个关键文件: - **Tetris.cs**: 游戏主窗口类,包含游戏初始化、图形绘制、事件处理等方法。 - **GameLogic.cs**: 游戏逻辑类,...
《C#语言实现的俄罗斯方块游戏源代码详解》 在编程领域,源代码是程序员的语言,通过阅读和理解源代码,我们可以深入了解程序的工作原理。本文将深入剖析一款基于C#语言开发的经典俄罗斯方块游戏的源代码,帮助读者...
在C#中,我们通常使用while循环或System.Threading.Tasks.Task.Run方法来实现游戏循环。同时,事件处理是游戏与用户交互的关键,C#中的事件和委托机制能帮助我们轻松响应键盘输入,控制方块的移动和旋转。 三、图形...
《陈广c#制作俄罗斯方块8》是一个关于利用C#编程语言开发经典游戏——俄罗斯方块的教程。在这个项目中,陈广通过简洁而高效的代码实现了一个小巧且清晰的SWF格式游戏。SWF(Shockwave Flash)是Adobe Flash Player...
总的来说,"C#俄罗斯方块与贪吃蛇"项目是一个综合性的学习实践,涵盖了C#基础知识、图形界面编程、事件处理、算法设计等多个方面。通过完成这个项目,开发者不仅可以掌握游戏开发的基本技能,还能锻炼解决问题和调试...
在C#中实现俄罗斯方块,我们需要构建一个基本的游戏框架,包括游戏窗口、游戏逻辑处理、图形渲染以及用户输入响应。其中,Windows Forms或WPF可以用于创建游戏窗口,控制台程序则可以用于简化版的实现。 三、游戏...
本篇将深入探讨一个使用C#语言编写的俄罗斯方块源码,通过分析代码,我们可以学习到C#的基本语法、游戏逻辑的实现以及面向对象编程的思想。 一、C#基础应用 C#是微软开发的一种面向对象的编程语言,以其简洁、高效...
《C#实现的俄罗斯方块游戏详解》 俄罗斯方块是一款经典的电子游戏,自1984年诞生以来,就以其简洁的规则和无尽的挑战性吸引了无数玩家。本篇将详细介绍使用C#编程语言实现的俄罗斯方块游戏,这不仅是对C#语言掌握的...
通过阅读和理解C#实现的俄罗斯方块源代码,不仅可以掌握游戏开发的基本流程,还能加深对C#编程语言的理解,提升编程技能。无论你是初学者还是经验丰富的开发者,这样的实践都是提高编程能力的良好途径。