毕业设计(论文)开题报告
题目 基于C#的连连看游戏开发
专 业 名 称 电子信息工程
班 级 学 号 088205208
学 生 姓 名 曹丛
指 导 教 师 廖 远
填 表 日 期 2012 年 01 月 04
一、选题的依据及意义
连连看游戏是一种桌面益智小游戏。它简单易上手好玩还锻炼人深受人们喜爱,网上有各种不同的连连看版本,从FLSASH版本的连连看到社交网络的连连看,很多用户深深喜爱这款小游戏,所以如何编写更好版本的连连看,也就意味着更好的市场前景。休闲益智简单的游戏设计的目的是满足了人们休闲的需要,在紧张工作之余休闲类的小游戏能够给人带来最大程度的放松。现在桌面小游戏、在线网页游戏、社交游戏越来越受网民欢迎,除了玩的方法简单外,很多游戏不乏经典。连连看游戏就是一个典型。不管走到哪个网页游戏网站,哪个社交游戏平台,连连看游戏总是排在玩家欢迎排名的前5位,休闲、趣味、益智是连连看玩不厌的精华,且不分男女老少、工薪白领,是一款适合大众的经典网络休闲小游戏。
并且玩连连能锻炼人的观察仔细的能力,越相似的越难分辨这就要看你不是有耐心,还能考察人得反应能力,当然这个能力也是能慢慢培养的,玩连连看还有好多优点,以上的这几点玩连连看都能帮你很好的实现。
二、国内外研究概况及发展趋势
2.1国内外研究的概况
C#是微软公司在20##年6月发布的一种新的编程语言,并定于在微软职业开发者论坛(PDC)上登台亮相,它简单、安全、面向对象语言的设计。C#是微软公司研究员Anders Hejlsberg的成果。C#看起来与Java有着惊人的相似;它包括了诸如单一继承、界面、与Java几乎同样的语法,和编译成中间代码再运行的过程。但是C#与Java有着明显的不同,它借鉴了Delphi的一个特点,与COM(组件对象模型)是直接集成的,而且它是微软公司.NET windows网络框架的主角。C#是专门为.NET的应用而开发的语言。它吸收了C++、Visual Basic、Delphi、Java等语言的优点,体现了当今最新的程序设计技术的功能和精华。C#继承了C语言的语法风格,同时又继承了C++的面向对象特性。不同的是,C#的对象模型已经面向Internet进行了重新设计,使用的是.NET框架的类库;C#不再提供对指针类型的支持,使得程序不能随便访问内存地址空间,从而更加健壮;C#不再支持多重继承,避免了以往类层次结构中由于多重继承带来的可怕后果。.NET框架为C#提供了一个强大的、易用的、逻辑结构一致的程序设计环境。
现在我们常看到的是Visual Studio 20##、Visual Studio 20##、Visual Studio 2005这几个版本,C#的版本还在不断的被创造出来,VS2010(.NET 4.0)是现在比较新的版本。
2.2 C# 的发展趋势
20##年2月,微软终于推出了迟迟未上市的VisualStudio7.0,并将其定名为“VisualStudio.NET2002”。 此后,微软马不停蹄,VisualStudio也恢复了往日的开发进度。在20##年5月,微软如期推出了VisualStudio。NET2003,同时也发布了C#的改进版本——C#1.1。这一时期的C#(以下称为C#1.x)提出了纯粹的面向对象概念,并在语言特性中展现得淋漓尽致。C 并非纯面向对象的,为了和C兼容以及提供更高的执行效率,它保留了很多模块化的东西。。在C#1.x中,所有面向对象的概念都在语言中得到了非常好的体现。同时,C#还通过类类型、值类型和接口类型的概念形成了统一的类型系统。C#使用了大家所熟知的语法实现了方法,以至于很多人认为C#和Java、C 等面向对象语言“非常相像”,这使得从使用其他面向对象语言转到使用C#的过程非常简单。
C#发展是相当的迅速的,它的优点在不断的体现出来也在不断的改善当中,版本在不断的向市面涌现出来,还要发展很长的一段时期,C#的发展并没有最终定型。
2.2. 简化应用程序的开发
2.2.1在简化应用程序开发方面
1.C#看起来与Java有着相似之处;它包括了诸如单一继承、界面、与Java几乎同样的语法,和编译成中间代码再运行的过程,它吸收了JAVA语言的很多优点。
2.C#对Windows程序最大的卖点可能就是它与COM的无缝集成了,COM就是微软的Win32组件技术.实际上,最终有可能在任何.NET语言里编写COM客户和服务器端.C#编写的类可以子类化一个已存在的COM组件;生成的类也能被作为一个COM组件使用,然后又能使用。
3.使用了简单的C语言结构,C#有些组件可以方便的转化为XML网络服务,从而使它们可以由任何语言在任何操作系统上通过INTERNET进行调用。
C#具备JAVA和C语言的一些特点,它是面向对象的语言设计,还要JAVA和C语言不具备的特点,对C语言中的一些易出现问题的语法进行了一定的改进,使得它能既简单又方便的解决问题。
2.2.2 C#从Java继承而来的特点
类:在C#中类的声明与Java很相似.这是合理的因为经验告诉我们Java模型工作得很好.Java的关键字import已经被替换成using,它起到了同样的作用.一个类开始执行的起点是静态Main()方法.下面的Hello World程序展示了程序基本结构形式: using System; class Hello { static void Main() { Console.WriteLine("Hello,world"); Console.ReadLine(); } } 在这个例子中,System这个名字指向一个包括了基本C#实用类集合的命名空间(namespace).这个命名空间包括了Console类,它在这个例子中被用来输出一个字符串.类可以是抽象的和不可继承的:一个被申明成abstract的类不能被实例化;它只能被用做一个基类.C#关键字lock就象Java关键字final,它申明一个类不是抽象的,但是它也不能被用做另一个类的基类.界面:就象在Java中一样,一个界面是一组方法集合的抽象定义.当一个类或结构体实现一个界面的时候,它必须实现这个界面中定义的所有方法.一个单一的类可以实现几个界面.也许以后会出现一些微妙的差别,但是这个特点看起来与Java相比没有变化.布尔运算:条件表达式的结果是布尔数据类型,布尔数据类型是这种语言中独立的一种数据类型.从布尔类型到其他类型没有直接的转换过程.布尔常量true和false是C#中的关键字.错误处理:如Java中那样,通过抛出和捕捉异常对象来管理错误处理过程.内存管理:由底层.NET框架进行自动内存垃圾回收.一个基本的C#类中包含数据成员、属性、构造器和方法。属性可以是静态或实例成员。
C#是一个强类型的语言,它的数值类型有一些可以进行隐式转换,其他的必须显式转换,隐式转换的类型只能是长度短的类型转换成长的类型,例如int可以转换成long,float,double,decimal.反之必须显式的转换. 例: int a=7; float b=a; //隐式转换 long c= 12L ; //和C++一样必须加上后缀L才能定义为long型不然就为int型了 a=(int)c; //显式转换 使用上面的显示转换不能用在bool和string类型上。2.2.3 提高性能提升
在性能提高方面,ASP.NET团队会在在微软的分布式缓存Velocity发布之后,为ASP.NET提供相应的各类provider。这样ASP.NET便可以将数据缓存,会话状态等各种信息存放在进程外的的分布式缓存中,以此得到更好的性能和健壮性。这些provider实现可以与ASP.NET现有的扩展方式良好集成,对开发人员的使用保持透明。
由于Web应用程序的显示效果越来越丰富,网页前端性能优化的重要性也随之提高。未来的ASP.NET将会内置CSS或JavaScript文件的压缩及合并,并对CSSSprites等复杂优化方式提供支持。CSSSprite的优化原理是将页面上大量的小图片合并成一个文件,然后使用CSS定位机制来显示其中的一部分,这么做的好处是大大减少了浏览器与服务器端的通信次数,往往可以使页面加载速度有明显提高。ASP.NET在未来可以根据开发人员的需求,自动将一组图片进行合并,并通过一些接口将单独某幅图片的信息(如位置,尺寸)暴露出来,甚至直接在页面上生成包含特定属性的HTML标签。
2.2.3 C#从C和C++继承的特点
编译:程序直接编译成标准的二进制可执行形式.如果前面的Hello World程序被保存成一个文本文件并被命名为Hello.cs,它将被编译成命名Hello.exe的可执行程序. 结构体:一个C#的结构体与C++的结构体是相似的,因为它能够包含数据声明和方法.但是,不象C++,C#结构体与类是不同的而且不支持继承.但是,与Java相同的是,一个结构体可以实现接口(interface). 预编译:C#中存在预编译指令支持条件编译,警告,错误报告和编译行控制.可用的预编译指令有: #define #undef #if #elif #else #endif #warning #error #line [] 没有了#include 伪指令.你无法再用#define 语句对符号赋值,所以就不存在源代码替换的概念--这些符号只能用在#if和#elif伪指令里.在#line伪指令里的数字(和可选的名字)能够修改行号还有#warning和#error输出结果的文件名.
命名空间:命名空间提供了一种方法来唯一标识一个类型以及进行类型的逻辑组织。命名空间可以嵌套使用并可以跨程序集使用。一个类型的完全限定名包括所有命名空间。在一个命名空间中,所有的类型必须有一个唯一的名称。基本类型库(Base Class Library)是.NET Framework的所有语言可下可用的命名空间集。命名空间是组织和重用代码的编译单元。命名空间和文件的结构关系不像Java,命名空间与文件的结构之间没有关系。using语句是用来在使用类型时不需要用全限定名的类型,全限定名也可以被使用。
命名空间中的声明,C#与C++有所不同,是C#独有的特点。 编辑本段操作符重载:
一些操作符能够被重载,而另一些则不能.特别的是,没有一个赋值运算符能够被重载.能够被重载的单目操作符是: + - ! ~ ++ -- true false 能够被重载的二元运算符是: + - * / % & | ^ << >> == != > < >= <=
三、研究内容及实验方案
3.1研究内容
分析算法,先抽象出游戏基本结构,对于连连看游戏来说,核心的部分应该是整个游戏界面内的地图数据。然后设计出标识地图的数据结构。
3.2实验方案
3.2.1游戏画面
精致美观的画面能够吸引更多的玩家娱乐,本文画面虽不精致,也整体得当。
3.2.2 获取图片位置
通过数组从图片库随即获取规定的偶数张图片,使其随机分布在游戏界面里
。
3.2.3 路径判断
连连看的要求:
1:两张图片是相同的
2:两张图片之间连线的折点不超过两个。(连接线由x轴和y轴的平行线组成)则两张图片的连接情况可以分为三种:
a:直线相连b:一个折点c:两个折点;
通过分析可知,每一个折点必定有且至少有一个坐标(x或者y)和两张图片中的任意一张图片是相同的,即折点必定在两张图片所在的x方向或y方向的直线上。
因此路径的判断是:
假设两张图片p1,p2,如果有两个折点分别在z1,z2 那么
1:如果验证p1,p2直线连线,则连接成立
2:搜索以p1,p2的x,y方向四条直线(可能某两条直线会重合)上的有限点,每次取两点作为z1,z2,验证p1到z1/z1到z2/z2到p2是否都能直线相连,是则路径连接成立否则连接不成立。
3.2.4连连看系统结构
图3.1(连连看系统结构图)
四、目标、主要特色及工作进度
4.1目标
设计单机休闲小游戏的目的是为了休闲的需要,在紧张的工作,学习之余玩下小游戏能够带来一些放松,减轻一些压力。通过本程序将四年来所学的专业知识和其他方面的知识融入到实际应用中。
4.2主要特色
不管走到哪个网页游戏网站,连连看游戏总是排在受玩家欢迎排名的前5位,休闲、趣味、益智是连连看玩不厌的精华,且不分男女老少、工薪白领,是一款适合大众的经典网络休闲小游戏。
4.3研究工作进度
01~02周:查找资料、论证方案、翻译英文资料。
03~09周:程序设计、运行、调试。
10~12周:软件测试、功能改进及完善。
13~18周:毕业论文撰写,答辩。
五、参考文献
【1】刘浩,陈曙东:C#编程实例与技巧,清华大学出版社,2002.2
【2】周存杰,C#网络核心编程,清华大学出版社,2002.11
【3】梁立新,C#核心技术应用开发,电子工业出版社,2010.9
【4】郑阿奇,:VisualC#应用案例教程,电子工业出版社2010.7
【5】谭浩强,C程序设计(第三版),清华大学出版社 2005.7
【6】金旭亮,编程的奥秘-- .NET软件技术学习与实践,电子工业出版社,2007.2
【7】刘甫迎、刘光会、王蓉.C#程序设计教程(第2版).北京:电子工业出版社,
2008
【8】Microsoft Visual C# 20## help,2008
【9】美国微软公司Visual C# 2005软件的帮助信息,2005
【10】李兰友 杨晓光.Visual C#.NET程序设计.北京:清华大学 北方交通大学出
版社,2004
【11】王昊亮,李刚等.Visual C#程序设计教程.北京:清华大学出版社,2003
【12】佟伟光.Visual Basic.NET实用教程.北京:电子工业出版社,2003
【13】施燕妹 陈培 陈发吉.C#语言程序设计教程.北京:中国水利水电出版
【14】明月创作室.Visual C#编程精彩百例.北京:人民邮电出版社.2001
【15】孙永强等. Visual C#.NET入门与提高.北京:清华大学出版社. 2002
【16】郭胜等.C#.NET程序设计教程.北京:清华大学出版社. 2002
【17】B-power工作室.C#网络程序设计. 北京: 中国铁道出版社. 2001
【18】(美)内格尔,C#高级编程(第六版),清华大学出版社 2008.9
【19】[美] Herbert Schildt著,长春亿特译.C#编程序起步.北京:人民邮电出
版社.2002
【20】[美]微软公司著,熊盛新 许志庆 李钦译. Visual C#.NET语言参考手册
北京:清华大学出版社.2002
【21】[美]Anders Hejlsberg,Scott Wiltamuth,Peter Golde著, 张晓坤 谭立平
车树良译《C#编程语言详解》.北京:电子工业出版社.2004
【22】[美]Simon Robinson/ Christian Nagel著, 李敏波译.《C#高级编程(第3
版) 》.北京:清华大学出版社.2005
【23】[美] John Sharp Jon Jagger. 《Microsoft Visual C#.NET程序设计》. 北
京:北京大学出版社.2002
【24】(美)Christian Nagel,C#入门经典(第五版),清华大学出版社,2010.12
第二篇:连连看游戏设计
写书评,赢取《编程之美--微软技术面试心得》.cn/BCZM.asp 连连看游戏设计
连连看是一种很受大家欢迎的小游戏。微软亚洲研究院的实习生
们就曾经开发过一个类似的游戏——Microsoft Link-up。
图1-17 连连看游戏示意图
图1-17为Microsoft Link-up的一个截图。如果用户可以把两个同样的图用线(连线拐的弯不能多于两个)连到一起,那么这两个头像就会消掉,当所有的头像全部消掉的时候,游戏成功结束。游戏头像有珍稀动物、京剧脸谱等。Microsoft Link-up还支持用户输入的图像库,微软的同事们曾经把新员工的漫画头像加到这个游戏中,让大家在游戏之余也互相熟悉起来。
假如让你来设计一个连连看游戏的算法,你会怎么做呢?要求说明:
1. 怎样用简单的计算机模型来描述这个问题?
2. 怎样判断两个图形能否相消?
3. 怎样求出相同图形之间的最短路径(转弯数最少,路径经过的格子数目最少)。
4. 怎样确定目前是处于死锁状态,如何设计算法来解除死锁?
写书评,赢取《编程之美--微软技术面试心得》.cn/BCZM.asp 分析与解法
连连看游戏的设计,最主要包含游戏局面的状态描述,以及游戏规则的描述。而游戏规则的描述就对应着状态的合法转移(在某一个状态,有哪些操作是满足规则的,经过这些满足规则的操作,会到达哪些状态)。所以,自动机模型适合用来描述游戏设计。
下面是一个参考的连连看游戏的伪代码:
代码清单1-22 生成游戏初始局面
Grid preClick = NULL, curClick = NULL;
while(游戏没有结束)
{
监听用户动作
if(用户点击格子(x, y),且格子(x, y)为非空格子)
{
preClick = curClick;
curClick.Pos = (x, y);
}
if(preClick != NULL && curClick != NULL
&& preClick.Pic == curClick.Pic
&& FindPath(preClick, curClick) != NULL)
{
显示两个格子之间的消去路径
消去格子preClick, curClick;
preClick = curClick = NULL;
} }
从上面的整体框架可以看到,完成连连看游戏需要解决下面几个问题:
1. 生成游戏初始局面。
2. 每次用户选择两个图形,如果图形满足一定条件(两个图形一样,且这两个图形之间存在少于3个弯的路径),则两个图形都
写书评,赢取《编程之美--微软技术面试心得》.cn/BCZM.asp 能消掉。给定具有相同图形的任意两个格子,我们需要寻找这两个格子之间在转弯最少的情况下,经过格子数目最少的路径。如果这个最优路径的转弯数目少于3,则这两个格子可以消去。 3. 判断游戏是否结束。如果所有图形全部消去,游戏结束。 4. 判断死锁,当游戏玩家不可能再消去任意两个图像的时候,游戏进入“死锁”状态。如图1-18,该局面中已经不存在两个相同的图片相连的路径转弯数目小于3的情况。
在死锁的情况下,我们也可以暂时不终止游戏,而是随机打乱局
面,打破“死锁”局面。
图1-18 连连看死锁的情况
首先思考问题:怎样判断两个图形能否相消?在前面的分析中,我们已经知道,两个图形能够相消的充分必要条件是这两个图形相同,且它们之间存在转弯数目小于3的路径。因此,需要解决的主要问题是,怎样求出相同图形之间的最短路径。首先需要保证最短路径的转弯数目最少。在转弯数目最少的情况下,经过的格子数目也要尽可能地少。
在经典的最短路径问题中,需要求出经过格子数目最少的路径。而这里,为了保证转弯数目最少,需要把最短路径问题的目标函数修改为从一个点到另一个点的转弯次数。虽然目标函数修改了,但算法的框架仍然可以保持不变。广度优先搜索是解决经典最短路问题的一个思路。我们看看在新的目标函数(转弯数目最少)下,如何用广度优先搜索来解决图形A(x1, y1)和图形B(x2, y2)之间的最短路径问题。
首先把图形A(x1, y1)压入队列。
(x1, y1)可以直线到达的格子(即图形A(x1, y1)然后扩展图形A
写书评,赢取《编程之美--微软技术面试心得》.cn/BCZM.asp 可以通过转弯数目为0的路径(直线)到达这些格子)。假设这些格子为集合S0,S0 = Find(x1, y1)。如果图形B(x2, y2)在集合S0中,则结束搜索,图形A和B可以用直线连接。
否则,对于所有S0集合中的空格子(没有图形),分别找到它们可以直线到达的格子。假设这个集合为S1。S1 = {Find(p)| p ∈S0}。S1包含了S0,我们令S1’= S1-S0,则S1’中的格子和图形A(x1, y1)可以通过转弯数目为1的路径连起来。如果图形B(x2, y2)在S1’中,则图形A和B可以用转弯数目为1的路径连接,结束搜索。
否则,我们继续对所有S1’集合中的空格子(没有图形),分别找出它们可以直线到达的格子,假设这个集合为S2,S2 = Find{ Find(p)| p ∈S1’}。S2包含了S0和S1,我们令S2’= S2 - S0 - S1 = S2 - S0 - S1’。集合S2’是图形A(x1, y1)可以通过转弯数目为2的路径到达的格子。如果图形B(x2, y2)在集合S2’中,则图形A和B可以用转弯数目为2的路径连接,否则图形A和B不能通过转弯小于3的路径连接。
在扩展的过程中,只要记下每个格子是从哪个格子连过来的(也就是转弯的位置),最后图形A和B之间的路径就可以绘制出来。
在上面的广度优先搜索过程中,有两步操作:S1’ = S1 - S0和S2’= S2 - S0 -S1。它们可以通过记录从图形A(x1, y1)到该格子(x, y)的转弯数目来实现。开始,将所有格子(x, y)和格子A(x1, y1)之间路径的最少转弯数目MinCrossing(x, y)初始化为无穷大。然后,令MinCrossing(A)= MinCrossing(x1, y1)= 0,格子A到自身当然不需要任何转弯。第一步扩展之后,所有S0集合中的格子的MinCrossing值为0。在S0集合继续扩展得到的S1集合中,格子X和格子A之间至少有转弯为1的路径,如果格子X本身已经在S0中,那么,MinCrossing(X)= 0。这时,我们保留转弯数目少的路径,也就是MinCrossing(X)= MinValue(MinCrossing(X), 1)= 0。这个过程,就实现了上面伪代码中的S1’= S1 - S0。S2’= S2 - S0–S1的扩展过程也类似。
经过上面的分析,我们知道,每一个格子X(x, y),都有一个状态值MinCrossing(X)。它记录下了该格子和起始格子A之间的最优路径的转弯数目。广度优先搜索,就是每次优先扩展状态值最少的格子。如果要保证在转弯数目最少的情况下,还要保持路径长度尽可能地短,则需要对每一个格子X保存两个状态值MinCrossing(X)和MinDistance(X)。从格子X扩展到格子Y的
写书评,赢取《编程之美--微软技术面试心得》.cn/BCZM.asp 过程,可以用下面的伪代码实现: if((MinCrossing(X) + 1 < MinCrossing(Y)) ||
((MinCrossing(X) + 1 == MinCrossing(Y) && (MinDistance(X) +
Dist(X,Y) < MinDistance(Y)))
{
MinCrossing(Y) = MinCrossing(X) + 1;
MinDistance(Y) = MinDistance(X) + Dist(X, Y);
}
也就是说,如果发现从格子X过来的路径改进了转弯数目或者路径的长度,则更新格子Y。
“死锁”问题本质上还是判断两个格子是否可以消去的问题。最直接的方法就是,对于游戏中尚未消去的格子,都两两计算一下它们是否可以消去。此外,从上面的广度优先搜索可以看出,我们每次都是扩展出起始格子A(x1, y1)能够到达的格子。也就是说,对于每一个格子,可以调用一次上面的扩展过程,得到所有可以到达的格子,如果这些格子中有任意一个格子的图形跟起始格子一致,则它们可以消去,目前游戏还不是“死锁”状态。
扩展问题:
1. 在连连看游戏设计中,是否可以通过维护任意两个格子之间的最短路径来实现快速搜索?在每一次消去两个格子之后,更新我们需要维护的数据(任意两个格子之间的最短路径)。这样的思路有哪些优缺点,如何实现呢?
2. 在围棋或象棋游戏中,经过若干步操作之后,可能出现一个曾经出现过的状态(例如,围棋中的打劫)。如何在围棋、象棋游戏设计中检测这个状态呢?