APP下载

一款基于Android 平台益智游戏的设计与实现

2016-03-07赵宏

电脑知识与技术 2015年34期
关键词:手势卡片界面

赵宏

摘要:近几年,随着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.

猜你喜欢

手势卡片界面
摆卡片
倒过来的卡片
国企党委前置研究的“四个界面”
挑战!神秘手势
V字手势的由来
一张卡片
基于FANUC PICTURE的虚拟轴坐标显示界面开发方法研究
胜利的手势
人机交互界面发展趋势研究
手机界面中图形符号的发展趋向