文章目录

  • 一.扫雷游戏简介
  • 二.C语言代码实现
    • 1.整体框架简述
    • 2.游戏整体逻辑的实现及测试
    • 3.游戏具体过程实现
      • (1)设计布置雷的棋盘和打印信息的棋盘
      • (2)在棋盘上布置雷
      • (3)排查雷
    • 4.代码展示

一.扫雷游戏简介

扫雷相信大家也都应该玩过,在这里还是简单介绍一下:
《扫雷》是一款大众类的益智小游戏,游戏目标是在最短的时间内根据点击格子出现的数字找出所有非雷格子,同时避免踩雷,踩到一个雷即全盘皆输。

每个格子上显示的数字即表示该格子周围雷的个数

那么我们接下来带领大家实现一个大小为9*9的扫雷游戏:

二.C语言代码实现

1.整体框架简述

最终实现游戏的完整代码,我们放在三个文件中,方便对我们的代码进行管理。

这三个文件分别是:
(1)test.c
用于对游戏逻辑的测试
(2)game.h
游戏实现相关的函数声明,符号声明,头文件的包含
(3)game.c
游戏实现相关函数的实现

全部的代码我们放在最后供大家参考

2.游戏整体逻辑的实现及测试

我们先在test.c文件对扫雷游戏的整体流程进行一个实现,测试一下逻辑是否正确,实现游戏功能的函数我们先不具体实现:

#include "game.h"
//打印菜单函数
void menu()
{printf("**********************************\n");printf("******       1. play       *******\n");printf("******       0. exit       *******\n");printf("**********************************\n");
}//游戏实现函数
play_game()
{printf("扫雷\n");
}int main()
{int elect = 0;do{menu();printf("请选择:");scanf("%d", &elect);switch (elect){case 1:play_game();break;case 0:printf("退出游戏!!!\n");break;default:printf("选择错误,请重新选择!!!\n");break;}} while (elect);return 0;
}


测试一下:

3.游戏具体过程实现

(1)设计布置雷的棋盘和打印信息的棋盘

既然要实现一个9X9的扫雷,我们就需要一个9X9大小的棋盘,那我们是不是可以考虑使用一个9X9的二维数组呢

但是,如果我们就把大小设置程9*9的二维数组,会发现其实存在一些问题:
要实现扫雷的话我们就要统计一下每个格子周围雷的个数

所以,我们不妨把这个数组搞大点,用一个11X11的二维数组外边的两圈我们不放雷就行了,这样就不会越界访问了;
现在有一个数组来放雷了,但是在游戏过程中我们是不是还需要打印雷的数量信息便于玩家排雷,所以我们再搞一个11X11的二维数组来表示雷的数量信息:

那接下来我们就定义这样两个数组并对他们按要求进行初始化;
首先,我们为了以后如果想修改棋盘大小比较方便,我们在头文件game.h 中用关键字define定义两个标识符常量:



记得在test.c和game.c中别忘了引用头文件“game.h”。
现在初始化好了,那我们定义一个打印棋盘的函数:

调用并运行一下:

(2)在棋盘上布置雷

现在棋盘已经设计好了,我们就可以在棋盘上布置雷了,我们规定一下,每一局我们布置10个雷:
设计一个布置雷的函数:
我们的思路是随机生成两个1~9的随机数作为雷的坐标,然后在该位置放雷,这里又用到了rand函数来生成随机数

当然记得调用srand设置随机数生成器srand((unsigned int)time(NULL)),在main函数中调用一次即可;
使用srand函数时需要包含#include <stdlib.h>这个头文件,time函数需要包含#include <time.h>头文件。

运行一下看看效果:

(3)排查雷

