C语言新手写扫雷攻略3

今天写的是游戏过程的函数,基本的算法前面都解释过了,今天是实现基本的功能

补充一下前面需要用到的头文件

#include<conio.h>  //_kbhit()
#include<stdlib.h> //rand(),srand()
#include<time.h>   //srand((unsigned)time(NULL))

游戏的过程就是鼠标的操作过程,实现的就是鼠标的点击处理,因为不是WinAPI的按钮点击,所以得自己算坐标得到鼠标动作

void MouseGetXY(void)
{
	m = GetMouseMsg();
	MouseX = m.x;
	MouseY = m.y;
}

m是鼠标的结构体,前面有定义过,具体结构查看前面或EasyX帮助

然后实现的就是鼠标操作游戏过程

void GamePlay(void)/*游戏过程*/
{
	int i, j, Num = 0;/*Num用来接收统计函数返回一个格子周围有多少地雷*/
	for (i = 0; i < 10; i++)
	for (j = 0; j<10; j++)
		Mine[i][j].roundnum = MineStatistics(i, j);/*统计每个格子周围有多少地雷*/
	while (!_kbhit())
	{
		m = GetMouseMsg();
		switch (m.uMsg)
		{
		case WM_LBUTTONDOWN:
		{
							   MouseGetXY();
							   if (MouseX>90 && MouseX<110 && MouseY>5 && MouseY<25)/*重新来*/
							   {
								   MessageBox(NULL, TEXT("重新开始成功"), TEXT("YES"), MB_OK);
								   AGAIN = 1;
								   return;
							   }
							   if (MouseX>0 && MouseX<200 && MouseY>30 && MouseY < 230)/*当前鼠标位置在格子范围内*/
							   {
								   j = (MouseX) / 20;/*x坐标*/
								   i = (MouseY - 30) / 20;/*y坐标*/
								   if (Mine[i][j].flag == 1)/*如果格子有红旗则左键无效*/
									   continue;
								   if (Mine[i][j].num != 0)/*如果格子没有处理过*/
								   {
									   if (Mine[i][j].num == 1)/*鼠标按下的格子是地雷*/
									   {
										   GameOver();/*游戏失败*/
										   break;
									   }
									   else/*鼠标按下的格子不是地雷*/
									   {
										   Num = MineStatistics(i, j);
										   if (Num == 0)/*周围没地雷就用递归算法来显示空白格子*/
											   ShowWhite(i, j);
										   else/*按下格子周围有地雷*/
										   {
											   _stprintf_s(randmineNUM, _T("%d"), Num);/*输出当前格子周围的雷数*/
											   DrawEmpty(i, j, 1, WHITE);
											   setcolor(RED);
											   outtextxy(6 + j * 20, 32 + i * 20, randmineNUM);
											   mineNUM--;
										   }
										   Mine[i][j].num = 0;/*点过的格子周围雷数的数字变为0表示这个格子已经用过*/
										   if (mineNUM < 1)/*胜利了*/
										   {
											   GameWin();
											   break;
										   }
									   }
								   }
							   }
		}
		case WM_RBUTTONDOWN:
		{
							   MouseGetXY();
							   if (MouseX > 0 && MouseX<200 && MouseY>30 && MouseY < 230)/*当前鼠标位置在格子范围内*/
							   {
								   j = (MouseX) / 20;/*x坐标*/
								   i = (MouseY - 30) / 20;/*y坐标*/
								   //MessageBox(NULL, TEXT("右键测试"), TEXT("YES"), MB_OK);
								   if (Mine[i][j].flag == 0 && Mine[i][j].num != 0)/*本来没红旗现在显示红旗*/
								   {
									   DrawRedFlag(i, j);
									   Mine[i][j].flag = 1;
								   }
								   else
								   if (Mine[i][j].flag == 1)/*有红旗标志再按右键就红旗消失*/
								   {
									   DrawEmpty(i, j, 0, LIGHTGRAY);
									   Mine[i][j].flag = 0;
								   }
							   }
		}
		}
	}
}

switch case只有两个,鼠标的左键和右键操作

然后就是游戏胜利或者游戏失败的函数,都是比较简单的

void GameOver(void)
{
	int i, j;
	for (i = 0; i < 10; i++)
	{
		for (j = 0; j < 10; j++)
		{
			if (Mine[i][j].num == 1)//显示所有地雷
			{
				DrawEmpty(i, j, 0, WHITE);
				setfillstyle(BS_SOLID);
				setfillcolor(RED);
				fillellipse(3 + j * 20, 33 + i * 20, 17 + j * 20, 47 + i * 20);
				setbkcolor(WHITE);
				setcolor(RED);
				settextstyle(16, 0, _T("宋体"));
				outtextxy(2, 2, _T("输了请重来"));
			}
		}
	}
}

void GameWin(void)
{
	setbkcolor(WHITE);
	setcolor(RED);
	settextstyle(16, 0, _T("宋体"));
	outtextxy(2, 2, _T("你赢了"));
}

至此这个游戏就算完成了,基本的功能都实现了,大家还可以添加更高级的功能,比如限定雷数,倒计时等,下次放出完整的代码

时间: 2024-08-09 06:35:25

C语言新手写扫雷攻略3的相关文章

C语言新手写扫雷攻略1

