安卓大作业围住神经猫小游戏.docx

上传人:夺命阿水 文档编号:1719512 上传时间:2024-12-16 格式:DOCX 页数:30 大小:55.92KB
返回 下载 相关 举报
安卓大作业围住神经猫小游戏.docx_第1页
第1页 / 共30页
安卓大作业围住神经猫小游戏.docx_第2页
第2页 / 共30页
安卓大作业围住神经猫小游戏.docx_第3页
第3页 / 共30页
安卓大作业围住神经猫小游戏.docx_第4页
第4页 / 共30页
安卓大作业围住神经猫小游戏.docx_第5页
第5页 / 共30页
点击查看更多>>
资源描述

《安卓大作业围住神经猫小游戏.docx》由会员分享,可在线阅读,更多相关《安卓大作业围住神经猫小游戏.docx(30页珍藏版)》请在课桌文档上搜索。

1、移动终端应用开发大作业报告书题目:围住神经猫小嬉戏专业:计算机科学及技术学号:学生姓名:1.2指导老师:叉叉叉完成FI期:2019-5-31一、需求分析-二、系统功能描述三、系统概要设计-曾误I未定义书签.错误I未定义书签0-23.1功能模块设计23.1.1程序流程图23.1.2程序模块设计23.1.3界面功能具体设计3四、系统主要代码4五、总结175.1 开发中遇到的问题175.2 系统有待实现的功能175.3收获总结18六、参考文献18一需求分析安卓嬉戏已经是大势所趋,开发安卓嬉戏也将是嬉戏开发者的重中之重,所以我选择试做一个安卓小嬉戏来作为我的android课程大作业。围住神经猫是一款益

2、智类的小嬉戏,它可以在人们生活烦躁工作无聊之时提高一种新的打发时间、舒缓压力的休闲方式,也可以熬炼人的逻辑思维实力、推断力和视察力。首先我们从嬉戏界面起先分析,一起先是嬉戏欢迎界面,点击“起先嬉戏”,就可以切换到嬉戏界面,起先玩嬉戏了。在嬉戏界面中,有嬉戏背景,还有神经猫在移动时的样式,并把神经猫可移动的范围以坐标的方式分为若干个点。嬉戏结束时会对玩家进行提示,若玩家胜利围住神经猫则显示玩家所用的步数。然后是对神经猫这个嬉戏限制的分析,神经猫可移动的范围是9X9,我设置神经猫的初始位置是固定的,但是系统在嬉戏一起先生成的路障是随机的,一共是16个路障,之后玩家将依据嬉戏的状况对神经猫进行堵截,

3、当玩家每选择一个点作为自己想设置的路障时,那个点将变更为橘色,而神经猫将依据可选择的路径自动移动到卜一个地点,当神经猫移动到随意一个边缘时,嬉戏会提示玩家失败,当玩家胜利围住神经猫时,嬉戏会提示玩家胜利且会显示出玩家所用的步数。这个嬉戏要用到二维数组,把神经猫可以移动的范围进行记录,还必须要对神经猫的移动方式进行设置,还有每个点不同状态的转换,路障的自动生成,还有对玩家所用步数的统计,这个嬉戏所要用到的主要软件是Ec1.ipse、ADT,它的主要语言是java,操作系统是WindOWs7.二系统功能设计项目具体功能描述如下:1)嬉戏起先界面:有比较搞笑的背景图来吸引玩家,然后点击起先嬉戏,切换

4、到嬉戏界面2)嬉戏界面:神经猫起先在嬉戏的正中间,平且还有系统随机生成的16个路障,范围是9X9的空间里,并且把它分成了点,玩家在点上设置好路障后,神经猫会在看选取的路径中随机选取一条,并移动到下一个点,直至嬉戏结束。3)嬉戏结束界面:当神经猫移动到随意边缘时,会显示通关失败的提示:但玩家胜利围住神经猫时,则显示胜利通关页面,并且统计了玩家所用的步数。三项目概要设计3.1功能模块设计(1)程序流程图依据用户需求,本软件程序流程图如F:启动程一次胜利通关再来(2)程序模块设计为了提高代码的重复利用率,程序设计时自定义了以下几个类:自定义坐标类(Dot):每一个点都是一个抽象的对象,须要把每个点抽

