安卓扫雷有什么推荐吗?
扫雷是一个极其简单的游戏。点击玩家认为没有地雷的区域,标记所有地雷所在的区域即可获胜。当点击一个不含雷霆的方块时,它下面可能会有一个数字,也可能是一个空白的方块。当点击带有数字的方块时,游戏会显示当前点击方块中包含的数字。当点击空白块时,地图会展开形成一个大小形状不规则的图形。图形的边界是一个数字块,也可以认为是一个被数字包围的不规则图形。
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
详细的