扫雷是一款家喻户晓的windows自带游戏,为了提高初学者学习兴趣,扫雷也是一个经典的C语言项目,今天就给大家分享一下。

我这个版本提供了可展开,第一次不会被炸死的功能。

/*================================================================# File Name: game.h
# Author: rjm
# mail: rjm96@foxmail.com
# Created Time: 2018年05月03日 星期四 18时14分07秒================================================================*/#pragma once#include <stdio.h>
#include  <stdlib.h>
#include  <time.h>
#define M  10//定义炸弹数量
#define ROW 10//定义棋盘大小
#define COL 10
void init(char mine[ROW][COL], char show[ROW][COL], char spread[ROW][COL]);
void displayboard(char show[ROW][COL]);
void displaymine(char mine[ROW][COL]);
void Set_Mine(char mine[ROW][COL],  int m);
void sweep_Mine(char mine[ROW][COL], char show[ROW][COL],   int x, int y);
int check_win(char mine[ROW][COL], char show[ROW][COL], int m );
void prevent_first_death(char mine[ROW][COL], int x, int y);
int mineNum(char mine[ROW][COL], int x, int y);
void spread(char mine[ROW][COL], char show[ROW][COL], const int x, const int y);
//简易实现扫雷
#include "game.h"//初始化棋盘
void init(char mine[ROW][COL], char show[ROW][COL], char spread[ROW][COL])//初始化棋盘
{int i = 0;int j = 0;for (i = 0; i < ROW-1 ; i++)//初始化9*9棋盘{for (j = 0; j < COL-1; j++){mine[i][j] = ' ';show[i][j] = '*';}}
}
//打印棋盘
void displayboard(char show[ROW][COL])//打印9*9棋盘
{printf("\n==========棋盘==========\n\n");int i,  j;printf("  |");for (i = 1; i < ROW; i++){printf("%d ", i);}printf("\n--|--------------------\n");for(i = 0; i < ROW-1; i++){printf("%2d|", i + 1);for (j = 0; j < COL-1; j++){printf("%c ",show[i][j]);}printf("\n");}
}
//展示雷盘
void displaymine(char mine[ROW][COL]) //展示雷盘 测试时使用
{printf("\n==========雷盘==========\n\n");int i, j;printf("  |");for (i = 1; i <= 10; i++){printf("%d ", i);}printf("\n--|--------------------\n");for (i = 0; i < ROW - 1; i++){printf("%2d|", i + 1);for (j = 0; j < COL - 1; j++){printf("%c ", mine[i][j]);}printf("\n");}
}
//随机放置雷
void  Set_Mine(char mine[ROW][COL], int m) //随机放置雷,可以通过在头文件中修改 M 的值//从而修改 m 的大小改变布置的雷数
{int x, y;srand((unsigned)time(NULL));while(m){x = rand() % 10 + 0;y = rand() % 10 + 0;if (mine[x][y] == ' '){mine[x][y] = '$';m--;}}m = M;
}
int mineNum(char mine[ROW][COL], int x, int y)  //统计周边8个格子的雷数
{int count = 0;if (mine[x - 1][y - 1] == '$'){count++;}if (mine[x - 1][y] == '$'){count++;}if (mine[x - 1][y + 1] == '$'){count++;}if (mine[x][y + 1] == '$'){count++;}if (mine[x + 1][y + 1] == '$'){count++;}if (mine[x + 1][y] == '$'){count++;}if (mine[x + 1][y - 1] == '$'){count++;}if (mine[x][y - 1] == '$'){count++;}return count;
}
void spread(char mine[ROW][COL], char show[ROW][COL], const int x, const int y)   //展开函数
{int ret = 0;int i = 0;int j = 0;int a = x;int b = y;if (   (x >= 0)&& (x <= 9)&& (y >= 0)&& (y <= 9)){if (mine[x - 1][y - 1] == ' ')                        //如果该区域不是雷{a = x - 1;b = y - 1;ret = mineNum(mine, a, b);                     //返回以该区域为中心雷的数量if (ret == 0)                                 //若在这八个区域中哪个区域的周围8个格子无雷{show[a][b] = ' ';                        //如果周围没有雷就向玩家展示‘ ’空格mine[a][b] = '0';                        //将雷盘中的区域改为‘0’可方便测试用spread(mine, show, a, b);              //则将这个区域的坐标赋值给x和y,再次进行展开}else{show[a][b] = '0' + ret;mine[a][b] = '0';}}if (mine[x][y - 1] == ' ')                                //以下的另外七个区域同理{a = x;b = y - 1;ret = mineNum(mine, a, b);if (ret == 0){show[a][b] = ' ';mine[a][b] = '0';spread(mine, show, a, b);}else{show[a][b] = '0' + ret;mine[a][b] = '0';}}if (mine[x - 1][y] == ' '){a = x - 1;b = y;ret = mineNum(mine, a, b);if (ret == 0){show[a][b] = ' ';mine[a][b] = '0';spread(mine, show, a, b);}else{show[a][b] = '0' + ret;mine[a][b] = '0';}}if (mine[x + 1][y - 1] == ' '){a = x + 1;b = y - 1;ret = mineNum(mine, a, b);if (ret == 0){show[a][b] = ' ';mine[a][b] = '0';spread(mine, show, a, b);}else{show[a][b] = '0' + ret;mine[a][b] = '0';}}if (mine[x + 1][y] == ' '){a = x + 1;b = y;ret = mineNum(mine, a, b);if (ret == 0){show[x + 1][y] = ' ';mine[a][b] = '0';spread(mine, show, a, b);}else{show[x + 1][y] = '0' + ret;mine[a][b] = '0';}}if (mine[x + 1][y + 1] == ' '){a = x + 1;b = y + 1;ret = mineNum(mine, a, b);if (ret == 0){show[x + 1][y + 1] = ' ';mine[a][b] = '0';spread(mine, show, a, b);}else{show[x + 1][y + 1] = '0' + ret;mine[a][b] = '0';}}if (mine[x][y + 1] == ' '){a = x;b = y + 1;ret = mineNum(mine, a, b);if (ret == 0){show[x][y + 1] = ' ';mine[a][b] = '0';spread(mine, show, a, b);}else{show[x][y + 1] = '0' + ret;mine[a][b] = '0';}}if (mine[x - 1][y + 1] == ' '){a = x - 1;b = y + 1;ret = mineNum(mine, a, b);if (ret == 0){show[x - 1][y + 1] = ' ';mine[a][b] = '0';spread(mine, show, a, b);}else{show[x - 1][y + 1] = '0' + ret;mine[a][b] = '0';}}}
}
void sweep_Mine(char mine[ROW][COL], char show[ROW][COL],   int x, int y)   //扫雷函数
{int ret = 0;if ( mine[x][y] == ' ' )      //玩家没有踩到雷,即展示该区域周边的雷数,如果雷数为0就显示空格{ret = mineNum(mine, x, y);if (ret == 0){show[x][y] = ' ';}else{show[x][y] = '0' + ret;                           //如果有炸弹就显示炸弹的数量}spread(mine, show, x, y);                      //并在此调用展开函数,对周边区域进行展开}else if(mine[x][y] == '$'){show[x][y] = mine[x][y];                             //如果玩家踩到炸弹就显示$}
}
void prevent_first_death(char mine[ROW][COL], int x, int y)    //防止玩家第一次被炸死
{int m = 0;int n = 0;if(mine[x][y] == '$'){do{m = rand() % 11 + 0;n = rand() % 11 + 0;                  //如果玩家踩到雷,就重新随机一个没有雷的地方,将炸弹移动到那里if (mine[m][n] == ' '){mine[x][y] = ' ';             //将该区域设置为空格mine[m][n] = '$';break;}}while (1);}
}//判断输赢
int check_win(char mine[ROW][COL], char show[ROW][COL], int m)
{int i, j, num = 0;for (i = 0; i < ROW; i++){for (j = 0; j < COL; j++){if (show[i][j] == '*')  //如果在展示棋盘上剩余 * 的数量等于雷的数量,就说明扫雷成功{num++;}else if (show[i][j] == '$')         //如果显示盘上出现了 $ 说明踩到了雷{return 1;}}}if(M == num)return 0;return -1;
}
/*================================================================# File Name: test.c
# Author: rjm
# mail: rjm96@foxmail.com
# Created Time: 2018年05月03日 星期四 18时15分26秒================================================================*/#include "game.h"//游戏菜单
void menu()
{printf("=======================================\n");printf("---------------扫雷游戏----------------\n");printf("=====1,开始================2,退出======\n");printf("=======================================\n");
}void game()
{char mine[ROW][COL];char show[ROW][COL];char spread[ROW][COL];int x, y, m;int row, col;int count=0;int ret;row = ROW;col = COL;m = M;init(mine, show, spread);displayboard(show);Set_Mine(mine, m);displaymine(mine);do{displayboard(show);count++;printf("==========开始扫雷>:");scanf("%d %d", &x, &y);getchar();x = x - 1;y = y - 1;if (count == 1){prevent_first_death(mine, x, y);}sweep_Mine(mine, show, x, y);ret = check_win(mine, show, m);if(ret == 1){displayboard(show);printf("\n=========踩到炸弹! gg========\n\n");break;}else if(ret == 0){displayboard(show);printf("\n==========扫雷成功!==========\n\n");break;}}while (1);
}int main()
{int n = 0;do{menu();printf("=====请选择=>");scanf("%d", &n);printf("==================================\n");getchar();if(n == 1){game();}else if(n == 2){printf("\nbye!\n");break;}else{printf("输入有误 重新输入\n");}}while (1);printf("\n\n\n");printf("\n\n\n");printf("\n\n\n");return 0;
}

效果展示


C语言经典项目之二——扫雷相关推荐

  1. c语言期中项目实战二—简易扫雷,思路分析加代码详细注释

    c语言期中项目实战二-简易扫雷,思路分析+代码详细注释 游戏介绍 项目步骤 模块化编程 设置菜单 设置棋盘 打印棋盘 布置雷 排查雷 总结及总代码和详细注释 游戏介绍 扫雷这个经典游戏,直到现在仍有很 ...

  2. C语言经典项目——超市管理系统

    大家学C语言有被各种各样的系统支配过吧,学生管理系统,图书管理系统,超市管理系统,火车购票系统等等,这里放一个自己写的简易版超市管理系统,用来勉励自己继续学习. 首先是一个主函数,超市的毛坯房 voi ...

  3. C语言经典项目开发——连连看小游戏

    大家应该都玩过连连看,游戏规则不多说了,我们先看看设计思路. 第一件事要根据游戏玩法确定程序的数据结构,不同的数据结构决定了不同的算法设计,用错了数据结构可能直接让代码复杂好几倍. 连连看中玩家操作的 ...

  4. 知识分享:值得学习的C语言经典开源项目

    点击上方蓝字关注我,了解节气咨询 听上去有些荒谬,C语言的产生竟然源于一个失败的项目.1969年,通用电气.麻省理工学院和贝尔实验室联合创立了一个庞大的项目--Multics工程.该项目的目的是创建一 ...

  5. Go语言经典库使用分析(六)| Negroni 中间件(二)

    Go语言经典库使用分析,未完待续,欢迎扫码关注公众号flysnow_org或者网站http://www.flysnow.org/,第一时间看后续系列.觉得有帮助的话,顺手分享到朋友圈吧,感谢支持. 上 ...

  6. C语言经典题目(二)

    失去兴趣的人终将是去奋斗的价值观. --本人 大家好,这一篇文章和大家分享一下C语言经典习题第二章,这些思想挺重要的,是打江山的基础.值得大家看一看. 一.判断一个数是几位数 用户输入一个数,然后用代 ...

  7. 1000以内完数c语言程序_C语言经典面试题目及答案详解(二)

    接着上次来说,C语言经典面试题目及答案详解(一)当中大部分是一些概念和理解的东西 ,今天说一说实践操作,有关c的经典程序. 1.输出9*9口诀.共9行9列,i控制行,j控制列. #include &q ...

  8. c语言sort函数_C语言经典面试题目及答案详解(二)

    接着上次来说,C语言经典面试题目及答案详解(一)当中大部分是一些概念和理解的东西 ,今天说一说实践操作,有关c的经典程序. 1.输出9*9口诀.共9行9列,i控制行,j控制列. #include 2. ...

  9. Go语言经典库使用分析(二)| Gorilla Context

    Go语言经典库使用分析,未完待续,欢迎扫码关注公众号flysnow_org或者网站http://www.flysnow.org/,第一时间看后续系列.觉得有帮助的话,顺手分享到朋友圈吧,感谢支持. 在 ...

最新文章

  1. 用Java中的HashSet写一个学生管理系统(添加、删除、修改、查询学生信息)
  2. matlab离散系统 响应,离散系统的频率响应和输出响应的matlab实现
  3. y电容如何选型_常用电子元器件分类选型以及单端反激正激变压器设计 (MOS管、电感部分)...
  4. vue native
  5. html:(20):使用下拉框进行多选和使用提交按钮提交
  6. Mybatis的案例和接口代理开发和模板配置
  7. VS2010中无法嵌入互操作类型“......”,请改用适用的接口的解决方法
  8. 单词计数 soj1076
  9. 高性能MySQL 第3版(中文)pdf
  10. MySQL安装配置+Navicat安装配置
  11. QA视角看数据匿名化
  12. 柯达i2400批量自动扫描仪 JoySailScan控件转出的Base64尾部永远多一个'/',将导致解码失败
  13. Ubuntu 通过mentohust 锐捷连接校园网
  14. 如何选出一名优秀的项目经理?
  15. DiskTrix UltimateDefrag(磁盘碎片整理软件) v6.0.22.0破解版
  16. 记录一次在JavaWeb项目中,运行tomcat的时候,遇到XX程序包不存在的一系列排查问题。
  17. 第9章 项目成本管理
  18. html怎么让图片变灰色,利用CSS设置图片黑白/灰色效果,同时适用于整站变灰
  19. 【codeforces gym】Increasing Costs
  20. 机器人与经济账的关联

热门文章

  1. Android面试题收集(有具体答案)
  2. SpringCloud(八) 微服务安全实战 Prometheus配置grafana可见性监控,ELK日志,pinpoint追踪(Tracing,Metrics,Logging)
  3. iMX6ul开发指导
  4. 告别硬编码,MySQL 如何实现按某字段的不同取值进行统计?
  5. 白酒行业如何结合互联网模式突破年营业额过亿
  6. Oracle 触发器的使用(带案例详解)
  7. 假设检验中两类错误及最小样本量计算
  8. 中间选民定理(迭代剔除劣势策略,换位思考)
  9. Jeecg Boot 2.2 首个里程碑版本发布,基于SpringBoot的低代码平台
  10. mysql data masking_Dynamic Data Masking 动态数据脱敏