基于Android平台的扫雷游戏设计与实现

2020-08-20 07:48肖洪兰
商情 2020年36期

肖洪兰

【摘要】本文开发了益智类扫雷手机游戏,分析了该游戏所需用到的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.