利用C语言怎么编写一个扫雷小游戏

  介绍

本篇文章为大家展示了利用C语言怎么编写一个扫雷小游戏,内容简明扼要并且容易理解,绝对能使你眼前一亮,通过这篇文章的详细介绍希望你能有所收获。

<强>扫雷游戏规则:

1,踩过所有非雷格子即扫雷成功,踩到雷即游戏结束。
2,点击方格,如果出现数字,数字表示这个格子周围八个格子的雷的个数。

<强>一、如何实现?

<强> 1。如何实现雷与雷周围的信息不冲突?

如果采用一个二维数组,1表示雷,0表示非雷,那么某一坐标周围如果雷的个数是1,就会与前面冲突,所以设定两个字符型(char)数组,数我组用来存储雷的信息,数组显示用来存放排查出来的雷的信息(周围八个格子中雷的个数)

<强> 2。如何避免使用数组时越界?

如果设置格子的大小为9×9,在查找边界格子(如下图红框内的格子)周围的雷的个数时会越界查找,为避免越界查找,将格子扩大一圈,但是只使用中间9×9部分的格子。

利用C语言怎么编写一个扫雷小游戏

<强> 3。如何实现点击一个格子展开一片的效果?

1,首先,要了解展开一片的条件,当选择的格子不是雷,并且格子周围没有雷时,才会有展开一片的效果。
2,采用递归的方式实现,按照一定的方向依次寻找,直到某个格子周围有雷时跳出,返回上一次递归。

递归要注意递归的截至条件,并且要注意数组的边界。

<强>二,具体代码及实现过程

<强> 1。初始化棋盘

两个字符数组大小相同,只是初始化的字符不同,所用采用同一个初始化函数,通过传参来确定初始化的字符。

void  InitBoard (arr char (行)关口,,int 行,,int 关口,,char 集)//设置为初始化的字符   {   ,int 小姐:=,0;   ,int  j =, 0;   ,for (小姐:=,0;,小姐:& lt;,行;,我+ +)   ,{   ,for  (j =, 0;, j  & lt;,关口;,j + +)   ,{   ,arr[我][j],=,设置;   ,}   ,}   }

<强> 2。打印棋盘

代码如下(示例):打印棋盘也是通过传参的方式,为了在选择格子时方便,打印出行号列号

void  DisplayBoard (arr char (行)关口,,int 行,int 坳)   {   ,int 小姐:=,0;   ,int  j =, 0;   ,for (小姐:=,0;,小姐:& lt;=, col ;,我+ +)   ,{   ,printf (“% d “,, i);//打印出列号   ,}   ,printf (“\ n");   ,for (小姐:=,1,,小姐:& lt;=,行;,我+ +)   ,{   ,printf (“% d “,, i);//打印出行号=,for  (j  1;, j  & lt;=,坳;,j + +)   ,{   ,printf (“% c “arr[我][j]);   ,}   ,printf (“\ n");   ,}   }

<强> 3。放置雷

生成1 - 10间的随机数,利用随机数确定放置雷的行和列,放置雷之前要判断此位置是否被放置过,如果被放置过就换一个随机数,直至放满指定的雷的个数。

void  SetMine (char 我(行)关口,,int 行,int 坳)   {   ,int  count =, EASY_COUNT;//雷的总数   ,while (计数)   ,{   ,int  x =, rand (), %, row  +, 1;//随机产生行号   ,int  y =, rand (), %, col  +, 1;//随机产生列号   我,if  ([x] [y],==, & # 39; 0 & # 39;)//没被放置过雷   ,{   ,我的[x] [y],=, & # 39; 1 & # 39;;   ,计数,   ,}   ,}   }

<>强4。排雷

1,排雷首先要确定输入的坐标是否有效,无效坐标需要重新输入。
2,如果选择的格子是雷,则游戏结束。
3,如果选择的格子不是雷,并且格子周围没有雷,将显示数组中对应的格子置为空格,递归按照某一顺序查找其他方向,递归的截止条件为格子周围有雷存在。递归时要注意判断格子没有被查找过,并且要注意坐标的范围不能超过0 - 9,否则会展开出错。

void  SearchMore (char 显示(行)关口,,char 我(行)关口,,int  x,, int  y, int  *,赢得)//不是雷   {   ,while (我[x] [y],==, & # 39; 0 & # 39;,,,,显示[x] [y],==, & # 39; * & # 39;,,,, x 祝辞=,1,,,,x  & lt;=, ROW ,,, y 祝辞=,1,,,,y  & lt;=,上校)   ,{   ,if  (Get_Mine_Count(我的,,x,, y),==, 0)   ,{   ,显示[x] [y],=, & # 39;, & # 39;;   ,赢(*)+ +;   我,SearchMore (,,,, x 作用;1,,y,,赢得);   我,SearchMore (,,,, x 作用;1,y 作用;1,赢);   我,SearchMore (,,,, x,, y 作用;1,赢);   我,SearchMore (,,,, x  +, 1, y 作用;1,赢);   我,SearchMore (,,,, x  +, 1,, y,,赢得);   我,SearchMore (,,,, x  +, 1, y  +, 1,赢);   我,SearchMore (,,,, x,, y  +, 1,赢);   我,SearchMore (,,,, x 作用;1,y  +, 1,赢);   ,}   其他的,   ,{   ,赢(*)+ +;   ,显示[x] [y],=, Get_Mine_Count(我的,,x,, y), +, & # 39; 0 & # 39;;   ,打破;   ,}   ,}   }

利用C语言怎么编写一个扫雷小游戏