高级操作系统课程设计-基于Android平台的2048游戏设计与开发.docx_第1页
高级操作系统课程设计-基于Android平台的2048游戏设计与开发.docx_第2页
免费预览已结束,剩余13页可下载查看

下载本文档

版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领

文档简介

高级操作系统论文(设计) 题目 基于android个人2048 小游戏的设计与开发 姓名 学号 院、系 信息学院 专业 指导教师 职称(学历) 目 录摘要11 前言11.1 游戏背景11.2 游戏玩法介绍12 游戏设计分析12.1 游戏框架的分析12.2 流程分析22.3 开始游戏分析22.4 计分分析 22.5 游戏结束分析23 游戏的具体实现23.1 创建游戏项目23.2 设计游戏布局33.3 主界面的实现33.4 触控交互设计53.5 游戏卡片类的实现73.6 添加游戏卡片83.7 在游戏中添加随机数83.8 游戏计分的实现93.9 游戏结束设置94 心得体会 12参考文献 12abstract 131基于android个人2048小游戏的设计与开发摘要:2048这款小游戏是一款流行的数字游戏。第一款2048小游戏是由gabriele cirulli首度发布在github上。2048是当时基于1024和小三传奇这两款的玩法而开发的新型数字游戏,现在开发出来的版本有普通版、六边形版、朝代版、3d版、后宫版等等。关键词:游戏;数字;版本1 前言1.1 游戏背景生活在21世纪的我们已经进入电子时代,像如今,液晶电视,平板电脑,ipad,手机等等,已经进入大众家庭,随着中国的经济发展,人均收入大幅度提升,很多家庭都用上了电子产品,像我们小时候用的好记星、小霸王学习机等等都已经慢慢被淘汰,淡出大众的视野,取而代之的是现在快速发展的移动设备,尤其是手机,更是大众化,价格也越来越低廉,平均每个家庭都会有几部,甚至十几部,尤其是现在的年轻人,不论是吃饭、走路、等车、睡觉之前都会热衷于玩于手机,当你感到无聊的时候,可以上上网,看看新闻,累了之后可以玩玩小游戏缓解一下疲劳,所以我就设计了这款2048的小游戏,既开发智力,又缓解疲劳,适时玩一下小游戏还是有好处的。本游戏是基于安卓平台开发的,android是一种以linux为底层,用java语言编写代码的操作系统,主要使用于android系统的手机。1.2 游戏玩法介绍游戏的规则其实很简单,就是每次可以选择上下左右其中一个方向滑动,每滑动一次,所有的数字都会往滑动的方向靠拢外全部靠拢在滑动方向的一边为基准线进行叠排,每滑动一次,系统就会在空白的方块随机出现一个数字方块,一般只出现2和4,出现2的概率会远远大于出现4的概率,相同数字的方块在靠拢、相撞时会相加。玩家要想办法在这小小的16个方格中拼凑出“2048”这个数字方块,就表示游戏过关。如果你是一个数字爱好者,或者是比较有天赋的数学天才,就算不是数学天才,一般的玩家也能够玩转这款游戏,都会有很大机会成功的。2 游戏设计分析2.1 游戏框架的分析对一个游戏而言,需要将各个部位分割成其对应部分的功能,并且逐步去实现该功能。2.2 流程分析要想把一个游戏做好,首先要把流程分析好,画出流程图,如图2-1所示 开始游戏初始化游戏界面,在新游戏界面的4*4的框中随机产生两个数字2或者4对框进行上下左右方向移动,以使相同的数字进行叠加有相邻数字相同?是否两个数字相加,并且添加一个新的随机数机数是否有空框?本次移动获得相应的分数 否是添加一个随机数记录相应的分数 游戏结束图 2-1 流程分析2.3 开始游戏分析用户需点击开始游戏按钮,进入游戏主界面,然后用手指在屏幕上上下左右四个方向滑动即可。2.4 计分分析当有数字合并时,记录此时合并的的数字,加到相应的分数中。2.5 游戏结束分析当屏幕上数字没有得到2048这个值,没有两个相同的格子的数字相同,并且已经没有空格,那么就判定为游戏结束。3 游戏的具体实现3.1 创建游戏项目创建该游戏的名称为game_2048,所在的包目录为com.sc.game_2048,为了便于中文的显示,我们选择编码方式为utf-8。3.2 设计游戏布局本游戏的设计用到了线性布局、相对布局、表格布局等等。(1)线性布局是最简单的,也是开发者用的最多的布局文件,是初学者最容易上手的布局之一。若规定线性布局的方向为处置方向时,此时整个线性布局中的所有控件都会位于同一列中;若规定线性布局的方向为水平方向,则所有的控件都会为同一行中,线性布局既可以在xml中定义,也可以直接在java文件中定义,当然这需你非常熟悉之后。(2)相对布局另外一种空间摆放的方式,相对布局通过指定当前空间与兄弟空间或者父控件之间的相对位置关系,从而达到控制控件位置的目的。在安卓版本4.2以后,相对布局增加了新的特性,比如:layout_alignstart,layout_aliagnend,layout_alignparentstart,layout_alignparentend。3.3 主界面的实现3.3.1 开始界面(1)本界面主要通过一个imageview实现,通过使用handler事件处理的postdelayed方法,实现从本界面经过5秒钟的时间自动跳转到mangeactivity界面。(2)在本界面中,通过以下两条语句获取当前窗口的宽度和高度,并且设置窗口的高度和宽度充满整个屏幕不显示标题,使得进入游戏时,可以充满整个屏幕。在后面的其他界面中均采用这种方式,是的所有界面充满整个屏幕。getwindow().setflags(windowmanager.layoutparams.flag_fullscreen, windowmanager.layoutparams.flag_fullscreen);requestwindowfeature(window.feature_no_title);实现界面如图3-1所示图 3-1 开始界面3.3.2 控制界面控制界面主要包括开始游戏按钮和退出游戏按钮,本界面主要采用了相对布局的方式,两个按钮均采用了imagebutton的控件,使得用户通过点击开始游戏时,通过两个avtivity的跳转,从本界面跳转到游戏界面,点击退出游戏按钮,结束当前游戏并退出游戏界面,释放相应的资源。实现界面如图3-2所示图 3-2 控制界面3.3.3 游戏界面本界面主要采用了线性布局、表格布局以及framelayout,通过这三种布局的有效结合,使得游戏分为计界面以及游戏界面两部分,上边部分记录游戏所得分数,下面部分用于显示游戏的16个操作框,实现游戏的运行。具体实现界面如图3-3所图 3-3 游戏界面3.4 触控交互设计本模块主要实现用户通过手指滑动屏幕,起始位置,获得水平或垂直方向的偏移离量,以此来判断用户的意图,主要是通过调用ontouchlistener监听器来实现的,具体代码实现如下:setontouchlistener(new ontouchlistener() private float starthorizontal,startvertical;private float shifthorizontal,shiftvertical;public boolean ontouch(view v, motionevent event) / todo auto-generated method stubswitch (event.getaction() case motionevent.action_down: starthorizontal = event.getx();startvertical = event.gety();break;case motionevent.action_up: shifthorizontal = event.getx()-starthorizontal; shiftvertical = event.gety()-startvertical;if(math.abs(shifthorizontal)math.abs(shiftvertical)if(shifthorizontal4)slipright(); elseif(shiftvertical4)slipdown();break;return true;);这里列举向左滑动时的代码,其他三个方向的代码跟此方向的代码相似private void slipleft()boolean flag = false;for (int i = 0; i 4; i+) for (int j = 0; j 4; j+) for (int k = j+1; k =0)if(cardarrayji.getnumber()=0)cardarrayji.setnumber(cardarrayki.getnumber();cardarrayki.setnumber(0);flag = true;else if(cardarrayji.equals(cardarrayki)&(k=j+1)cardarrayji.setnumber(cardarrayji.getnumber()*2);cardarrayki.setnumber(0);gamemainactivity.getmainactivity().addscore(cardarrayji.getnumber();flag = true; if(flag = true)addradomnumber();wingame();endgame();特殊情况:(1)由于人的手指在滑动方向会有偏差,一般不会精准的向四个方向滑动,肯定会有偏差,所以要判断手指滑过方向的是水平方向还是垂直方向的意图,当水平方向的偏移量大于垂直方向的偏移量时,表明用户是水平滑动意图,当垂直方向的偏移量大于水平方向的偏移量,表明用户是垂直方向滑动的意图。(2)由于人的手指只有滑动一段距离才能表明用户的意图,不可能点一下屏幕或者稍微动一下就表示滑动意图,这显然不太符合现实情况,所以要定义偏移一定的距离才能判断用户的真正意图。规定当水平方向的偏移距离大于或者等于水平方向的偏移距离,且当偏移小于4时,用户向上滑动,大于4使,规定向下滑动;当水平方向的偏移距离大于或者等于水平方向的偏移距离,且当偏移小于4时,规定用户向左滑动,如果大于4,用户向右滑动。3.5 游戏卡片类的实现主要采用了framelayout布局的方式,实现每个文本框中的数字的大小,位置,背景颜色等等。(1)重写了equals方法,来判断当前textview中的数字与其比较的textview的数字的大小。具体实现代码如下:public boolean equals(cardactivity o) / todo auto-generated method stubreturn getnumber() = o.getnumber ();(2)通过判断不同文本框中的数字大小,来实现不同数字的使用不同的颜色北京来显示。具体实现代码如下:if(number=0)textview.settext();textview.setbackgroundcolor(0xffb2c0cc);elsetextview.settext(number+); if(number=2)textview.setbackgroundcolor(0xffdae4ee);if(number=4)textview.setbackgroundcolor(0xffc8e0ec);.3.6 添加游戏卡片由于目前用户使用的手机的屏幕分辨率不同,所以需要动态计算游戏文本框的宽度和高度,以此来填充满整个手机屏幕。当手机由原来的垂直方向转换到水平方向时,游戏的布局会发生改变,为了不让游戏的布局宽度和高度不发生改变,需要在manifest.xml文件中第一次进入游戏时的activity中添加一条语句android:screenorientations=portrait,以后不论手机如何放置,当前的布局宽度和高度都不会改变。当第一次进入游戏时,动态计算文本框的宽度和高度,需要重写onsizechanged方法,可以得到当前布局的宽度和高度,来计算文本框的宽度和高度。定义个添加文本框的方法addcard,总共四行四列,然后用之前的卡片类来生成实例对象,再调用setnumber方法设置每个文本框的数字为0,最后调用addview方法把所有的文本框添加到游戏当中。具体实现代码如下:private void addcard(int cardwidth,int cardheight)cardactivity c; for(int i=0;i4;i+)for(int j=0;j4;j+)c = new cardactivity(getcontext();c.setnumber(0);addview(c, cardwidth, cardheight);3.7 在游戏中添加随机数对于每个文本框来说,规定如果文本框的数字小于等于0,清空当前文本框的数字小于等于0的文本框的数字,把每个空的文本框存储在一个空点数组中,最后取出一个空点,然后把改所在的文本框的数字设置为0或4,并且规定0和4出现的概率为9比1。具体实现代码如下:private void addradomnumber()emptypoint.clear();for (int i = 0; i 4.; i+) for (int j = 0; j 4; j+) if(cardarrayji.getnumber()0.1?2:4);3.8 游戏计分的实现通过在gamemainactivity中生成一个该类的实例,为了在其他activity可以访问到该activity中的方法,重写该类的get方法,然后再写添加分数方法addscore,清空分数方法clearscore,显示分数方法showscore。最后在gameactivity中有数字合并的地方,调用计分方法,使得在有合并的时候可以得到相应的分数。计分界面如图3-4所示图 3-4 游戏计分3.9 游戏结束设置3.9.1 判断游戏结束的条件(1)所有的框都有数字;(2)所有相邻的两个框的数字都不相同。只有满足以上两个条件,则该局游戏结束,并且会弹出游戏结束对话框,该对话框代码如下:private void endgame() boolean flag = true;all: for (int i = 0; i 4; i+) for (int j = 0; j 0&cardarrayji.equals(cardarrayj-1i)|(j0&cardarrayji.equals(cardarrayji-1)|(j3&cardarrayji.equals(cardarrayj+1i)|(i3&cardarrayji.equals(cardarrayji+1)flag = false;break all; if(flag)builder dialog = new alertdialog.builder(getcontext(); dialog.settitle(你好,game over); dialog.setmessage(你太菜了,再试一次?); dialog.setnegativebutton(取消, new alertdialog.onclicklistener() overridepublic void onclick(dialoginterface dialog, int which) / todo auto-generated method stubdialog.cancel();); dialog.setpositivebutton(确定, new alertdialog.onclicklistener() public void onclick(dialoginterface dialog, int which) / todo auto-generated method stubstartgame(););dialog.show();应用以上代码的效果图如3-5所示图 3-5 游戏结束3.9.2 判断游戏获胜的条件当某一个文本框的数字为2048时,即表示该局游戏获胜,此时会弹出获胜对话框,该对话框的代码如下:private void wingame()all: for (int i = 0; i 4; i+) for (int j = 0; j 4; j+) if(cardarrayji.getnumber()=2048)builder dialog = new alertdialog.builder(getcontext(); dialog.settitle(恭喜您,闯关成功); dialog.setmessage(您太牛了,是否开启新的一局游戏?); dialog.setnegativebutton(取消, new alertdialog.onclicklistener() overridepublic void onclick(dialoginterface dialog, int which) / todo auto-generated method stubdialog.cancel();); dialog.setpositivebutton(确定, new alertdialog.onclicklistener() public void onclick(dialoginterface dialog, int which) / todo auto-generated method stubstartgame();gamemainactivity.getmainactivity().clearscore(););dialog.show();break all; 应用以上代码效果如图3-6所示图 3-6 赢得游戏4 心得体会经过了几个星期的研究终于把2048这个游戏完成了,这个游戏的完成使我明白了,看似很简单的事情要真的动手实践起来确实有一定的难度,还好经过我不断的耐心学习和钻研,才把这个游戏的基本功能实现了,最好只实现了计分的功能,暂时没有实现最好成绩的记录这点稍微遗憾,以后有机会我会去实现的!俗话说,不积跬步无以至千里,不积小流无以成江海,程序中的很多方法我都是在书中和网上找了又找,试了又试,一遍又一遍,最终才把需要的方法融入到程序当中,实现了必要的功能模块。我以前从来没有玩过这个游戏,在开发游戏之前,我先在网上找到该游戏,了解游戏的玩法,自己熟悉之后才开始慢慢琢磨如何布局,如何分析,如何设计,如何实现默写模块功能,就用户在屏幕上滑动,获取用户意图这一模块来说,以前感觉很不可思议的事情,经过我不断耐心的学习,实验,最终也实现了,感觉挺棒的,通过这一点使我了解到我现在需要学习的内容还很多,今后我一定积极去学习需要学习的知识,做到融会贯通,多做项目使自己在实践中学习,为将来打好铺垫。最终因为本人能力有限,时间仓促,该游戏只是实现了基本功能,具体的美化、优化等等还没来得及做,虽然只做了这么一小部分,但是我还是学到了很多平时没有掌握到的知识,虽然不太完美,但是总体来看我还是比较满意,相信只要有实践就会有收获,只要肯努力就会有回报。成功的大门永远为那些追逐目标而奋发图强的人而开。参考文献:1 郑莉,王行言,马素霞. java 语言程序设计m.北京:清华大学出版社,2010,228238.2 吴亚峰,于复兴,杜化美. android开发游戏大全m.北京:人民邮电出版社,2013,1421.3 王小科,寇长梅,于复兴等. android入门经典m.北京:机械工业出版社,2013,130134.4 楚无咎. android开发游戏大全m.北京:电子工业出版社,2013,2325,82!84,160163.5 ian f.darwin. android开发游戏大全m.北京:机械工业出版社,2013,290297,333334.6 一辉. android布局详解之一:framelayout. /yihui823/article/details/6702273,2011-08-19 /2

温馨提示

  • 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
  • 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
  • 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
  • 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
  • 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
  • 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
  • 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。

评论

0/150

提交评论