文章目录

  • 头文件定义、函数声明
  • 函数定义
    • 游戏规则设定
    • 布置地雷
    • 游戏实现函数
    • 菜单函数以及主函数定义
  • 总结

头文件定义、函数声明

下面就是扫雷中使用到的所有函数,为了省事我把所有的代码都放在一个C文件中实现

宏定义中设置了游戏的界面布局,以及设置地雷的个数(这里默认的是10个地雷),界面是一个9*9的方格布局

如图:

代码如下:

#include<stdio.h>
#include<stdlib.h>
#include<time.h>//布局9*9方格
#define ROW 9
#define COL 9//多出隐藏的两行两列用来补全边缘棋盘6个方格凑9个方便计算
#define ROWS    ROW + 2
#define COLS    COL + 2#define MINE_COUNT 10//地雷个数/*******************************************************************************///游戏实现
void play();
//初始化界面布局
void InitBoard(char board[ROWS][COLS], int rows, int cols, char set);
//打印布局
void DisplayBoard(char board[ROWS][COLS], int rows, int cols);
//布置地雷
void SetMine(char board[ROWS][COLS], int row, int col);
//判断成功排除后剩下的方格数是否等于地雷数
int IsWin(char show[ROWS][COLS], int row, int col);
//使用递归函数来实现周围没地雷时展开多个
void spread(char mine[ROWS][COLS], char show[ROWS][COLS], int x, int y);
//计算周围地雷个数
int mine_count(char mine[ROWS][COLS], int x, int y);
//扫雷
void FindMine(char mine[ROWS][COLS], char show[ROWS][COLS], int row, int col);
//递归实现连续排除周围地雷
void spread(char mine[ROWS][COLS], char show[ROWS][COLS], int x, int y);/*******************************************************************************/

函数定义

游戏规则设定

这里使用了函数递归的方式来实现周围8个方格如果都没有地雷的话就一次性展开使用空格来填补,以及通过字符的ASCII码值来计算周围八个方格中地雷的数量以数字形式显示周围地雷个数。

接下来就可以进行简单的排雷操作了,输入坐标进行排雷,直到排完所有雷则通过游戏,如果输入的方格坐标为之前布置的雷坐标那么恭喜你踩到雷了游戏结束,你可以选择继续玩或者直接退出。

如图:

代码如下:

