正文开始前,先问问各位,你们有没有过课间在班级电脑上玩扫雷的经历呢?我高中的时候隔壁班的一些同学喜欢在课间趁老师不在玩扫雷游戏,经常欢声一片~

emmmm...我们言归正传哈哈,扫雷游戏是电脑自带游戏里最著名的一款游戏了,也是逻辑性最强的一款,老规矩,给大家介绍一下扫雷及其规则:

《扫雷》是一款大众类的益智小游戏,于1992年发行。游戏目标是在最短的时间内根据点击格子出现的数字找出所有非雷格子,同时避免踩雷,踩到一个雷即全盘皆输。

相信大家都对上图中的数字和小旗好奇过,这些东西有什么用呢?首先,数字的话是说明以数字为中心的周围8个格子中的雷的个数,3表示周围8个格子里有3个雷,1表示1个雷。小旗的话表示标记出你认为的可能是雷的点,提醒你不要去踩这个雷。

下面我们就尝试用C语言来做一下:

我们还是创造三个文件(game.h)(game.c)(test.c)

game.h负责引头文件和函数声明

#pragma once#include <stdio.h>
#include <stdlib.h>
#include <time.h>#define ROW 9
#define COL 9
#define ROWS ROW+2//这里是为了定义一个11*11的表格,方便对周围的雷数进行统计
#define COLS COL+2
#define X 9
void init_board(char board[ROWS][COLS], int row, int col, char set);//定义初始化面板
void print_board(char board[ROWS][COLS], int row, int col);//定义打印面板
void set_mine(char mine[ROWS][COLS], int row, int col);//定义布置雷
void find_mine(char mine[ROWS][COLS], char show[ROWS][COLS], int row, int col);//定义寻找雷
void expand_board(char mine[ROWS][COLS], int row, int col);//定义拓展

上面有几点要说明一下:mine[][]是系统上真正的面板,show[][]是展示在我们面前的面板,拓展是可以使得我们的游戏有扫一个地方连锁反应扫一片地方的能力。

下面展示test.c面板,看一下整个流程是怎么走的:

#include "game.h"void menu()//菜单
{printf("********************************\n");printf("***************1.game***********\n");printf("***************0.exit***********\n");printf("********************************\n");
}void game()//游戏程序
{char mine[ROWS][COLS] = { 0 };//定义minechar show[ROWS][COLS] = { 0 };//定义showinit_board(mine, ROWS, COLS, '0');//初始化mine面板init_board(show, ROWS, COLS, '*');//初始化show面板print_board(show, ROW, COL);//打印出来show面板(注意,这里是ROW,COL说明打印的是9*9面板)set_mine(mine, ROW, COL);//布置雷find_mine(mine, show, ROW, COL);//开始找雷
}void test()
{srand((unsigned int)time(NULL));//输出一个随机数int input = 0;do{menu();printf("请选择(1/0):");scanf_s("%d", &input);switch (input){case 1:printf("进入游戏\n");game();break;case 0:printf("退出游戏\n");break;default:printf("输入错误\n");}} while (input);
}
int main()
{test();return 0;
}

接下来走入我们最核心的部分,也是最难,折磨了我好几十次的核心代码(game.c):

