




已阅读5页,还剩25页未读, 继续免费阅读
版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领
文档简介
全套设计加扣 30122505821. 绪论手机作为近年来发展最为迅猛的产品之一,尤其是智能机的出现更是给我们的生活、学习和工作带来了巨大的改变和影响。特别是手机游戏的出现,它以方便、快捷、易上手等特点迅速走红,广受广大用户的喜爱。本章主要针对论文的背景和研究做出介绍。1.1 背景随着近年来手机3G的普及和最近4G的发展,手机的功能越发强大,手机应用的种类也越来越多,其中手机游戏类应用更是层出不穷。再加上不论是从便携性和随身性上来说,电脑都无法以手机相比,可以这么说,在一定程度上手机已经完全可以代替电脑在我们生活中的位置了。如今,随着用户的不断增多,刺激着市场上源源不断的提供更多的手机应用,那么怎么样的一款应用才是好的呢?就拿手机游戏来说,首先要够流畅,现在的Android手机已经可以满足多数用户的需求了。其次还有趣味性和易用性。于是各种各样充满创新的游戏一一走向了舞台。1.2 手机游戏市场的现状由于智能手机功能的不断强大,各种手机游戏开发公司都是牟足了劲的开发出各种各样的手机游戏,其中手游类游戏算是一个十分成功的尝试,更加有创意的是现在市场上大大小小的手游基本都采用了一种很好的宣传方式,那就是什么火,我们就做什么游戏,不管是电视剧,电影还是小说,只要你够火,游戏就能做,这也是手机游戏开发的一个优势,那就是开发容易,投资小,周期短。但是,这样的游戏往往都是一阵阵,而且并不适用于大多数的上班族,本就疲累的他们可能根本就没有那样的心情去关注这些,手机游戏就更不用谈了。再加上手游一般都是很耗费时间的游戏,那就更加不适合他们了。而手机小游戏就没有这样的问题,2048小游戏就是这样一款风靡全球的小游戏,只要你搜索手机游戏,几乎都可以在游戏下载排行榜上看到他的身影。1.3 研究它的意义随着手机游戏的不断发展,到底怎样的一款游戏才能受到广大用户的好评呢?就拿我本次的课题来说,2048只是一个小游戏,功能十分的简单,那么为什么他能取得这样的成功呢?从收集来的信息来看2048有一下有点:(1) 操作简单。(2) 他是一个益智类游戏(3) 缓解压力如此简单而又没那么简单。由此看来,做游戏不能盲目,借鉴成功的例子往往能让我们做事事半功倍。1.4 论文的总体结构论文共分5节内容及章节安排如下 1.介绍Android手机软件的研究背景和意义,本文研究的主要内容和的组织结构。 2.介绍Android Studio开发环境和技术介绍,包括Android Studio开发工具的使用,Android5.0新特性,JDK介绍,四大组件介绍现Android平台的优缺点。 3.介绍软件的系统分析及可行性分析。 4.介绍软件的具体设计和实现。 5.介绍软件的测试过程。2. 开发环境及主要技术的介绍2.1 Android Studio开发工具介绍 Android Studio是Google推出的,专门为Android“量身订做”的一款开发工具,是Google大力支持的一款基于Intellij idea改造的IDE。相对于eclipse而言,它的速度更快,UI更漂亮,提示补全更加智能。同时,Android Studio支持各种插件,想要什么工具,可以直接搜索下载。所以使用Android Stuido可以大大的提高开发效率。2.1.1 Gradle的介绍 Android Studio构建系统由Gradle构成。通过Gradle管理依赖性,允许定义自定义构建逻辑。Gradle的配置包含构建变量,依赖关系,清单条目,签名,ProGuard,测试。构建系统可以根据不同的配置为同一个项目生成多个APK,并从本地文件系统和远程存储库支持的依赖。同时,可以在生成过程中签署您的APK并运行测试。2.1.2 项目和模块介绍 一个项目代表一个完整的Android应用程序。Android Studio项目包含一个或多个module 。一个module 是您的应用程序的独立组件,你可以进行构建,测试或调试的操作。module 包含您的应用程序的源代码和资源。Android的Studio项目包含三种模块。Java库模块:包含可重用的代码。构建系统生成一个JAR包的Java库模块,Android库模块,构建系统产生AAR(安卓归档)包库模块,Android应用程序模块。构建系统生成APK包,为应用模块。 2.2 JDK开发环境介绍 JDK(Java Development Kit,Java开发包,Java开发工具)是一个写Java的applet和应用程序的程序开发环境。它由一个处于操作系统层之上的运行环境还有开发者编译,调试和运行用Java语言写的applet和应用程序所需的工具组成。 JDK中还包括完整的JRE(Java Runtime Environment,Java运行环境),也被称为private runtime。包括了用于产品环境的各种库类,以及给开发员使用的补充库,如国际化的库、IDL库。JDK是由一个标准类库和一组建立,测试及建立文档的Java实用程序组成。其核心Java API是一些预定义的类库。Java API包括一些重要的语言结构以及基本图形,网络和文件I/O。 作为JDK实用程序,工具库中有七种主要程序。Javac:Java编译器,将Java源代码转换成字节码;Java:Java解释器,直接从类文件执行Java应用程序字节代码;appletviewer:小程序浏览器,一种执行HTML文件上的Java小程序的Java浏览器;Javadoc:根据Java源码及说明语句生成HTML文档;Jdb:Java调试器,可以逐行执行程序,设置断点和检查变量;Javah:产生可以调用Java过程的C过程,或建立能被Java程序调用的C过程的头文件;Javap:Java反汇编器,显示编译类文件中的可访问功能和数据,同时显示字节代码含义。2.3 Android5.0新特性介绍2.3.1 全新的Material Design 设计风格 Android Lollipop全新的设计语言是一种大胆的平面化创新。谷歌希望能够让Material Design给用户带来纸张化的体验。另外,Material Design还提出实体隐喻理念,利用实体的表面与边缘的质感打造出视觉线索,从而让用户感受到真实。熟悉的触感让用户可以快速的理解、认知。并且在设计中可以灵活的运用物质,在一定基础上,设计出不同的使用体验。最后是有意义而且更合理的动态效果,这是为了吸引用户的注意力,维持整个系统的连续性体验。2.3.2 支持多种设备 如今,谷歌的Android系统已经在智能手机、平板电脑、笔记本电脑、智能电视、汽车等各种设备的屏幕上出现。将Android设备运用到各种电子设备中。之前微软也宣布将会把Windows 10打造成跨设备跨平台的统一系统,从而帮助自己走出困境。2.3.3 支持64位ART虚拟机Android Lollipop还在内部的性能上有了很大的改进。首先,新系统放弃了Dalvik虚拟机,将其改为了ART模式,实现了真正的跨平台编译。ART虚拟机编译器在内存占用方面以及应用程序加载时间上进行了大幅改进,所有性能都会比原来提升了许多。另外,开发者也可以针对像ARM Cortex-A57这样的64位架构核心开发应用程序。3. 需求分析3.1功能需求分析(1) 游戏界面作为一款休闲类的小游戏,首要的一点便是界面简单清楚。首先,界面的最上方显示游戏的名字,其次是下面一行显示分数和最高分。然后,下方是一个占据整个窗体的按钮,功能是重新开始。在之下是游戏的操作界面,只是一个4*4格的2048游戏。最后一行显示作者名字(2) 功能需求操作游戏规则,当我们手指在界面进行滑动时,卡片随着我们的滑动而左右移动,并且相同的结合并且卡片上的数字相加,每一次卡片上的分数变化都要伴随着颜色的变化。(3) 游戏结束判断当界面上已经没有空位且相邻之间没有可以相结合的卡片时,游戏弹出游戏结束的对话框,并且提示是否重新开始。并且在此时所得分数与最高分进行比较,如果大于,那么将分数自动设置成当前分数。4. 设计与实现4.1 概要设计4.1.1 界面设计这个游戏只有一个界面,且界面是4*4空格的界面。游戏开始后直接进入游戏界面游戏界面如下图所示,这只是草拟界面,具体界面根据事先需要进行修改;图4-1 游戏界面初稿4.1.2 卡片设计在游戏的4*4空格中,每个空格都可以存放一张卡片,因为手机屏幕大小的不同因此卡片的大小也不能定死,因此卡片的设计师可以随着手机屏幕的大小而自适应。另外卡片上要设置数字属性,并且数字可以根据实际情况进行变化。除此之外卡片的颜色要在每次数字变化之后随之变化。4.1.3 算法设计2048小游戏的核心便是它的算法,当我们用手指滑动屏幕时,卡片会随之移动,当有数字相同的卡片相遇时,他们会合并生成一个数字是之前两倍的卡片并且变化颜色。但当合并后的卡片上的数字又与一个同一行的卡片相同时不会再进行合并。当16个空格全部被卡片填满并且相邻卡片没有数字相同时游戏结束。4.2 详细设计4.2.1 界面详细设计当点击游戏图标后进入游戏界面,游戏界面的布局放在layout文件夹的xml文件中,具体布局如下:首先是游戏界面如图4-2所示:图4-2 游戏主界面终稿运用线性布局为最外层布局:其次为又一个线性布局里面的内容为得分情况和最高分情况: 这是重新开始游戏的按钮: 这是帧布局,里面是4*4空格的具体布局: 自定义的4*4布局类: 4.3 卡片的详细设计4.3.1 卡片的属性设计卡片有一项属性,那就是数字,并且数字是随着游戏情况而不断变化的。创建一个空子布局LayoutParams lp = null;background = new View(getContext();填满父窗体并且距离左面和上面的子布局的距离是10像素。然后将子布局添加到4*4布局中。lp = new LayoutParams(-1, -1);lp.setMargins(10, 10, 0, 0);background.setBackgroundColor(0x33ffffff);addView(background, lp);label = new TextView(getContext();label.setTextSize(28);label.setGravity(Gravity.CENTER);lp = new LayoutParams(-1, -1);lp.setMargins(10, 10, 0, 0);addView(label, lp);设置卡片数值初始为零;setNum(0);private int num = 0;获取和设置卡片数值的方法:public int getNum() return num;public void setNum(int num) this.num = num;if (num=0) label.setText();elselabel.setText(num+);当卡片的数值发生变化的时候,它的颜色也随之发生变化,下面是卡片颜色发生变化的具体设计。switch (num) case 0:label.setBackgroundColor(0x00000000);break;case 2:label.setBackgroundColor(0xffeee4da);break;case 4:label.setBackgroundColor(0xffede0c8);break;case 8:label.setBackgroundColor(0xfff2b179);break;case 16:label.setBackgroundColor(0xfff59563);break;case 32:label.setBackgroundColor(0xfff67c5f);break;case 64:label.setBackgroundColor(0xfff65e3b);break;case 128:label.setBackgroundColor(0xffedcf72);break;case 256:label.setBackgroundColor(0xffedcc61);break;case 512:label.setBackgroundColor(0xffedc850);break;case 1024:label.setBackgroundColor(0xffedc53f);break;case 2048:label.setBackgroundColor(0xffedc22e);break;default:label.setBackgroundColor(0xff3c3a32);break;当卡片颜色相同时,执行的方法。public boolean equals(Card o) return getNum()=o.getNum();protected Card clone()Card c= new Card(getContext();c.setNum(getNum();return c;Textview子布局。public TextView getLabel() return label;private TextView label;private View background;4.4 卡片的动画效果的详细设计4.4.1卡片移动时的动画效果 当我们的手指在屏幕上进行滑动时,我设计了它的具体实现效果。首先是对动画效果后的显示,我使用了动画监听的方法,其中有个方法是public void onAnimationEnd(Animation animation),当使用这个方法后,卡片就不会再动画效果之前进行显示了,我把卡片最终显示的操作放在他的里面,这样给用户的游戏体验才不会生硬。public void createMoveAnim(final Card from,final Card to,int fromX,int toX,int fromY,int toY)final Card c = getCard(from.getNum();LayoutParams lp = new LayoutParams(Config.CARD_WIDTH, Config.CARD_WIDTH);lp.leftMargin = fromX*Config.CARD_WIDTH;lp.topMargin = fromY*Config.CARD_WIDTH;c.setLayoutParams(lp);if (to.getNum()0) c = cards.remove(0);elsec = new Card(getContext();addView(c);c.setVisibility(View.VISIBLE);c.setNum(num);return c;private void recycleCard(Card c)c.setVisibility(View.INVISIBLE);c.setAnimation(null);cards.add(c);4.5 游戏核心算法的详细设计 4.5.1 触摸点击事件既然游戏是靠我们的手指进行操作的,那么游戏怎么响应我们的操作呢?这时就需要我们重写一个方法来实现了。setOnTouchListener(new View.OnTouchListener() ;只是触摸监听。当我们的手指对屏幕进行滑动时,便会触发这一事件。这一事件中有三个要重写的方法。分别是手指按下,滑动和离开时间。在手指按下事件中,我们要记录下手指按下的位置坐标,而当我们的手指离开时,我们要记录下手指离开的坐标,这样我们就可以得到手指滑动的方向和距离。进而判断卡片的移动方向。具体代码如下:setOnTouchListener(new View.OnTouchListener() private float startX,startY,offsetX,offsetY;Overridepublic boolean onTouch(View v, MotionEvent event) switch (event.getAction() 这是重写的手指按下的方法:case MotionEvent.ACTION_DOWN:startX = event.getX();startY = event.getY();break;这是重写的手指离开的方法:case MotionEvent.ACTION_UP:offsetX = event.getX()-startX;offsetY = event.getY()-startY;这是对手指滑动距离的判断。当手指滑动的水平距离小于-5时,向左进行滑动。而当手指滑动地水平距离大于5时,便向右移动。当手指滑动的垂直距离大于5时,向下移动,而当手指滑动的垂直距离小于-5时便向上滑动。if (Math.abs(offsetX)Math.abs(offsetY) if (offsetX5) swipeRight();elseif (offsetY5) swipeDown();break;return true;);4.5.2游戏界面格式的详细设计 本游戏没有一开始便定死为4*4的游戏格式,当也可以通过修改设置给成为5*5或是6*6的游戏界面。具体代码如下:这是对游戏界面进行修改的逻辑代码。protected void onSizeChanged(int w, int h, int oldw, int oldh) super.onSizeChanged(w, h, oldw, oldh);Config.CARD_WIDTH = (Math.min(w, h)-10)/Config.LINES;addCards(Config.CARD_WIDTH,Config.CARD_WIDTH);startGame();这是配置文件。public class Config public static final int LINES = 4;public static int CARD_WIDTH = 0;4.5.3游戏界面初始化的详细设计此节分为三个部分的初始化,分别是添加卡片,添加卡片数字,开始游戏。这三部分就组成了游戏的初始界面,当我们点击游戏图标后我们看到的是游戏已经开始后的界面,那他是怎么开始的呢?卡片是怎么添加进来的呢?添加到数字是怎么设定的呢?它的位置又是怎么决定的呢?下面来具体介绍一下:4.5.3.1添加卡片的具体设计游戏开始前我们就必须要将两个随机生成的两个带有数字的卡片展现在游戏界面,那么,这样的两张卡片是怎么生成的呢?我采用了双重for循环的结构首先将4*4的表格一一进行添加,初始数字为零。具体代码如下:private void addCards(int cardWidth,int cardHeight)Card c;LinearLayout line;LinearLayout.LayoutParams lineLp;for (int y = 0; y Config.LINES; y+) line = new LinearLayout(getContext();lineLp = new LinearLayout.LayoutParams(-1, cardHeight);addView(line, lineLp);for (int x = 0; x Config.LINES; x+) c = new Card(getContext();line.addView(c, cardWidth, cardHeight);cardsMapxy = c;4.5.3.2添加数字的详细设计随机数字的添加首先要判断界面空格是否为空,判断条件是空格中添加的卡片上的数字是否小于等于零,是那么这个空格便是可以生成随机数的空格。这是将原来的卡片删除,添加新生成的卡片。其次是随机数的数值,一般只生成2和4并且生成的比例是9:1。具体代码如下:private void addRandomNum()emptyPoints.clear();遍历空格并判断空格中卡片的数值书否小于等于零,如果是便删除,并添加新的卡片。for (int y = 0; y Config.LINES; y+) for (int x = 0; x Config.LINES; x+) if (cardsMapxy.getNum()0) 产生新的卡片,并设置卡片的数值是2或4,比例是9:1.Point p = emptyPoints.remove(int)(Math.random()*emptyPoints.size();cardsMapp.xp.y.setNum(Math.random()0.1?2:4);MainActivity.getMainActivity().getAnimLayer().createScaleTo1(cardsMapp.xp.y);4.5.3.3开始游戏的详细设计游戏开始后,随机生成两个带有数字2或4的卡片,并且初始化得分情况。具体代码如下:public void startGame()MainActivity aty = MainActivity.getMainActivity();aty.clearScore();aty.showBestScore(aty.getBestScore();for (int y = 0; y Config.LINES; y+) for (int x = 0; x Config.LINES; x+) cardsMapxy.setNum(0);由于是添加两个随机数,所以要执行两次。addRandomNum();addRandomNum();4.5.4卡片移动的核心算法卡片的移动算法就比较复杂了,因为这里不仅要考虑到卡片移动的算法还要考虑到卡片的添加时机和游戏是否结束的判断。首先,卡片移动的算法设计,当系统监听到我们手指滑动的事件时,就会根据判断执行动画效果,那么卡片移动的算法是什么呢?首先,系统要判断移动卡片的移动方向是否为空,如果是那么卡片移动到可以移动的最左(右,上,下)边。其次在移动结束后如果相邻的两个卡片上的数字一样那么两个卡片结合,并且数字设置为他们的和。如果结合后仍有相邻两个卡片的数值一样,此时不结合。其次是卡片添加的时机,当卡片移动后,卡片进行以缩放式动画形式添加。最后是游戏是否结束的判断,判断条件是空格是否被大于零的数字卡片填满,并且相邻的卡片没有数字相同的。代码如下:private void checkComplete()设置状态变量complete,默认为true;boolean complete = true;ALL:for (int y = 0; y Config.LINES; y+) for (int x = 0; x 0&cardsMapxy.equals(cardsMapx-1y)|(x0&cardsMapxy.equals(cardsMapxy-1)|(yConfig.LINES-1&cardsMapxy.equals(cardsMapxy+1) complete = false;break ALL;如果complete为true,弹出游戏结束对话框,下方设置重新开始按钮,点击即可重新开始。if (complete) new AlertDialog.Builder(getContext().setTitle(结束).setMessage(游戏结束).setPositiveButton(重新开始, new DialogInterface.OnClickListener() Overridepublic void onClick(DialogInterface dialog, int which) startGame();).show();卡片向左移动的方法private void swipeLeft()设置状态变量merge,默认为false;boolean merge = false;for (int y = 0; y Config.LINES; y+) for (int x = 0; x Config.LINES; x+) for (int x1 = x+1; x1 0) 此行位置为(x,y)的卡片上的数字小于等于零if (cardsMapxy.getNum()=0) 卡片进行移动MainActivity.getMainActivity().getAnimLayer().createMoveAnim(cardsMapx1y,cardsMapxy, x1, x, y, y);cardsMapxy.setNum(cardsMapx1y.getNum();cardsMapx1y.setNum(0);并且x向前移动一位。x-;设置状态变量merge为true;merge = true;如果这两个位置的卡片数值是相同的,那么将这两个卡片相结合。结合的方法就是删除一个另一个卡片的数字乘以2.else if (cardsMapxy.equals(cardsMapx1y) MainActivity.getMainActivity().getAnimLayer().createMoveAnim(cardsMapx1y, cardsMapxy,x1, x, y, y);cardsMapxy.setNum(cardsMapxy.getNum()*2);cardsMapx1y.setNum(0);此时调用得分的方法,将新得到的与数字相同的分数加到屏幕上方的得分处。MainActivity.getMainActivity().addScore(cardsMapxy.getNum();merge = true;break;如果状态变量merge为true,那么添加随机数,并且判断游戏是否结束。if (merge) addRandomNum();checkComplete(); 这是卡片向右移动的方法。private void swipeRight()boolean merge = false;for (int y = 0; y =0; x-) for (int x1 = x-1; x1 =0; x1-) if (cardsMapx1y.getNum()0) if (cardsMapxy.getNum()=0) MainActivity.getMainActivity().getAnimLayer().createMoveAnim(cardsMapx1y, cardsMapxy,x1, x, y, y);cardsMapxy.setNum(cardsMapx1y.getNum();cardsMapx1y.setNum(0);x+;merge = true;else if (cardsMapxy.equals(cardsMapx1y) MainActivity.getMainActivity().getAnimLayer().createMoveAnim(cardsMapx1y, cardsMapxy,x1, x, y, y);cardsMapxy.setNum(cardsMapxy.getNum()*2);cardsMapx1y.setNum(0);MainActivity.getMainActivity().addScore(cardsMapxy.getNum();merge = true;break;if (merge) addRandomNum();checkComplete();这是卡片向上移动的方法。private void swipeUp()boolean merge = false;for (int x = 0; x Config.LINES; x+) for (int y = 0; y Config.LINES; y+) for (int y1 = y+1; y1 0) if (cardsMapxy.getNum()=0) MainActivity.getMainActivity().getAnimLayer().createMoveAnim(cardsMapxy1,cardsMapxy, x, x, y1, y);cardsMapxy.setNum(cardsMapxy1.getNum();cardsMapxy1.setNum(0);
温馨提示
- 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
- 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
- 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
- 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
- 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
- 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
- 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。
最新文档
- 豚的拼音课件app
- 2025年北京市民间个人租赁无人机培训借款合同样本
- 2025年度智能家电研发生产三人股份合作合同
- 2025年度高品质不锈钢板材进出口贸易合同书
- 2025保姆家庭营养膳食及健康管理服务合同
- 2025版全株青贮玉米种植与收购农村电商合作合同范本
- 2025年生物质燃料供应与购买框架合同范本
- 2025年度轻钢结构建筑安全检测与维护合同
- 2025年智能家居采购与安装一体化服务合同范本
- 语言文字知识培训总结课件
- 消防监控考试题初级及答案
- 2025年湖南湘西自治州州直事业单位招聘考试笔试试卷附答案
- 《小学开学第一课》课件
- 2025-2031年中国有源相控阵雷达行业市场发展形势及投资潜力研判报告
- 大货车货运安全知识培训课件
- 消防车辆事故课件
- 2026届四川省宜宾市普通高中高一化学第一学期期末统考试题含解析
- 《路由与交换技术》课程教学大纲
- 北师大版八年级数学上册教案(全册完整版)教学设计含教学反思
- 国家自然科学基金联合申报协议书
- 新教科版五年级科学上册全册课件(精品PPT)
评论
0/150
提交评论