【C语言】扫雷游戏详解及完整代码
文章目录
- 前言
- 一、程序环境配置
- 二、各种功能的实现以及逻辑关系的整理
- 2.1 创建游戏初始界面(进入\退出 游戏)
- 2.2 创建并初始化二维数组board[][] mine[][] (board存放棋盘的信息 mine存放雷的信息)
- 2.3 初始化棋盘
- 2.4 打印棋盘
- 2.5 设置雷区
- 2.6 扫雷
- 三、完整代码展示
- 3.1 game.h板块
- 3.2 game.c板块
- 3.3 test.c板块
- 四、代码运行结果展示
- 总结
前言
大家好,相信大家对扫雷小游戏已经不陌生了。
这篇文章将分享利用C语言实现扫雷的全过程讲解及其完整代码。初学C语言的朋友们也能看懂学会哦!觉得有帮助的小伙伴记得点个免费的小赞支持一下哦。
一、程序环境配置
本项目将会用到三个文件存储代码,分别为两个源文件test.c game.c 和一个头文件 game.h。
test.c文件是整个程序的主题,game.c文件中存放实现游戏功能的代码,game.h文件中存放整个程序所需要的头文件。
这样 有利于后期调试,也提升了代码整体的可读性。
二、各种功能的实现以及逻辑关系的整理
2.1 创建游戏初始界面(进入\退出 游戏)
打印菜单
代码如下:
void menu()
{printf("******************************\n");printf("****** 1. play ******\n");printf("****** 0. exit ******\n");printf("******************************\n");
}
玩家选择1进入游戏,选择0退出游戏菜单。
代码如下:
void test()
{int input = 0;do{menu();printf("请选择:>");scanf("%d", &input);switch (input){case 1:game();break;case 0:printf("退出游戏!\n");break;default:printf("输入错误,请重新选择!\n");break;}} while (input);
}
2.2 创建并初始化二维数组board[][] mine[][] (board存放棋盘的信息 mine存放雷的信息)
这里我们使用 宏定义 的方式来创建棋盘行和列以及雷的数量,方便我们后期对棋盘以及雷数的修改。
代码如下:
#define ROW 9 //棋盘行数
#define COL 9 //棋盘列数
#define ROWS ROW+2
#define COLS COL+2
#define EASY_COUNT 10 //雷的数量
创建并初始化二维数组,实现游戏大体框架
char mine[ROWS][COLS] = { 0 }; 存放雷的信息
char show[ROWS][COLS] = { 0 };存放排查出的雷的信息
代码如下:
void SetMine(char board[ROWS][COLS], int row, int col)
{int count = EASY_COUNT;while (count){int x = rand() % row + 1; //1--9int y = rand() % col + 1; //1--9if (board[x][y] == '0'){board[x][y] = '1';//布置雷count--;}}
}
2.3 初始化棋盘
在game.c文件中搭建并初始化棋盘。
代码如下:
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;}}
}
之后在test.c文件中调用即可
init_board(mine, ROWS, COLS, ‘0’);
init_board(show, ROWS, COLS, ‘*’);
2.4 打印棋盘
代码如下:
void DisplayBoard(char board[ROWS][COLS], int row, int col)
{printf("\n");int i, j;//打印列号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++){printf("%c ", board[i][j]);}printf("\n");}printf("\n");
}
注:在打印棋盘还应考虑打印间隙、行号以及列号,便于观察结果。
2.5 设置雷区
布置雷是一个随机过程,要用到rand()函数,并在代码中设置界限,使得随机值产生的坐标在合法坐标范围之内
代码如下:
void SetMine(char board[ROWS][COLS], int row, int col)
{int count = EASY_COUNT;while (count){int x = rand() % row + 1; //1--9int y = rand() % col + 1; //1--9if (board[x][y] == '0'){board[x][y] = '1';//布置雷count--;}}
}
2.6 扫雷
扫出所有雷即为胜利,“踩”倒雷即为失败
若选中不是雷的坐标,显示周围8个坐标总共有多少雷(该过程用函数get_mine_count(char mine[ROWS][COLS],int x, int y)实现)
最终利用函数FindMine(char mine[ROWS][COLS], char show[ROWS][COLS], int row,int col)返回结果,该函数中注意设置所排坐标的合法性,若坐标非法需提示玩家 “输入坐标非法,请重新输入!”。
代码如下:
int get_mine_count(char mine[ROWS][COLS], int x, int y)
{//'0' - '0' = 0//'1' - '0' = 1//'3' - '0' = 3return 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';
}
void FindMine(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 <= 9 && y >= 1 && y <= 9){//1、踩雷if (mine[x][y] == '1'){printf("很遗憾,您被炸死了!\n");DisplayBoard(mine, row, col);break;}//2、未踩雷else{//计算x,y坐标周围有几颗雷int count = get_mine_count(mine, x, y);show[x][y] = count + '0'; //数字转字符DisplayBoard(show, row, col);win++;}}else{printf("输入坐标非法,请重新输入!\n");}}if (win = row*col - EASY_COUNT)printf("恭喜您,排雷成功。\n");
}
三、完整代码展示
3.1 game.h板块
代码如下:
#define ROW 9
#define COL 9
#define ROWS ROW+2
#define COLS COL+2
#define EASY_COUNT 70#include<stdio.h>
#include<stdlib.h>
#include<time.h>void InitBoard(char board[ROWS][COLS], int rows, int cols,char set);
void DisplayBoard(char board[ROWS][COLS], int row, int col);
void SetMine(char board[ROWS][COLS], int row, int col);
void FindMine(char mine[ROWS][COLS], char show[ROWS][COLS],int row, int col);
3.2 game.c板块
代码如下:
#define _CRT_SECURE_NO_WARNINGS 1
#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 DisplayBoard(char board[ROWS][COLS], int row, int col)
{printf("\n");int i, j;//打印列号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++){printf("%c ", board[i][j]);}printf("\n");}printf("\n");
}void SetMine(char board[ROWS][COLS], int row, int col)
{int count = EASY_COUNT;while (count){int x = rand() % row + 1; //1--9int y = rand() % col + 1; //1--9if (board[x][y] == '0'){board[x][y] = '1';count--;}}
}int get_mine_count(char mine[ROWS][COLS], int x, int y)
{//'0' - '0' = 0//'1' - '0' = 1//'3' - '0' = 3return 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';
}
void FindMine(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 <= 9 && y >= 1 && y <= 9){//1、踩雷if (mine[x][y] == '1'){printf("很遗憾,您被炸死了!\n");DisplayBoard(mine, row, col);break;}//2、未踩雷else{//计算x,y坐标周围有几颗雷int count = get_mine_count(mine, x, y);show[x][y] = count + '0'; //数字转字符DisplayBoard(show, row, col);win++;}}else{printf("输入坐标非法,请重新输入!\n");}}if (win = row*col - EASY_COUNT)printf("恭喜您,排雷成功。\n");
}
3.3 test.c板块
代码如下:
#define _CRT_SECURE_NO_WARNINGS 1
#include"game.h"
void menu()
{printf("******************************\n");printf("****** 1. play ******\n");printf("****** 0. exit ******\n");printf("******************************\n");
}
void game()
{//雷的信息存储//1.布置雷的信息char mine[ROWS][COLS] = { 0 };//2.排查出雷的信息char show[ROWS][COLS] = { 0 };//初始化棋盘InitBoard(mine, ROWS, COLS, '0');InitBoard(show, ROWS, COLS, '*');//打印棋盘DisplayBoard(show, ROW, COL);//布置雷SetMine(mine, ROW, COL);//扫雷FindMine(mine, show, ROW, COL);
}
void test()
{srand((unsigned int)time(NULL));int input = 0;do{menu();printf("请选择:>");scanf("%d", &input);switch (input){case 1:game();break;case 0:printf("退出游戏!\n");break;default:printf("输入错误,请重新选择!\n");break;}} while (input);
}
int main()
{test();
}
四、代码运行结果展示
总结
这个简单的小游戏非常适合C语言新手小白操作,我们可以尝试把它的代码完整打出来,并且当成功运行后我们将会有一定的成就感并从中得到鼓励以及接下来对C语言学习的信心。最后也欢迎各位大佬指出其中的错误。
【C语言】扫雷游戏详解及完整代码相关推荐
- 【C语言扫雷游戏详解及如何实现递归展开】
提示:全文已采用物理深色模式,请放心观看 文章目录 一.整体框架 1.设计思路 2.实现细节 二.主要函数 1.打印棋盘 2.递归展开 三.其他函数 一.整体框架 1.设计思路 基础难度的扫雷游戏含有 ...
- 坐标移动c语言,C语言 坐标移动详解及实例代码
搜索热词 题目描述 开发一个坐标计算工具, A表示向左移动,D表示向右移动,W表示向上移动,S表示向下移动.从(0,0)点开始移动,从输入字符串里面读取一些坐标,并将最终输入结果输出到输出文件里面. ...
- C语言-哈希查找(HASH)-详解(完整代码)
目录 原理: 实例解释 存储逻辑图 需要的知识: 附加 完整代码 代码详解 执行结果 1.查找个不存在的 2.查找个存在的 原理: 用一个指针数组,来存储 每个链表的头节点 的首地址 如果要从 'NU ...
- RNN模型与NLP应用笔记(3):Simple RNN模型详解及完整代码实现
一.写在前面 终于到RNN了,这篇文章首先介绍简易RNN模型,我们会以问题导向的方式一步一步对简易RNN模型进行改进.同样本文参考了王树森教授的深度学习课程内容,感谢大佬们提供的帮助. 现在开始讲述循 ...
- 扫雷游戏分析实现(完整代码)
一.三个部分 saolei.c 存放扫雷游戏的测试逻辑 game.c 游戏函数的实现 game.h 游戏函数的声明 二.棋盘设置 问题一: 设计(9×9)的棋盘,使用二维数组. 但是扫雷过程中是要判断 ...
- RNN模型与NLP应用笔记(2):文本处理与词嵌入详解及完整代码实现(Word Embedding)
一.写在前面 紧接着上一节,现在来讲文本处理的常见方式. 本文大部分内容参考了王树森老师的视频内容,再次感谢王树森老师和李沐老师的讲解视频. 目录 一.写在前面 二.引入 三.文本处理基本步骤详解 四 ...
- Java冒泡排序详解及完整代码
冒泡排序:元素之间两两之间进行比较,如果前面的数比后面的大,那么这两个数据就交换位置,然后拿着较大的数和下一个数进行比较. 代码详解: 1.定义一个数组 2.外层循环表示一共要比较多少轮,当剩下最后一 ...
- 数据结构-数组-字符串匹配:Knuth-Morris-Pratt算法(详解附完整代码)
字符串匹配 字符串抽象数据类型 字符串模式匹配 简单的字符串匹配 Knuth-Morris-Pratt算法 背景分析 失配函数 定义 实现方法 函数分析 KMP函数 实现方法 函数分析 失配信息的另一 ...
- 轮播图详解(完整代码在最后)
01 先写出基本标签布局,这里用父级div嵌套子级ul和div标签.ul是存储图片,子级div是圆点导航的父级div.代码如下: <div class="banner"> ...
- C# 调用高德地图API获取经纬度以及定位,JS获取定位【万字详解附完整代码】
最近有个需求,需要用到定位,本来打算用百度地图API定位,但是发现百度地图定位申请AppKey太麻烦了.因为是写的web端,百度地图定位API申请的Appkey需要网址过滤.索性就用高德定位了(有一说 ...
最新文章
- monkeyrunner的录制与回放
- git 入门教程之版本管理
- 搭建外文技术博客程序员都应该有自己的博客
- Java基础篇之什么是CharArrayReader
- neutron用linux_bridge部署provider网络
- io操作 mysql_使用IO流,操作Jdbc连接MySql数据库
- 延迟秋招总结,什么工作可以月薪过万?
- 柳传志:我是任正非的知音
- Android高仿淘宝订单列表效果,列表中嵌套列表
- 最强神作!Crysis深度剖析与优化指南
- 【微信小程序系列:一】携带参数跳转半屏微信小程序 先 A->B 后 B ->A
- mfrc522 c语言程序,用mxgxw/MFRC522python库和MFRC522读卡器在raspi2上编写ntag213(Mifare ultralightc)...
- 通往古埃及文明的钥匙 ———— 罗塞塔石碑
- Python实验数据处理
- HarmonyOS服务开放平台全面了解
- 联通客户端访问电信服务器访问不了的解决方案
- 环境土壤物理模型HYDRUS建模方法与多案例应用
- 小学计算机知识课件,科普知识:计算机是我们的小助手(适用于小学生)课件.ppt...
- U-Boot启动参数详解(U-Boot-2014.07版本)
- web切图怎么做_web前端人员自行切图教程
热门文章
- 网络摄像视频方案整理
- 什么是Base64算法?——全网最详细讲解
- DAS、NAS、SAN三种存储架构比较
- 《UNIX环境高级编程》笔记 第十章-信号
- RouterOS之DDNS(动态域名)
- linux设置法语键盘布局,法语键盘布局图.doc
- linux跨平台通信软件,下载:跨平台即时通信工具Pidgin 2.7.5
- 宿迁卫校计算机多少钱一年,江苏宿迁卫生中等专业学校2021年招生录取分数线...
- 详解ISA防火墙策略元素
- Android OpenGL探索之纯色背景绘制