#include "game.h"void init_board(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 print_board(char board[ROWS][COLS], int row, int col)
{int i = 0;int j = 0;printf("---------扫雷----------\n");for (j = 0; j <= col; j++){printf("%d ", j);}printf("\n");for (i = 1; i <= row; i++){printf("%d ", i);for (j = 1; j <= col; j++)//这个位置一定要注意必须从1开始,因为j=0是不算的{printf("%c ", board[i][j]);}printf("\n");}printf("---------扫雷----------\n");
}void set_mine(char mine[ROWS][COLS], int row, int col)
{int count = X;while (count){int x = rand() % row + 1;int y = rand() % col + 1;if (mine[x][y] == '0'){mine[x][y] = '1';count--;}}
}int know_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');//因为这个地方mine不是‘1’就是‘0’,是字符,所以减去8*‘0’就是雷的个数,return 即可
}void expand_board(char mine[ROWS][COLS], char show[ROWS][COLS], int x, int y, int* win)
{int count = know_mine(mine, x, y);if (count == 0){show[x][y] = ' ';if (show[x - 1][y - 1] == '*' && x - 1 > 0 && x - 1 < ROWS && y - 1 > 0 && y - 1 < COLS)expand_board(mine, show, x - 1, y - 1, win);if (show[x - 1][y] == '*' && x - 1 > 0 && x - 1 < ROWS && y > 0 && y < COLS)expand_board(mine, show, x - 1, y, win);if (show[x - 1][y + 1] == '*' && x - 1 > 0 && x - 1 < ROWS && y + 1 > 0 && y + 1 < COLS)expand_board(mine, show, x - 1, y + 1, win);if (show[x][y - 1] == '*' && x > 0 && x < ROWS && y - 1 > 0 && y - 1 < COLS)expand_board(mine, show, x, y - 1, win);if (show[x][y + 1] == '*' && x > 0 && x < ROWS && y + 1 > 0 && y + 1 < COLS)expand_board(mine, show, x, y + 1, win);if (show[x + 1][y - 1] == '*' && x + 1 > 0 && x + 1 < ROWS && y - 1 > 0 && y - 1 < COLS)expand_board(mine, show, x + 1, y - 1, win);if (show[x + 1][y] == '*' && x + 1 > 0 && x + 1 < ROWS && y > 0 && y < COLS)expand_board(mine, show, x + 1, y, win);if (show[x + 1][y + 1] == '*' && x + 1 > 0 && x + 1 < ROWS && y + 1 > 0 && y + 1 < COLS)expand_board(mine, show, x + 1, y + 1, win);}else{show[x][y] = count + '0';}
}
int IsWin(char show[ROWS][COLS], int row, int col)//判断胜利程序
{int i = 0;int j = 0;int count = 0;for (i = 1; i <= row; i++){for (j = 1; j <= col; j++){if (show[i][j] == '*'||show[i][j]=='@'){count++;}}}return count == X;
}
void find_mine(char mine[ROWS][COLS], char show[ROWS][COLS], int row, int col)
{int x = 0;int y = 0;int win = 0;int num = 0;while (IsWin(show, row, col) == 0){printf("请选择(1/2):");scanf_s("%d", &num);switch (num){case 1:while (IsWin(show, row, col) == 0){printf("请输入排的坐标:");scanf_s("%d %d", &x, &y);if (x >= 1 && x <= row && y >= 1 && y <= col){if (show[x][y] != '*'){printf("该坐标被排查过了\n");continue;}else if (mine[x][y] == '1'){printf("你被雷炸了\n");print_board(mine, ROW, COL);break;}else{int n = know_mine(mine, x, y);show[x][y] = n + '0';if (show[x][y] == '0'){show[x][y] = ' ';}expand_board(mine, show, x, y, win);print_board(show, ROW, COL);break;}}else{printf("非法输入\n");}}continue;case 2:printf("标记雷点:");scanf_s("%d %d", &x, &y);if (show[x][y] == '*'){show[x][y] = '@';print_board(show, ROW, COL);}}printf("%d", win);}if (IsWin(show, row, col)==1){printf("恭喜你,排雷成功\n");print_board(mine, ROW, COL);}
}

说明一下,expand_board里面的是递归方法,要注意。

下面是运行界面:

一共238行代码,前前后后也就试了快50遍吧,对照着mine面板不断尝试感觉眼睛都要无了........如果觉得本文对你有用,可以给作者点点赞吗?下期再见喽~

