资讯专栏INFORMATION COLUMN

C/C++游戏项目详细教学:《扫雷》

meteor199 / 890人阅读

摘要:扫雷最原始的版本可以追溯到年一款名为方块的游戏。两年后,汤姆安德森在的基础上又编写出了游戏地雷,由此奠定了现代扫雷游戏的雏形。年,微软公司的罗伯特杜尔和卡特约翰逊两位工程师在系统上加载了该游戏,扫雷游戏才正式在全世界推广开来。

扫雷最原始的版本可以追溯到1973年一款名为“方块”的游戏。

不久,“方块”被改写成了游戏“Rlogic”。在“Rlogic”里,玩家的任务是作为美国海军陆战队队员,为指挥中心探出一条没有地雷的安全路线,如果路全被地雷堵死就算输。两年后,汤姆·安德森在“Rlogic”的基础上又编写出了游戏“地雷”,由此奠定了现代扫雷游戏的雏形。

1981年,微软公司的罗伯特·杜尔和卡特·约翰逊两位工程师在Windows3.1系统上加载了该游戏,扫雷游戏才正式在全世界推广开来。

这款游戏的玩法是在一个9*9(初级),16*16(中级),16*30(高级),或自定义大小的方块矩阵中随机布置一定量的地雷(初级为10个,中级为40个,高级为99个)。由玩家逐个翻开方块,以找出所有地雷为最终游戏目标。如果玩家翻开的方块有地雷,则游戏结束。 

我们今天就来自己写《扫雷》

这个项目并不是很难,今天就和大家从头到尾详细的讲一遍,大家一定要好好看好好学!

行吧,开始了

我们今天用的是Cpp来写,但不是用Windows来创建窗口,而是用他的远房表亲EasyX图形库来创建窗口,因为用图形库会简单很多,刚学C的也可以听懂,而且C/C++不分家,没有什么问题,OK,我们现在开始写代码,今天我就把头文件也分享出来了,主要是教大家如何去调用图形库。(注:没有EasyX图形库的可以去官网下载,也可以进群直接下载)

首先是我们的头文件以及一些宏定义

#include#include//包含图形库头文件#define ROW 9 //行#define COL 9 //列  共81个格子#define MINE_NUM  18//雷的数量#define IMG_SIZE 40

初始化函数,也是我们的老朋友了

