文章目录
项目成员
向敏 202031101652
李康颖 202031101511
项目名称
2048小游戏
一、项目概述
开发这款游戏的初衷是希望用户通过简单的操作便能体会到其中乐趣,工作学习的闲暇之余可以放松身心。
项目概览图:
二、项目内容
1.玩法介绍
《2048》是一款益智类小游戏,玩法规则是:玩家控制全部方块朝同方向运动,两个同数字方块碰撞后,合并的数字为它们之和,每次操作都会随机生成2或者4数字,结果得出2048的方块则为游戏胜利。
三、技术要求
1.Android操作系统
Android具有开放性强,硬件资源丰富,方便开发的优势。
Android开发的平台允许任何移动终端厂商加入到Android联盟中来。显著的开放性可以使其拥有更多的开发者;对于消费者来讲,最大的受益正是丰富的软件资源。
但同时也会带来更激烈的竞争,这需要我们考虑自身能否脱颖而出。
2.Java语言
Java是一门面向对象的编程语言,不仅吸收了C++语言的各种优点,还摒弃了C++里难以理解的多继承、指针等概念,因此Java语言具有功能强大和简单易用两个特征。Java语言作为静态面向对象编程语言的代表,极好地实现了面向对象理论,允许程序员以优雅的思维方式进行复杂的编程
3.2048相关算法
2048的游戏界面可以看做是一个二维数组。我们的所有操作,实际上都是针对这一个二维数组的。我们可以将二维数组看成多个一维数组来处理,比如左右移动时一行一行的处理,上下移动时一列一列的处理。接下来以向右移动为例去实现它。
假设当前在某一行,我们希望实现数字的相加。首先将这一行读取出来,当做一维数组来处理。逐个枚举每一个数字,如果有相邻且相等的数就直接相加。这时候问题就来了,相等的数中间隔着0怎么处理?我们可以选择用一个变量记录之前的非零数,然后跳过0,继续枚举后面的数,遇到相同的再相加,最后将一整行的非零数都移到右边即可。在这里不妨换种思路,为何不先将所有的零数移动到最左边后再去执行加法呢?
读取一行数字后,我们先将所有的零存进进一个新数组的左侧,2 0 2 0 就成了 0 0 2 2。然后从最右边开始,将相同且相邻的数字相加,后一个数置0,防止相加后又参与了相加的问题;接着继续枚举下一个数字,处理完后再进行一次移0操作,然后将结果返回给二维数组。
确定了相加的算法后,继续思考其过程可以发现:数字是往玩家操作的方向堆积的,但相加的方向是反过来的。例如数字向右移动,但却是从最右边开始往左相加的;数字向上移动,但却是从最上面开始往下相加的。不管向哪个方向移动,移0和复制的操作都是一样的,因此在考虑这一块时只需要注意实现上的细微差别即可。
另外就是需要设计随机数的生成。随机数是在空白格子上随机生成的,因此要定义一个空白格子结构体,结构体内存的是空白格子在二维数组中的下标。用一个结构体数组来存储每次移动后的所有空白格子,随机挑选一个空白格子,随机生成2或者4(两者生成概率最好不要完全一样)即可。
链接: 详情请看原文
四、Android系统架构
Android系统构架是安卓系统的体系结构,android的系统架构和其操作系统一样,采用了分层的架构,共分为四层,从高到低分别是Android应用层,Android应用框架层,Android系统运行库层和Linux内核层。
1.应用层
Android会同一系列核心应用程序包一起发布,该应用程序包包括email客户端,SMS短消息程序,日历等一般都是使用Java进行编写。
2.应用框架层
开发人员可以完全访问核心应用程序所使用的API框架。该应用程序的架构设计简化了组件的重用;任何一个应用程序都可以发布它的功能块并且任何其它的应用程序都可以使用其所发布的功能块(不过得遵循框架的安全性限制)。同样,该应用程序重用机制也使用户可以方便的替换程序组件。
隐藏在每个应用后面的是一系列的服务和系统,其中包括:
视图(Views),可以用来构建应用程序,它包括列表(lists),网格(grids),文本框(textBoxes),按钮(buttons),甚至可嵌入的web浏览器。
内容提供器(ContentProviders)使得应用程序可以访问另一个应用程序的数据(如联系人数据库),或者共享它们自己的数据
资源管理器(ResourceManager)提供非代码资源的访问,如本地字符串,图形,和布局文件(layoutfiles)。
通知管理器(NotificationManager)使得应用程序可以在状态栏中显示自定义的提示信息。
活动管理器(ActivityManager)用来管理应用程序生命周期并提供常用的导航回退功能。
3.系统运行库层
- 程序库
Android包含一些C/C++库,这些库能被Android系统中不同的组件使用。它们通过Android应用程序框架为开发者提供服务。以下是一些核心库:
系统C库——一个从BSD继承来的标准C系统函数库(libc),它是专门为基于embeddedlinux的设备定制的。
媒体库——基于PacketVideoopencore;该库支持多种常用的音频、视频格式回放和录制,同时支持静态图像文件。编码格式包括MPEG4,H.264,MP3,AAC,AMR,JPG,PNG。
SurfaceManager——对显示子系统的管理,并且为多个应用程序提供了2D和3D图层的无缝融合。
LibWebCore——一个最新的web浏览器引擎用,支持Android浏览器和一个可嵌入的web视图。
SGL——底层的2D图形引擎
3Dlibraries——基于OpenGLES1.0APIs实现;该库可以使用硬件3D加速(如果可用)或者使用高度优化的3D软加速。
FreeType——位图(bitmap)和矢量(vector)字体显示。
SQLite——一个对于所有应用程序可用,功能强劲的轻型关系型数据库引擎。 - Android运行库
Android包括了一个核心库,该核心库提供了JAVA编程语言核心库的大多数功能。
每一个Android应用程序都在它自己的进程中运行,都拥有一个独立的Dalvik虚拟机实例。Dalvik被设计成一个设备可以同时高效地运行多个虚拟系统。Dalvik虚拟机执行(.dex)的Dalvik可执行文件,该格式文件针对小内存使用做了优化。同时虚拟机是基于寄存器的,所有的类都经由JAVA编译器编译,然后通过SDK中的“dx”工具转化成.dex格式由虚拟机执行。
Dalvik虚拟机依赖于linux内核的一些功能,比如线程机制和底层内存管理机制。
4.Linux内核层
Android的核心系统服务依赖于Linux2.6内核,如安全性,内存管理,进程管理,网络协议栈和驱动模型。Linux内核也同时作为硬件和软件栈之间的抽象层。
五、建设内容
1.开始设计
注册账号并且登录之后,点击主页面的“开始游戏”按钮,即可开始。
2.计分设计
当有数字合并时,记录此时合并的数字,加到相应的分数中。
3.结束设计
当游戏界面中没有得到2048且没有两个相同的格子时判定游戏结束。
4.触控交互设计
用户通过手指滑动屏幕,从起始位置获得水平或垂直方向的偏移量以此来判断用户意图。