前言
之前写过一个C++的贪吃蛇,今天写一个扫雷。可能网上已经有很多相关的源代码了,但是我这个是通过自己的思考,不是简单的扒别人成功的代码进行小修改得到的结果。希望我的分享能够对你的项目有启示。
原理
每一个数字表示的意思就是在这个数字的周围的8个位置中有几个炸弹。我们可以把这个所谓的棋盘看成三层。
- 数字层:最下面被覆盖的部分,生成炸弹和对应位置的数字,采用-1表示炸弹,其余位置则用0-8分表示该位置周围炸弹的个数;
- 操作层:记录已经被选中的位置,0表示未被选中,1表示已经被选中,如果操作层的数字由0变为1且数字层对应位置为-1时,则认为踩到炸弹了,游戏结束;
- 显示层:对于显示层实际是虚拟的一层结构,根据下面的操作层和数字层的结果进行显示,对于操作层为0表示未被选中则显示为
#
,对于操作层为1表示已经被选中了,而对应数字层为0则显示(空格)
,对于数字层不为0的情况下则显示对应的数字。
对于数字层我们首先通过随机数的方式生成所需要的炸弹个数。然后对于每个不是炸弹的位置进行遍历,求得对应的数字。
这样就做成了数字层,对于操作层相对比较简答,就是每一次操作就将对应位置的元素由0变为1,表示该位置已经被处理。如果该位置对应的数字层的元素为炸弹则游戏结束。在操作层中有一个计数器result
,这个计数器用于表示当前暂未操作的位置个数,如果这个个数等于炸弹的个数则认为游戏结束,成功!!
细节讲解
数字层
类定义
#pragma once
#define SIZE 10//表示棋盘大小
#define NUMBER 10//表示炸弹个数
#include<array>
#include<iostream>
using namespace std;
class base
{
private:
array<array<int,SIZE>,SIZE> down;
public:
base();
int getValue(int x, int y);//用于返回数字层的元素,作为操作层的接口
void init();
void product();//生成标识数字
};
具体实现:
#include "base.h"
base::base() {
for (int i = 0; i < SIZE; i++)
for (int j = 0; j < SIZE; j++)
down[i][j] = 0;
product();
}
int base::getValue(int x, int y) {
return down[x][y];
}
void base::init() {
for (int i = 0; i < NUMBER; i++)
{
int rand_x = rand() % SIZE;
int rand_y = rand() % SIZE;
while (down[rand_x][rand_y] == -1)
{
rand_x = rand</