还是说一下:发的这些小游戏都是第一个版本,之后改进的话都会在标题中声明。

上一个游戏三子棋:

>> 步步为营,拿下三子棋<<


来看这次扫雷游戏的思路:

1.创建游戏界面菜单

2.创建游戏内容:

初始化场景  打印场景

埋雷          +         扫雷

依旧是:

创建 game.h 头文件来声明函数

创建 game.c 源文件来定义函数

创建   test.c   源文件来运行游戏


目录

一,创建菜单

二,创建游戏内容

1.场景创建和初始化

2.场景打印

3.埋雷

4.排雷

完整代码

1.game.h

2.game.c

3.test.c


一,创建菜单

先明确要做什么,选择合适的语句来对想法进行实现:

test.cvoid menu()
{printf("*******************\n");printf("*****  1.play  ****\n");printf("*****  0.exit  ****\n");printf("*******************\n");
}void test()
{int input = 0;do{menu();printf("请选择:");scanf("%d",&input);switch (input){case 1://扫雷break;case 0:printf("退出游戏\n");break;default:printf("选择错误\n");break;}} while (input);
}int main()
{test();return 0;
}

二,创建游戏内容

在game函数重创新建。在test()函数中case1: 下调用game。


case 1:
//扫雷
game();

1.场景创建和初始化

这里我们要明白,我们游戏中雷是提前布置好的,呈现在我们眼前的场景是经过遮掩的,那么我们创建两个场景,mine 和 show,且都是二维数组。

在扫雷的时候我们要计算输入坐标周围一圈有没有雷,因此我们要考虑在边界坐标的越界问题,因此若展现在面前的是x*y的数组,那么实际数组的大小应该是(x+2)*(y+2)的大小。

为了改变场景大小方便,我们创建行列时采用宏定义(在game.h)中。

game.h#include <stdio.h>//为玩家展现的场景大小
#define ROW 9
#define COL 9//场景真实大小  防越界
#define ROWS ROW+2
#define COLS COL+2//函数声明
void initboard(char board[ROWS][COLS], int rows, int cols, char set);  //初始化
game.c//函数定义void initboard(char board[ROWS][COLS], int rows, int cols, char set)   //初始化场景
{int i = 0;int j = 0;for (i = 0; i < rows; i++){for (j = 0; j < cols; j++){board[i][j] = set;                 //set接收 test.h 中传来的字符}}
}
test.cvoid game()
{//创建数组char mine[ROWS][COLS] = { 0 }; //布置雷char show[ROWS][COLS] = { 0 }; //排查雷//初始化mine数组为全'0'initboard(mine,ROWS,COLS,'0');//初始化show数组为全'*'initboard(show, ROWS, COLS, '*');
}

2.场景打印

game.h#include <stdio.h>//为玩家展现的场景大小
#define ROW 9
#define COL 9//场景真实大小  防越界
#define ROWS ROW+2
#define COLS COL+2//函数声明
void initboard(char board[ROWS][COLS], int rows, int cols, char set);  //初始化void displayboard(char board[ROWS][COLS], int row, int col);    //打印场景
game.cvoid displayboard(char board[ROWS][COLS ], int row, int col)   //打印场景
{int i = 0;int 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]);}printf("\n");                     //每行打印完记得换行}
}
test.cvoid game()
{//创建数组char mine[ROWS][COLS] = { 0 };//布置雷char show[ROWS][COLS] = { 0 };//排查雷//初始化mine数组为全'0'initboard(mine,ROWS,COLS,'0');//初始化show数组为全'*'initboard(show, ROWS, COLS, '*');//打印棋盘displayboard(show,ROW,COL);displayboard(mine, ROW, COL);
}

打印如下:

注:玩游戏时只打印 show 的场景。

3.埋雷

game.h#include <stdio.h>#include <stdlib.h>   //随机埋雷,要用到随机数
#include <time.h>//为玩家展现的场景大小
#define ROW 9
#define COL 9//场景真实大小  防越界
#define ROWS ROW+2
#define COLS COL+2//函数声明
void initboard(char board[ROWS][COLS], int rows, int cols, char set);  //初始化void displayboard(char board[ROWS][COLS], int row, int col);    //打印场景void setmine(char mine[ROWS][COLS],int row, int col);   //布置雷
game.cvoid setmine(char mine[ROWS][COLS], int row, int col)    //布置雷
{int count = 10;while (count)                           //循环10次,放10个雷{int x = rand() % row + 1;   //0~9int y = rand() % col + 1;   //0~9if (mine[x][y] == '0')            //判断这个位置有没有放雷{mine[x][y] = '1';                //雷为'1'count--;}}
}
test.cvoid game()
{//创建数组char mine[ROWS][COLS] = { 0 };//布置雷char show[ROWS][COLS] = { 0 };//排查雷//初始化mine数组为全'0'initboard(mine,ROWS,COLS,'0');//初始化show数组为全'*'initboard(show, ROWS, COLS, '*');//打印棋盘//displayboard(show,ROW,COL);//displayboard(mine, ROW, COL);//布置雷setmine(mine,ROW,COL);displayboard(show, ROW, COL);         //埋完雷后将 show 打印出来,准备下一步进行排雷}

埋雷这里要用到随机数,不要忘了提前使用 srand() 噢

4.排雷

game.h#include <stdio.h>#include <stdlib.h>   //随机埋雷,要用到随机数
#include <time.h>//为玩家展现的场景大小
#define ROW 9
#define COL 9//场景真实大小  防越界
#define ROWS ROW+2
#define COLS COL+2//函数声明
void initboard(char board[ROWS][COLS], int rows, int cols, char set);  //初始化void displayboard(char board[ROWS][COLS], int row, int col);    //打印场景void setmine(char mine[ROWS][COLS],int row, int col);   //布置雷void findmine(char mine[ROWS][COLS],char show[ROWS][COLS], int row, int col);  //排雷

这里注意,我们同时接收 mine 和 show 数组,用 int row, int col 来使两个场景有链接关系

game.hint get_mine(char mine[ROWS][COLS],int x,int y)   //找雷数,该函数在排雷函数里使用,直接在 // findmine 外定义即可
{return mine[x - 1][y] + mine[x - 1][y - 1] +mine[x][y - 1] +                    //这8个坐标为x,y周围一圈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';   // '数字' - '0' = 数字
}void findmine(char mine[ROWS][COLS], char show[ROWS][COLS], int row, int col)  //排雷
{int x = 0;int y = 0;int win = 0;while (win<row*col-10)                      //判断雷是否排完{printf("请输入要排查的坐标:");scanf("%d %d", &x, &y);if (x >= 1 && x <= row&&y >= 1 && y <= col)      //判断坐标是否在可视范围{//判断if (mine[x][y] == '1')                       //踩雷{printf("很遗憾,你被炸死了!\n");displayboard(mine, ROW, COL);break;}else                                       //不是雷{//计算x,y坐标周围的雷int n = get_mine(mine, x, y);            //求周围一圈雷的个数if (n != 0)show[x][y] = n + '0';              //并将个数通过 show 场景显示出来displayboard(show, ROW, COL);        //打印 showwin++;}}else{printf("输入坐标非法,无法排雷,请重新输入:\n");}}if (win == row*col - 10){printf("排雷成功\n");displayboard(mine, ROW, COL);}
}

注:数字 + '0' = '数字'        详细参考ASCII码表

二进制             字符

48                     '0'

49                     '1'

50                     '2'

51                     '3'

52                     '4'

53                     '5'

54                     '6'

55                     '7'

56                     '8'

57                     '9'

这样简单版本的扫雷就完成了。

注:头文件stdio.h在game.c和test.c里面都要引用,我们将stdio.h放入game.h里面,直接用双引号引用game.h。

完整代码

1.game.h

#include <stdio.h>
#include <stdlib.h>
#include <time.h>#define ROW 9
#define COL 9#define ROWS ROW+2
#define COLS COL+2//函数声明
void initboard(char board[ROWS][COLS], int rows, int cols, char set);//初始化void displayboard(char board[ROWS][COLS], int row, int col);    //打印场景void setmine(char mine[ROWS][COLS],int row, int col);   //布置雷void findmine(char mine[ROWS][COLS],char show[ROWS][COLS], int row, int col);  //排雷

2.game.c

#include "game.h"void initboard(char board[ROWS][COLS], int rows, int cols, char set)   //初始化场景
{int i = 0;int j = 0;for (i = 0; i < rows; i++){for (j = 0; j < cols; j++){board[i][j] = set;}}
}void displayboard(char board[ROWS][COLS ], int row, int col)   //打印场景
{int i = 0;int 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]);}printf("\n");}
}void setmine(char mine[ROWS][COLS], int row, int col)    //布置雷
{int count = 10;while (count){int x = rand() % row + 1;int y = rand() % col + 1;if (mine[x][y] == '0'){mine[x][y] = '1';count--;}}
}int get_mine(char mine[ROWS][COLS],int x,int y)   //找雷数
{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;int y = 0;int win = 0;while (win<row*col-10){printf("请输入要排查的坐标:");scanf("%d %d", &x, &y);if (x >= 1 && x <= row&&y >= 1 && y <= col){//判断if (mine[x][y] == '1'){printf("很遗憾,你被炸死了!\n");displayboard(mine, ROW, COL);break;}else{//计算x,y坐标周围的雷int n = get_mine(mine, x, y);if (n != 0)show[x][y] = n + '0';displayboard(show, ROW, COL);win++;}}else{printf("输入坐标非法,无法排雷,请重新输入:\n");}}if (win == row*col - 10){printf("排雷成功\n");displayboard(mine, ROW, COL);}
}

3.test.c

#include "game.h"void game()
{//创建数组char mine[ROWS][COLS] = { 0 };//布置雷char show[ROWS][COLS] = { 0 };//排查雷//初始化mine数组为全'0'initboard(mine,ROWS,COLS,'0');//初始化show数组为全'*'initboard(show, ROWS, COLS, '*');//打印棋盘//displayboard(show,ROW,COL);//displayboard(mine, ROW, COL);//布置雷setmine(mine,ROW,COL);//displayboard(mine, ROW, COL);displayboard(show, ROW, COL);//排雷findmine(mine,show, ROW, COL);}void menu()
{printf("*******************\n");printf("*****  1.play  ****\n");printf("*****  0.exit  ****\n");printf("*******************\n");
}void test()
{int input = 0;srand((unsigned int)time(NULL));do{menu();printf("请选择:");scanf("%d",&input);switch (input){case 1://扫雷game();break;case 0:printf("退出游戏\n");break;default:printf("选择错误\n");break;}} while (input);
}int main()
{test();return 0;
}

实战如下:

对了,对埋雷函数我们还可以进行优化,将雷的个数进行宏定义放在game.h里,方便修改雷的数量。

优化到下个版本时会一起修改的,各位对优化这块有更好的法子可以私聊讨论噢(虽然菜但也喜欢和大佬讨论

继三子棋后,征服扫雷相关推荐

  1. 【C】三子棋 VS 扫雷

    ✨博客主页:心辛向荣 ✨系列专栏:[从0到1,C语言学习] ✨一句短话:你若盛开,蝴蝶自来! ✨博客说明:尽己所能,把每一篇博客写好,帮助自己熟悉所学知识,也希望自己的这些内容可以帮助到一些在学习路上 ...

  2. 扫雷超详解(可展开一片空白)

    文章目录 前言 一.扫雷的游戏规则 二.扫雷设计的大概思路 三.扫雷设计的详细思路和代码 1.首先定义一个菜单menu函数 2.在test函数中调用menu函数 3.在main函数中在调用test函数 ...

  3. C语言实现三子棋(详解)

    一. 主要思路 游戏的主要思路如下,一方面是我们整个的游戏思路,另一方面则是我们实现功能的游戏主体了.(写完博客才发现图上多了一道竖线,大家原谅我把==) 二.思路梳理 第一,同我们之前实现的扫雷一样 ...

  4. 可能是你见过最强的猜数字游戏(doge

    本文完全原创!!!!! 本文完全原创!!!!! 本文完全原创!!!!! 如有雷同请联系作者 目录 前言 代码一览 代码剖析 总结 前言 因为学校期末原因,一直没有更新博客.距离上一篇博客居然已有一个多 ...

  5. C语言实现通讯录(含文件保存)

    目录 1.测试结果 2.整体思路 3.结构体的定义 4.核心函数搭建 5.模块代码解读 (1).显示菜单 (2).初始化通讯录 (3).给通讯录增加容量 (4).增加联系人 (5).查找联系人 (6) ...

  6. 程序员新手上路第一步

       1.个人介绍    Hello,各位未来的技术大牛.我是浙江某普本的大一学生,刚刚开始c语言的学习.第一次写博客,主要分享一些入门知识.我希望能够在这里一步步分享记录我学习和成长的过程,后续也会 ...

  7. C语言入门Part7--数组篇

    C语言入门Part7–数组篇 **关键字:**数组常见问题及注意事项总结,字符串定义,一维数组在内存中的存储,sizeof()求数组长度的注意事项,sizeof()的用法注意,sizeof()和str ...

  8. 【C语言】rand()函数(如何生成指定范围随机数)

    一.rand()函数简介 我们先来看一下cplusplus.com - The C++ Resources Network网站上rand函数的基本信息: 系统生成随机数时需要使用rand函数(rand ...

  9. 【比特鹏哥C语言_3.函数】

    本章主要要掌握函数的基本使用和递归 目录: 函数是什么 库函数 自定义函数 函数参数 函数调用 函数的嵌套调用和链式访问 函数的声明和定义 函数递归 一.函数是什么 C语言中的函数的定义是:子程序 子 ...

最新文章

  1. Nginx禁止通过IP,未绑定域名访问服务器
  2. 2020-10-23(SMC加密技术)
  3. python 会计专用格式_python-2.7 – 如何使用xlsxwriter将格式应用为“文本”和“会计”...
  4. Web前端笔记-移动端触屏移动视角(two.js)
  5. 什么是脏数据?怎样用箱形图分析异常值?终于有人讲明白了
  6. Div+CSS布局入门教程(三) 页面顶部制作之一
  7. 《Linux编程》学习笔记 ·003【Shell编程】
  8. 【渝粤教育】电大中专市场营销管理 (2)_1作业 题库
  9. 通过cacti+nagios监控服务器的运行—nagios nrpe
  10. 庞果网一道题(字符博弈)的一点想法
  11. C++中析构函数的作用,
  12. Android影音播放器需求分析,321影音全能影音播放器源码
  13. 安卓苹果双端五级分销影视APP源码美化版
  14. No virtual method setOutputFile Ljava/io/File V in class Landroid/media/MediaRecorder
  15. oracle数据库快速查询关键字,数据库分页查询关键字
  16. 【Python蓝桥杯】印章 共有n种图案的印章,每种图案的出现概率相同。小A买了m张印章,求小A集齐n种印章的概率。
  17. 世界上第一台电子计算机adc,2004山东公务员考试计算机专业理论题
  18. MySQL数据恢复(通过.frm和.idb文件)
  19. 图像金字塔(Python实现)
  20. 【计算机毕业设计】133在线课程管理系统

热门文章

  1. 思科 计算机网络 第六章测试考试答案
  2. 搜狐云景client工具评測之WordPress的搭建
  3. 你创建微信公众账号了吗?别闲着,来做微信营销吧
  4. 中文zh描述规则,原来中文下除了cmn外还有14种扩展
  5. 获取淘宝商品历史价格信息API(PHP,JAVA都可对接)
  6. 创造娱乐性:阐述编写游戏对话的8点经验
  7. 集成HMS Scan Kit扫码SDK,轻松实现手机扫码选购
  8. 2021年三季度中国通用设备行业A股上市企业营收排行榜:22家企业自2017年起第三季度的净利润逐年递增(附热榜TOP100详单)
  9. 解决Deprecated: Methods with the same name as their class will not be constructors in报错方案
  10. Spring Boot Admin在线查看spring boot后台日志