预祝梅西第七座金球!!!!!!你们说会是梅老七吗?

1.游戏分成三部分来写

  1. game.c里面进行实现函数
  2. game.h声明函数头文件宏定义等
  3. test.c写程序的主体部分

2.实现效果展示

3.全部代码

具体讲解请看注释

1.game.h

一》宏定义与头文件

#define _CRT_SECURE_NO_WARNINGS 1
#include<stdio.h>
//生成随机数的头文件
#include <stdlib.h>
#include <time.h>
//#include<windows.h>
//我们操作的数组是9*9
#define ROW 9
#define COL 9
//但是我们创建的数组是11*11
//因为这样才能符合我自己写的逻辑
//即在一个棋盘即show数组显示旁边8个坐标的雷有多少
//那么我们就需要扫描旁边8个坐标
//但是在棋盘边缘如果是9*9我们没有办法获取不存在的区域的信息
//所以上下左右各多一行变成11*11
#define ROWS ROW+2
#define COLS COL+2#define EASY_count 10//#define DIF_count 80

二》函数声明

void InitBoard(char board[ROWS][COLS],int rows,int cols,char set);
//打印棋盘
void DisplayBoard(char board[ROWS][COLS], int row, int col);
//char mine[ROWS][COLS] = { 0 };//这是我们定义的数组,所以接收的只能是ROWS,COLS
//虽然我实际想验证的只是9*9,但是因为test.c定义数组如上所述//布置雷
void SetMine(char mine[ROWS][COLS], int row, int col);//这里mine还是board是一个意思//排雷
void FindMine(char mine[ROWS][COLS], char show[ROWS][COLS], int row, int col);

2.test.c

一》//思路:
//两个棋盘存放
//一个棋盘显示排查雷信息,show数组
//即显示扫雷游戏的该落子旁边8个位置有多少雷,用数字显示,其他地方用*掩盖
//一个棋盘存储布置好的雷的信息,mine数组
//即有雷就放个字符1,没雷就是零,最开始全是零,需要你自己去选择几行几列去变0为1

二》main函数

int main()
{srand((unsigned int)time(NULL));//随机值生成起点//Sleep(100);test();return 0;
}

三》main函数具体内容

void game()
{//创建数组char mine[ROWS][COLS] = { 0 };//存储布置好的雷的信息char show[ROWS][COLS] = { 0 };//存放排查出的雷的信息//初始化mine数组为'0'InitBoard(mine,ROWS,COLS,'0');//初始化show数组为'*’InitBoard(show, ROWS, COLS, '*');//打印棋盘,确定棋盘有没有创建正确,可以不确定,单纯为了严谨printf("mine>\n");DisplayBoard(mine,ROW,COL);printf("\n");//这下面就不要打印了,因为后面排雷还会显示,重复//printf("show雷的信息如下>\n");//DisplayBoard(show, ROW, COL);//printf("\n");//用COL为什么不用COLS,因为我们虽然要11*11但是实际有作用的还是9*9//我们验证对不对,只需要9*9能操做就行// 如果你想要写成11*11,虽然不会报错但是会打印出奇奇怪怪的东西//下面是真正的扫雷游戏了//布置雷SetMine(mine, ROW, COL);//只需要在9*9设计雷在mine中,show是显示雷信息的//下面只是测试,要是都告诉你还要你干嘛,相当于作弊器//printf("布置雷的情况>\n");//DisplayBoard(mine, ROW, COL);//布置好雷后观察观察为了严谨//这里开始排雷//在mine数组里排雷,显示附近的雷是在show数组,而且存在数组传递//即你下棋在mine的几行几列,下棋的地方要显示一个数字,这个数字表示的是你下棋位置周围的情侣//周围存在多少雷,存在多少雷显示在show棋盘上FindMine(mine,show,ROW,COL);//学会这种创建函数的方式,即翻译我上面的话
}
void 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:game();break;case 0:printf("退出游戏!\n");break;default:printf("输入错误!\n");break;}} while (input);
}

3.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++){//打出11*11board[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++)//标出列从0-9因为标出行的时候左边加了一列{printf("%d ", i);}printf("\n");for (i = 1; i <= row; i++){printf("%d ", i);//直接加在for里面,标出行row,从1-9for (j = 1; j <= col; j++){printf("%c ", board[i][j]);//打印了一行的字符}//后换行printf("\n");}
}

三》布置雷

void SetMine(char mine[ROWS][COLS], int row, int col)
{//位置处有雷就不布置,我设定的是有雷就放个字符1,没雷就是他本来的零int count = EASY_count;while (count)//非零为真{int x = (rand() % row) + 1;int y = (rand() % col) + 1;//生成1-9的随机数if (mine[x][y] == '0'){//是零不是一,可以布置雷,布置雷变成1mine[x][y] = '1';//注意这样只有一次循环,故加whilecount--;//这样就能布置十个雷,当然你可以布置更多的雷}//count--;//这句话一定要放在while循环里面,放在外面会导致布置的雷的个数可能不够,因为随机布置雷的时候也存在重合的时候,但是放在外面就是定死了只随机布置10次}
}

