Android扫雷游戏.docx
- 文档编号:23361391
- 上传时间:2023-05-16
- 格式:DOCX
- 页数:17
- 大小:794.84KB
Android扫雷游戏.docx
《Android扫雷游戏.docx》由会员分享,可在线阅读,更多相关《Android扫雷游戏.docx(17页珍藏版)》请在冰豆网上搜索。
Android扫雷游戏
信息与电气工程学院
智能移动终端应用开发
设计报告
(2011/2012学年第2学期)
题目:
基于andriod扫雷游戏
专业:
电子信息工程
小组成员:
段景顺090070128
李彬090070112
何东超090070133
设计成绩:
2012年6月15日
1团队构成及分工
职能
成员
工程角色
任务分工
成绩
组长
段景顺
工程总体规划组长
代码分析,资料整理
组员
李彬
工程执行负责人
代码分析,资料整理
何东超
工程执行负责人
代码分析,资料整理
指导教师签字:
年月日
1Android游戏开发现状分析
移动互联网时代的到来,在这个新的研究领域中,我们国在世界上处于较为领先的地位,我们国电信业正处在高速发展的阶段,特别是新业务、新服务在打造品牌、创建市场的时期,对电信产业的结构调整必须充分的考虑成本。
由我们国自主研发并获政府支持的TD-SCDMA制式技术,在频谱利用率、对业务支持具有灵活性等独特优势。
这种全称为TimeDivision - SynchronousCDMA(时分同步CDMA)的技术,其空中接口采用了四种多址技术:
TDMA,CDMA,FDMA,SDMA(智能天线)。
综合利用四种技术资源分配时在不同角度上的自由度,得到可以动态调整的最优资源分配。
克服由覆盖半径随用户数目的增加而收缩造成的呼吸效应和当手机靠近基站功率必定过剩而且形成有害的电磁辐射所造成的远近效应,并且实现了动态信道分配。
而分别由欧洲和美韩所倡导的WCDMA和CDMA2000也各具优势。
我们国拥有庞大的手机用户群体,为游戏产业的发展奠定了良好的用户基础。
手机游戏的真正生命力,是成为最终吸引用户的关键所在。
通过色彩艳丽的画面或奇特的游戏名称来吸引用户。
3G手机游戏开发周期相对比较短,资金投入小,用户广泛统一;载体方便,很容易在市场上推广;如需收费,也合理方便。
游戏可以锻炼思维及协调能力,能使我们们注意力和耐心有所提高,培养我们们的逻辑思维能力,对智力以及记忆力都很有帮助。
2相关知识的介绍
本游戏采用当前很热的Android系统,以Java语言为基础的2D手机游戏。
用户游戏界面通过手机终端来实现,较强的人际交互。
这样就大大简化了用户的操作,该游戏为免费游戏,用户可以放心使用。
此外,本系统采用了SharedPreferences作为应用程序的数据存储,用来存储简单的配置信息,简单快捷,占用系统资源少。
背景音乐采用媒体播放功能实现,控制也比较方便。
3开发工具简介
本系统的开发环境是JDK1.6+MyEclipse8.5+AndroidSDK,使用的语言是Java语言。
JDK(JavaDevelopmentKit)是SunMicrosystems公司为Java开发人员设计的产品。
从Java诞生以来,JDK已经成为使用最广泛JavaSDK。
JDK是整个Java的核心内容,包括了Java运行环境,Java工具和Java基础的类库三部分。
从Sun的JDK1.5开始,提供了一些非常实用的功能,其版本也不断更新,运行效率得到了非常大的提高。
MyEclipse企业级工作平台(MyEclipseEnterpriseWorkbench,简称MyEclipse)是对EclipseIDE的扩展,应用程序服务器的整合方面极大的提高工作效率。
它是功能丰富的Java集成开发环境,包括了完备的编码、调试、测试和发布功能,完整支持HTML,Struts,Spring,CSS,Javascript,SQL,Hibernate。
AndroidSDK是软件开发工具包(softwaredevelopmentkit)。
被软件开发工程师用于为特定的软件包、软件框架、硬件平台、操作系统等建立应用软件工具的集合。
因此AndroidSDK是Android专属的开发工具包。
其授权协议为Apache,开发语言为Java、需要Android操作系统的支持。
4数据存储方式
SharedPreferences存储方式,它是Android提供的用来存储一些简单配置信息的一种机制,例如:
登录用户名和密码。
其采用了Map数据结构来存储数据,以键值的方式存储,可以简单的读取与写入。
最高纪录则用此存储方式进行存储。
SQlite存储方式,它是Android平台上集成的一个嵌入式关系型数据库。
SQLite3支持NULL、INTEGER、REAL(浮点数字)、TEXT(字符串文本)和BLOB(二进制对象)数据类型,虽然它支持的类型虽然只有五种,但实际上sqlite3也接受varchar(n)、char(n)、decimal(p,s)等数据类型,只不过在运算或保存时会转成对应的五种数据类型。
SQLite最大的特点是你可以保存任何类型的数据到任何字段中,无论这列声明的数据类型是什么。
例如:
可以在Integer字段中存放字符串,或者在布尔型字段中存放浮点数,或者在字符型字段中存放日期型值。
但有一种情况例外:
定义为INTEGERPRIMARYKEY的字段只能存储64位整数,当向这种字段中保存除整数以外的数据时,将会产生错误。
另外,SQLite在解读CREATETABLE语句时,会忽略CREATETABLE语句中跟在字段名后面的数据类型信息。
5系统运行配置
操作系统:
Android2.1以上。
开发包:
JDK1.6、AndroidSDK。
数据存储:
SharedPreferences、SQlite。
Android是一个包括操作系统,中间件以及一些重要应用程序的专门针对移动设备的层次结构的软件集。
作为一个层次结构的软件集,一定有一个层次的系统构架,下图为Android的构架图:
图1Android系统构架
6Android系统的架构
Android的系统架构和其操作系统一样,采用了分层的架构。
android分为四个层,从高层到低层分别是应用程序层、应用程序框架层、系统运行库层和linux核心层。
6.1应用层
Android会同一系列核心应用程序包一起发布,该应用程序包包括email客户端,SMS短消息程序,日历,地图,浏览器,联系人管理程序等。
所有的应用程序都是使用JAVA语言编写的。
6.2应用程序框架
开发人员也可以完全访问核心应用程序所使用的API框架。
该应用程序的架构设计简化了组件的重用。
任何一个应用程序都可以发布它的功能块并且任何其它的应用程序都可以使用其所发布的功能块(不过得遵循框架的安全性限制)。
同样,该应用程序重用机制也使用户可以方便的替换程序组件。
隐藏在每个应用后面的是一系列的服务和系统,其中包括:
丰富而又可扩展的视图(Views),可以用来构建应用程序,它包括列表(lists),网格(grids),文本框(textboxes),按钮(buttons),甚至可嵌入的web浏览器。
内容提供器(ContentProviders)使得应用程序可以访问另一个应用程序的数据(如联系人数据库),或者共享它们自己的数据:
资源管理器(ResourceManager)提供非代码资源的访问,如本地字符串,图形,和布局文件(layoutfiles);通知管理器(NotificationManager)使得应用程序可以在状态栏中显示自定义的提示信息;活动管理器(ActivityManager)用来管理应用程序生命周期并提供常用的导航回退功能。
6.3系统运行库
系统运行库包括程序库和Android运行库。
首先是程序库, Android包含一些C/C++库,这些库能被Android系统中不同的组件使用。
它们通过Android应用程序框架为开发者提供服务。
以下是一些核心库:
系统C库-一个从BSD继承来的标准C系统函数库(libc),它是专门为基于embeddedlinux的设备定制的;媒体库-基于PacketVideoOpenCORE。
该库支持多种常用的音频、视频格式回放和录制,同时支持静态图像文件。
编码格式包括MPEG4,H.264,MP3,AAC,AMR,JPG,PNG;SurfaceManager-对显示子系统的管理,并且为多个应用程序提供了2D和3D图层的无缝融合;LibWebCore-一个最新的web浏览器引擎用,支持Android浏览器和一个可嵌入的web视图;SGL-底层的2D图形引擎;3Dlibraries-基于OpenGLES1.0APIs实现。
该库可以使用硬件3D加速(如果可用)或者使用高度优化的3D软加速;FreeType-位图(bitmap)和矢量(vector)字体显示;SQLite-一个对于所有应用程序可用,功能强劲的轻型关系型数据库引擎。
其次是Android运行库,Android包括了一个核心库,该核心库提供了JAVA编程语言核心库的大多数功能。
每一个Android应用程序都在它自己的进程中运行,都拥有一个独立的Dalvik虚拟机实例。
Dalvik被设计成一个设备可以同时高效地运行多个虚拟系统。
Dalvik虚拟机执行(.dex)的Dalvik可执行文件,该格式文件针对小内存使用做了优化。
同时虚拟机是基于寄存器的,所有的类都经由JAVA编译器编译,然后通过SDK中的"dx"工具转化成.dex格式由虚拟机执行。
Dalvik虚拟机依赖于linux内核的一些功能,比如线程机制和底层内存管理机制。
6.4Linux内核
Android的核心系统服务依赖于Linux2.6内核,如安全性,内存管理,进程管理,网络协议栈和驱动模型。
Linux内核也同时作为硬件和软件栈之间的抽象层。
7Android应用程序的主要组件
对于一个Android应用程序来说,是由四种构造块组织而成的,这四种构造块如下:
Activity;IntentReceiver;Service;ContentProvider。
但是,并不是每一个Android应用程序都需要这四种构造块,这不是必须的,某些时候,我们们只需要这四种中的几种组合成我们们的应用。
当我们们明确了我们们的应用需要哪些构造块后,我们们就需要在AndroidManifest.xml中登记这些构造块的清单。
这是一个XML配置文件,这个配置文件用于定义我们们的应用程序的组件、组件的功能及必要条件等。
这个配置文件是每个Android应用必需的。
对于AndroidMainfest.xml的Schema,参考SDK包附带的文档。
7.1Activity
Activity是Android构造块中最基本的一种,在应用中,一个activity通常就是一个单独的屏幕。
每一个activity都被实现为一个独立的类,并且继承于Activity这个基类。
这个activity类将会显示由几个Views控件组成的用户接口,并对事件做出响应。
大部份的应用都会包含多个的屏幕。
例如,一个短消息应用程序将会有一个屏幕用于显示联系人列表,第二个屏幕用于写短消息,同时还会有用于浏览旧短消息及进行系统设置的屏幕。
每一个这样的屏幕,就是一个activity。
从一个屏幕导航到另一个屏幕是很简单的。
在一些应用中,一个屏幕甚至会返回值给前一个屏幕。
当一个新的屏幕打开后,前一个屏幕将会暂停,并保存在历史堆栈中。
用户可以返回到历史堆栈中的前一个屏幕。
当屏幕不再使用时,还可以从历史堆栈中删除。
默认情况下,Android将会保留从主屏幕到每一个应用的运行屏幕。
图2Activity的生命周期
7.2service
Android中的服务和windows中的服务是类似的东西,服务一般没有用户操作界面,它运行于系统中不容易被用户发觉,可以使用它开发如监控之类或者其他后台可以运行的程序。
比较好的一个例子就是一个正在从播放列表中播放歌曲的媒体播放器。
在一个媒体播放器的应用中,应该会有多个activity,让使用者可以选择歌曲并播放歌曲。
然而,音乐重放这个功能并没有对应的activity,因为使用者当然会认为在导航到其它屏幕时音乐应该还在播放的。
在这个例子中,媒体播放器这个activity会使用Context.startService()来启动一个service,从而可以在后台保持音乐的播放。
同时,系统也将保持这个service一直执行,直到这个service运行结束。
另外,我们们还可以通过使用Context.bindService()方法,连接到一个service上(如果这个service还没有运行将启动它)。
7.3BroadcastReceiver
BroadcastReceiver也就是“广播接收者”的意思,顾名思义,它就是用来接收来自系统和应用中的广播。
在Android系统中,广播体现在方方面面,例如当开机完成后系统会产生一条广播,接收到这条广播就能实现开机启动服务的功能;当网络状态改变时系统会产生一条广播,接收到这条广播就能及时地做出提示和保存数据等操作;当电池电量改变时,系统会产生一条广播,接收到这条广播就能在电量低时告知用户及时保存进度,等等。
Android中的广播机制设计的非常出色,很多事情原本需要开发者亲自操作的,现在只需等待广播告知自己就可以了,大大减少了开发的工作量和开发周期。
而作为应用开发者,就需要数练掌握Android系统提供的一个开发利器,那就是BroadcastReceiver。
7.4ContentProvider
应用程序能够将它们的数据保存到文件中、SQL数据库中,甚至是任何有效的设备中。
当你想将你的应用数据与其它的应用共享时,ContentProvider将会很有用。
一个ContentProvider类实现了一组标准的方法,从而能够让其它的应用保存或读取此ContentProvider处理的各种数据类型。
8程序设计
扫雷游戏最重要的部分是处理用户操作。
首先等待并接受用户输入,然后恰当的处理。
我们相信与其我们用文字来解释,不如我们用图表来解释的效果更好,图表的说服力更强。
整个循环用下面的流程图表示:
图3流程图
9实现
9.1计算时间
开发游戏的最重要的事情就是跟踪时间。
Java世界里的标准方法是使用java.util.Timer或者java.util.TimerTask保持时间。
这里麻烦的地方在于我们们需要创建一个新的线程,一些情况下我们们并不想这样。
Android有更好的解决方案。
我们们可以使用类android.os.Handler实现目标。
用Handler取代Timer。
可以用两种方法使用Handler,一种是给Handler传递消息并在消息收到时执行特定的操作,另一种是在Handler中调度一个Runable对象。
我们们在扫雷中使用第二种方法,使用Handler的好处在于它和creator线程中的thread/message队列相联系。
实现handler的代码如下:
privateHandlertimer=newHandler()。
privateintsecondsPassed=0。
publicvoidstartTimer()
{
if(secondsPassed==0)
{
timer.removeCallbacks(updateTimeElasped)。
//telltimertoruncallbackafter1second
timer.postDelayed(updateTimeElasped,1000)。
}
}
publicvoidstopTimer()
{
//disablecallbacks
timer.removeCallbacks(updateTimeElasped)。
}
//timercallbackwhentimeristicked
privateRunnableupdateTimeElasped=newRunnable()
{
publicvoidrun()
{
longcurrentMilliseconds=System.currentTimeMillis()。
++secondsPassed。
txtTimer.setText(Integer.toString(secondsPassed))。
//addnotification
timer.postAtTime(this,currentMilliseconds)。
//notifytocallbackafter1seconds
//basicallytoremaininthetimerloop
timer.postDelayed(updateTimeElasped,1000)。
}
}。
9.2模拟左右键
Android不支持中间键的点击事件,我们们使用长点击事件来模拟此功能。
如果长点击事件在一个有数字的打开的砖块上发生,我们们就击发相应的功能。
这部分的代码如下:
blocks[row][column].setOnLongClickListener(newOnLongClickListener()
{
publicbooleanonLongClick(Viewview)
{
//simulatealeft-right(middle)click
//ifitisalongclickonanopenedminethen
//openallsurroundingblocks
if(!
blocks[currentRow][currentColumn].isCovered()
&&(blocks[currentRow][currentColumn].getNumberOfMinesInSorrounding()>0)&&!
isGameOver)
{
intnearbyFlaggedBlocks=0。
for(intpreviousRow=-1。
previousRow<2。
previousRow++)
{
for(intpreviousColumn=-1。
previousColumn<2。
previousColumn++){
if(blocks[currentRow+previousRow][currentColumn+previousColumn].isFlagged())
{
nearbyFlaggedBlocks++。
}
}
}
//ifflaggedblockcountisequaltonearbyminecount
//thenopennearbyblocks
if(nearbyFlaggedBlocks==blocks[currentRow][currentColumn].getNumberOfMinesInSorrounding())
{
for(intpreviousRow=-1。
previousRow<2。
previousRow++)
{
for(intpreviousColumn=-1。
previousColumn<2。
previousColumn++){
//don'topenflaggedblocks
if(!
blocks[currentRow+previousRow][currentColumn+previousColumn].isFlagged())
{
//openblockstillwegetnumberedblock
rippleUncover(currentRow+previousRow,currentColumn+previousColumn)。
//checkstatusofgame
...
}
}
}
}
//aswenolongerwanttojudgethisgesturesoreturn
//notreturningfromherewillactuallytriggerotheraction//whichcanbemarkingasaflagorquestionmarkorblank
returntrue。
}
//ifclickedblockisenabled,clickableorflagged
...
}
returntrue。
}
})。
10结果展示
运行结果如下图所示:
图4扫雷开始界面
图5扫雷新游戏界面
扫雷成功界面
图6扫雷失败界面
11参考文献
[1](美)威尔顿,麦可匹克.JavaScript入门经典(第3版).施宏斌译.北京:
清华大学出版社,2009
[2]张孝祥.Java就业培训教程[M].北京:
清华大学出版社,2003
[3]E2ECloud工作室著深入浅出GoogleAndroid人民邮电出版社
[4](美)BruceEckel.Java编程思想.陈昊鹏译.北京:
机械工业出版社,2007
[5]EricJ.Braucle等.软件设计—从程序设计到体系结构[M].李仁发等译.北京:
电子工业出版社,2007.
[6]孔令德.毕业设计案例教程—从系统开发到论文写作[M].北京:
国防工业出版社,2007.
12心得体会
通过开发本游戏,我们对Android有了更进一步的了解,深切感受到了Android的魅力。
在游戏的开发过程中,通过查阅相关资料解决所遇到的问题,使我们学到了更多的知识,熟练掌握了Android开发。
完成本游戏的设计业暴露了自己的一些问题,设计能力有待提高,需要不断的锻炼动手能力,不断提高自己。
经过这一段时间的不断探索,自己对Android的研究,对Android游戏有了进一步的了解和学习。
这段时间的不懈努力,扫雷游戏已经完成,达到了预期的要求。
一个完整的Android扫雷游戏完成了。
在本游戏的设计与实现的过程中主要完成了一个较完整的扫雷的系统设计部分。
系统设计为整个游戏构建了框架,各个功能模块实现各个细节部分。
游戏界面美观大方。
系统的详细设计根据系统分析阶段的结论将系统具体化,并完成了各个模块的相关功能,从而实现Android扫雷。
在这个设计的每个阶段都能使我们学到新的东西,虽然也有一些不足之处,但是每一个不足之处都是我们值得思考的问题,这将对我们以后的发展很有帮助。
在本游戏的编写过程中,我们遇到了许多的问题。
首先要自己先自学一下Android的游戏编程,虽然和JAVAME的思想差不多,但是Android上有许多的控件和类在JAVAME上是没有的,在这方面我们遇到了很大的难题。
还有就是对扫雷游戏的算法不是很清楚。
在编码实现的时候,会出现一些开始完全意料不到的问题,也许这些问题当中,有的是老师讲过的,不过我们想大部分还是老师没有讲过,这个时候就是体现出自己解决问题的能力的时候了。
在遇到问题时要学会如何去分析错误,再是学会如何去解决掉这个问题。
在遇到问题是,不要有害怕困难的情绪,解决问题也
- 配套讲稿:
如PPT文件的首页显示word图标,表示该PPT已包含配套word讲稿。双击word图标可打开word文档。
- 特殊限制:
部分文档作品中含有的国旗、国徽等图片,仅作为作品整体效果示例展示,禁止商用。设计者仅对作品中独创性部分享有著作权。
- 关 键 词:
- Android 扫雷 游戏
