快来看看扫雷的简单实现(C语言,后附完整代码)(上)

简介: 快来看看扫雷的简单实现(C语言,后附完整代码)(上)

扫雷规则简介


实现扫雷前,我们先来看看扫雷的玩法:在一个9×9(初级)、16×16(中级)、16×30(高级)或自定义大小的方块矩阵中随机布置一定量的地雷(初级为10个,中级为40个,高级为99个),再由玩家逐个翻开方块,以找出所有地雷为最终游戏目标,若打开的方块没有雷,则会出现一个数子用于统计该空格附近雷的数量。

这次呢,博主会带领大家完成一个初级的扫雷游戏(9*9),这次博主依旧如前面三子棋游戏实现一样,采用三个文件



game.h 里包含了我们这次所需要的头文件

game.c 里是我们游戏的具体实现

test.c 是我们的一个游戏测试


游戏主界面


作为一个游戏,我们肯定的有一个界面,让使用者知道这是干什么,那我们先写一个主界面吧:


1. void meanu()
2. {
3.  printf("*************************\n");
4.  printf("******  扫雷游戏   ******\n");
5.  printf("******  1.玩游戏   ******\n");
6.  printf("******  2.退出游戏 ******\n");
7.  printf("*************************\n");
8. }


主界面代码实现如下:

 

主界面都实现了,我们肯定的有一个主函数;那么主函数我们应该怎么写呢?

我们在有了三子棋经验后,便知道这个游戏我们需要可以选择,只要不退出可以满足多次游戏,那么我们便可以写出代码了


1. int main()
2. {
3.  int input = 0;
4.  meanu();
5.  srand((unsigned int)time(NULL));//与rand()搭配使用,用于产生随机数
6.  printf("请选择>:");
7.  do
8.  {
9.    scanf("%d",& input);
10.     switch (input)
11.     {
12.     case 1:
13.       game();
14.       break;
15.     case 2:
16.       printf("退出游戏");
17.       break;
18.     default:printf("非法输入,请重新输入");
19.     }
20.   } while (input != 2);
21.   return 0;
22. }


主界面和主函数的成功实现,那么我们test.c就可以写出来了