雷布置好了,那我们现在就可以排查雷了。
排查的话,我们是不是要在mine数组里面排查,因为雷是布置在这个数组里的,然后我们把排查到的信息存放到show数组中,这个数组是用来显示排查出的雷的信息的
然后我们来定义排查雷的函数,思路是这样的:

  1. 让玩家输入一个坐标,判断是否合法,不合法提示玩家重新输入
  2. 如果合法,判断该坐标是否是否已经被排查过,若被排查过,提示玩家重新输入
  3. 若没被排查过,再判断该坐标放的是否是雷(即是否==1),是雷的话,提示玩家被炸死,结束游戏。
  4. 若不是雷,计算出该坐标周围的雷的个数,结果放到show数组对应元素中,展示出来。
  5. 在判断雷的个数这里,因为我们布置雷的时候是无雷是字符’0‘,有雷是字符’1‘,我们采用的方法是对它周围的一圈元素进行遍历求和,再减去8乘以字符’0‘,结果就是雷的个数(因为字符1跟字符0的ASCII码值差值也是1)
  6. 如果排查了 71次还没被炸死,则玩家获胜(因为我们放了10个雷,9乘9-10=71)

    统计雷个数的函数:

    好了,到这里,我们就实现完了!!!
    玩一把试试:

可以正常玩了!!!

4.代码展示

(1)test.c
用于对游戏逻辑的测试

#include "game.h"
//打印菜单函数
void menu()
{printf("**********************************\n");printf("******       1. play       *******\n");printf("******       0. exit       *******\n");printf("**********************************\n");
}//游戏实现函数
play_game()
{//创建两个字符数组char mine[ROWS][COLS] = { 0 };  //用于布置雷char show[ROWS][COLS] = { 0 };  //用于显示排查的雷的信息//初始化棋盘InitBoard(mine, ROWS, COLS, '0');  //全部初始化为'0'InitBoard(show, ROWS, COLS, '*');  //全部初始化为'*'//打印棋盘//print_board(mine, ROW, COL);//print_board(show, ROW, COL);//布置雷set_mine(mine, ROW, COL);//print_board(show, ROW, COL);//排查雷print_board(show, ROW, COL);find_mine(mine, show, ROW, COL);
}int main()
{int elect = 0;srand((unsigned int)time(NULL));do{menu();printf("请选择:");scanf("%d", &elect);switch (elect){case 1:play_game();break;case 0:printf("退出游戏!!!\n");break;default:printf("选择错误,请重新选择!!!\n");break;}} while (elect);return 0;
}

(2)game.h
游戏实现相关的函数声明,符号声明,头文件的包含

#pragma once#define _CRT_SECURE_NO_WARNINGS
#include <stdio.h>
#include <stdlib.h>
#include <time.h>#define ROW 9
#define COL 9
#define ROWS ROW+2
#define COLS COL+2
#define EASY_COUNT 10//函数声明
void InitBoard(char board[ROWS][COLS], int rows, int cols, 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);

(3)game.c
游戏实现相关函数的实现

