C语言怎么通过递归实现扫雷游戏
发表于:2025-01-16 作者:千家信息网编辑
千家信息网最后更新 2025年01月16日,这篇"C语言怎么通过递归实现扫雷游戏"文章的知识点大部分人都不太理解,所以小编给大家总结了以下内容,内容详细,步骤清晰,具有一定的借鉴价值,希望大家阅读完这篇文章能有所收获,下面我们一起来看看这篇"C
千家信息网最后更新 2025年01月16日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安全错误
数据库的锁怎样保障安全
企业进销存软件开发
软件开发项目审计报告书
网络安全监测大厅布局设计
法制教育和网络安全手抄报
计算机网络技术可用性名词解释
服务器硬盘录像机使用方法
怎么样可以找到软件开发公司
阿里巴巴数据库评论
实地网络安全培训
5g是集无线技术 网络技术
宜昌租车软件开发
文件服务器迁移2012
网络安全等级保护上的讲话
瓯北软件开发
我的世界联机侠一进服务器就闪退
怀旧服服务器查询小程序
鸠鸠互联网科技有限公司官网
医院数据库语句
四川app软件开发靠谱吗
依偎科技互联网电视
osm网络安全
PDF衍射数据库卡片
服务器为啥改不了显示器分辨率
我的世界手游暑假必玩服务器
网络安全都转行了
信息化软件开发职责
用什么软件开发一个app
uta大学的网络安全
绿盟 网络安全日
商飞软件开发部