四》排雷

//排雷里主体里的函数
static int get_mine_count(char mine[ROWS][COLS], int x, int y)
{//这里就体现了在mine中写0和1的好处,但注意这里是字符//'1'-'0'=1//如果我们用的是*和#这种奇怪的字符,我们就要判断你扫雷位置处周围八个坐标的情况,是雷就加一//这样0.1就只要把旁边八个数相加即可,相加是几说明几个雷,送给show显示出来//思路如下:return  mine[x][y - 1] + mine[x][y + 1] + mine[x - 1][y - 1] + mine[x - 1][y] + mine[x - 1][y + 1] + mine[x + 1][y + 1] + mine[x + 1][y] + mine[x + 1][y - 1]-8*'0';}
//排雷主体
void FindMine(char mine[ROWS][COLS], char show[ROWS][COLS], int row, int col)
{
//again:int x = 0;int y = 0;int win = 0;//while(1)while (win<row*col-EASY_count){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)周围有几个雷,并且保存到show棋盘里int n = get_mine_count(mine, x, y);//show[x][y]我们定义的他是一个字符型数组show[x][y] = n + '0';//注意:字符‘0’的ASCII码是48,依次类推,所以2+‘0’=‘2’DisplayBoard(show, ROW, COL);//这里看上去已经写完实则不然,因为while的缘故,你排完了还要你排雷//故改变while的括号内容win++;}}else{printf("无法扫雷,请重新输入坐标:\n");//goto again;//不建议用goto}}//if (win == ROW * COL - 80)if (win == row * col - EASY_count){//这样都满了,排完了printf("小伙子,你很有潜力,我觉得你可以去做几个500万的项目!\n");DisplayBoard(mine, ROW, COL);}//一直说严谨,怎么判断我这个真能排雷成功了,只需要把雷的个数改一改进行,改成80个雷你试试
}

2.实现效果展示

3.全部代码

一》game.c

#define _CRT_SECURE_NO_WARNINGS 1
#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++){//打出11*11board[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++)//标出列从0-9因为标出行的时候左边加了一列{printf("%d ", i);}printf("\n");for (i = 1; i <= row; i++){printf("%d ", i);//直接加在for里面,标出行row,从1-9for (j = 1; j <= col; j++){printf("%c ", board[i][j]);//打印了一行的字符}//后换行printf("\n");}
}
//布置雷
void SetMine(char mine[ROWS][COLS], int row, int col)
{//位置处有雷就不布置,我设定的是有雷就放个字符1,没雷就是他本来的零int count = EASY_count;while (count)//非零为真{int x = (rand() % row) + 1;int y = (rand() % col) + 1;//生成1-9的随机数if (mine[x][y] == '0'){//是零不是一,可以布置雷,布置雷变成1mine[x][y] = '1';//注意这样只有一次循环,故加while}count--;//这样就能布置十个雷,当然你可以布置更多的雷}
}
//排雷
//排雷里主体里的函数
static int get_mine_count(char mine[ROWS][COLS], int x, int y)
{//这里就体现了在mine中写0和1的好处,但注意这里是字符//'1'-'0'=1//如果我们用的是*和#这种奇怪的字符,我们就要判断你扫雷位置处周围八个坐标的情况,是雷就加一//这样0.1就只要把旁边八个数相加即可,相加是几说明几个雷,送给show显示出来//思路如下:return  mine[x][y - 1] + mine[x][y + 1] + mine[x - 1][y - 1] + mine[x - 1][y] + mine[x - 1][y + 1] + mine[x + 1][y + 1] + mine[x + 1][y] + mine[x + 1][y - 1]-8*'0';}
//排雷主体
void FindMine(char mine[ROWS][COLS], char show[ROWS][COLS], int row, int col)
{
//again:int x = 0;int y = 0;int win = 0;//while(1)while (win<row*col-EASY_count){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)周围有几个雷,并且保存到show棋盘里int n = get_mine_count(mine, x, y);//show[x][y]我们定义的他是一个字符型数组show[x][y] = n + '0';//注意:字符‘0’的ASCII码是48,依次类推,所以2+‘0’=‘2’DisplayBoard(show, ROW, COL);//这里看上去已经写完实则不然,因为while的缘故,你排完了还要你排雷//故改变while的括号内容win++;}}else{printf("无法扫雷,请重新输入坐标:\n");//goto again;//不建议用goto}}//if (win == ROW * COL - 80)if (win == row * col - EASY_count){//这样都满了,排完了printf("小伙子,你很有潜力,我觉得你可以去做几个500万的项目!\n");DisplayBoard(mine, ROW, COL);}//一直说严谨,怎么判断我这个真能排雷成功了,只需要把雷的个数改一改进行,改成80个雷你试试
}

二》game.h

#define _CRT_SECURE_NO_WARNINGS 1
#include<stdio.h>
//生成随机数的头文件
#include <stdlib.h>
#include <time.h>
//#include<windows.h>
//我们操作的数组是9*9
#define ROW 9
#define COL 9
//但是我们创建的数组是11*11
//因为这样才能符合我自己写的逻辑
//即在一个棋盘即show数组显示旁边8个坐标的雷有多少
//那么我们就需要扫描旁边8个坐标
//但是在棋盘边缘如果是9*9我们没有办法获取不存在的区域的信息
//所以上下左右各多一行变成11*11
#define ROWS ROW+2
#define COLS COL+2#define EASY_count 10//#define DIF_count 80
//声明函数,char set 即自己所设计的符号‘0’‘*’,这个函数在game.c里面进行实现
//即test.c确定思路写程序的主体部分,game.h写声明的函数头文件宏定义等
//game.c对于game.h中的函数做具体的解释,即写出这个函数是什么
void InitBoard(char board[ROWS][COLS],int rows,int cols,char set);
//打印棋盘
void DisplayBoard(char board[ROWS][COLS], int row, int col);
//char mine[ROWS][COLS] = { 0 };//这是我们定义的数组,所以接收的只能是ROWS,COLS
//虽然我实际想验证的只是9*9,但是因为test.c定义数组如上所述//布置雷
void SetMine(char mine[ROWS][COLS], int row, int col);//这里mine还是board是一个意思//排雷
void FindMine(char mine[ROWS][COLS], char show[ROWS][COLS], int row, int col);

三》test.c

#define _CRT_SECURE_NO_WARNINGS 1
#include "game.h"
//思路:
//两个棋盘存放
//一个棋盘显示排查雷信息,show数组
//即显示扫雷游戏的该落子旁边8个位置有多少雷,用数字显示,其他地方用*掩盖
//一个棋盘存储布置好的雷的信息,mine数组
//即有雷就放个字符1,没雷就是零,最开始全是零,需要你自己去选择几行几列去变0为1
void game()
{//创建数组char mine[ROWS][COLS] = { 0 };//存储布置好的雷的信息char show[ROWS][COLS] = { 0 };//存放排查出的雷的信息//初始化mine数组为'0'InitBoard(mine,ROWS,COLS,'0');//初始化show数组为'*’InitBoard(show, ROWS, COLS, '*');//打印棋盘,确定棋盘有没有创建正确,可以不确定,单纯为了严谨printf("mine>\n");DisplayBoard(mine,ROW,COL);printf("\n");//这下面就不要打印了,因为后面排雷还会显示,重复//printf("show雷的信息如下>\n");//DisplayBoard(show, ROW, COL);//printf("\n");//用COL为什么不用COLS,因为我们虽然要11*11但是实际有作用的还是9*9//我们验证对不对,只需要9*9能操做就行// 如果你想要写成11*11,虽然不会报错但是会打印出奇奇怪怪的东西//下面是真正的扫雷游戏了//布置雷SetMine(mine, ROW, COL);//只需要在9*9设计雷在mine中,show是显示雷信息的//下面只是测试,要是都告诉你还要你干嘛,相当于作弊器//printf("布置雷的情况>\n");//DisplayBoard(mine, ROW, COL);//布置好雷后观察观察为了严谨//这里开始排雷//在mine数组里排雷,显示附近的雷是在show数组,而且存在数组传递//即你下棋在mine的几行几列,下棋的地方要显示一个数字,这个数字表示的是你下棋位置周围的情侣//周围存在多少雷,存在多少雷显示在show棋盘上FindMine(mine,show,ROW,COL);//学会这种创建函数的方式,即翻译我上面的话
}
void 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:game();break;case 0:printf("退出游戏!\n");break;default:printf("输入错误!\n");break;}} while (input);
}
int main()
{srand((unsigned int)time(NULL));//随机值生成起点//Sleep(100);test();return 0;
}

