扫雷游戏——C/C++

整理一下以前学习时找到的程序。

一、游戏框架

在这里插入图片描述
1、游戏地图初始化
通过随机生成数组,得到固定雷个数,然后判断九宫格里 8 个位置雷的个数,得到该位置的数字,然后以特定图片代替

2、游戏流程
对应数字

作用:0	1	2	3	4	5	6	7	8	雷	加密	标记
操作:0	1	2	3	4	5	6	7	8	-1	+-20	+-30
结果:0	1	2	3	4	5	6	7	8	-1	19-28	>30

生成地图时,把所有图片代表的数字进行加密(即 +20),左键点击翻开进行解密(即 -20),这时候就需要判断点开结果;标记和取消标记同理(即在加密的结果下 ±30)

二、游戏代码及素材(链接在最后)

程序需要用到 <graphics.h>,需要安装 EasyX,下载直接安装即可。
网址:https://easyx.cn/
在这里插入图片描述

/*
	文件名称:源.cpp
	文件描述:实现扫雷游戏
	编译环境:vs2017
*/

#include <stdio.h>
#include <time.h>
#include <stdlib.h>
#include <graphics.h>
#pragma comment(lib,"winmm.lib")

#define ROW 10		//行数
#define COL	10		//列数
#define NUM 10		//雷的个数
#define SIZE 50		//一张图片的大小

int map[ROW+2][COL+2];	//范围扩大	//全局变量自动初始化为0
IMAGE  img[12];			//0-8  雷 标记 加密
int win;
HWND hwnd;



//游戏初始化
void GameInit()
{
	//初始化窗口
	initgraph(ROW * 50, COL * 50);	//ROW COL
	//加载图片
	loadimage(&img[0], L"./res/0.jpg", SIZE, SIZE);
	loadimage(&img[1], L"./res/1.jpg", SIZE, SIZE);
	loadimage(&img[2], L"./res/2.jpg", SIZE, SIZE);
	loadimage(&img[3], L"./res/3.jpg", SIZE, SIZE);
	loadimage(&img[4], L"./res/4.jpg", SIZE, SIZE);
	loadimage(&img[5], L"./res/5.jpg", SIZE, SIZE);
	loadimage(&img[6], L"./res/6.jpg", SIZE, SIZE);
	loadimage(&img[7], L"./res/7.jpg", SIZE, SIZE);
	loadimage(&img[8], L"./res/8.jpg", SIZE, SIZE);		//0-8
	loadimage(&img[9], L"./res/9.jpg", SIZE, SIZE);		//雷
	loadimage(&img[10], L"./res/10.jpg", SIZE, SIZE);	//加密
	loadimage(&img[11], L"./res/11.jpg", SIZE, SIZE);	//标记

	//声音 路径:./res/music.mp3(这是相对路径,可以改为绝对路径)
	//mciSendString(L"open ./res/music.mp3 alias BGM", 0, 0, 0);
	//mciSendString(L"play BGM",0, 0, 0);


	//随机数种子
	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;
		}
	}

	//随机放置一些雷,-1代表雷 多少个雷
	for (int i = 0; i < NUM; )		//10次
	{
		//rand()&50		//0-49
		//rand()%10		//0-9
		int r = rand() % ROW + 1;	//随机得到行	//1-10
		int c = rand() % COL + 1;	//随机得到列	//1-10

		//可能重复得不到十个
		if (map[r][c] == 0)			//0
		{
			map[r][c] = -1;
			i++;
		}
	}

	//遍历所有数组的元素//根据雷的分布 填充数组数据 辅助区
	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; i++)
	{
		for (int j = 1; j <= COL; j++)
		{
			map[i][j] += 20;
		}
	}
	win = 0;			//点开一个格子 win+1 ROW*COL(格子总数)-win点开的=雷的数量
	hwnd = GetHWnd();
}

//游戏的绘制
void GameDraw()
{
	/*
		0	1	2	3	4	5	6	7	8	-1	+-20	+-30
		0	1	2	3	4	5	6	7	8	雷	加密	标记
		0	1	2	3	4	5	6	7	8	-1	19-28	>30
	*/

	//打印数组	贴图
	for (int i = 1; i <= ROW; i++)
	{
		for (int j = 1; j <= COL; j++)
		{
			//printf("%3d", map[i][j]);
			if (map[i][j] >= 0 && map[i][j] <= 8)				//0-8
				putimage((i - 1)*SIZE, (j - 1)*SIZE, &img[map[i][j]]);
			else if (map[i][j] == -1)
				putimage((i - 1)*SIZE, (j - 1)*SIZE, &img[9]);	//雷
			else if (map[i][j] >= 19 && map[i][j] <= 28)
				putimage((i - 1)*SIZE, (j - 1)*SIZE, &img[10]);	//加密
			else if (map[i][j] >= 30)
				putimage((i - 1)*SIZE, (j - 1)*SIZE, &img[11]);	//标记
		}
	}
}


int PlayGame()		//int 返回值	判断点到雷
{
	MOUSEMSG msg = { 0 };
	int n;
	while (1)
	{
		msg = GetMouseMsg();	//msg接受鼠标信息
		switch (msg.uMsg)
		{
		case WM_LBUTTONDOWN:	//左键	翻牌
			n = map[msg.x / SIZE + 1][msg.y / SIZE + 1];
			//19-28
			if (n >= 19 && n <= 28)	//翻开
			{
				map[msg.x / SIZE + 1][msg.y / SIZE + 1] -= 20;
				win++;
			}
			return map[msg.x / SIZE + 1][msg.y / SIZE + 1];
			break;
		case WM_RBUTTONDOWN:	//右键	标记
			n = map[msg.x / SIZE + 1][msg.y / SIZE + 1];
			if (n >= 19 && n <= 28)
			{
				map[msg.x / SIZE + 1][msg.y / SIZE + 1] += 30;
			}
			if (n >= 30)
			{
				map[msg.x / SIZE + 1][msg.y / SIZE + 1] -= 30;
			}
			return map[msg.x / SIZE + 1][msg.y / SIZE + 1];
			break;
		}
	}
}


//主函数
int main()
{
	while (1)
	{
		GameInit();

		while (1)
		{
			GameDraw();

			//输了
			if (PlayGame() == -1)
			{
				GameDraw();
				MessageBox(hwnd, L"你输了!", L"", MB_OK);
				break;
			}

			//赢了
			if (ROW*COL - win == NUM)
			{
				MessageBox(hwnd, L"太棒了!", L"", MB_OK);
				break;
			}
		}
		if (MessageBox(hwnd, L"再来一局??", L"", MB_RETRYCANCEL) == IDCANCEL)
			break;
	}
	return 0;
}

三、游戏界面

在这里插入图片描述

四、百度网盘

本人用 VS 创建的文件,生成的项目很繁杂,可以看下结构,提取其中的源代码和素材即可。

链接:https://pan.baidu.com/s/1H31-gMDqArJLLf_DsSaEeA
提取码:prgf

发布了113 篇原创文章 · 获赞 109 · 访问量 11万+

猜你喜欢

转载自blog.csdn.net/weixin_42109012/article/details/104641477