毕业设计基于Andriod的数独游戏程序设计文档格式.docx
《毕业设计基于Andriod的数独游戏程序设计文档格式.docx》由会员分享,可在线阅读,更多相关《毕业设计基于Andriod的数独游戏程序设计文档格式.docx(22页珍藏版)》请在冰点文库上搜索。
2012年2月数据显示,AndroidMarket上的应用程序数量突破45万个,AndroidMarket的累计下载量已经突破130亿次,在谷歌电子市场登记的Android开发者已达10W名,Android设备每天激活量达到85万台。
很显然,在这样的市场环境下,Android手机移动游戏开发成为一大产业,也是众多手机用户娱乐的主要项目。
数独游戏在日本非常流行,在地铁车厢和候车室里,每天都可以看到人们埋头于游戏的情景,甚至有专门的“数独”游戏机出现。
除此之外,很多杂志和报纸上的游戏专版也有数独栏目,不过相对于使用笔和纸来享受数独的乐趣,显然使用手机来玩游戏更具有优势。
首先,游戏出现错误时,不再需要橡皮擦擦除可能填错的数字,可以使用键盘随时更改已经填入的数字;
其次,免除了找谜题,打印谜题等麻烦步骤,游戏中存储的数独谜题,能够提供给玩家随时随地玩数独游戏的新享受。
本论文即基于此背景而开展的。
1.2项目目的
随着智能手机的普及,越来越多的普通民众习惯于在手机上完成他们想要做的事情,获取他们想了解的信息,当然,游戏作为一大娱乐项目,从电脑PC端转移到手机移动端,也不是一件稀奇的事情。
数独具有庞大的群众基础,简单容易上手,又具有寓教于乐的特点,Android应用开发技术的成熟使也得在基于Android系统的手机上开发一款数独游戏成为可能。
本项目的目的是在时下最流行的手机操作系统上开发一款数独游戏,使得玩家可以随时随地方便的体验数独的乐趣。
同时,提高自己的实践动手能力和对事物的理解能力。
通过此课题的研究,为今后基于Android手机的游戏开发打好基础。
1.3项目内容
本项目主要分三个模块,选择难度模块、游戏界面模块、数据库模块。
模块一:
选择难度模块
此模块设定了9关,根据选择关数的不同,玩家需要填写的数字的多少就不同
难度越高,玩家需要填写的数字就越多。
模块二:
游戏界面模块
此模块是通过自定义view实现的。
界面上的九宫格和数字是由画笔所画。
界面
会根据接收到的数字而更新界面。
模块三:
数据库模块
此模块是运用了sqlite数据库技术,采用了四个testview填充一个listview的方法。
当游戏过关时弹出对话框提示输入名字,然后程序会想数据库中插入关数、步数、姓名等数据。
第二章Android相关技术介绍
2.1Android介绍
Android是“机器人”的意思,是Google公司于2007年11月5日发布的一个机遇Linux平台的开源手机操作系统。
该系统由底向上一共分为了4层,如图2-1。
每一层对把底层实现封装,并提供调用接口给上一层。
图2-1Android系统架构
(1)Linux内核(LinuxKernel)。
Android运行在LinuxKernel2.6之上,但是把Linux内核GNU协议约束的部分做了取代。
这样,运行在Android上的程序可以用于商业目的。
Linux内核是硬件和软件层之间的抽象层。
(2)中间件。
中间件包括两部分:
核心库和运行时环境(Libraries&
AndroidRuntime)。
核心库包括,SurfaceManager,显示系统管理库,负责把2D或3D内容显示到屏幕;
MediaFramework,媒体库,负责支持图像,支持多种视频和音频的录制和回放;
SQLite,数据库,一个功能十分强大的轻量级嵌入式关系数据库;
WebKit浏览器引擎等。
运行时环境主要包括一个DalvikVirtualMachin,Dalvik虚拟机,区别于Java虚拟机的是,每一个Android应用程序都在自己的进程中运行,都有一个属于自己的Dalvik虚拟机,这一点可以让系统在运行时可以达到优化,程序间的影响大大降低。
Dalvik虚拟机并非运行Java字节码,而是运行自己的字节码。
(3)应用程序框架。
丰富而又可扩展性的视图(View),可以用来构建应用程序,它包括列表(List),网格(Grids),文本框(Textboxs),按钮(Button),可嵌入的Web浏览器等。
内容提供者(ContentProviders)使得应用程序可以访问另一个应用程序的数据(如联系人数据库),或者共享他们各自的数据。
资源管理器(ResourceManager)提供非代码资源的访问,如本地字符串,图形,和布局文件(LayoutFiles)。
通知管理器(NotificationManager)使得应用程序可以在状态栏中显示自己定义的提示信息。
活动管理器(ActivityManager)用来管理应用程序的生命周期,并提供常用的导航回退功能。
(4)应用程序。
Android系统会内置一些应用程序包,包括email客户端,SMS短消息程序,日历,地图,浏览器,联系人管理器等等。
Android应用程序由强大的Java语言来编写,也支持其他一些语言如C、Perl等。
其中Java应用最为广泛,其他语言已经就看不到了[4]。
2.2ECLIPSE开发平台介绍
Eclipse是一个开放源代码的、基于Java的、跨平台的集成开发环境(IDE)。
最开始是一个开放源代码的软件开发项目,最初由OTI和IBM两家公司的IDE产品开发组创建,起始于1999年4月。
目前由IBM牵头,围绕着Eclipse项目已经发展成为了一个庞大的Eclipse联盟,有150多家软件公司参与到Eclipse项目中,其中包括Borland、RationalSoftware、RedHat及Sybase等。
它主要由Eclipse项目、Eclipse工具项目和Eclipse技术项目三个项目组成,具体包括四个部分组成——EclipsePlatform、JDT、CDT和PDE。
JDT支持Java开发、CDT支持C开发、PDE用来支持插件开发,EclipsePlatform则是一个开放的可扩展IDE,提供了一个通用的开发平台。
Eclipse的设计思想是:
一切皆插件。
Eclipse核心很小,其它所有功能都以插件的形式附加于Eclipse核心之上。
Eclipse基本内核包括:
图形API(SWT/Jface),Java开发环境插件(JDT),插件开发环境(PDE)等。
Eclipse的插件机制是轻型软件组件化架构。
在客户机平台上,Eclipse使用插件来提供所有的附加功能,例如支持Java以外的其他语言。
已有的分离的插件已经能够支持C/C++(CDT)、Perl、Ruby,Python、telnet和数据库开发。
插件架构能够支持将任意的扩展加入到现有环境中,例如配置管理,而决不仅仅限于支持各种编程语言。
Eclipse的本身只是一个框架平台,但是众多插件的支持使得Eclipse拥有其他功能相对固定的IDE软件很难具有的灵活性。
许多软件开发商以Eclipse为框架开发自己的IDE。
2.3SQLITE数据库技术介绍
SQLite,是一款轻型的数据库,是遵守ACID的关系型数据库管理系统,它包含在一个相对小的C库中。
它是D.RichardHipp建立的公有领域项目。
它的设计目标是嵌入式的,而且目前已经在很多嵌入式产品中使用了它,它占用资源非常的低,在嵌入式设备中,可能只需要几百K的内存就够了。
它能够支持Windows/Linux/Unix等等主流的操作系统,同时能够跟很多程序语言相结合,比如Tcl、C#、PHP、Java等,还有ODBC接口,同样比起Mysql、PostgreSQL这两款开源的世界著名数据库管理系统来讲,它的处理速度比他们都快。
SQLite第一个Alpha版本诞生于2000年5月。
至2015年已经有15个年头,SQLite也迎来了一个版本SQLite3已经发布。
目前在安卓系统中集成的是SQLITE3版本,sqlite不支持静态数据类型,而是使用列关系,这意味着它的数据类型不具有表列属性,而具有数据本身的属性。
Sqlite特点如下:
◇轻量级
SQLite和C/S模式的数据库软件不同,它是进程内的数据库引擎,因此不存在数据库的客户端和服务器。
使用SQLite一般只需要带上它的一个动态库,就可以使用它的全部功能。
而且那个动态库的尺寸也挺小,以版本3.6.11为例,Windows下487KB、Linux下347KB。
◇)零配置、无服务器
SQLite的另外一个特点是绿色:
它的核心引擎本身不依赖第三方的软件,使用它也不需要“安装”。
所以在部署的时候能够省去不少麻烦。
SQLite在使用前不需要安装设置,不需要进程来启动、停止或配置,不需要管理员去创建新数据库或分配用户权限,在系统崩溃或失电之后自动恢复。
大多数SQL数据库引擎是作为一个单独的服务器进程被执行。
访问数据库的程序使用某种内部进程通信(典型的是TCP/IP)与服务器通信,完成发送请求到服务器和接收查询结果的工作。
SQLite不采用这种工作方式。
使用SQLite时,访问数据库的程序直接从磁盘上的数据库文件读写,没有中间的服务器进程
◇单一文件、简单的访问
所谓的“单一文件”,就是数据库中所有的信息(比如表、视图、触发器、等)都包含在一个文件内。
这个文件可以copy到其它目录或其它机器上,也照用不误。
一个SQLite数据库是一个单独的普通磁盘文件,能够被定位在路径层次的任何地方。
如果SQLite能读写磁盘文件,则它也能访问数据库。
大多数SOL数据库引擎趋向于把数据存为一个大的文件集合,通常这些文件在一个标准的定位中,只有数据库引擎本身能访问它
◇跨平台/可移植性
除了主流操作系统,SQLite还支持了很多冷门的操作系统。
比如它对很多嵌入式系统(比如Android、WindowsMobile、Symbin、Palm、VxWorks等)的支持。
◇内存数据库(in-memorydatabase)
SQLite的API不区分当前操作的数据库是在内存还是在文件(对于存储介质是透明的)。
所以如果觉得磁盘I/O有可能成为瓶颈的话,可以考虑切换为内存方式。
切换的时候,操作SQLite的代码基本不用大改,只要在开始时把文件Load到内存,结束时把内存的数据库Dump回文件就OK了。
在这种情况下,可以使用“onlinebackupAPI”。
◇可变长度的记录
一般的SQL数据库引擎在表中为每一个记录分配一个固定的磁盘空间数,SQLite只使用一个记录中实际存储信息的磁盘空问数。
显然,这会使数据库非常小,同时,由于在磁盘上移动的信息很少,也使数据库很快。
第三章数独游戏设计
3.1功能需求分析
本游戏主要利用android开发技术实现在安卓平台上运行的数独游戏的基本功能改系统具备如下需求:
(1)选难度模块:
需求总述:
可以选择游戏的难度
功能描述:
玩家可以选择1—9关,难度依次递增
(2)主界面模块:
玩家能根据系统提示填入正确的数字,错误数字不能填上去
功能描述:
在主界面,玩家点击某一小格会弹出一对话框,此框内会列出所有满
足填入此格的合格数字。
玩家可根据自己的判断填入相应的数字
(3)数据库模块
玩家完成游戏可以输入自己的名字由系统生成排名
当玩家完成游戏时,再次点击界面会弹出对话框提示玩家完成游戏
输入姓名,系统会根据玩家通关所填入的数字的次数,以及此时的
关数生成排名,玩家可查询自己的排名。
3.2游戏结构设计
3.3游戏运行流程返回开始
插
入
数
据
是
否
第四章数独游戏的实现
4.1安装开发环境
安装JDK和配置Java开发环境
(1)登陆,下载最新版JDK。
这里下载的是jdk1.7版本。
(2)安装JDK1.7。
(3)安装Eclipse3.6.2。
登录http:
//www.eclipse.org/downloads/下载对应Eclipse版本,解压至相应的位置。
Eclipse需要在正确安装JDK的操作系统下运行,启动时会自动检测Java运行时环境。
当进入欢迎界面时,表示开发Java程序所需的环境搭建成功。
SDK和ADT的安装和配置
(1)安装AndriodSDK
从官方网站下载android_sdk_r10_windows.zip并解压。
运行SDKManager.exe,在窗口中选择要安装的AndroidSDKTools、AndroidAPI版本及GoogleUSBDriver和SDK文档,选择好之后点击Installpackages…按钮开始下载所选择的安装包。
(2)AndroidSDK配置
右击“我的电脑”,依次选择“属性”,“高级”,“环境变量”选项。
选择“系统变量”中的“Path”的项,点击编辑,将AndroidSDK安装文件夹下的tools文件夹的路径加入到“Path”中,点击确认,完成环境变量配置。
(3)安装配置ADT
启动Eclipse,点击“Help”菜单,选择“InstallNewsoftware…”项,点击“AddSite…”按钮,输入http:
//dl-
下载完后重启Eclipse,点击“Window”菜单,依次选择“Preferences”,“Android”点击“Browse…”按钮,选择AndroidSDK的安装路径,点击“Apply”按钮,可以看到AndroidSDK中包含的已下载的AndroidPlatform,最后点击“OK”按钮确认
4.2项目文档浏览
JAVA文件:
XML文件:
4.3数独游戏界面的实现
此界面通过自定义view实现。
9宫格通过画笔画出。
主要代码如下
protectedvoidonDraw(Canvascanvas){
//背景色画笔定义
Paintbackgroundpaint=newPaint();
backgroundpaint.setColor(getResources().getColor(R.color.beijingse));
canvas.drawRect(0,0,getWidth(),getHeight(),backgroundpaint);
//定义画笔
Paintpaint1=newPaint();
paint1.setColor(getResources().getColor(R.color.qianheixian));
Paintpaint2=newPaint();
paint2.setStrokeWidth(5);
paint2.setColor(getResources().getColor(R.color.chunhei));
//画九宫格的线
for(inti=0;
i<
9;
i++){
canvas.drawLine(0,i*heigh,getWidth(),i*heigh,paint1);
canvas.drawLine(i*width,0,i*width,getHeight(),paint1);
}
10;
if(i%3!
=0){
continue;
}
canvas.drawLine(0,i*heigh,getWidth(),i*heigh,paint2);
canvas.drawLine(i*width,0,i*width,getHeight(),paint2);
//画数字
Paintnumberpaint=newPaint();
numberpaint.setColor(Color.RED);
//红色
numberpaint.setStyle(Paint.Style.STROKE);
//空心
numberpaint.setTextSize(heigh*0.75f);
//数字大小
numberpaint.setTextAlign(Paint.Align.CENTER);
//居中对齐
FontMetricsfm=numberpaint.getFontMetrics();
floatx=width/2;
floaty=heigh/2-(fm.ascent+fm.descent)/2;
//y方向居中
for(intj=0;
j<
j++){
Stringm=game.fanhuizifuchuan(i,j);
canvas.drawText(m,i*width+x,j*heigh+y,numberpaint);
super.onDraw(canvas);
invalidate();
}
4.4输入数字界面的实现
此界面是通过自定义对话框实现的。
当玩家点击屏幕时,会弹出数字0—9的按钮,此时系统会根据玩家点击的位置计算出在此位置能填写的数字,然后把不能填写的数字按钮隐去,避免玩家填写不合格的数字,主要代码如下:
protectedvoidonCreate(BundlesavedInstanceState){
//TODO自动生成的方法存根
super.onCreate(savedInstanceState);
setTitle("
HNQ"
);
setContentView(R.layout.anniubiaoge);
findview();
bukeyong.length;
if(bukeyong[i]!
anniu[bukeyong[i]-1].setVisibility(View.INVISIBLE);
anniujianting();
bt1=(Button)findViewById(R.id.but10);
bt1.setOnClickListener(newView.OnClickListener(){
@Override
publicvoidonClick(Viewarg0){
dismiss();
});
privatevoidfindview(){
anniu[0]=findViewById(R.id.but1);
anniu[1]=findViewById(R.id.but2);
anniu[2]=findViewById(R.id.but3);
anniu[3]=findViewById(R.id.but4);
anniu[4]=findViewById(R.id.but5);
anniu[5]=findViewById(R.id.but6);
anniu[6]=findViewById(R.id.but7);
anniu[7]=findViewById(R.id.but8);
anniu[8]=findViewById(R.id.but9);
privatevoidchuancanshu(intt){
shuduview.shuaxingjiemian(t);
dismiss();
privatevoidanniujianting(){
anniu.length;
finalintt=i+1;
anniu[i].setOnClickListener(newView.OnClickListener(){
publicvoidonClick(Viewarg0){
chuancanshu(t);
bushu++;
}
});
//返回步数
publicintfanhuibushu()
{
returnbushu;
//步数清0
publicvoidinitbushu()
bushu=0;
4.5选难度的实现
此游戏的是先找好一组排列好的数独数字,通过随机数根据难度的不同随机的遮住数量不同的数字。
下面是主要代码部分:
privatevoidxuanze1()
{
inta[]=newint[9];
//随机给9个单元格赋值0
for(inti=0;
i<
9;
i++)
a[i]=(int)(Math.random()*80);
nandu[a[i]]=0;
//初始化数独
81;
shudu[i]=nandu[i];
dedaosuoyoubukeyongshuzi();
}
4.6数据库排名的实现