日常分享:不管发生什么事,也不要憎恨这个时代!没被人表扬也无所谓,要有时刻保持微笑的坚强…只要向前走,肯定会有很多快乐的事,不断发生! ————贝鲁梅尔

简版扫雷

  • 前言
  • 一、扫雷分步讲解
    • 1.菜单和游戏框架的实现
    • 2.游戏的实现
      • 2.1棋盘初始化
      • 2.2打印棋盘
      • 2.3放置雷
      • 2.4排雷
      • 2.5雷的数量显示
  • 二、两个拓展
    • 1.自动排空
    • 2.标记雷数
  • 三、代码实现

前言

扫雷是大家小时候玩过的游戏吧,那么,当你学了二维数组,循环语句,判断语句之后,有没有想过自己敲代码来实现一下这个游戏呢?下面给大家介绍一下基本思路

扫雷,首先要有棋盘,有了棋盘肯定不要忘记初始化啊,初始化完成之后就是打印棋盘,然后在设置雷区,雷区要随即设置,这就又用到了前面用到过的rand函数,然后在把棋盘打印在屏幕上,最后在搞一个玩家输入,通过输入坐标来表示玩家想走的地方,最后就是判断输赢。怎么样,大概思路是不是很简单?看完这篇文章之后,自己来尝试一下吧!!


一、扫雷分步讲解

1.菜单和游戏框架的实现

玩游戏,肯定要有菜单吧,这样玩家才能开始或结束游戏,这个简单,直接上代码。

void menu()
{printf("******************************\n");printf("******1.play     0.exit*******\n");printf("******************************\n");printf("选择>");
}

游戏要能循环玩,当玩家输入结束指令的时候才能结束,这个时候又用到了我们的老朋友do-while循环stinch语句,这个循环和switch可以实现我们想要的游戏开始和游戏结束,所以这个循环和switch你掌握了吗?
代码实现:

void test()
{int input = 0;do{menu();scanf("%d", &input);switch (input){case 1:game();break;case 0:break;default:printf("选择错误\n");}} while (input != 0);
}

这样,游戏大的框架就可以实现了。

2.游戏的实现

2.1棋盘初始化

在这里,我用了个game函数,从这个函数进入游戏,一定要学会用函数,这样可以使代码看着更加简洁,哪里有错误,直接去看对应的函数就行了。后面每个模块我都是使用的函数。
选择1进入game之后,我们要先创建两个二维数组,一个数组用来回显给玩家,一个数组用来存雷,不回显给玩家,为什么要用两个数组呢?其实不难想,我们肯定要让数组打印在屏幕上,只是一个数组,雷的位置不就会直接显示在屏幕上了吗?,数组不是覆盖,不可能说我把1覆盖在2上吧,所以在这里需要用两个数组。

注:在这里我们用的是宏,为了方便扩大棋盘,或者雷的数量,

#define ROW 9
#define COL 9#define ROWS 11
#define COLS 11

这里为什么要用四个宏呢?因为玩家可不知道下标的概念,并且在扫雷的过程中,你要下的地方,要检测周围的地方是否有雷,如果你要下的地方是第一个位置呢?那么在检测周围的时候,是不是会造成数组的越界访问,所以要用4个宏,防止越界访问。

 char mine[ROWS][COLS] = { 0 };//放雷数组char show[ROWS][COLS] = { 0 };//展现给玩家的数组//初始化棋盘InitBoard(mine, ROWS, COLS,'0');//雷初始化为字符1InitBoard(show, ROWS, COLS,'*');//把‘*’展现给玩家
void InitBoard(char board[ROWS][COLS], int rows, int cols,char set)
{int i = 0;for (i = 0; i < rows; i++){int j = 0;for (j = 0; j < cols; j++){board[i][j] = set;}}
}//棋盘初始化的代码实现

2.2打印棋盘

打印棋盘我们只需要把展现给玩家的棋盘打印出来就行了,如果棋盘大的情况下,记得显示一下行和列,别让玩家一个一个的去数。

void PrintBoard(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");}
}

打印棋盘不算难,在这里就不过多讲解了。

2.3放置雷

放置雷,要做到随机性,千万别用sanf自己一个一个的去设置雷,这样的话太麻烦,这个时候rand函数和time函数就派上了用场,但是随机生成的数字可能过大,也可能过小,这个时候我们可以%row可以生成0—row-1的数字,再加上一就刚好符合要求,但如果生成的数字之前已经生成过怎么办?可以用一个if语句进行判断,符合则放雷,不符合则进行下一次生成,可以用while循环,直到生成的雷有十个了,则跳出循环。这个时候千万不要忘记在选择游戏的步骤前加一个srand((unsigned int)time(NULL));

#define EASY_COUNT 10//这个是雷的数量int x = rand() % row + 1;
int y = rand() % col + 1;

代码:

void SetMine(char mine[ROWS][COLS], int row, int col)
{int count = EASY_COUNT;while (count){int x = rand() % row + 1;int y = rand() % col + 1;if (mine[x][y] == '0'){mine[x][y] = '1';count--;}}
}

