C语言扫雷(附标记展开功能)
文章目录
- 前言
- 一、主函数(test.c):
- 二、头文件及定义(game.h):
- 三、game.c(游戏代码实现全过程):
- 总结
前言
扫雷实现的基本规划:
- 玩家可以自由选择进入和退出游戏
- 玩家通过输入坐标来排雷
- 排查雷给出提示
- 玩家可以任意标记雷区
- 排雷同时展开非雷区
下面为效果图:
一、主函数(test.c):
通过do while嵌套switch对游戏菜单进行控制:
- 玩游戏输入1:进入case1开始游戏。
- 输入2:进入case2退出游戏 。
- 输入错误:进入default,进入下一次循环重新输入。
- 菜单给出标记操作提示。
#include "game.h"
void menu()//游戏菜单
{printf("**********************************\n");printf("******* 扫雷游戏 ********\n");printf("******* 1.play ********\n");printf("******* 2.exit ********\n");printf("*******tip1:坐标输入 0 0 ********\n");printf("******* 进行标记操作 ********\n");printf("*******tip2:坐标输入 0 1 ********\n");printf("******* 取消标记操作 ********\n");printf("**********************************\n");
}
void game()
{//定义两个棋盘,mine里面雷图,'*'为雷,' '为非雷//show里面-为未排雷区域,数字为周围有几颗雷//空格区域表示安全区域,周围没有雷char mine[ROWS][COLS] = { 0 };char show[ROWS][COLS] = { 0 };//初始化棋盘init_board(mine, ROWS, COLS, ' ');init_board(show, ROWS, COLS, '-');//布置雷set_mine(mine, ROW, COL);Display_board(show, ROW, COL);//打印棋盘//排查雷find_mine(mine, show, ROW, COL);
}
int main()
{int input = 0;srand((unsigned int)time(NULL));do{menu();printf("请选择:>");scanf("%d", &input);switch (input){case 1:printf("开始游戏\n");game();break;case 2:printf("游戏结束\n");break;default:printf("输入错误,请重新输入\n");}} while (input != 2);return 0;
}
二、头文件及定义(game.h):
- 行数、列数、雷数可随时更改
#include <stdio.h>
#include <stdlib.h>
#include <time.h>#define ROW 9 //定义行数为9
#define COL 9 //定义列数为9
#define EASY_COUNT 10 //简单定义一下雷数#define ROWS ROW+2
#define COLS COL+2//初始化棋盘
void init_board(char arr[ROWS][COLS], int rows, int cols, char set);//打印棋盘
void Display_board(char arr[ROWS][COLS], int row, int col);//布置雷
void set_mine(char mine[ROWS][COLS], int row, int col);//排查雷
void find_mine(char mine[ROWS][COLS], char show[ROWS][COLS], int row, int col);//标记坐标
void sign_show(char show[ROWS][COLS], int row, int col);//删除标记坐标
void del_sign_show(char show[ROWS][COLS], int row, int col);
三、game.c(游戏代码实现全过程):
基本逻辑就是两个棋盘:
- mine棋盘为设雷棋盘,用来设置雷。
- show棋盘给玩家看,打印信息给玩家。
#include "game.h"//初始化棋盘
void init_board(char arr[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++){arr[i][j] = set;}}
}//打印棋盘
void Display_board(char arr[ROWS][COLS], int row, int col)
{int i = 0;int j = 0;for (i = 0; i <= col; i++){printf(" %d ", i);if (i < col){printf("|");}}printf("\n");for (i = 0; i <= col; i++){printf("---");if (i < col){printf("|");}}printf("\n");for (i = 1; i <= row; i++){printf(" %d ", i);printf("|");for (j = 1; j <= col; j++){printf(" %c ", arr[i][j]);if (j < col){printf("|");}}printf("\n");if (i < row){for (j = 0; j <= col; j++){printf("---");if (j < col){printf("|");}}}printf("\n");}printf("=======================================\n");
}//布置雷
void set_mine(char mine[ROWS][COLS], int row, int col)
{int count = EASY_COUNT;int x = 0;int y = 0;while (count){x = rand() % row + 1;y = rand() % col + 1;if (mine[x][y] == ' '){mine[x][y] = '*';count--;}}
}//排查雷
static int get_mine_count(char mine[ROWS][COLS], int x, int y)//查输入坐标周围雷数
{int i = 0;int j = 0;int count = 0;for (i = x - 1; i <= x + 1; i++){for (j = y - 1; j <= y + 1; j++){if (mine[i][j] == '*'){count++;}}}return count;
}
void spread_mine(char mine[ROWS][COLS], char show[ROWS][COLS], int x, int y)//展开非雷区
{int i = 0;int j = 0;for (i = x - 1; i <= x + 1; i++){for (j = y - 1; j <= y + 1; j++){if (i >= 1 && i <= ROW && j >= 1 && j <= COL){if (get_mine_count(mine, i, j) == 0 && show[i][j] == '-'){show[i][j] = ' ';spread_mine(mine, show, i, j);}else if(get_mine_count(mine, i, j) != 0 && show[i][j] == '-'){int count = get_mine_count(mine, i, j);show[i][j] = count + '0';}}}}
}
int is_win(char mine[ROWS][COLS], char show[ROWS][COLS], int row, int col)
{int i = 0;int j = 0;int count = 0;for (i = 1; i <= row; i++){for (j = 1; j <= col; j++){if (mine[i][j] != '*' && show[i][j] == '-'){return 0;}}}return 1;
}
void sign_show(char show[ROWS][COLS], int row, int col)//标记坐标
{int x = 0;int y = 0;printf("请选择需要标记的坐标:>");while (1){scanf("%d %d", &x, &y);if (show[x][y] == '-'){show[x][y] = '#';break;}else{printf("输入错误,请重新输入");}}
}
void del_sign_show(char show[ROWS][COLS], int row, int col)//删除标记坐标
{int x = 0;int y = 0;printf("请选择需要删除标记的坐标:>");while (1){scanf("%d %d", &x, &y);if (show[x][y] == '#'){show[x][y] = '-';break;}else{printf("输入错误,请重新输入");}}
}
void find_mine(char mine[ROWS][COLS], char show[ROWS][COLS], int row, int col)
{int x = 0;int y = 0;while (1){printf("请输入排雷的坐标:>");scanf("%d %d", &x, &y);if (show[x][y] != '-'){printf("此坐标已扫过,请重新输入\n");continue;}else if (x >= 1 && x <= row && y >= 1 && y <= col){if (mine[x][y] == '*'){printf("很遗憾,你被炸死了\n");Display_board(mine, ROW, COL);break;}else{int count = get_mine_count(mine, x, y);if (count + '0' == '0'){show[x][y] = ' ';spread_mine(mine, show, x, y);//展开非雷区}else{show[x][y] = count + '0';}Display_board(show, ROW, COL);}}else if (x == 0 && y == 0)//输入坐标为两个0时进行标记操作{sign_show(show, row, col);//标记坐标Display_board(show, ROW, COL);}else if (x == 0 && y == 1)//输入坐标为两个0时进行标记操作{del_sign_show(show, row, col);//删除标记Display_board(show, ROW, COL);}else{printf("输入坐标超出雷区范围,请重新输入\n");}if (is_win(mine,show,row,col)==1){printf("恭喜你,扫雷成功\n");Display_board(mine, ROW, COL);}}
}
总结
以上就是自写C语言扫雷的代码全部内容了:
如果本篇博客对你有所帮助的话,不要忘记给博主一个三连哦!
C语言扫雷(附标记展开功能)相关推荐
- C语言扫雷(递归展开)(详细注释)(完整代码)
目录 一.功能实现 1.雷盘初始化与打印 雷盘定义 初始化雷盘 打印雷盘 随机布置雷 2.玩家排查雷 获取坐标周围雷数 递归展开 胜负判断 显示雷位置 二.游戏试玩 三.游戏完整代码 game.h t ...
- java扫雷答辩ppt_C语言扫雷答辩.ppt
C语言扫雷答辩 程序设计:基于C++语言的扫雷游戏 答辩学生:02,03 王佳 王想 包嘉琪 1 2 3 4 课题介绍 问题与分工 课题内容 成果展示 论 文 概 述 扫雷游戏介绍: 扫雷是一款相当大 ...
- 鹏哥C语言——扫雷2021-08-16
这个程序实际上还是比较冗长的,体现了我编程上的一些缺点:另外自动展开功能也没有实现,这个以后使用递归可以解决. #1 源文件 //头文件 supportingGame.h #include <s ...
- C语言二叉树实验报告流程图,二叉树的建立与遍历实验报告(c语言编写,附源代码).doc...
二叉树的建立与遍历实验报告(c语言编写,附源代码).doc 第 1 页,共 9 页二叉树的建立与遍历实验报告级 班 年 月 日 姓名 学号_ 1实验题目建立一棵二叉树,并对其进行遍历(先序.中序.后序 ...
- html(+css)/01/html语言基础,标记,标记语法,html文档结构
厚积薄发 html(+css)/01/html语言基础,标记,标记语法,html文档结构 工资:4500元左右/月 最好的学习html的方法,就是多参考别人的网页源代码: 查看源代码: 1,打开网页/ ...
- dev c 扫雷程序代码c语言,C语言 扫雷程序的实现
C语言 扫雷程序的实现 这个游戏可以实现根据选择坐标后所显示无雷区范围的不同分为简单 ,普通和困难 游戏程序中,实现了游戏的计时(分钟)功能,实现了扫雷游戏的最基础功能. 定义了一个9*9的棋盘,玩家 ...
- c语言扫雷源代码简单版,C语言扫雷游戏源代码
C语言扫雷游戏源代码 /* 模拟扫雷游戏 */ #include #include #include #include #include #include #include union REGS re ...
- C语言 -- string.h中函数功能详解与手动实现 - 02(常用函数memcpy、memmove、strcpy、strdup、strcat、strtok...)
内容预览 3.5.搬迁类型 --- 函数功能详细说明 :将内存空间中内容移动.复制到另一内存空间 3.6.搬迁类型 --- 函数功能测试与手动实现 3.6.1.memcpy.memccpy 3.6.2 ...
- 认识标记语言html,认识标记语言HTML课件
认识标记语言HTML课件 阿迪达斯三条纹标志是由阿迪达斯的创办人阿迪·达斯勒设计的,三条纹的阿迪达斯标志代表山区,指出实现挑战.成就未来和不断达成目标的愿望. 第二章 第五节 阿迪达斯三条纹标志是由阿 ...
最新文章
- 交换友链的几个技巧!
- 与springcloud整合的框架源码读取入口
- 用Java获取文件的MD5校验和
- python gif压缩_实用性视频转gif,压缩等常用文件工具处理及转换(含自写python工具)...
- 基于RBAC的设计思路
- java关闭文本_如何更优雅的关闭java文本、网络等资源
- datasnap xe连接池_DataSnap 连接池
- php的关系数据库,php – 从关系数据库到非关系数据库的数据规范化的最佳实践...
- git clone加速(github加速)
- @transactional注解原理_《Spring源码解析(十二)》深入理解Spring事务原理,告别面试一问三不知的尴尬...
- ewebeditor高版本=5.50day
- 参数中带有“”符号问题
- Android 六大布局之 GridLayout(网格布局)
- r语言html帮助是什么东西,R语言帮助的使用
- 巧用PPT模板,远离翻车风险
- mov格式如何转换成mp4?详细步骤教程
- 卡塔尔世界杯——你认为今年谁会是冠军?
- [2010年终大礼]破壳而出的琉璃之鸟 汉化补丁 第二版(win8兼容版发布)
- 2019世界区块链大会•乌镇第2日金句集锦
- 深度剖析Linux与Windows系统的区别
热门文章
- 计算机审计实训实施阶段工作,计算机审计实训报告-20210525075352.docx-原创力文档...
- Python常用方法
- BIUT比特信任系统公链 双周报 第65期
- 教你在网页中添加微软地图
- return在c语言的意思,return在c语言中是什么意思?_后端开发
- 手机CAD转换工具,CAD瞬间转换成PDF
- ubuntu 生活之电视卡
- 考勤管理软件对企业管理非常重要
- 视频教程-SEM实战教程(三)-网络营销
- C++虚幻-密室逃脱学习总结(二)虚幻4文件夹结构及基本操作