安卓扫雷有什么推荐吗?

1.游戏规则

扫雷是一个极其简单的游戏。点击玩家认为没有地雷的区域,标记所有地雷所在的区域即可获胜。当点击一个不含雷霆的方块时,它下面可能会有一个数字,也可能是一个空白的方块。当点击带有数字的方块时,游戏会显示当前点击方块中包含的数字。当点击空白块时,地图会展开形成一个大小形状不规则的图形。图形的边界是一个数字块,也可以认为是一个被数字包围的不规则图形。

1.1?数字生成规则

扫雷游戏中,通过数字判断地雷的位置。那么,数字的生成规则是什么呢?假设游戏中只有一个雷霆,那么他的雷霆就会被数字1包围,如果遇到边界就会被忽略。如图所示:

1

1

1

1

1

1

1

1

1

1

1

可见游戏是根据雷霆的位置来生成数字的。我们来看下图:

1

1

1

1

2

1

2

1

1

1

上图中,区块中有两个数字为2的区块,这是数字叠加的结果。雷霆周围的区域重叠,重叠区域块的数字相加,块的数字就会成为相加的数字。

1.2?这篇博文的例子就是扫雷的规则。

玩家需要打开所有的空白方块,留下玩家认为有雷霆的方块。当剩余方块数等于雷霆数时,玩家获胜。如果你在此之前用雷霆击中禁区,玩家失败。

2.游戏的算法和数据结构

2.1?空白块扩展算法

空白方块的展开几乎是扫雷游戏的核心。如上所述,当你点击一个扫雷游戏中的空白区块时,游戏的地图区块会被展开。我们可以观察到空白块是逐层展开的,所以我们使用广度优先搜索作为地图展开算法。也许有人会问:可以用深度优先搜索算法吗?答案是肯定的,但是如果用在这里,会比广度优先搜索算法效率低。

2.2排雷的数据结构

(1)方向阵列

int[][] dir={

{-1,1},//左上角

{0,1},//在顶部

{1,1},//右上角

{-1,0},//右左

{1,0},//右

{-1,-1},//左下角

{0,-1},//正下方

{1,-1}//右下角

};

扩展空白块时重用方向数组,因为广度优先遍历意味着在地图中的各个方向上行走。

(2)瓷砖类

这个类代表游戏中的一个“块”,我们为它声明了三个成员。

矮?价值;

布尔标志;

布尔开;

Value存储块的值。-1表示矿块;0表示空白块;& gt0表示数字块。

Flag存储地雷是否被玩家标记(本例中没有影响,留作方便扩展)。

Open存储用户是否点击了该块。

(3)平铺阵列

Tile array代表了一个方块的集合和一个游戏的地图,它存储了游戏的主要数据。

(3)点类

点类代表“位置”,声明点类便于我们在地图中任意位置生成闪电。Point类还覆盖hashCode和equals方法,以便比较位置是否与位置相同。

(4)第4类矿井

上述数据结构的封装。

矿构造器:设置游戏地图的参数,如绘制位置、绘制大小、分块大小、生成雷数等。

Init()方法:清空并初始化游戏地图。

创建(点p)方法:在地图中随机生成矿的位置,生成数字。参数p是不打雷的位置,点p可以传入用户第一次点击的位置。在随机位置生成闪电比较快速的方法是将地图中除P位置以外的所有位置加入链表,然后生成0到链表大小为-1的随机数,根据生成的随机数从链表中取元素,取完元素后从链表中删除该位置,将瓦片数组中该位置瓦片的值设置为-1。重复上述操作,直到生成的地雷数量满足要求。生成数字的方式:遍历平铺数组,遇到雷时在他周围八个位置的值上加1,八个位置有雷或者位置不存在就什么都不做。

Open(Point p,boolean isFirst)方法:p代表Tile数组的索引,是点击某个位置的块。IsFirst incoming是否是第一次点击屏幕。这个方法需要对是否是第一次点击做不同的操作。当玩家第一次点击方块时,调用create函数来生成地图。否则,展开地图等操作。

(5)主视图类

视图类,负责绘制和操作矿井对象。

3.代码示例

Mine.java

详细的