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

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

#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("你赢了"));
}

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

C语言新手写扫雷攻略4的更多相关文章

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

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

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

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

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

    接下来是游戏的功能设计,要有扫雷的基本功能,左键点击雷区,右键红旗标记,并且可以统计雷数,可以重新开始,以下是游戏的功能初始 void Game(void) { while (1) { if (FLA ...

  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. leetcode骚题目列表

    114,二叉树原地前序遍历转链表 令人不舒服的空间限制 4,O(logn)寻找两个数组的中位数 感觉诡异又很其妙的二分 279,判断一个数可拆成最少几个平方数的和 有O(n)解法,如果把sqrt视为O ...

  2. 【软工项目Beta阶段】第10周Scrum会议博客

    第十周会议记录 小组GitHub项目地址https://github.com/ouc-softwareclass/OUC-Market 小组Issue地址https://github.com/ouc- ...

  3. null-ouc 小组冲刺阶段博客目录

    null-ouc Beta冲刺阶段博客目录 github:https://github.com/orgs/OUC-null/people  一.Scrum Meeting 1. [第十周会议记录](h ...

  4. subsequence 2

    题目链接 题意:每次给出两个字母 和 只有这两个字母的原字符串的子序列,最后让你输出原字符串. 思路:先将字符转换为hash值,然后再转换成图,就是一个拓扑排序了,然后满足不了的情况有两种,一个是构造 ...

  5. Python之-爬虫

    1.得到页面的HTML代码 第一个参数是URL 第二三个参数可以不传送,数据和时间 2.request请求 HTTP是基于请求和应答的,客户端发出请求,服务端做出响应,所以urllib2创建一个req ...

  6. windows10下安装Mysql 5.6(zip格式安装包)

    5.6的安装包是一个zip文件,里面包含了data(有表空间文件和日志文件),bin等文件夹.不同于以往的只需要双击安装.msi就行了.因此,在此记录下安装包是.zip时的安装步骤. 1下载 进htt ...

  7. 关于Extjs6.0 controller文件过大,实现模块化分离

    Extjs一般都是一个视图对应着一个controller 一旦碰到视图中逻辑过于繁琐造成controller文件过大不利于维护和修改,所以要通过混入mixins混入功能来实现模块化! 首先创建一个视图 ...

  8. UVA1152_4 Values whose Sum is 0

    中途相遇法,这题目总结后我感觉和第一篇博客很像,他们都取了中间,也许这就是二分的魅力吧 这题题意就是从ABCD四个集合中选四个元素使他们的和为0 题意很简单,但是实现起来很容易超时,不能一个一个枚举 ...

  9. 2019秋季学期第2周Java学习总结

    本周在第一周接触认识Java后对该编程语言有了进一步了解,明白了Java的类型:包括Application程序,Applet程序.知道了一个Java程序的关键字(public class).主方法(p ...

  10. 关于java使用json不能够使用报没有导包的问题,以及前后台交互json数据的使用

    博客搬迁,给你带来的不便,敬请谅解! http://www.suanliutudousi.com/2017/12/02/%e5%85%b3%e4%ba%8ejava%e4%bd%bf%e7%94%a8 ...