2.4排雷

这时候我们要排雷,排雷排雷,肯定要循环,直到玩家把雷排玩,或者被雷炸了,游戏才能结束,所以这个时候,while又来了,判断条件别忘了,防止你输入个非法的坐标,如果你走的地方已经走过了怎么办?继续进行判断,判断很好用,哈哈。那么如何判断胜呢?我们可以先定一个变量=0,每次排到雷的变量就++,直到变量=雷的数量就行了。

int GetMineCount(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 (1){printf("请输入坐标>");scanf("%d%d", &x, &y);if (x >= 1 && x <= row && y >= 1 && y <= col){if (mine[x][y] == '1'){printf("很遗憾,游戏结束\n");break;}else if (show[x][y] != '*'){printf("该坐标非法,请重新输入");continue;}else{int n = GetMineCount(mine, x, y);show[x][y] = n + '0';PrintBoard(show, ROW, COL);win++;}}if (win == ROW*COL-EASY_COUNT){printf("恭喜你,把雷全部找出来了\n");break;}}
}


2.5雷的数量显示

玩扫雷游戏的时候,上面都会显示一个雷的数量,那我们也可以弄一个雷的数量显示。这个超级简单,建立个函数,函数里面弄个打印就行了。

void MineNumber(char mine[ROWS][COLS])
{printf("雷的数量:%d\n", EASY_COUNT);
}

二、两个拓展

先看几个扫雷的图片:

1.自动排空

真正的扫雷游戏是有自动排空功能的,在这里给大家说一下大概思路,自动排空,就是要在你输入坐标之后,能够自动的排查,但有几个问题需要思考一下,该点有没有被排查过,该点周围有几个雷,怎么以该点为中心点,让它自动的进行爆破式的展开,,被排查过的点如何进行标记?提示:用递归。

2.标记雷数

标记雷数也是一件难事,反正我是没有想出来,大家可以自行思考一下,或者去看看大佬的文章,但自己一定要进行思考。

三、代码实现

.h文件

#pragma once#define ROW 9
#define COL 9#define ROWS 11
#define COLS 11#define EASY_COUNT 80#include<stdio.h>
#include<time.h>
#include<stdlib.h>
#include<windows.h>void InitBoard(char board[ROWS][COLS], int rows, int cols, char set);void PrintBoard(char board[ROWS][COLS], int row, int col);void SetMine(char mine[ROWS][COLS], int rows, int cols);void FindMine(char mine[ROWS][COLS], char show[ROWS][COLS], int row, int col);void MineNumber(char mine[ROWS][COLS]);//void MineJudge(char mine[ROWS][COLS],char show[ROWS][COLS],int x,int y);

实现函数功能的.c文件