扫雷C语言(包括拓展和雷点标记)相关推荐

  1. “扫雷”C语言实现(含炸开效果)

    "扫雷"C语言实现(感染效果) game.h #include<stdio.h> #include<stdlib.h> #include<time.h ...

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

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

  3. 图形化界面扫雷(C语言+easyx实现,多图教学)

    扫雷 前言 准备工作 EasyX的下载 一些准备知识 头文件的引用 图形化界面的创建 图形化界面简介 图片加载与放置图片 鼠标操作 提示框 其它的准备知识 思路分析 代码实现 准备工作 初始化游戏的函 ...

  4. Microsoft Translator:打破语言障碍 拓展全球沟通新机遇

    作者:Olivier Fontana, 微软研究院Microsoft Translator产品战略总监 世界越来越小,全球协作.共同创新已经成为常态.在微软研究院,我们对此尤为感同身受--从北京到雷德 ...

  5. 扫雷c语言完整源代码,C语言扫雷源码

    C语言扫雷源码 #include #include #include #include /*鼠标信息宏定义*/ #define WAITING 0xff00 #define LEFTPRESS 0xf ...

  6. 扫雷用递归实现拓展空白详解

    目录 基本思路讲解 统计周围雷个数 周围没有雷时实现拓展空白 判断输赢 基本思路讲解 话不多说,先上图看整体效果: 统计周围雷个数 我是用11x11的数组作为整个地图大小,游戏界面显示用9x9的地图大 ...

  7. <C语言>扫...土豆雷游戏?!

    目录 前言 一.戴夫的花园扫雷构思 二.代码实现扫土豆雷的步骤 1.创建项目 2. 呈现菜单,并实现玩家可一直玩游戏 3.初始化花园(各种构思问题) 4.打印花园(游戏框) 5.布置土豆雷(随机) 6 ...

  8. java二维数组扫雷,C语言二维数组实现扫雷游戏

    #include //使用二维数组实现 扫雷 int main() { char ui[8][8]={ '+','+','+','+','+','+','+','+', '+','+','+','+' ...

  9. c语言包括在方括号中的序号称为,自考《高级语言程序设计》知识点总结(四)...

    4.1  一维数组 1.数组的基本概念 数组是一组同类对象集合的一种表示.在C语言中,数组类型是这样一种数据结构:数组所有元素的数据类型相同,元素个数固定,其元素按顺序存放,每个元素对应一个序号(称为 ...

最新文章

  1. ajax——XMLHttpRequest
  2. 【新品发布】山海软件生产线pspl,包含了一个开源的混淆器
  3. 好像博问不能回复了,看似是某个脚本错误阻止了提交。可有此事?
  4. C语言描述栈的实现及操作(数组实现)
  5. Python计算斐波那契数列
  6. 痛苦如此持久,像蜗牛充满耐心地移动;快乐如此短暂,像兔子的尾巴掠过秋天的草原...
  7. JustForFly struts2标签s:generator
  8. Vue项目部署到SpringBoot工程下
  9. android音乐播放器歌词解析,iOS 音乐播放器歌词解析
  10. 华为交换机端口限速配置说明
  11. vr转换软件android版,普通视频转换成VR
  12. ubuntu系统压力测试工具--stress
  13. 看板方法不是方法论 | David博客系列 | Agilean学院出品
  14. Java接入支付宝支付(沙箱)
  15. 路由url里多了%7D是怎么回事?
  16. [Tool]系统截图工具
  17. 基于SNMP的网络拓扑结构自动发现研究
  18. windows有哪些版本
  19. Android提示“很抱歉,xxx已停止运行“,adb命令连接模拟器并查看安卓日志
  20. 自媒体去哪里找素材?

热门文章

  1. 芯片+步进电机档位控制实验
  2. 行云管家荣膺《中国网络安全行业全景图(第九版)》收录
  3. 什么是gulp?使用方法?
  4. Mini-XML 程序员开发手册, Version 2.5(转)
  5. 中国独立游戏节(IGF China)2010 全入围作品视频介绍
  6. 点灯游戏原生JS实现与jQuery实现
  7. bert4keras中预训练代码阅读
  8. vue使用element-ui上传多张图片及回显
  9. CAD在线转换PDF格式怎么操作?
  10. 【PyTorch】 99%程序员都不知道, 深度学习还能这样玩 (建议收藏)