玩过扫雷都知道,本游戏只是实现了简单的扫雷游戏真实的扫雷游戏的功能并没有全部实现。该段代码只适用于初学者!

(初阶版本)扫雷游戏(C语言)娱乐教程相关推荐

  1. Eclipse开发初阶之Eclipse多国语言包安装

    Eclipse开发初阶之Eclipse多国语言包安装 2008-02-01 13:07:13 <!--showHead end--> 标签:Eclipse 开发 多国语言包 Java 安装 ...

  2. 扫雷游戏 C语言实现

    扫雷游戏 C语言实现 实现了如下功能: 鼠标控制 左键点开 右键标记 中键自动翻开(效果同windows扫雷) 首次点击不会中雷 下面是几张效果图: 这是初始界面,3种难度级别,难度同经典版windo ...

  3. C初阶必写的C语言小游戏—扫雷,一看就会,看完就能写

    目录 一.前言 二.资源环境的配置 三.游戏整体构思 1.游戏的开始与结束(菜单) 2.创建二维数组用来布置雷和排查雷的信息 3.初始化棋盘 4.打印棋盘 5.布置雷 6.排查雷 四.所有代码及效果展 ...

  4. c语言游戏 人物素材,代码女神编写的C语言版本扫雷游戏,场面失控,速来围观...

    前言: <扫雷>是一款大众类的益智小游戏,于1992年发行.游戏目标是在最短的时间内根据点击格子出现的数字找出所有非雷格子,同时避免踩雷,踩到一个雷即全盘皆输.扫雷在科技历史上也扮演了相似 ...

  5. 简易扫雷游戏c语言程序,C++实现简单的扫雷游戏(控制台版)

    C++新手的代码,请各位多包涵. 用C++写的一个简单的控制台版扫雷游戏.玩家通过输入方块的坐标来翻开方块. 只是一个雏形,能够让玩家执行翻开方块的操作并且判断输赢,还未添加标记方块.游戏菜单.记录游 ...

  6. php diy明信片代码,创意DIY之如何自制扫雷游戏明信片的做法教程

    写一段美丽的关怀问候寄给远方久未联系的老朋友,除了让对方收到你的祝福,再寄送一个新奇的小惊喜.受到电脑上的扫雷游戏的启发,这次我的想法是自己动手做一张可玩性比较强的明信片,正面带有刮刮卡式的扫雷小游戏 ...

  7. C语言初阶学习-----01初识C语言

    这是初识C语言,对有一定基础的同学帮助很大,看不懂的到以后对应的章节会详细介绍. 1.数据类型 char //字符数据类型 short //短整型 int //整形 long //长整型 long l ...

  8. C语言初阶:指针,C语言的上帝之手

    文章目录 1. 指针运算 1.1 算术运算符 指针的自加++.自减-- 指针相减的意义 1.2 单位长度 2. 指针类型转换 3. 二维指针 4. 数组指针与指针数组 4.1 什么是指针数组 4.2 ...

  9. 猜成语游戏c语言程序设计教程课后答案,《C语言基础》习题及答案.doc

    <C语言基础>习题及答案 一.选择题 1.设a的值为15,n的值为5,则进行a%=(n%=2)运算后,a的值为( A ). A.0 B.1 C.12 D.6 2.设有类型说明 unsign ...