void GameInit(){	//1,创建窗口 一行有九张图片每张图片40px,	initgraph(IMG_SIZE*ROW, IMG_SIZE*COL,SHOWCONSOLE);	//加载图片(赋值) load加载 第一个参数,存储图片的变量 错误:字符集问题	for (int i = 0; i < 12; i++)	{		char file[20] = "";		sprintf(file, "./image/%d.jpg", i);		loadimage(&img[i], file, IMG_SIZE, IMG_SIZE);	}	//布雷	for (int i = 0; i < MINE_NUM; )	{		//排除辅助区		int row = rand() % ROW+1;//0-8  1-9		int col = rand() % COL+1;		if (mine[row][col] == 0)		{			mine[row][col] = 9;			i++;		}	}	//雷所在的九宫格,要加1(雷除外)	for (int i = 1; i < ROW+1; i++)	{		for (int k = 1; k < COL+1; k++)		{			if (mine[i][k] == 9)			{				//遍历雷的九宫格 细心				for (int a = i - 1; a <= i + 1; a++)				{					for (int b = k - 1; b <= k + 1; b++)					{						//非雷的格子加1						if (mine[a][b] != 9)						{							mine[a][b]++;						}					}				}			}		}	}	//加密 开始时全部为掩码图	for (int i = 1; i < ROW + 1; i++)	{		for (int k = 1; k < COL + 1; k++)		{			mine[i][k] += 20;		}	}}

鼠标信息处理函数

void MouseEvent(){	//检测是否有鼠标消息	if (MouseHit())	{		//获取鼠标消息,坐标,左键还是右键		MOUSEMSG msg = GetMouseMsg();		//把坐标转化成数组下标		openr = msg.y / IMG_SIZE+1;		openc = msg.x / IMG_SIZE+1;		//判断是左键还是右键		switch (msg.uMsg)		{		case WM_LBUTTONDOWN:			//如果格子没有打开,就打开格子,否则不做处理			if (mine[openr][openc] > 9)			{				mine[openr][openc] -= 20;				OpenNull(openr,openc);				num++;			}			break;		case WM_RBUTTONDOWN:			//标记			if (mine[openr][openc] > 9 && mine[openr][openc] <= 29)			{				mine[openr][openc] += 20;			}			else			{				mine[openr][openc] -= 20;			}			break;		}	}}

进行递归操作,判断鼠标点击的地方

//递归打开所有空白,以及空白周围的数字void OpenNull(int row,int col){	//点击的是空白才能打开	if (mine[row][col] == 0)	{		for (int i = row - 1; i <= row + 1; i++)		{			for (size_t k = col-1; k <= col+1; k++)			{				//如果为空或者不是雷就打开				if ((mine[i][k] == 20 || mine[i][k] != 29)&& mine[i][k]>9)				{					mine[i][k] -= 20;					num++;					OpenNull(i, k);				}			}		}	}}

游戏的输赢判断函数,注意理清逻辑

void Jude(){	//判断输	if (mine[openr][openc] == 9)	{		int isok = MessageBox(GetHWnd(), "是否继续!", "点到雷了", MB_OKCANCEL);		if (isok == IDOK)		{			mine[openr][openc] += 20;		}		else		{			exit(666);		}	}	//判断赢	if (num == ROW*COL - MINE_NUM)	{		int isok = MessageBox(GetHWnd(), "是否继续!", "点到雷了", MB_OKCANCEL);		if (isok == IDOK)		{			num = 0;			GameInit();		}		else		{			exit(666);		}	}}

最后就是我们的主函数了

int main(){	GameInit();	show();	//循环处理游戏逻辑	while (1)	{		MouseEvent();		GameDraw();		Jude();	}		getchar();	return 0;}

经典游戏《扫雷》完成,OK,简单总结一下,代码很简单,逻辑也不难,重要是大家一定要自己动手去做,这是毋庸置疑的,编程没有捷径,只有不断的学习熟练,加强自己的能力,有条件的话找个老师的话效果会更好,我也特意找了一个朋友叫他把一些关于《扫雷》的教学视频发给我,大家可以去我的主页上查看,我也希望下面的视频可以更好的帮助同学们掌握这个项目,好了,希望大家可以在这里得到自己想要的知识以及快乐吧,也希望大家可以给UP主一个关注,非常感谢大家了!!!

                                          

后续UP主还会发布更多的项目源码以及学习资料,希望大家可以持续关注,有什么问题可以回帖留言,我尽量回答。想要C/C++学习资料以及其他项目的源码的可以加群【1083227756】了解。想要对程序员的未来发展有兴趣的也可加群闲聊。也可以关注微信公众号:【狐狸的编码时光】,希望和大家一起学习进步!!!


点击下方链接进群更快拿到学习资料以及项目素材 

进群领取学习资料以及项目源码素材包https://jq.qq.com/?_wv=1027&k=sttR3REFhttps://jq.qq.com/?_wv=1027&k=sttR3REF
                                                     

文章版权归作者所有,未经允许请勿转载,若此文章存在违规行为,您可以联系管理员删除。

转载请注明本文地址:https://www.ucloud.cn/yun/123179.html

相关文章

  • 为了没Python的小伙伴儿,我学会了程序打包!【保姆级详细教学

    摘要:如果觉得安装太慢,还可以加入国内镜像下载我比较习惯用豆瓣的。之前的文章有讲过滴常用源镜像清华阿里云中国科技大学华中理工大学山东理工大学豆瓣在里输入打包成的命令。  导语 这篇文章是我之前很想写的,但是拖到了今天! 咳咳咳......主要是有粉丝让我安排一下!宠粉.jpg 很多新手小伙伴儿是...

    Euphoria 评论0 收藏0
  • 为了没Python的小伙伴儿,我学会了程序打包。【保姆级详细教学

    摘要:如果觉得安装太慢,还可以加入国内镜像下载我比较习惯用豆瓣的。之前的文章有讲过滴常用源镜像清华阿里云中国科技大学华中理工大学山东理工大学豆瓣在里输入打包成的命令。   导语 这篇文章是我之前很想写的,但是拖到了今天! 咳咳咳......主要是有粉丝让我安排一下!宠粉.jpg 很多新手小伙伴儿...

    Java_oldboy 评论0 收藏0
  • C语言实现入门级小游戏——扫雷

    摘要:上一期咱们用语言实现了三子棋的小游戏语言实现三子棋今天我们再来写个扫雷的游戏,说起扫雷,相信大家都不陌生,可能许多朋友还是玩扫雷的高手。      上一期咱们用C语言实现了三子棋的小游戏  C语言实现三子棋       今天我们再来写个扫雷的游戏,说起扫雷,相信大家都不陌生,可能许多朋友还是...

    nevermind 评论0 收藏0
  • C语言入门》扫雷游戏C语言实现

    摘要:条消息语言入门三子棋语言实现详细版的博客博客条消息语言入门三子棋语言实现详细版的博客博客我们将雷盘初始化为统一的符号。 目录 1.原理简介 2.分布目标及代码实现 3.总结 1.原理简介  首先我们需要一个空的雷盘,在其中随机埋入十枚雷,当我们排这颗雷时,若此位置为雷,则游戏失败,若不...

    caige 评论0 收藏0
  • C语言学习笔记—P12(扫雷游戏<初级>+图解+题例)

    目录  前言:●由于作者水平有限,文章难免存在谬误之处,敬请读者斧正,俚语成篇,恳望指教!                                                                       ——By 作者:新晓·故知                                                                       ...

    lykops 评论0 收藏0

发表评论

0条评论

最新活动
阅读需要支付1元查看
<