1. #include "game.h"
2. 
3. void meanu()
4. {
5.  printf("*************************\n");
6.  printf("******  扫雷游戏   ******\n");
7.  printf("******  1.玩游戏   ******\n");
8.  printf("******  2.退出游戏 ******\n");
9.  printf("*************************\n");
10. }
11. 
12. int main()
13. {
14.   int input = 0;
15.   meanu();
16.   srand((unsigned int)time(NULL));
17.   printf("请选择>:");
18.   do
19.   {
20.     scanf("%d",& input);
21.     switch (input)
22.     {
23.     case 1:
24.       game();
25.       break;
26.     case 2:
27.       printf("退出游戏");
28.       break;
29.     default:printf("非法输入,请重新输入");
30.     }
31.   } while (input != 2);
32.   return 0;


头文件


为了防止每次使用函数前都需要声明,所以我们将所有需要的声明和头文件都放在了game.h里面


我们先来看一下所需要用的game.h内容


1. #include <stdio.h>
2. #include <stdlib.h>
3. #include <time.h>
4. 
5. #define ROW 9         //进行宏定义
6. #define COL 9      //
7. #define ROWS  ROW+2    //
8. #define COLS  COL+2    //
9. #define cnt 10
10. 
11. //初始化棋盘
12. void InitBoard(char board[ROWS][COLS], int rows, int cols, char set);
13. //打印棋盘
14. void DisplayBoard(char board[ROW][COL], int row, int col);
15. //布置雷场
16. void SetMine(char board[ROWS][COLS], int row, int col);
17. //排查雷
18. void FindMine(char mine[ROWS][COLS], char show[ROWS][COLS], int row, int col);


在game.h里面我们看到了一些函数的声明,而他们就是我们等会儿需要在game.c里逐一实现函数,接下来看看博主是怎么实现的吧


初始化棋盘


首先我们得先创建数组,博主用的是创建两个二维数组的方式,创建如下


1. char mine[ROWS][COLS];//用来储存含‘0’和‘1’的棋盘,含雷盘
2. char show[ROWS][COLS];//用来储存玩家所看见的棋盘


至于为什么这儿用ROWS和COLS,而不用row和col,主要是为了方便雷数量的判断,后面还会有介绍。

这里初始化时,因为我们mine[ROWS][COLS]里存放的是雷,而我们这里用‘0’和‘1’来表示,‘1’表示雷,而这里初始化时因为没有雷,我们全部初始化为‘0’;show[ROWS][COLS]是展示给玩家的,我们给它全部初始化为‘*’;

InitBoard()函数代码如下


1. void InitBoard(char board[ROWS][COLS], int rows, int cols, char set)
2. {
3.  int i = 0;
4.  for (i = 0; i < rows; i++)
5.  {
6.    int j = 0;
7.    for (j = 0; j < cols; j++)
8.    {
9.      board[i][j] = set;
10.     }
11.   }
12. }


当我们需要使用时,只需要传入我们所需初始化的参数就行


1. InitBoard(mine,ROWS,COLS,'0');
2. InitBoard(show, ROWS, COLS, '*');


打印棋盘


我们希望玩家在选择玩游戏后,可以给玩家打印出以下这样一个棋盘



这个棋盘包含行和列的编码,显示的时9*9,顶上有扫雷游戏的提示,打印的是‘*’,获取这些信息,便可以写出代码如下


1. void DisplayBoard(char board[ROWS][COLS], int row, int col)
2. {
3.  int i = 0;
4.  printf("*****扫雷游戏******\n");//打印扫雷
5.  for (i = 0; i <=col; i++)//打印列的编号
6.  {
7.    printf("%d ", i);
8.  }
9.  printf("\n");
10.   for (i = 1; i <= row; i++)
11.   {
12.     printf("%d", i);//打印行的编号
13.     int j = 1;
14.     for (j = 1; j <= col;j++)
15.     {
16.       printf(" %c", board[i][j]);
17.     }
18.     printf("\n");
19.   }
20. }
21. //i和j从1开始,等于row、col结束,这里传进来的是ROW、COL,也就是9
22. //是为了打印9*9的棋盘


传参如下


DisplayBoard(show, ROW, COL);//打印9*9的棋盘
相关文章
|
2月前
|
存储 安全 数据管理
C语言之考勤模拟系统平台(千行代码)
C语言之考勤模拟系统平台(千行代码)
64 4
|
3月前
|
C语言
扫雷游戏(用C语言实现)
扫雷游戏(用C语言实现)
145 0
|
1月前
|
存储 算法 程序员
C 语言递归算法:以简洁代码驾驭复杂逻辑
C语言递归算法简介:通过简洁的代码实现复杂的逻辑处理,递归函数自我调用解决分层问题,高效而优雅。适用于树形结构遍历、数学计算等领域。
|
2月前
|
存储 安全 物联网
C语言物联网开发之设备安全与代码可靠性隐患
物联网设备的C语言代码安全与可靠性至关重要。一是防范代码安全漏洞,包括缓冲区溢出和代码注入风险,通过使用安全函数和严格输入验证来预防。二是提高代码跨平台兼容性,利用`stdint.h`定义统一的数据类型,并通过硬件接口抽象与适配减少平台间的差异,确保程序稳定运行。
|
2月前
|
并行计算 算法 测试技术
C语言因高效灵活被广泛应用于软件开发。本文探讨了优化C语言程序性能的策略,涵盖算法优化、代码结构优化、内存管理优化、编译器优化、数据结构优化、并行计算优化及性能测试与分析七个方面
C语言因高效灵活被广泛应用于软件开发。本文探讨了优化C语言程序性能的策略,涵盖算法优化、代码结构优化、内存管理优化、编译器优化、数据结构优化、并行计算优化及性能测试与分析七个方面,旨在通过综合策略提升程序性能,满足实际需求。
79 1
|
3月前
|
C语言
初学者指南:使用C语言实现简易版扫雷游戏
初学者指南:使用C语言实现简易版扫雷游戏
70 0
|
9天前
|
存储 算法 C语言
【C语言程序设计——函数】素数判定(头歌实践教学平台习题)【合集】
本内容介绍了编写一个判断素数的子函数的任务,涵盖循环控制与跳转语句、算术运算符(%)、以及素数的概念。任务要求在主函数中输入整数并输出是否为素数的信息。相关知识包括 `for` 和 `while` 循环、`break` 和 `continue` 语句、取余运算符 `%` 的使用及素数定义、分布规律和应用场景。编程要求根据提示补充代码,测试说明提供了输入输出示例,最后给出通关代码和测试结果。 任务核心:编写判断素数的子函数并在主函数中调用,涉及循环结构和条件判断。
46 23
|
9天前
|
算法 C语言
【C语言程序设计——函数】利用函数求解最大公约数和最小公倍数(头歌实践教学平台习题)【合集】
本文档介绍了如何编写两个子函数,分别求任意两个整数的最大公约数和最小公倍数。内容涵盖循环控制与跳转语句的使用、最大公约数的求法(包括辗转相除法和更相减损术),以及基于最大公约数求最小公倍数的方法。通过示例代码和测试说明,帮助读者理解和实现相关算法。最终提供了完整的通关代码及测试结果,确保编程任务的成功完成。
34 15
|
9天前
|
C语言
【C语言程序设计——函数】亲密数判定(头歌实践教学平台习题)【合集】
本文介绍了通过编程实现打印3000以内的全部亲密数的任务。主要内容包括: 1. **任务描述**:实现函数打印3000以内的全部亲密数。 2. **相关知识**: - 循环控制和跳转语句(for、while循环,break、continue语句)的使用。 - 亲密数的概念及历史背景。 - 判断亲密数的方法:计算数A的因子和存于B,再计算B的因子和存于sum,最后比较sum与A是否相等。 3. **编程要求**:根据提示在指定区域内补充代码。 4. **测试说明**:平台对代码进行测试,预期输出如220和284是一组亲密数。 5. **通关代码**:提供了完整的C语言代码实现
48 24
|
5天前
|
存储 C语言
【C语言程序设计——函数】递归求斐波那契数列的前n项(头歌实践教学平台习题)【合集】
本关任务是编写递归函数求斐波那契数列的前n项。主要内容包括: 1. **递归的概念**:递归是一种函数直接或间接调用自身的编程技巧,通过“俄罗斯套娃”的方式解决问题。 2. **边界条件的确定**:边界条件是递归停止的条件,确保递归不会无限进行。例如,计算阶乘时,当n为0或1时返回1。 3. **循环控制与跳转语句**:介绍`for`、`while`循环及`break`、`continue`语句的使用方法。 编程要求是在右侧编辑器Begin--End之间补充代码,测试输入分别为3和5,预期输出为斐波那契数列的前几项。通关代码已给出,需确保正确实现递归逻辑并处理好边界条件,以避免栈溢出或结果
42 16

热门文章

最新文章