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