Loading... <video src="http://wp.bdmcom.cn/bdmtp/bandicam%202021-06-13%2018-40-06-496.mp4" style="background-image:url(http://);background-size: cover;"></video> ### 源代码及媒体文件下载链接: http://wp.bdmcom.cn/bdmtp/saolei.zip ```cpp #include <stdio.h> #include <stdlib.h> #include <time.h> #include <graphics.h> #pragma comment (lib,"winmm.lib") #define ROW 10 //行 #define COL 10 //行 #define NUM 10 //雷的个数 #define SIZE 50 int count = 0;//点开的个数 int map[ROW + 2][COL + 2];//加2行2列是使数组范围扩大,使其不越界 IMAGE img[12]; //初始化函数 void GameInit() { //随机数种子 srand((unsigned int)time(NULL));//建议这么写随机数 //数组赋初值为0 for (int i = 0; i < ROW+2; i++) { for (int j = 0; j < COL+2; j++) { map[i][j] = 0; } } //布雷 -1表示雷 NULL个雷 int n = 0; while (n < NUM) { //随机得到行和列 int r = rand() % ROW + 1; int c = rand() % COL + 1; if (map[r][c] == 0) { map[r][c] = -1; n++; } } //点击显示的周围的雷数 for (int i = 1; i < ROW+1; i++) { for (int j = 1; j < COL+1; j++) { if (map[i][j] != -1) { for (int m = i - 1; m <= i + 1; m++)//遍历九宫格 { for (int n = j - 1; n <= j + 1; n++) { if (map[m][n] == -1) { map[i][j]++; } } } } } } for (int i = 1; i < ROW+1; i++) { for (int j = 1; j < COL+1; j++) { map[i][j] += 20; } } } //绘制函数 打印二维数组中的所有元素 void GameDraw() { for (int i = 1; i <= ROW; i++) { for (int j = 1; j <= COL; j++) { int x = (j - 1) * SIZE;//特别注意鼠标y与x,容易写错 int y = (i - 1) * SIZE;//特别注意鼠标y与x,容易写错 printf("%4d", map[i][j]); if (map[i][j] == -1) { putimage (x, y, &img[9]);//雷 } else if (map[i][j] >= 0 && map[i][j] <= 8) { putimage(x, y, &img[map[i][j]]); //数字 } else if (map[i][j] >= 19 && map[i][j] <= 28) { putimage(x, y, &img[10]);//空白图片 } else if (map[i][j] > 30) { //标记图片 putimage(x, y, &img[11]); } } printf("\n"); } } void OpenZero(int r, int c) { //先翻开0 map[r][c] -= 20; count++; for (int m = r - 1; m <= r + 1; m++) { for (int n = c - 1; n < c + 1; n++) { if (m >= 1 && m <= ROW && n >= 1 && n <= COL)//保证游戏区内容 { if (map[m][n] >= 19 && map[m][n] <= 28) { if (map[m][n] != 20) { map[m][n] -= 20; //打开不为0的方格并且也不为雷 count++; } else { OpenZero(m, n); } } } } } } //玩游戏函数 int PlayGame() { //定义一个鼠标消息, 初始化为0 MOUSEMSG msg = { 0 }; int r, c; while (1) { msg = GetMouseMsg(); switch (msg.uMsg)//鼠标消息的内容 { case WM_LBUTTONDOWN://左键,翻开一个空白图片 r = msg.y / SIZE + 1;//特别注意鼠标y与x,容易写错 c = msg.x / SIZE + 1; //特别注意鼠标y与x,容易写错 if (map[r][c] >= 19 && map[r][c] <= 28) { if (map[r][c] == 20)//如果点到是0 { OpenZero(r, c); } else { map[r][c] -= 20; count++;//每点开一次,count加1, } } return map[r][c]; break; case WM_RBUTTONDOWN://右键, 标记雷, 标记一个空白图片,取消一个标记图片 r = msg.x / SIZE + 1; c = msg.y / SIZE + 1; if (map[r][c] >= 19 && map[r][c] <= 28) { map[r][c] += 50; } else if (map[r][c] > 30) { map[r][c] -= 50; } return map[r][c]; break; } } } int main() { HWND hwnd = initgraph(ROW * SIZE, COL * SIZE, SHOWCONSOLE); mciSendString(L"open music.mp3 alias music", 0, 0, 0); mciSendString(L"play music", 0, 0, 0); loadimage(&img[0], L"0.jpg", SIZE, SIZE); loadimage(&img[1], L"1.jpg", SIZE, SIZE); loadimage(&img[2], L"2.jpg", SIZE, SIZE); loadimage(&img[3], L"3.jpg", SIZE, SIZE); loadimage(&img[4], L"4.jpg", SIZE, SIZE); loadimage(&img[5], L"5.jpg", SIZE, SIZE); loadimage(&img[6], L"6.jpg", SIZE, SIZE); loadimage(&img[7], L"7.jpg", SIZE, SIZE); loadimage(&img[8], L"8.jpg", SIZE, SIZE); loadimage(&img[9], L"9.jpg", SIZE, SIZE); loadimage(&img[10], L"10.jpg", SIZE, SIZE); loadimage(&img[11], L"11.jpg", SIZE, SIZE); GameInit();//调用初始化函数 while (1) { GameDraw(); //调用打印二维数组函数 //PlayGame();调用玩游戏, 鼠标消息函数 if (PlayGame() == -1) { GameDraw(); MessageBox(hwnd, L"你失败了,没有本当迷帅! ", L"", MB_OK); break; } if (ROW * COL - NUM == count) { GameDraw(); MessageBox(hwnd, L"本当迷最帅! ", L"", MB_OK); break; } } closegraph();//释放由图形系统分配出来的所有内存 return 0; } ``` ### 游戏的规则: 扫雷就是要把所有非地雷的格子揭开即胜利;踩到地雷格子就算失败; 使用鼠标左键随机点击一个方格,方格即被打开并显示出方格中的数字; 方格中数字则表示其周围的8个方格隐藏了几颗雷; 如果点开的格子为空白格,即其周围有0颗雷,则其周围格子自动打开; 使用鼠标右键,用于标记雷。 ### 实现思路: 1. 这个游戏的实质其实就是一个二维数组,利用二维数组中的值来实现游戏规则, 2. 为了是游戏图像风格化,我们引入了`#include <graphics.h>`头文件,这个头文件C语言函数库中并不自带,所以我们得去先去下载函数文件 , 下载地址:https://easyx.cn/download(注:我是用vs2019写的,下载的这个其实是一个exe文件,打开后按照提示,它会自动帮你安装进vs2019中去) 3. 其中核心代码就是二维数组扩域,行和列都在原本宏定义行和列的基础上加2,为什么要加上2呢?原因是:为了是在边缘的方格数字正确,方格的数字是按照方格周围的8个方格,雷的个数进行统计的,如果不扩域的话,数组就越界了,而越界得到方格周围地数字是不确定的(利用-1这个数字表示雷) 4. 雷,肯定是随机的,所以我们得用到随机数,要使用随机数我们必须包含两个头文件,一个是:`#include <stdlib.h>`,另一个是`#include <time.h>`,然后初始化随机数种子:`srand((unsigned int)time(NULL))`;建议这么写初始化随机数种子,使用随机数`rand() % ROW;`代表随机取`0~ROW`之间数字,如果这样写`rand() % ROW+COL;`代表随机取`COL~ROW之间的数字`; 5. 初始化遍历数组,首先使数组所以元数初始化为0;然后利用随机数是随机得到的行和列对应数组的值为-1,接着再遍历数组,如果遍历得到行和列的值不为1,再遍历9宫格(遍历方法:范围为:`i-1~i+1`)如果找到某数为-1则遍历得到的行和列的数组的值加1; 6. 接着我们就用图片替代数值,具体操作:首先在主函数写上`HWND hwnd = initgraph(ROW * SIZE, COL * SIZE, SHOWCONSOLE);`创建图形窗口(窗口大小:`长=行数*图片的长`;`宽=列数*图片的宽`),并且在控制台显示,后面利用`loadimage(&img[0], L"0.jpg", SIZE, SIZE);`从资源文件获取图像;利用`putimage(x, y, &img[1]);`在当前设备上绘制指定图像。 最后修改:2021 年 06 月 13 日 © 允许规范转载 打赏 赞赏作者 支付宝微信 赞 1 如果文章有用,请随意打赏。