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对应的是雷,可以开挂,前提你不想认真玩的话

发表评论: