C语言中如何使用递归实现排雷游戏
发表于:2025-01-18 作者:千家信息网编辑
千家信息网最后更新 2025年01月18日,这篇文章主要介绍了C语言中如何使用递归实现排雷游戏,具有一定借鉴价值,感兴趣的朋友可以参考下,希望大家阅读完这篇文章之后大有收获,下面让小编带着大家一起了解一下。前言扫雷,相信各位都不陌生,以前每台电
千家信息网最后更新 2025年01月18日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安全错误
数据库的锁怎样保障安全
国家计算机网络安全中心职能
乌鲁木齐软件开发应用范围
如何看sql数据库账号密码
网络安全方面论文5000字
阿里云服务器怎么开启锁屏密码
ar vr哪个软件开发
培训计算机软件开发中心
工单软件开发
网络安全学生影视作品
srs流媒体服务器架构
我的世界服务器如何变成管理者
电脑网络技术杂志
广东点博网络技术有限公司
centos服务器怎么启用端口
华为服务器市场份额
数据库的安全性的内容
网络技术人员所需性格
关于开展 网络安全日
网络安全保障的核心技术
每日上报系统数据库设计
星能R536服务器
逃出生天ae服务器连接不上
大发软件开发有限公司
网络安全周进学校
免费的应用服务器
世界服务器由谁管理
元宵节绘画软件开发
电脑QQ添加好友显示服务器繁忙
中国移动研究院通信网络技术
阿里网络安全年薪