C语言实现扫雷

效果图

扫雷

源代码

#include <stdio.h>
#include <stdlib.h>
#include <time.h>
#include <graphics.h>//这里调用了Easyx,需要安装
#pragma comment(lib,"winmm.lib")
#define SIZE 50//图片的大小
#define NUM 10//地雷的数量
#define ROW 10//行数
#define COL 10//列数
int map[ROW + 2][COL + 2];//地图
int count = 0;
IMAGE img[12];//定义图像对象
//游戏初始化
void GameInit()
{
	srand((unsigned int)time(NULL));//创建一个随机数种子
	//将数组初始化为0
	for (int i = 0; i < ROW + 2; i++)
	{
		for (int j = 0; j < COL + 2; j++)
		{
			map[i][j] = 0;
		}
	}
	//制作地雷
	int n = 0;
	while (n < NUM)
	{
		int r = rand() % ROW + 1;//随机获取行值
		int c = rand() % COL + 1;//随机获取列值
		if (map[r][c] == 0)//防止重复
		{
			map[r][c] = -1;
			n++;
		}
	}
	//判断格子周围雷的数量
	for (int i = 1; i <= ROW; i++) {
		for (int j = 1; j <= COL; j++) {
			if (map[i][j] != -1) {
				for (int m = i - 1; m <= i + 1; m++) {
					for (int n = j - 1; n <= j + 1; n++) {
						if (map[m][n] == -1) {
							map[i][j]++;
						}
					}
				}
			}
		}
	}
	for (int i = 1; i < ROW + 1; i++) {
		for (int j = 1; j < COL + 1; j++) {
			map[i][j] += 20;
		}
	}
}
void DrawMap()
{
	for (int i = 1; i < ROW + 1; i++) {
		for (int j = 1; j < COL + 1; j++) {
			printf("%4d", map[i][j]);
			if (map[i][j] == -1) {
				putimage((i - 1)*SIZE, (j - 1)*SIZE, &img[10]);//雷
			}
			else if
				(map[i][j] >= 0 && map[i][j] <= 8) {
				putimage((i - 1)*SIZE, (j - 1)*SIZE, &img[map[i][j]]);//数字
			}
			else if
				(map[i][j] >= 19 && map[i][j] <= 28) {
				putimage((i - 1)*SIZE, (j - 1)*SIZE, &img[9]);//空白图
			}
			else if
				(map[i][j] > 30) {
				putimage((i - 1)*SIZE, (j - 1)*SIZE, &img[11]);//标记
			}
		}
		printf("\n");
	}
}
void OpenZero(int r, int c)
{
	map[r][c] -= 20;
	count++;
	for (int m = r - 1; m <= r + 1; m++)
	{
		for (int n = c - 1; n <= c + 1; n++)
		{
			if (m >= 1 && m <= ROW && n >= 1 && n <= COL)
			{
				if (map[m][n] >= 19 && map[m][n] <= 28)
				{
					if (map[m][n] != 20)
					{
						map[m][n] -= 20;
						count++;
					}
					else {
						OpenZero(m, n);
					}
				}
			}
		}
	}
}

int PlayGame()
{
	MOUSEMSG msg = { 0 };//定义一个鼠标
	int r, c;
	while (1)
	{
		msg = GetMouseMsg();//获取鼠标消息
		switch (msg.uMsg) {
		case WM_LBUTTONDOWN://当左键按下
			r = msg.x / SIZE + 1;
			c = msg.y / SIZE + 1;
			if (map[r][c] >= 19 && map[r][c] <= 28)
			{
				if (map[r][c] == 20)
				{
					OpenZero(r, c);
				}
				else
				{
					map[r][c] -= 20;
					count++;
				}
			}
			return map[r][c];
			break;
		case WM_RBUTTONDOWN://当鼠标右键按下,可设置或取消标志
			r = msg.x / SIZE + 1;
			c = msg.y / SIZE + 1;
			if (map[r][c] >= 19 && map[r][c] <= 28)
			{
				map[r][c] += 50;
			}
			else if (map[r][c] > 30)
			{
				map[r][c] -= 50;
			}
			return map[r][c];
			break;
		}
	}
}
int main() {
	HWND hwnd = initgraph(ROW*SIZE, COL*SIZE);//创建绘图窗口,加上参数SHOWCONSOLE可以看见控制台
	mciSendString(L"open music.mp3 alias music", 0, 0, 0);//打开音乐文件
	mciSendString(L"play music", 0, 0, 0);//播放音乐,我这里是告白之夜的BGM
	loadimage(&img[0], L"0.jpg", SIZE, SIZE);//加载图片
	loadimage(&img[1], L"1.jpg", SIZE, SIZE);
	loadimage(&img[2], L"2.jpg", SIZE, SIZE);
	loadimage(&img[3], L"3.jpg", SIZE, SIZE);
	loadimage(&img[4], L"4.jpg", SIZE, SIZE);
	loadimage(&img[5], L"5.jpg", SIZE, SIZE);
	loadimage(&img[6], L"6.jpg", SIZE, SIZE);
	loadimage(&img[7], L"7.jpg", SIZE, SIZE);
	loadimage(&img[8], L"8.jpg", SIZE, SIZE);
	loadimage(&img[9], L"9.jpg", SIZE, SIZE);
	loadimage(&img[10], L"10.jpg", SIZE, SIZE);
	loadimage(&img[11], L"11.jpg", SIZE, SIZE);
	GameInit();
	while (1) {
		DrawMap();
		if (PlayGame() == -1)
		{
			DrawMap();
			MessageBox(hwnd, L"很遗憾,你输了!!!", L"", MB_OK);//制作一个消息弹窗
			break;
		}
		if (ROW*COL - NUM == count)
		{
			DrawMap();
			MessageBox(hwnd, L"真棒,你赢了!!!",L"", MB_OK);
			break;
		}
	}
	closegraph();//关闭绘图环境
	return 0;
}

源文件及资源

链接:https://pan.baidu.com/s/1iRrU4zIkvgWqslX8QTgIBg
提取码:8k4f

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值