通过c语言实现简单的扫雷游戏

通过c语言实现简单的扫雷游戏

1.介绍在实现代码用到的一些知识

这个小游戏用到了分支与循环(在我的文章中有详解),函数的调用,数组,宏定义,多文件,库函数等。
宏定义:#define a b 意思是将b的值给a

多文件:我们写代码时候,代码可能⽐较多,不会将所有的代码都放在⼀个⽂件中;我们往往会根据程序的功能,将代码拆分放在多个⽂件中。 因为函数默认是具有外部链接属性,使得函数在整个⼯程中只要适当的声明就可以被使⽤。⼀般情况下,函数的声明、类型的声明放在头⽂件(.h)中,函数的实现是放在源⽂件(.c)⽂件中。声明:#include“ 文件名”;如:在这里插入图片描述
在这里插入图片描述
像这样创造多个文件使用,zhu.c用来放主函数,fu.c用来放实现程序的模块函数,fu.h用来放一些头文件之类的。

清屏函数system
格式: system(“cls”);
头文件:#include<stdlib.h>
作用:清除屏幕内容。
在这里插入图片描述
正常情况我们会打印hehe
在这里插入图片描述

当我们加入这个函数之后就会将打印出来的hehe删掉。

设置随机雷时用到的库函数:
1 int rand (void);
rand函数会返回⼀个伪随机数,这个随机数的范围是在0~RAND_MAX之间,这个RAND_MAX的⼤⼩是
依赖编译器上实现的,但是⼤部分编译器上是32767。
rand函数的使⽤需要包含⼀个头⽂件是:stdlib.h
那我们就测试⼀下rand函数,这⾥多调⽤⼏次,产⽣5个随机数:
#include <stdio.h>
#include <stdlib.h>
int main()
{
printf(“%d\n”, rand());
printf(“%d\n”, rand());
printf(“%d\n”, rand());
printf(“%d\n”, rand());
printf(“%d\n”, rand());
return 0;
}
在这里插入图片描述
这里运行2次结果都一样(自己可以去试试,无论多少次都是一样的结果)
我们可以看到虽然⼀次运⾏中产⽣的5个数字是相对随机的,但是下⼀次运⾏程序⽣成的结果和上⼀次
⼀模⼀样,这就说明有点问题。
如果再深⼊了解⼀下,我们就不难发现,其实rand函数⽣成的随机数是伪随机的,伪随机数不是真正的随机数,是通过某种算法⽣成的随机数。真正的随机数的是⽆法预测下⼀个值是多少的。⽽rand函数是对⼀个叫**“种⼦**”的基准值进⾏运算⽣成的随机数。
之所以前⾯每次运⾏程序产⽣的随机数序列是⼀样的,那是因为rand函数⽣成随机数的默认种⼦是1。
如果要⽣成不同的随机数,就要让种⼦是变化的。
1.2 srand
C语⾔中⼜提供了⼀个函数叫 srand,⽤来初始化随机数的⽣成器的,srand的原型如下:
1 void srand (unsigned int seed);
程序中在调⽤ rand 函数之前先调⽤ srand 函数,通过 srand 函数的参数seed来设置rand函数⽣成随机数的时候的种⼦,只要种⼦在变化,每次⽣成的随机数序列也就变化起来了。
那也就是说给srand的种⼦是如果是随机的,rand就能⽣成随机数;在⽣成随机数的时候⼜需要⼀个随机数,这就⽭盾了。
1.3 time
在程序中我们⼀般是使⽤程序运⾏的时间作为种⼦的,因为时间时刻在发⽣变化的。
在C语⾔中有⼀个函数叫 time ,就可以获得这个时间,time函数原型如下:
1 time_t time (time_t timer);*
time 函数会返回当前的⽇历时间,其实返回的是1970年1⽉1⽇0时0分0秒到现在程序运⾏时间之间的
差值,单位是秒。返回的类型是time_t类型的,time_t 类型本质上其实就是32位或者64位的整型类
型。
time函数的参数 timer 如果是⾮NULL的指针的话,函数也会将这个返回的差值放在timer指向的内存
中带回去。
如果 timer 是NULL,就只返回这个时间的差值。time函数返回的这个时间差也被叫做:时间戳。
time函数的时候需要包含头⽂件:time.h
如果只是让time函数返回时间戳,我们就可以这样写:
1 time(NULL);//调⽤time函数返回时间戳,这⾥没有接收返回值
那我们就可以让⽣成随机数的代码改写成如下:
#include <stdio.h>
#include <stdlib.h>
#include <time.h>
int main()
{
//使⽤time函数的返回值设置种⼦
//因为srand的参数是unsigned int类型,我们将time函数的返回值强制类型转换
srand((unsigned int)time(NULL));
printf(“%d\n”, rand());
printf(“%d\n”, rand());
printf(“%d\n”, rand());
printf(“%d\n”, rand());
printf(“%d\n”, rand());
return 0;
多运⾏⼏次看看,每次的运⾏就有差异了。
第⼀次运⾏的结果
在这里插入图片描述
第⼆次运⾏的结果
在这里插入图片描述
(注:截图只是当时程序运⾏的结果,你的运⾏结果不⼀定和这个⼀样)
srand函数是不需要频繁调⽤的,⼀次运⾏的程序中调⽤⼀次就够了。

2.逐步分析实现游戏的思路

1 在实现过程中雷和排雷的信息需要用数组来储存
2 规定’1‘是有雷,’0‘无雷
3 通过输入坐标来排查
4 我们要实现9*9的棋局时,列如排查的是(8,6)这个坐标时,我们会访问这个坐标周围的8个位置,此时数组就会出现越界的问题,因此我们将数组的长度和宽度加2,这样就不会存在越界了。
在这里插入图片描述
5 我们每一次选择后棋盘就要更新一次,将我们输入的坐标周围的8个坐标的雷的信息显示出来,还有就是当我们输入的坐标如果周围8个都不是雷的话就会全部展开,这样来节约游戏时间

3.模块化

游戏界面

通过朴实无华的printf将游戏界面打印出来:
在这里插入图片描述
在这里插入图片描述
游戏选择:
在这里插入图片描述

初始化数组

我们设置两个数组来表示雷的信息和覆盖棋盘,先将一个数组都赋为’0‘再通过该数组去布置雷,还有一个数组先用’*‘覆盖,等排雷是将坐标周围的雷的个数再打印在该坐标上,现在我们先初始化:
在这里插入图片描述
在这里插入图片描述

打印棋盘

每次输入坐标之后都将棋盘打印出来:在这里插入图片描述
在这里插入图片描述

布置雷

接下来就是布置雷了,我们用到了3个库函数,将两个随机的值来除去9之后就会得到两个坐标,如果这个坐标为’0‘那么就赋’1‘。当布完之后就打破,完成布雷。在这里插入图片描述
在这里插入图片描述

排雷

最后就是排雷了,我们输入两个坐标,打开坐标,如果为’1‘则失败,若为’0‘则统计坐标周围雷的个数赋给数组然后继续,直到排完。
**计算雷的个数(这里利用了ASCII码表,我的主页有详解)**先将8个数加起来再将8乘’0‘减去返回int值,再加’0‘得出个数,如有一个雷,‘1’的ASCII值为49,‘0’为48,将(49乘1+48乘7)-48乘8返回一个整形1,之后1+‘0’返回一个字符型‘1’,这个1就是周围雷的个数了。
在这里插入图片描述
排雷
在这里插入图片描述
假设我们输入(1,2)得出周围有一个雷在这里插入图片描述

4.最终代码合并

fu.h
在这里插入图片描述
zhu.c
在这里插入图片描述
在这里插入图片描述
fu.c
在这里插入图片描述
在这里插入图片描述在这里插入图片描述

以上就是我对扫雷游戏的理解。

谢谢大家的观看,如果觉得有帮助的话,记得点赞加关注哦。

  • 10
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 4
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 4
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值