5、象为一个类,然后让每个圆圈继承于这个类。自定义绘制布局类(p1.ayground):继承SUrfaCeView,将制定的绘图呈现在Surfaceview上,界面的响应和绘制都在surfaceview上完成的。自定义实现接口(OnTouch1.istener):为了界面的点击做出响应。(3)界面功能具体设计各界面功能详尽介绍如下:D嬉戏起先界面(图1:homepage):打开程序首先显示嬉戏起先界面,通过点击起先嬉戏,M刻自动跳转到嬉戏界面图(honcpage2)图1:homepage2)嬉戏界面(图2:homepage2):进入到嬉戏界面以后,就可以正式起先嬉戏啦玩家起先对神经猫进行围追截堵图

6、2:homepage23)嬉戏结束界面(图3:homepage入图4:homepage4):若玩家胜利围住神经猫则显示图3,若失败则显示图4图3:homepage3图4:homepage4四项目主要代码系统实现相应功能的主要代码如下:记录每个场景中的元素它的X,Y坐标点的状态:packagecom.examp1.e,crazycat;pub1.icc1.assDot记录每个场景中的元素它的W1.:标点的状态。并不会干脆参及界面的响应和界面的绘制privateintx,y;privateintStatUS;记录这个点的状态pub1.icstaticfina1.intSTATUS_OFF:一1;/

7、弋表可走的路径pub1.icstaticfina1.intSTATUSJN=0;猫的当前位置pub1.icstaticfina1.intSTATUSj:1;已经设置的路指定X,y的坐标pub1.icDot(intx,inty)this,x=x;this,y=y;this,status=STATUS_OFF,指定ge1.er和SetIe方法pub1.icintgetX()returnx;pub1.icvoidsetX(intx)this,x=x;pub1.icintgetY()returny;pub1.icvoidsetY(inty)this.y=y;pub1.icintgetStatus()r

8、eturnstatus;pub1.icvoidsetStatus(intstatus)this,status=status;同时设置X。y的方法pub1.icvoidsetXY(intx,inty)this,=;this,y=y;P1ayground类的实现:packagecom.examp1.e,crazycat;importjava.uti1.HashMap;importjava.uti1.Timer;importjava.uti1.TimerTask;importjava.uti1.Vector;importandroid.annotation.Suppress1.int;importa

9、ndroid,app.A1.ertDia1.og;importandroid.app.A1.ertDia1.og.Bui1.der;importandroid,content.Context;importandroid,content.Dia1.oginterface;importandroid,graphics.Canvas;importandroid.graphics.Co1.or;importandroid,graphics.Paint;importandroid,graphics.RectF:importandroid,graphics,drawab1.e.Drawab1.e;impo

10、rtandroid.view.KeyEvent;importandroid,view.MotionEvent;importandroid.view.SurfaceHoIder;importandroid,view.SurfaceHo1.c1.er.Ca1.Iback;importandroid,view.SurfaceView;importandroid.view.View;importandroid,uie”.VieW.OnCIick1.istener;importandroid.VieW.View.OnTouch1.istener;importandroid,widget.TOaSt;pu

11、b1.icc1.assP1.ayGroundextendsSurfaceViewimp1.ementsOnTouch1.istener界面的响应和界面的绘制在SUrfaCeView完成,触摸事务的响应通过OnTouch1.iStener接口实现/行数privatestaticfina1.intROW=9;/列数privatestaticfina1.intCO1.-9;/障碍的数量privatestaticfina1.intBOCKS-CO1.*ROW/5;/屏幕宽度去privateintSCREENJV1.DTH;/每个通道的宽度privateintWIDTH;/奇数行和偶数行通道间的位置偏差

