安卓贪吃蛇课程设计报告_第1页
安卓贪吃蛇课程设计报告_第2页
安卓贪吃蛇课程设计报告_第3页
安卓贪吃蛇课程设计报告_第4页
安卓贪吃蛇课程设计报告_第5页
已阅读5页,还剩8页未读 继续免费阅读

下载本文档

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

文档简介

辽宁科技大学新技术专题报告设计题目:安卓游戏贪吃蛇学院、系:电信学院、计算机科学与技术专业班级:计算机09.1学生姓名:刘帅指导教师:龙艳彬滕薇成绩:2023年7月1日目录第一章绪论3开发背景3安卓系统简介3游戏简介3开发目的及意义4开发环境及工具4第二章需求分析5游戏界面分析5游戏角色分析5游戏控制分析52.4可行性分析6第三章总体设计7系统功能模块层次图7运行机制8贪吃蛇功能流程图10第四章详细设计与实现124.1TiltView类124.2SnakeView类14界面设计16第五章测试20游戏功能测试20游戏控制测试20游戏界面测试20测试结果20第六章结论21第一章绪论安卓系统作为新兴的操作系统,在问世不久,变风行全球,占领操作系统里很大的市场份额,与苹果,诺基亚三分天下,Android是基于Linux开放性内核的操作系统,是Google公司在2007年11月5日公布的操作系统。早期由原名为"Android"的公司开发,谷歌在2005年收购"Android.Inc"后,继续对Android系统开发运营,它采用了软件堆层〔softwarestack,又名软件叠层〕的架构,主要分为三局部。底层Linux内核只提供根本功能,其他的应用软件那么由各公司自行开发,局部程序以Java编写。1976年,Gremlin平台推出了一款经典街机游戏Blockade。游戏中,两名玩家分别控制一个角色在屏幕上移动,所经之处砌起围栏。角色只能向左、右方向90度转弯,游戏目标保证让对方先撞上屏幕或围栏。听起来有点复杂?其实就是下面这个样子:

根本上就是两条每走一步都会长大的贪吃蛇比谁后完蛋,玩家要做的就是防止撞上障碍物和越来越长的身体。更多照片、视频可以看GamesDBase的介绍。

Blockade很受欢送,类似的游戏先后出现在Atari2600、TRS-80、苹果2等早期游戏机、计算机上。但真正让这种游戏形式红遍全球的还是21年后随诺基亚走向世界的贪吃蛇游戏——Snake。贪吃蛇游戏是一款老牌的游戏,同时也是一款比拟需要耐心地游戏。贪吃蛇游戏就是一条小蛇,不停地在屏幕上游走,吃各个方向出现的食物,越吃越长。只要蛇头碰到屏幕四周,或者碰到自己的身子,小蛇就立即毙命。玩“贪吃蛇游戏〞,难度最大的不是蛇长得很长的时候,而是开始的时候。那时蛇身很短,看上去难度不大,却最容易死掉,因为把玩一条小蛇让人容易走神,失去耐心。通过本次课程设计,了解android软件的开发过程,熟悉并掌握JAVA语言,HTML.程序关键在于表示蛇的图形及蛇的移动。用一个小矩形快表示蛇的一节身体,身体每长一节,增加一个矩形块,蛇头用俩节表示。移动时必须从蛇头开始,所以蛇不能向相反的方向移动,如果不按任意键,蛇自行在当前方向上前移,但按下有效方向键后,蛇头朝着该方向移动,一步移动一节身体,所以按下有效方向键后,先确定蛇头的位置,而后蛇的身体随蛇头移动,图形的实现是从蛇头新位置开始画出蛇,这时,由于未清屏的原因,原来的蛇的位置和新蛇的位置差一个单位,所以看起来蛇多一节身体,所以将蛇的最后一节用背景色覆盖。食物的出现与消失也是画矩形块和覆盖矩形块。为了便于理解,定义两个结构体:食物与蛇目的本程序实现主要技巧在于java语言的应用。目的在于提高编程的水平。采用eclipse开发工具,在windowsxp下进行,基于安卓2.2操作系统。环境搭建:1.JDK安装2.Eclipse安装3.AndroidSDK安装4.ADT安装创立AVD需求分析分析首先应解决操作界面的问题,操作界面应该人性化设计,提示玩家当前游戏状态,何时开始,按什么按键开始游戏,开始游戏之后,在游戏界面中,以坐标的形式对整体界面进行划分,将界面划分为许多个小方格,还应设计蛇的样式,苹果的样式和墙的样式,在蛇吃到苹果后的样式,还有游戏结束或暂停时,界面的显示,游戏结束后,要显示所得的分数。分析设置游戏贪吃蛇初始时由固定个小矩形块组成,并且,游戏中,要随机出现由单个矩形块构成的苹果,并且在设置苹果的时候,还要设置,不能使将要出现的苹果出现在蛇的身体之下,在蛇吃到苹果的时候,要将蛇的身体加长,随着游戏的进行,蛇移动的速度也要加快。此外,要判定游戏成功与失败的条件,当蛇的头和尾相撞或者蛇的头部撞到了墙上,那么游戏失败,此时游戏结束,界面显示所得分数,当累积分数到达一定标准那么游戏成功。另外蛇的移动原理,由外部按键设置监听控制蛇头的移动方向,在方向的指引下进行移动,蛇及苹果的位置都是由坐标数组确定的,苹果的位置也是随机产生的蛇的移动原理是后一矩形块覆盖前一个矩形块。当一个苹果被吃掉的时候,要自动生成并显示下一个苹果的位置。这些都是在设计过程中需要实现的。游戏控制分析游戏中需要通过按键对蛇的移动方位进行控制,共需要设置四个方位,分别是“东〞“西〞“南〞“北〞,在按键上用“上〞“下〞“左〞“右〞,按键与执行局部便涉及到监听,通过监听指示蛇的运动,此外,要设置蛇移动是的默认方向为“上〞游戏开始时也是由“上〞键启动,暂停后根据玩家的操作自动控制蛇的移动方向,设计过程中还应注意,蛇的移动只能是90度偏转,不能进行180度偏转。此外还要设置游戏的四种状态,准备,运行,暂停,结束,蛇体变长的时候要用累加器进行加分。游戏暂停时,要对当前游戏的参数和状态进行保存。可行性分析贪吃蛇游戏是一种简单的群众的游戏,自从计算机实现以来,深受广阔电脑玩家的喜爱,做一个简单的贪吃蛇小游戏。

