Easyx实现扫雷游戏
程序员文章站
2022-03-08 19:49:45
本文实例为大家分享了easyx实现扫雷游戏的具体代码,供大家参考,具体内容如下代码:#include#include#include<...
本文实例为大家分享了easyx实现扫雷游戏的具体代码,供大家参考,具体内容如下
代码:
#include<stdio.h> #include<stdlib.h> #include<time.h> #include<easyx.h> #include<mmsystem.h> #pragma comment(lib, "winmm.lib") #define row 10 //定义行列的常量 #define col 10 #define minenum 10 //雷的数量 #define imgsize 40 //图片的尺寸 //定义图片资源 image imgs[12]; void loadresource() { for (int i = 0; i < 12; i++) { char imgpath[50] = { 0 }; sprintf_s(imgpath, "./images/%d.jpg", i); loadimage(&imgs[i], imgpath, imgsize, imgsize); } } bool isfirst = true; //是不是第一次进来 //函数声明 void show(int map[][col]); void init(int map[][col]); void draw(int map[][col]); void mousemsg(exmessage* msg, int map[][col]); void boomblank(int map[][col], int row, int col); int judge(int map[][col], int row, int col); int main() { //创建窗口 initgraph(400, 400/*,ew_showconsole*/); //播放开始音乐 mcisendstring("open ./images/start.mp3 alias bgm", null, 0, null); mcisendstring("play bgm", null, 0, null); //扫雷地图 int map[row][col] = {0}; init(map); //游戏主循环 while (true) { //处理消息 exmessage msg; while (peekmessage(&msg, em_mouse)) { switch (msg.message) { case wm_lbuttondown: //鼠标左键和右键点击 case wm_rbuttondown: mousemsg(&msg, map); int ret = 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) { } system("cls"); printf("judege:%d\n", ret); show(map); break; } } draw(map); } //show(map); getchar(); return 0; } void show(int map[][col]) { for (int i = 0; i < row; i++) { for (int k = 0; k < col; k++) { printf("%2d ", map[i][k]); } printf("\n"); } } //初始化数据 void init(int map[][col]) { loadresource(); //设置随机数种子 srand((unsigned)time(null)); //把map全部初始化为0 memset(map, 0, sizeof(int) * row * col); //随机设置十个雷 用-1表示 for (int i = 0; i < minenum; ) { //数组的有效下标 [0,9] int r = rand() % row; int c = rand() % col; if (map[r][c] == 0) { map[r][c] = -1; //只有执行了这里的代码,才成功设置了雷 -1 i++; } } //把以雷为中心的九宫格数据都+1,雷除外 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++) { //对周围的数据加1,会有一个bug if ((r >= 0 && r < row && c >= 0 && c < col) && map[r][c] != -1) { ++map[r][c]; } } } } } } //加密格子 for (int i = 0; i < row; i++) { for (int k = 0; k < col; k++) { map[i][k] += 20; } } } //绘制 void draw(int map[][col]) { //贴图,根据map里面的数据,贴对应的图片 for (int i = 0; i < row; i++) { for (int k = 0; k < col; k++) { if (map[i][k]>=0 && map[i][k]<=8) //[0,8] { int index = map[i][k]; //0 1 2 3 4 5 6 7 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) //-1 + 20 +20 { putimage(k * imgsize, i * imgsize, &imgs[11]); } } } } //鼠标操作数据 void mousemsg(exmessage* msg,int map[][col]) { //先根据鼠标点击的坐标求出对应的数组的下标 int r = msg->y / imgsize; int c = msg->x / imgsize; //左键打开格子 if (msg->message == wm_lbuttondown) { //什么时候能够打开,没有打开的时候就打开 if (map[r][c]>=19 && map[r][c]<=28) { //这个函数只能播放wav格式 playsound("./images/click.wav", null, snd_async | snd_filename); map[r][c] -= 20; boomblank(map, r, c); //检测一下是不是空白格子,是,炸开 isfirst = true; } } //右键标记格子 else if (msg->message == wm_rbuttondown) { playsound("./images/rightclick.wav", null, snd_async | snd_filename); //是否能够标记:如果没有打开就能标记 if (map[r][c] >= 19 && map[r][c] <= 28) { 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 r = row-1; r <= row+1; r++) { for (int c = col-1; c <= col+1; c++) { if ((r>=0&&r<row&&c>=0&&c<col) //没越界 && map[r][c]>=19 && map[r][c]<=28) //没有打开 { //每一次调用都会播放一下 if (isfirst) { playsound("./images/search.wav", null, snd_async | snd_filename); isfirst = false; } map[r][c] -= 20; boomblank(map, r, c); } } } } return; } //游戏结束条件 输了返回-1 没结束返回0 赢了返回 1 int judge(int map[][col],int row ,int col) { //点到了雷,结束 输了 if (map[row][col] == -1 || map[row][col] == 19) { return -1; } //点完了格子,结束 赢了 点开了100 - 10 = 90 个格子 int cnt = 0; for (int i = 0; i < row; i++) { for (int k = 0; k < col; k++) { //统计打开的格子的数量 if (map[i][k] >= 0 && map[i][k] <= 8) { ++cnt; } } } if (row*col - minenum == cnt) { return 1; } return 0; }
以上就是本文的全部内容,希望对大家的学习有所帮助,也希望大家多多支持。
上一篇: python爬取一组小姐姐图片实例
下一篇: 蒸皮冻多长时间呢?答案都在这里了~