肖洪兰
【摘要】本文开发了益智类扫雷手机游戏,分析了该游戏所需用到的API,探讨了游戏的数据结构及每个方格不同状态的不同编码,最后给出核心算法。游戏基于Android2.2.3平台开发实现,可以运行于任意主流的Android手机中。
【关键词】扫雷 Android View
一、Android平台简介
Android是一个开放的手机操作系统平台,为移动设备提供了一个包含操作系统、中间件及应用程序的软件叠层架构。Android SDK为开发人员使用Java语言编写Android平台下的应用程序提供了必要的工具和API。Android和iPhone相比,其的优点有:真正开放、应用程序相互平等、应用程序沟通无界限。
二、扫雷游戏的简介
在扫雷游戏中,有N行M列个方格,每个方格包含三种状态:关闭、标记为雷和打开,初始化时每个方格都是关闭的,你可以标记某个方格是雷,预测该方格有雷(并不表示真的一定有雷);也可以打开某个方格,一个打开的方格也会包含两种状态:一个数字和一个雷。如果你打开的是一个雷,那么就是失败;否则就会打开一个数字,该数字是位于0到8之间的一个整数,该数字表示其所有邻居方格的所包含的雷数。一个已打开的方格不能再关闭,标记为雷可以取消标记,当一个方格标记为雷后该方格不能打开一个方格。所有标记为雷的方格真的是雷则游戏胜利。
三、扫雷游戏的设计及实现
(一)主要的类及方法方法介绍
android.view.View为所有可视化控件的基类,主要提供绘制和事件处理的方法,boolean onTouchEvent(MotionEvent event)方法处理点击屏幕的事件, onDraw(Canvas canvas) 方法处理绘制画面,postInvalidate()方法会通知UI线程更新界面,UI线程会调用onDraw(Canvas canvas)重新绘制界面。
java.util.Random为伪随机数产生器,int nextInt(int n)方法返回0到n之间的整数值。通过调用nextInt()方法实现雷的位置随机分布。
android.graphics.Canvas能绘制各种图形元素的类,drawBitmap()方法在指定位置绘制相应的图片。在该方法中绘制游戏中的所有界面。
Runnable该接口和Thread类一起使用run()方法,所有实现该接口的类都可以提供线程的主体部分;必须实现run()方法,在该方法中改变便时间计数器的值,以达到计时的效果。
(二)主要算法
1.定义一个N行M列的二维数组int [][]map;每个元素的值所表示的意义如下
(1)初始化时,数组中的值只有[0,8]代表数值0至8,10表示是雷。
(2)在显示时14表示是标记为雷的状态图片,15表示没有打开是关闭状态图,12表示碰雷的图片,11表示最后失败时显示标记为雷是错误的图片。
(3)在玩游戏的过程中可以对某个方格标记为雷,也可以打开该方格,也可以取消标记;也就是说一个方格有三种种状态,这里准备用同一个数组采用不同的编码来表示三种不同的状态,[0,10]代表是数组初始化时的状态,也就是雷德位置及周围的数值;标记map[i1][j1]为雷则在修改map[i1][j1]=map[i1][j1]+20,取消标记map[i1][j1]=map[i1][j1]-20;点开时map[i1][j1]=map[i1][j1]+40;这样在绘制游戏界面时做相反的变化就能正确表示当前方格的状态,也能算出原来的初始化值。
2.点击方格区域的核心算法如下
if(selectBT==14) //标记为雷
{
if(map[i1][j1]<16)
{ map[i1][j1]+=20;minners--;}
else if(map[i1][j1]>20&&map[i1][j1]<36){
map[i1][j1]-=20;minners++;
}
}
if(selectBT==15){//点开
if(map[i1][j1]==0)//点开一片区域
findNull(map, i1, j1);//深度优先搜索八个方向
else if(map[i1][j1]==10)//碰雷
{ map[i1][j1]+=42;
logic.findAllMinners(map);//显示所有的雷
}
else if(map[i1][j1]<9)//顯示数值
map[i1][j1]+=40;
}
3.深度优先搜索八个方向的核心代码如下
int direct[][]={{-1,-1},{-1,0},{-1,1},{0,-1},{0,1},{1,-1},{1,0},{1,1}}
public void findNull(int[][]map,int i,int j){
if((i<0||i>map.length-1)&&(j<0||j>map[i].length-1))return;//下标越界返回
if(map[i][j]==0){
map[i][j]+=40;//已经点开
for (int j2 = 0; j2 < direct.length; j2++) {//继续展开八个方向
findNull(map, i+direct[j2][0], j+direct[j2][1]);
}
}
if(map[i][j]>0&&map[i][j]<9)
{ map[i][j]+=40;//已经点开
return;}
return; }
四、结束语
扫雷游戏是一款比较经典的Windows游戏,因为智能手机用户有不同的体验方式,如果能借助传感器再加上适当的创意,我相信扫雷游戏在手机上会有更多的用户愿意去体验。
参考文献:
[1]吴亚峰,索伊娜.Android核心技术与实例详解[M].电子工业出版社,2012.