C语言新手写扫雷攻略3
界面绘制好后,雷数也布置了,接下来就是游戏的运行过程了,今天先不说具体过程,再来看看需要用到的辅助函数
先是简单的画红旗,鼠标右键的功能是画红旗,至此我们都是在使用函数自己绘图,效率是低,但有助于理解
void DrawRedFlag(int i, int j)
{
setfillstyle(BS_SOLID);
setfillcolor(RED);
bar(8 + j * 20, 35 + i * 20, 8 + j * 20 + 5, 35 + i * 20 + 5);
setcolor(BLACK);
line(8 + j * 20, 35 + i * 20, 8 + j * 20, 35 + i * 20 + 10);
}
里面的坐标算好偏移,可以根据自己游戏的位置自行计算偏移坐标
接下来是重要的雷数统计,统计的是一个格子周围的八个格子的雷数
int MineStatistics(int i, int j)/*统计每个格子周围的雷数*/
{
int nNUM = 0;
if (i == 0 && j == 0)/*左上角格子的统计*/
{
if (Mine[0][1].num == 1)
nNUM++;
if (Mine[1][0].num == 1)
nNUM++;
if (Mine[1][1].num == 1)
nNUM++;
}
else
if (i == 0 && j == 9)/*右上角格子的统计*/
{
if (Mine[0][8].num == 1)
nNUM++;
if (Mine[1][9].num == 1)
nNUM++;
if (Mine[1][8].num == 1)
nNUM++;
}
else
if (i == 9 && j == 0)/*左下角格子的统计*/
{
if (Mine[8][0].num == 1)
nNUM++;
if (Mine[9][1].num == 1)
nNUM++;
if (Mine[8][1].num == 1)
nNUM++;
}
else
if (i == 9 && j == 9)/*右下角格子的统计*/
{
if (Mine[9][8].num == 1)
nNUM++;
if (Mine[8][9].num == 1)
nNUM++;
if (Mine[8][8].num == 1)
nNUM++;
}
else if (j == 0)/*左边第一列格子的统计*/
{
if (Mine[i][j + 1].num == 1)
nNUM++;
if (Mine[i + 1][j].num == 1)
nNUM++;
if (Mine[i - 1][j].num == 1)
nNUM++;
if (Mine[i - 1][j + 1].num == 1)
nNUM++;
if (Mine[i + 1][j + 1].num == 1)
nNUM++;
}
else if (j == 9)/*右边第一列格子的统计*/
{
if (Mine[i][j - 1].num == 1)
nNUM++;
if (Mine[i + 1][j].num == 1)
nNUM++;
if (Mine[i - 1][j].num == 1)
nNUM++;
if (Mine[i - 1][j - 1].num == 1)
nNUM++;
if (Mine[i + 1][j - 1].num == 1)
nNUM++;
}
else if (i == 0)/*第一行格子的统计*/
{
if (Mine[i + 1][j].num == 1)
nNUM++;
if (Mine[i][j - 1].num == 1)
nNUM++;
if (Mine[i][j + 1].num == 1)
nNUM++;
if (Mine[i + 1][j - 1].num == 1)
nNUM++;
if (Mine[i + 1][j + 1].num == 1)
nNUM++;
}
else if (i == 9)/*最后一行格子的统计*/
{
if (Mine[i - 1][j].num == 1)
nNUM++;
if (Mine[i][j - 1].num == 1)
nNUM++;
if (Mine[i][j + 1].num == 1)
nNUM++;
if (Mine[i - 1][j - 1].num == 1)
nNUM++;
if (Mine[i - 1][j + 1].num == 1)
nNUM++;
}
else/*普通格子的统计*/
{
if (Mine[i - 1][j].num == 1)
nNUM++;
if (Mine[i - 1][j + 1].num == 1)
nNUM++;
if (Mine[i][j + 1].num == 1)
nNUM++;
if (Mine[i + 1][j + 1].num == 1)
nNUM++;
if (Mine[i + 1][j].num == 1)
nNUM++;
if (Mine[i + 1][j - 1].num == 1)
nNUM++;
if (Mine[i][j - 1].num == 1)
nNUM++;
if (Mine[i - 1][j - 1].num == 1)
nNUM++;
}
return nNUM;/*把格子周围一共有多少雷数的统计结果返回*/
}
这个功能的返回值就是这个各自周围的雷数,也就是扫雷点开后显示的数字
不是每个格子都有雷,还有连续的区域是没有雷的,所以要现实空白的格子
void ShowWhite(int i, int j)/*显示无雷区的空白部分*/
{
if (Mine[i][j].flag == 1 || Mine[i][j].num == 0)/*如果有红旗或该格处理过就不对该格进行任何判断*/
return;
mineNUM--;/*显示过数字或者空格的格子就表示多处理了一个格子,当所有格子都处理过了表示胜利*/
if (Mine[i][j].roundnum == 0 && Mine[i][j].num != 1)/*显示空格*/
{
DrawEmpty(i, j, 1, WHITE);
Mine[i][j].num = 0;
}
else
if (Mine[i][j].roundnum != 0)/*输出雷数*/
{
DrawEmpty(i, j, 1, WHITE);
_stprintf_s(randmineNUM, _T("%d"), Mine[i][j].roundnum);
setcolor(RED);
outtextxy(6 + j * 20, 32 + i * 20, randmineNUM);
Mine[i][j].num = 0;/*已经输出雷数的格子用0表示已经用过这个格子*/
return;
}
/*8个方向递归显示所有的空白格子*/
if (i != 0 && Mine[i - 1][j].num != 1)
ShowWhite(i - 1, j);
if (i != 0 && j != 9 && Mine[i - 1][j + 1].num != 1)
ShowWhite(i - 1, j + 1);
if (j != 9 && Mine[i][j + 1].num != 1)
ShowWhite(i, j + 1);
if (j != 9 && i != 9 && Mine[i + 1][j + 1].num != 1)
ShowWhite(i + 1, j + 1);
if (i != 9 && Mine[i + 1][j].num != 1)
ShowWhite(i + 1, j);
if (i != 9 && j != 0 && Mine[i + 1][j - 1].num != 1)
ShowWhite(i + 1, j - 1);
if (j != 0 && Mine[i][j - 1].num != 1)
ShowWhite(i, j - 1);
if (i != 0 && j != 0 && Mine[i - 1][j - 1].num != 1)
ShowWhite(i - 1, j - 1);
}
这些是辅助函数,基本就这些!
C语言新手写扫雷攻略3的更多相关文章
- C语言新手写扫雷攻略1
工欲善其事,必先利其器,首先要准备好开发环境,既然是C语言,那就不是WinAPI的扫雷,就是纯的C语言开发,但是以前的C都是TC开发的,现在用肯定是过时很久了,但是也是有解决办法的,某些大神开发出Ea ...
- C语言新手写扫雷攻略4
今天写的是游戏过程的函数,基本的算法前面都解释过了,今天是实现基本的功能 补充一下前面需要用到的头文件 #include<conio.h> //_kbhit() #include<s ...
- 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 ...
随机推荐
- 【Flutter学习】基本组件之TabBar顶部导航
一,概述 TabBar,是材料设计(Material design)中很常用的一种横向标签页.在Android原生开发中,我们常用ViewPage或者一些常用的标签页开源库,来实现并行界面的横向滑动展 ...
- [NOIP模拟测试38]题解
来自达哥的问候…… A.金 显然本题的考察点在于高精而不是裴蜀定理 根据裴蜀定理易得答案为Yes当且仅当$gcd(n,m)=1$,那么考虑怎么在高精度下判互质. 如果$n,m$都能被2整除,那么显然不 ...
- 20175203 2018-2019-2《Java程序设计》第五周学习总结
20175203 2018-2019-2<Java程序设计>第五周学习总结 第六章:接口与实现 本周学习了<Java程序设计>第六章的内容:接口与实现,以下为本周学习总结. 知 ...
- 运放参数的详细解释和分析-part1,输入偏置电流和输入失调电流【转】
一般运放的datasheet中会列出众多的运放参数,有些易于理解,我们常关注,有些可能会被忽略了.在接下来的一些主题里,将对每一个参数进行详细的说明和分析.力求在原理和对应用的影响上把运放参数阐述清楚 ...
- webstorm 分屏
- 运维 03 Linux之文档与目录结构
Linux之文档与目录结构 Linux文件系统结构 Linux目录结构的组织形式和Windows有很大的不同.首先Linux没有“盘(C盘.D盘.E盘)”的概念.已经建立文件系统的硬盘分区被挂载到 ...
- 在VMware下创建windows2008虚拟机
1.创建新的虚拟机 打开VMware软件,点击主页内创建新的虚拟机 2.进入新建虚拟机向导 点击典型,点击下一步 3.在下一步中单击稍后安装操作系统 点击下一步 4.选择操作系统类型 客户机操作系统选 ...
- Django 模型中的CRUD
一.通过 ORM 向 DB 中增加数据 1.Entry.objects.create(属性=值,属性=值) Entry:具体要操作的Model类 ex: Author.objects.create(n ...
- mysql 5.7.20 取得动态sql执行结果
drop procedure test; delimiter ;; CREATE procedure test() -- 取动态sql的值 begin ); ); set v_sqlcounts = ...
- css页面网址
前端必看的文章 1.CSS设置居中的方案总结 https://juejin.im/post/5a7a9a545188257a892998ef 2.阮一峰老师的网站 http://www.ruanyi ...