背景方块类
/**
* 方块
*/
class Block {
RectF rect;
int num;
boolean isOpen;
boolean isBomb;
int line, row;
boolean isMarked;
public Block(int left, int top, int right, int bottom, int line, int row) {
this.rect = new RectF(left, top, right, bottom);
this.line = line;
this.row = row;
}
private Rect textRect;
private int x, y;
void draw(Canvas canvas, Paint paint) {
if (isOpen) {
if (isBomb) {
paint.setColor(Color.RED);
} else {
paint.setColor(0x55333333);
}
canvas.drawRoundRect(rect,10,10, paint);
if (num > 0) {
if (null == textRect) {
textRect = new Rect();
paint.getTextBounds(String.valueOf(num), 0, 1, textRect);
x = (int) (rect.centerX() - textRect.centerX());
y = (int) (rect.centerY() - textRect.centerY());
}
paint.setColor(Color.RED);
canvas.drawText(String.valueOf(num), x, y, paint);
}
} else {
if (isMarked) {
paint.setColor(0xffffff33);
} else {
paint.setColor(0xff333333);
}
canvas.drawRoundRect(rect,10,10, paint);
}
}
}
游戏界面
public class GameView extends View {
private int line, row;
private int screenWidth;
private int blockWidth;
private static final int SPACING = 2;
private Block[][] blocks;
private Paint paint;
private boolean isGameOver;
public GameView(Context context) {
super(context);
init(context);
}
public GameView(Context context, AttributeSet attrs) {
super(context, attrs);
init(context);
}
/**
* 画出扫雷的每个方块铺满屏幕
* @param context
*/
private void init(Context context) {
line = 9;
row = 9;
Point p = new Point();
WindowManager wm = (WindowManager) context.getSystemService(Context.WINDOW_SERVICE);
wm.getDefaultDisplay().getSize(p);
screenWidth = p.x;
blockWidth = (screenWidth - (row - 1) * SPACING) / row;
blocks = new Block[line][row];
for (int i = 0; i < line; i++) {
for (int j = 0; j < row; j++) {
int left = j * blockWidth + j * SPACING;
int top = i * blockWidth + i * SPACING;
blocks[i][j] = new Block(left, top, left + blockWidth, top + blockWidth, i, j);
}
}
paint = new Paint();
paint.setAntiAlias(true);
paint.setTextSize(blockWidth / 2);
paint.setColor(Color.BLUE);
initBomb();
}
/**
* 初始化雷
*/
private void initBomb() {
LinkedList<Integer> nums = new LinkedList<>();
int size = line * row;
for (int i = 0; i < size; i++) {
nums.add(i);
}
Random r = new Random();
int bombNum = line + 1;
for (int i = 0; i < bombNum; i++) {
int index = r.nextInt(nums.size());
int num = nums.remove(index);
int i1 = num / row;
int j1 = num % row;
blocks[i1][j1].isBomb = true;
if (i1 - 1 >= 0) {
blocks[i1 - 1][j1].num++;
if (j1 - 1 >= 0) {
blocks[i1 - 1][j1 - 1].num++;
}
if (j1 + 1 < row) {
blocks[i1 - 1][j1 + 1].num++;
}
}
if (j1 - 1 >= 0) {
blocks[i1][j1 - 1].num++;
}
if (j1 + 1 < row) {
blocks[i1][j1 + 1].num++;
}
if (i1 + 1 < line) {
if (j1 - 1 >= 0) {
blocks[i1 + 1][j1 - 1].num++;
}
blocks[i1 + 1][j1].num++;
if (j1 + 1 < row) {
blocks[i1 + 1][j1 + 1].num++;
}
}
}
}
/**
* 绘画方法
* @param canvas
*/
@Override
protected void onDraw(Canvas canvas) {
for (int i = 0; i < line; i++) {
for (int j = 0; j < row; j++) {
if (isGameOver) {
blocks[i][j].isOpen = true;
}
blocks[i][j].draw(canvas, paint);
}
}
}
private long downTime;
private LinkedList<Block> openList = new LinkedList<>();
@Override
public boolean onTouchEvent(MotionEvent event) {
int action = event.getAction();
switch (action) {
case MotionEvent.ACTION_DOWN:
downTime = System.currentTimeMillis();
break;
case MotionEvent.ACTION_UP:
long current = System.currentTimeMillis();
long cTime = current - downTime;
int x = (int) event.getX();
int y = (int) event.getY();
for (int i = 0; i < line; i++) {
for (int j = 0; j < row; j++) {
if (blocks[i][j].rect.contains(x, y)) {
if (cTime <= 400) {
if (blocks[i][j].isBomb) {
isGameOver = true;
invalidate();
return true;
}
if (!blocks[i][j].isOpen && !blocks[i][j].isMarked) {
blocks[i][j].isOpen = true;
if (blocks[i][j].num == 0) {
openList.add(blocks[i][j]);
while (!openList.isEmpty()) {
openSround(openList.removeFirst());
}
}
invalidate();
}
} else {
if (!blocks[i][j].isOpen) {
if (!blocks[i][j].isMarked) {
blocks[i][j].isMarked = true;
} else {
blocks[i][j].isMarked = false;
}
invalidate();
}
}
return true;
}
}
}
break;
}
return true;
}
/**
* 打开周围的块
*
* @param b
*/
private void openSround(Block b) {
int i1 = b.line;
int j1 = b.row;
if (i1 - 1 >= 0) {
openBlock(blocks[i1 - 1][j1]);
if (j1 - 1 >= 0) {
openBlock(blocks[i1 - 1][j1 - 1]);
}
if (j1 + 1 < row) {
openBlock(blocks[i1 - 1][j1 + 1]);
}
}
if (j1 - 1 >= 0) {
openBlock(blocks[i1][j1 - 1]);
}
if (j1 + 1 < row) {
openBlock(blocks[i1][j1 + 1]);
}
if (i1 + 1 < line) {
if (j1 - 1 >= 0) {
openBlock(blocks[i1 + 1][j1 - 1]);
}
openBlock(blocks[i1 + 1][j1]);
if (j1 + 1 < row) {
openBlock(blocks[i1 + 1][j1 + 1]);
}
}
}
private void openBlock(Block b) {
if (!b.isOpen && !b.isMarked) {
b.isOpen = true;
if (b.num == 0) {
openList.add(b);
}
}
}
}
MainActivity类
public class MainActivity extends AppCompatActivity {
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
GameView gView = new GameView(this);
setContentView(gView);
}
}
![扫雷](https://img-blog.csdn.net/20171019200147157?watermark/2/text/aHR0cDovL2Jsb2cuY3Nkbi5uZXQvcXFfMzU5ODAwMDU=/font/5a6L5L2T/fontsize/400/fill/I0JBQkFCMA==/dissolve/70/gravity/SouthEast)