首页 C/C++修行正文

C语言基于easyx.h做的一个图形界面版的扫雷

欲儿 C/C++修行 2023-04-14 250 0

先看看效果吧!

先看看效果,我觉得还是很好看的!

image.png


源代码如下:

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

image.png

版权声明

本文仅代表作者观点,不代表本站立场。
本文系作者授权发表,未经许可,不得转载。

评论