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 ...
随机推荐
- 安装纯净版debian!
kali更新了1.1.0a,不知道新版的内核哪地方有bug,用着用着就卡死了,一怒之下卸载了装debian. 下载的netinst只有200M,基本上就是刚好能用,不要用硬盘装,会找不到网卡,无线也没 ...
- javaScript 通过location对象获取项目的url
项目中有些要通过jQuery 动态加载,其中需要一些路径,使用相对路径会出现错误,报 $("#t1").html("设置或返回从井号 (#) 开始的 URL(锚)---& ...
- JAVA中一个汉字占多少个字符(转载)
1.先说重点: 不同的编码格式占字节数是不同的,UTF-8编码下一个中文所占字节也是不确定的,可能是2个.3个.4个字节: 2.以下是源码: 1 @Test 2 public void test1() ...
- java 并发——volatile
java 并发--volatile 介绍 维基百科: volatile 是一个类型修饰符(type specifier).volatile 的作用是确保本条指令不会因编译器的优化而省略,且要求每次直接 ...
- C# 网络编程 TcpListener
1.服务断代码 public partial class Server : Form { private bool lk = true; public Server() { InitializeCom ...
- 逻辑回归原理,推导,sklearn应用
目录 逻辑回归原理,推导,及sklearn中的使用 1 从线性回归过渡到逻辑回归 2 逻辑回归的损失函数 2.1 逻辑回归损失函数的推导 2.2 梯度下降法 2.3 正则化 3 用逻辑回归进行多分类 ...
- 使用JMail发送邮件
使用JMail做最简单的文本邮件发送: 第一步.下载JMail和JAF 第二步.解压放到本地classpath中 第三步.使用: public class MailService{ privat ...
- Angular 4 变更检测机制 ChangeDetectorRef 使用方法
1.在angular 2中,回调函数的返回结果,不会自动更新视图层的显示,可以用 ChangeDetectorRef 来驱动angular更新视图. import {ChangeDetectorRef ...
- 【转载】vue install报错run `npm audit fix` to fix them, or `npm audit` for details html
原链接https://www.jianshu.com/p/60591cfc6952 执行npm install 出现如下提醒 added 253 packages from 162 contribut ...
- 2018-8-10-win10-uwp-ApplicationView
title author date CreateTime categories win10 uwp ApplicationView lindexi 2018-08-10 19:16:53 +0800 ...