12、量privateintDISTANCE:/屏幕顶端和通道最顶端间的距离privateintOFFSET;/整个通道及屏幕两端间的距离privateint1.ength;/做成神经猫动态图效果的单张图片privateDrawab1.ecatdrawab1.e;/背景图privateDrawab1.ebackground;/神经猫动态图的索引privateintindex=O;privateDotmatrix;privateDotcat;privateTimertimer=nu1.1.;privateTimerTasktimerttask=nu1.1.;privateContextcontext;

13、privateintsteps;privateintimages=R.drawab1.e,cat1.R.drawab1e.Cat2、R.drawab1e.cat3,R.drawab1.e,cat4,R.drawab1.e,cat5,R.drawab1.e.cat6,R.drawab1.e,cat7,R.drawab1.e.cat8.R.drawab1.e,cat9,R.drawab1.e.cat10,R.drawab1.e.cat11,R.drawab1.e.cat12,R.drawab1.e,cat13,R.drawab1e.cat14.R.drawab1.e.cat15,R.drawab1

14、.e.cat16;Suppress1.int(C1.ickab1.eviewAccessibi1.i1.y)pub1.icP1.ayGround(Contextcontext)super(COnteXI);运用COn1.eXt创建当前类构造函数matrix=newDotR0fCO1.;/将行,列宽传递进去,指定数组大小cat_drawab1.e=getResources().getDrawab1e(imagesindex);background=getResources().getDrawab1.e(R.drawab1.e,bg);this,context=context;initGame()

15、;/调用嬉戏初始化getHo1.der().addCa1.Iback(ca1.1back)jCa1.1.back对象指定给gctho1.derSetOnTouch1.istener(this);.7设定为自己的触摸监听器this.SetFocusab1.e(true);this.SetFocusabIe1.nTouchMode(true);Overridepub1.icboo1.eanonKeyDown(intkeyCode,KeyEventevent)(if(keyCode=KeyEvent.KEYCODE_BACKStopTimerO;returnsuper.OnKeyDown(keyCo

16、de,event);/初始化嬉戏:分别对可走路径位置,猫的位置和路障位置进行初始化privatevoidinitGame()steps=();for(inti=0:iROW,i+)for(intj=0;jCO1.j+)matrixij=newDot(j,i);/*X,Y坐标值和行列值是相反的。即通过查找列值获得X坐标,查找行值获得Y坐标*/for(inti=0;iOF;i+)/用for循环将全部点设置为STATUSJ)IT,即可用状态for(intj=0;jOit;j+)matrixij.setStatus(Dot.STATUS_OFF);cat=newDOt(CH/2-1,ROW/2-1);

17、设置猫的起始点getDot(cat.getX(),cat.getY0).setStatus(Dot.STATUS;把猫的起始点的状态设置为STATUSN,才能记录猫的位置for(inti=0;iBocKS)用f循环随机的指定16个点的坐标作为路障intX=(int)(Math,random)*1000)%COE);inty=(int)(Math,random()*1000)%Ro小;/随机获得1对坐标点if(getDot(x,y).getStatus()Dot.STATUS_OFF)对当前可用路径点进行选择get1.)ot(x,y).setStatus(Dot.STATUS_OH);/把这个点