贪吃蛇的核心算法时如何实现移动和吃掉食物,没有碰到食物的时候,把当前运动方向上的下个节点入队,并以蛇节点的颜色绘制这个节点,然后把头指针所指的节点出队,并以游戏框架内部背景色重绘出队的节点,这样就可以到达移动的效果。而在吃到食物的时候,那么只需把食物入队即可。实现贪吃蛇的根本的蛇身移动、吃到食物身体增长、和碰到墙壁或自身死亡,能够暂停和开始。

本次设计我将主要运用java语言来完成。Java语言是一种跨平台,适合于分布式计算环境的面向对象编程语言,用Java写的应用程序不用修改就可在不同的软硬件平台上运行。

由于Java主要用于网络应用程序开发,因此对平安性有较高的要求。如果没有平安保证,用户从网络下载程序执行就非常危险。Java通过自己的平安机制防止了病毒程序的产生和下载程序对本地系统的威胁破坏。总体设计系统功能模块层次图工程中包括4个Activity,分别为Snake〔主界面〕、Game〔游戏界面〕、Help〔游戏说明界面〕、AuthorView〔作者信息界面〕,通过不同Activity之间的转换实现不同界面之间的切换。Snake〔Activity〕继承了SnakeView类,SnakeView类继承了TileView类。TileView类继承了View其实Snake的工程蛮简单的,源文件就三个:Snake.javaSnakeView.javaTileView.java。Snake类是这个游戏的入口点,TitleView类进行游戏的绘画,SnakeView类那么是对游戏控制操作的处理。Coordinate,RefreshHandler是2个辅助类,也是SnakeView类中的内部类。其中,Coordinate是一个点的坐标〔x,y〕,RefreshHandler将RefreshHandler对象绑定某个线程并给它发送消息。如下列图:类图任何游戏都需要有个引擎来推动游戏的运行,最简化的游戏引擎就是:在一个线程中While循环,检测用户操作,对用户的操作作出反响,更新游戏的界面,直到用户退出游戏。

在Snake这个游戏中,辅助类RefreshHandler继承自Handler,用来把RefreshHandler与当前线程进行绑定,从而可以直接给线程发送消息并处理消息。注意一点:Handle对消息的处理都是异步。RefreshHandler在Handler的根底上增加sleep()接口,用来每隔一个时间段后给当前线程发送一个消息。handleMessage()方法在接受消息后,根据当前的游戏状态重绘界面,运行机制如下:

活动图

运行机制

这比拟类似定时器的概念,在特定的时刻发送消息,根据消息处理相应的事件。update()与sleep()间接的相互调用就构成了一个循环。这里要注意:mRedrawHandle绑定的是Avtivity所在的线程,也就是程序的主线程;另外由于sleep()是个异步函数,所以update()与sleep()之间的相互调用才没有构成死循环。

最后分析下游戏数据的保存机制,如下:

活动图

