C语言新手写扫雷攻略4
今天写的是游戏过程的函数,基本的算法前面都解释过了,今天是实现基本的功能
补充一下前面需要用到的头文件
- #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的更多相关文章
- C语言新手写扫雷攻略1
工欲善其事,必先利其器,首先要准备好开发环境,既然是C语言,那就不是WinAPI的扫雷,就是纯的C语言开发,但是以前的C都是TC开发的,现在用肯定是过时很久了,但是也是有解决办法的,某些大神开发出Ea ...
- C语言新手写扫雷攻略3
界面绘制好后,雷数也布置了,接下来就是游戏的运行过程了,今天先不说具体过程,再来看看需要用到的辅助函数 先是简单的画红旗,鼠标右键的功能是画红旗,至此我们都是在使用函数自己绘图,效率是低,但有助于理解 ...
- C语言新手写扫雷攻略2
接下来是游戏的功能设计,要有扫雷的基本功能,左键点击雷区,右键红旗标记,并且可以统计雷数,可以重新开始,以下是游戏的功能初始 void Game(void) { while (1) { if (FLA ...
- C语言新手写扫雷源代码
今天发布源代码,由于写在一个文件里非常乱,所以分三个文件写 绘图和鼠标函数graph.h /*绘图与鼠标相关函数*/ #include<graphics.h> #include <e ...
- 某Facebook工程师写的攻略。
Chapter 1 Interesting read, but you can skip it. Chapter 2 2.1 Insertion Sort - To be honest you sho ...
- 寒城攻略:Listo 教你用Swift 语言编写 IOS 平台流媒体播放器
先展示播放器效果: 依然继承 Listo 本人的强迫症,还是从最初到完毕完整的写一个攻略来记录一下,这里声明 Listo 本人也是看了非常多的戴维营攻略才总结分享给大家这一篇攻略的. 首先,Lis ...
- Nazo解密游戏攻略
啊,终于腾出时间来玩这个游戏了,顺手写一下攻略吧…… 第0关:http://cafebabe.cc/nazo/ 第一关:第一关很简单 点一下就好了 http://cafebabe.cc/nazo/le ...
- 写给C语言新手的话
首先声明啊,写这个是因为一些加我QQ的朋友问我学习经验,我才写的. 另外,如果是二级党,那么请用谭浩强老师的书.然后你就可以不用看了.倒不是有偏见,而是我写的这个东西,根本不是为了考试,而是为了和新手 ...
- Davinci DM6446开发攻略-UBOOT-2009.03移植2 nand flash的烧写
很长一段时间没有更新博客了,是因为要推出新开发方案和做好客户服务工作,忙得不易乐乎.有关DAVINCI U-BOOT的移植,以前写过一篇u-boot-1.3.4(2008年的),其实和这个u-bo ...
随机推荐
- jdbc blob插入及查询操作
首先建一张表 create table picture( picId ) primary key not null, picName ) not null, picfile image null ) ...
- 微信小程序学习笔记(四)--框架-视图层
WXML(WeiXin Markup Language)是框架设计的一套标签语言,结合基础组件.事件系统,可以构建出页面的结构. 数据绑定 使用{{}}绑定数据. 简单绑定 <view clas ...
- 指向自身类型的成员指针的初始化,this不属于类对象的一部分
有下面的一个简单的类: class CNullPointCall{public: static void Test1(); void Test2(); void Test3(int ...
- ES6数组中删除指定元素
知识点: ES6从数组中删除指定元素 findIndex()方法返回数组中满足提供的测试函数的第一个元素的索引.否则返回-1. arr.splice(arr.findIndex(item => ...
- (转)GitHub上想下载单个文件方法
找到该文件,单机raw,如下图: 然后会在网页打开该文件,复制URL,下载即可(如果是不可预览文件,会自动下载). 转自: GitHub上想下载单个文件方法 - Smallcaff的博客 - CSDN ...
- centors7 和 win7 修改开机顺序
打开/boot/grub2/grub.cfg,找到windows对应的项 我的是 Windows 7 (loader) (on /dev/sda1) 执行命令 grub2-set-default &q ...
- CF1168C
CF1168C 从后往前扫一遍维护\(f[x][k]\)表示从开始x至少要走到那个位置才能到达一个第\(k\)位是1的数 #include<iostream> #include<cs ...
- vue+Mint-ui实现登录注册
创建一个组件:注册组件 (register/index.vue.script.js.style.scss,register/header) 注册路由 router/index.js { path: ' ...
- Hibernate4之注解零配置
@Entity ,注册在类头上,将一个类声明为一个实体bean(即一个持久化POJO类) . @Table ,注册在类头上,注解声明了该实体bean映射指定的表(table). @Id用来注册主属性, ...
- go之linux安装
下载地址:https://golang.org/dl/ ubuntu16.04安装过程 官方安装文档:https://golang.org/doc/install?download=go1.11.4. ...