经典扫雷游戏戏有什么规律吗

求扫雷游戏规则?_百度知道
求扫雷游戏规则?
基本我会 但是我不知道那个“?”(右键两次)有什么用
我有更好的答案
先任意点开少量的方格,没有爆炸时,会出现一个数字,这个数字代表的意思是以它为中心的9个格子内所有雷的个数。一般围在一堆数字中间的有可能是雷,你在你认为是雷的那里右击,就可以把它设定为雷,然后在数字区用鼠标左右键双击,可以打开非雷区,等打开所有非雷区,你就赢啦!
1代表1的上下左右及斜角合计有一颗雷,依次轮推,2则有2颗,3则有3颗。在确实是炸弹的方格上点了旗子,就安全了,不是炸弹的被点了旗子,后面会被炸死的。问号就三不确定这里有没有炸弹,不会存在点错了被炸死的状况。有个小窍门,在数字旁同时点左键和右键可以排雷。 ,第一下点的一定不是雷,哈哈。 左键点开,右键用旗子标记雷,同时左右键点数字可以判断周围的雷是否已经全部标出 每个数字代表 这个数字周围九个格里,有几颗雷!比如,1,周围九个格里只有一颗雷,2 周围九个格里就有两颗雷,以此类推 通过单击即可挖开方块。如果挖开的是地雷,则您输掉游戏。 如果方块上出现数字,则表示在其周围的八个方块中共有多少颗地雷。 要标记您认为可能有地雷的方块,请右键单击它。 游戏区包括雷区、地雷计数器和计时器。 数字就是这个方块周围的8个方块里有的雷的数量,问号是自己弄上去的,可以的地方可以弄个问号,旗子就是确定那里有雷了
其他1条回答
为您推荐:
其他类似问题
换一换
回答问题,赢新手礼包
个人、企业类
违法有害信息,请在下方选择后提交
色情、暴力
我们会通过消息、邮箱等方式尽快将举报结果通知您。【Android】自己动手做个扫雷游戏
本文链接:
扫雷是玩法极其简单的小游戏,点击玩家认为不存在雷的区域,标记出全部地雷所在的区域,即可获得胜利。当点击不包含雷的块的时候,可能它底下存在一个数,也可能是一个空白块。当点击中有数字的块时,游戏会展现当前点击块所包含的数字。当点击空白块时,地图会展开,形成一个大小和形状不规则的图形,该图形的边界时数字块,也可以想成展开的是一个被数字包围着的不规则图形。
数字生成规则
扫雷游戏中是通过数字来判断雷的位置的,那么,数字的生成规则是什么呢?假设游戏中只有一个雷,那么,他的将被1这个数字包围着,如果遇到边界就忽略。如图:
可见,游戏是先生成雷然后再根据雷的位置生成数字的,我们再看下面的图:
在上图中,块中有两个数字为2的块,它是数字叠加的结果,围绕着雷的区域重合了,重合的区域块的数字相加,该块的数字就会变成相加后的数字。
本博文的例子扫雷的规则
玩家需要把所有的空白块点开,留下玩家认为有雷的块,当所剩余的块数和雷的数量相等时,玩家胜利。如果在此之前,点到有雷的方块,玩家失败。
游戏的算法和数据结构
空白块展开算法
空白块的展开几乎是扫雷游戏的核心了。上面说到,扫雷游戏时,点中空白块,游戏的地图块就会展开,我们可以观察到:空白块是一层一层展开的,所以,地图展开算法我们就用广度优先搜索。也许有人会问:可以用深度优先搜索算法吗?答案是可以的,但是如果在这里用的话,效率会比广度优先搜索算法效率低。
2.2 扫雷的数据结构
(1)方向数组
int[][] dir={
{-1,1},//左上角
{0,1},//正上
{1,1},//右上角
{-1,0},//正左
{1,0},//正右
{-1,-1},//左下角
{0,-1},//正下
{1,-1}//右下角
方向数组在展开空白块的时候回用到,因为广度优先遍历就是在地图中朝各个方向走。
(2)Tile类
该类表示游戏中的“块”,我们给它声明三个成员。
value存储该块的值。-1表示雷块;0表示空白块;&0代表数字块。
flag存储该雷是否被玩家标记(在本例子中无作用,保留,方便扩展)。
open存储该块是否被用户点开过。
(3)Tile数组
Tile数组代表块的集合,及游戏的地图,存储着游戏的主要数据。
(3)Point类
Point类代表“位置”,声明Point类方便我们在地图中生成随机位置的雷。Point类还要重写hashCode和equals方法,为了比较位置与位置是否相同。
(4)Mine类
对上面的数据结构的封装。
Mine构造函数:对游戏地图的参数设置,比如绘制的位置,绘制的大小,块的大小,生成的雷数等。
init()方法:清空并初始化游戏地图。
create(Point p)方法:在地图中随机生成雷的位置,并产生数字。参数p是不产生雷的位置,p点可以传入用户第一次点击时的位置。生成随机位置的雷比较快速的办法是:先把地图中除p位置外所有的位置加入到链表中,然后生成0到链表大小-1之间的随机数,根据生成的随机数在链表中取元素,取完元素就把该位置从链表中移除,并把Tile数组中该位置的Tile的value设为-1。重复执行以上操作,直到生成的雷个数满足要求。产生数字的办法:遍历Tile数组,遇到雷就将他身边的八个的位置的value值加1,如果八个位置中有雷,或者该位置不存在,不执行任何操作。
open(Point p,boolean isFirst)方法:p代表点开某个位置的块,即Tile数组的索引。isFirst传入是否是第一次点击屏幕。该方法要对是不是第一次点击而作不同的操作,当玩家第一次点击块时,调用create函数生成地图。否则就进行展开地图等操作。
(5)MainView类
视图类,负责绘图和操作Mine对象。
package com.woc.
import android.graphics.C
import android.graphics.C
import android.graphics.P
import android.graphics.P
import android.graphics.RectF;
import java.util.HashS
import java.util.I
import java.util.LinkedL
import java.util.L
import java.util.Q
import java.util.R
import java.util.S
* Created by zyw on .
public class Mine {
//地图的在屏幕上的坐标点
//地图的在屏幕上的坐标点
int mapC//矩阵宽
int mapR//矩阵高
public static short EMPTY=0;//空
public static short MINE=-1;//雷
public Tile[][]//地图矩阵
int tileW//块宽
Paint textP
private Paint bmpP
Paint tileP
Paint rectP
Paint mineP
private Random rd=new Random();
int mapW//绘图区宽
public int mapH//绘图区高
public boolean isDrawAllMine=//标记是否画雷
int[][] dir={
{-1,1},//左上角
{0,1},//正上
{1,1},//右上角
{-1,0},//正左
{1,0},//正右
{-1,-1},//左下角
{0,-1},//正下
{1,-1}//右下角
};//表示八个方向
class Tile{
public Tile()
this.value=0;
this.flag=
this.open=
public static class Point{
public Point(int x,int y)
public int hashCode() {
// TODO Auto-generated method stub
return 2*x+y;
public boolean equals(Object obj) {
// TODO Auto-generated method stub
return this.hashCode()==((Point)(obj)).hashCode();
}//表示每个雷块
public Mine(int x, int y, int mapCol, int mapRow, int mineNum, int tileWidth)
this.mapCol = mapC
this.mapRow = mapR
this.mineNum=mineN
this.tileWidth=tileW
mapWidth=mapCol*tileW
mapHeight=mapRow*tileW
textPaint=new Paint();
textPaint.setAntiAlias(true);
textPaint.setTextSize(MainActivity.W/10);
textPaint.setColor(Color.RED);
bmpPaint=new Paint();
bmpPaint.setAntiAlias(true);
bmpPaint.setColor(Color.DKGRAY);
tilePaint =new Paint();
tilePaint.setAntiAlias(true);
tilePaint.setColor(0xff1faeff);
minePaint =new Paint();
minePaint.setAntiAlias(true);
minePaint.setColor(0xffff981d);
rectPaint =new Paint();
rectPaint.setAntiAlias(true);
rectPaint.setColor(0xff000000);
rectPaint.setStyle(Paint.Style.STROKE);
tile=new Tile[mapRow][mapCol];
* 初始化地图
void init()
for (int i = 0; i& mapR i++)
for (int j = 0; j& mapC j++)
tile[i][j]=new Tile();
tile[i][j].value=EMPTY;
tile[i][j].flag=
tile[i][j].open=
isDrawAllMine=
* @param exception 排除的位置,该位置不生成雷
public void create(Point exception)
List&Point& allPoint=new LinkedList&Point&();
//把所有位置加入链表
for (int i = 0; i& mapR i++)//y
for (int j = 0; j & mapC j++)//x
Point point=new Point(j,i);
if(!point.equals(exception))
allPoint.add(point);
List&Point& minePoint=new LinkedList&Point&();
//随机产生雷
for (int i=0; i& mineN i++)
int idx=rd.nextInt(allPoint.size());
minePoint.add(allPoint.get(idx));
allPoint.remove(idx);//取了之后,从所有集合中移除
//在矩阵中标记雷的位置
for(Iterator&Point& it=minePoint.iterator();it.hasNext();)
Point p=it.next();
tile[p.y][p.x].value=MINE;
//给地图添加数字
for (int i = 0; i& mapR i++)//y
for (int j = 0; j& mapC j++)//x
short t=tile[i][j].
if(t==MINE)
for (int k=0;k&8;k++)
int offsetX=j+dir[k][0],offsetY=i+dir[k][1];
if(offsetX&=0&&offsetX& mapCol &&offsetY&=0&&offsetY& mapRow ) {
if (tile[offsetY][offsetX].value != -1)
tile[offsetY][offsetX].value += 1;
* 打开某个位置
* @param op
* @param isFirst 标记是否是第一次打开
public void open(Point op,boolean isFirst)
if(isFirst)
create(op);
tile[op.y][op.x].open=
if( tile[op.y][op.x].value==-1)
else if( tile[op.y][op.x].value&0)//点中数字块
//广度优先遍历用队列
Queue&Point& qu=new LinkedList&Point&();
//加入第一个点
qu.offer(new Point(op.x,op.y));
//朝8个方向遍历
for (int i=0;i&8;i++)
int offsetX=op.x+dir[i][0],offsetY=op.y+dir[i][1];
//判断越界和是否已访问
boolean isCan=offsetX&=0&&offsetX& mapCol &&offsetY&=0&&offsetY& mapR
if(tile[offsetY][offsetX].value==0 &&!tile[offsetY][offsetX].open) {
qu.offer(new Point(offsetX, offsetY));
else if(tile[offsetY][offsetX].value&0)
tile[offsetY][offsetX].open=
while(qu.size()!=0)
Point p=qu.poll();
tile[p.y][p.x].open=
for (int i=0;i&8;i++)
int offsetX=p.x+dir[i][0],offsetY=p.y+dir[i][1];
//判断越界和是否已访问
boolean isCan=offsetX&=0&&offsetX& mapCol &&offsetY&=0&&offsetY& mapR
if( tile[offsetY][offsetX].value==0&&!tile[offsetY][offsetX].open) {
qu.offer(new Point(offsetX, offsetY));
else if(tile[offsetY][offsetX].value&0)
tile[offsetY][offsetX].open=
* 绘制地图
* @param canvas
void draw(Canvas canvas)
for (int i = 0; i& mapR i++)
for (int j = 0; j& mapC j++)
Tile t=tile[i][j];
if(t.open){
if(t.value&0)
canvas.drawText(t.value+"",x+j*tileWidth,y+i*tileWidth+tileWidth,textPaint);
//标记,备用
if(t.flag)
//画矩形方块
RectF reactF=new RectF(x+j*tileWidth,y+i*tileWidth,x+j*tileWidth+tileWidth,y+i*tileWidth+tileWidth);
canvas.drawRoundRect(reactF,0,0, tilePaint);
//是否画出所有雷
if( isDrawAllMine&&tile[i][j].value==-1) {
canvas.drawCircle((x + j * tileWidth) + tileWidth / 2, (y + i * tileWidth) + tileWidth / 2, tileWidth / 2, bmpPaint);
canvas.drawRect(x,y,x+mapWidth,y+mapHeight, rectPaint);
for (int i = 0; i& mapR i++) {
canvas.drawLine(x,y+i*tileWidth,x+mapWidth,y+i*tileWidth, rectPaint);
for (int i = 0;i & mapC i++) {
canvas.drawLine(x+i*tileWidth,y,x+i*tileWidth,y+mapHeight, rectPaint);
MainView.java
package com.woc.
import android.content.C
import android.content.DialogI
import android.graphics.C
import android.support.v7.app.AlertD
import android.view.MotionE
import android.view.V
* Created by zyw on .
public class MainView extends View {
boolean isFirst=//标记是否是本局第一次点击屏幕
private final int mineNum=10;//产生的雷的个数
final int ROW=15;//要生成的矩阵高
final int COL=8;//要生成的矩阵宽
int TILE_WIDTH=50;//块大小
boolean isFalse=
MainView(Context context)
super(context);
this.context=
TILE_WIDTH=MainActivity.W/10;
mine=new Mine((MainActivity.W-COL*TILE_WIDTH)/2,(MainActivity.H-ROW*TILE_WIDTH)/2,COL,ROW,mineNum,TILE_WIDTH);
mine.init();
}catch (Exception e){
e.printStackTrace();
* 游戏逻辑
public void logic()
int count=0;
for (int i=0;i&mine.mapRi++)
for (int j=0;j&mine.mapCj++)
if(!mine.tile[i][j].open)
//逻辑判断是否胜利
if(count==mineNum)
new AlertDialog.Builder(context)
.setMessage("恭喜你,你找出了所有雷")
.setCancelable(false)
.setPositiveButton("继续", new DialogInterface.OnClickListener() {
public void onClick(DialogInterface dialog, int which) {
mine.init();
invalidate();
.setNegativeButton("退出", new DialogInterface.OnClickListener() {
public void onClick(DialogInterface dialog, int which) {
System.exit(0);
* 刷新View
* @param canvas
protected void onDraw(Canvas canvas) {
mine.draw(canvas);
* 点击屏幕事件
* @param event
public boolean onTouchEvent(MotionEvent event) {
if(event.getAction()==MotionEvent.ACTION_DOWN)
int x=(int)event.getX();
int y=(int)event.getY();
//判断是否点在范围内
if(x&=mine.x&&y&=mine.y&&x&=(mine.mapWidth+mine.x)&&y&=(mine.y+mine.mapHeight))
int idxX=(x-mine.x)/mine.tileW
int idxY=(y-mine.y)/mine.tileW
mine.open(new Mine.Point(idxX,idxY),isFirst);
if(mine.tile[idxY][idxX].value==-1)
mine.isDrawAllMine=
new AlertDialog.Builder(context)
.setCancelable(false)
.setMessage("很遗憾,你踩到雷了!")
.setPositiveButton("继续", new DialogInterface.OnClickListener() {
public void onClick(DialogInterface dialog, int which) {
mine.init();
invalidate();
.setNegativeButton("退出", new DialogInterface.OnClickListener() {
public void onClick(DialogInterface dialog, int which) {
System.exit(0);
if(isFalse)
invalidate();
invalidate();
MainActivity.java
package com.woc.
import android.app.A
import android.content.DialogI
import android.os.B
import android.support.v7.app.AlertD
import android.util.DisplayM
* Created by zyw on .
public class MainActivity extends Activity {
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
DisplayMetrics dm = new DisplayMetrics();
getWindowManager().getDefaultDisplay().getMetrics(dm);
W = dm.widthP//宽度
H = dm.heightP//高度
setContentView(new MainView(this));
new AlertDialog.Builder(this)
.setCancelable(false)
.setTitle("游戏规则")
.setMessage("把你认为不是雷的位置全部点开,只留着有雷的位置,每局游戏有10个雷。\n\n--卧槽工作室")
.setPositiveButton("我知道了",null)
没有更多推荐了,
不良信息举报
举报内容:
【Android】自己动手做个扫雷游戏
举报原因:
原文地址:
原因补充:
最多只允许输入30个字
加入CSDN,享受更精准的内容推荐,与500万程序员共同成长!扫雷的规则是什么?那些数字是不是代表周围有多少颗雷?但是……
划红叉号的地方应该没有雷,这个图片大概是教给你如何排除雷的不符合排布情况
其他答案(共1个回答)
数字周围都有8个方块.数字是几,那么这8个方块里就有多少地雷.你可以推算的方式,确定那里是地雷.有时,也会出现无法推算的情况,你只能撞大运了.你试试吧.
扫雷”概述“扫雷”游戏的目标是尽快找到雷区中的所有地雷,而不许踩到地雷。如果挖开的是地雷,您将输掉游戏。
策略与技巧:
a.如果无法判定某方块是否有雷,请用右键...
首先,你点出来的那个数字它代表的是以这个数为中心的九宫格内的地雷的数目,然后,根据这个,把不是地雷的地方全点开就胜利了。
鼠标的DPI和分辨率不够,换个数值高点的会好很多
或者进入控制面板-鼠标,调整灵活度,调到你满意的速度即可
扫雷是个推理游戏。格子里的数字是说与这个格子相邻的那8个格子里共有几个雷。有些一目了解,而更多的则需要靠判断哪颗是雷。有很多讲究,一时半刻也说不清,附了个图,看...
扫雷玩法在游戏菜单上,单击开局。要启动计时器,请单击游戏区中的任何方块。注意:通过单击即可挖开方块。如果挖开的是地雷,则您输掉游戏。如果方块上出现数字,则表示在...
答:  猴子打造装备
  猴子武器:
  尾火棍:
造梦西游3悟空装备怎么打造 悟空全装备打造方法介绍
  打造材料:20檀木
  如何获得:任务“袭天的妖怪1”
答: 上面地址就是拼图游戏
答: 每一款小游戏它没有一定的反应了什么问题。都是娱乐而已
Copyright &
Corporation, All Rights Reserved
确定举报此问题
举报原因(必选):
广告或垃圾信息
激进时政或意识形态话题
不雅词句或人身攻击
侵犯他人隐私
其它违法和不良信息
报告,这不是个问题
报告原因(必选):
这不是个问题
这个问题分类似乎错了
这个不是我熟悉的地区电脑上的扫雷有什么规律吗_百度知道
电脑上的扫雷有什么规律吗
我有更好的答案
扫雷其实是有规律的,但这所谓的规律其实就是一些经验的总结,某些时候只能靠运气。
采纳率:53%
来自团队:
没有什么规律
为您推荐:
其他类似问题
扫雷的相关知识
换一换
回答问题,赢新手礼包
个人、企业类
违法有害信息,请在下方选择后提交
色情、暴力
我们会通过消息、邮箱等方式尽快将举报结果通知您。右面是扫雷游戏,规则:点开的方格中的数是几,就表示周围的八个方格里有几个雷,请把所有的雷找出来。_百度知道
右面是扫雷游戏,规则:点开的方格中的数是几,就表示周围的八个方格里有几个雷,请把所有的雷找出来。
我有更好的答案
采纳率:49%
来自团队:
为您推荐:
其他类似问题
换一换
回答问题,赢新手礼包
个人、企业类
违法有害信息,请在下方选择后提交
色情、暴力
我们会通过消息、邮箱等方式尽快将举报结果通知您。

我要回帖

更多关于 扫雷游戏下载 的文章

 

随机推荐