针对安卓游戏“2048”实施的设计与实现
安卓 系统基于Linux 系统,内核和驱动使用C / C + + 语言开发,设计了一个Dalvik JVM 作为中间层,然后在SDK 层面选择Java 作为开发语言,因此,开发一款安卓游戏的应用程序需要较复杂的开发流程。安卓益智类小游戏是日常生活中最耐玩的一种游戏,深受玩家喜爱,男女老少皆宜。与此同时,益智类小游戏相对于一些大型的手机网络游戏以及大型的手机单机游戏而言,具有便捷性、易开发性以及较高的创新性。本文介绍一种新型安卓手机游戏的开发。益智类游戏2048开发过程中有几个重难点: ①各种界面布局的正确嵌套使用,这关乎用户体验最直观感受; ②游戏中玩家执行各种事件后,系统需要做出的对应逻辑设计; ③游戏主要逻辑的实现。
1 游戏梗概
游戏开始时,棋盘内部Gridlayout 布局中随机出现2 个数字,出现的数字仅可能为4和2中的一个,且4和2出现的概率分别为0 . 8 和0 . 2。游戏玩家可以选择上、下、左、右4 个方向移动手指从而触发卡片的移动,如果Gridlayout 布局内的数字卡片出现位置移动或者位置合并,则是为有效正常移动步骤。玩家手指选择移动的方向上如果有一样的数则合并之,每次有效移动可以同时合并所有的2 个数,但不能连续合并2 个数,而且合并的所有数相加即为当前所得分数。玩家移动方向行或列前方有任何空白卡片则会发生位置移动。每一个有效移动步骤的进行都意味着棋盘的空位,即在无数字处随机出现一个数字 。棋盘被数字填满则无法进行有效移动,系统自动判定游戏失败即游戏结束。如若棋盘上出现2048这样的一个卡片,则为游戏取得胜利,此时游戏仍然继续运行。
2 布局设计和游戏主要设计
2. 1 布局设计
首先设计一个线性布局控件,以此控件为基础,设计一个技术支持的显示文本。与此同时,设计一个计分的文本,并设计好以上2 个组件对应的宽和高。鉴于游戏主体部分是一个4 4 的方格,所以我们采取了一个GridLayout布局来实现游戏的主要界面。
2. 2 游戏主要设计
2 . 2 . 1 游戏主类GameView
设计游戏主类GameView 继承自GridLa Üyout 布局。此布局嵌套进入主布局当中,承担着游戏运行的空间,并确保不与其他文本控件的显示发生冲突。
2 . 2 . 2 触控交互设计
相比于其他开发系统版本的2048键盘式的触控交互设计而言,安卓平台的触控交互设计是根据手势动作来判断进行的。所以这里采用一个触屏监听器,记录下用户手指按下的位置跟手指松开的位置,并比较偏移值的大小来激活上、下、左、右操作所对应的事件。2 . 2 . 3 游戏卡片Card 的添加设计卡片是游戏的核心,要将卡片添加到GameView 中。游戏中必须保证卡片的正常工作逻辑不产生任何异常。这里卡片大小的设计要注意卡片的大小与主界面的大小关系; 其次要注意卡片类的位置存放方式以及卡片类出现的随机性。逻辑以及检查结束的设计在游戏的具体实现中,需要判断玩家操作是否合法、界面是否有事件触发、是否需要添加新数字; 同时从左往右依次遍历,根据获取值的情况来判断是否需要合并卡片,以及是否需要清除合并过的卡片类。游戏结束与否的判断还要考虑以下2 种情况: ①当前所有卡片值为0 时; ②卡片4 个方向上有重复的数字时,这2 种情况下游戏都是不能结束的。
3 算法设计和具体实现
3. 1 算法设计
유1 、卡片类的设计。
对于手机中的卡片类大小,一般可以设计成为Absolute 属性,开发的产品比较直观且能高效运行。但考虑到该游戏能适配各种机型,不能出现卡片内数字溢出等情况,需要将卡片设计成自发适应屏幕大小的类型。在卡片类的设计中应注意以下几种情况:
①为了避免界面的繁琐,当卡片中的值为0 时不显示。
②为了增加卡片的区分度,位子图片颜色适当进行调节。
主要程序如下:
public class Card extends FrameLayout { / /
FrameLayout 是分层布局
public Card { / / 卡片类添加的属性大小颜色
super ;
label = new TextView ) ;
label. setBackgroundColor ;
label. setTextSize ; / / 设置文字在方格的正中间
label. setGravity ;
LayoutParams lp = new LayoutParams ; / / 设置大方框距离边缘距离为10 px
lp. setMargins ; / / 添加画板
addView ; / / 为其添加数据,其值为0 setNum ; }
private int Num = 0 ; / / 取回当前值
public int getNum
{ return Num; } / / 设置当前值
public void setNum
{
this. Num = Num; / / 当卡片中值为0时则不显示当前卡片的值
if {
label. setText {
case 0 :
label. setBacชkgroundColor ;
break;
case 2 :
label. setBackgroundColor ;
break;
case 4 :
label. setBackgroundColor ;
break;
default:
label. setBackgroundColor ;
break;
}
* /
} / / 定义一个equals 方法用于比较卡片中的值的对比
public boolean equals {
return getNum = = c. getNum ;
}
private Te♡xtView label;
}
2 、触控交互式设计。
游戏的设计中有4 种事件,分别是上、下、左、右移动。而玩家的手势却是各异,如画圈、画斜线等。如何处理好这些事件,并将其分门别类归纳好,这是基于B / S 架构的安卓版本需要考虑的问题。根据现有的安卓版本,本游戏采取的策略是: 监听用户的按下屏幕位置坐标以及用户离开屏幕的位置坐标,取两者横纵坐标的绝对值相比较再判断大小,从而实现用户手势的监听以及对应事件的触发。
3 、分数的统计。
分数的统计是一个繁琐而复杂的过程。有移动事件发生以后,卡片的位置会发生改变,卡片内的值也会发生改变,有些卡片还会被释放。因此应该设计一个全局变量来保存数据; 其次,每个卡片类的设计中必须包含这个要发生交互的值。
4 、随机卡片的设计。
任何一款游戏的设计都应该包含随机性。移动卡片后新卡片的产生需要通过随机种子来产生,卡片随机性的实现是一个难点,可以通过Math. random 0 . 1 2 ∶ 4 函数来实现随机性的控制。
3. 2 游戏程序具体实现
用一个GridLayout 来放置所有卡片,卡片类中都有设置值及数值大小。通过addRandomNum 添加初始卡片,添加随机数之前需要清空得分。通过cardsMap[p. x][p. y]. setNum 0. 1 2 ∶ 4) 确定游戏开始时2 与4的出现比例。在添加数字过程中,分别根据获取值是否为0来确定将右边的值放到当前位置还是合并这2 个值。当屏幕捕捉到有动作时,要添加新的随机数,然后检测游戏是否结束。触屏事件中,需要遍历X、Y 轴上值的情况来判断添加值操作和合并操作。
各函数属性设置如下:
point: 分数统计,记录本次游戏的分数;cardsMap[x][y]: 大布局下的小卡片位置;onTouch : 触屏事件;addRandomNum : 添加一个随机数值的初始卡片;onClickListener : 事件监听器;setNum *2 ) : 设置卡片值;addScore ) :添加分数;swipeLeft : 向左触屏移动; swipeRight 等方法依次类推;checkComplete : 检查游戏是否完全结束,是,则ณ激活游戏结束事件;对象:GameView: 游戏主类,继承自GridLayout。游戏的运行载体;Card: 卡片对象,存放卡片相关的属性和方法以及相关的属性存取值方法。
3. 3 测试结果
本设计各部分代码完成后,在Android4 . 0模拟器和真机上进行检查调试,各模块功能正常运行。
4 结论
本文从Java 出发,以Android 为载体,采用面向对象的方法,小游戏2048的开发,对游戏的界面以及逻辑的优化实现上进行了详细分析,其面向对象的逻辑思维方式,预计在未来很长的一段时间内都会是安卓游戏编程的主流思想。