#include#include #include #include #include #pragma comment(lib,"winmm.lib") #define ROW 10//行的常量 #define COL 10//列的常量 #define MineNum 10//雷的数量 #define Width 400 //宽度 #define Hight 400 //高度 #define ImgSize 40 //图片的尺寸 IMAGE imgs[12]; bool isfirst = true;//是不是 第一次进来 //设置地图的雷数 void init(int map[][COL]); //打印地图 void drawmap(int map[][COL]); //周围+1 void judge(int map[][COL]); //加载资源 void loadResource(); //绘制 void draw(int map[][COL]); //鼠标判断 void Mouse_judge(int map[][COL]); //鼠标操作 void Mouse_msg(ExMessage* msg, int map[][COL]); //点击空白格子旁边炸开 row col 是当前点击的格子的下标 void boomBlank(int map[][COL], int row, int col); //游戏结束判断 int game_judge(int map[][COL], int row, int col); int main() { int map[ROW][COL] = {0}; initgraph(Width, Hight,1); //播放开始音乐 mciSendString("open ./image/star.mp3 alias bgm1", NULL, 0, NULL); mciSendString("play bgm1", NULL, 0, NULL); init(map); draw(map); while (1) { Mouse_judge(map); draw(map); } return 0; } //基础设置 //设置地图的雷数 void init(int map[][COL]) { loadResource(); //随机数种子 srand((unsigned int)time(NULL)); //把map全部实话为0 memset(map, 0, sizeof(int)*ROW*COL); //随机设置十个雷 用-1表示 for (int i = 0; i < MineNum;) { //数组的有效下标[0],[9] int r = rand() % MineNum; int c = rand() % MineNum; if (map[r][c] == 0) { map[r][c] = -1; ++i; } } judge(map);//统计雷数 //加密格子 for (int i = 0; i < ROW; i++) { for (int k = 0; k < COL; k++) { map[i][k] += 20; } } } //打印地图 void drawmap(int map[][COL]) { for (int i = 0; i < ROW; i++) { for (int k = 0; k < COL; k++) { printf("%3d",map[i][k]); } printf("n"); } } //周围+1 void judge(int map[][COL]) { for (int i = 0; i < ROW; i++) { for (int k = 0; k < COL; k++) { if (map[i][k] == -1) { if (k - 1 >= 0 && map[i][k - 1] != -1)map[i][k - 1] += 1;//左 if (i - 1 >= 0 && map[i - 1][k] != -1)map[i - 1][k] += 1;//上 if (k + 1 <= 9 && map[i][k + 1] != -1)map[i][k + 1] += 1;//右 if (i + 1 <= 9 && map[i + 1][k] != -1)map[i + 1][k] += 1;//下 if (k - 1 >= 0 && i - 1 >= 0 && map[i - 1][k - 1] != -1)map[i - 1][k - 1] += 1;//左上 if (k + 1 <= 9 && i - 1 >= 0 && map[i - 1][k + 1] != -1)map[i - 1][k + 1] += 1;//右上 if (k - 1 >= 0 && i + 1 <= 9 && map[i + 1][k - 1] != -1)map[i + 1][k - 1] += 1;//左下 if (k + 1 <= 9 && i + 1 <= 9 && map[i + 1][k + 1] != -1)map[i + 1][k + 1] += 1;//右下 } } } } //绘图设置 //加载资源 void loadResource() { for (int i = 0; i < 12; i++) { char imgcount[50] = { 0 }; sprintf_s(imgcount, "./image/%d.jpg", i); loadimage(&imgs[i], imgcount, ImgSize, ImgSize); } } //绘制 void draw(int map[][COL]) { //贴图,根据map里面的数据,贴对应的图片 for (int i = 0; i < ROW; i++) { for (int k = 0; k < COL; k++) { int index = map[i][k]; if (map[i][k] >= 0 && map[i][k] <= 8) { putimage(k * ImgSize, i * ImgSize, &imgs[index]); } else if (map[i][k] == -1) { putimage(k * ImgSize, i * ImgSize, &imgs[9]); } else if (map[i][k] >= 19 && map[i][k] <= 28) { putimage(k * ImgSize, i * ImgSize, &imgs[10]); } else if (map[i][k] >= 39) { putimage(k * ImgSize, i * ImgSize, &imgs[11]); } } } } //操作设置 //鼠标判断 void Mouse_judge(int map[][COL]) { //处理消息 ExMessage msg; while (peekmessage(&msg, EM_MOUSE)) { switch (msg.message) { case WM_LBUTTONDOWN: //鼠标左键点击 case WM_RBUTTONDOWN: //鼠标右键点击 Mouse_msg(&msg, map); int ret = game_judge(map, msg.y / ImgSize, msg.x / ImgSize); if (ret == -1) { draw(map); int select = MessageBox(GetHWnd(), "你这么牛怎么输了呢?", "low B!", MB_OKCANCEL); if (select == IDOK)//再来一把 { //重新初始化 init(map); } else exit(0); } else if (ret == 1) { } break; } } } //鼠标操作 void Mouse_msg(ExMessage* msg,int map[][COL]) { //先根据鼠标点击的坐标求出对应的数组的下标 int c = msg->x/ImgSize; //行 int r =msg->y/ImgSize; //列 //左键打开格子 if (msg->message == WM_LBUTTONDOWN) { if(map[r][c]>=19&&map[r][c]<=28){ map[r][c] -= 20; //只能播放wav格式的 PlaySound("./image/click.wav ", NULL, SND_ASYNC | SND_FILENAME); //mciSendString("open ./image/star.mp3 alias bgm1", NULL, 0, NULL); //mciSendString("play bgm1", NULL, 0, NULL); system("cls"); drawmap(map);//打印地图 boomBlank(map, msg->y/ImgSize, msg->x/ImgSize); isfirst = true; } } //右键标记格子 else if (msg->message == WM_RBUTTONDOWN) { //是否能够标记:如果没有打开 if (map[r][c] >= 19 && map[r][c] <= 28) { PlaySound("./image/rightClick.wav ", NULL, SND_ASYNC | SND_FILENAME); map[r][c] += 20; } else if (map[r][c] >= 39) { map[r][c] -= 20; } } } //点击空白格子旁边炸开 row col 是当前点击的格子的下标 void boomBlank(int map[][COL], int row, int col) { //判断row col是不是空白格子 if (map[row][col] == 0) { for (int i = row - 1; i <= row + 1; i++) { for (int k = col - 1; k <= col + 1; k++) { if ((i >= 0 && i < ROW && k >= 0 && k <= COL) //没越界 &&map[i][k]>=19&&map[i][k]<=28) //没打开 { if (isfirst) { PlaySound("./image/search.wav ", NULL, SND_ASYNC | SND_FILENAME); isfirst = false; } map[i][k] -= 20; boomBlank(map, i, k); } } } } } //游戏结束判断 int game_judge(int map[][COL],int row,int col) { if (map[row][col] == 19 || map[row][col] == -1) { return -1; } //点完格子赢了,需要知道点开了100-10个格子 int count = 0; for (int i = 0; i < ROW; i++) { for (int k = 0; k < COL; k++) { //统计打开的格子 if (map[i][k] >= 0 && map[i][k] <= 8) count++; } } if (ROW*COL - MineNum == count ) { return 1; } return 0; }
扫雷源码+资源下载地址:https://wwc.lanzouo.com/iYQdfyoq16b
easyx图形库下载地址:https://easyx.cn/



