扫雷

c语言小游戏-扫雷,废话少说,上代码:

 

#include<stdio.h>
#include<graphics.h>
#include<stdlib.h>
#include<time.h>
#include<mmsystem.h>
#pragma comment(lib,"winmm.lib")
#define M 10  //10*10
#define N 10//雷的个数
void InitMap(int(*map)[M]);//随机埋雷
void Init(IMAGE *img);//初始化
void DrawMap(int(*map)[M], IMAGE *img); //贴图
void PlayGame(int(*map)[M]);//游戏开始,鼠标点击
int TongJi(int(*map)[M]);//判断游戏是否结束
 
int main()
{
	int map[M][M] = { 0 };
	srand((unsigned)time(NULL));//设置随机种子
	InitMap(map);
	IMAGE img[12];
	Init(img);
	while (TongJi(map)==1)
	{  
		DrawMap( map, img);
	    PlayGame(map);
	}
	//输出赢
	outtextxy(0, 0, "WIN");
	getchar();
	closegraph();
	return 0;
}
 
 
void InitMap(int(*map)[M])
{
	mciSendString("open res\\小幸运.mp3 alias MESSI",NULL,NULL,NULL);
	mciSendString("play MESSI repeat", NULL, NULL, NULL);
	int x, y;
	for (int i = 0; i <N;)//在地图上随机埋雷
	{
		x = rand() % M;
		y = rand() % M;
		if (map[x][y] != -1)//位置不是雷
		{
			map[x][y] = -1;//赋值雷,-1
			i++;
		}
	}
 
	for (int i = 0; i < M; i++)//测试是否赋值雷
	{
		for (int j = 0; j < M; j++)
		{
			if (map[i][j] == -1)//找到雷
			{
				for (int x = i - 1; x <= i + 1; x++)//周围元素
				{
					for (int y = j - 1; y <= j + 1; y++)
					{
						if (0 <= x&&x <= M && 0 <= y&&y <= M&&map[x][y] != -1)//注意是否越界,而且如果是雷不加1
						{
							map[x][y]++;//给周围元素加1
						}
					}
				}
			}
		}
	}
}
 
void Init(IMAGE *img)
{
	initgraph(64 * M, 64 * M);//图片64*64
	loadimage(&img[0], "res/0.jpg", 64, 64);
	loadimage(&img[1], "res/1.jpg", 64, 64);
	loadimage(&img[2], "res/2.jpg", 64, 64);
	loadimage(&img[3], "res/3.jpg", 64, 64);
	loadimage(&img[4], "res/4.jpg", 64, 64);
	loadimage(&img[5], "res/5.jpg", 64, 64);
	loadimage(&img[6], "res/6.jpg", 64, 64);
	loadimage(&img[7], "res/7.jpg", 64, 64);
	loadimage(&img[8], "res/8.jpg", 64, 64);
	loadimage(&img[9], "res/标记.jpg", 64, 64);
	loadimage(&img[10], "res/空.jpg", 64, 64);
	loadimage(&img[11], "res/雷.jpg", 64, 64);
 
}
 
 
//void DrawMap(map[][M],IMAGE,img[]) 用数组名或者指针
void DrawMap(int(*map)[M], IMAGE *img) //贴图
{
	for (int i = 0; i < M; i++)
	{
		for (int j = 0; j < M; j++)
		{
			switch (map[i][j])
			{
			case 9:putimage(j * 64, i * 64, &img[11]);
				break;
			case 10:putimage(j * 64, i * 64, &img[0]);
				break;
			case 11:putimage(j * 64, i * 64, &img[1]);
				break;
			case 12:putimage(j * 64, i * 64, &img[2]);
				break;
			case 13:putimage(j * 64, i * 64, &img[3]);
				break;
			case 14:putimage(j * 64, i * 64, &img[4]);
				break;
			case 15:putimage(j * 64, i * 64, &img[5]);
				break;
			case 16:putimage(j * 64, i * 64, &img[6]);
				break;
			case 17:putimage(j * 64, i * 64, &img[7]);
				break;
			case 18:putimage(j * 64, i * 64, &img[8]);
				break;
			default:putimage(j * 64, i * 64, &img[10]);
				break;
			}
		}
	}
}
void PlayGame(int (*map)[M])
{
	MOUSEMSG msg;
	while (1)
	{
		msg = GetMouseMsg();//获取鼠标信息
		switch (msg.uMsg)
		{
		case WM_LBUTTONDBLCLK://左键按下,翻开,首先判断是不是雷
			if (map[msg.y / 64][ msg.x / 64] == -1)//表示点到雷
			{
				exit(0);//直接结束
			}
			else if (map[msg.y / 64][ msg.x / 64] <= 8 && map[msg.y / 64][ msg.x / 64] >= 0)
			{
				map[msg.y / 64][msg.x / 64] += 10;//表示点到其他,翻开
			}
			else if (map[msg.y / 64][ msg.x / 64] == 0)//0时翻开一圈
			{
				for (int x = msg.y / 64 - 1; x <= msg.y / 64 + 1; x++)//周围元素
				{
					for (int y = msg.x / 64 - 1; y <= msg.x / 64 + 1; y++)
					{
						if (0 <= x&&x <= M && 0 <= y&&y <= M&&map[x][y]<9)//注意是否越界,翻开一圈
						{
							map[x][y]+=10;
						}
					}
				}
			}
			return;
			break;
		default:
			break;
		}
	}
}
int TongJi(int (*map)[M])//判断游戏是否结束
{
	int x=0;//统计翻开元素个数
	for (int i = 0; i < M; i++)
	{
		for (int j = 0; j < M; j++)
		{
			if (map[i][j] >= 9)//翻开过
			{
				x++;
			}
		}
	}
	if (x == M*M - N)
	{
		return 0;//游戏结束
	}
	else return 1;//游戏没结束
}

 

评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

淮城一只猫

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值