基于.NET的俄罗斯方块课程设计
基于.NET的俄罗斯方块课程设计
基于C#的俄罗斯方块游戏的设计与实现
前言
随着我国物质生活的巨大提高,人们的精神文化需求也不断提升,从温饱中解放出来的人们将会更多地关注娱乐活动。俄罗斯方块游戏就能够很好地满足人们日常简单的娱乐需求。俄罗斯方块游戏风靡于90年代,是现在青年人的美好回忆。因为俄罗斯方块游戏的规则简单,而且简单的几条规则就足够使得游戏过程变化多端,因此一直以来都被认为是益智游戏而广泛流行于人民群众中。Windows自带的游戏功能一直缺少俄罗斯方块这一个最流行最原始的游戏,因此基于C#和.NET平台开发一个俄罗斯方块游戏是很有必要的。
我们将设计实现一款基于C#和.NET的俄罗斯方块游戏,用户可以在安装了.NET Framework 的windows平台上进行游戏。俄罗斯方块游戏将使用Visual Studio 2015 Community IDE进行开发。开发完成的游戏可以导出为.exe文件,然后用户可以对游戏进行下载并且点击运行。本论文先对开发北京进行介绍,然后对游戏的开发技术进行分析和简介,最后进行了代码的实现以及测试。
1 绪论
1.1 研究背景
电脑游戏是一种新兴的文化现象,也是一个新型的朝阳行业。游戏开发至今已经有30多年,在这个短暂的时期里,随着硬件水平的提高,游戏开发新技术层出不穷,经典游戏比比皆是。俄罗斯方块是一个非常复杂但是比较有趣并且耐玩的,也是大家比较熟悉的单击小游戏。游戏中共有7种方块,每种方块由4个方格组成。这7种方块可以旋转90度、180度、270度,因此每种方块有4种状态,7种方块总共有28种状态。28种状态的方块随机产生,自由下落,落下时可由玩家用上、下、左、右控制键控制翻转和移动,以便以玩家所需要的形态和位置落下。如果落下时,方块的方格能填满某一行,则这一行可消去。消去一行后,游戏可给玩家加分,若由存在空格的方块填满整个窗口,则游戏失败。
1.2 研究意义
随着我国物质生活的巨大提高,人们的精神文化需求也不断提升,从温饱中解放出来的人们将会更多地关注娱乐活动。俄罗斯方块游戏就能够很好地满足人们日常简单的娱乐需求。俄罗斯方块游戏风靡于90年代,是现在青年人的美好回忆。因为俄罗斯方块游戏的规则简单,而且简单的几条规则就足够使得游戏过程变化多端,因此一直以来都被认为是益智游戏而广泛流行于人民群众中。在现金电子信息高速发展的时代,电子游戏已深入人们的日常生活,由于经典有趣,因而得到了广泛的流行,成为老少皆宜的娱乐方式。俄罗斯方块是一款风靡全球的游戏,最初是由苏联人制作的,规则简单,容易上手且游戏全过程变化无穷,可以让玩家充分感受游戏中的乐趣。在游戏设计方面,俄罗斯方块游戏的设计工作既复杂又富有挑战性,它包含的内容多,涉及的知识广泛,与图形界面联系比较大。在设计过程中必将涉及到各个方面的知识。
1.3 论文构成及研究内容
第一章 介绍了该课题的背景、目的及国内外研究状况。
第二章 介绍了该设计实现过程中所使用到的技术原理,这些是此课题实现的基本理论。
第三章 粗略的描述了课题的设计,这其中描述了课题的功能以及对这些功能的分析等。
第四章 详细描述了课题各个功能的具体设计思想与具体实现的过程。
第五章 对游戏进行了测试和验证。
2 俄罗斯方块游戏开发技术介绍
2.1 .NET平台
.NET就是微软用来实现XML,Web Services,SOA(面向服务的体系结构service-oriented architecture)和敏捷性的技术。对技术人员,想真正了解什么是.NET,必须先了解.NET技术出现的原因和它想解决的问题,必须先了解为什么他们需要XML,Web Services 和 SOA。技术人员一般将微软看成一个平台厂商。微软搭建技术平台,而技术人员在这个技术平台之上创建应用系统。从这个角度,.NET也可以如下来定义:.NET是微软的新一代技术平台,为敏捷商务构建互联互通的应用系统,这些系统是基于标准的,联通的,适应变化的,稳定的和高性能的。从技术的角度,一个.NET应用是一个运行于.NET Framework之上的应用程序。(更精确的说,一个.NET应用是一个使用.NET Framework类库来编写,并运行于公共语言运行时Common Language Runtime之上的应用程序。)如果一个应用程序跟.NET Framework无关,它就不能叫做.NET程序。比如,仅仅使用了XML并不就是.NET应用,仅仅使用SOAP SDK调用一个Web Service也不是.NET应用。.NET是基于Windows操作系统运行的操作平台,应用于互联网的分布式。
2.2 编程语言
C#是一种编程语言,它是为生成在 .NET Framework 上运行的多种应用程序而设计的。C# 简单、功能强大、类型安全,而且是面向对象的。C# 凭借它的许多创新,在保持 C 样式语言的表示形式和优美的同时,实现了应用程序的快速开发。
2.3 .NET Framework
.net Framework是一个可以用来快速开发、部署网站服务及应用程序的开发平台。这个架构是两个项目的结果:第一个项目的目的是用来改善Windows 作业平台上的程序开发,特别是改善COM(Component Object Model,组件对象模块。一种微软所制定的软件技术;让对象的功能可以被其它软件所叫用,可以让组件重复使用、容易更新及维护);第二个项目则是制作一个以发展服务(Service)软件为目标的开发平台。这两个项目团队三年多前就已经在一起工作,他们希望可以发展出一种可以快速开发出以因特网为基础,而且易学易用的开发平台。
.net Framework 具有两个主要组件:公共语言运行库和.net Framework 类库。
公共语言运行库是.net Framework 的基础。您可以将公共语言运行库看作一个在执行时管理代码的代理,它提供内存管理、线程管理和远程处理等核心服务,并且还强制实施严格的类型安全以及可提高安全性和可靠性的其他形式的代码准确性。这类似于Java的虚拟机。事实上,代码管理的概念是公共语言运行库的基本原则。以公共语言运行库为目标的代码称为托管代码,而不以公共语言运行库为目标的代码称为非托管代码。
.net Framework 的另一个主要组件是类库,它是一个综合性的面向对象的可重用类型集合,您可以使用它开发多种应用程序,这些应用程序包括传统的命令行或图形用户界面 (GUI) 应用程序,也包括基于 ASP.net 所提供的最新创新的应用程序(如 Web 窗体和 XML Web services)。
.net Framework 旨在实现下列目标:
提供一个一致的面向对象的编程环境,而无论对象代码是在本地存储和执行,还是在本地执行但在 Internet 上分布,或者是在远程执行的。
提供一个将软件部署和版本控制冲突最小化的代码执行环境。
提供一个可提高代码(包括由未知的或不完全受信任的第三方创建的代码)执行安全性的代码执行环境。
提供一个可消除脚本环境或解释环境的性能问题的代码执行环境。
使开发人员的经验在面对类型大不相同的应用程序(如基于 Windows 的应用程序和基于 Web 的应用程序)时保持一致。
按照工业标准生成所有通信,以确保基于.net Framework 的代码可与任何其他代码集成。
.NET Framework 具有两个主要组件:公共语言运行库和 .NET Framework 类库。公共语言运行库是 .NET Framework 的基础。您可以将运行库看作一个在执行时管理代码的代理,它提供内存管理、线程管理和远程处理等核心服务,并且还强制实施严格的类型安全以及可提高安全性和可靠性的其他形式的代码准确性。事实上,代码管理的概念是运行库的基本原则。以运行库为目标的代码称为托管代码,而不以运行库为目标的代码称为非托管代码。.NET Framework 的另一个主要组件是类库,它是一个综合性的面向对象的可重用类型集合,您可以使用它开发多种应用程序,这些应用程序包括传统的命令行或图形用户界面(GUI) 应用程序,也包括基于所提供的最新创新的应用程序(如 Web 窗体和 XML Web services)。
.NET Framework安全解决方案基于管理代码的概念,以及由通用语言运行时(CLR)加强的安全规则。大部分管理代码需要进行验证以确保类型安全及预先定义好的其它属性的行为的安全。例如,在验证的代码中,声明为接收4字节值的访问将拒绝提供8字节参数的调用,因为不是类型安全的。验证过程还确保了执行流只传送到已知的位置,如方法入口点–这个过程去除了跳转到任意位置执行的能力。
验证将阻止不是类型安全的代码执行,在它们引起破坏前捕获很多常见的编程错误。通常的弱点–如缓存溢出,对任意内存或没有初始化的内存的读取,对控件的随意传送–都不再可能出现。这将使最终用户受益,因为在他们执行代码前对其进行检查。这也有益于开发人员,他们会发现很多常见错误(过去一直在困扰前开发)现在可以查明,并能阻止它们引起破坏。
CLR也能使非管理代码运行,但非管理代码不能从这些安全措施中受益。特殊的许可与对非管理代码的调用能力相关,一个强大的安全策略能确保这些许可被恰当地给予。经过很长时间后,非管理代码到管理代码的移植将减少对非管理代码的调用频率。
2.5 开发工具的选择
2.5.1 MonoDevelop
MonoDevelop 是个Linux平台上的开放源代码集成开发环境,主要用来开发Mono与.NET Framework软件。MonoDevelop 整合了很多Eclipse与Microsoft Visual Studio的特性,像是 Intellisense、版本控制还有 GUI 与 Web 设计工具。另外还整合了GTK# GUI设计工具(叫做Stetic)。目前支援的语言有C#、Java、BOO、Nemerle、Visual Basic .NET、CIL、C与C++ 。
MonoDevelop支持使用C#和其他.NET语言进行开发,它使得开发者可以在Linux和Mac OS X上非常迅速的开发出桌面软件和ASP NET Web应用。除此之外,MonoDevelop还允许开发者非常简单的将Visual Studio开发的.NET应用程序移植到Linux和Mac OS X下,这样开发者只需要维护一套代码即可──因为GTK#是跨平台的。
2.5.2 Visual Studio
Microsoft Visual Studio(简称VS)是美国微软公司的开发工具包系列产品。VS是一个基本完整的开发工具集,它包括了整个软件生命周期中所需要的大部分工具,如UML工具、代码管控工具、集成开发环境(IDE)等等。所写的目标代码适用于微软支持的所有平台,包括Microsoft Windows、Windows Mobile、Windows CE、.NET Framework、.NET Compact Framework和Microsoft Silverlight 及Windows Phone。
Visual Studio是目前最流行的Windows平台应用程序的集成开发环境。
Visual Studio 是一套基于组件的软件开发工具和其他技术,可用于构建功能强大、性能出众的应用程序。Visual Studio 2015内部代号为Visual Studio “14” ;Visual Studio “14” Community Technology Previews (CTP) 是 Visual Studio 下一主要版本的早期预发布版本,于2014年11月13日开放下载。
Visual Studio能够创建跨平台运行的ASP.NET 5网站(包括Windows、Linux和Mac);集成了对构建跨设备运行的应用的支持(通过整合Visual Studio Tools for Apache Cordova、以及用于跨平台库开发的全新Visual C++工具);连接服务(Connected Services)体验更加轻松(可方便地在app中集成Office 365、SalesForce和Azure平台服务);智能单元测试(Smart Unit Testing,原名为PEX):Visual Studio 2015已整合来自微软研究院的单元测试技术;Visual Studio代码编辑器已经替换成“Roslyn”,将会给你带来不一样的代码编辑体验。当你要修复代码的时候,将会出现一个小灯泡,它会向你提供一系列修复代码的方案,你只需选择即可。
3 俄罗斯方块游戏具体设计
3.1 俄罗斯方块游戏的需求分析
在设计中在一个图片框中构造了一个30*30(像素)的小块,由这些小块组合成新的形状,每四个小块连接在一起就可以构造出一种造型,总共设计了7中造型,每种造型又可以通过旋转而变化出2到4种形状,在游戏窗体中用户就可以使用键盘的方向键来控制方块的运动,然后对每一行进行判断,如果有某行的方块是满的,则消除这行的方块,并且使上面的方块自由下落,其中,方块向下的速度是有时钟控件控制的,在游戏中,用户也可以使用向下键加快下落速度,定义一个变量,对消除的函数进行记录,最后就可以得出用户的分数。
游戏界面需求:设计良好的游戏界面可以让玩家充分感受到游戏带来的娱乐性,游戏在一定的区域内运动和变形。
游戏形状需求:用数组作为存储方块28种状态的数据结构,即长条形、Z字形、反Z形、田字形、7字形、反7形、T字型,各个方块要能实现它的变形,可设为顺时针或逆时针变形,一般为逆时针。
处理事件需求:方块下落时,可通过键盘方向键(上、下、左、右键)对该方块进行向上(变形),向下(加速)、向左、向右移动。
显示需求:当不同的方块填满一行时可以消行,剩余方块向下移动并统计分数。当达到一定分数的时候,会增加相应的等级。
3.2 俄罗斯方块游戏的功能设计
俄罗斯方块游戏设计主要包括以下9个方面:
1. 游戏界面的设计。
2. 俄罗斯方块的实现。
3. 键盘输入信息的获取。
4. 俄罗斯方块的移动(向左,向右和向下)。
5. 俄罗斯方块的变换。
6. 方块自动下落与速度的选择。
7. 满行的判断与消行。
8. 游戏得分的计算。
9. 游戏结束判断。
俄罗斯方块游戏的游戏流程图如图所示:
:
图3.2-1 游戏工作流程图
3.3 俄罗斯方块游戏的开发环境
俄罗斯方块游戏开发环境如下表所示:
表3.3-1 游戏的硬件开发环境
CPU | inter core i3 2330M及以上 |
内存 | 6GB DDR3 1333MHZ 及其以上 |
硬盘 | 120GB以及以上 |
表3.3-2 游戏的软件开发环境
系统的操作环境 | windows server 2008 R2 |
系统开发平台 | 6GB DDR3 1333MHZ 及其以上 |
系统开发语言 | C# |
4 俄罗斯方块游戏具体实现
4.1 俄罗斯方块游戏的砖块实现类
在设计中在一个图片框中构造了一个30*30(像素)的小块,由这些小块组合成新的形状,每四个小块连接在一起就可以构造出一种造型,总共设计了7中造型,每种造型又可以通过旋转而变化出2到4种形状所以我们可以设置一个砖块的抽象类,把砖块共同事件的内容抽象出来。具体代码如下所示
public abstract class Brick
{
protected int m_curTransforIndex; //当前变形次序
public int m_needfulRows; //必要的行数
public int m_needfulColumns; //必要的列数
public int[,] m_range; //变形范围
public Point m_center; //中心点(相对于必要区域)
public Point m_Pos; //中心点的位置(相对于画布)
/// <summary>
/// 能否变形(能变形的条件为在砖块的变形范围内不能有其他砖块)
/// </summary>
/// <param name=”arr”>画布模型</param>
/// <param name=”rows”>画布行数</param>
/// <param name=”columns”>画布列数</param>
/// <returns></returns>
public abstract bool CanTransform(int[,] arr, int rows, int columns);
/// <summary>
/// 变形
/// </summary>
public abstract void Transform();
/// <summary>
/// 能否左移
/// </summary>
/// <param name=”arr”>画布模型</param>
/// <param name=”rows”>画布行数</param>
/// <param name=”columns”>画布列数</param>
/// <returns></returns>
public abstract bool CanLeftMove(int[,] arr, int rows, int columns);
/// <summary>
/// 左移
/// </summary>
public void LeftMove()
{
m_Pos.Y -= 1;
}
/// <summary>
/// 能否右移
/// </summary>
/// <param name=”arr”>画布模型</param>
/// <param name=”rows”>画布行数</param>
/// <param name=”columns”>画布列数</param>
/// <returns></returns>
public abstract bool CanRightMove(int[,] arr, int rows, int columns);
/// <summary>
/// 右移
/// </summary>
public void RightMove()
{
m_Pos.Y += 1;
}
/// <summary>
/// 能否下移
/// </summary>
/// <param name=”arr”></param>
/// <param name=”rows”></param>
/// <param name=”columns”></param>
/// <returns></returns>
public abstract bool CanDropMove(int[,] arr, int rows, int columns);
/// <summary>
/// 下移
/// </summary>
public void DropMove()
{
m_Pos.X += 1;
}
/// <summary>
/// 随机生成一个可以通过变形得到的形状
/// </summary>
public void RandomShape()
{
Random random = new Random();
this.m_curTransforIndex = random.Next(4);
this.Transform();
}
/// <summary>
/// 设置中心点相对于画布的位置
/// </summary>
/// <param name=”x”>横向位置</param>
/// <param name=”y”>纵向位置</param>
public void SetCenterPos(int x, int y)
{
this.m_Pos = new Point(x, y);
}
/// <summary>
/// 获取砖块出现时中心点的Y轴坐标
/// </summary>
/// <returns></returns>
public abstract int Appear();
}
}
5 俄罗斯方块游戏的测试
5.1 俄罗斯方块游戏的界面测试
右下角下有四个菜单项,分别有开始、暂停、继续、停止。按开始时,可以使暂停的游戏接着上回的地方继续游戏。如下图:
5.2 功能测试
5.2.1 游戏的变形功能
点击开始按钮时游戏立即开始,方块自动下落且形状随机。界面如下图:
为了使方块下落到适当的位置,我们需左右移动方块,此操作在键盘上实现,下面的两个界面就是方块从左边移到右边的界面:
5.2.2 游戏的暂停功能
当点击停止时,游戏则停止,方块停止下落,此时的界面为:
5.2.3 游戏的其他功能
若由存在空格的方块填满整个窗口,则游戏失败,此时会立即弹出游戏结束的对话框。此时的游戏界面为:
5.3 测试总结
本游戏操作简单,界面清晰,让玩家容易上手操作,但是由于技术有限,本游戏所实现的功能不够完善,不够强大,表现在不能建立连接,因此游戏只供单人玩,界面也不够美观,以后可对本游戏进行改善,从而增强游戏的功能。在系统分析过程的阶段,通过俄罗斯方块的游戏,首先是制定要实现的功能,将整一个游戏分成几个部分,然后逐一解决在分析过程中遇到的每一个问题,最终实现自己预期想要实现的效果。俄罗斯方块游戏的一些基础控制操作该程序的用户界面基本上是实现了,可是因为能力以及时间上的不足,程序还是存在了很多不足之处,许多功能都没有完全实现和达到预期的效果。如果想要设计出更佳具有可玩性和创新性的俄罗斯方块游戏,这个只有通过以后的不断学习,探索和对程序的进一步完善来实现对游戏的拓展了。实际作出的系统还是存在了一些逻辑错误和系统不是很稳定的现象,但是系统基本实现了预期的功能,假如可以投入更多的精力和时间在判断和处理和简化语言上面,在算法中更深入和多方面的考虑,应该可以消除因为考虑不全面而出现的逻辑错误。
小结
在这次的毕业设计中,并不是一帆风顺,期间我有遇到很多困难,也有香放弃的时候,但是我没有选择放弃,这当然离不开导师的鼓励和帮助,也离不开自己的努力。回顾整个过程,真的让我受益匪线,让我更加清楚的的认清了自己所处的位置,不在像以前一样迷茫,不知所措,让我重拾信心,有了奋斗的目标。
这次课程的设计经历,让我感受最深和收益最多的是设计过程中的分块处理思想这一块,并且让我发现了自身在设计过程中存在很多不足之处和不良习惯。也让我明白了在以后的学习还有探索的过程,无论设计什么都要有步骤有条理的去做,一步一个脚印,做好每一个步骤,不要过于心切,这样只会欲速不达。还有以后不管是遇到什么困难都要冷静处理,做事要有毅力和恒心。
此次的毕业设计论文的撰写经历让我受益匪线,我深刻的体会到只有全身心的投入去做一件事,才能把一件事做好。此次的毕业设计论文是在对我们大学四年中所学知识的和灵活运用,也是在考验自己的能力,同时是个不断学习的过程以及探索的过程,也让我深刻的体会到了只有不断学习才能更好的研究,只有不断的研究才会有进步。正是因为此次的毕业设计,让我学习了很多新的技能和新的知识,使我更加深入的去理解了以前学到的知识,也得到了巩固。
致谢
在这次的毕业设计过程中,让我学到了很多东西,也非常感谢我们的指导老师耐心的教导,是老师认真负责的工作态度以及严谨的教学精神和深厚的理论水平教会了我很多东西,让我受益匪浅,感谢他耐心的辅导。另外,在游戏开发过程中许多同学也给于我们很大的帮助,帮助解决了不少的难点,使得游戏能及时开发完成,在此谢谢各位对此次设计的帮助。
从定题目到初稿到定稿到最后完成,老师一直都持有认真负责地态度,倾注了老师大量的心血。老师对我的热切的关怀和耐心的帮助,也是我能顺利完成这篇论文的源动力。每次遇到难题,我最先做的就是向刘老师寻求帮助,而每次不管刘老师忙还是休息,总会抽空来找我面谈,然后一起商量解决的办法。刘老师平日里工作繁多,但我做毕业设计的每个阶段,从选题到查阅资料,论文提纲的确定,中期论文的修改,后期论文的格式调整,各个环节中都给与了我足够的指导,这一个月来,刘老师不仅在学业上给我以精心的指导,同时还在思想上给我以无微不至的关怀。他的渊博的知识让我认识到自己需要学的还有很多,他的严谨治学、一丝不苟、精益求精的工作态度和作风更是让我钦佩不已,在论文的写作和措辞方面他总是会以“专业标准”严格要求你,他将是我以后无论学习还是工作上的学习的好榜样。他的崇高风尚、朴实无华、平易近人的人格魅力对我影响深远。不仅使我树立了远大的学术目标、常握了基本的研究方法,还是我明白了许多待人接物与为人处事的道理。更重要的是他宽以待人,为了帮助我们写好论文而抽出了自己宝贵的时间,让我十分感动。在此我要向刘老师致以崇高的敬意和衷心的感谢,祝您身体健康,万事如意,工作上蒸蒸日上。
我还要感谢我的父母,每个父母都是世界上最伟大的人,因此我们不仅要怀着感恩的心,更要以实际的行动让他们为有我们这样的子女而感到骄傲。作为他们的孩子,我秉承了他们朴实坚韧的性格,也因此我有足够的信心和能力战胜前进的路上的艰难险阻。也因为他们的日夜辛劳,我才有机会如愿完成自己的大学学业,进而取得进一步的发展机会。
最后,我必须感谢我的朋友,正是因为他们在电脑技术上的无私指引,我才能得以顺利完成该论文。