18、设置成路障i+;实现界而绘制,在redraw方法中将全部元素以图形化显示出来,也就是将它绘制在CanVaS对象上privatevoidredraw()Canvascanvas=getHo1.der().IockCanvas();/锁定画布canvas.drawCo1.or(Co1.or.GRAY)殳置颜色为浅灰色Paintpaint=newPaint();创建Paint对象paint.setE1.ags(Paint.ANTI_A1.IAS_F1.AG);开启抗锯齿,优化视频质量用两个For循环嵌套将全部的点显示到界面中来for(inti=0:iROW,i+)for(intj=0;jimages

19、,1.ength-1)index=0;cat_drawab1.e=getResources().getDrawab1.e(imagesindex);redraw();/获得通道对象privateDotgetDot(intx,inty)returnmatrixyx;/推断神经猫是否处于边界privateboo1.eaninEdge(Dotdot)if(dot.getX()*dot.getY()=0dot.getX()+1=CO1.Idot.getY()+1=ROVreturntrue;当前点的坐标无论是X或y为。,或X或y值是定义的嬉戏场景最大值时都处于边界returnfa1.se;/移动Cat

20、至指定点privatevoidmoveTo(Dotdot)dot.setStatus(Dot.STAT1.JSN;dot的状态设置为猫所处的点getDot(cat.getX(),cat.getYO).setStatus(Dot.STATUS_OFT);将猫当前点的状态复位cat.setXY(dot.getX(),dot.getY();将猫移动到新的点/获得One在方向全上的可移动距离,中心点6个方向距离的推断及获得。路径结束点为路障用负数表示,为场景边缘用正数表示privateintget1.)istance(Dotone,intdir)intdistance=0;if(inEdge(one)

21、return1;假如卜一个点已在屏幕边缘,无需再推断Dotori=one:定义Ori和next,Ori指定为当前函数传入的OneDotnext;whi1.e(true)next=getNeighbour(ori,dir);if(next.getStatus()=Dot.STATUS_(1.)returndistance*-】;下一个点为路障的话,干脆返回距离0if(inEdge(next)distance+;returndistance;F个点为场景边缘时,距离+1并返回distance+:ori=next:/获得dot的相邻点,返回其对象privateDotgetNeighbour(Dotc

22、1.ot,intdir)每个点都有6个相邻点switch(dir)case 1:returngetDot(dot.getX()-1,dot.getY();获得中心点左边相邻点case 2:if(dot.getY()%2=0)returngetDot(dot.getXO-1,dot.getYO-D;奇数行获得中心点左上相邻点:T,y-1e1.sereturnget1.)ot(dot.getX(),dot.getYO-1);7偶数行获得中心点左上相邻点:y-1.case 3:if(dot.getYO%2=0)returngetDot(dot.getX(),dot.getY()-1);奇数行获得中心

23、点右上相邻点:y-1.e1.sereturngetDot(dot.getX()+1,dot.getYO-1);偶数行获得中心点右上相邻点:x+1.,y7case 4:returngetDot(dot.getX()+1,dot.getY();获得中心点右边相邻点case 5:if(dot.getY()%2=0)returngetDot(dot.getX(),dot.getYO+1);/奇数行获得中心点右下相邻点:y+1e1.sereturngetDot(dot.getX()+1,dot.getYO+D;偶数行获得中心点右下相邻点:+i,case 6:if(dot.getY()%2=0)retur

24、ngetDot(dot.getX()-1,dot.getY()+D;奇数行获得中心点左下相邻点:xT,y+1e1.sereturngetDot(dot.getX(),dot.getYO+1);7偶数行获得中心点左卜相邻点:y+1returnnu1.1.;/Cat的移动算法privatevoidmove()if(inEdge(cat)fai1.ure();return;猫处广嬉戏边缘,失败Vectoravai1ab1e=newVector();/ava1.iab1.e容器记录可用点Vectordirect=newVector():!/positive容器记录这个方向上可以干脆到达屏幕边缘的路径H

25、aShMaPDot,Integerhash=newHashMapDot,IntegerX);区容器记录方向for(inti=1;i0)direct.add(n);当它有一个路径可以干脆到达屏幕边缘,把n传递进PoSitiVe中移动算法的优化if(avai!ab1.e,size()=0)Win();四周的6个点都不行走,没有可用点,胜利围住猫e1.seif(avai!ab1.e,size()=1)moveTo(avai1.ab1c.get(0);只有一个方向可走,可用点有一个,移动到这个可用点上e1.se有多个方向可走Dotbest=nu1.1.;if(direct,size()!=0)/存在可

26、以干脆到边缘的走向intmin=20;for(inti=0;idirect,size();i+)if(inEdge(direct,get(i)best=direct,get(i);break;e1.seintt=getDistance(direct.get(i),hash,get(direct,get(i);if(tmin)min=t;把最短路径长度传给业ibest=direct.get(i);选出拥有最短路径的点e1.se全部方向都存在路障intmax=1;for(inti=0;iavai1.ab1.e,size();i+)intk=get1.)istance(avaiab1.e,get(i

27、),hash,get(avai1.ab1.e,get(i);if(kmax)全部方向都存在路障,距离k为负数max=k;best=avai1.ab1.e,get(i)选出拥有最短路径的点moveTo(bes1.);移动到最短路径的下一点/redraw();if(inEdge(cat)fai1.ure();/通关失败privatevoidfai1.ure()A1.ertDia1.og.Bui1.derdia1.og=newBui1.der(context);dia1.og.SetTit1.e(通关失败);dia1.og.SetMeSSage(“你让神经猫逃出精神院啦(-dia1.og.SetCa

28、nce1.ab1.e(fa1.se);dia1.og.setNegativeButton(再玩次”,newDia1.oginterface.OnC1.ick1.istenerOpub1.icvoidonC1.ick(Dia1.OgInterfacedia1.og,intwhich)initGame():dia1.og.SetPOSitiVeBUttOn(取消”,nu1.1.);dia1.og,show();/通关胜利privatevoidwinOA1.ertDia1.og.Bui1.derdia1.og=newBuiIder(context);dia1.og.SetTitIe(通关胜利”);d

29、ia1.og.setMessage(“你用+(steps+1)+”步捕获到了神经猫耶()y);dia1.og.SetCance1.ab1.e(fa1.se);dia1.og.SetNegatiVeBUtton(再玩一次,newDia1.oginterface.OnC1.ick1.istenerOpub1.icvoidonC1.ick(Dia1.OgInterfacedia1.og,intwhich)initGameO:dia1.og.SetPOSitiVeBUttOn(取消,nu1.1.);dia1.og,show();/触屏事务Suppress1.int(C1.ickab1.eviewAcc

30、essibi1.ity)pub1.icboo1.eanonTouch(Viewv,MotionEventevent)/将屏幕的坐标转换为嬉戏的坐标intx,y;if(event.getAction()=MotionEvent.ACTI(W_UP)(.7当用户触摸之后手离开屏幕释放的瞬间才对事务进行响应if(event.getY()=OEESET)returntrue;y=(int)(event,getY()-OFFSET)/WIDTH);/横向状态卜,奇、偶数行有坐标偏移,而纵向的Y值是不变的,将y进行转换if(y%2=0)if(event.getX()=1.ength+WIDTH*CO1.)

31、returntrue;x=(int)(event.getX()-1.ength)/WIDTH);e1.seif(event.getX()(1.ength+WIDTH/2+WIDTH*COD)returntrue;x=(int)(event.getX()-WIDTH/2-1.ength)/WIDTH);if(x+1三,IIy+1WinitGameO;触摸超出边界时初始化嬉戏e1.seif(inEdge(cat)returntrue;e1.seif(getDot(x,y).getStatus()=Dot.STATUS_OFF)get1.)ot(x,y).setStatus(Dot.STATUS_O

32、H);7当这个点可用时被点击之后设定为路障状态move();steps+;redraw();/将变更更新到界面returntrue;五总结5.1开发中遇到的问题1)界面响应的问题:在我点击屏幕来给神经猫设置路障时画面完全没有响应。解决方案:为SU方aceview添加Ca1.1.back,并且添加redraw(),在界面第一次显示时将指定的内容显示到界面上。2)神经猫移动路途问题:神经猫是依据设置的路障状况,在可移动的范围内选择一条可移动的路径,但是如何移动,有些没有头绪。解决方案:将神经猫移动的路途分为这么几种状况,四周的6个点都不行走,没有可用点,胜利围住猫,假如只有个方向可走,可用点有一个

33、,移动到这个可用点上;假如有多个方向可走,存在可以干脆到达屏幕边缘的走向,选出拥有最短路径的点,神经猫将移动到那个点;假如全部方向都存在路障,选出拥有最短路径的点,移动到最短路径的下一点5. 2项目有待实现的功能D嬉戏难度系数低,须要实现可分类。.2)分数比较:可以建立个数据库,记录每位玩家的分数,然后在嬉戏结束时,跟全国的玩家进行对比,来进行排名。3)嬉戏共享功能:可以通过微信QQ等工具共享给好友。5.3收获总结在整个软件的开发过程中可以说遇到了许很多多千姿百态的错谩,有些错误很快能想到解决方法,但是有些错误往往是干脆盯着代码看了几个小时,测试了遍之后才茅塞顿开,原来自己真的真的很马虎。虽然

34、说耗费了很长时间来完成这个项目,但也学到了很多的阅历,对软件的驾驭程度,对调试代码方法的驾驭,对各种文件的操作等都有了很大的提高。本次的项目我也是本着将以前所学的学问合理应用的目的,用了很多种不同的方法来实现同一种功能,以此来考察自己的实力,因此软件设计,代码书写的时候没有特殊的计较时间空间的困难度等问题,这也是以后须要留意到的问题。同时,这次是以团队的形式来开发这一项目的,不论结果如何,不论成果如何,我们团队的两个个人都尽自己的所能,将自己所学运用到项目的开发中来。这也考验了我们的团队协作实力,以及整个项目的规划问题。总之,这次项目的实践受益匪浅,而且也深深的相识到了自己的不足,实力有待提高

35、,学问面太过狭窄,了解的技术也很少。在以后的学习过程中仍旧要努力的学习相关的学问。六参考文献李刚.疯狂AndrOid讲义电子工业出版社李刚.疯狂JaVa讲义.电子工业出版社余志龙.陈小风等.AndroidSDK开发范例大全第3版.人民邮电出版社陈璟,陈平华,李文亮.Android内核分析J.广东工业高校计算机学院实践及阅历,2009:112-115赵亮,张维.基于AndrOid技术的界面设计及探讨D.徐州:项目名称:学号:徐州建筑职业技术学院,2019陈炜,张晓蕾,侯燕萍等.Java软件开发技术.北京:人民邮电出版社,2019移动终端软件开发考核评分标准程序运行状况程序代码量极其少,程序无法运

36、行程序运行中存在bug,经现场调试未解决程序运行中存在bug,经现场调试解决程序整个运行过程正常功能模块完成项目最基本的功能模块在以上基础上,模块设计合理,功能全面在以上基础上,能娴熟敏捷运用MVC模式在以上基础上,运用合理的模式进行模块划分,独立解决较困难的编程问题。系统界面设计具有一般的用户界面在以上基础上,用户界面功能全面在以上基础上,用户界面美观,操作便捷,良好交互在以上基础上,功能设计实现上有创新创新部分运用课程所讲学问实现项目的功能在以上基础上,自学学问:项目设计报告简洁完成设计报告,符合最低要求设计报告能简要的介绍系统功能报告内容比较完整,格式清楚,语句较通顺报告内容完整,图表运用精确,描述具体,反映系统开发过程老师签字:成果:

展开阅读全文
相关资源
猜你喜欢
相关搜索

当前位置:首页 > 在线阅读 > 生活休闲


备案号:宁ICP备20000045号-1

经营许可证:宁B2-20210002

宁公网安备 64010402000986号