#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++) {board[i][j] = set;}}
}//打印棋盘
void print_board(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 set_mine(char mine[ROWS][COLS], int row, int col)
{int count = 10;//10个雷while (count) {int x = rand() % row + 1;//生成1~9的随机数int y = rand() % col + 1;if (mine[x][y] == '0') {     mine[x][y] = '1';count--;}}
}//计算雷的个数
int get_mine_count(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 find_mine(char mine[ROWS][COLS], char show[ROWS][COLS], int row, int col)
{int x = 0;int y = 0;int win = 0;while (win < row * col - EASY_COUNT){printf("请输入要排查雷的坐标:>");scanf("%d %d", &x, &y);if (x >= 1 && x <= row && y >= 1 && y <= col){//坐标被排查过if (show[x][y] == '*'){if (mine[x][y] == '1'){printf("很遗憾,你被炸死了\n");print_board(mine, ROW, COL);break;}else{int count = get_mine_count(mine, x, y);show[x][y] = count + '0';print_board(show, ROW, COL);win++;}}else{printf("该坐标已经被排查过了\n");}}else{printf("坐标非法,请重新输入\n");}}if (win == row * col - EASY_COUNT){printf("恭喜你,排雷成功\n");print_board(mine, ROW, COL);}
}

C语言实现扫雷游戏(详解)相关推荐

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

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

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

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

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

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

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

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

  5. 【原创-更新完毕】|日历拼图游戏的解决方案(C语言-进阶应用)-详解连载2

    [原创]|日历拼图游戏的解决方案(C语言-进阶应用)-详解连载1_zhuyi8120的博客-CSDN博客 [原创]|日历拼图游戏的解决方案(C语言-进阶应用)-详解连载3_zhuyi8120的博客-C ...

  6. 【原创-更新完毕】|日历拼图游戏的解决方案(C语言-进阶应用)-详解连载1

    [原创]|日历拼图游戏的解决方案(C语言-进阶应用)-详解连载2_zhuyi8120的博客-CSDN博客 [原创]|日历拼图游戏的解决方案(C语言-进阶应用)-详解连载3_zhuyi8120的博客-C ...

  7. 嵌入式c语言为什么变量定义在前面,嵌入式C语言数据类型和变量详解

    原标题:嵌入式C语言数据类型和变量详解 一般来讲,标准的C语言类型在嵌入式编译器中是合法的.但由于嵌入式控制器的受限环境.嵌入式c语言的变量和数据类型具有新的特征,这些特征体现在如下方面. 嵌入式C语 ...

  8. 用数据结构c语言写成绩排序,C语言数据结构 快速排序实例详解

    C语言数据结构 快速排序实例详解 一.快速排序简介 快速排序采用分治的思想,第一趟先将一串数字分为两部分,第一部分的数值都比第二部分要小,然后按照这种方法,依次对两边的数据进行排序. 二.代码实现 # ...

  9. 用c语言编写最大最小值_C语言学习教程,用C语言编写扫雷游戏

    本文实例为大家分享了C语言实现扫雷游戏及其优化的具体代码,供大家参考,具体内容如下 关于扫雷优化 1.核心思想:使用两个二维数组进行设计,一个用于显示,一个用于后台雷的布置. 2.使用宏常量,后期可以 ...

  10. C语言解决约瑟夫问题详解的代码

    C语言解决约瑟夫问题详解的代码 参考文章: (1)C语言解决约瑟夫问题详解的代码 (2)https://www.cnblogs.com/odsxe/p/10791049.html (3)https:/ ...

最新文章

  1. [Z]应试生涯结束后,美国亚裔的那群超优生都过得如何?来源: 李璐瑶的日志...
  2. slam中特征点归一化原因以及方法
  3. 2022.2.13java学习笔记
  4. jsp+tomcat程序helloworld
  5. TypeScript 里的 unknown 和 never
  6. 模板:广义二项式反演/广义容斥(组合数学)
  7. ggplot2箱式图两两比较_R语言进阶笔记2 | 长数据与ggplot2
  8. [摘]UML学习二:标准建模语言UML的静态建模机制
  9. 安装ie9提示未能完成安装_Windows 7下安装IE 11失败,提示:Internet Explorer未能完成安装...
  10. 压力测试和负载测试区别_性能测试vs压力测试vs负载测试
  11. php 字符转ansi,php 字符编码转换类,支持ANSI、Unicode、Unicode big endian、UTF-8、UTF-8+Bom 互相转换...
  12. 机器学习项目实战(一) 鸢尾花
  13. 大学生创业实战 - 代充的套利故事
  14. 浏览器打开服务器图片不显示图片,网页图片不显示的原因 世界之窗浏览器网页显示不正常...
  15. 《算法设计与分析》第十三周作业
  16. autojs代码大全(实战演练)
  17. 算法小讲堂之B树和B+树(浅谈)|考研笔记
  18. 计算机启动后无法进入系统怎么办,电脑开机无法进入系统怎么办
  19. 【CCS仿真系列教程】手把手教你纯软件仿真实现音频滤波
  20. android5.0新特性 clipping的用法

热门文章

  1. Linux下WebLogic漏洞补丁包安装过程
  2. 本周AI热点回顾:RTX3080被黄牛炒上天;百度资本助力AI 制药,已有十几位博士加入;百度联手打造AI沉浸互动展中国首秀
  3. java计算机毕业设计网上书店进销存管理系统源码+数据库+系统+lw文档+mybatis+运行部署
  4. 多媒体文件格式全解说(下)--图片
  5. 常见消息中间件大 PK
  6. 路径规划(一) —— 环境描述(Grid Map Feature Map) 全局路径规划(最优路径规划(DijkstraA*star) 概率路径规划(PRMRRT))
  7. Aurora AD308e 一体机驱动
  8. 电子电路绘图与仿真软件
  9. c语言实验报告模板电子版,C语言实验报告模板.doc
  10. VM虚拟机浏览器替代软件-VMLogin虚拟多登指纹浏览器,超级浏览器,防关联浏览器