汪 季,熊 辉,虞飞扬,叶苍竹,官守军
(1湖北理工学院 数理学院,湖北 黄石 435003;2黄石晨信光电股份有限公司,湖北 大冶 435100;3中软国际有限公司,北京 100044)
基于面向对象的安卓游戏“2048”设计与实现
汪 季1,3,熊 辉1,2*,虞飞扬1,叶苍竹2,官守军2
(1湖北理工学院 数理学院,湖北 黄石 435003;2黄石晨信光电股份有限公司,湖北 大冶 435100;3中软国际有限公司,北京 100044)
安卓(Android)益智类小游戏因具有较强的趣味性以及低廉的开发成本备受广大玩家和游戏开发商的青睐。“2048”是一款典型的卡片类游戏,游戏采用Java语言开发,利用各种界面布局的正确嵌套使用,提高用户体验的直观感受。同时,在设计中注重玩家触发各种事件的后台处理,自动调整系统对应逻辑关系,实现游戏主要功能。该游戏以面向对象的独特方式进行具体设计,实现了基于Android的游戏开发。
面向对象;安卓系统;游戏开发
安卓(Android)系统基于Linux系统,内核和驱动使用C/C++语言开发,设计了一个Dalvik JVM作为中间层,然后在SDK层面选择Java作为开发语言[1-5],因此,开发一款安卓游戏的应用程序需要较复杂的开发流程。安卓益智类小游戏是日常生活中最耐玩的一种游戏,深受玩家喜爱,男女老少皆宜[6-8]。与此同时,益智类小游戏相对于一些大型的手机网络游戏以及大型的手机单机游戏而言,具有便捷性、易开发性以及较高的创新性。
本文介绍一种新型安卓手机游戏的开发。益智类游戏“2048”开发过程中有几个重难点:①各种界面布局的正确嵌套使用,这关乎用户体验最直观感受;②游戏中玩家执行各种事件后,系统需要做出的对应逻辑设计;③游戏主要逻辑的实现。
游戏开始时,棋盘内部Gridlayout布局中随机出现2个数字,出现的数字仅可能为“4”和“2”中的一个,且“4”和“2”出现的概率分别为0.8和0.2。游戏玩家可以选择上、下、左、右4个方向移动手指从而触发卡片的移动,如果Gridlayout布局内的数字卡片出现位置移动或者位置合并,则是为有效正常移动步骤。玩家手指选择移动的方向上如果有一样的数则合并之,每次有效移动可以同时合并所有的2个数,但不能连续合并2个数,而且合并的所有数相加即为当前所得分数。玩家移动方向行或列前方有任何空白卡片则会发生位置移动。每一个有效移动步骤的进行都意味着棋盘的空位,即在无数字处随机出现一个数字(依然可能为“2”或“4”,其概率仍然为0.8和0.2)。棋盘被数字填满则无法进行有效移动,系统自动判定游戏失败即游戏结束。如若棋盘上出现“2048”这样的一个卡片,则为游戏取得胜利,此时游戏仍然继续运行。游戏程序启动后手机界面如图1所示。
2.1 布局设计
首先设计一个线性布局控件,以此控件为基础,设计一个技术支持的显示文本。与此同时,设计一个计分的文本,并设计好以上2个组件对应的宽和高。鉴于游戏主体部分是一个4×4的方格,所以我们采取了一个GridLayout布局来实现游戏的主要界面。
2.2 游戏主要设计
2.2.1 游戏主类GameView设计
游戏主类GameView继承自GridLayout布局。此布局嵌套进入主布局当中,承担着游戏运行的空间,并确保不与其他文本控件的显示发生冲突。
2.2.2 触控交互设计
相比于其他开发系统版本的“2048”键盘式的触控交互设计而言,安卓平台的触控交互设计是根据手势动作来判断进行的。所以这里采用一个触屏监听器,记录下用户手指按下的位置跟手指松开的位置,并比较偏移值的大小来激活上、下、左、右操作所对应的事件。
2.2.3 游戏卡片Card的添加设计
卡片是游戏的核心,要将卡片添加到GameView中。游戏中必须保证卡片的正常工作逻辑不产生任何异常。这里卡片大小的设计要注意卡片的大小与主界面的大小关系;其次要注意卡片类的位置存放方式以及卡片类出现的随机性。
2.2.4 逻辑以及检查结束的设计
在游戏的具体实现中,需要判断玩家操作是否合法、界面是否有事件触发、是否需要添加新数字;同时从左往右依次遍历,根据获取值的情况来判断是否需要合并卡片,以及是否需要清除合并过的卡片类。游戏结束与否的判断还要考虑以下2种情况:①当前所有卡片值为0时;②卡片4个方向上有重复的数字时,这2种情况下游戏都是不能结束的。
3.1 算法设计
1)卡片类的设计。
对于手机中的卡片类大小,一般可以设计成为Absolute属性,开发的产品比较直观且能高效运行。但考虑到该游戏能适配各种机型,不能出现卡片内数字溢出等情况,需要将卡片设计成自发适应屏幕大小的类型。
在卡片类的设计中应注意以下几种情况:
①为了避免界面的繁琐,当卡片中的值为0时不显示。
②为了增加卡片的区分度,位子图片颜色适当进行调节。
主要程序如下:
public class Card extends FrameLayout {// FrameLayout是分层布局
public Card(Context c) {//卡片类添加的属性大小颜色
super(c);
label=new TextView(getContext()); label.setBackgroundColor(0x33fffdff);
label.setTextSize(22); //设置文字在方格的正中间
label.setGravity(Gravity.CENTER);
LayoutParams lp = new LayoutParams(-2,-2); //设置大方框距离边缘距离为10px
lp.setMargins(8,8,0,0);//添加画板
addView(label,lp);//为其添加数据,其值为0 setNum(0);}
private int Num = 0; //取回当前值public int getNum( )
{return Num;} //设置当前值
public void setNum(int Num)
{
this.Num =Num; //当卡片中值为0时则不显示当前卡片的值
if(Num<=0){
label.setText(" ");
}else{
label.setText(Num+"");
}
/* //改变文字所在的卡片颜色
switch (Num) {
case 0:
label.setBackgroundColor(0xffeee4fa);
break;
case 2:
label.setBackgroundColor(0x00000010);
break;
case 4:
label.setBackgroundColor(0xffede0d8);
break;
(此处省略8,16,32,64,128,256,512,1024,2048的语法)
default:
label.setBackgroundColor(0xff3c3a22);
break;
}
*/
} //定义一个equals方法用于比较卡片中的值的对比
public boolean equals(Card c) {
return getNum()==c.getNum();
}
private TextView label;
}
2)触控交互式设计。
游戏的设计中有4种事件,分别是上、下、左、右移动。而玩家的手势却是各异,如画圈、画斜线等。如何处理好这些事件,并将其分门别类归纳好,这是基于B/S架构的安卓版本需要考虑的问题。根据现有的安卓版本,本游戏采取的策略是:监听用户的按下屏幕位置坐标以及用户离开屏幕的位置坐标,取两者横纵坐标的绝对值相比较再判断大小,从而实现用户手势的监听以及对应事件的触发。
3)分数的统计。
分数的统计是一个繁琐而复杂的过程。有移动事件发生以后,卡片的位置会发生改变,卡片内的值也会发生改变,有些卡片还会被释放。因此应该设计一个全局变量来保存数据;其次,每个卡片类的设计中必须包含这个要发生交互的值。
4)随机卡片的设计。
任何一款游戏的设计都应该包含随机性。移动卡片后新卡片的产生需要通过随机种子来产生,卡片随机性的实现是一个难点,可以通过Math.random( )>0.1<2∶4函数来实现随机性的控制。
3.2 游戏程序具体实现
用一个GridLayout来放置所有卡片,卡片类中都有设置值及数值大小。通过addRandomNum()添加初始卡片,添加随机数之前需要清空得分。通过cardsMap[p.x][p.y].setNum(Math.random( )>0.1<2∶4)确定游戏开始时2与4的出现比例。在添加数字过程中,分别根据获取值是否为“0”来确定将右边的值放到当前位置还是合并这2个值。当屏幕捕捉到有动作时,要添加新的随机数,然后检测游戏是否结束。触屏事件中,需要遍历X、Y轴上值的情况来判断添加值操作和合并操作。
各函数属性设置如下:
point:分数统计,记录本次游戏的分数;
cardsMap[x][y]:大布局下的小卡片位置;
onTouch(View v,MotionEvent e):触屏事件;
addRandomNum():添加一个随机数值的初始卡片;
onClickListener():事件监听器;
setNum(cardsMap[x][y].getNum()*2):设置卡片值;
addScore(cardsMap[x][y].getNum()):添加分数;
swipeLeft():向左触屏移动;swipeRight()等方法依次类推;
checkComplete():检查游戏是否完全结束,是,则激活游戏结束事件;
对象:
GameView:游戏主类,继承自GridLayout。游戏的运行载体;
Card:卡片对象,存放卡片相关的属性和方法以及相关的属性存取值方法。
3.3 测试结果
本设计各部分代码完成后,在Android4.0模拟器和真机上进行检查调试,各模块功能正常运行。程序运行前手机界面如图2所示。
游戏结束前,需要检查游戏是否结束。当程序检测到满足结束条件时,手机界面如图3所示。
此时,为了增强游戏趣味性,设计了最后的弹出页面,鼓励使用者继续运行游戏。程序结束后弹出界面如图4所示。
本文从Java出发,以Android为载体,采用面向对象的方法,设计实现了游戏“2048”。通过安卓益智类小游戏“2048”的开发,对游戏的界面以及逻辑的优化实现上进行了详细分析,其面向对象的逻辑思维方式,预计在未来很长的一段时间内都会是安卓游戏编程的主流思想。
[1] 李刚.疯狂Java讲义[M].北京:电子工业出版社,2008:201-205.
[2] 郝焕.Java轻松入门[M].北京:人民邮电出版社,2009:22-23.
[3] 墨菲.Android开发入门教程[M].李雪飞,吴明晖,译.北京:人民邮电出版社,2010:18-19.
[4] 黄宇健,刘宏韬.Android项目开发范例大全[M].北京:中国铁道出版社,2012:69-74.
[5] Bruce Eckel.Thinking in Java[M].New York:Prentice Hall,2006:128-129.
[6] Zhang Y,Huang G,Liu X,et al.Refactoring android Java code for on-demand computation offloading[J].Acm Sigplan Notices,2016,47(10):233-248.
[7] Wei L.Design and Implementation of Chinese chess network game based on Java[J].Journal of Xiangyang Vocational & Technical College,2016(3):22-28.
[8] Wang H,Jia YU.The Analysis and Review on Development Tools of Java(Ⅱ)[J].Journal of Jilin Institute of Chemical Technology,2016(3):39-46.
(责任编辑 吴鸿霞)
Design and Realization of Object-oriented Android Game "2048"
WangJi1,3,XiongHui1,2*,YuFeiyang1,YeCangzhu2,GuanShoujun2
(1School of Mathematics and Physics,Hubei Polytechnic University,Huangshi Hubei 435003;2Huangshi Sunshine Optoelectronic Co.Ltd.,Daye Hubei 435100;3China soft International Co.Ltd.,Beijing 100044)
Android Intelligence games are very popular with the majority of game players and game developers because of its great interest and low development cost."2048" is a classic card game that adopts the JAVA language development and uses correct nested call of various interface layout,which improves the subjective sensation of users' experience.At the same time,importance is attached to background processing of different events triggered by players,system corresponding logical relationship is automatically adjusted and game main function is realized.The game is designed in the object-oriented way and implements game development based on Android.
object-oriented;Android systems;game development
2016-07-24
湖北省大学生创新创业训练计划项目(项目编号:201510920023);湖北理工学院校级科研引进人才项目(项目编号:14xjz03R);湖北省知识创新专项(自然科学基金)(项目编号:2016CFC742)。
汪季,本科生。
10.3969/j.issn.2095-4565.2017.02.006
TP319
A
2095-4565(2017)02-0024-04
*通讯作者:熊辉,讲师,博士,研究方向:光电子信息技术。