C语言之扫雷
C语言之扫雷
- game.h
- game.c
- test.c
参考
https://blog.csdn.net/m0_62391199/article/details/124694375
game.h
#pragma once
#include <stdio.h>
#include <time.h>
#include <stdlib.h>#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); //只用9*9,但还是要用完整board//设置雷
void SetMine(char board[ROWS][COLS], int row, int col);//查找雷
void FindMine(char mine[ROWS][COLS], char show[ROWS][COLS], int row, int col);
game.c
#define _CRT_SECURE_NO_WARNINGS#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 (j = 0; j <= col; j++){printf("%d ", j);}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 board[ROWS][COLS], int row, int col)
{int count = EASY_COUNT;//x = 1~9//y = 1~9while (count){int x = rand() % row + 1; //rand() % 9 = 0~8int y = rand() % col + 1;//判断该坐标是否已经布置过雷,避免重复不知if (board[x][y] == '0'){board[x][y] = '1';count--;}}
}//获取坐标周围的雷的个数
static int get_mine_count(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');
}//int get_mine_count(char board[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 (board[x][y] == '1')
// {
// count++;
// }
// }
// }
// return count;
//}void ExplosionSpread(char mine[ROWS][COLS], char show[ROWS][COLS], int row, int col, int x, int y, int* pw);
void MarkMine(char board[ROWS][COLS], int row, int col);void FindMine(char mine[ROWS][COLS], char show[ROWS][COLS], int row, int col)
{int x = 0;int y = 0;int win = 0;//找到非雷的个数,用来标记是否取得胜利int* pw = &win;char ch = 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{if (show[x][y] != '*'){printf("该坐标一排查过,不能重复排");continue; //忘记写,直接进入下一次循环}else//如果不是雷{ExplosionSpread(mine, show, row, col, x, y, pw); //爆炸展开一片system("cls");DisplayBoard(show, row, col);printf("需要标记雷的位置请输入y/Y,否则请按任意键->");while ((ch = getchar() != '\n'));scanf("%c", &ch);if (ch == 'Y' || ch == 'y'){MarkMine(show, row, col); //标记雷system("cls");DisplayBoard(show, row, col);}else{continue; //当玩家选择不标记雷,执行continue,跳过当前循环的剩余部分,直接进入下一次循环,等待玩家输入新的坐标}}}}else{printf("输入坐标错误,请重新输入\n");}}if (win == row * col - EASY_COUNT){system("cls");printf("恭喜你,排雷成功\n");DisplayBoard(show, ROW, COL); //不是显示DisplayBoard(mine,ROW,COL);return;}
}//基础功能
//1、标记功能
//2、展开一片
void ExplosionSpread(char mine[ROWS][COLS], char show[ROWS][COLS], int row, int col, int x, int y, int *pw) //爆炸展开一片
{if (x >= 1 && x <= row && y >= 1 && y <= col) //判断坐标是否在排查的范围内{int num = get_mine_count(mine, x, y); //获取坐标周围雷的个数(*pw)++; //增加win的值,因为这是一个非雷区域if (num == 0) //如果没有雷{show[x][y] = ' '; //如果没有雷,就把该坐标设置成空格,并向周围八个坐标展开int i = 0;int j = 0;for (i = x - 1; i <= x + 1; i++){for (j = y - 1; j <= y + 1; j++){if (show[i][j] == '*') //限制递归条件,防止已经排查过的坐标再次递归,从而造成死递归, 别写成show[i][j] = '*,此时会为死递归{ExplosionSpread(mine, show, row,col, i, j, pw);}}}}else //如果当前坐标周围有雷,但当前坐标本身是非雷区域{show[x][y] = num + '0'; //显示周围有多少个雷}}
}
void MarkMine(char board[ROWS][COLS], int row, int col)
{int x = 0;int y = 0;while (1){printf("请选择你需要标记的坐标\n");scanf("%d%d", &x, &y);if (x >= 1 && x <= row && y >= 1 && y <= col)//判断合法性{if (board[x][y] == '*'){board[x][y] = '!';printf("是否需要继续标记?(0: 继续标记, 其他: 结束标记): ");int if_continue_mark = 1;while (scanf("%d", &if_continue_mark) != 1) // 输入验证{printf("输入无效,请输入数字 (0: 继续标记, 其他: 结束标记): ");while (getchar() != '\n'); // 清空输入缓冲区}if (!if_continue_mark){continue; // 继续标记,进入下一次循环}else{break; // 无需继续标记,跳出循环}/*int if_continue_mark = 1;printf("0:继续标记 其他:无需标记");scanf("%d", &if_continue_mark);*/if (!if_continue_mark){continue;}else{break;}}else if (board[x][y] == '!'){board[x][y] = '*';printf("已取消标记,是否需要继续标记?(0: 继续标记, 其他: 结束标记): ");int if_continue_mark = 1;while (scanf("%d", &if_continue_mark) != 1) // 输入验证{printf("输入无效,请输入数字 (0: 继续标记, 其他: 结束标记): ");while (getchar() != '\n'); // 清空输入缓冲区}if (!if_continue_mark){continue; // 继续标记,进入下一次循环}else{break; // 无需继续标记,跳出循环}}else{printf("该坐标不能被标记,请重新输入!\n");}}else{printf("坐标输入错误,请重新输入");}}
}
test.c
#define _CRT_SECURE_NO_WARNINGS#include "game.h"void menu()
{printf("*********************************\n");printf("************* 1. play ***********\n");printf("************* 0. exit ***********\n");printf("*********************************\n");
}void game()
{char mine[ROWS][COLS] = { 0 }; //存放布置好的雷的信息char show[ROWS][COLS] = { 0 }; //存放排查出的雷的信息//初始化数组的内容为指定的内容//mine 数组在没有布置雷的情况下 都是'0'InitBoard(mine, ROWS, COLS, '0');//show 数组在没有排查雷的时候,都是'*'InitBoard(show, ROWS, COLS, '*');//设置雷SetMine(mine, ROW, COL);//打印//DisplayBoard(mine, ROW, COL);DisplayBoard(show, ROW, COL);//排查雷FindMine(mine, show, ROW, COL);}int main()
{int input = 0;//设置随机数的生成起点srand((unsigned int)time(NULL)); //用于随机生成坐标的rand函数的种子srand函数只需要在main函数中声明一次do{menu();printf("请选择:>");scanf("%d", &input);switch (input){case 1://玩游戏//printf("扫雷\n");game();break;case 0://退出printf("退出游戏\n");break;default:printf("选择错误,重新选择");break;}} while (input);return 0;
}
相关文章:

C语言之扫雷
C语言之扫雷 game.hgame.ctest.c 参考 https://blog.csdn.net/m0_62391199/article/details/124694375 game.h #pragma once #include <stdio.h> #include <time.h> #include <stdlib.h>#define ROW 9 #define COL 9#define ROWS ROW2 #define COLS COL2#de…...

半导体制造工艺讲解
目录 一、半导体制造工艺的概述 二、单晶硅片的制造 1.单晶硅的制造 2.晶棒的切割、研磨 3.晶棒的切片、倒角和打磨 4.晶圆的检测和清洗 三、晶圆制造 1.氧化与涂胶 2.光刻与显影 3.刻蚀与脱胶 4.掺杂与退火 5.薄膜沉积、金属化和晶圆减薄 6.MOSFET在晶圆表面的形…...

Ollama+DeepSeek R1+AnythingLLM训练自己的AI智能助手
1.下载Ollama安装 1.1.安装Ollama Ollama官网:Ollama 下载Ollama,点击“Download”按钮。 根据电脑操作系统,下载合适的版本即可。 下载完成后点击安装,完成后安装窗口会自动关闭,你的系统托盘图标会出现一个Ollama图标。 1.2.…...

基于java手机销售网站设计和实现(LW+源码+讲解)
专注于大学生项目实战开发,讲解,毕业答疑辅导,欢迎高校老师/同行前辈交流合作✌。 技术范围:SpringBoot、Vue、SSM、HLMT、小程序、Jsp、PHP、Nodejs、Python、爬虫、数据可视化、安卓app、大数据、物联网、机器学习等设计与开发。 主要内容:…...

5-R循环
R 循环 有的时候,我们可能需要多次执行同一块代码。一般情况下,语句是按顺序执行的:函数中的第一个语句先执行,接着是第二个语句,依此类推。 编程语言提供了更为复杂执行路径的多种控制结构。 循环语句允许我们多…...

Qlabel 每五个一换行 并、号分割
学习点 Qlabel 每五个一换行 并、号分割 QString MainWindow::formatHobbies(const std::set<QString>& hobbies) {QString formattedHobbies;int count 0;for (const QString& hobby : hobbies) {if (count > 0 && count % 5 0)formattedHobbies…...

加速PyTorch模型训练:自动混合精度(AMP)
在深度学习领域,模型训练的速度和效率尤为重要。为了提升训练速度并减少显存占用(较复杂的模型中),PyTorch自1.6版本起引入了自动混合精度(Automatic Mixed Precision, AMP)功能。 AMP简单介绍 是一种训练…...

【py】python安装教程(Windows系统,python3.13.2版本为例)
1.下载地址 官网:https://www.python.org/ 官网下载地址:https://www.python.org/downloads/ 2.64版本或者32位选择 【Stable Releases】:稳定发布版本,指的是已经测试过的版本,相对稳定。 【Pre-releases】&#…...

Django REST Framework:如何获取序列化后的ID
Django REST Framework:如何获取序列化后的ID 😄 嗨,小伙伴们!今天我们来聊一聊Django REST Framework(简称DRF)中一个非常常见的操作:如何获取序列化后的ID。对于那些刚入门的朋友们ÿ…...

QT修仙笔记 事件大圆满 闹钟大成
学习笔记 牛客刷题 闹钟 时钟显示 通过 QTimer 每秒更新一次 QLCDNumber 显示的当前时间,格式为 hh:mm:ss,实现实时时钟显示。 闹钟设置 使用 QDateTimeEdit 让用户设置闹钟时间,可通过日历选择日期,设置范围为当前时间到未来 …...

Leetcode - 149双周赛
目录 一、3438. 找到字符串中合法的相邻数字二、3439. 重新安排会议得到最多空余时间 I三、3440. 重新安排会议得到最多空余时间 II四、3441. 变成好标题的最少代价 一、3438. 找到字符串中合法的相邻数字 题目链接 本题有两个条件: 相邻数字互不相同两个数字的的…...

解决 ComfyUI-Impact-Pack 中缺少 UltralyticsDetectorProvider 节点的问题
解决 ComfyUI-Impact-Pack 中缺少 UltralyticsDetectorProvider 节点的问题 1. 安装ComfyUI-Impact-Pack 首先确保ComfyUI-Impact-Pack 已经下载 地址: https://github.com/ltdrdata/ComfyUI-Impact-Pack 2. 安装ComfyUI-Impact-Subpack 由于新版本的Impact Pack 不再提供这…...

使用Kickstart配置文件封装操作系统实现Linux的自动化安装
使用Kickstart配置文件封装操作系统实现Linux的自动化安装 创建ks.cfg配置文件 可以使用已经安装完成的Linux操作系统中的/root目录下的anaconda.cfg配置文件 注意,配置文件会因为kickstart的版本兼容性的问题导致无法安装报错需要在实际使用过程中删除某些参数 …...

Android笔记【snippet】
一、 6、Card及ConstraintLayout线性布局 //定义单独的机器人单独一行的卡片 Composable fun RobotCard(robot: Robot,navController:NavController){Card(modifier Modifier.fillMaxWidth().wrapContentHeight().padding(5.dp),colors CardDefaults.elevatedCardColors(co…...

zsh: command not found: conda
场景描述 在 Linux 服务器上使用 zsh 时,如果出现 zsh: command not found: conda 错误,说明你的系统未正确配置 conda 命令,或者你尚未安装 Anaconda/Miniconda。 解决方案 确保已安装 Anaconda 或 Miniconda conda 是 Anaconda 或 Minico…...

【知识科普】CPU,GPN,NPU知识普及
CPU,GPU,NPU CPU、GPU、NPU 详解1. CPU(中央处理器)2. GPU(图形处理器)3. NPU(神经网络处理器) **三者的核心区别****协同工作示例****总结** CPU、GPU、NPU 详解 1. CPU(中央处理器࿰…...

【C++八股】struct和Class的区别
1. 默认访问控制 struct:结构体中的成员默认是 public,即外部代码可以直接访问结构体的成员。class:类中的成员默认是 private,即外部代码不能直接访问类的成员,必须通过公有接口(通常是成员函数ÿ…...

鹧鸪云光伏仓储、物料管理软件详细功能
采购中心 :作为核心枢纽,能集中管理多品牌设备,企业可灵活按需采购。采购与退货流程高效便捷,审核通过后物资快速补充、问题货物及时退回,保障资金与物资顺畅周转,避免积压浪费。付款与退款环节 ࿱…...

bazel 小白理解
Bazel命令是用于构建和测试软件项目的一个强大工具,尤其适用于大规模和多语言的软件项目。对于小白来说,可以这样理解Bazel及其命令: Bazel的基本概念 构建系统:Bazel是一个构建系统,它的主要任务是自动化地编译和链…...

MVC(Model-View-Controller)framework using Python ,Tkinter and SQLite
1.项目结构 sql: CREATE TABLE IF NOT EXISTS School (SchoolId TEXT not null, SchoolName TEXT NOT NULL,SchoolTelNo TEXT NOT NULL) 整体思路 Model:负责与 SQLite 数据库进行交互,包括创建表、插入、删除、更新和查询数据等操作。View࿱…...

WPF 设置宽度为 父容器 宽度的一半
方法1:使用 绑定和转换器 实现 创建类文件 HalfWidthConverter public class HalfWidthConverter : IValueConverter{public object Convert(object value, Type targetType, object parameter, CultureInfo culture){if (value is double width){return width / 4…...

java项目之在线心理评测与咨询管理系统(源码+文档)
项目简介 在线心理评测与咨询管理系统实现了以下功能: 在线心理评测与咨询管理系统的主要使用者分为: (1)在个人中心,管理员可以修改自己的用户名和登录密码。 (2)在系统前台可以查看首页&…...

【STM32系列】利用MATLAB配合ARM-DSP库设计FIR数字滤波器(保姆级教程)
ps.源码放在最后面 设计IIR数字滤波器可以看这里:利用MATLAB配合ARM-DSP库设计IIR数字滤波器(保姆级教程) 前言 本篇文章将介绍如何利用MATLAB与STM32的ARM-DSP库相结合,简明易懂地实现FIR低通滤波器的设计与应用。文章重点不在…...

Springboot框架扩展功能的使用
Spring Boot 提供了许多扩展点,允许开发者在应用程序的生命周期中插入自定义逻辑。这些扩展点可以帮助你更好地控制应用程序的行为,例如在启动时初始化数据、在关闭时释放资源、或者自定义配置加载逻辑。以下是 Spring Boot 中常见的扩展点: …...

yum报错 Could not resolve host: mirrorlist.centos.org
检查dns 使用ping www.baidu.com ,如果ping不通,检查/etc/resolv.conf文件中是否有: nameserver 8.8.8.8 nameserver 8.8.4.4 替换yum源 1.备份原始的 YUM 源配置文件: sudo cp /etc/yum.repos.d/CentOS-Base.repo /etc/yum.r…...

docker使用dockerfile打包镜像(docker如何打包)
文章目录 1. 编写 Dockerfile2. 构建 Docker 镜像3. 运行 Docker 容器4. 导出与导入镜像(可选) 1. 编写 Dockerfile Dockerfile 是一个文本文件,其中包含了一系列指令,这些指令定义了如何构建你的 Docker 镜像。下面以一个简单的…...

去中心化AGI网络架构:下一代人工智能的范式革命
文章目录 引言:当AGI遇到去中心化一、中心化AI架构的四大困境1.1 算力垄断与资源错配1.2 数据孤岛与隐私悖论1.3 模型暴政与单点故障1.4 创新抑制与价值捕获二、去中心化AGI网络的架构设计2.1 分层架构总览2.2 网络层:混合拓扑结构2.3 计算层:动态算力编排2.4 数据层:零知识…...

gitlab无法登录问题
在我第一次安装gitlab的时候发现登录页面是 正常的页面应该是 这种情况的主要原因是不是第一次登录,所以我们要找到原先的密码 解决方式: [rootgitlab ~]# vim /etc/gitlab/initial_root_password# WARNING: This value is valid only in the followin…...

单向链表在实际项目中的应用
前言 在实际项目中,单向链表经常被用来解决排队问题,因为链表允许动态地添加和移除元素,非常适合模拟队列(FIFO,先进先出)的行为。 这里的链表包含头节点,头结点的数据用来记录链表长度&#x…...

【系统架构设计师】操作系统 ③ ( 存储管理 | 页式存储弊端 - 段式存储引入 | 段式存储 | 段表 | 段表结构 | 逻辑地址 的 合法段地址判断 )
文章目录 一、页式存储弊端 - 段式存储引入1、页式存储弊端 - 内存碎片2、页式存储弊端 - 逻辑结构不匹配3、段式存储引入 二、段式存储 简介1、段式存储2、段表3、段表 结构4、段内地址 / 段内偏移5、段式存储 优缺点6、段式存储 与 页式存储 对比 三、逻辑地址 的 合法段地址…...