工欲善其事,必先利其器,首先要准备好开发环境,既然是C语言,那就不是WinAPI的扫雷,就是纯的C语言开发,但是以前的C都是TC开发的,现在用肯定是过时很久了,但是也是有解决办法的,某些大神开发出EasyX这个库,基本上还原了TC的函数,就可以在各种IDE下使用了,下面是下载地址和帮助,帮助里面有所有函数的调用方法 http://www.easyx.cn/ 下载解压好后将include 和 lib 文件夹复制到你的VC对应安装的文件夹里覆盖就可以使用了,从vc++6.0到vs2013都可以使用

C语言新手写扫雷攻略2

接下来是游戏的功能设计,要有扫雷的基本功能,左键点击雷区,右键红旗标记,并且可以统计雷数,可以重新开始,以下是游戏的功能初始 void Game(void) { while (1) { if (FLAG == 1) { GameBegin();//绘制出游戏界面并判断是否玩过和重新开始 GamePlay();//游戏过程的函数 if (AGAIN == 1) { AGAIN = 0; continue; } } FLAG = 0; if (m.uMsg == WM_LBUTTONDOWN)//鼠

C语言新手写扫雷源代码

今天发布源代码,由于写在一个文件里非常乱,所以分三个文件写 绘图和鼠标函数graph.h /*绘图与鼠标相关函数*/ #include<graphics.h> #include <easyx.h> void DrawEmpty(int, int, int, int);//初始化空格子界面的函数 void DrawSmile(void);//画笑脸的函数 void DrawRedFlag(int, int);//右键画红旗的函数 int MouseX, MouseY;//鼠标的x,y

80后新手装修完全攻略(转载)

1. 如果家中会做饭频率很高的话,尽量放弃开放式厨房,会有油烟问题 2. 卫生间.厨房小水宝,热水来得快,使用时比较方便 3. 吸油烟机中式的比欧式的吸力更强,欧式的好看不中用. 4. 电源插座能多装尽量多装点,否则家里到处都是拖线板 5. 马桶边上一定要预留电源插座,否则卫洗丽没法装 6. 浴缸PK淋浴,二选一的话,还是建议淋浴,浴缸装好,从来也没泡过澡的不是少数.淋浴不是指淋浴房,淋浴房的玻璃擦起来还是很累的,也可以选择挂根浴帘 7. 如果有2个卫生间,装一个浴缸还是有必要的,泡泡大件衣物,

超详细Go语言Windows安装全攻略

1,下载go语言windows安装包,你可以直接到官网下载,也可以从本站云盘下载,由于国内被封杀,go语言官网 经常会打不开 win32版本:链接:http://pan.baidu.com/s/1eQlIT2M 密码:qosr win64版本:链接:http://pan.baidu.com/s/1qWmK7wg 密码:r5z7 2.双击安装,默认安装,直接点“下一步”就行,默认是安装在c:\go,你也可以修改成其它目录,目录最好不要包含 中文名 3.设置系统环境变量GOROOT,并把%GOROO

新手学web前端有哪些攻略?

web前端入行门槛低.薪资高.发展前景好,已经成为近几年的热门岗位,很多人在想要转行时也会首选web前端.想要学好web前端,尤其是对于没有任何基础的新手来说,一定要找到好的学习方法.下面小编就为大家分享一下前端新手学习的攻略有哪些? 第一:基础的重要性 无论做什么都一定要有扎实的基础,参加web前端开发培训也不例外,只有基础牢固,才能更深入的学习新技能.作为一名初级的web前端工程师,你必须要具备基础的技术要素:html.CSS和Java.这是作为web前端工程师所必须要掌握的.web前端的入

寒城攻略:Listo 教你用Swift 语言编写 IOS 平台流媒体播放器

先展示播放器效果: 依旧继承 Listo 本人的强迫症,还是从最初到完成完整的写一个攻略来记录一下,这里声明 Listo 本人也是看了很多的戴维营攻略才总结分享给大家这一篇攻略的. 首先,Listo 使用的是一个开源的第三方框架而不是使用系统本身带有的框架, 这个框架的名字叫做 MobileVLCKit 框架,至于框架的获取,Listo 这里也有截图,首先打开终端,执行命令 "$git clone https://github.com/wuqiong/MobileVLCKit-SDK.git&q

攻略:游戏最致命的“票房毒药”

游戏的乐趣在于,设计者用各种"你猜不到"的规则和场景来征服玩家,而玩家则介于"我知道路"和"哎呀,又掉坑里了"的清晰与模糊之间摸索. 文/张书乐 原载于<人民邮电报>2016年5月27日<乐游记>专栏104期 从去年下半年开始,我就一直沉迷于一款经典日本动漫改编的卡牌手游,前些天,我的游戏热情却戛然而止.理由很"奇葩",因为我看到了一份游戏攻略,而且还不是完整版的游戏全程攻略,毕竟对于时下的网游而言,只

R语言教程:写给高级入门者的数据打理攻略

http://developer.51cto.com/art/201312/423612_all.htm 原文地址 如果大家还未完全熟悉R语言.甚至不能轻松利用它实现最基本的处理任务,我建议各位先查阅其它指导文章.帮助自己积累对R语言的认识.但如果大家已经拥有一定的背景知识,希望能够进一步提升自己的开发技能——或者单纯只是想看看R语言如何完成文章中罗列的四项任务——那么请跟着我继续阅读. 学习如何添加column.计算总和.对结果排序以及数据改造. 强大的能力在带来责任之外,也给我们增添了恼人的