C语言怎么通过递归实现扫雷游戏
发表于:2025-11-06 作者:千家信息网编辑
千家信息网最后更新 2025年11月06日,这篇"C语言怎么通过递归实现扫雷游戏"文章的知识点大部分人都不太理解,所以小编给大家总结了以下内容,内容详细,步骤清晰,具有一定的借鉴价值,希望大家阅读完这篇文章能有所收获,下面我们一起来看看这篇"C
千家信息网最后更新 2025年11月06日C语言怎么通过递归实现扫雷游戏
这篇"C语言怎么通过递归实现扫雷游戏"文章的知识点大部分人都不太理解,所以小编给大家总结了以下内容,内容详细,步骤清晰,具有一定的借鉴价值,希望大家阅读完这篇文章能有所收获,下面我们一起来看看这篇"C语言怎么通过递归实现扫雷游戏"文章吧。
用户选择菜单
void menu(){ printf("****************************\n"); printf("******** 1.play **********\n"); printf("******** 0.exit **********\n"); printf("****************************\n");}用户按1进入游戏
棋盘初始化
void Itnboard(char board[ROWS][COLS], int rows, int cols,char c){ int i, j; for (i = 0; i < rows; i++) { for (j = 0; j 创建数组,并对其进行初始化
布置雷(随机布置)
void Setboard(char board[ROWS][COLS], int row, int col){ int count = Easy_count; while (count) { int x = rand() % row+1; int y = rand() % col+1; if (board[x][y] == '0') { board[x][y] = '1'; count--; } }}用time函数产生随机值
打印棋盘
void Displayboard(char board[ROWS][COLS], int row, int col){ int i, j; 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 Player(char board[ROWS][COLS], char show[ROWS][COLS], int row, int col){ int x, y; int count = 0; while (1) { printf("请排雷:\n"); scanf("%d %d", &x, &y); if (x >= 1 && x <= 9 && y >= 1 && y <= 9) { if (board[x][y] == '0') { Openboard(show, board, x, y); Displayboard(show, ROW, COL); } else if (board[x][y] == '1') { printf("你死了\n"); break; } } else { printf("请重新输入"); } int i, j; for (i = 1; i <= row; i++) { for (j = 1; j <= col; j++) { if (show[i][j] == '*') { count++; } } } if (count == Easy_count) { printf("成功\n"); //这里的判断条件是遍历整个数组,统计雷的个数,如果雷的个数等于所剩余未排的*,说明排雷成功 break; } }}用户输入值,并进行判断,如果该位置没有雷,我们进入展开函数
棋盘展开
void Openboard(char show[ROWS][COLS], char board[ROWS][COLS], int row, int col){ if (row >= 1 && row <= ROW && col >= 1 && col <= COL) { int count=sum(board, row, col); if (count != 0) { show[row][col] = count + '0'; } else if (show[row][col] != '_') { show[row][col] = '_'; int i = 0, j = 0; for (i = row - 1; i <= row + 1; i++) { for (j = col - 1; j <= col + 1; j++) { Openboard(show, board, i,j); } } } else { return; } }}如果用户输入的这个位置没有雷,我们对其周围8个位置进行判断是否有雷,若有雷,我们把雷的个数显示在该位置上,若其周围8个位置没有雷并且不是下划线,我们把这个位置赋值为下划线,然后并对其8个位置进行同样的判断,如果周围没雷,而且周围的棋子也不是下划线,我们对其进行返回。
展开部分思维导图
展开函数最后一个else return 作用
这里我们show棋盘有三种情况,
1.该位置是*
2.该位置是下划线
3.该位置是雷的个数
else
return;
这里是作用:如果是下划线,我们就返回上一层函数。因为如果这里不是下划线,我们会在else return 之前的语句中进行判断,并对其周围8个位置进行操作,然后再对这8个棋子各个周围8个位置进行判断并操作,如果这里是下划线,就说明由这个位置为中心的周围8个棋子已经判断过了,并且以这8个位置为中心,已经递归过了,我们不需要再进行判断,所以直接返回就行
周围雷个数判断
int sum(char board[ROWS][COLS], int x, int y){ return (board[x - 1][y - 1] + board[x - 1][y] + board[x - 1][y + 1] + board[x][y - 1] + board[x][y + 1] + board[x + 1][y - 1] + board[x + 1][y] + board[x + 1][y + 1] - 8 * '0');}test.c
#include"game.h"void menu(){ printf("****************************\n"); printf("******** 1.play **********\n"); printf("******** 0.exit **********\n"); printf("****************************\n");}void game(){ char board[ROWS][COLS] = { 0 }; char show[ROWS][COLS] = { 0 }; Itnboard(board, ROWS, COLS,'0'); //初始化棋盘 Itnboard(show, ROWS, COLS, '*'); Setboard(board, ROW, COL); Displayboard(board, ROW, COL); Player(board, show, ROW, COL); //玩家输入}int main(){ int input=1; srand((unsigned int)time(NULL)); do{ menu(); scanf("%d", &input); switch (input) { case 1: game(); break; case 0: break; default: printf("输入错误请重新输入:\n "); } } while (input);}game.c
#include"game.h"void Itnboard(char board[ROWS][COLS], int rows, int cols,char c){ int i, j; for (i = 0; i < rows; i++) { for (j = 0; j = 1 && x <= 9 && y >= 1 && y <= 9) { if (board[x][y] == '0') { Openboard(show, board, x, y); Displayboard(show, ROW, COL); } else if (board[x][y] == '1') { printf("你死了\n"); break; } } else { printf("请重新输入"); } int i, j; for (i = 1; i <= row; i++) { for (j = 1; j <= col; j++) { if (show[i][j] == '*') { count++; } } } if (count == Easy_count) { printf("成功\n"); break; } }}void Openboard(char show[ROWS][COLS], char board[ROWS][COLS], int row, int col){ if (row >= 1 && row <= ROW && col >= 1 && col <= COL) { int count=sum(board, row, col); if (count != 0) { show[row][col] = count + '0'; } else if (show[row][col] != '_') { show[row][col] = '_'; int i = 0, j = 0; for (i = row - 1; i <= row + 1; i++) { for (j = col - 1; j <= col + 1; j++) { Openboard(show, board, i,j); } } } else { return; } }} game.h
#include#include#include#define ROW 9#define COL 9#define ROWS ROW+2#define COLS COL+2#define Easy_count 10void Itnboard(char board[ROWS][COLS], int rows, int cols,char c);void Displayboard(char board[ROWS][COLS], int row, int col);void Setboard(char board[ROWS][COLS], int row, int col);void Player(char board[ROWS][COLS], char show[ROWS][COLS], int row, int col);void Openboard(char show[ROWS][COLS], char board[ROWS][COLS], int row, int col);
以上就是关于"C语言怎么通过递归实现扫雷游戏"这篇文章的内容,相信大家都有了一定的了解,希望小编分享的内容对大家有帮助,若想了解更多相关的知识内容,请关注行业资讯频道。
位置
下划线
输入
个位
棋盘
j++
个数
内容
递归
函数
用户
语言
扫雷
棋子
成功
作用
数组
文章
玩家
知识
数据库的安全要保护哪些东西
数据库安全各自的含义是什么
生产安全数据库录入
数据库的安全性及管理
数据库安全策略包含哪些
海淀数据库安全审计系统
建立农村房屋安全信息数据库
易用的数据库客户端支持安全管理
连接数据库失败ssl安全错误
数据库的锁怎样保障安全
汽车HMI软件开发教程
酒店系统软件开发
软件开发项目进度计划
服务器安全码在哪里
小学生认为的网络安全
1802网络安全来由
上海软件开发调试工资
中电科网络安全改造
汽车车载网络技术与检修试题
部队信息化服务器装修
首届网络安全大会论坛
手机sql数据库软件
我县开展网络安全宣传周
存储的硬盘用在服务器
崇明区直销软件开发生产厂家
冠捷软件开发待遇
h5 保存数据库
白鹿原小说软件开发
爱吉安访谈网络安全在身边
国外军工网络安全
青少年网络安全防范手抄报
战地5社区服务器多少钱
阿里服务器宕机
小米移动软件开发公司
渝快办用哪个服务器打开
服务器安全日志保留时间
程序员打造自己的服务器
怎么判断服务器硬盘多少g
世界大战赫德斯用的啥游戏服务器
网络安全为人民网络安拳超人