最新文章

  1. PHP的Reflection反射机制
  2. 2018牛客暑假多校三 E(KMP运用)
  3. HTML5语言格式,HTML5 自然语言格式的输入表单
  4. 什么是 MIME Type
  5. 引用管理器没有程序集_如何使用Zotero插入引用文献
  6. ArcGIS编辑操作的常用快捷键一览表
  7. 奋战杭电ACM(DAY9)1013
  8. android java pipe_Java-使用Dagger 2进行Android单元测试
  9. windows找不到文件gpedit.msc_u盘插入电脑在windows却找不到u盘的解决办法【详解】...
  10. UVA - 815 Flooded!
  11. 2.matplotlib画散点图
  12. c专家编程(C专家编程pdf)
  13. 微软“断臂求生”,能实现绝地反击吗?
  14. 国王游戏——c++实现
  15. Kroll任命Richard Davies担任网络风险业务副董事总经理,常驻香港
  16. Volatility 工具分析
  17. 亚历山大对马其顿士兵的演说(经典演说
  18. 刚上市就名声鹊起,nova3和NEX拍照谁能更甚一筹?
  19. 手机传输文件服务器,手机文件传输到服务器
  20. 以地理国情调查任务为基础的地图矢量化流程研究

热门文章

  1. Linux文件打包与解压缩
  2. 合并代码时,处理Merge branch ‘dev‘ of ssh: xxxxxx问题
  3. dango models and database ---- verbose name
  4. 2022-2028全球军用弩行业调研及趋势分析报告
  5. 郑州财经学院第54次全国计算机,郑州财经学院第二期教师博士班开班
  6. JAVA学习 API_day11(属性集, 函数式编程, stream流)
  7. leetcode_Permutations II
  8. 自兴动脑人工智能课程学习笔记一:机器学习
  9. 全闪存存储的数据库加速场景应用
  10. 5G时代来临,电影行业面临的机遇与挑战