当前位置首页 > 人力资源/企业管理 > 创业及商业计划
搜柄,搜必应! 快速导航 | 使用教程  [会员中心]

基于android的2048游戏开发-毕业设计文库

文档格式:DOC| 38 页|大小 2.37MB|积分 18|2022-10-09 发布|文档ID:159823491
第1页
下载文档到电脑,查找使用更方便 还剩页未读,继续阅读>>
1 / 38
此文档下载收益归作者所有 下载文档
  • 版权提示
  • 文本预览
  • 常见问题
  • 毕业设计(论文)基于Android平台2048游戏开发教学单位:计算机学院专业名称:软件工程〔游戏与数字媒体〕学 号:学生姓名:高振东指导教师:宋喜佳〔讲师〕指导单位:计算机学院完成时间:2021年4月30日电子科技大学中山学院教务处制发基于Android平台2048游戏开发 【摘要】在生活节奏不断加快的现代社会,轻松的益智游戏对缓解生活压力调节情绪具有重要的意义2048?这款小游戏是一款流行的数字游戏第一款?2048?小游戏是由Gabriele Cirulli首度发布在GitHub上2048?是当时基于?1024?和?小三传奇?这两款的玩法而开发的新型数字游戏,而游戏设计初衷是一款益智类的游戏,其特点在于轻松,简单,因此,开发要求做到各项功能要完备、操作要简便、易学易用现在开发出来的版本有普通版、六边形版、朝代版、3D版、后宫版等等本文采用 JAVA语言开发了 2048 小游戏,通过Android平台实现了 2048 的根本运行,本着简单,易于操作的原那么和缓解生活压力、降低生活节奏的初衷,游戏中没有繁多的按钮,也不用特别复杂的操作,只需动动手指,即可操纵自如游戏经过图形界面的处理,以不同的颜色显示不同的数字,并拥有了最高成绩记录,撤销上一步,重置游戏的各项功能。

    对于游戏的逻辑实现局部进行测试,测试结果正常,目前没有发现异常但是游戏界面可能有些简单,日后可以通过美化界面来获得更好的游戏体验关键词】游戏;益智;数字Based on the Android platform 2048 game【Abstract】In the accelerated pace of life in the modern society, easy puzzle game to ease the pressure of life.Force, adjust the mood has important meaning "2048" this small game is a popular digital game. The first "2048" small game was released by Cirulli GitHub on Gabriele for the first time. "2048" was based on "1024" and "small three" Legend of the two gameplay and the development of a new type of digital games and game design original intention is a puzzle game, its characteristics is easy and simple, therefore, development.Seeking to achieve the function to complete, easy to operate, Yi Xueyi use. Now developed a version of the ordinary version, hexagonal version, Dynasty version, 3D version, the palace version, etc.The Java language to develop the 2048 small game, 2048, the basic operation is realized through the Android platform, the purpose of simple and easy operation principle and alleviate the pressure of life, reduce the original intention of the rhythm of life, the game without different button, also need not particularly complex operations, only need to move a finger, you can maneuverability.Game through the processing of the graphical interface to display different colors with different numbers, and have the highest score records, undo the last step, reset the function of the game. The logic of the game to achieve part of the test, the test results are normal, there is no abnormal. But the game interface may be a little simple, in the future can be used to beautify the interface to get a better gaming experience.【Key Words】game;puzzle;numbel目录第1章 绪论 11.1 游戏开发背景 11.2 国内外研究现状 11.3 游戏开发意义 21.4 论文结构 2第2章 相关技术和理论根底 32.1 Java语言 32.2 Android操作系统 42.2.1 简介 42.2.2 系统架构 52.2.3 Android版本 62.3 开发平台介绍 6.1 Eclipse 62.3.2 ADT 72.3.2 JDK 7第3章 可行性分析 83.1 可行性研究目的 83.1.1 技术可行性 83.1.2 经济可行性 83.1.3 操作可行性 8第4章 游戏设计 94.1 游戏规那么 94.2 总体设计 94.3 详细设计 11第5章 游戏测试 17测试过程 17测试内容 17测试结果 21第6章 心得体会 22参考文献 23附录 游戏实现代码 24致谢 32图目录图2.1 Java Logo 3图2.2 Android Logo 4图2.3 Android系统架构 5图4.2.1 系统功能 9图4.2.2 计分显示 10图4.2.3 游戏内容 10图4.2.4 游戏菜单 10图4.2.5 游戏流程 11图4.3.1 游戏主界面 12图4.3.2 数字合并前 13图4.3.3 数字合并后 14图4.3.4 游戏计分 15图4.3.5 游戏计分 15图4.3.6 游戏结束 16图5.2.1 游戏开始 18图5.2.2 向上滑动 18图5.2.3 向左滑动 19图5.2.4 向下滑动 19图5.2.5 向右滑动 20图5.2.6 撤销功能 20图5.2.7 重置功能 21第1章 绪论 游戏开发背景Android 智能 功能非常强大,具有很高的性价比,非常深受人们的喜爱,可能正式因为如此,在2021年中,Android 智能 在全世界占据着81.5%很夸张的市场份额,一举成为使用的人数最多,市场份额占据最大的Android 智能 系统。

    而Android 智能 游戏的出现正是为了娱乐心神,并且随着智能移动终端和全球移动通信网络的不断进步,Android 智能 游戏也正在经历从简单到复杂的进化过程从全球来看,智能移动终端的娱乐效劳一直被认为是带动移动数据业务加速并快速开展的重要力量也是作为 娱乐效劳的重要内容之一近年来,一直伴随着全球移动网络和移动终端性能不断的提高和完善由于近几年来,Android智能 游戏的快速开展,游戏的分类也变得越来越丰富,目前 游戏按内容可分为:角色扮演类〔RPG〕、冒险类〔AVG〕、搏斗类〔FTG〕、棋牌类、电影改版类、益智类、体育竞技类、模拟类 游戏种类目前已成为人类线上娱乐生活的不可或缺的最主流的载体而存在,现代人对于移动终端的休闲娱乐功能所需求越来越强大,移动终端上的游戏或已以成为了现代人们娱乐生活中不可或缺的一局部了1.2 国内外研究现状基于Android的游戏开发,国内国外的水平差距很大在市场上成名的 游戏根本上都是国外游戏公司开发的,而且很容易识别因为学习的关系,本人接触了很多Android开发者的游戏,发现国内开发者开发的Android 游戏,不仅界面粗糙,而且设计简单,同质化严重,相同的创意往往被反复抄袭很屡次。

    而国外开发者开发的游戏不同,大型游戏内容丰富,情节完整;小型游戏而从用户体验和创意上远胜国内的开发者1.3 游戏开发意义此次毕业设计的初衷就是想设计出一个能够在任何环境任何时间都能够放松心情和娱乐心身的单机游戏,只要通过简单和易操作的Android游戏帮助 用户来打发他们闲暇的时间,并娱乐心身和放松心情如果你也是一个数字叠加的爱好者,或者是比拟有天赋的数学天才,不过就算不是数学的天才,一般的玩家也能够玩转这款游戏,都会有很大的成功时机当你体会过这款游戏,你就会被这游戏深深的吸引,根本停不下来1.4 论文结构本论文主要从下面几章阐述对于Android 2048游戏的研究与应用:第 1 章:绪论,介绍了课题的研究背景、国内外研究现状,课题研究目的和意义、以及本文的结构第 2 章:相关开发技术与理论根底,介绍了课题采用的Android操作系统等相关技术第 3 章:可行性分析,对Android 2048游戏进行可行性分析总体介绍了程序的设计架构及所要实现的功能分析,并阐述了开发平台和环境的选择第 4 章:系统详细设计与实现,介绍了程序各个模块的功能分析以及设计思路并其相关实现代码 第 5 章:系统应用实例和结果分析,介绍了应用平台,测试用例以及结果分析。

    第 6 章:心得体会,总结本文工作成果,并对研究工作做反思和总结第2章 相关技术和理论根底2.1 Java语言Java语言的前身是Sun Microsystems公司开发的一种用于智能化家电的名为Oak〔橡树〕的语言,它的根底是当时最流行的C和C++语言〔Sun公司于2021年4月被Oracle公司收购〕但是,由于一些非技术上的原因,Oak语言并没有得到迅速的推广知道1993年,WWW〔万维网〕迅速开展,Sun公司发现可以利用Oak语言的技术来创造含有动态内容的WWW网页,于是已受人冷落了的Oak语言又被重新的开发和改造于是便将改造后的Oak语言改名为Java语言,Java是太平洋上的一个盛产咖啡的岛屿的名字终于,在1995年,Java这个被定位于网络应用的程序设计语言被正式推出图2.1 Java LogoJava编程语言的风格十分接近C++语言集成了C++语言面向对象技术的核心,Java舍弃了C++语言中容易引起错误的指针,改以引用取代,同时移除原C++与原来运算符重载,也移除了多重继承特性,改用接口取代,增加垃圾回收器功能在Java SE 1.5版本中引入了泛型编程、类型平安的枚举、不定长参数和自动装/拆箱特性。

    Sun公司对Java语言的解释是:“Java编程语言是个简单、面向对象、分布、解释性、健壮、平安与系统无关、可移植、高性能、多线程和动态的语言Java语言问世的时间虽然不长,但却已被业界所接受,IBM、Apple、DEC、Adobe、HP等大公司都已经购置了Java语言的许可证2001年,当时的移动 吧主NOKIA宣布,到2003年将出售1亿部支持Java的 2.2 Android操作系统2.2.1 简介Android,中文俗称安卓,是一个以Linux为根底的开放源代码移动设备操作系统,主要用于智能 和平板电脑,由Google成立的Open Handset Alliance〔OHA,开放手持设备联盟〕持续领导与开发中Android已发布的最新版本为Android 5.1(Lollipop)图2.2 Android LogoAndroid系统最初由安迪·鲁宾〔Andy Rubin〕等人开发制作,最初开发这个系统的目的是创立一个数码相机的先进操作系统;但是后来发现市场需求不够大,加上智能 市场快速成长,于是Android被改造为一款面向智能 的操作系统于2005年8月被美国科技企业Google收购。

    2007年11月,Google与84家硬件制造商、软件开发商及电信营运商成立开放手持设备联盟来共同研发改进Android系统,随后,Google以Apache免费开放源代码许可证的授权方式,发布了Android的源代码,让生产商推出搭载Android的智能 ,Android操作系统后来更逐渐拓展到平板电脑及其他领域上2021年末数据显示,仅正式推出两年的Android操作系统在市场占有率上已经超越称霸逾十年的诺基亚Symbian系统,成为全球第一大智能 操作系统在2021年Google I/O开发者大会上Google宣布过去30天里有10亿台Android设备被激活,相较于2021年6月那么是5.38亿2.2.2 系统架构Android是基于Linux内核的软件平台和操作系统,采用了软件堆栈〔Software Stack〕的架构,共分为四层图2.3 Android系统架构〔1〕应用程序层该层提供一些核心应用程序包,例如电子邮件、短信、日历、地图、浏览器和联系人管理等同时,开发者可以利用Java语言设计和编写属于自己的应用程序,而这些程序与那些核心应用程序彼此平等、友好共处〔2〕应用程序框架层该层是Android应用开发的根底,开发人员大局部情况是在和她打交道。

    应用程序框架层包括活动管理器、窗口管理器、内容提供者、视图系统、包管理器、 管理器、资源管理器、位置管理器、通知管理器和XMPP效劳十个局部在Android平台上,开发人员可以完全访问核心应用程序所使用的API框架并且,任何一个应用程序都可以发布自身的功能模块,而其他应用程序那么可以使用这些已发布的功能模块基于这样的重用机制,用户就可以方便地替换平台本身的各种应用程序组件〔3〕系统库和Android运行时系统库包括九个子系统,分别是图层管理、媒体库、SQLite、OpenGLEState、FreeType、WebKit、SGL、SSL和libcAndroid运行时包括核心库和Dalvik虚拟机,前者既兼容了大多数Java语言所需要调用的功能函数,又包括了Android的核心库,比方android.os、、android.media等等后者是一种基于存放器的java虚拟机,Dalvik虚拟机主要是完成对生命周期的管理、堆栈的管理、线程的管理、平安和异常的管理以及垃圾回收等重要功能〔4〕Linux内核Android核心系统效劳依赖于Linux2.6内核,如平安性、内存管理、进程管理、网络协议栈和驱动模型。

    Linux内核也是作为硬件与软件栈的抽象层驱动:显示驱动、摄像头驱动、键盘驱动、WiFi驱动、Audio驱动、flash内存驱动、Binder〔IPC〕驱动、电源管理等2.2.3 Android版本Android操作系统是一个由Google和开放手持设备联盟共同开发开展的移动设备操作系统,其最早的一个版本Android 1.0 beta发布于2007年11月5日,至今已经发布了多个更新这些更新版本都在前一个版本的根底上修复了Bug并且添加了前一个版本所没有的新功能当前用户量最多的是代号为Jelly Bean 果冻豆版本,占Android用户42.6%,因此,本设计采用Android 4.1.2 SDK版本2.3 开发平台介绍2048 Android游戏开发平台为Eclipse4.3.2 + ADT22.6.2 + JDK1.7.0_51,模拟测试平台为Android SDK模拟器,真机测试平台为ZTEU930HD2.3.1 EclipseEclipse是不仅仅是成为专门开发JAVA程序的IDE环境,根据Eclipse的体系结构,通过开发插件,它能扩展到任何语言的开发,甚至能成为图片绘制的工具。

    Eclipse是一个开放源代码的工程,任何人都可以下载 Eclipse 的源代码,并且在此根底上开发自己的功能插件也就是说未来只要有人需要,就会有建立在Eclipse之上的C++,JAVA,Python等语言的开发插件出现同时可以通过开发新的插件扩展现有插件的功能可以无限扩展,而且有着统一的外观,操作和系统资源管理,这也正是 Eclipse的潜力所在在本工程中,Eclipse正是通过第三方插件—ADT实现了开发 Android 应用2.3.2 ADTDT是英文 Android Development Tools 的简称,即Android开发工具包ADT是Eclipse中构建Android应用程序IDE插件,ADT扩展了Eclipse的功能,让开发人员快速建立新的Android工程、创立应用程序的用户界面ADT可以帮助Eclipse找到Android sdk,再加上Android框架的API组件调试使用Android SDK工具,以便APK分发给应用程序 ADT大大减轻Android应用程序的开发工作量,工具集成XML编辑器,将给开发人员一个令人难以置信的开发Android应用环境使用ADT之前,必须确认已经安装了Eclipse以及同Eclipse IDE兼容版本的Android SDK。

    2.3.2 JDKJDK(Java Development Kit) 是 Java 语言的软件开发工具包(SDK)有SE、EE、ME三个版本没有JDK的话,无法编译Java程序,如果想只运行Java程序,要确保已安装相应的JRE第3章 可行性分析3.1 可行性研究目的3.1.1 技术可行性确保现有的技术是否能解决本该开发工程:系统采用JAVA语言开发,Eclipse作为Android开发环境ADT插件提供了一系列图形用户界面组件进行界面编程,所以在技术上可行3.1.2 经济可行性由于“2048〞游戏作为毕业设计进行开发,由本人亲自开发,而且开发android程序不需要购置昂贵的设备,所以本钱不会太高,综上所述经济上是可行的3.1.3 操作可行性确定软件产品是否能够被最终的用户所接受,用户是否能操作最终的产品:该游戏在方便易操作的Android 上运行,方便于玩家操作根据以上几个方面的研究,在技术上、经济上和操作上都是可行的,本工程可进行开发第4章 游戏设计4.1 游戏规那么(1) 开始时棋盘内随机出现两个数字,出现的数字仅可能为2或4;(2) 玩家可以选择上下左右四个方向,假设棋盘内的数字出现位移或合并,视为有效移动;(3) 玩家选择的方向上假设有相同的数字那么合并,每次有效移动可以同时合并,但不可以连续合并;(4) 合并所得的所有新生成数字相加即为该此移动的有效得分;(5) 玩家选择的方向行或列前方有空格那么向空格处位移;(6) 每次有效移动一步,棋盘上的空位(无数字处)随机出现一个数字(依然可能为2或4);(7) 棋盘被数字填满,无法进行有效移动,判负,游戏结束。

    4.2 总体设计游戏框架分析对一个游戏而言,需要将各个部位分割成其对应局部的功能,并且逐步去实现该功能1 系统功能游戏主要分三个显示模块分别是是游戏计分,游戏内容,游戏菜单图4.2.2 计分显示图4.2.3 游戏内容.4 游戏菜单4.2.2 游戏流程分析要想把一个游戏做好,首先要把流程分析好,画出流程图,如图4.2.1所示:.5 游戏流程4.2.3 游戏记分分析当有数字合并时,记录此时合并的的数字,加到相应的分数中同时保存游戏最高分到本地,下次启动应用时显示历史最高分4.2.4 游戏结束分析当屏幕上数字没有得到2048这个值,没有两个相同的格子的数字相同,并且已经没有空格,那么就判定为游戏结束4.3 详细设计 游戏主界面游戏开始界面为一个类似棋盘4乘4的16宫格,在宫格的左上角显示再该局游戏内的得分,而对应的右边那么显示历史最高分如下列图4.3.1所示:图4.3.1 游戏主界面4.3.2 游戏逻辑实现1) 游戏布局本游戏的设计用到了线性布局、相对布局、表格布局等等首先总体布局是一个线性布局,内部包括一个子线性布局和一个表格布局,该子线性布局中包含四个textview,用来显示当前分数,scope,最高分,topscope。

    表格布局用来显示4乘4的方格最后再用一个线性布局显示下方的两个按钮,撤销和重置2) 数据结构[0~15]对应游戏中4*4的16个方格相应的数字对四取余得到该数字的横坐标,除以四得到该数字的纵坐标当方格内无数字时,将其保存到空白格列表spaceList中当方格内有数字时时,将其保存到数字格列表numberList中3) 触控交互本模块主要实现用户使用手指滑动屏幕,来判断其滑动的方向首先定义手指接触屏幕起始位置的横坐标变量startX,纵坐标变量startY,手指离开屏幕的最后位置的横坐标offsetX,纵坐标变量offsetY调用OnTouchListener监听器,重写OnTouch方法将offsetX减去startX得到水平方向的偏移量,同理offsetY减去startY得到垂直方向的偏移量通过判断水平和垂直方向偏移量即可知道用户所要移动的方向特殊情况:1. 由于人的手指在滑动方向会有偏差,一般不会精准的向四个方向滑动,肯定会有偏差,所以要判断手指滑过方向的是水平方向还是垂直方向的意图,当水平方向的偏移量大于垂直方向的偏移量时,说明用户是水平滑动意图,当垂直方向的偏移量大于水平方向的偏移量,说明用户是垂直方向滑动的意图。

    2. 由于人的手指只有滑动一段距离才能说明用户的意图,不可能点一下屏幕或者稍微动一下就表示滑动意图,这显然不太符合现实情况,所以要定义偏移一定的距离才能判断用户的真正意图规定当水平方向的偏移距离大于或者等于水平方向的偏移距离,且当偏移小于5时,用户向上滑动,大于5使,规定向下滑动;当水平方向的偏移距离大于或者等于水平方向的偏移距离,且当偏移小于5时,规定用户向左滑动,如果大于5,用户向右滑动4) 数字合并滑动方向不同时,执行不同的遍历顺序例如用户向上执行一次向左有效滑动时,做一个嵌套循环得到该方向上索引再调用置换方法实现用户所移动的方向上有两个相同的格子时,首先一次移动中,每个格子最多只能升级一次,获取当前格子的view,并将其置成空白格获取目标格的view,并将其背景置成当前格升级后的背景然后在空白格列表中参加当前格子,在数字列中删掉第一个格子,将数字列表对应的内容升级效果如下列图所示:图4.3.2 数字合并前图4.3.3 数字合并后5) 数字列表类数字列表类用于保存数字格,以及数字格对应的数字定义一个List stuffList用于保存所有不为空的格子的坐标〔在GridLayout中的位置从0到15〕。

    再定义一个List numberList用于保存所有不为空的格子对应的数字〔以2为底数的指数〕定义以下方法,用于判断当前位置是否为数字格;将当前的格子从数字列表中去掉;使当前的格子对应的数字升级,指数加1;将当前格子对应的位置置换为新的位置;通过格子对应的位置获取其对应的数字;通过格子对应的横纵坐标来获取其对应的数字;清空数字格及其对应的数字;判断是否还有可以合并的数字格;获取对应序号格子中的位置;获取对应序号格子中的指数6) 添加随机数在空白格中随机参加数字2或者4,首先获取坐标对应的View,通过随机生成数字1或2,(int) Math.round(Math.random()+1);然后将当前格子的图片置换为2或者4,在numList中参加该格子的信息,最后在空白列表中去掉这个格子游戏最开始的时候会添加两个随机数,并且每执行一次有效移动时,在空白格处随机添加一个随机数7) 游戏计分每当有相同的数字合并时,合并所得的所有新生成数字相加即为该此移动的有效得分如下列图所示:图4.3.4 游戏计分图4.3.5 游戏计分游戏最高分显示在右上角,历史最高分会记录在本地读取perference文件,如果没有,那么会创立一个名为TopScore的文件,使用Editor类写入perference文件,用于写入最高分。

    8) 撤销功能撤销操作,获取操作记录栈中最后的记录,并重绘界面至少应有一次有效滑动后才能撤销将当前的界面记录在栈中弹出取栈中第二个对象即为本次操作之前的界面的记录调取方法,重绘界面9) 重置功能清空界面,清空数字,使得分为零,重新初始化4.3.3 游戏结束当游戏界面上的数字被填满,并且没有两个相邻的相同数字时,游戏结束,此时会弹出一个提示框,显示用户本局所获得得分数并鼓励,点击重新开始那么初始化游戏,玩家可以开始下一局点击结束那么直接关闭该游戏如下图:图4.3.6 游戏结束第5章 游戏测试5.1测试过程(1) 拟定测试方案根据游戏的总体情况,仔细分析游戏各个步骤的运行可能出现的状况,对各种情况进行汇总,然后拟定出一份具体测试步骤2) 初步测试根据拟定好的方案进行游戏调试,出现意外情况时(3) 及时记录测试完后对所记录的意外情况进行分析,然后提出改进的方案,再进行修改4) 深度测试对游戏进行最后的修改确认没有漏洞后再进行测试,从各个方面进行一次整体的排查,知道不再出现意料之外的情况5) 测试人员测试初级阶段主要由游戏主要编程员进行测试,以便能够全面的进行一次错误排查然后由不同的玩家进行测试,集众人之益,能够从不同的角度发现问题,以便更好地改。

    5.2测试内容为了更好的测试游戏的可用性现用安卓模拟器进行测试,首先翻开Eclipse软件,通过import将源代码导入工作区,然后点击工具栏的开始按钮翻开模拟器进行运行,当游戏进入游戏主界面时按照以下步骤进行测试开始界面如下图:图5.2.1 游戏开始(1) 向上滑动,如下图:图5.2.2 向上滑动 结果:正常2) 向左滑动,如下图:图5.2.3 向左滑动结果:正常3) 向下滑动,如下图:图5.2.4 向下滑动结果:正常4) 向右滑动,如下图:图5.2.5 向右滑动结果:正常5) 点击“撤销〞à返回上一步,如下图:图5.2.6 撤销功能结果:正常6) 点击“重置〞à初始化界面,如下图:图5.2.7 重置功能结果:正常5.3测试结果程序运行正常,没有发现什么错误第6章 心得体会经过了几个月的研究终于把2048这个游戏完成了,这个游戏的完成使我明白了,看似很简单的事情要真的动手实践起来确实有一定的难度,还好经过我不断的耐心学习和钻研,才把这个游戏的根本功能实现了,最后只实现了记录历史最好成绩的功能,暂时没有实现排行榜这点稍微遗憾,以后有时机我会去实现的!俗话说,不积跬步无以至千里,不积小流无以成江海,程序中的很多方法我都是在书中和网上找了又找,试了又试,一遍又一遍,最终才把需要的方法融入到程序当中,实现了必要的功能模块。

    我以前从来没有玩过这个游戏,在开发游戏之前,我先在网上找到该游戏,了解游戏的玩法,自己熟悉之后才开始慢慢琢磨如何布局,如何分析,如何设计,如何实现默写模块功能,就用户在屏幕上滑动,获取用户意图这一模块来说,以前感觉很不可思议的事情,经过我不断耐心的学习,实验,最终也实现了,感觉挺棒的,通过这一点使我了解到我现在需要学习的内容还很多,今后我一定积极去学习需要学习的知识,做到融会贯穿,多做工程使自己在实践中学习,为将来打好铺垫最终因为本人能力有限,时间仓促,该游戏只是实现了根本功能,具体的美化、优化等等还没来得及做,虽然只做了这么一小局部,但是我还是学到了很多平时没有掌握到的知识,虽然不太完美,但是总体来看我还是比拟满意,相信只要有实践就会有收获,只要肯努力就会有回报成功的大门永远为那些追逐目标而发奋图强的人而开参考文献[1] 郑莉,王行言,马素霞. Java 语言程序设计[M].北京:清华大学出版社,2021,228~238.[2] 吴亚峰,于复兴,杜化美. Android开发游戏大全[M].北京:人民邮电出版社,2021,14~21.[3] 王小科,寇长梅,于复兴等. Android入门经典[M].北京:机械工业出版社,2021,130~134.[4] 楚无咎. Android开发游戏大全[M].北京:电子工业出版社,2021,23~25,82!~84,160~163.[5] Ian F.Darwin. Android开发游戏大全[M].北京:机械工业出版社,2021,290~297,333~334.[6] 一辉. Android布局详解之一:FrameLayout. ,2021-08-19 /2021-12-25.[7] 益智小游戏. 2048网页游戏. ,2021-08-26 /2021-12-20.[8] flyfish. 游戏. ,2021-03-20 /2021-12-21.[9] springhi-2021. Android中的Handler总结 . ,2021-07-26 /2021-12-25.[10] zyq0335. activity之间的数据传递方法 . article/details/ s7636724,2021-06-06 /2021-12-25.附录 游戏实现代码/** * 用于获取移动方向上下一个格子的位置 * @param index 当前格子的位置 * @param direction 滑动方向 * @return 如果在边界在返回-1 */ public int getNext(int index,int direction){ int y = index/4; int x = index%4; if(x==3 && direction==RIGHT) return -1; if(x==0 && direction==LEFT) return -1; if(y==0 && direction==UP) return -1; if(y==3 && direction==DOWN) return -1; return index+direction; } /** * 用于获取移动方向上前一个格子的位置 * @param index 当前格子的位置 * @param direction 滑动方向 * @return 如果在边界在返回-1 */ public int getBefore(int index,int direction){ int y = index/4; int x = index%4; if(x==0 && direction==RIGHT) return -1; if(x==3 && direction==LEFT) return -1; if(y==3 && direction==UP) return -1; if(y==0 && direction==DOWN) return -1; return index-direction; } /** * 该方法用来交换当前格与目标空白格的位置 * @param thisIdx 当前格子的坐标 * @param nextIdx 目标空白格的坐标 */ public void replace(int thisIdx, int nextIdx){ moved = true; //获取当前格子的view,并将其置成空白格 View thisView = gridLayout.getChildAt(thisIdx); ImageView image = (ImageView) thisView.findViewById(R.id.image); image.setBackgroundResource(icons[0]); //获取空白格的view,并将其背景置成当前格的背景 View nextView = gridLayout.getChildAt(nextIdx); ImageView nextImage = (ImageView) nextView.findViewById(R.id.image); nextImage.setBackgroundResource(icons[numberList.getNumberByIndex(thisIdx)]); //在空白格列表中,去掉目标格,加上当前格 spaceList.remove(spaceList.indexOf(nextIdx)); spaceList.add(thisIdx); //在数字格列表中,当前格的坐标置换成目标格的坐标 numberList.changeIndex(thisIdx, nextIdx); }/** * 刚方法用于合并在移动方向上两个相同的格子 * @param thisIdx 当前格子的坐标 * @param nextIdx 目标格子的坐标 */ public void levelup(int thisIdx, int nextIdx){ //一次移动中,每个格子最多只能升级一次 if(!changeList.contains(nextIdx)){ moved = true; //获取当前格子的view,并将其置成空白格 View thisView = gridLayout.getChildAt(thisIdx); ImageView image = (ImageView) thisView.findViewById(R.id.image); image.setBackgroundResource(icons[0]); //获取目标格的view,并将其背景置成当前格升级后的背景 View nextView = gridLayout.getChildAt(nextIdx); ImageView nextImage = (ImageView) nextView.findViewById(R.id.image); nextImage.setBackgroundResource(icons[numberList.getNumberByIndex(nextIdx)+1]); //在空白格列表中参加当前格 spaceList.add(thisIdx); //在数字列中删掉第一个格子 numberList.remove(thisIdx); //将数字列表对应的内容升级 numberList.levelup(nextIdx); changeList.add(nextIdx); //更新分数 updateScore((int)Math.pow(2, numberList.getNumberByIndex(nextIdx))); } }/** * 该方法,为每个符合条件的格子执行变动的操作,如置换,升级等 * @param thisIdx 当前格子的坐标 * @param direction 滑动方向 */ public void Change(int thisIdx,int direction){ if(numberList.contains(thisIdx)){ int nextIdx = getLast(thisIdx, direction); if(nextIdx == thisIdx){ //不能移动 return; }else if(spaceList.contains(nextIdx)){ //存在可以置换的空白格 replace(thisIdx,nextIdx); }else{ if(numberList.getNumberByIndex(thisIdx) == numberList.getNumberByIndex(nextIdx)){ //可以合并 levelup(thisIdx, nextIdx); }else{ int before = getBefore(nextIdx, direction); if(before != thisIdx){ //存在可以置换的空白格 replace(thisIdx,before); } } } } }/** * 用于获取移动方向上最后一个空白格之后的位置 * @param index 当前格子的坐标 * @param direction 移动方向 * @return */ public int getLast(int thisIdx, int direction){ int nextIdx = getNext(thisIdx, direction); if(nextIdx < 0) return thisIdx; else{ if(spaceList.contains(nextIdx)) return getLast(nextIdx, direction); else return nextIdx; } }/** * 该方法为不同的滑动方向,执行不同的遍历顺序 * @param direction 滑动方向 */ public void move(int direction){ moved = false; changeList.clear(); switch(direction){ case RIGHT: for(int y=0;y<4;y++){ for(int x=2;x>=0;x--){ int thisIdx = 4*y +x; Change(thisIdx,direction); } } break; case LEFT: for(int y=0;y<4;y++){ for(int x=1;x<=3;x++){ int thisIdx = 4*y +x; Change(thisIdx,direction); } } break; case UP: for(int x=0;x<4;x++){ for(int y=1;y<=3;y++){ int thisIdx = 4*y +x; Change(thisIdx,direction); } } break; case DOWN: for(int x=0;x<4;x++){ for(int y=2;y>=0;y--){ int thisIdx = 4*y +x; Change(thisIdx,direction); } } break; } //如果本次滑动有格子移动过,那么随机填充新的格子 if(moved) addRandomItem(); History history = new History(spaceList, numberList, score); historyStack.push(history); System.out.println("历史轨迹压入栈中 "); history.printLog(); if(spaceList.size()==0){ if(!numberList.hasChance()) over(); } }/** * 根据参数重绘界面 * @param spaceList 空白格列表 * @param numberList 数字格列表 * @param score 当前分数 */ public void drawViews(List spaceList, NumberList numberList, int score){ scoreText.setText(score+""); gridLayout.removeAllViews(); for(int i=0; i<16; i++){ View view = View.inflate(this, R.layout.item, null); ImageView image = (ImageView) view.findViewById(R.id.image); if(numberList.contains(i)) image.setBackgroundResource(icons[numberList.getNumberByIndex(i)]); else image.setBackgroundResource(icons[0]); gridLayout.addView(view); } }致谢此论文能够顺利完成,离不开给予我无私帮助的老师、同学、家人,以及网上为我解答困惑的网友们。

    感谢我的导师,宋喜佳老师,虽然接触的时间不是很长,但是在学习Android程序的路上给了我无私的关心和指导由于未接触过Java相关知识,在开发Android程序时处处碰壁,遇到需求,不能及时反响出解决方案,只有不断地求助于我的导师——宋喜佳老师,给了功能设计思路,让我成功地克服一个又一个的困难在此,谨向送老师表示衷心的敬意和感谢同时,非常感谢我的室友李朗和刘雨坤,在论文编写和毕业设计的制作过程中,给予我鼓励和关心,提出了许多珍贵意见和建议,再次深表感谢最后,特别感谢我的家人,感谢他们在精神上和物质上给予我无私的鼓励和支持,使我能够顺利完成论文,和学业,我将永记他们的付出并用一生来回报他们。

    点击阅读更多内容
    卖家[上传人]:ranfand
    资质:实名认证