这里考虑了Activity的生命周期:如果用户在游戏期间离开游戏界面,游戏暂停;或者由于内存比拟紧张,Android关闭游戏释放内存,那么当用户返回游戏界面的时候恢复到上次离开时的界面。开始开始始初化蛇和苹果屏幕显示蛇和苹果位置蛇开始移动,后坐标覆盖前坐标是否有按键否根据上次方向更新坐标是根据按键不同在原坐标根底上改变蛇的坐标位置更新方向是否吃到苹果是蛇身加1否是否越界或撞到蛇身是游戏结束否第四章详细设计与实现4.1TiltView类TiltView的基类是View,包含了贪吃蛇游戏画面的各个设定参数,主要负责绘制游戏画面。TileView类定义如下:publicclassTileViewextendsView{privatestaticfinalStringtag="yao";protectedstaticintmTileSize=20;//方格的边长protectedstaticintmXTileCount;//X轴上方格的个数protectedstaticintomYTileCount;//Y轴上方格的个数privatestaticintmXOffset;//绘图时X轴上的起始坐标privatestaticintmYOffset;//绘图时Y轴上的起始坐标privateBitmap[]mTileArray;//位图数组privateint[][]mTileGrid;//映射整个游戏画面的数组privatefinalPaintmPaint=newPaint();//画笔publicTileView(Contextcontext,AttributeSetattrs){super(context,attrs); Log.i(tag,"TileViewConstructor"); Log.i(tag,"mTileSize="+mTileSize); }//重置位图数组的长度publicvoidresetTiles(inttilecount){mTileArray=newBitmap[tilecount]; }@Override//适应各种分辨率的屏幕,当改变屏幕大小尺寸时,同时修改tile的相关计数指标protectedvoidonSizeChanged(intw,inth,intoldw,intoldh){ Log.i(tag,"onSizeChanged,"+"w="+w+"h="+h+"oldw="+oldw+"oldh="+oldh);mXTileCount=(int)Math.floor(w/mTileSize);mYTileCount=(int)Math.floor(h/mTileSize); Log.i(tag,"mXTileCount="+mXTileCount); Log.i(tag,"mYTileCount="+mYTileCount);mXOffset=((w-(mTileSize*mXTileCount))/2);mYOffset=((h-(mTileSize*mYTileCount))/2); Log.i(tag,"mXOffset="+mXOffset); Log.i(tag,"mYOffset="+mYOffset);mTileGrid=newint[mXTileCount][mYTileCount]; clearTiles(); }//这里做了一个Drawable到bitmap的转换publicvoidloadTile(intkey,Drawabletile){ Bitmapbitmap=Bitmap.createBitmap(mTileSize,mTileSize,Bitmap.Config.ARGB_8888); Canvascanvas=newCanvas(bitmap); tile.setBounds(0,0,mTileSize,mTileSize);aw(canvas);mTileArray[key]=bitmap; }//清空图形显示publicvoidclearTiles(){ Log.i(tag,"TileView.clearTiles");for(intx=0;x<mXTileCount;x++){for(inty=0;y<mYTileCount;y++){ setTile(0,x,y); } } }//在相应的坐标位置绘制相应的砖块publicvoidsetTile(inttileindex,intx,inty){mTileGrid[x][y]=tileindex; }//onDraw@Override//将直接操作的画布绘制到界面上publicvoidonDraw(Canvascanvas){ Log.i(tag,"onDraw");super.onDraw(canvas); Bitmapbmp;floatleft;floattop;for(intx=0;x<mXTileCount;x++){for(inty=0;y<mYTileCount;y++){if(mTileGrid[x][y]>0){ bmp=mTileArray[mTileGrid[x][y]]; left=x*mTileSize+mXOffset; top=y*mTileSize+mYOffset; canvas.drawBitmap(bmp,left,top,mPaint); } } } }}4.2SnakeView类SnakeView类定义了游戏运行时的画面改变及蛇体和果子的更新方法。首先用Handler机制实现定时刷新,代码如下:classRefreshHandlerextendsHandler{//获取消息并处理@OverridepublicvoidhandleMessage(Messagemsg){ SnakeView.this.update(); SnakeView.this.invalidate();//刷新view为基类的界面 Log.i(tag,"handleMessage|ThreadName="+Thread.currentThread().getName()); }//定时发送消息给UI线程,以此到达更新效果publicvoidsleep(longdelayMillis){this.removeMessages(0);//清空消息队列,Handler进入对新消息的等待 Log.i(tag,"sleep|ThreadName="+Thread.currentThread().getName());//定时发送新消息,激活handler sendMessageDelayed(obtainMessage(0),delayMillis); } };定义SnakeView()函数初始化游戏,代码如下:publicSnakeView(Contextcontext,AttributeSetattrs){super(context,attrs); Log.i(tag,"SnakeViewConstructor"); initSnakeView();//构造函数中,初始化游戏 }定义initSnakeView()初始化SnakeView类,代码如下:privatevoidinitSnakeView(){ Log.e(tag,"initSnakeView");//设置焦点,由于存在文字界面和游戏界面的跳转。这个focus是不可或缺的。 setFocusable(true);//取得资源中的图片,加载到砖块字典中。 Resourcesr=this.getContext().getResources(); resetTiles(4); loadTile(RED_STAR,r.getDrawable(R.drawable.redstar)); loadTile(YELLOW_STAR,r.getDrawable(R.drawable.yellowstar)); loadTile(GREEN_STAR,r.getDrawable(R.drawable.greenstar)); }此外还定义了updateWalls()、updateApples()、updateSnake()绘制墙、果子、蛇,以及更新画面函数、保存位置坐标函数等,具体代码请详见目录。界面设计包括游戏主界面〔Snake〕、游戏说明界面、游戏界面的设计。界面的设计采用的是xml文档形式,在xml文档中规划好界面布局布局后,分别在java文件中声明。主界面设计:主界面包括一个TextView及布局设定<?xmlversion="1.0"encoding="utf-8"?><!--Copyright(C)2007TheAndroidOpenSourceProjectLicensedundertheApacheLicense,Version2.0(the"License");youmaynotusethisfileexceptincompliancewiththeLicense.YoumayobtainacopyoftheLicenseatUnlessrequiredbyapplicablelaworagreedtoinwriting,softwaredistributedundertheLicenseisdistributedonan"ASIS"BASIS,WITHOUTWARRANTIESORCONDITIONSOFANYKIND,eitherexpressorimplied.SeetheLicenseforthespecificlanguagegoverningpermissionsandlimitationsundertheLicense.--><FrameLayoutxmlns:android="://schemas.android/apk/res/android"android:layout_width="match_parent"android:layout_height="match_parent"><android:id="@+id/snake"android:layout_width="match_parent"android:layout_height="match_parent"tileSize="24"/><RelativeLayoutandroid:layout_width="match_parent"android:layout_height="match_parent"><TextViewandroid:id="@+id/text"android:text="@string/snake_layout_text_text"android:visibility="visible"android:layout_width="wrap_content"android:layout_height="wrap_content"android:layout_centerInParent="true"android:gravity="center_horizontal"android:textColor="#ff8888ff"android:textSize="24sp"/></RelativeLayout></FrameLayout>至此,全部界面设计完成,但还有最重要的一步,就是将所有的Activity注册到中。文档如下:<?xmlversion="1.0"encoding="utf-8"?><!--Copyright(C)2007TheAndroidOpenSourceProjectLicensedundertheApacheLicense,Version2.0(the"License");youmaynotusethisfileexceptincompliancewiththeLicense.YoumayobtainacopyoftheLicenseatUnlessrequiredbyapplicablelaworagreedtoinwriting,softwaredistributedundertheLicenseisdistributedonan"ASIS"BASIS,WITHOUTWARRANTIESORCONDITIONSOFANYKIND,eitherexpressorimplied.SeetheLicenseforthespecificlanguagegoverningpermissionsandlimitationsundertheLicense.--><!--DeclarethecontentsofthisAndroidapplication.ThenamespaceattributebringsintheAndroidplatformnamespace,andthepackagesuppliesauniquenamefortheapplication.Whenwritingyourownapplication,thepackagenamemustbechangedfrom"com.example.*"tocomefromadomainthatyouownorhavecontrolover.--><manifestxmlns:android="://schemas.android/apk/res/android"package="com.example.android.snake"><applicationandroid:label="SnakeonaPhone"><activityandroid:name="Snake"android:theme="@android:style/Theme.NoTitleBar"android:screenOrientation="portrait"android:configChanges="keyboardHidden|orientation"><intent-filter><actionandroid:name="ent.action.MAIN"/><categoryandroid:name="ent.category.LAUNCHER"/></intent-filter></activity></application></manifest>工程演示游戏前画面游戏中界面游戏结束时画面第五章测试经过在模拟器上的测试,本软件能书案例实现其功能,到达了小蛇在屏幕上的移动,小蛇吃苹果,苹果随机出现的功能,当小蛇头尾相撞或与墙相撞时,游戏结束.这些均在测试中得到验证。在测试过程中,也着重对游戏的控制功能进行了测试,游戏是通过方向键的控制来实现的,在游戏刚开始的阶段,上下左右四个方位的控制都很成功,但随着蛇移动的速度越来越快,按键的控制反响会出现滞后,通过

温馨提示

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

评论

0/150

提交评论