码迷,mamicode.com
首页 > 编程语言 > 详细

C语言新手写扫雷攻略2

时间:2014-09-18 22:02:14      阅读:288      评论:0      收藏:0      [点我收藏+]

标签:style   color   使用   ar   for   文件   art   sp   on   

接下来是游戏的功能设计,要有扫雷的基本功能,左键点击雷区,右键红旗标记,并且可以统计雷数,可以重新开始,以下是游戏的功能初始

void Game(void)
{
	while (1)
	{
		if (FLAG == 1)
		{
			GameBegin();//绘制出游戏界面并判断是否玩过和重新开始
			GamePlay();//游戏过程的函数
			if (AGAIN == 1)
			{
				AGAIN = 0;
				continue;
			}
		}
		FLAG = 0;
		if (m.uMsg == WM_LBUTTONDOWN)//鼠标左键按下事件
		{
			MouseGetXY();
			if (MouseX > 90 && MouseX<110 && MouseY>5 && MouseY < 25)
			{
				FLAG = 1;
				continue;
			}
		}
		if (_kbhit())//判断有按键退出
		{
			break;
		}
	}
}

 

此处FLAG是游戏失败后是否重新开始的标志,第一次开始也是如此,而AGAIN是游戏中途并没有玩完又想重新开始的标志,第一次玩首先要绘制游戏界面,下面是绘制函数

void GameBegin(void)
{
	int i, j;
	cleardevice();
	PLAY = 1;
	mineNUM = 0;
	setfillstyle(BS_SOLID);//此处用法和TC不同
	setfillcolor(WHITE);
	bar(0, 0, 200, 230); //设置背景区域
	for (i = 0; i < 10; i++) //绘制每个雷区(小格)
	{
		for (j = 0; j < 10; j++)
		{
			DrawEmpty(i, j, 0, LIGHTGRAY);
		}
	}
	DrawSmile();//画出中间的笑脸
	srand((unsigned)time(NULL));//根据时间给随机数不同的种子数
	for (i = 0; i < 10; i++)
	{
		for (j = 0; j < 10; j++)
		{
			
			Mine[i][j].num = rand() % 8;//随机数产生范围0-7
			
			if (Mine[i][j].num == 1)
			{
				mineNUM++;
			}
			else
			{
				Mine[i][j].num = 2;
			}
			printf("%3d", Mine[i][j].num);
			Mine[i][j].flag = 0;
		}
		printf("\n");
		_stprintf_s(randmineNUM, _T("%d"), mineNUM);//将minrNUM转换成字符串类型
		setbkcolor(WHITE);
		setcolor(RED);
		settextstyle(16, 0, _T("0"));
		outtextxy(2, 2, randmineNUM);
		
	}  mineNUM = 100 - mineNUM;
}

 

其中的绘图函数和TC的名字功能相同,但所传递的参数都有简化,DrawEmpty()函数是画小格的函数,其中的坐标需要从屏幕坐标转换成窗口的坐标,需要了解坐标之间的转换

比方说以屏幕左上角建立坐标系,起点是(0,0),窗口顶点屏幕坐标(x,y),窗口内一点P的屏幕坐标是(xP,yP),则P点的以窗口为原点窗口内坐标是(xP-x,yP-y)

void DrawEmpty(int i, int j, int mode, int color) //画出16*16的小格
{
	setfillstyle(BS_SOLID);
	setfillcolor(color);
	if (mode == 0)
	{
		bar(10 + j * 20 - 8, 40 + i * 20 - 8, 10 + j * 20 + 8, 40 + i * 20 + 8);
	}
	else if (mode == 1)
	{
		bar(10 + j * 20 - 7, 40 + i * 20 - 7, 10 + j * 20 + 7, 40 + i * 20 + 7);
	}
}

 

这个通过for循环画出100个小格

接下来要画中间的黄色笑脸

void DrawSmile(void)
{
	setfillstyle(BS_SOLID);
	setfillcolor(YELLOW);
	fillellipse(90, 5, 110, 25);//绘制椭圆(笑脸)函数,参数为椭圆外切矩形的左上右下角坐标
	setfillstyle(BS_SOLID);
	setfillcolor(BLACK);//画眼睛
	fillellipse(93, 13, 97, 17);
	fillellipse(103, 13, 107, 17);
	bar(97, 20, 103, 21);//画嘴巴
}

 

这些是基本的绘图函数,是了解C比较好的,虽然不及MFC的封装,但是可以了解WinAPI的基本原理就是类似

界面画好后还要布置地雷,这个功能简陋,利用随机数函数创建出地雷,雷数是不可控制的,可以用while循环判断10个雷停止,但很费时间,也可以改种算法伪随机布雷,即限定每个区域最多有几个雷

srand函数是随机数种子数的生成,随着时间的变化产生不同的种子数,需要用到time.h这个头文件

rand()与n求余就是生成0-(n-1)范围内的随机数,具体数学算法自行百度

下面的sprintf是用的宽字符,vs2013是c11标准,其他编译器可以使用sprintf(),用于转换剩余的雷数变成字符串显示

具体函数的语法参考EasyX的官方帮助,今天就到这了!

C语言新手写扫雷攻略2

标签:style   color   使用   ar   for   文件   art   sp   on   

原文地址:http://www.cnblogs.com/acgpiano/p/3980162.html

(0)
(0)
   
举报
评论 一句话评论(0
登录后才能评论!
© 2014 mamicode.com 版权所有  联系我们:gaon5@hotmail.com
迷上了代码!