#include"MineSweeping.h"void InitBoard(char board[ROWS][COLS], int rows, int cols,char set)
{int i = 0;for (i = 0; i < rows; i++){int j = 0;for (j = 0; j < cols; j++){board[i][j] = set;}}
}void PrintBoard(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 = EASY_COUNT;while (count){int x = rand() % row + 1;int y = rand() % col + 1;if (mine[x][y] == '0'){mine[x][y] = '1';count--;}}
}int GetMineCount(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 MineNumber(char mine[ROWS][COLS])
{printf("雷的数量:%d\n", EASY_COUNT);
}void FindMine(char mine[ROWS][COLS],char show[ROWS][COLS], int row, int col)
{int x = 0;int y = 0;int win = 0;while (1){printf("请输入坐标>");scanf("%d%d", &x, &y);if (x >= 1 && x <= row && y >= 1 && y <= col){if (mine[x][y] == '1'){MineNumber(mine);printf("很遗憾,游戏结束\n");break;}else if (show[x][y] != '*'){MineNumber(mine);printf("该坐标非法,请重新输入");continue;}else{MineNumber(mine);int n = GetMineCount(mine, x, y);show[x][y] = n + '0';PrintBoard(show, ROW, COL);win++;}}if (win == ROW*COL-EASY_COUNT){MineNumber(mine);printf("恭喜你,把雷全部找出来了\n");break;}}
}

测试代码的.c文件

#include"MineSweeping.h"void menu()
{printf("******************************\n");printf("******1.play     0.exit*******\n");printf("******************************\n");printf("选择>");
}void game()
{char mine[ROWS][COLS] = { 0 };char show[ROWS][COLS] = { 0 };//初始化棋盘InitBoard(mine, ROWS, COLS,'0');InitBoard(show, ROWS, COLS,'*');//打印//PrintBoard(mine, ROW, COL);MineNumber(mine);PrintBoard(show, ROW, COL);//设置雷SetMine(mine, ROW, COL);PrintBoard(mine, ROW, COL);//检测一个点周围有多少雷FindMine(mine,show, ROW, COL);PrintBoard(mine, ROW, COL);
}void test()
{int input = 0;do{srand((unsigned int)time(NULL));menu();scanf("%d", &input);switch (input){case 1:game();break;case 0:break;default:printf("选择错误\n");}} while (input != 0);
}int main()
{test();return 0;
}

以上就是对扫雷的讲解,希望对大家有帮助。

C语言实现——简版扫雷(详解)相关推荐

  1. C语言经典编程(浙大版C语言第三版)详解

    C语言经典编程详解 – 一览表: 1.[C语言经典编程]练习2-1 Programming in C is fun! (5分) 2.[C语言经典编程]练习2-3 输出倒三角图案 (5分) 3.[C语言 ...

  2. Adobe CS6(大师版)软件详解79

    Adobe CS6(大师版)软件详解79 电子文档制作软件AdobeAcrobat.:矢量动画处理软件AdobeFlash.:网页制作软件AdobeDreamweaver.:矢量图形绘图软件Adobe ...

  3. R语言可视化绘图基础知识详解

    R语言可视化绘图基础知识详解 图形参数:字体.坐标.颜色.标签等: 图像符号和线条: 文本属性: 图像尺寸及边界: 坐标轴.图例自定义等: 图像的组合: #install.packages(c(&qu ...

  4. php函数find的用法,c语言find函数的用法详解

    c语言find函数的用法详解 C语言之find()函数 find函数用于查找数组中的某一个指定元素的位置. 比如:有一个数组[0, 0, 5, 4, 4]: 问:元素5的在什么位置,find函数 返回 ...

  5. server2016安装mysql_windows server2016安装MySQL5.7.19解压缩版教程详解

    记录了MySQL 5.7.19 winx64解压缩版安装教程,具体内容如下 系统环境:Win7 x64 软件准备:mysql 5.7.19 winx64 配置安装流程 具体安装如下: 1.把 mysq ...

  6. mysql-8.0.12语法_mysql-8.0.12 (免安装版) 安装详解

    mysql-8.0.12 (解压版) 安装详解 错误解决 第一步:mysql-8.0.12 (解压版) 下载地址:https://www.mysql.com/downloads/ 第二步:配置初始化m ...

  7. java语言链栈_Java语言实现数据结构栈代码详解

    近来复习数据结构,自己动手实现了栈.栈是一种限制插入和删除只能在一个位置上的表.最基本的操作是进栈和出栈,因此,又被叫作"先进后出"表. 首先了解下栈的概念: 栈是限定仅在表头进行 ...

  8. 大二c语言期末考试题库及详解答案,大学C语言期末考试练习题(带详解答案)...

    <大学C语言期末考试练习题(带详解答案)>由会员分享,可在线阅读,更多相关<大学C语言期末考试练习题(带详解答案)(55页珍藏版)>请在金锄头文库上搜索. 1.一. 单项选择题 ...

  9. c语言 read 文件字节没超过数组大小时会怎样_剑指信奥 | C 语言之信奥试题详解(四)...

    趣乐博思剑指信奥系列 ❝ 趣乐博思剑指信奥系列,专门针对全国青少年信息学奥林匹克联赛 NOIP 而开展的专业教育方案.开设的课程有 C 语言基础,C++ 语言基础,算法设计入门与进阶,经典试题分析与详 ...

最新文章

  1. KDD Cup 2021城市大脑赛题解析!报名倒计时3天
  2. ajax post提交数据_如何用前端知识获取数据,制作一个微信订餐后台案例?
  3. 突破极限 解决大硬盘上安装Sco Unix新思路
  4. 系统目录结构文件类型及ls.alias命令
  5. Android--制作开场动画/MediaPlayer.OnCompletionListener
  6. RosBE生成ReactOS的VS2015工程失败2
  7. 利用http协议发布博文评论
  8. 洛谷 P2197 nim游戏
  9. python参数估计_用python求参数估计的置信区间
  10. 【洛谷习题】南蛮图腾
  11. mysql 超时_为MySQL设置查询超时
  12. Python入门--集合生成式
  13. 图像处理程序,在状态栏显示图像尺寸
  14. PagerAdapter跟BaseAdapter的覆盖
  15. 第一章---近红外光谱概述2(近红外光谱分析难点及解决思路)
  16. 前端工程师的职业规划
  17. php独孤九剑,独孤九剑(0x00) - 我为什么要做 Dit
  18. 【Android开发】考试系统
  19. 保护手机隐私最关键是提高全民信息安全意识
  20. Linux离线安装Python第三方库Requests

热门文章

  1. 淘个宝贝,淘气过六一
  2. 实战:去除未加固 Android App强制升级提醒
  3. (4) 春晚《千手观音》演员生活照
  4. 男生最帅的41个瞬间 你认同几个。。。。
  5. 覃小龙课堂:干货!新手做影视剪辑如何避免侵权?大神教你防侵权10大方法
  6. sqlserver中文生僻字乱码问题
  7. 树莓派设置静态ip的方法
  8. conn.connectiontimeout,conn.commandtimeout,command.commandtimeout?
  9. java验证签名_简单API接口签名验证
  10. android 蓝牙数据 进行转换 十六进制转十进制