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

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. 【dart学习】之字典(Map)的相关方法总结

    一,概述 通常来讲,Map是一个键值对相关的对象,键和值可以是任何类型的对象.每个键只出现一次,而一个值则可以出现多次.映射是动态集合. 换句话说,Maps可以在运行时增长和缩小. dart:core ...

  2. SVN server 服务端修改端口号

    SVN server 服务端修改端口号 在实际使用中可能当安装svn server 服务后,发现与后续其他程序端口冲突, 1.打开svn server 管理界面->操作->properti ...

  3. TopCoder - 15135 LongPalindromes

    https://vjudge.net/problem/TopCoder-15135 之前做过:本质不同的回文子序列个数 本题:位置不同即为不同. 如果还是设$f[l][r]$表示$l$,$r$结尾,就 ...

  4. python2读取EXCEL表格内的数据时碰到的问题

    一,今天在剥离自动化的测试数据时,发生了一个错误,错误显示读取不到某个单元格的数据. 因为我使用的是python2,正好那一个单元格出现的是中文汉字,再者通过查看报错日志,让我了解到错误的原因. di ...

  5. 全局配置一个ajax的错误监控

    全局配置一个ajax的错误监控,比如$(document).ajaxError(function(evt, req, settings){    if(req && (req.stat ...

  6. Ajax,ajax封装

    /** * Created by liyinghao on 2016/8/23. */ /*仿jQuery中的ajax方法,简单版实现;封装ajax的工具函数*/ /* * 1 请求方式 type g ...

  7. Windows10系统下,如何彻底删除卸载MySQL

    本文介绍,在Windows10系统下,如何彻底删除卸载MySQL... 1>停止MySQL服务开始->所有应用->Windows管理工具->服务,将MySQL服务停止.2> ...

  8. IOU计算python实现

    def compute_iou(rec1, rec2): """ computing IoU :param rec1: (y0, x0, y1, x1), which r ...

  9. jQuery表单对象属性过滤器再探究(原创)

    上面例子的总结: 1.”+n+”千万不要把前面或者后面的+漏掉了.否则不会出现正确结果 2.$(“:checkbox”).click(countChecked)注意写法,不是click(functio ...

  10. 关于软件IntelliJ IDEA的使用技巧(二)

    二,IntelliJ IDEA的工具栏介绍 2,IntelliJ IDEA菜单栏 (5)code编码 ✌1.Override Methods:覆盖方法 ✌2.Implement Methods:实现方 ...