栏目分类:
子分类:
返回
名师互学网用户登录
快速导航关闭
当前搜索
当前分类
子分类
实用工具
热门搜索
名师互学网 > IT > 软件开发 > 后端开发 > C/C++/C#

C++语言的扫雷(图形化)

C/C++/C# 更新时间: 发布时间: IT归档 最新发布 模块sitemap 名妆网 法律咨询 聚返吧 英语巴士网 伯小乐 网商动力

C++语言的扫雷(图形化)

#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/

转载请注明:文章转载自 www.mshxw.com
本文地址:https://www.mshxw.com/it/702320.html
我们一直用心在做
关于我们 文章归档 网站地图 联系我们

版权所有 (c)2021-2022 MSHXW.COM

ICP备案号:晋ICP备2021003244-6号