移动互联网开发课程设计报告.docx
- 文档编号:16408889
- 上传时间:2023-07-13
- 格式:DOCX
- 页数:23
- 大小:658.51KB
移动互联网开发课程设计报告.docx
《移动互联网开发课程设计报告.docx》由会员分享,可在线阅读,更多相关《移动互联网开发课程设计报告.docx(23页珍藏版)》请在冰点文库上搜索。
移动互联网开发课程设计报告
移动互联网开发
课程设计报告
学生姓名:
学号:
专业:
计算机科学与技术班级:
设计题目:
拼图游戏
学年学期:
2016年秋季学期
指导教师:
一、设计题目
拼图游戏
二、设计目的
Android智能手机功能非常强大,具有很高的性价比,非常深受人们的喜爱,可能正式因为如此,在2016年中,Android智能手机在全世界占据着81.5%很夸张的市场份额,一举成为使用的人数最多,市场份额占据最大的智能手机系统。
而Android智能手机游戏的出现正是为了娱乐心神,并且随着智能移动终端和全球移动通信网络的不断进步,Android智能手机游戏也正在经历从简单到复杂的进化过程。
从全球来看,智能移动终端的娱乐服务一直被认为是带动移动数据业务加速并快速发展的重要力量。
也是作为手机娱乐服务的重要内容之一。
近年来,一直伴随着全球移动网络和移动终端性能不断的提高和完善。
由于近几年来,Android智能手机游戏的快速发展,游戏的分类也变得越来越丰富,目前手机游戏按内容可分为:
角色扮演类(RPG)、冒险类(AVG)、格斗类(FTG)、棋牌类、电影改版类、益智类、体育竞技类、模拟类。
手机游戏种类目前已成为人类线上娱乐生活的不可或缺的最主流的载体而存在,现代人对于移动终端的休闲娱乐功能所需求越来越强大,移动终端上的游戏或已以成为了现代人们娱乐生活中不可或缺的一部分了。
基于Android的游戏开发,国内国外的水平差距很大。
在市场上成名的手机游戏基本上都是国外游戏公司开发的,而且很容易辨认。
因为学习的关系,本人接触了很多Android开发者的游戏,发现国内开发者开发的Android手机游戏,不仅界面粗糙,而且设计简单,同质化严重,相同的创意往往被反复抄袭很多次。
而国外开发者开发的游戏不同,大型游戏内容丰富,情节完整;小型游戏而从用户体验和创意上远胜国内的开发者。
智能手机是指像电脑一样可以通过下载、安装软件来拓展基本功能的手机,一般具有智能手机操作系统。
相较于非智能手机,它功能更强,处理速度更快。
基于Linux的Android手机操作系统,由于具有开源、免费的特性,迅速得到广大爱好者及厂商的支持。
目前,移动应用软件中的手机游戏开发是一项非常热门的技术。
Android系统对第三方软件是开放的,这促进了第三方软件的发展。
Android系统以Linux2.6为核心,其安全机制比较完善,增强了手机使用的安全性。
Android平台已经形成由Google牵头,OHA组织参与,系统支持商和服务供应商完善搭配的运作机制,为Android平台的快速发展提供了坚实的基础。
由于Android构建在开源代码的框架之上,并且提供了强大的SDK库和开放的理念,所以它为广大的没有任何移动应用程序开发经验的新手开辟了一条开发完美移动应用程序的康庄大道。
而富有经验的移动开发人员现在也可以方便地扩展到Android平台上来,利用它独特的功能来改进现有产品或者开发其他新颖产品。
Android软件在一两年的时间内已经迅速发展,在各类型应用系统中都有令用户满意的成果。
此次课程设计的初衷就是想设计出一个能够在任何环境任何时间都能够放松心情和娱乐心身的单机游戏,只要通过简单和易操作的Android游戏帮助手机用户来打发他们闲暇的时间,并娱乐心身和放松心情。
通过该游戏的设计,将自己学到的Java,Android方面的理论知识应用于实践,提高自己的动手能力。
在设计的过程中,不断的修补知识方面的漏洞,加深自己对程序设计的理解,为将来从事软件开发事业打下基础。
三、设计原理及方案
1Android的系统架构
Android的系统架构和其操作系统一样,采用了分层的架构。
从图2.1中可以看出,Android分为四个层,从高层到低层分别是应用程序层、应用程序框架层、系统运行库层和Linux核心层。
图3-1Android系统架构图
(1)应用程序
Android会同一系列核心应用程序包一起发布,该应用程序包包括Email客户端,SMS短消息程序,日历,地图,浏览器,联系人管理程序等。
所有的应用程序都是使用JAVA语言编写的。
(2)应用程序框架
开发人员也可以完全访问核心应用程序所使用的API框架。
该应用程序的架构设计简化了组件的重用;任何一个应用程序都可以发布它的功能块并且任何其它的应用程序都可以使用其所发布的功能块(不过得遵循框架的安全性限制)。
同样,该应用程序重用机制也使用户可以方便的替换程序组件。
隐藏在每个应用后面的是一系列的服务和系统,其中包括;
丰富而又可扩展的视图(Views):
可以用来构建应用程序,它包括列表(lists),网格(grids),文本框(textboxes),按钮(buttons),甚至可嵌入的web浏览器。
内容提供器(ContentProviders):
使得应用程序可以访问另一个应用程序的数据(如联系人数据库),或者共享它们自己的数据。
资源管理器(ResourceManager):
提供非代码资源的访问,如本地字符串,图形,和布局文件(layoutfiles)。
通知管理器(NotificationManager):
使得应用程序可以在状态栏中显示自定义的提示信息。
活动管理器(ActivityManager):
用来管理应用程序生命周期并提供常用的导航回退功能。
(3)系统运行库
1)程序库
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:
一个对于所有应用程序可用,功能强劲的轻型关系型数据库引擎。
2)Android运行库
Android包括了一个核心库,该核心库提供了JAVA编程语言核心库的大多数功能。
每一个Android应用程序都在它自己的进程中运行,都拥有一个独立的Dalvik虚拟机实例。
Dalvik被设计成一个设备可以同时高效地运行多个虚拟系统。
Dalvik虚拟机执行(.dex)的Dalvik可执行文件,该格式文件针对小内存使用做了优化。
同时虚拟机是基于寄存器的,所有的类都经由JAVA编译器编译,然后通过SDK的"dx"工具转化成.dex格式由虚拟机执行。
Dalvik虚拟机依赖于Linux内核的一些功能,比如线程机制和底层内存管理机制。
(4)Linux内核
Android的核心系统服务依赖于Linux2.6内核,如安全性,内存管理,进程管理,网络协议栈和驱动模型。
Linux内核也同时作为硬件和软件栈之间的抽象层。
2使用的软件工具和环境
Android是Google公司开发的基于Linux内核的开源操作系统。
它包括:
操作系统、用户界面和应用程序,而且不存在任何以往阻碍移动产业创新的专有权障碍。
Android系统提供了四大基本组件,包括:
Activity、Contentprovide、Service、Intentreceiver,每个组件都是一个视图(view)。
但上述四大组件对于一个Android应用程序来说,却并不是必须的,可能只需要其中的几种酒可以满足设计需求。
Manifext.xml配置文件时Android应用程序不可或缺的一个XML配置文件,其中定义了程序所用到的组件、组件功能以及一些必要条件和权限。
Android的上层应用程序一般是由java语言开发,所以首先应该有由SUN公司提供的JavaSDK(其中包括JRE:
JavaRuntimeEnvironment)以及开发环境AndroidStudio。
此外,还需要Android开发专用Google提供的AndroidSDK。
3需求分析与概要设计
(1)功能需求
1)将1-15的数字无序的显示到游戏界面,右下角为空格
2)实现重新开始功能
3)实现使用帮助功能
4)实现点击按钮的监听器,调用action()函数,实现点击按钮与空格的交换
5)实现判断是否赢得游戏的功能(check()函数)
6)实现向上、向下、向左、向右滑动事件的处理
(2)流程图
图3-2onCreate()函数功能
图3-3onFling()函数功能
(3)目录结构
由于本程序由小组完成,固目录结构中还有另外的代码,实现的是2048游戏的功能,拼图游戏的主要代码在ShifGame中。
图3-4目录结构图
4详细设计和关键问题
onCreate函数的实现:
1)打乱nums数组中的数字,用bns[i].setText函数显示到游戏界面,完成游戏的初始化工作。
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_shift_game);
finalRandomrand=newRandom();
detector=newGestureDetector(ShiftGame.this,this);
for(inti=0;i<15;i++){//num[i]与随机产生的nums[j]交换,打乱nums数组保存的数字,nums[15]的值不参与交换,任然为0
intj=rand.nextInt(15);
inttemp=nums[i];
nums[i]=nums[j];
nums[j]=temp;
}
bns[0]=(Button)findViewById(R.id.bn0);
bns[1]=(Button)findViewById(R.id.bn1);
bns[2]=(Button)findViewById(R.id.bn2);
bns[3]=(Button)findViewById(R.id.bn3);
bns[4]=(Button)findViewById(R.id.bn4);
bns[5]=(Button)findViewById(R.id.bn5);
bns[6]=(Button)findViewById(R.id.bn6);
bns[7]=(Button)findViewById(R.id.bn7);
bns[8]=(Button)findViewById(R.id.bn8);
bns[9]=(Button)findViewById(R.id.bn9);
bns[10]=(Button)findViewById(R.id.bn10);
bns[11]=(Button)findViewById(R.id.bn11);
bns[12]=(Button)findViewById(R.id.bn12);
bns[13]=(Button)findViewById(R.id.bn13);
bns[14]=(Button)findViewById(R.id.bn14);
bns[15]=(Button)findViewById(R.id.bn15);
freshData=(Button)findViewById(R.id.refresh);
askhelp=(Button)findViewById(R.id.askhelp);
for(inti=0;i<15;i++)//将打乱后的数字显示到界面上,nums[15]值为0,所以bns无需设置
bns[i].setText(String.valueOf(nums[i]));
2)设置点击事件监听器:
bns[0].setOnClickListener(newOnClickListener(){
@Override
publicvoidonClick(Viewarg0){//调用action()函数和check()函数
action(0,1,4);
check();
}
});
3)重新开始功能的实现代码:
freshData.setOnClickListener(newOnClickListener(){
@Override
publicvoidonClick(Viewv){//点击重新开始
for(inti=0;i<15;i++){
if(nums[i]==0)//将原来为0的地方的背景设为blank_7
bns[i].setBackgroundResource(R.drawable.blank_7);
nums[i]=i+1;
}
/*1234
5678
910(原来为0,设置blank_7)1112
13141514(循环到上一个位置即nums[14],此处值未被重新设置)*/
nums[15]=0;//重新设置nums[15]为0
for(inti=0;i<15;i++){//num[i]与随机产生的nums[j]交换,打乱nums数组保存的数字
intj=rand.nextInt(15);
inttemp=nums[i];
nums[i]=nums[j];
nums[j]=temp;
}
for(inti=0;i<15;i++)//显示到界面,nums[15]a为0,bns[15]不能不设置,应为此时bns[15]经过游戏运行,可能不在为空
bns[i].setText(String.valueOf(nums[i]));
bns[15].setText("");//设置bns[15]为空
bns[15].setBackgroundResource(R.drawable.blank_1);//设置背景,并没有什么用
helpTimes=0;//重新开始后,使用帮助的次数清零
}
});
4)帮助功能的实现代码:
askhelp.setOnClickListener(newOnClickListener(){//点击使用帮助,实现交换任意两个数字的功能
@Override
publicvoidonClick(Viewarg0){
if(helpTimes==0){//为0,表示未使用过帮助
LayoutInflaterinflater=LayoutInflater
.from(ShiftGame.this);
finalViewaskHelpView=inflater.inflate(R.layout.askhelp,
null);
newAlertDialog.Builder(ShiftGame.this)
.setTitle("交换数字")
.setView(askHelpView)
.setPositiveButton("交换",
newDialogInterface.OnClickListener(){
@Override
publicvoidonClick(
DialogInterfacedialog,
intwhich){//获得输入的两个数字
intnum1=Integer
.valueOf(((EditText)(askHelpView
.findViewById(R.id.helpnum1)))
.getText()
.toString());
intnum2=Integer
.valueOf(((EditText)(askHelpView
.findViewById(R.id.helpnum2)))
.getText()
.toString());
if((num1>0&&num1<16)
&&(num2>0&&num2<16)){//两个数字应该都在1-15之内
intswap1=0,swap2=0;
for(inti=0;i<16;i++){//找到要交换的数字在nums数组中的位置
if(nums[i]==num1)
swap1=i;
if(nums[i]==num2)
swap2=i;
}
//设置bns,使界面数字发生交换
bns[swap1].setText(String
.valueOf(num2));
bns[swap2].setText(String
.valueOf(num1));
//nums数组交换,使nums与bns对应
inttemp=nums[swap1];
nums[swap1]=nums[swap2];
nums[swap2]=temp;
helpTimes++;//使用帮组次数加一,使本次游戏不能再使用帮助
}
}
}).setNegativeButton("取消",null).show();
}else{//提示本次游戏已使用过帮助
newAlertDialog.Builder(ShiftGame.this).setTitle("提示")
.setMessage("您已使用过一次帮助,不能再使用帮助")
.setPositiveButton("确定",null).show();
}
}
});
滑动事件处理实现代码:
//向上滑动
booleanupCase(intwhere){
if(where==0||where==1||where==2||where==3)
returnfalse;
elseif(nums[where-4]==0){//是空格,则交换数字
swap(where,where-4);
returntrue;
}else
returnfalse;
}
//向下滑动
booleandownCase(intwhere){
if(where==12||where==13||where==14||where==15)
returnfalse;
elseif(nums[where+4]==0){
swap(where,where+4);
returntrue;
}else
returnfalse;
}
//向左滑动
booleanleftCase(intwhere){
if(where%4==0)
returnfalse;
elseif(nums[where-1]==0){
swap(where,where-1);
returntrue;
}else
returnfalse;
}
//向右滑动
booleanrightCase(intwhere){
if(where%4==3)
returnfalse;
elseif(nums[where+1]==0){
swap(where,where+1);
returntrue;
}else
returnfalse;
}
位置a的数字与位置b的空格交换
privatevoidswap(inta,intb){//数字与空格交换
//原数字变为空格
bns[a].setText("");
bns[a].setBackgroundResource(R.drawable.photo2048);
//空格变为数字
bns[b].setText(String.valueOf(nums[a]));
bns[b].setBackgroundResource(R.drawable.photo4096);
//保持nums与bns一致
inttemp=nums[a];
nums[a]=nums[b];
nums[b]=temp;
}
点击事件监听器掉用的action()函数的实现代码,点击按钮的位置的不同要调用不同的action()函数
//点击按钮有两个相邻按钮时调用此函数
privatevoidaction(inta0,inta1,inta2){
if(nums[a1]!
=0&&nums[a2]!
=0)
return;
elseif(nums[a1]==0)
swap(a0,a1);
elseif(nums[a2]==0)
swap(a0,a2);
}
//点击按钮有三个相邻按钮时调用此函数
privatevoidaction(inta0,inta1,inta2,inta3){
if(nums[a1]!
=0&&nums[a2]!
=0&&nums[a3]!
=0)
return;
elseif(nums[a1]==0)
swap(a0,a1);
elseif(nums[a2]==0)
swap(a0,a2);
elseif(nums[a3]==0)
swap(a0,a3);
}
//点击按钮有四个相邻按钮时调用此函数
privatevoidaction(inta0,inta1,inta2,inta3,inta4){
if(nums[a1]!
=0&&nums[a2]!
=0&&nums[a3]!
=0&&nums[a4]!
=0)
return;
elseif(nums[a1]==0)
swap(a0,a1);
elseif(nums[a2]==0)
swap(a0,a2);
elseif(nums[a3]==0)
swap(a0,a3);
elseif(nums[a4]==0)
swap(a0,a4);
}
除此之外,进行左滑、右滑、上滑、下滑等手势操作的时候,要用到onFling(MotionEvente1,MotionEvente2,floatvelocityX,floatvelocityY)函数,此函数是计算手势移动的速度和移动的范围大小,计算速度沿x和y轴提供像素每秒。
值得
- 配套讲稿:
如PPT文件的首页显示word图标,表示该PPT已包含配套word讲稿。双击word图标可打开word文档。
- 特殊限制:
部分文档作品中含有的国旗、国徽等图片,仅作为作品整体效果示例展示,禁止商用。设计者仅对作品中独创性部分享有著作权。
- 关 键 词:
- 移动 互联网 开发 课程设计 报告