计算机应用技术论文基于wince的小游戏设计本科毕业论文.docx
《计算机应用技术论文基于wince的小游戏设计本科毕业论文.docx》由会员分享,可在线阅读,更多相关《计算机应用技术论文基于wince的小游戏设计本科毕业论文.docx(34页珍藏版)》请在冰点文库上搜索。
计算机应用技术论文基于wince的小游戏设计本科毕业论文
毕业设计
题目:
基于WinCE的小游戏设计
系部:
信息工程系
专业:
计算机应用技术
班级:
12计算机应用技术
(2)班
姓名:
王芳
指导教师:
李婷
摘要
从2001年开始,游戏作为一种产业已经渐渐地为中国大众接受,它所带来的经济效益和社会效益更是人们之前所没有估计到的,当游戏作为一种很重要的娱乐手段被大众接受时,游戏产业就已经注定会带来巨大的经济效益。
连连看游戏是一款经典小游戏,操作简单,适合所有玩定。
连连看游戏软件在Windows环境下,基于MFC框架设计开发,可以实现初始化界面,用户使用鼠标点击两张相同图案的小方块进行消除,并有多种图案样式的功能选择,丰富了游戏的娱乐性。
此连连看游戏程序界面美观,操作简单,具有一定的趣味性,是一款老少皆宜的休闲佳品。
本文通过需求分析与方案论证,首先对开发连连看游戏程序进行初步的分析,然后通过总体设计的详细设计论述了系统的开发和实现过程。
关键词连连看单机游戏;游戏开发
第1章绪论..................................................................1
1.1课题背景...................................................................1
1.2课题意义...................................................................1
1.3课题内容及目标......................................................................1
第2章总体设计...............................................................2
2.1开发工具和运行环境.........................................................2
2.1.1开发工具...............................................................2
2.2连连看游戏的设计步骤.......................................................2
2.2.1程序画面的实现.........................................................2
2.2.2程序代码的添加.........................................................2
2.3基类源代码详解.............................................................3
2.3.1基类的构造函数介绍....................................................3
2.3.2基类中其余函数代码的解释..............................................4
2.4卡片类源代码详解...........................................................5
2.4.1Object类..............................................................5
2.4.2卡片类的构造函数......................................................5
2.4.3卡片类中其余函数代码的解释............................................5
2.5卡片集合类源代码详解.......................................................5
2.5.1卡片集合类的构造函数...................................................5
2.5.2与卡片处理、绘制、重置相关的函数.......................................6
2.5.3游戏程序中对屏幕单击的处理.............................................8
2.5.4判断两张卡片之间是否可以连通...........................................8
2.6游戏类源代码详解...........................................................9
2.6.1“离屏技术”的画面绘制方法..............................................9
2.6.2游戏程序的初始化.......................................................9
2.6.3游戏对象的处理........................................................10
2.6.4绘制卡片之间的连接线DrawLine函数.....................................10
第3章游戏状态.............................................................12
3.1游戏状态概述..............................................................12
3.2“连连看"游戏程序状态的介绍................................................12
3.3程序状态的添加所引起的代码变化............................................12
3.3.1卡片集合类............................................................12
3.3.2游戏类................................................................12
3.4变化部分代码详解..........................................................12
3.4.1卡片集合类............................................................12
3.4.2游戏类................................................................13
第4章计时器................................................................16
4.1程计时器功能简介..........................................................16
4.2计时器类的添加............................................................16
4.3代码变化的类及新添加的模块代码详解........................................17
4.3.1计时器类..............................................................17
4.3.2游戏类................................................................20
4.4计时功能中时间显示方式的改变..............................................20
4.4.1变化后的时间显示方式..................................................20
4.4.2时间显示方式的代码变化................................................21
4.4.3代码变化后的计时器类代码详解..........................................22
4.4.4代码变化后的游戏类代码详解...........................................24第5章系统测试..............................................................25
结束语.......................................................................26
致谢.........................................................................27
参考文献.......................................................................28
第1章绪论
1.1课题背景
“连连看”是目前非常流行的一款休闲类游戏。
由于它的游戏规则简单、画面精美、操作简便,而赢得了很多玩家的喜欢。
在游戏开始运行以后,只需要在多种图形当中,按照游戏的规则(两个图形的连线当中不能有别的图形遮挡,并且两个图形之间最多只允许有两个拐点)找出两个图案相同的图形,然后用鼠标把两者连接在一起,就可以消去彼此相连的两个图菜。
在规定的时间内,玩家消掉的图案越多,其得分也越高。
1.2课题意义
开发连连看游戏程序的目的是为了人们休闲的需要,在紧张的工作之余休闲类的小游戏能够给人们带来最大程度的放松,也可以增加人们之间的交流、沟通,通过游戏还可以认识更多的朋友,达到人们之间相互娱乐的目的,而且小游戏还不会浪费资源,不像大型游戏占据资源和牵扯精力,可谓工作娱乐两不误。
通过此次课题的设计,掌握如何制作一个游戏软件,以及制作游戏软件的整个流程,制作游戏软件的步骤,为以后的就业工作打下基础。
1.3课题内容及目标
连连看游戏主要是鼠标两次点击的图片是否能消去的问题。
前提是点击两张相同的图片,若点击的是同一张图片或者是两张不同的图片,则不处理。
在两张相同图片所能连通的所有路径中,如果存在一条转弯点不多于两个的路径,就可以消去;如果没有,则不可以。
此程序的课题内容及目标如下。
1.随机生成游戏界面
2.选择两个图案相同的方块,并且不超过两个转弯的连线将它们连接起来,便可以消除这对方块,每一局玩家需要在规定的时间内消除所有的方块,当完成任务,系统会提示,然后重新开始游戏。
3.当玩家有事,也可以选择暂停。
通过对以上功能的实现,达到界面美观,操作简单,增加游戏的娱乐性、趣味性,使玩家对此游戏产生兴趣。
第2章总体设计
2.1开发工具和运行环境
2.1.1开发工具
本程序采用MicrosoftVisualStudio2008作为开发工具。
WindowsCE的设计目标是:
模块化及可伸缩性、实时性能好、通信能力强大、支持多种CPU。
从操作系统内核的角度看,WindowsCE具有灵活的电源管理功能,包括睡眠/唤醒模式。
在WindowsCE中,还使用了对象存储(ObjectStore)技术,包括文件系统、注册表及数据库。
它还具有很多高性能、高效率的操作系统特性,包括按需换页、共享存储、交叉处理同步、支持大容量堆(Heap)等。
WindowsCE拥有良好的通信能力。
它广泛支持各种通信硬件,亦支持直接的局域网连接以及拨号连接,并提供与PC、内部网以及Internet的连接,包括用于应用级数据传输的设备至设备间的连接。
在提供各种基本的通信基础结构的同时,WindowsCE还提供与Windows9x/NT的集成和通信。
WindowsCE的图形用户界面相当出色。
它拥有基于MicrosoftInternetExplorer的Internet浏览器,此外,还支持TrueType字体。
开发人员可以利用丰富灵活的控件库在WindowsCE环境下为嵌入式应用建立各种专门的图形用户界面。
WindowsCE甚至还能支持诸如手写体和声音识别、动态影像、3D图形等特殊应用。
WindowsCE是一个多任务的操作系统,可以同时执行多个任务,并在他们之间来回切换,这其实是Windows的简化版本,可以通过我们熟悉的Windows的操作方式来控制WindowsCE,它也带有“我的文档”,也有很多软件如PocketWord、PocketExcel等。
WindowsCE同时内置了多媒体功能,通过WindowsMediaPlayer可以播放MP3,甚至是视频。
WindowsCE具有可扩充的CompactFlash/MMC/SD插槽,通过扩充卡可以实现多种功能,例如网页浏览、无线接入或者增加更大的存储空间。
2.2、“连连看”游戏的设计步骤
2.2.1程序画面的实现
1.运行VisualC#,新建一个PocketPC2003的应用程序。
把工程的名字命名为“LinkGame”。
2.添加游戏程序相关的资源图片。
2.2.2程序代码的添加
1.展示游戏中所有对象的基类Object。
把诸如图形绘制相关的位置坐标、选择图形区域等操作都放在了这个类中。
这种代码组织结构不但使整个程序看上去结构非常清晰,也很好地体现了面向对象概念的精髓所在。
即把共性的东西抽象出来,放在一起,方便后面具体对象的实现。
2.卡片类Card。
Card类继承自基类Object,因为卡片类中包含了卡片绘制等一些基本的功能,因此从这个意义上讲,继承自Object是最合适的。
以后只需要修改基类Object的相关代码,就可以实现用不同图形的卡片绘制(比如,选择不同的卡片作为背景进行绘制等)
卡片集合类主要负责卡片集合相关的事项。
比如,绘制整个卡片数组、实现背景卡片的随机排序、处理鼠标在卡片集合上的单击等。
可以说,游戏中关键的功能,如处理鼠标单击,判断两张卡片是否可以可见、连通等功能都是在这里实现的。
3.游戏程序的主类frmMaim.cs。
frmMain.cs中主要包含了游戏的主循环、应用程序的初始化、对象的处理、对象的绘制等游戏程序的主要功能。
概括地讲,该游戏程序都是依靠这个类“串”起来的。
因此,建议读者首先要了解该类中如何把游戏程序的各个功能组合在一起,在此基础上再来仔细研究其余类中代码的具体实现。
2.3、基类源代码详解
在程序代码中提到的Object类是所有对象的基类。
在这个游戏中,图形的绘制、选中标示的绘制等都需要计算目的位置的坐标、源图像的坐标等。
因此,根据面向对象的思想,把所有这些经常用到的属性都抽象成了一个基类。
在这个基类当中包含了一些基本的操作,这样当再派生出具体类(比如,背景卡片)的时候,只需要继承自这个基类就可以了,这就是Object类的作用。
2.3.1基类的构造函数介绍
在一个类中,首先需要实现的就是该类的构造函数。
例如:
pubucObject(GamegRifle)
{
this.game=game;
}
publicObject(Gamegame,Imageimage,ImageAttributesimageAttr
:
this(game)
{
this.image=image;
this.imageAttr=imageAttr;
}
上面这两个构造函数的函数名称是完全一样的,都是Object,只有里面的参数不相同。
我们把这种在同一个类中函数名称相同,而参数类型不同的现象叫做函数的重载。
使用重载函数可以使程序代码在编译的时候,根据函数参数的不同自动地选择相应的函数进行编译。
这样可以大大降低程序的复杂程度。
在“this.game=game”、“this.image=image”和“this.imageAttr=imageAttr”中,this后面的game、image和imageAttr为Object类中的变量,在它们的前面加上this就表示是Object类中的变量;等号后面的那些值则为参数列表中传递过来的参数。
在第2个构造函数的参数列表后面“:
this(game)”的作用是调用Object(Gamegame)。
用户可以把this看作是Object,这样this(game)自然就可以被看成是Object(game),也就是调用第1个构造函数了。
这样做的好处在于,当对Object(Gamegame)进行修改以后,第2个构造函数是不需要修改的。
当然,也可以在第2个构造函数中添加以下语句:
this.game=game
虽然这样也可以实现原来函数的功能,但是如果第1个构造函数发生了变化,第2个构造函数也需要进行相应的修改。
2.3.2基类中其余函数代码的解释
publicboolVisible
{
get
{
returnthis.visible;//返回对象是否可见
}
}
当卡片被消去以后,就处于不可见的状态,反之,则处于可见状态。
这就是Visible函数的作用。
publicvirtuatVoidProcess()//对对象进行相应的处理和操作。
默认值为空,需要的时候可以在子类重写该函数
2.4、卡片类源代码详解
2.4.1Object类
“:
Object”表示卡片(Card)类是Object类的子类,它继承了父类的所有功能,同时又具备自己的一些特性。
2.4.2卡片类的构造函数
pubIlcCard(Gamegame,Imageimage,ImageAttributesimageAttr,intleft,inttop)
:
base(game,lmage,imageAttr)
这个构造函数参数列表后面的“:
base(game,image,imageAttr)”表示构造函数在初始化的时候,会将Card参数列表里面的game、image和imageAttr传递给基类构造函数Obiect(Gamegame,Imageimage,ImageAttributesimageAttr),这样就实现了初始化所属游戏game、源图像image和颜色属性imageAttr的功能。
2.4.3卡片类中其余函数代码的解释
publicoverridevoidReset()//重置对象
{
Show();//重置对象为可见
}
2.5卡片集合类源代码详解
2.5.1卡片集合类的构造函数
publicCards(Gamegame,ImageimageCard,ImageAttributesimageAttrCard)
{
this.game=game;//设置游戏对象
this.rows=HEIGHT/Card.HEIGHT;//计算卡片集合的行数
this.cols=WIDTH/Card.WIDTH;//计算卡片集合的列数
this.count=this.cols*this.rows;//计算卡片数
this.cards=newCard[this.count];//生成卡片对象数组
for(introw=0;row{
for(intcol=0;col{
intindex=this.cols*row+col;//计算卡片索引,其取值范围为0~71。
intleft=Card.WIDTH*col+LEFT;//计算卡片左上角X坐标
inttop=Card.HEIGHT+row+TOP;//计算卡片左上角Y坐标
上面这段代码中的Card.WIDTH*col得出的是当前卡片的左上角距离第一张卡片左上角的距离,再加上后面的LEFT,就得到了当前卡片左上角的X坐标。
同理,我们也可以得到当前卡片左上角的Y坐标。
inttype=(index/2)%Card.TYPE_MAX;//设置卡片类型为两两相同
index/2实现了卡片类型两两相同,再进行“%Card.TYPE_MAX”的计算则实现了对20种卡片类型的选择。
在该函数执行完以后,数组集合Cards中每相邻的2个卡片的图形是一样的。
2.5.2与卡片处理、绘制、重置相关的函数
publicvoidProcess()
{
//处理卡片对象数组
for(inti=0;i{
if(this.cards[i].Visible)
{
this.cards[i].Process();
}
上面的这段代码中,调用的cards[i].Process()实际上没有实现任何的功能。
那么为什么还要添加这段代码呢?
这是因为在面向对象的程序设计当中,Cards类既然作为一个集合类,就需要处理每一个元素,这是作为集合类的一个要求。
因此,在这里添加这段代码,以保证Cards类的完整性。
publicvoidDraw(Graphicsgx)//绘制卡片集合
{
for(inti=0:
icount;i++)
{
if(this.cards[i].Visible)
{
this.cards[i].Draw(gx);//调用Card类中的Dmw()函数进行绘制
}
}
}
下面这段代码实现了对卡片集合的重新设置。
publicvoidReset()//重置集合
{
for(inti=0;i{
this.cards[i].Reset();
}
for(inti=1;i{
intj=this.game.Random.Next(i,this.count);
inttype=this.cards[i-1].Type;
this.cards[i-1].Type=this.cards[j].Type;
this.cards[j].Type=type;
}
下面来看看如何通过for循环语句实现卡片数组的随机排序。
上面循环语句里面的Random.Next是返回大于等于i,且小于this.count的整数。
从前面的介绍