以下为我的资源用法
1 资源:在我的资源中下载(C/C++扫雷小游戏(附视频+代码开源)(内含全部资源))
2 下载 visual studio
3 安装easyx文件
4 运行
以下为此项目解析:
制作过程主要分为以下几个函数:
音乐函数:
//加载音乐
void BGM()//播放音乐
{
//打开音乐,播放音乐,alias取别名,函数内参数不用管
mciSendString("open CHINA-2.mp3 alias bgm", 0, 0, 0);
//将音乐放入当前文件夹
//用bgm代替CHINA-2
mciSendString("play bgm repeat", 0, 0, 0);
//repeat重复播放;
//还可以关闭
}
数据函数:
void initMap(int map[row][col])
{
//把map清理
memset(map, 0, row * col * sizeof(int));
//地图埋雷为10,用-1表示
for (int i = 0; i < 10;)
{
int r = rand() % row;
//行
int c = rand() % col;
//列
//在10内的随机数
//解决雷重复
if (map[r][c] == 0)
{
map[r][c] = -1;
i++;
}
}
//printf("777");
//正确定义了才加一
//显示雷周围的数字
for (int i = 0; i < row; i++)
{
for (int k = 0; k < col; k++)
{
//扫描地图
if (map[i][k] == -1)
{
//雷周围的九宫格
for (int r = i - 1; r <= i + 1; r++)
{
for (int c = k - 1; c <= k + 1; c++)
{
//数组越界问题
if ((r >= 0 && r < row && c >= 0 && c < col) && map[r][c] != -1)
{
map[r][c] ++;
}
}
}
}
}
}
//printf("455");
//把所有的格子遮住,给每个格子加密,比如都加30
for (int i = 0; i < row; i++)
{
for (int k = 0; k < col; k++)
{
map[i][k] += 30;
//printf("678");
}
}
}
贴图函数:
//转换
void drawMap(int map[row][col], IMAGE img[12])
{
//printf("22223");
//把数组里面的数据转化成对应的图片
/
for (int i = 0; i < row; i++)
{
for (int k = 0; k < col; k++)
{
//空白格子和数字
if (map[i][k] >= 0 && map[i][k] <= 8)
{
//显示图片
putimage(k * IMGW, i * IMGW, img + map[i][k]);
//printf("111");
}
//雷
else if (map[i][k] == -1)
{
//对应loadimage
putimage(k * IMGW, i * IMGW, img + 9);
//printf("222");
}
//初始化
else if (map[i][k] >= 29 && map[i][k] <= 38)
{
putimage(k * IMGW, i * IMGW, img+10);
//printf("333");
}
else if (map[i][k] >= 19&&map[i][k]<=28)
{
putimage(k * IMGW, i * IMGW, img + 11);
}
}
}
}
鼠标控制函数:
//鼠标
void mouseEvent(int map[row][col])
{
//定义消息结构体
ExMessage msg;
//msg = getmessage(EM_MOUSE);
//如果有消息就返回真,给msg设置值
if (peekmessage(&msg, EM_MOUSE))
{
//找到鼠标位置
int c = msg.x / IMGW;
//列
int r = msg.y / IMGW;
//行
if (msg.message == WM_LBUTTONDOWN)
//鼠标左键按下
{
//回复原有的图标
if (map[r][c] >= 29 && map[r][c] <= 38)
{
map[r][c] -= 30;
//解除加密
openNull(map, r, c);
//空白格子
judge(map, r, c);
//是否结束
showMap(map);
//展示地图
printf("\n%d\n", z);
//输出标记次数
}
//被标记后依然可以点出
if (map[r][c] >= 19 && map[r][c] <= 28)
{
map[r][c] -= 20;
//解除标记
//增加标记次数
z++;
openNull(map, r, c);
//空白格子
judge(map, r, c);
//是否结束
showMap(map);
//展示地图
printf("\n%d\n", z);
}
}
if (z > 0)
{
if (msg.message == WM_RBUTTONDOWN)
//鼠标右键键按下
{
//回复原有的图标
if (map[r][c] >= 29 && map[r][c] <= 38)
{
z--;
//正确减一个标记
map[r][c] -= 10;
//标记
judge(map, r, c);
//是否结束
showMap(map);
//展示地图
printf("\n%d\n", z);
//输出次数
}
}
}
//利用右键双击并不能起到作用
// WM_RBUTTONDBLCLK
//利用中键取消标记
if (msg.message == WM_MBUTTONDOWN)
{
if (z < 10)
{
if (map[r][c] >= 19 && map[r][c] <= 28)
{
//中健信息体
z++;
//增加标记次数
map[r][c] += 10;
//回复初始图片
showMap(map);
//展示图片
printf("\n%d\n", z);
//输出次数
}
}
}
}
//printf("999");
/
}
空白问题函数:
//空白
void openNull(int map[row][col], int o, int l)
{
//判断点击是否为空白
if (map[o][l] == 0)
{
//展开此九宫格内的数字
for (int i = o - 1; i <= o + 1; i++)
{
for (int k = l - 1; k <= l + 1; k++)
{
//解决越界
if ((i >= 0 && i < row && k >= 0 && k < col) && map[i][k] >= 29 && map[i][k] <= 38)
{
map[i][k] -= 30;
//每个都要判断,使用递归
openNull(map, i, k);
}
}
}
}
}
雷函数:
//结束
void judge(int map[row][col], int o, int l)
{
//用于判断是否赢
int p=0;
//
//如果点到雷,游戏结束,其他类全部显示
if (map[o][l] == -1)
{
for (int i = 0; i < row; i++)
{
for (int k = 0; k < col; k++)
{
if (map[i][k] == 29||map[i][k]==19)
{
map[i][k] = -1;
}
}
}
//结束
isOver = true;
}
//赢了
//扫描全局,利用打开的进行判断
for (int i = 0; i < row; i++)
{
for (int k = 0; k < col; k++)
{
if (map[i][k] <= 10)
{
p++;
//统计解开的个数
}
}
}
//打开的超过90个,结束
//为90个还没结束的话,剩下10个必为雷,所以游戏结束了
if (p >= 90)
{
//结束框
isOver = true;
}
int ck = 0;
for (int i = 0; i < row; i++)
{
for (int k = 0; k < col; k++)
{
if (map[i][k] == 19)
{
ck++;
//统计解开的个数
}
}
}
if (ck == 10)
{
isOver = true;
}
//printf("01928");
}
显示地图函数:
//显示地图
void showMap(int map[row][col])
{
//扫描
for (int i = 0; i < row; i++)
{
for (int k = 0; k < col; k++)
{
//显示数据
printf("%2d", map[i][k]);
}
printf("\n");
}
printf("\n");
}
效果:
地图:
点击(鼠标左键):
标记(鼠标右键):
取消标记(鼠标中键):
踩雷:
视频:
扫雷视频