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

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的更多相关文章

  1. C语言新手写扫雷攻略1

    工欲善其事,必先利其器,首先要准备好开发环境,既然是C语言,那就不是WinAPI的扫雷,就是纯的C语言开发,但是以前的C都是TC开发的,现在用肯定是过时很久了,但是也是有解决办法的,某些大神开发出Ea ...

  2. C语言新手写扫雷攻略4

    今天写的是游戏过程的函数,基本的算法前面都解释过了,今天是实现基本的功能 补充一下前面需要用到的头文件 #include<conio.h> //_kbhit() #include<s ...

  3. C语言新手写扫雷攻略3

    界面绘制好后,雷数也布置了,接下来就是游戏的运行过程了,今天先不说具体过程,再来看看需要用到的辅助函数 先是简单的画红旗,鼠标右键的功能是画红旗,至此我们都是在使用函数自己绘图,效率是低,但有助于理解 ...

  4. C语言新手写扫雷源代码

    今天发布源代码,由于写在一个文件里非常乱,所以分三个文件写 绘图和鼠标函数graph.h /*绘图与鼠标相关函数*/ #include<graphics.h> #include <e ...

  5. 某Facebook工程师写的攻略。

    Chapter 1 Interesting read, but you can skip it. Chapter 2 2.1 Insertion Sort - To be honest you sho ...

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

    先展示播放器效果:   依然继承 Listo 本人的强迫症,还是从最初到完毕完整的写一个攻略来记录一下,这里声明 Listo 本人也是看了非常多的戴维营攻略才总结分享给大家这一篇攻略的. 首先,Lis ...

  7. Nazo解密游戏攻略

    啊,终于腾出时间来玩这个游戏了,顺手写一下攻略吧…… 第0关:http://cafebabe.cc/nazo/ 第一关:第一关很简单 点一下就好了 http://cafebabe.cc/nazo/le ...

  8. 写给C语言新手的话

    首先声明啊,写这个是因为一些加我QQ的朋友问我学习经验,我才写的. 另外,如果是二级党,那么请用谭浩强老师的书.然后你就可以不用看了.倒不是有偏见,而是我写的这个东西,根本不是为了考试,而是为了和新手 ...

  9. Davinci DM6446开发攻略-UBOOT-2009.03移植2 nand flash的烧写

      很长一段时间没有更新博客了,是因为要推出新开发方案和做好客户服务工作,忙得不易乐乎.有关DAVINCI U-BOOT的移植,以前写过一篇u-boot-1.3.4(2008年的),其实和这个u-bo ...

随机推荐

  1. VC2010 CString.Format使用报错 error C2664

    error C2664: “void ATL::CStringT<BaseType,StringTraits>::Format(const wchar_t *,...)”: 不能将参数 1 ...

  2. mysql授权、删除用户和角色权限

    备份权限 GRANT USAGE ON *.* TO 'backup'@'172.16.0.157' IDENTIFIED BY PASSWORD '*38B4F16EADB1601E713D9F03 ...

  3. Django中ORM对数据库的增删改查操作

         前言 什么是ORM?  ORM(对象关系映射)指用面向对象的方法处理数据库中的创建表以及数据的增删改查等操作. 简而言之,就是将数据库的一张表当作一个类,数据库中的每一条记录当作一个对象.在 ...

  4. dos添加文件夹属性!

    attrib 显示所有文件的属性:参数:+r或-r [文件名] 设置文件属性是否为只读 +h或-h [文件名] 设置文件属性是否隐含 +s或-s [文件名] 设置文件属性是否为系统文件 +a或-a [ ...

  5. Java关于Math类的三个取整方法

    0x01 在java的Math类中有三个关于浮点数取整数的方法,分别是ceil (向上取整) floor(向下取整) round(四舍五入) 三个方法 0x02 ceil 向上取整,取整后总是比原来的 ...

  6. java多线程学习笔记(三)

    java多线程下的对象及变量的并发访问 上一节讲到,并发访问的时候,因为是多线程,变量如果不加锁的话,会出现“脏读”的现象,这个时候需要“临界区”的出现去解决多线程的安全的并发访问.(这个“脏读”的现 ...

  7. 在webpack4 中利用Babel 7取消严格模式方法

    报错信息: Uncaught TypeError: 'caller', 'callee', and 'arguments' properties may not be accessed on stri ...

  8. UML指南系列——活动图

    活动图用来描述传统意义上的流程图

  9. Scrapy框架: pipelines.py设置

    保存数据到json文件 # -*- coding: utf-8 -*- # Define your item pipelines here # # Don't forget to add your p ...

  10. Scrapy框架: 登录网站

    一.使用cookies登录网站 import scrapy class LoginSpider(scrapy.Spider): name = 'login' allowed_domains = ['x ...