今天我们用c语言写一个简单版本的扫雷,等以后,我写的游戏多了,我们再去写一个游戏大厅,可以供玩家选择自己想玩的游戏

分析:

(1)我们用两个二维数组分别存储给玩家展示的面板和储存地雷的

(2)地雷用字符‘1’存储,不是地雷用‘0’存储,这样方便我们判断出玩家选的地方是否是雷,如果不是雷,也方便我们知道周围雷的个数

(3)可自动显示无雷区的思想:
如果周围雷的个数为0的话,就可以通过递归,把周围都展开,展开后如果还出现‘0’此(‘0’为周围没有雷),将再通过递归,一直展示出非‘0’数字(非‘0’数字指的是有0处)或到达边界位置

给大家举个例:

这是雷的分布图,就是上面说用一个二维数组存储出来的,‘0’表示不是雷,‘1’表示雷,显然可以看见如果玩家输入一个3 3,那么就会显示为‘0’,表示周围格子都不是雷,那样玩家就要又输入8个坐标,那样会大大的打击玩家的耐心。

当我们开辟了可自动显示无雷区的功能后,再输入(3 3)这个坐标时,就可以,展示所有显然已知周围不是雷的地方,如下图,输入3 3坐标后

(4)就给玩家展示了这么多,是不是很方便,这是通过一个递归实现的,那我们如何判断玩家是否胜利了呢?

写一个方法,统计出我们所用的10*10的格子内有多少个
‘*’,返回值为int类型,返回‘*’的个数。然后我们可以
在一个循环外,定义一个count,来接受该方法,类似如下


如何判断玩家最后是否,是选中炸弹或者除了炸弹全部打开了,可看上面那张图片中,有一个break,可以提前结束循环,如果是自动跳出循环,那么count肯定大于雷的个数,那么就说明踩到炸弹了,失败,如果count小于等于雷的个数,那么就说明自己通过判断条件,退出循环的,那么说明剩下的格子全是雷了,那说明玩家胜利了,代码可如下图

这是选择是否进去游戏的一个界面

这是进去后,给的图

下面是点到炸弹后,输了界面,还会给玩家显示地雷分布图,然后再让玩家选择是否再来一把

这就是一个大部分的分析,然后后面是源代码,我注释写的很清楚,每一部分是干嘛的,我都写了,希望对大家有帮助

MineSweep.h

#ifndef _MINESWEEP_H_
#define _MINESWEEP_H_#include<stdio.h>
#include<Windows.h>
#include<stdlib.h>
#include<time.h>
#pragma warning(disable:4996)#define ROW 12 //行
#define LIE 12  //列
#define MINE 20 //地雷个数int determine(char board[][LIE], int row, int lie);   //判断还剩下多少*位置,就可以知道玩家什么时候胜利,知道剩下格子数减去炸弹数,但是我们有两行两列,是不用的,所以我们只统计[1-(row-2)]之间的'*'
void voluntarily(char board[][LIE], char mineBoard[][LIE], int row, int lie);   //可自动展示无雷区,然后把如果点到'0',周围都打开,并且,如果周围也有'0',周围也自动打开
void boardInit(char mineBoard[][LIE], int row, int lie, char ch);   //给面板初始化    最后一个形参为把面板初始化为什么‘字符’
char isNunmber(char mineBoard[][LIE], int row, int lie);    //确定mineBoard[row][lie]不是炸弹,返回他周围炸弹的个数,但是是字符。
int judgeMine(char mineBoard[][LIE], int row, int lie); //判断玩家选的位置是否是炸弹,返回1,则是炸弹,返回0则不是炸弹
void printBoard(char mineBoard[][LIE], int row, int lie);   //显示面板
void landMines(char mineBoard[][LIE],int row,int lie);  //给存放地雷的面板,随机存放20颗地雷,字符1代表是地雷,字符0代表无地雷
void mineSweepGame();   //扫雷游戏#endif

MineSweep.c

