C语言怎么通过递归实现扫雷游戏
发表于:2024-11-14 作者:千家信息网编辑
千家信息网最后更新 2024年11月14日,这篇"C语言怎么通过递归实现扫雷游戏"文章的知识点大部分人都不太理解,所以小编给大家总结了以下内容,内容详细,步骤清晰,具有一定的借鉴价值,希望大家阅读完这篇文章能有所收获,下面我们一起来看看这篇"C
千家信息网最后更新 2024年11月14日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安全错误
数据库的锁怎样保障安全
互联网 科技园
端游原神怎么查看服务器
物流公司做不做软件开发
金仓数据库 过期
奉贤区工程软件开发要多少钱
数据库工程师 加班多么
科技股和互联网
数据库更改视图中的数据
组态王无法创建opc服务器
安全使用数据库
数据库怎么样算登录成功
系统打印服务器自动关闭
传奇176版本数据库
长沙游戏软件开发费用
怎么区分服务器是机架
数据库赋权
pl登录服务器数据库
多台电脑建立服务器
计算机网络安全加密
计算机网络技术第5版答案
软件开发用什么原型工具
ivr服务器
漫威未来之战服务器
上海有赞网络技术有限公司
青岛灿玛网络技术有限公司马总
软件开发方式逐步由
多台电脑建立服务器
计算机网络安全加密
鹰潭全季互联网科技有限公司
南京云天下网络技术有限公司