int IsWin(char show[ROWS][COLS], int row, int col)
{int num = 0;//排除一个地雷时便进行累加for (int i = 1; i <= row; i++){for (int j = 1; j <= col; j++){if (show[i][j] == '*')num++;}}return num;
}void spread(char mine[ROWS][COLS], char show[ROWS][COLS], int x, int y)
{int count = mine_count(mine, x, y);//周围地雷的个数(此时是字符的ASCII码值)if (count == 0){show[x][y] = ' ';int i = 0, j = 0;for (i = -1; i <= 1; i++){for (j = -1; j <= 1; j++){//连续排除时限制范围在棋盘范围内if ((x + i) > 0 && (y + i) > 0 && (x + i < ROWS) && (y + j < COLS) && show[x + i][y + j] == '*'){        spread(mine, show, x + i, y + j);//递归实现周围如果都没地雷连续排除}}}}else{show[x][y] = count + '0';//将字符ASCII码值转换为数字从而显示}
}int mine_count(char mine[ROWS][COLS], int x, int y)
{//将周围八个方格中字符的ASCII码值之和减去八个‘0’的值得到周围地雷个数return mine[x - 1][y] +mine[x - 1][y - 1] +mine[x][y - 1] +mine[x + 1][y - 1] +mine[x + 1][y] +mine[x + 1][y + 1] +mine[x][y + 1] +mine[x - 1][y + 1] - 8 * '0';
}void FindMine(char mine[ROWS][COLS], char show[ROWS][COLS], int row, int col)
{int x = 0, y = 0;while (1){printf("请输入排雷坐标:>");loop:scanf("%d%d", &x, &y);if (x >= 1 && x <= row && y >= 1 && y <= col)//判断坐标是否合法{if (mine[x][y] == '1')//‘1’为地雷{printf("你已踩到雷,游戏结束\n");DisplayBoard(mine, ROW, COL);break;}else{spread(mine, show, x, y);//计算周围地雷数量,连续排除无雷的方格DisplayBoard(show, ROW, COL);}}else{printf("请输入正确的坐标:");goto loop;}int ret = IsWin(show, row, col);if (ret == MINE_COUNT)//当累加的地雷数量等于布置地雷的数量则说明地雷全部排除{printf("恭喜你,通关成功!\n");break;}}
}/*******************************************************************************/

布置地雷

这里使用了rand()函数在该方格没有地雷的情况下随机布置相应的地雷,有地雷的方格值为1,没有地雷的方格值为0,布置完地雷后再使用打印函数将界面布局打印出来

扩展:

在C语言中,我们一般使用 <stdlib.h> 头文件中的rand()函数来生成随机数

int rand (void);        //void 表示不需要传递参数。

但是多次运行上面的代码,你会发现每次产生的随机数都一样

实际上,rand() 函数产生的随机数是伪随机数,是根据一个数值按照某个公式推算出来的,这个数值我们称之为“种子”,我们可以通过 srand() 函数来重新“播种”,这样种子就会发生改变。

void srand (unsigned int seed);

它需要一个 unsigned int 类型的参数。在实际开发中,我们可以用时间作为参数,只要每次播种的时间不同,那么生成的种子就不同,最终的随机数也就不同。

使用<time.h>头文件中的 time() 函数即可得到当前的时间(精确到秒),就像下面这样:

srand((unsigned)time(NULL));

代码如下:

void SetMine(char board[ROWS][COLS], int row, int col)
{int count = MINE_COUNT;//布置地雷数量while (count){//当该方格内没有地雷时随机布置相应数量地雷int x = rand() % row + 1;//(行,随机数范围1~9)int y = rand() % col + 1;//(列,随机数范围1~9)if (board[x][y] == '0')//判断没有地雷{board[x][y] = '1';//布置地雷count--;//直到布置完所有地雷}}
}void DisplayBoard(char board[ROWS][COLS], int row, int col)
{int i = 0, j = 0;for (i = 0; i <= col; i++)//打印列号{printf(" %d ", i);}printf("\n");for (i = 1; i <= row; i++){printf(" %d ", i);//打印行号for (j = 1; j <= col; j++){printf(" %c ", board[i][j]);//打印9*9方格内字符布局}printf("\n");}printf("\n");
}void InitBoard(char board[ROWS][COLS], int rows, int cols, char set)
{int i = 0, j = 0;for (i = 0; i < rows; i++){for (j = 0; j < cols; j++){board[i][j] = set;//初始化所有方格内的字符}}
}/*******************************************************************************/

游戏实现函数

首先初始化游戏布局并打印出来,之后进行布置地雷以及计算周围八个方格中地雷的数量,最后开始扫雷

如图:

代码如下:

void play()
{//随机数种子,time函数的返回值生成时间戳,保证每次随机布置的地雷位置不同srand((unsigned int)time(NULL));//地雷信息的存储char mine[ROWS][COLS] = { 0 };//布置好的地雷信息11*11char show[ROWS][COLS] = { 0 };//排查出的地雷信息11*11InitBoard(mine, ROWS, COLS, '0');//将方格置为字符‘0’也就是无地雷状态InitBoard(show, ROWS, COLS, '*');//将方格内字符初始化为*达到隐藏效果DisplayBoard(show, ROW, COL);//DisplayBoard(mine,ROW,COL);//显示地雷位置SetMine(mine, ROW, COL);FindMine(mine, show, ROW, COL);
}/*******************************************************************************/

菜单函数以及主函数定义

这里是进入游戏的一个简单的选择菜单界面,通过选择(1/2)来执行相应的操作,调用该游戏实现函数以及退出游戏和错误判断

如图:

代码如下:

int main()
{//菜单选择界面int input = 0, choose = 0;printf("&---------------------------&\n");printf("|        1、扫雷            |\n");printf("|---------------------------|\n");printf("|        2、退出            |\n");printf("&---------------------------&\n");printf("请选择(1/2)>:");do{scanf("%d", &input);switch (input){case 1:while (1){printf("\n");play();printf("&---------------------------&\n");printf("|        1、继续            |\n");printf("|---------------------------|\n");printf("|        2、退出            |\n");printf("&---------------------------&\n");printf("请输入你的选择:");loop:scanf("%d", &choose);switch (choose){case 1:break;case 2:return 0;default:printf("请输入正确的选项:");goto loop;}}case 2:printf("退出成功!\n");return 0;default:printf("请输入正确的选项:");break;}} while (input);return 0;
}/*******************************************************************************/

总结

  以上就是个人分享的关于扫雷游戏所有的代码,用C语言简单的实现了扫雷这个小游戏,虽然在界面和功能的实现上都很粗糙,但是对于一个初学C语言小白的我来讲也是一个小小的进步,也希望自己继续加油之后写出更优秀的代码

C语言实现扫雷游戏(完整版)相关推荐

  1. C语言实现扫雷游戏(超详细讲解+全部源码)

    电子信息 工科男 一点一点努力! 文章目录 前言 一.游戏介绍 二.游戏设计思路 二.具体步骤 1.创建test.c和game.c源文件以及 game.h头文件 2.创建菜单 3.创建雷盘 4.初始化 ...

  2. c语言程序设计扫雷游戏实验报告,C语言程序设计扫雷游戏实验报告.doc

    C语言程序设计扫雷游戏实验报告 中南大学 程序设计基础实践报告 题 目 设计一个和window系统类似的小游戏[挖地雷] 学生姓名 张兰兰 学 院 信息科学与工程学院 专业班级 物联网工程1301班 ...

  3. c语言扫雷程序设计流程图,c语言程序设计扫雷游戏实验报告

    c语言程序设计扫雷游戏实验报告 中南大学 程序设计基础实践报告 题 目 设计一个和window系统类似的小游戏[挖地雷]学生姓名 张兰兰 学 院 信息科学与工程学院 专业班级 物联网工程1301班 完 ...

  4. c语言学生信息系统 完整版,C语言 学生信息管理系统(完整版).docx

    C语言 学生信息管理系统(完整版) 电子科技大学成都学院 程序综合设计论文 论文题目 学生信息管理系统 学生姓名 魏国 学 号 1340840625 专 业 机械设计制造及其自动化 系(分院) 电子工 ...

  5. 兰州交通大学C语言课程设计,兰州交通大学C语言课程设计报告(完整版).doc

    您所在位置:网站首页 > 海量文档 &nbsp>&nbsp高等教育&nbsp>&nbsp实验设计 兰州交通大学C语言课程设计报告(完整版).doc12 ...

  6. 用c语言编写最大最小值_C语言学习教程,用C语言编写扫雷游戏

    本文实例为大家分享了C语言实现扫雷游戏及其优化的具体代码,供大家参考,具体内容如下 关于扫雷优化 1.核心思想:使用两个二维数组进行设计,一个用于显示,一个用于后台雷的布置. 2.使用宏常量,后期可以 ...

  7. c++扫雷游戏代码_C语言学习教程,用C语言编写扫雷游戏

    本文实例为大家分享了C语言实现扫雷游戏及其优化的具体代码,供大家参考,具体内容如下 关于扫雷优化 1.核心思想:使用两个二维数组进行设计,一个用于显示,一个用于后台雷的布置. 2.使用宏常量,后期可以 ...

  8. 超详细分解c 语言——实现扫雷游戏(详解)

    之前利用三子棋程序,介绍探讨了 c语言简单游戏编写主要模块及使用方法. 今天,我们就利用这个经典扫雷游戏,来加强对于程序思路的编写及思路. 目录 前引 游戏规则介绍 一.基本游戏思路(游戏实现方法) ...

  9. c语言扫雷游戏计时功能_C语言实现扫雷游戏(可以自动展开)

    前言 本篇博客主要介绍如何使用C语言实现扫雷游戏. 一.游戏规则 在一张ROW行COL列的地图上存在MINE_COUNT个地雷.玩家输入坐标翻开格子,若没有踩雷,则计算此格子周围8个格子的地雷总数,并 ...

  10. 小学生c语言入门ppt,C语言入门至精完整版46759.ppt

    C语言入门至精完整版46759 第10章 指针 C语言程序设计 第十章 指针 地址和指针的概念 变量的指针和指向变量的指针变量 数组与指针 字符串与指针 指向函数的指针 返回指针值的函数 指针数组和指 ...

最新文章

  1. lucene构建同义词分词器
  2. 刚刚引来985大学建校区,这座城市再牵手世界名校办学!
  3. Javascript中最常用的61段经典代码
  4. ABAP 屏幕上动态修改按钮的图标
  5. python中的几种copy用法_Python3中copy模块常用功能及其他几种copy方式比较
  6. Spring Cloud:Eureka Server控制台
  7. 旅游服务商Bikego完成A轮融资,共建创投、马蜂窝投资
  8. 一个很好用的DBHelper类(包括使用SQL语句 存储过程 事务 做相关操作) 入门级
  9. 一些科研中经常用到的工具
  10. NoSQL数据库探讨- 为什么要用非关系数据库?
  11. DBeaver连接SqlServer报“The server selected protocol version TLS10 is not accepted by client prefere”的错误
  12. 金融风控建模全流程(Python,收藏)
  13. pandoc如何使用自定义样式导出docx文档
  14. 电脑连接热点无internet访问权限_电脑连接手机热点时出来无internet安全是什么意思?...
  15. python掷骰子实验报告_python掷骰子游戏
  16. 为什么 DNS 使用 UDP 协议
  17. 动漫人物脸型怎么画?如何画好动漫人物脸型?
  18. 高3老师给大一学生的一封信
  19. 基于Revit铝模板设计-区域配模
  20. 云智慧陆兴海:统一运维体系为数字政府建设保驾护航

热门文章

  1. 十大主流集群调度系统大盘点
  2. 6.Z字形转换(ZigZag Conversion)
  3. AMD第二代7nm GPU现身:原生支持光追;Facebook曾洽谈收购Fitbit 但谷歌的报价是其两倍……...
  4. 【Swift初见】Swift数组
  5. 秦嘉哲:9.6黄金白银原油走势分析及操作建议
  6. 《零基础安装 Oracle 数据库》单机系列 ④ 一键快速安装 Oracle 19C 数据库
  7. 辛易校园:最新校园市场营销策略
  8. 使用WebSocket模拟WebQQ实现简单的聊天
  9. eclipse--使用操作
  10. Eclipse SVN connector 单独安装