一款基于Android 平台益智游戏的设计与实现
2016-03-07赵宏
赵宏
摘要:近几年,随着Android手机及其相关设备的迅速普及,针对Android平台游戏的开发需求日益增多。“2048游戏”是一款益智类游戏,老少皆宜。该文设计并实现了基于Android平台的2048游戏,最后在手机上测试运行,结果十分流畅。
关键词:Android平台;益智类游戏;2048游戏
中图分类号:TP311 文献标识码:A 文章编号:1009-3044(2015)34-0102-02
随着移动通信技术的迅速发展,人们对移动设备需求的不断变化,移动设备的智能化程度也在不断提高。Android平台作为三大移动平台之一,用户数量也在不断增长。同时,人们不再满足于传统的桌面游戏,移动游戏具有随时、随地和随身等特点,不断受到用户的青睐。因此,移动游戏相对于传统游戏所占的市场份额也在日益扩大。本文设计和实现了一种基于Android平台的2048益智游戏。
1 研究内容
数字游戏2048,初始数字则是由2+2组成的基数4。在操作方面,与其他一些数字游戏相比有所不同,表现为由一步一格的移动,变成更为爽快的一次到底。相同数字的卡片在靠拢、相撞时会相加。系统给予的数字方块不是2就是4,用户要想办法在这16格范围中凑出“2048”这个数字方块就算成功。
本游戏是在Android应用平台上开发的,使用的开发语言为:Java语言,开发工具为Eclipse,并包含ADT等插件。
2 系统设计
在对游戏进行详细需求分析的基础上,确定了系统的功能和性能要求,对游戏的主界面、屏幕绘制、布局设计、合并算法、游戏分数及最高分的统计进行了详细设计。游戏单项功能的实现:开始游戏、屏幕绘制、滑动合并、重新开始游戏、统计得分和最高分等功能。然后自定义游戏视图,且能够根据控制器提供的布局数据来显示数字卡片方格,并提供选中合并、叠加和统计分数等功能。
当用户点击开始游戏后,用户可以上下左右滑动卡片,与此同时游戏也开始统计得分,随着游戏得分越来越高,界面中空格卡片的剩余量也越来越少,用户也可以退出游戏或重新开始游戏。系统流程图如图1。
在游戏的过程中,当用户滑动卡片2,与卡片2相碰叠加,就会成为卡片4,与此类推,当卡片1024与卡片1024叠加成卡片2048,则证明游戏闯关成功。
3 算法设计
当用户进入游戏界面,开始游戏时,首先系统会默认自动生成两张数字卡片,可以任意滑动。整个游戏涉及到核心算法主要有:手势判断,移动卡片,判断游戏结束。
3.1 手势判断
手势的判断与识别,是手机游戏的关键所在,也是手机游戏体验好坏的重要因素之一。在本游戏中,手势判断方法,记录手势在x轴上的距离,与y轴的距离大小,并做出相应的判断。比如手势在x轴距离大于+5单位,则向表示右移;小于-5单位,则向左移。以此类推,判断手势在y轴的移动。
private float startX, startY, offsetX, offsetY;
@Override
public 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;
//记录手势在x轴与y轴的距离大小
if (Math.abs(offsetX) > Math.abs(offsetY)) {
if (offsetX < -5) {
//手势在x轴距离小于-5则向左移swipeLeft();
} else if (offsetX > 5) { //手势在x轴距离大于+5则向右移 swipeRight(); }
} else {
if (offsetY < -5) {
//手势在y轴距离小于-5则向上移swipeUp();
} else if (offsetY > 5) {
//手势在y轴距离大于+5则向下移swipeDown(); } }
break; }
return true; }
3.2 移动卡片
关于卡片移动的方法,分成两种情况来处理,一种是没有能合并但有能够移动的,就移动到相应的位置。第二种,能够合并的,合并到相应的位置再移动。
private void swipeLeft() {
boolean merge = false;
for (int y = 0; y < LINES; y++) {
for (int x = 0; x < LINES; x++) {
for (int x1 = x + 1; x1 < LINES; x1++) {
// 移动不能合并的卡片位置
if (cardsMap[x1][y].getNum() > 0) {
if (cardsMap[x][y].getNum() <= 0) { cardsMap[x][y].setNum(cardsMap[x1][y].getNum()); cardsMap[x1][y].setNum(0);
x--;
merge = true; }
// 判断是否还有能够合并的卡片
else if (cardsMap[x][y].equals(cardsMap[x1][y])) {
cardsMap[x][y].setNum(cardsMap[x][y].getNum() *2);
cardsMap[x1][y].setNum(0);
score.addScore(cardsMap[x][y].getNum());
merge = true; }
break; } } }
}
if (merge) {
addRandomNum();
checkComplete();
}
3.3 判断游戏结束
怎么判断游戏是否结束呢?我们要看是否所有砖块填满,还要看相邻卡片的数字是否相同,是否还有能够合并的了。
4 功能实现
为了实现游戏的具体功能,思路如下:用户进入欢迎界面后,提示点击屏幕,进入游戏页面,然后实现游戏的全部功能,如图2和图3。具体描述如下:
1)游戏的基本功能。首先,要游戏能够正常启动运行。在游戏开始阶段,用户应该对卡片的方向有一个基本判断(如上、下、左、右),因为用户选择不同的方向,最后得分是不同的。另外,在游戏过程中可以使用道具,也可以选择重新开始游戏。
2)游戏模式选择。所谓游戏模式选择,也就是当用户在游戏过程中遇到困难,不能再进行下一步的时候,可以选择使用道具,使其可以继续进行游戏。模式有两种,间隔行和间隔列:所谓间隔行和间隔列,也就是在游戏的主画面中,可以将间隔的行和列中的数字卡片合并且数字叠加,组成新的数字卡片。
3)游戏得分统计。当用户进入游戏界面,开始游戏的时候,系统便开始进行得分的统计,用户也可以通过得分,以此来激发用户的玩游戏的欲望,使其自己的得分变得更高。最后还有一个最高分统计,这个将会存储在用户的手机文件里,用作历史记录最高得分,增加用户的挑战性,同时也增加了游戏本身的趣味性。
5 结束与展望
本游戏的设计经过Android平台的模拟器测试,成功运行。同时,也经过几台手机的测试,运行十分流畅。今后,将继续优化游戏界面,增加功能,使游戏的趣味性和可玩性进一步得到提高。
参考文献:
[1] 代亮, 林峰. 基于Android移动平台数独游戏的设计与实现[J]. 电脑知识与技术, 2013(5).
[2] 俞琳琳. 基于Starling的捕鱼游戏的设计与开发[J]. 软件工程师, 2014(12).
[3] 李刚. 疯狂Android讲义[M]. 北京:电子工业出版社, 2013.
[4] 郭少豪. Android 3D游戏开发与应用案例详解[M]. 北京: 中国铁道出版社, 2012.
[5] 杨长刚. 深入剖析Android系统[M]. 北京: 电子工业出版社, 2013.