#include "MineSweep.h"//确定mineBoard[row][lie]不是炸弹,返回他周围炸弹的个数,但是是字符。
char isNunmber(char mineBoard[][LIE], int row, int lie){if (row >=1 && row <= 10 && lie >=1 && lie <= 10){char ch = mineBoard[row - 1][lie - 1] + mineBoard[row - 1][lie] + mineBoard[row - 1][lie + 1] + mineBoard[row][lie - 1] + mineBoard[row][lie + 1] + mineBoard[row + 1][lie - 1] + mineBoard[row + 1][lie] + mineBoard[row + 1][lie + 1] - 7 * '0';return ch;}
}//判断玩家选的位置是否是炸弹,返回1,则是炸弹,返回0则不是炸弹
int judgeMine(char mineBoard[][LIE], int row, int lie){if (mineBoard[row][lie] == '1'){return 1;}else{return 0;}
}//显示面板
void printBoard(char mineBoard[][LIE], int row, int lie){printf("   ");for (int i = 1; i <= lie - 2; i++){if (i != lie - 2){printf(" | %2d", i);}else{printf(" | %2d |", i);}}printf("\n");printf("-------------------------------------------------------\n");for (int i = 1; i <=lie-2; i++){if (i != 10){printf("%2d ", i);}else{printf("%2d ", i);}for (int j = 1; j <= row-2; j++){if (j != row - 2){printf(" | %2c", mineBoard[i][j]);}else{printf(" | %2c |", mineBoard[i][j]);}}printf("\n");printf("-------------------------------------------------------\n");}
}//给面板初始化   最后一个形参为把面板初始化为什么‘字符’
void boardInit(char mineBoard[][LIE], int row, int lie,char ch) {for (int i = 0; i < row; i++){for (int j = 0; j < lie; j++){mineBoard[i][j] = ch;}}
}//给存放地雷的面板,随机存放20颗地雷,字符1代表是地雷,字符0代表无地雷
void landMines(char mineBoard[][LIE], int row, int lie){//产生[1,10]之间的随机数字,因为只用有最外面一圈,我们不用//k=rand()%(Y-X+1)+X; 这是一个公式,可产生[x,y]之间的随机数int count = MINE;while (count>0){row = rand() % (10 - 1 + 1) + 1;lie = rand() % (10 - 1 + 1) + 1;//printf("%d %d\n", row,lie);if (mineBoard[row][lie] == '0'){mineBoard[row][lie] = '1';count--;}else{continue;}}
}   //可自动展示无雷区,然后把如果点到'0',周围都打开,并且,如果周围也有'0',周围也自动打开
void voluntarily(char board[][LIE], char mineBoard[][LIE], int row, int lie){//先判断row和lie是否越界if (row >= 1 && row <= 10 && lie >= 1 && lie <= 10){if (isNunmber(mineBoard, row, lie) == '0'){if (board[row][lie] == '*'){board[row][lie] = '0';   //先给当前位置赋值为'0',把周围八个位置全部递归,递归出口:(1)越界(2)周围不再有无雷区voluntarily(board, mineBoard, (row - 1), (lie - 1));voluntarily(board, mineBoard, (row - 1), (lie));voluntarily(board, mineBoard, (row - 1), (lie + 1));voluntarily(board, mineBoard, (row), (lie - 1));voluntarily(board, mineBoard, (row), (lie + 1));voluntarily(board, mineBoard, (row + 1), (lie - 1));voluntarily(board, mineBoard, (row + 1), (lie));voluntarily(board, mineBoard, (row + 1), (lie + 1));}}else{board[row][lie] = isNunmber(mineBoard, row, lie);}}
}//判断还剩下多少*位置,就可以知道玩家什么时候胜利,知道剩下格子数减去炸弹数,但是我们有两行两列,是不用的,所以我们只统计[1-(row-2)]之间的'*'
int determine(char board[][LIE], int row, int lie){int count = 0;for (int i = 1; i <= row-2; i++){for (int j = 1; j <= lie-2; j++){if (board[i][j] == '*'){count++;}}}return count;
}void mineSweepGame(){/*先定义两个相同大小的二维数组,行列都定义为12定义为12×12,但是我们只用10×10,因为扫雷边角的那些,都不需要判断周围8个那么多,但是我们行列都多定义了两行就可以,把用的每个都判断周围8个*/char board[ROW][LIE]; //给玩家展示的面板char mineBoard[ROW][LIE]; //存放地雷的面板boardInit(board,ROW,LIE,'*');    //给玩家展示的面板初始化boardInit(mineBoard, ROW, LIE, '0'); //给玩家展示的面板初始化srand((unsigned int)(time(NULL))); //种下随机数的种子landMines(mineBoard,ROW,LIE); //给存放地雷的面板,随机存放地雷int count = determine(board, ROW, LIE);    //记录还剩下多少个'*'while (count>MINE){system("cls");printBoard(board, ROW, LIE);   //显示面板//printBoard(mineBoard, ROW, LIE);    //显示地雷面板int row = 0;int lie = 0;printf("请输入一个位置的坐标=>:");scanf("%d %d",&row,&lie);//判断输入位置是否正确if (row >= 1 && row <= 10 && lie >= 1 && lie <= 10&&board[row][lie]=='*'){int judge = judgeMine(mineBoard, row, lie);   //判断玩家输入的位置是否为炸弹,如果是炸弹返回1,如果不是返回0;if (judge){break;}else{voluntarily(board, mineBoard, row, lie);  //递归实现可自动显示无雷区}}else{printf("您输入坐标有误,请重新输入!!\n");Sleep(1000);}count = determine(board, ROW, LIE); //更新'*'的数量}if (count>MINE){printf("########################################\n");printf("##            您被炸死了:<            ##\n");printf("########################################\n");printBoard(mineBoard, ROW, LIE); //显示面板}else{printf("########################################\n");printf("##          恭喜你,胜利了:>          ##\n");printf("########################################\n");printBoard(mineBoard, ROW, LIE);    //显示面板}
}

main.c

