C语言中如何使用递归实现排雷游戏
发表于:2025-11-17 作者:千家信息网编辑
千家信息网最后更新 2025年11月17日,这篇文章主要介绍了C语言中如何使用递归实现排雷游戏,具有一定借鉴价值,感兴趣的朋友可以参考下,希望大家阅读完这篇文章之后大有收获,下面让小编带着大家一起了解一下。前言扫雷,相信各位都不陌生,以前每台电
千家信息网最后更新 2025年11月17日C语言中如何使用递归实现排雷游戏二、游戏框架
这篇文章主要介绍了C语言中如何使用递归实现排雷游戏,具有一定借鉴价值,感兴趣的朋友可以参考下,希望大家阅读完这篇文章之后大有收获,下面让小编带着大家一起了解一下。
前言
扫雷,相信各位都不陌生,以前每台电脑上面都会自带这个小游戏。因此,它可以说是我们的童年回忆了,今天来用C语言实现简单的扫雷小游戏。
一、游戏思路
1、程序开始时出现菜单,让玩家选择开始游戏或者退出游戏。
2、玩家选择开始游戏后,出现雷盘,并且随机布置雷。
3、玩家进行排雷
二、游戏框架
1.菜单界面
1.菜单:
void menu(){ printf("**************************\n"); printf("*****按 1 开 始 游 戏*****\n"); printf("*****按 0 退 出 游 戏*****\n"); printf("**************************\n");}2.菜单的选择:
int main(){ 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); return 0;}3.实际效果:
2.游戏主体
1.初始化雷盘及展示界面
建立两个二维数组作为雷盘,一个用于初始化雷盘,即埋雷;另一个雷盘用于作展示界面,显示玩家的排雷过程。雷盘的数组大小为11*11,方便计算扫雷时周围雷的数量,并防止数组越界。展示界面的数组大小9*9即可。
void game(){char mine[ROWS][COLS] = { 0 }; //放置布置的雷的信息char show[ROWS][COLS] = { 0 }; //放置排查出雷的信息InitBoard(mine, ROWS, COLS, '0'); //初始化雷盘InitBoard(show, ROWS, COLS, '*'); //初始化展示界面DisplayBoard(show, ROW, COL); //打印展示界面}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){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");}}效果如下
2.布置雷
随机在mine数组中让十个'0'变成'1'作为雷。
void SetMine(char mine[ROWS][COLS], int row, int col){int count = 10; while (count){int x = rand() % row + 1; int y = rand() % col + 1;if (mine[x][y] == '0'){mine[x][y] = '1';count--;}}}打印下展示界面和雷盘看下效果,可以看到刚好出现了十个1,且每次新游戏的位置都是不一样的。
3.排雷
玩家输入要排查的坐标,如果是雷,游戏结束;如果不是雷,显示周围一圈雷的数量,如果周围一圈没有雷,则自动继续向外排查(通过简单的递归实现)。当所有雷都被排查出时,游戏胜利。
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 <= row && y >= 1 && y <= col){if (mine[x][y] == '1'){printf("你凉了哈哈哈哈哈哈哈哈哈哈\n");DisplayBoard(mine, row, col);break;}else{int n = get_mine_count(mine, x, y);show[x][y] = n + '0';system("cls"); //美观DisplayBoard(show, row, col);win++;}}else{printf("往哪排雷呢你,重新来\n");}}if (win == row * col - EASY_COUNT){printf("不错哦,赢了");DisplayBoard(mine, row, col);}}static int get_mine_count(char mine[ROWS][COLS], int x,int y){return mine[x - 1][y] + mine[x - 1][y - 1] + mine[x - 1][y + 1] +mine[x][y - 1] + mine[x][y + 1] + mine[x + 1][y] + mine[x + 1][y - 1] + mine[x + 1][y + 1] - 8 * '0';}但是这样子出来的扫雷无法自动向外排查,于是我选择用递归来实现,当然胜利的条件也会随着发生变化,变成了统计未排查数量是否与雷数量相等。
于是我将判断胜负的代码换成了如下代码。
int i = 0;int j = 0;int mines = 0;for (i = 1; i <= ROW; i++){for (j = 1; j <= COL; j++){if (show[i][j] == '*')mines++;}}if (EASY_COUNT == mines){printf("不错哦,你赢了!\n");break;}然后用递归实现自动排查
void count(char show[ROWS][COLS], char mine[ROWS][COLS], int x, int y){int i = 0;int j = 0;if (get_mine_count(mine, x, y) == 0){show[x][y] = ' ';for (i = x - 1; i <= x + 1; i++){for (j = y - 1; j <= y + 1; j++){if (i > 0 && i <= ROW && j > 0 && j <= COL && mine[i][j] != '1' && show[i][j] == '*'){count(show, mine, i, j);}}}}elseshow[x][y] = '0' + get_mine_count(mine, x, y);}3.游戏函数
当然还需要游戏函数将上述结合起来
void game(){char mine[ROWS][COLS] = { 0 }; //放置布置的雷的信息char show[ROWS][COLS] = { 0 }; //放置排查出雷的信息InitBoard(mine, ROWS, COLS, '0'); //初始化雷盘InitBoard(show, ROWS, COLS, '*'); //初始化展示界面SetMine(mine, ROW, COL);DisplayBoard(show, ROW, COL); //打印展示界面/*DisplayBoard(mine, ROW, COL);*/FindMine(mine, show,ROW, COL);}三、游戏运行
来看看实际效果,由于清屏的存在,界面也算是整洁美观。

四、所有代码
按照惯例,贴出所有代码
1.game.h
#pragma once#include#include #include #include #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 DisplayBoard(char board[ROWS][COLS], int row, int col);//布置雷void SetMine(char mine[ROWS][COLS], int row, int col);//排雷void FindMine(char mine[ROWS][COLS], char show[ROWS][COLS], int row, int col);
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){int i = 0;int j = 0;printf("----------扫雷---------\n");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");}printf("----------扫雷---------\n");}void SetMine(char mine[ROWS][COLS], int row, int col){int count = EASY_COUNT;while (count){int x = rand() % row + 1; int y = rand() % col + 1;if (mine[x][y] == '0'){mine[x][y] = '1';count--;}}}static int get_mine_count(char mine[ROWS][COLS], int x,int y){return mine[x - 1][y] + mine[x - 1][y - 1] + mine[x - 1][y + 1] +mine[x][y - 1] + mine[x][y + 1] + mine[x + 1][y] + mine[x + 1][y - 1] + mine[x + 1][y + 1] - 8 * '0';}void count(char show[ROWS][COLS], char mine[ROWS][COLS], int x, int y){int i = 0;int j = 0;if (get_mine_count(mine, x, y) == 0){show[x][y] = ' ';for (i = x - 1; i <= x + 1; i++){for (j = y - 1; j <= y + 1; j++){if (i > 0 && i <= ROW && j > 0 && j <= COL && mine[i][j] != '1' && show[i][j] == '*'){count(show, mine, i, j);}}}}elseshow[x][y] = '0' + get_mine_count(mine, x, y);}void FindMine(char mine[ROWS][COLS], char show[ROWS][COLS], int row, int col){int x = 0;int y = 0;int i = 0; int j = 0;while (1){printf("请输入要排查的坐标:");scanf("%d %d", &x, &y);if (x >= 1 && x <= row && y >= 1 && y <= col){if (mine[x][y] == '1'){printf("你凉了哈哈哈哈哈哈哈哈哈哈\n");DisplayBoard(mine, row, col);break;}else{int n = get_mine_count(mine, x, y);show[x][y] = n + '0';count(show, mine, x, y);system("cls");DisplayBoard(show, row, col);}}else{printf("往哪排雷呢你,重新来\n");}int mines = 0;for (i = 1; i <= ROW; i++){for (j = 1; j <= COL; j++){if (show[i][j] == '*')mines++;}}if (EASY_COUNT == mines){printf("不错哦,你赢了!\n");break;}}}3.test.c
#define _CRT_SECURE_NO_WARNINGS 1#include "game.h"void menu(){printf("**************************\n");printf("*****按 1 开 始 游 戏*****\n");printf("*****按 0 退 出 游 戏*****\n");printf("**************************\n");}void game(){char mine[ROWS][COLS] = { 0 }; //放置布置的雷的信息char show[ROWS][COLS] = { 0 }; //放置排查出雷的信息InitBoard(mine, ROWS, COLS, '0'); //初始化雷盘InitBoard(show, ROWS, COLS, '*'); //初始化展示界面SetMine(mine, ROW, COL);DisplayBoard(show, ROW, COL); //打印展示界面/*DisplayBoard(mine, ROW, COL);*/FindMine(mine, show,ROW, COL);}int main(){int input = 0;srand((unsigned int)time(NULL));do{menu();printf("做出你的选择:");scanf("%d", &input);switch (input){case 1:game();break;case 0:printf("退出游戏~)\n");break;default:printf("请重新选择\n");break;}} while (input);return 0;}感谢你能够认真阅读完这篇文章,希望小编分享的"C语言中如何使用递归实现排雷游戏"这篇文章对大家有帮助,同时也希望大家多多支持,关注行业资讯频道,更多相关知识等着你来学习!
界面
选择
信息
j++
扫雷
递归
数组
玩家
代码
效果
数量
篇文章
菜单
语言
不错
美观
函数
大小
实际
小游戏
数据库的安全要保护哪些东西
数据库安全各自的含义是什么
生产安全数据库录入
数据库的安全性及管理
数据库安全策略包含哪些
海淀数据库安全审计系统
建立农村房屋安全信息数据库
易用的数据库客户端支持安全管理
连接数据库失败ssl安全错误
数据库的锁怎样保障安全
中美网络安全战
使用命令访问数据库的步骤
济南槐荫软件开发培训
成都中鑫网络技术有限公司
elm327蓝牙软件开发
浪潮服务器装esxi7.0
sparkhdfs数据库方案
access数据库 接口
网络安全知识答题不及格
网络安全手抄报儿歌内容
多媒体软件开发工程师待遇
数据库安全组英文
网络安全事故预想
御龙在天龙生九子服务器青州
网络技术被用于
数据库采用并发控制技术
赛尔下一代网络技术
金昌电信网络安全校园
计算机三级的数据库技术难吗
淄博诺达网络技术
互联网软件开发干到多少岁
app软件开发的基本
佳木斯软件开发公司收费
乌海市app软件开发培训机构
激战2选哪个服务器
河南双线服务器
河北智能软件开发优选企业
嘉定网络安全派出所
乌鲁木齐网络安全科技馆
服务器共享文件夹权限