C语言基于easyx.h做的一个图形界面版的扫雷
2023-04-14
先看看效果吧!
先看看效果,我觉得还是很好看的!
源代码如下:
#include <stdio.h> #include <graphics.h> #include <windows.h> #include <time.h> #define f 9 #define boom 10 //获取某点附近雷数量 int click(char * map, int x1, int y1); //判定是否可以空白展开 int getzero(char * map, int x1, int y1); //输出副地图 图片 void coutmap(char * map1); //输出副地图 仅字符 void outmap(char * map1); //点到雷结束 void gameovermap(char * map1); //输出未修改地图 void beganmap(char * map1); //判断游戏是否胜利 int gameoverornot(char * map1); //随机赋值 void fuzhi(char * map); //数总雷数看看赋值是否有效 int getallboom(char * map); //清空地图 void clearmap(char * map); int main() { initgraph(f * 50 , f * 50 ,SHOWCONSOLE); mciSendString("open ./images/ice.mp3 alias music",0,0,0); mciSendString("play music", 0, 0, 0); char map[f][f] = {0}; while (true) { clearmap(((char *)map)); fuzhi((char *)map); int lei = getallboom((char *)map); //printf("lei:%d\n", lei); if (lei == boom) break; } //作弊数组 for (int x = 0; x < f; x++) { for (int y = 0; y < f; y++) printf("%d ", map[x][y]); printf("\n"); } /*char map[9][9] = { { 1, 0, 0, 0, 0, 1, 0, 1,0}, { 0, 0, 0, 0, 1, 0, 0, 0,0}, { 0, 0, 0, 0, 0, 0, 0, 0,0}, { 0, 0, 0, 0, 0, 0, 0, 0,0}, { 0, 0, 0, 0, 0, 0, 0, 0,0}, { 1, 0, 0, 0, 0, 0, 0, 0,0}, { 0, 0, 0, 0, 0, 1, 1, 0,0}, { 0, 0, 1, 0, 0, 1, 0, 0,0}, { 0, 0, 1, 0, 0, 0, 0, 0,0}, };*/ char map1[f][f] = { 0 }; beganmap((char *)map1); //outmap((char *)map1); MOUSEMSG m; while (true) { m = GetMouseMsg(); if (m.uMsg == WM_LBUTTONDOWN) { int x = m.x, y = m.y, num = 0, x1 = x / 50, y1 = y / 50; num = click((char *)map, x1, y1); printf("雷的数量:%d\n", num); map1[x1][y1] = num; if (num == 9) { gameovermap((char *)map1); MessageBox(NULL, "你输了!", "扫雷", MB_OK); break; } else if (num == 0) { for (int x = 0; x < f; x++) { for (int y = 0; y < f; y++) { int ret = getzero((char *)map, x, y); if (ret == 0) map1[x][y] = 10; } } coutmap((char *)map1); } else { map1[x1][y1] = num; coutmap((char *)map1); } outmap((char*)map1); int demo = gameoverornot((char *)map1); if (demo != 1) { MessageBox(NULL, "你赢了了!", "扫雷", MB_OK); break; } } else if (m.uMsg == WM_RBUTTONDOWN) { int x = m.x, y = m.y, num = 0, x1 = x / 50, y1 = y / 50; if (map1[x1][y1] == 11) map1[x1][y1] = 0; else if (map1[x1][y1] == 0) map1[x1][y1] = 11; beganmap((char *)map1); int demo = gameoverornot((char *)map1); if (demo != 1) { MessageBox(NULL, "你赢了了!", "扫雷", MB_OK); break; } } } while (true); } //获取某点附近雷数量 int click(char * map, int x1, int y1) { int num = 0; if (map[y1 * f + x1] == 1) { printf("中雷\n"); return 9; } for (int ypian = -1; ypian < 2; ypian++) { for (int xpian = -1; xpian < 2; xpian++) { //排除越界 if ((x1 + xpian > 0 || x1 + xpian == 0) && (x1 + xpian == f - 1 || x1 + xpian < f - 1) && (y1 + ypian > 0 || y1 + ypian == 0) && (y1 + ypian == f - 1 || y1 + ypian < f - 1)) { if (map[(y1 + ypian) * f + xpian + x1] == 1) num++; } } } return num; } //判定是否可以空白展开 int getzero(char * map, int x1, int y1) { int num = 0; for (int ypian = -1; ypian < 2; ypian++) { for (int xpian = -1; xpian < 2; xpian++) { //排除越界 if ((x1 + xpian > 0 || x1 + xpian == 0) && (x1 + xpian == f - 1 || x1 + xpian < f - 1) && (y1 + ypian > 0 || y1 + ypian == 0) && (y1 + ypian == f - 1 || y1 + ypian < f - 1)) { if (map[(y1 + ypian) * f + xpian + x1] > 0) num++; } } } //printf("you %d ge fei 0 \n", num); return num; } //输出副地图 图片 void coutmap(char * map1) { for (int x = 0; x < f; x++) { for (int y = 0; y < f; y++) { //printf("%d ", map1[x*f+y]); IMAGE pic[f*f];//申明一个图片数组 if (map1[x*f + y] == 0) { char path[200]; sprintf(path, "./images/null.jpg"); loadimage(&pic[x*f + y], path);//载入图片 putimage(x * 50, y * 50, &pic[x*f + y]);//显示图片 } else { char path[200]; sprintf(path, "./images/00%d.jpg", map1[x*f + y]); loadimage(&pic[x*f + y], path);//载入图片 putimage(x * 50, y * 50, &pic[x*f + y]);//显示图片 } } //printf("\n"); } } //输出副地图 仅字符 void outmap(char * map1) { for (int x = 0; x < f; x++) { for (int y = 0; y < f; y++) printf("%d ", map1[y*f + x]); printf("\n"); } } //点到雷结束 void gameovermap(char * map1) { for (int x = 0; x < f; x++) { for (int y = 0; y < f; y++) { //printf("%d ", map1[x*f + y]); IMAGE pic[f*f];//申明一个图片数组 char path[200]; sprintf(path, "./images/00%d.jpg", map1[x*f + y]); loadimage(&pic[x*f + y], path);//载入图片 putimage(x * 50, y * 50, &pic[x*f + y]);//显示图片 } printf("\n"); } } //输出未修改地图 void beganmap(char * map1) { for (int x = 0; x < f; x++) { for (int y = 0; y < f; y++) { IMAGE pic[f*f];//申明一个图片数组 char path[200]; sprintf(path, "./images/00%d.jpg", map1[x*f + y]); loadimage(&pic[x*f + y], path);//载入图片 putimage(x * 50, y * 50, &pic[x*f + y]);//显示图片 } } } //判断游戏是否胜利 int gameoverornot(char * map1) { int kedo = 0, ret = 1; for (int x = 0; x < f; x++) { for (int y = 0; y < f; y++) { if (map1[y*f + x] == 0 || map1[y*f + x] == 11) kedo++; } } if (kedo == boom) ret = 0; return ret; } //随机赋值 void fuzhi(char * map) { int have = 0; srand((unsigned)time(NULL)); //开始随机赋值啦 for (int i = 0; i < boom; i++) { int ret = rand() % (f*f); //printf("ret:%d", ret); map[ret] = 1; have++; } //printf("\n"); } //数总雷数看看赋值是否有效 int getallboom(char * map) { int have = 0; for (int i = 0; i < f*f; i++) { if (map[i] == 1) have++; } return have; } //清空地图 void clearmap(char * map) { int have = 0; for (int i = 0; i < f*f; i++) { map[i] = 0; } }
源码+素材集一并分享到百度网盘
链接:https://pan.baidu.com/s/1cIr22IL7PNUaIGIfodIoEQ?pwd=yuer 提取码:yuer
然后可能会有一段蜜雪冰城的BGM,哈哈哈没关系!
程序运行以后,会有一个控制台窗口,里面会有一串输出,1对应的是雷,可以开挂,前提你不想认真玩的话
发表评论: