1.关于扫雷游戏的介绍

首先如果我们要实现扫雷游戏的话,要明白扫雷游戏是如何运行的!

这里是一个网页版的扫雷游戏的链接,可以先玩一下,这样可以对我们实现扫雷游戏的代码有非常大的帮助!

扫雷游戏网页版 - Minesweeper


2.关于扫雷游戏原理的介绍

a.

根据上面三张图我们可以了解到,对于扫雷游戏我们每次可以进行的操作是,对相关点进行标记或者对相关点进行清扫。

b.而对该点进行清扫的话,又会有两中情况发生,其一是如果该点是雷,哇,金色传说!恭喜你,被雷炸死了!其二,就是如果该点不是雷,那么将返回该点周围一圈八个点的雷数,如果该点周围没有雷,那么将对大量无雷点进行地毯式清扫。

c.那么我们要清扫的点如果是非雷点我们要怎样去实现返回该点附近的雷数呢!

在这里我所用的方法是用两个二维数组去实现的,一个是数组是用来布雷的,而另一个是用来返回非雷点附近的雷数的


3.扫雷游戏相关代码的实现

a.扫雷游戏的菜单界面

做为一个游戏程序,我们在游戏开始前当然要询问玩家是否要开始进行游戏!

#pragma once#include<stdio.h>
#include<stdlib.h>
#include<time.h>
#define ROWS 11
#define COLS 11
#define row 9
#define col 9
#define quantity 10void menu();             //游戏菜单
void mine_clearance_game();                 //游戏程序
void Initmine(char [][COLS], int, int, char);              //对雷区初始化
void Displaymine(char[][COLS], int, int);                   //打印雷区
void Thunder_release(char[][COLS], int, int);                //放雷
int  mine_clearance(char[][COLS], char [][COLS], int, int);                  //扫雷
int thunder_number(char[][COLS], int, int);                                    //计算该点附近的雷数
int judge(char [][COLS], int, int);                                             //返回已扫点的个数
void flag(char [][COLS], int, int);                                              //对雷区做标记
void menu1();
void mine_clearance1(char[][COLS], char[][COLS], int, int);                       //扫雷并平铺
void Tile(char[][COLS], char[][COLS], int, int);

上面的代码段是扫雷游戏的头文件

#include"mine_clearance.h"int main(void)
{int value = 0;srand((unsigned)time(NULL));do{printf("是否要玩扫雷玩家请做出你的选择:\n");menu();scanf("%d",&value);switch (value){case 1:mine_clearance_game();break;case 0:printf("程序退出!\n");break;default:printf("您输入错误请重新输入:\n");break;}} while (value);return 0;
}
void menu()
{printf("***********************************\n""************  1.play   ************\n""************  0.exit   ************\n""***********************************\n""***********************************\n");
}

在主函数中我们首先声明了一个名为value的int类型的变量用来介绍玩家做出的选择是1还是0,然后,接着就是调用srand()库函数,初始化随机数的生成器,然后是,do{}while循环让玩家先进菜单界面,通过switch多重选择结构来实现对play还是exit的选择,当然玩家只可以在1或0之间选择如果玩家输入其他的数值,将重新输入!

当玩家选择0就会退出程序!

b.扫雷游戏的进行

void mine_clearance_game()
{char mine[ROWS][COLS] = { 0 };char mine1[ROWS][COLS] = { 0 };Initmine(mine, row, col, '0');Initmine(mine1, row, col, '*');//Displaymine(mine, row, col);system("cls");Displaymine(mine1, row, col);Thunder_release(mine, row, col);Displaymine(mine, row, col);int input = 0;int flagf = 1;while (flagf){system("cls");Displaymine(mine1, row, col);//Displaymine(mine, row, col);printf("玩家请你做出选择:\n");menu1();scanf("%d",&input);if (input){system("cls");flagf=mine_clearance(mine, mine1, row, col);}else{system("cls");flag(mine1, row, col);}}//mine_clearance1(mine, mine1, row, col);
}

当玩家选择1后,程序的执行将进入mine_clearance_game()函数中,首先创建雷阵mine和雷阵mine1两个都为char类型的二维数组,然后调用Initmine()函数实现对两个雷阵的初始化,放雷阵均初始话为字符0,反数阵均初始化为字符*

void Initmine(char mine[][COLS], int a, int b, char get)
{int i = 0;int j = 0;for (i = 0; i < ROWS; i++){for (j = 0; j < COLS; j++){mine[i][j] = get;}}
}

Displaymine()函数是对数组的打印

void Displaymine(char mine[][COLS], int a, int b)
{printf("- - - - 扫雷 - - - -\n");int i = 0;int j = 0;for (i = 0; i <= a; i++){printf("%d ",i);}printf("\n");for (i = 1; i <= a; i++){printf("%d ", i);for (j = 1; j <= b; j++){printf("%c ",mine[i][j]);}printf("\n");}
}

Thunder_release()函数是在雷阵中放置雷

void Thunder_release(char mine[][COLS], int a, int b)
{int x = 0;int y = 0;int n = quantity;while (n > 0){x = rand() % a+1;y = rand() % b+1;if (mine[x][y] == '0'){mine[x][y] = '1';n--;}}
}

rand()函数是生成一个随机数,然后我们对这个随机数进行求模运算在加1就会得到1到a的数值quantity是一个字符常量值为要放置的雷数;

然后接着就是while循环,在循环中让玩家做出选择要标记点还是要清扫点

void menu1()
{printf("***********************************\n""************  1.mine_clearance   **\n""************  0.flag   ************\n""***********************************\n""***********************************\n");
}

选择1是进行清扫点

int mine_clearance(char mine[][COLS],char mine1[][COLS], int a, int b)
{int x = 0;int y = 0;int count = 0;int number = 0;int input = 0;while (number<a*b- quantity){system("cls");Displaymine(mine1, row, col);printf("玩家请做出选择:\n");scanf("%d %d", &x, &y);if (mine[x][y] == '1'&&mine1[x][y]=='*'){system("cls");printf("该点有雷你被炸死了!\n");Displaymine(mine, row, col);return 0;}else if(mine1[x][y]=='*'){count = thunder_number(mine, x, y);mine1[x][y] = count + '0';system("cls");Displaymine(mine1, row, col);}else if(mine1[x][y]==' '){system("cls");printf("这个是标记点不可被清扫,请重新输入:\n");continue;}else{printf("给点已经被你扫的很干净了,请你扫一扫其他点吧,求求了!\n");continue;}number = judge(mine1, a, b);if (number < a * b - quantity){system("cls");Displaymine(mine1, row, col);printf("玩家你是否还要继续扫雷:\n");menu();scanf("%d", &input);if (!input){break;}}}if (number == a * b - quantity){printf("你完成了扫雷!\n");return 0;}return 1;
}
int thunder_number(char mine[][COLS], int x, int y)
{return mine[x - 1][y - 1] + mine[x - 1][y] + mine[x - 1][y + 1] +mine[x][y - 1] + mine[x][y + 1] +mine[x + 1][y - 1] + mine[x + 1][y] + mine[x + 1][y + 1] -8 * '0';
}
int judge(char mine[][COLS], int a, int b)
{int i = 0;int j = 0;int sum = 0;for (i = 1; i <=a; i++){for (j = 1; j <=b; j++){if (mine[i][j] != '*'){sum++;}}}return sum;
}

注意在扫雷过程中要注意该点是不是标记点,且已经清扫过的点就不需要在清扫了,这里返回的是int类型的值,对flags的值进行改变,当return 1说明玩家可以继续进行扫雷游戏,return 0说明玩家不是被炸死了就是玩家赢得了扫雷游戏的胜利!

选择0是进行标记

void flag(char mine1[][COLS], int a, int b)
{int x = 0;int y = 0;static int number = 0;int input = 0;while (number<= quantity){Displaymine(mine1, row, col);printf("玩家请你做出标记:\n");scanf("%d %d", &x, &y);if (mine1[x][y] == '*'){mine1[x][y] = ' ';number++;Displaymine(mine1, row, col);}else{system("cls");printf("该点已被清扫不可在被标记,请重新标记:\n");continue;}system("cls");Displaymine(mine1, row, col);printf("玩家你是否还要做标记:\n");menu();scanf("%d",&input);if (!input){break;}}
}

此时我们的扫雷游戏简单版就完成了!下面是运行实例图

 

c.递归实现返回数并平铺

void mine_clearance1(char mine[][COLS], char mine1[][COLS], int a, int b)
{int x = 0;int y = 0;int n = 0;while (n < 2){printf("玩家请你输入你想清扫的点的坐标:\n");scanf("%d %d", &x, &y);if (mine[x][y] == '1'){printf("该点有雷,你被炸死了!");}else{Tile(mine, mine1, x, y);Displaymine(mine1, row, col);}n++;}
}void Tile(char mine[][COLS], char mine1[][COLS], int x, int y)
{int count = 0;count = thunder_number(mine, x, y)+'0';mine1[x][y] = '#';int i = 0, j = 0;if (count == '0'){for (i = -1; i <= 1; i++){for (j = -1; j <= 1; j++){if (x+i>=1&&x+i<=9&&y+j>=1&&y+j<=9&&mine1[x + i][y + j] != '#')                       //防止在递归的过程中数组下标越界{Tile(mine, mine1, x + i, y + j);}/*else{break;}*/}}}mine1[x][y] = count;}

用递归来解决问题时,是将问题由大变小细化,然后一步一步先解决小的问题在解决大的问题,在用递归处理问题时主要是寻找问题的大模块和小模块之间的粘连性,找到了粘连性也就找到了用递归处理问题的关键!

而对于本问题,当该点不是雷且该点周围的八个点的雷数为0,那么就进行平铺清扫!

当然对于要清扫的点最关键的还是返回该点周围八个点的雷数,那么对于平铺清扫这个问题的用递归处理的时,该问题的粘连性是什么呢?

就像往一个平面倒水一样,水要覆盖地面,前提是该点上无物体,就相当于我们要有清扫一个点,这个点的周围没有雷那么文件要继续对周围的点进行清扫,直到有雷点,

这里要注意原清扫点不可以再被清扫,否则就无法出递归了,还有在递归的时候要注意不能发生数组下标的越界!

在这里有一个问题就是如果雷数过少,代码就会出错误,因为递归每次都是开辟新的存储空间,如果雷数过少就会发生栈溢出,就像这样,如果雷数为0,程序进行就是如图

当雷数调为20

C语言——扫雷游戏详解相关推荐

  1. 【C语言扫雷游戏详解及如何实现递归展开】

    提示:全文已采用物理深色模式,请放心观看 文章目录 一.整体框架 1.设计思路 2.实现细节 二.主要函数 1.打印棋盘 2.递归展开 三.其他函数 一.整体框架 1.设计思路 基础难度的扫雷游戏含有 ...

  2. 【C语言】扫雷小游戏详解

    [C语言]扫雷小游戏详解 前言: 还记得大明湖畔的夏雨荷,电脑课上的扫雷吗? ---------------------------是 他 吗--------------------------- 没 ...

  3. c语言写扫雷新手详解

    c语言写扫雷新手详解 一.用到的知识点 1.分支语句 2.循环语句 3.二维数组 4.最好分块,使代码的功能更加独立,思维逻辑更加清楚,此程序我写了:test.c用来存放我的主函数,game.h用来定 ...

  4. C语言处理贪吃蛇游戏蛇的长度,c语言贪吃蛇详解4.食物的投放与蛇的变长

    c语言贪吃蛇详解4.食物的投放与蛇的变长 前几天的实验室培训课后作业我布置了贪吃蛇,今天有时间就来写一下题解.我将分几步来教大家写一个贪吃蛇小游戏.由于大家c语言未学完,这个教程只涉及数组和函数等知识 ...

  5. C语言贪吃蛇详解4,c语言贪吃蛇详解4.食物的投放与蛇的变长

    c语言贪吃蛇详解4.食物的投放与蛇的变长 前几天的实验室培训课后作业我布置了贪吃蛇,今天有时间就来写一下题解.我将分几步来教大家写一个贪吃蛇小游戏.由于大家c语言未学完,这个教程只涉及数组和函数等知识 ...

  6. c语言贪吃蛇详解5.GameOver功能与显示成绩

    c语言贪吃蛇详解5.GameOver功能与显示成绩 以前我们已经做出来了一个能吃东西变长的蛇.不过它好像不会死... 现在就来实现一下game over的功能吧. 写个函数判断蛇是否撞到自己或者撞到墙 ...

  7. (转)C语言位运算详解

    地址:http://www.cnblogs.com/911/archive/2008/05/20/1203477.html C语言位运算详解 作者:911 说明:本文参考了http://www2.ts ...

  8. R语言基础知识详解及概括

    R语言基础知识详解及概括 目录 R语言基础知识详解及概括 R数据可视化示例 R语言进行数据创建

  9. c语言练习题及答案)(1),c语言练习题(带详解答案)1.pdf

    c语言练习题(带详解答案)1 (-2) -1: 一单项选择题 /为求商运算符,该运算符能够对整型.字符.浮点等类型的数 据进行运算,5/2 2 1.(A )是构成C语言程序的基本单位. 11.如果 i ...

  10. python语言的格式框架_django框架模板语言使用方法详解

    本文实例讲述了django框架模板语言使用方法.分享给大家供大家参考,具体如下: 模板功能 作用:生成html界面内容,模版致力于界面如何显示,而不是程序逻辑.模板不仅仅是一个html文件,还包括了页 ...

最新文章

  1. java 删除数组指定元素_Java从在数组中删除指定元素
  2. mac python request ssl错误解决
  3. Facebook SDE onsite面经
  4. python代码编码成jni_python 设置文件编码格式的实现方法
  5. 【Luogu1996】约瑟夫问题(模拟,解法汇总)
  6. 大数据之Hadoop3.x模板虚拟机配置图解
  7. 暗时间--平凡与优秀间的距离
  8. SEO基础知识过度优化的三大问题
  9. arcengine Icommond 自定义工具
  10. 8T磁盘阵列文件存储服务器 威联通,NAS私有云老司机折腾体验记 篇八:QNAP 威联通TR-004磁盘阵列外接盒使用教程...
  11. 打印选课学生名单(25)
  12. 32-Figma-谷歌表格插件替换数据方法
  13. 一阶shelf IIR数字滤波器的设计和实现
  14. Metal每日分享,颜色转换滤镜效果
  15. 基于PanoSim仿真开发平台BSD和RCTA的构思
  16. 人工智能 一种现代方法 第5章 对抗搜索
  17. ERP实施-新能源-三元锂电池
  18. W7正在锁定计算机,win7输错密码锁定了怎么办 win7电脑被锁定的解锁方法
  19. python3中对字符串首字母大小写的转变
  20. 外卖领券饿了么美团优惠券微信小程序插件源码

热门文章

  1. 【显卡】python查看GPU(显卡)资源
  2. Acrok MXF Converter for Mac(专业的MXF格式视频转换工具)
  3. 软件项目管理的基本概念
  4. jquery.nicescroll参数说明
  5. Linux配置静态IP 详细截图
  6. 虚拟机系统和windows主机系统的文件互传方法 ——WinSCP使用
  7. h5离线缓存+sessionstroage做 离线网页
  8. 微信小程序记录v1.0
  9. 安装SQLyog教程
  10. [Altium Designer 2020 硬件设计]PCB封装库创建及3D模型添加