#include "MineSweep.h"void menu(){printf("########################################\n");printf("############欢迎来到扫雷游戏############\n");printf("########################################\n");printf("## 1.Play #################### 2.Exit ##\n");printf("########################################\n");printf("Please Player Choice=>:");}
int main(){int selet=0;    //控制while循环,while (!selet){menu();int choose=0; //供玩家选择进入游戏或者退出scanf("%d", &choose);setbuf(stdin, NULL);  //如果玩家输入字母,也不会出错switch (choose){case 1:mineSweepGame();printf("请问是否再来一把?\n");Sleep(500);break;case 2:printf("欢迎下次再来玩\n");selet = 1;break;default:printf("输入有误,请重新输入!!!\n");Sleep(500);break;}}system("pause");
}

C语言实现扫雷(可自动显示无雷区)相关推荐

  1. 原生JS 扫雷游戏 自动插旗子 自定义雷区大小 雷数可调

    能随机背景颜色自动插旗子自定义雷区大小和难度的扫雷游戏 随机变换雷区颜色,以及其它CSS样式,动画效果全是CSS.点击网页上的元素触发游戏事件打开雷区.如果对于一个方格,其周围未打开的方格恰好全都有雷 ...

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

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

  3. R语言ggplot2可视化绘制线图(line plot)、使用gghighlight包突出高亮线图的满足条件的线图、设置高亮线图不显示默认自动显示的文本标签(use_direct_label)

    R语言ggplot2可视化绘制线图(line plot).使用gghighlight包突出高亮线图的满足条件的线图.设置高亮线图不显示默认自动显示的文本标签(use_direct_label = FA ...

  4. python扫雷_自动扫雷 Python语言

    本文主要向大家介绍了自动扫雷 Python语言,通过具体的内容向大家展示,希望对大家学习Python语言有所帮助. 自动扫雷一般分为两种,一种是读取内存数据,而另一种是通过分析图片获得数据,并通过模拟 ...

  5. c语言switch键盘输入,用switch语句从键盘输入一个月份,自动显示该月份的英文名称!C语言的...

    用switch语句从键盘输入一个月份,自动显示该月份的英文名称!C语言的 关注:119  答案:5  mip版 解决时间 2021-01-30 10:34 提问者关系已逝 2021-01-29 11: ...

  6. 投影仪显示计算机自动无信号,解决投影仪显示无信号的问题

    1.VGA线链接正确 首先请确保VGA线连接在投影机的带有"Computer"或"PC"字样的接口上(注意:不要连接在带有"Monitor Out&q ...

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

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

  8. C语言实现扫雷小游戏(具体步骤+具体说明)

    C语言实现扫雷目录 一.游戏介绍 三.具体步骤 1.菜单页面 2.初始化雷盘 3.打印雷盘 4.布置雷 5.排查雷 7.统计所选位置周围八个位置中雷的个数 四.完整代码 1.test.c-扫雷游戏的测 ...

  9. c语言—实现扫雷游戏

    文章目录 什么是扫雷游戏 一.实现思路 二.头文件 三.主函数文件 1.菜单函数 2.主函数 四.游戏文件 1.地图初始化 2.展示地图 3.埋雷函数 4.判断该位置附近雷的个数 5.主游戏函数 五. ...

最新文章

  1. Java编程操作Excel的一种方法
  2. JAVA——JScrollbar 滚动条自动滚动到底端解决方案
  3. C++ 私有成员变量的理解
  4. linux下 如何调试php,linux下使用gdb对php源码调试
  5. python代码大全中文注释_零基础小白必看篇:Python代码注释规范代码实例解析操作(收藏)...
  6. 曝荣耀仍未获得谷歌Android授权;诋毁鸿蒙的OPPO员工离职;微信圈子将停止运营|极客头条...
  7. HDFS伪分布式集群搭建
  8. Srs之Clion编译
  9. javaWeb中的分页处理思想
  10. WML语言基础(WAP建站)六
  11. 公司搞不好,除了坑股东,还坑的是客户
  12. 430单片机实现三人投票表决器_基于单片机的五人表决器的设计
  13. 借助取色工具ColorPix对Pycharm编辑器设定自己喜欢的代码颜色_20161202
  14. 〖Python 数据库开发实战 - MySQL篇㉕〗- 数据更新操作 - UPDATE 语句
  15. 防火墙之Iptables与Firewalld
  16. vuepress打包报错:error Error rendering /:
  17. android N : UnsatisfiedLinkError
  18. 重装 UOS Deepin V20 后必安装软件(个人习惯)
  19. oracle转换全角函数,Oracle全角変換
  20. RabbitMQ安装流程

热门文章

  1. ASP.NET-----Repeater数据控件的用法总结(转)
  2. [Beego]三、Filter 过滤器
  3. springboot+vue交流互动系统(源码+文档)
  4. 计算机的存储器先关知识,最详细的存储器知识大盘点!
  5. Django实现定时任务和邮件发送(含各种附件)功能
  6. 【资料总结系列】机器人仿真——webots资料总结
  7. Unity之Microphone如何实现录音和播放
  8. html让视频跟图片之间无缝,如何做到两个视频之间自然无缝衔接
  9. Web 发送 form-data 请求 Content-Type: multipart/form-data
  10. echart中国地图跟省地图整合